diff --git a/src/Network/NeuralNetwork.cpp b/src/Network/NeuralNetwork.cpp index f204caee8eaa1333fbb069ae0abf4aca5b5e648c..d8c11a9b77f3bab68cc7ffdf220e2d0114098f61 100644 --- a/src/Network/NeuralNetwork.cpp +++ b/src/Network/NeuralNetwork.cpp @@ -5,11 +5,17 @@ * @date 13.6.18 - */ -#include <iostream> -#include <boost/random/mersenne_twister.hpp> -#include <boost/random/uniform_real_distribution.hpp> #include "NeuralNetwork.h" +BOOST_CLASS_EXPORT(NeuronBinary); +BOOST_CLASS_EXPORT(NeuronConstant); +BOOST_CLASS_EXPORT(NeuronLinear); +BOOST_CLASS_EXPORT(NeuronLogistic); +BOOST_CLASS_EXPORT(NeuronLogistic_d1); +BOOST_CLASS_EXPORT(NeuronLogistic_d2); +BOOST_CLASS_EXPORT(ConnectionFunctionGeneral); +BOOST_CLASS_EXPORT(ConnectionFunctionIdentity); + NeuralNetwork::NeuralNetwork() { this->neurons = new std::vector<Neuron*>(0); this->neuron_biases = new std::vector<double>(0); @@ -32,10 +38,17 @@ NeuralNetwork::NeuralNetwork() { this->layers_analyzed = false; } +NeuralNetwork::NeuralNetwork(std::string filepath) { + std::ifstream ifs(filepath); + boost::archive::text_iarchive ia(ifs); + ia >> *this; + ifs.close(); +} + NeuralNetwork::~NeuralNetwork() { if(this->neurons){ - for( auto n: *this->neurons ){ + for( auto n: *(this->neurons) ){ delete n; n = nullptr; } @@ -589,7 +602,10 @@ void NeuralNetwork::print_weights() { } void NeuralNetwork::print_stats(){ - printf("Number of neurons: %d, number of active weights: %d, number of active biases: %d\n", (int)this->neurons->size(), (int)this->connection_weights->size(), (int)this->neuron_biases->size()); + std::cout << "Number of neurons: " << this->neurons->size() << std::endl + << "Number of connections: " << this->connection_list->size() << std::endl + << "Number of active weights: " << this->connection_weights->size() << std::endl + << "Number of active biases: " << this->neuron_biases->size() << std::endl; } std::vector<double>* NeuralNetwork::get_parameter_ptr_biases() { @@ -762,4 +778,13 @@ void NeuralNetwork::analyze_layer_structure() { } this->layers_analyzed = true; +} + +void NeuralNetwork::save_text(std::string filepath) { + std::ofstream ofs(filepath); + { + boost::archive::text_oarchive oa(ofs); + oa << *this; + ofs.close(); + } } \ No newline at end of file diff --git a/src/Network/NeuralNetwork.h b/src/Network/NeuralNetwork.h index 589815aa1da3f641f5547efadb1beb815d2298d1..06eb1468be9e6ec62e994a2cd9e9af75aba21c02 100644 --- a/src/Network/NeuralNetwork.h +++ b/src/Network/NeuralNetwork.h @@ -11,19 +11,39 @@ #ifndef INC_4NEURO_NEURALNETWORK_H #define INC_4NEURO_NEURALNETWORK_H +#include <iostream> #include <vector> #include <algorithm> #include <utility> -#include "../Neuron/Neuron.h" -#include "../NetConnection/ConnectionFunctionGeneral.h" -#include "../NetConnection/ConnectionFunctionIdentity.h" -#include "../settings.h" +#include <fstream> -enum NET_TYPE{GENERAL}; +#include <boost/random/mersenne_twister.hpp> +#include <boost/random/uniform_real_distribution.hpp> -enum BIAS_TYPE{NEXT_BIAS, NO_BIAS, EXISTING_BIAS}; +#include <boost/archive/text_oarchive.hpp> +#include <boost/archive/text_iarchive.hpp> +#include <boost/serialization/list.hpp> +#include <boost/serialization/string.hpp> +#include <boost/serialization/version.hpp> +#include <boost/serialization/split_member.hpp> +#include <boost/serialization/export.hpp> +#include <boost/serialization/vector.hpp> +#include <boost/serialization/utility.hpp> -enum SIMPLE_CONNECTION_TYPE{NEXT_WEIGHT, UNITARY_WEIGHT, EXISTING_WEIGHT}; +#include "Neuron/Neuron.h" +#include "Neuron/NeuronConstant.h" +#include "Neuron/NeuronBinary.h" +#include "Neuron/NeuronLinear.h" +#include "Neuron/NeuronLogistic.h" +#include "NetConnection/ConnectionFunctionGeneral.h" +#include "NetConnection/ConnectionFunctionIdentity.h" +#include "settings.h" + + + +enum class BIAS_TYPE{NEXT_BIAS, NO_BIAS, EXISTING_BIAS}; + +enum class SIMPLE_CONNECTION_TYPE{NEXT_WEIGHT, UNITARY_WEIGHT, EXISTING_WEIGHT}; /** @@ -31,10 +51,7 @@ enum SIMPLE_CONNECTION_TYPE{NEXT_WEIGHT, UNITARY_WEIGHT, EXISTING_WEIGHT}; */ class NeuralNetwork { private: - /** - * - */ - NET_TYPE network_type = GENERAL; + friend class boost::serialization::access; /** * @@ -140,13 +157,36 @@ private: */ void analyze_layer_structure( ); + template<class Archive> + void serialize(Archive & ar, const unsigned int version) { + ar & this->neurons; + ar & this->input_neuron_indices; + ar & this->output_neuron_indices; + ar & this->connection_list; + ar & this->neuron_biases; + ar & this-> neuron_bias_indices; + ar & this->neuron_potentials; + ar & this->connection_weights; + ar & this->inward_adjacency; + ar & this->outward_adjacency; + ar & this->neuron_layers_feedforward; + ar & this->neuron_layers_feedbackward; + ar & this->layers_analyzed; + ar & this->delete_weights; + ar & this->delete_biases; + }; public: /** * */ - NeuralNetwork(); + explicit NeuralNetwork(); + + /** + * + */ + explicit NeuralNetwork(std::string filepath); /** * @@ -184,14 +224,12 @@ public: */ virtual void eval_single(std::vector<double> &input, std::vector<double> &output, std::vector<double> *custom_weights_and_biases = nullptr); - - /** * Adds a new neuron to the list of neurons. Also assigns a valid bias value to its activation function * @param[in] n * @return */ - size_t add_neuron(Neuron* n, BIAS_TYPE bt = NEXT_BIAS, size_t bias_idx = 0); + size_t add_neuron(Neuron* n, BIAS_TYPE bt = BIAS_TYPE::NEXT_BIAS, size_t bias_idx = 0); /** * @@ -199,7 +237,7 @@ public: * @param n2_idx * @return */ - size_t add_connection_simple(size_t n1_idx, size_t n2_idx, SIMPLE_CONNECTION_TYPE sct = NEXT_WEIGHT, size_t weight_idx = 0 ); + size_t add_connection_simple(size_t n1_idx, size_t n2_idx, SIMPLE_CONNECTION_TYPE sct = SIMPLE_CONNECTION_TYPE::NEXT_WEIGHT, size_t weight_idx = 0 ); /** * Take the existing connection with index 'connection_idx' in 'parent_network' and adds it to the structure of this @@ -291,7 +329,13 @@ public: * @return */ std::vector<double>* get_parameter_ptr_biases(); -}; + /** + * + * @param filepath + */ + void save_text(std::string filepath); + +}; #endif //INC_4NEURO_NEURALNETWORK_H diff --git a/src/Network/NeuralNetworkSum.h b/src/Network/NeuralNetworkSum.h index d31df8ece4965ce4cff9cc41c5cba114a1a4303c..6fa8054fdf12159869f68cbc0f32b1b3bfa2516b 100644 --- a/src/Network/NeuralNetworkSum.h +++ b/src/Network/NeuralNetworkSum.h @@ -12,9 +12,18 @@ class NeuralNetworkSum : public NeuralNetwork { private: + friend class boost::serialization::access; + std::vector<NeuralNetwork*> * summand; std::vector<double> * summand_coefficient; + template <class Archive> + void serialize(Archive & ar, const unsigned int version) { + ar & boost::serialization::base_object<NeuralNetwork>(*this); + ar & this->summand; + ar & this->summand_coefficient; + }; + public: NeuralNetworkSum( ); virtual ~NeuralNetworkSum( );