diff --git a/svm-boost-serialization.hpp b/svm-boost-serialization.hpp new file mode 100644 index 00000000..5ef42236 --- /dev/null +++ b/svm-boost-serialization.hpp @@ -0,0 +1,233 @@ +#ifndef LIBSVM_BOOST_SERIALIZATION_HPP +#define LIBSVM_BOOST_SERIALIZATION_HPP + +#include "svm.h" +#include +#include +#include + + +namespace boost { +namespace serialization { +namespace detail{ + template + T* SVMMalloc(size_t n){ + return (T*)malloc((n)*sizeof(T)); + } + + template + std::vector svm_save_1d_array(const T* array_1d, size_t n){ + std::vector vec_1d(n); + for(size_t i=0;i + void svm_load_1d_array(const std::vector &vec_1d, T* &array_1d){ + array_1d = SVMMalloc(vec_1d.size()); + for(size_t i=0;i + void svm_load_2d_array(const std::vector > &vec_2d, T** &array_2d){ + array_2d = detail::SVMMalloc(vec_2d.size()); + + for(size_t i=0;i +void serialize(Archive & ar, svm_node &n, const unsigned int version){ + ar & BOOST_SERIALIZATION_NVP(n.index); + ar & BOOST_SERIALIZATION_NVP(n.value); +} + +template +void serialize(Archive & ar, svm_parameter &p, const unsigned int version){ + ar & BOOST_SERIALIZATION_NVP(p.svm_type); + ar & BOOST_SERIALIZATION_NVP(p.kernel_type); + ar & BOOST_SERIALIZATION_NVP(p.degree); + ar & BOOST_SERIALIZATION_NVP(p.gamma); + ar & BOOST_SERIALIZATION_NVP(p.coef0); +} + +template +void save(Archive & ar, const svm_model &m, const unsigned int version){ + ar & BOOST_SERIALIZATION_NVP(m.param); + ar & BOOST_SERIALIZATION_NVP(m.nr_class); + ar & BOOST_SERIALIZATION_NVP(m.l); + + //SV + { + const svm_node * const *SV = m.SV; + std::vector > vec_SV(m.l); + + for(int i=0;iindex == -1) break; + p++; + } + } + } + + ar & BOOST_SERIALIZATION_NVP(vec_SV); + } + + //sv_coef + { + const double * const *sv_coef = m.sv_coef; + std::vector > vec_sv_coef(m.nr_class-1, std::vector(m.l)); + + for(int i=0;i vec_probA; + if(m.probA) // regression has probA only + { + vec_probA = detail::svm_save_1d_array(m.probA, m.nr_class*(m.nr_class-1)/2); + } + ar & BOOST_SERIALIZATION_NVP(vec_probA); + } + + //probB + { + std::vector vec_probB; + if(m.probB) + { + vec_probB = detail::svm_save_1d_array(m.probB, m.nr_class*(m.nr_class-1)/2); + } + ar & BOOST_SERIALIZATION_NVP(vec_probB); + } + + //label + { + std::vector vec_label; + if(m.label) + { + vec_label = detail::svm_save_1d_array(m.label, m.nr_class); + } + ar & BOOST_SERIALIZATION_NVP(vec_label); + } + + //nSV + { + std::vector vec_nSV; + if(m.nSV) + { + vec_nSV = detail::svm_save_1d_array(m.nSV, m.nr_class); + } + ar & BOOST_SERIALIZATION_NVP(vec_nSV); + } +} + +template +void load(Archive & ar, svm_model &m, const unsigned int version){ + m.rho = NULL; + m.probA = NULL; + m.probB = NULL; + m.sv_indices = NULL; + m.label = NULL; + m.nSV = NULL; + + ar & BOOST_SERIALIZATION_NVP(m.param); + ar & BOOST_SERIALIZATION_NVP(m.nr_class); + ar & BOOST_SERIALIZATION_NVP(m.l); + + //SV + { + std::vector > vec_SV; + ar & BOOST_SERIALIZATION_NVP(vec_SV); + detail::svm_load_2d_array(vec_SV, m.SV); + } + + //sv_coef + { + std::vector > vec_sv_coef; + ar & BOOST_SERIALIZATION_NVP(vec_sv_coef); + detail::svm_load_2d_array(vec_sv_coef, m.sv_coef); + } + + //rho + { + std::vector vec_rho; + ar & BOOST_SERIALIZATION_NVP(vec_rho); + detail::svm_load_1d_array(vec_rho, m.rho); + } + + //probA + { + std::vector vec_probA; + ar & BOOST_SERIALIZATION_NVP(vec_probA); + if(!vec_probA.empty()){ + detail::svm_load_1d_array(vec_probA, m.probA); + } + } + + //probB + { + std::vector vec_probB; + ar & BOOST_SERIALIZATION_NVP(vec_probB); + if(!vec_probB.empty()){ + detail::svm_load_1d_array(vec_probB, m.probB); + } + } + + //label + { + std::vector vec_label; + ar & BOOST_SERIALIZATION_NVP(vec_label); + if(!vec_label.empty()){ + detail::svm_load_1d_array(vec_label, m.label); + } + } + + //nSV + { + std::vector vec_nSV; + ar & BOOST_SERIALIZATION_NVP(vec_nSV); + if(!vec_nSV.empty()){ + detail::svm_load_1d_array(vec_nSV, m.nSV); + } + } + + m.free_sv = 1; +} + +} // namespace serialization +} // namespace boost + +BOOST_SERIALIZATION_SPLIT_FREE(svm_model); + +#endif /* LIBSVM_BOOST_SERIALIZATION_HPP */ +