From d5170eeb3fbdbc74de75297c702283aa41e0f08f Mon Sep 17 00:00:00 2001 From: JasonChmn <jason.chemin@hotmail.fr> Date: Wed, 7 Aug 2019 14:01:37 +0200 Subject: [PATCH] Use serialization/archive functions for serialization / Delete test class for serialization / Make test ok (not python test for serialization) --- include/curves/CMakeLists.txt | 1 - include/curves/piecewise_curve.h | 64 +------------ include/curves/polynomial.h | 32 ++----- include/curves/serialize_test_class.h | 127 -------------------------- python/curves_python.cpp | 32 +------ python/test/test.py | 6 +- tests/Main.cpp | 15 ++- 7 files changed, 23 insertions(+), 254 deletions(-) delete mode 100644 include/curves/serialize_test_class.h diff --git a/include/curves/CMakeLists.txt b/include/curves/CMakeLists.txt index f98dcca..aff5762 100644 --- a/include/curves/CMakeLists.txt +++ b/include/curves/CMakeLists.txt @@ -12,7 +12,6 @@ SET(${PROJECT_NAME}_HEADERS linear_variable.h cubic_hermite_spline.h piecewise_curve.h - serialize_test_class.h ) INSTALL(FILES diff --git a/include/curves/piecewise_curve.h b/include/curves/piecewise_curve.h index f45b68b..0d5b963 100644 --- a/include/curves/piecewise_curve.h +++ b/include/curves/piecewise_curve.h @@ -28,7 +28,8 @@ template<typename Time= double, typename Numeric=Time, std::size_t Dim=3, bool S typename T_Point= std::vector<Point,Eigen::aligned_allocator<Point> >, typename Curve= curve_abc<Time, Numeric, Safe, Point> > -struct piecewise_curve : public curve_abc<Time, Numeric, Safe, Point> +struct piecewise_curve : public curve_abc<Time, Numeric, Safe, Point>, + public serialization::Serializable< piecewise_curve<Time, Numeric, Dim, Safe, Point, T_Point, Curve> > { typedef Point point_t; typedef T_Point t_point_t; @@ -236,50 +237,7 @@ struct piecewise_curve : public curve_abc<Time, Numeric, Safe, Point> ppc.add_curve(Polynomial(coeffs,time_actual,T_max)); return ppc; } -/* - template <typename Piecewise_curve, typename Polynomial> - static void serializeToFile(Piecewise_curve pc, std::string file_path) - { - // Get piecewise polynomial curve corresponding - piecewise_curve<Time, Numeric, Dim, Safe, Point, T_Point, Polynomial> ppc = pc.convert_piecewise_curve_to_polynomial<Polynomial>(); - // Serialize - std::ofstream ofs(file_path.c_str()); - if(ofs) - { - boost::archive::binary_oarchive oa(ofs); - oa << ppc; - } - else - { - throw "PiecewiseCurve, Error while serializing to file"; - } - ofs.close(); - } - template <typename Piecewise_polynomial_curve, typename Polynomial> - static Piecewise_polynomial_curve deserializeFromFile(std::string file_path) - { - // Get a piecewise polynomial curve - point_t p; - t_point_t t_p; - t_p.push_back(p); - Polynomial pol(t_p.begin(), t_p.end(),0,1); - Piecewise_polynomial_curve ppc(pol); - // Deserialize in it - std::ifstream ifs(file_path.c_str()); - if(ifs) - { - boost::archive::binary_iarchive ia(ifs); - ia >> ppc; - } - else - { - throw "PiecewiseCurve, Error while deserializing from file"; - } - ifs.close(); - return ppc; - } -*/ private: /// \brief Get index of the interval corresponding to time t for the interpolation. @@ -350,24 +308,6 @@ struct piecewise_curve : public curve_abc<Time, Numeric, Safe, Point> ar & T_min_ & T_max_; } - template<typename Piecewise_polynomial_curve, typename Polynomial> - static void serialize_to_file(std::string filename, Piecewise_polynomial_curve ppc) - { - std::ofstream ofile(filename.c_str()); - boost::archive::text_oarchive oTextArchive(ofile); - oTextArchive << ppc; //piecewise_curve.convert_piecewise_curve_to_polynomial<Polynomial>(); - } - - template<typename Piecewise_polynomial_curve> - static Piecewise_polynomial_curve deserialize_from_file(std::string filename) - { - Piecewise_polynomial_curve ppc; - std::ifstream ifile(filename.c_str()); - boost::archive::text_iarchive iTextArchive(ifile); - iTextArchive >> ppc; // désérialisation dans d - return ppc; - } - }; template<typename Time, typename Numeric, std::size_t Dim, bool Safe, typename Point, typename T_Point, typename Curve> diff --git a/include/curves/polynomial.h b/include/curves/polynomial.h index 7d60ec0..5a028b4 100644 --- a/include/curves/polynomial.h +++ b/include/curves/polynomial.h @@ -42,7 +42,8 @@ namespace curves /// template<typename Time= double, typename Numeric=Time, std::size_t Dim=3, bool Safe=false, typename Point= Eigen::Matrix<Numeric, Eigen::Dynamic, 1>, typename T_Point =std::vector<Point,Eigen::aligned_allocator<Point> > > -struct polynomial : public curve_abc<Time, Numeric, Safe, Point> +struct polynomial : public curve_abc<Time, Numeric, Safe, Point>, + public serialization::Serializable< polynomial<Time, Numeric, Dim, Safe, Point, T_Point> > { typedef Point point_t; typedef T_Point t_point_t; @@ -244,32 +245,15 @@ struct polynomial : public curve_abc<Time, Numeric, Safe, Point> template<class Archive> void serialize(Archive& ar, const unsigned int version){ - ar & coefficients_; - ar & dim_; - ar & degree_; - ar & T_min_ ; - ar & T_max_; - } - - template<typename Polynomial> - static void serialize_to_file(std::string filename, Polynomial pol) - { - std::ofstream ofile(filename.c_str()); - boost::archive::text_oarchive oTextArchive(ofile); - oTextArchive << pol; - } - - template<typename Polynomial> - static Polynomial deserialize_from_file(std::string filename) - { - Polynomial pol; - std::ifstream ifile(filename.c_str()); - boost::archive::text_iarchive iTextArchive(ifile); - iTextArchive >> pol; // désérialisation dans d - return pol; + ar & boost::serialization::make_nvp("coefficients", coefficients_); + ar & boost::serialization::make_nvp("dim", dim_); + ar & boost::serialization::make_nvp("degree", degree_); + ar & boost::serialization::make_nvp("T_min", T_min_); + ar & boost::serialization::make_nvp("T_max", T_max_); } }; //class polynomial + } // namespace curves #endif //_STRUCT_POLYNOMIAL diff --git a/include/curves/serialize_test_class.h b/include/curves/serialize_test_class.h deleted file mode 100644 index 724e0f6..0000000 --- a/include/curves/serialize_test_class.h +++ /dev/null @@ -1,127 +0,0 @@ -/** -* \file polynomial.h -* \brief Definition of a cubic spline. -* \author Steve T. -* \version 0.1 -* \date 06/17/2013 -* -* This file contains definitions for the polynomial struct. -* It allows the creation and evaluation of natural -* smooth splines of arbitrary dimension and order -*/ - - -#ifndef _STRUCT_TEST_SER -#define _STRUCT_TEST_SER - -#include "MathDefs.h" - -#include "curve_abc.h" - -#include <iostream> -#include <algorithm> -#include <functional> -#include <stdexcept> - -#include <fstream> -#include <string> -#include <stdexcept> -#include <boost/archive/text_oarchive.hpp> -#include <boost/archive/text_iarchive.hpp> - -#include "serialization/archive.hpp" -#include "serialization/eigen-matrix.hpp" - -namespace curves -{ - -template<typename Time, std::size_t Dim=3> -struct TestStructParent { - TestStructParent(){} - virtual ~TestStructParent(){} -}; - -template<typename Time= double, typename Numeric=Time, std::size_t Dim=3, bool Safe=false, - typename Point= Eigen::Matrix<Numeric, Eigen::Dynamic, 1>, typename T_Point =std::vector<Point,Eigen::aligned_allocator<Point> > > -struct TestStruct : public TestStructParent<Time, Dim> {//: public curve_abc<Time, Numeric, Safe, Point>{ -public: - TestStruct(){} - TestStruct(int i, std::string c, float f1, float f2, Eigen::Matrix<double, Eigen::Dynamic, 1> mat){ - a=i; - s=c; - v.push_back(f1); - v.push_back(f2); - matrix_test = mat; - } - - ~TestStruct() - { - // NOTHING - } - - Point operator()(const time_t t) const - { - return Point(0); - } - - /// \brief Evaluation of the derivative of order N of spline at time t. - /// \param t : the time when to evaluate the spline. - /// \param order : order of derivative. - /// \return \f$\frac{d^Nx(t)}{dt^N}\f$ point corresponding on derivative spline at time t. - Point derivate(const time_t t, const std::size_t order) const - { - return Point(0); - } - - /// \brief Get the minimum time for which the curve is defined - /// \return \f$t_{min}\f$ lower bound of time range. - Numeric min() const {return 0;} - /// \brief Get the maximum time for which the curve is defined. - /// \return \f$t_{max}\f$ upper bound of time range. - Numeric max() const {return 0;} - - template<class Archive> - void serialize(Archive& ar, const unsigned int version){ - ar & a & s & v & matrix_test; - } - int a; - std::string s; - std::vector<float> v; - Eigen::Matrix<double, Eigen::Dynamic, 1> matrix_test; -}; - -struct serialize_test_class -{ - public: - typedef Eigen::Matrix<double,1,1> point_one; - typedef TestStruct<double, double, 1, true, point_one> test_t; - test_t t1, t2; - - serialize_test_class() - { - Eigen::Matrix<double, 3, 1> mat1(1,2,3); - Eigen::Matrix<double, 3, 1> mat2(4,4,4); - t1 = test_t(2, std::string("essai 1"), 2.0, 3.5, mat1); - t2 = test_t(0, std::string("essai 2"), 0.0, 0.5, mat2); - } - - void serialize_to_file(std::string path) - { - std::cout<<"serialize"<<std::endl; - std::ofstream ofile(path.c_str()); - boost::archive::text_oarchive oTextArchive(ofile); - oTextArchive << t1; // serialization - } - - void deserialize_from_file(std::string path) - { - std::cout<<"deserialize"<<std::endl; - std::ifstream ifile(path.c_str()); - boost::archive::text_iarchive iTextArchive(ifile); - iTextArchive >> t2; // deserialization - } - -}; //class polynomial -} // namespace curves -#endif //_STRUCT_POLYNOMIAL - diff --git a/python/curves_python.cpp b/python/curves_python.cpp index 5f3c3ce..84498a7 100644 --- a/python/curves_python.cpp +++ b/python/curves_python.cpp @@ -9,6 +9,7 @@ #include "python_definitions.h" #include "python_variables.h" +#include "archive_python_binding.h" #include <vector> @@ -177,27 +178,6 @@ piecewise_cubic_hermite_curve_t* wrapPiecewiseCubicHermiteCurveConstructor(const } /* end wrap piecewise polynomial curve */ -/* Wrap serialize and deserialize functions in Polynomial and Piecewise Polynomial curve */ -/* -void wrapSerializePolynomial(std::string file_path, polynomial_t pol) -{ - polynomial_t::serialize_to_file<polynomial_t>(file_path, pol); -} -polynomial_t wrapDeserializePolynomial(std::string file_path) -{ - return polynomial_t::deserialize_from_file<polynomial_t>(file_path); -} -void wrapSerializePiecewisePolynomialCurve(std::string file_path, piecewise_polynomial_curve_t ppc) -{ - piecewise_polynomial_curve_t::serialize_to_file<piecewise_polynomial_curve_t, polynomial_t>(file_path, ppc); -} -piecewise_polynomial_curve_t wrapDeserializePiecewisePolynomialCurve(std::string file_path) -{ - return piecewise_polynomial_curve_t::deserialize_from_file<piecewise_polynomial_curve_t>(file_path); -} -*/ -/*End wrap serialize and deserialize functions in Polynomial and Piecewise Polynomial curve */ - /* Wrap exact cubic spline */ t_waypoint_t getWayPoints(const coeff_t& array, const time_waypoints_t& time_wp) { @@ -371,6 +351,7 @@ BOOST_PYTHON_MODULE(curves) .def("max", &polynomial_t::max) .def("__call__", &polynomial_t::operator()) .def("derivate", &polynomial_t::derivate) + //.def(SerializableVisitor<polynomial_t>()) ; /** END polynomial function**/ @@ -471,15 +452,6 @@ BOOST_PYTHON_MODULE(curves) def("hermite_from_polynomial", hermite_from_curve<cubic_hermite_spline_t, polynomial_t>); /** END curves conversion**/ - /** BEGIN serialization of polynomial and piecewise polynomial curve **/ - /* - def("serialize_polynomial", wrapSerializePolynomial); - def("deserialize_polynomial", wrapDeserializePolynomial); - def("serialize_piecewise_polynomial_curve", wrapSerializePiecewisePolynomialCurve); - def("deserialize_piecewise_polynomial_curve", wrapDeserializePiecewisePolynomialCurve); - */ - /** END serialization of polynomial and piecewise polynomial curve **/ - } } // namespace curves diff --git a/python/test/test.py b/python/test/test.py index 4718481..6e5782c 100644 --- a/python/test/test.py +++ b/python/test/test.py @@ -94,8 +94,10 @@ class TestCurves(unittest.TestCase): self.assertTrue((a.derivate(0.4, 0) == a(0.4)).all()) a.derivate(0.4, 2) # Test serialization - #serialize_polynomial("serialize_polynomial.test",a); - #b = deserialize_polynomial("serialize_polynomial.test"); + #a.saveAsText("serialiation_polynomial.test") + #waypoints = matrix([[0,0,0,], [0,0,0,]]).transpose() + #b = polynomial(waypoints) + #b.loadFromText("serialiation_polynomial.test") #self.assertTrue((a(0.4) == b(0.4)).all()) return diff --git a/tests/Main.cpp b/tests/Main.cpp index 800dfb5..0a058b8 100644 --- a/tests/Main.cpp +++ b/tests/Main.cpp @@ -8,8 +8,6 @@ #include "curves/cubic_hermite_spline.h" #include "curves/piecewise_curve.h" -#include "curves/serialize_test_class.h" - #include <string> #include <iostream> #include <cmath> @@ -1462,18 +1460,19 @@ void serializationPiecewisePolynomialCurveTest(bool& error) // Test serialization on Polynomial std::cout<<"Serialize test : Polynomial => "; - polynomial_t::serialize_to_file<polynomial_t>(fileName, pol1); - polynomial_t pol_test = pol2; - pol_test = polynomial_t::deserialize_from_file<polynomial_t>(fileName); + pol1.saveAsText(fileName); + // Test deserialization + polynomial_t pol_test; + pol_test.loadFromText(fileName); CompareCurves<polynomial_t, polynomial_t>(pol1, pol_test, errMsg1, error); std::cout<<"OK"<<std::endl; // Test serialization on Piecewise curves std::cout<<"Serialize test : Piecewise polynomial curve => "; - piecewise_polynomial_curve_t::serialize_to_file<piecewise_polynomial_curve_t, polynomial_t>(fileName, pc); + pc.saveAsText(fileName); // Test deserialization - piecewise_polynomial_curve_t ppc_deserialized = piecewise_polynomial_curve_t - ::deserialize_from_file<piecewise_polynomial_curve_t>(fileName); + piecewise_polynomial_curve_t ppc_deserialized; + ppc_deserialized.loadFromText(fileName); CompareCurves<piecewise_polynomial_curve_t,piecewise_polynomial_curve_t>(pc, ppc_deserialized, errMsg2, error); std::cout<<"OK"<<std::endl; } -- GitLab