From 370355cc80606cd4be27babd60d0a1aabe567559 Mon Sep 17 00:00:00 2001 From: Laurent Belcour Date: Fri, 25 Jan 2013 16:30:05 +0100 Subject: [PATCH] Fixing the dynamic loading thing --- sources/core/args.h | 7 ++- .../rational_1d/rational_1d_fitter.cpp | 5 ++ .../plugins/rational_1d/rational_1d_fitter.h | 5 +- .../rational_1d/rational_1d_fitter_eigen.h | 2 +- .../plugins/rational_data/rational_data.pro | 8 ++-- .../rational_1d_fitter_cgal.cpp | 15 ++++-- .../rational_1d_fitter_cgal.h | 5 +- .../rational_fitter_cgal.pro | 12 +++-- .../rational_function/rational_function.pro | 9 ++-- sources/tests/plugin_loader/main.cpp | 47 ++++++++++++++++--- sources/tests/plugin_loader/plugin_loader.pro | 3 +- 11 files changed, 88 insertions(+), 30 deletions(-) diff --git a/sources/core/args.h b/sources/core/args.h index 3a92df2..385f67e 100644 --- a/sources/core/args.h +++ b/sources/core/args.h @@ -62,11 +62,10 @@ class arguments } ; float get_float(const std::string& key, float default_value = 0.0f) const { - std::string value = _map.at(key) ; - if(value.empty()) - return default_value ; + if(_map.count(key) > 0) + return atof(_map.at(key).c_str()) ; else - return atof(value.c_str()) ; + return default_value ; } ; int get_int(const std::string& key, int default_value = 0) const { diff --git a/sources/plugins/rational_1d/rational_1d_fitter.cpp b/sources/plugins/rational_1d/rational_1d_fitter.cpp index 097063a..1c00939 100644 --- a/sources/plugins/rational_1d/rational_1d_fitter.cpp +++ b/sources/plugins/rational_1d/rational_1d_fitter.cpp @@ -170,6 +170,11 @@ bool rational_1d_data::get(int i, double& x, double& yl, double& yu) const return true ; } + +const std::vector& rational_1d_data::get(int i) const +{ + return _data[i] ; +} int rational_1d_data::input_dimension() const { diff --git a/sources/plugins/rational_1d/rational_1d_fitter.h b/sources/plugins/rational_1d/rational_1d_fitter.h index f4809c5..f8db5f3 100644 --- a/sources/plugins/rational_1d/rational_1d_fitter.h +++ b/sources/plugins/rational_1d/rational_1d_fitter.h @@ -53,6 +53,7 @@ class rational_1d_data : public data // Acces to data virtual bool get(int i, double& x, double& yl, double& yu) const ; + virtual const std::vector& get(int i) const ; virtual const std::vector& operator[](int i) const ; // Get data size @@ -84,11 +85,11 @@ class rational_1d_fitter : public fitter public: // methods // Fitting a data object - virtual bool fit_data(const rational_1d_data* data, rational_1d*& fit) ; + virtual bool fit_data(const data* d, function*& f) ; // Fitting a data object using np elements in the numerator and nq // elements in the denominator - virtual bool fit_data(const rational_1d_data* data, int np, int nq, rational_1d*& fit) = 0 ; + virtual bool fit_data(const data* d, int np, int nq, function*& f) = 0 ; virtual void set_parameters(const arguments& args) ; diff --git a/sources/plugins/rational_1d/rational_1d_fitter_eigen.h b/sources/plugins/rational_1d/rational_1d_fitter_eigen.h index f598dee..cbd8860 100644 --- a/sources/plugins/rational_1d/rational_1d_fitter_eigen.h +++ b/sources/plugins/rational_1d/rational_1d_fitter_eigen.h @@ -9,7 +9,7 @@ class rational_1d_fitter_eigen : public rational_1d_fitter // Fitting a data object using np elements // in the numerator and nq elements in the // denominator - virtual bool fit_data(const rational_1d_data* data, int np, int nq, rational_1d*& fit) ; + virtual bool fit_data(const data* d, int np, int nq, function*& f) ; private: } ; diff --git a/sources/plugins/rational_data/rational_data.pro b/sources/plugins/rational_data/rational_data.pro index a35089d..b47c469 100644 --- a/sources/plugins/rational_data/rational_data.pro +++ b/sources/plugins/rational_data/rational_data.pro @@ -1,5 +1,8 @@ TEMPLATE = lib -CONFIG += plugin +CONFIG *= qt \ + plugin + +DESTDIR = ../build INCLUDEPATH += ../.. HEADERS = rational_data.h @@ -7,5 +10,4 @@ SOURCES = rational_data.cpp LIBS += -lboost_regex -QMAKE_CXXFLAGS += -std=c++11 -frounding-math - +QMAKE_CXXFLAGS += -std=c++11 -frounding-math -fPIC diff --git a/sources/plugins/rational_fitter_cgal/rational_1d_fitter_cgal.cpp b/sources/plugins/rational_fitter_cgal/rational_1d_fitter_cgal.cpp index b3fa383..4b82b14 100644 --- a/sources/plugins/rational_fitter_cgal/rational_1d_fitter_cgal.cpp +++ b/sources/plugins/rational_fitter_cgal/rational_1d_fitter_cgal.cpp @@ -22,7 +22,14 @@ typedef CGAL::Quadratic_program Program ; typedef CGAL::Quadratic_program_solution Solution ; typedef CGAL::Quadratic_program_options Options ; -bool rational_1d_fitter_cgal::fit_data(const data* d, function*& fit) +rational_fitter_cgal::rational_fitter_cgal() : QObject() +{ +} +rational_fitter_cgal::~rational_fitter_cgal() +{ +} + +bool rational_fitter_cgal::fit_data(const data* d, function*& fit) { std::cout << "<> np in [" << _min_np << ", " << _max_np << "] & nq in [" << _min_nq << ", " << _max_nq << "]" << std::endl ; int temp_np = _min_np, temp_nq = _min_nq ; @@ -48,7 +55,7 @@ bool rational_1d_fitter_cgal::fit_data(const data* d, function*& fit) return false ; } -void rational_1d_fitter_cgal::set_parameters(const arguments& args) +void rational_fitter_cgal::set_parameters(const arguments& args) { _max_np = args.get_float("np", 10) ; _max_nq = args.get_float("nq", 10) ; @@ -57,7 +64,7 @@ void rational_1d_fitter_cgal::set_parameters(const arguments& args) } -bool rational_1d_fitter_cgal::fit_data(const data* d, int np, int nq, function*& rf) +bool rational_fitter_cgal::fit_data(const data* d, int np, int nq, function*& rf) { // by default, we have a nonnegative QP with Ax - b >= 0 Program qp (CGAL::LARGER, false, 0, false, 0) ; @@ -254,4 +261,4 @@ bool rational_1d_fitter_cgal::fit_data(const data* d, int np, int nq, function*& } } -Q_EXPORT_PLUGIN2(rational_fitter_cgal, rational_1d_fitter_cgal) +Q_EXPORT_PLUGIN2(rational_fitter_cgal, rational_fitter_cgal) diff --git a/sources/plugins/rational_fitter_cgal/rational_1d_fitter_cgal.h b/sources/plugins/rational_fitter_cgal/rational_1d_fitter_cgal.h index ce0d9e6..80c467d 100644 --- a/sources/plugins/rational_fitter_cgal/rational_1d_fitter_cgal.h +++ b/sources/plugins/rational_fitter_cgal/rational_1d_fitter_cgal.h @@ -13,12 +13,15 @@ #include #include -class rational_1d_fitter_cgal : public QObject, public fitter +class rational_fitter_cgal : public QObject, public fitter { Q_OBJECT Q_INTERFACES(fitter) public: // methods + + rational_fitter_cgal() ; + virtual ~rational_fitter_cgal() ; // Fitting a data object virtual bool fit_data(const data* d, function*& fit) ; diff --git a/sources/plugins/rational_fitter_cgal/rational_fitter_cgal.pro b/sources/plugins/rational_fitter_cgal/rational_fitter_cgal.pro index 0f92c99..47648ad 100644 --- a/sources/plugins/rational_fitter_cgal/rational_fitter_cgal.pro +++ b/sources/plugins/rational_fitter_cgal/rational_fitter_cgal.pro @@ -1,13 +1,17 @@ TEMPLATE = lib -CONFIG += plugin +CONFIG *= qt \ + plugin \ + debug + +DESTDIR = ../build INCLUDEPATH += ../rational_function ../rational_data ../.. /home/belcour/Sources/Eigen/include/eigen3 HEADERS = rational_1d_fitter_cgal.h SOURCES = rational_1d_fitter_cgal.cpp -LIBS += -lCGAL -lboost_regex \ - -L../rational_function -L../rational_data \ +LIBS += -lCGAL -lboost_regex \ + -L../build \ -lrational_function -lrational_data -QMAKE_CXXFLAGS += -std=c++11 -frounding-math +QMAKE_CXXFLAGS += -std=c++11 -frounding-math -fPIC diff --git a/sources/plugins/rational_function/rational_function.pro b/sources/plugins/rational_function/rational_function.pro index ff5be03..7d74816 100644 --- a/sources/plugins/rational_function/rational_function.pro +++ b/sources/plugins/rational_function/rational_function.pro @@ -1,11 +1,14 @@ TEMPLATE = lib -CONFIG += plugin - +CONFIG *= qt \ + plugin + +DESTDIR = ../build + INCLUDEPATH += ../.. HEADERS = rational_function.h SOURCES = rational_function.cpp LIBS += -lboost_regex -QMAKE_CXXFLAGS += -std=c++11 -frounding-math +QMAKE_CXXFLAGS += -std=c++11 -frounding-math -fPIC -rdynamic diff --git a/sources/tests/plugin_loader/main.cpp b/sources/tests/plugin_loader/main.cpp index 0bff07b..828fa29 100644 --- a/sources/tests/plugin_loader/main.cpp +++ b/sources/tests/plugin_loader/main.cpp @@ -29,22 +29,30 @@ int main(int argc, char** argv) QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); QObject *plugin = loader.instance(); - if (plugin != nullptr) { - - std::cout << "Loading plugin " << fileName.toStdString() << std::endl ; + if (plugin != nullptr) + { +#ifdef DEBUG + std::cout << "<> loading plugin " << fileName.toStdString() << std::endl ; +#endif if(dynamic_cast(plugin) != nullptr) { - std::cout << " -> it is a function" << std::endl ; +#ifdef DEBUG + std::cout << "<> -> it is a function" << std::endl ; +#endif functions.push_back(dynamic_cast(plugin)) ; } else if(dynamic_cast(plugin) != nullptr) { - std::cout << " -> it is a data loader" << std::endl ; +#ifdef DEBUG + std::cout << "<> -> it is a data loader" << std::endl ; +#endif datas.push_back(dynamic_cast(plugin)) ; } else if(dynamic_cast(plugin) != nullptr) { - std::cout << " -> it is a fitter" << std::endl ; +#ifdef DEBUG + std::cout << "<> -> it is a fitter" << std::endl ; +#endif fitters.push_back(dynamic_cast(plugin)) ; } @@ -52,6 +60,14 @@ int main(int argc, char** argv) } arguments args(argc, argv) ; + if(! args.is_defined("input")) { + std::cerr << "<> the input filename is not defined" << std::endl ; + return 1 ; + } + if(! args.is_defined("output")) { + std::cerr << "<> the output filename is not defined" << std::endl ; + return 1 ; + } if(fitters.size() > 0 && datas.size() > 0 && functions.size() > 0) { @@ -59,12 +75,29 @@ int main(int argc, char** argv) function* f = functions[0] ; data* d = datas[0] ; + if(args.is_defined("min") && args.is_defined("max")) + { + d->load(args["input"], args.get_float("min", 0.0f), args.get_float("max", 1.0f)); + } + else if(args.is_defined("min") && !args.is_defined("max")) + { + d->load(args["input"], args.get_float("min", 0.0f), std::numeric_limits::max()); + } + else if(args.is_defined("min") && !args.is_defined("max")) + { + d->load(args["input"], -std::numeric_limits::max(), args.get_float("min", 0.0f)); + } + else + { + d->load(args["input"]); + } + bool is_fitted = fitters[0]->fit_data(d, f) ; // Display the result if(is_fitted) { - std::cout << f << std::endl ; +// std::cout << *f << std::endl ; //* std::ofstream file(args["output"], std::ios_base::trunc); diff --git a/sources/tests/plugin_loader/plugin_loader.pro b/sources/tests/plugin_loader/plugin_loader.pro index 9c75015..256791f 100644 --- a/sources/tests/plugin_loader/plugin_loader.pro +++ b/sources/tests/plugin_loader/plugin_loader.pro @@ -5,6 +5,7 @@ INCLUDEPATH += ../../ ../../libs/rational_1d /home/belcour/Sources/Eigen/include SOURCES += main.cpp -QMAKE_CXXFLAGS += -std=c++11 -frounding-math +QMAKE_CXXFLAGS += -std=c++11 -frounding-math -fPIC +QMAKE_LFLAGS += -Wl,-rpath="." LIBS += -lCGAL -lboost_regex -- GitLab