void MLP::GetOutput(const std::vector<double> &input, std::vector<double> * output, std::vector<std::vector<double>> * all_layers_activations) const { assert(input.size() == m_num_inputs); int temp_size; if (m_num_hidden_layers == 0) temp_size = m_num_outputs; else temp_size = m_layers_nodes[1]; std::vector<double> temp_in(m_num_inputs, 0.0); std::vector<double> temp_out(temp_size, 0.0); temp_in = input; for (int i = 0; i < m_layers.size(); ++i) { if (i > 0) { //Store this layer activation if (all_layers_activations != nullptr) all_layers_activations->emplace_back(std::move(temp_in)); temp_in.clear(); temp_in = temp_out; temp_out.clear(); temp_out.resize(m_layers[i].GetOutputSize()); } m_layers[i].GetOutputAfterActivationFunction(temp_in, &temp_out); } if (temp_out.size() > 1) utils::Softmax(&temp_out); *output = temp_out; //Add last layer activation if (all_layers_activations != nullptr) all_layers_activations->emplace_back(std::move(temp_in)); }
GaloisFieldDict GaloisFieldDict::gf_frobenius_map(const GaloisFieldDict &g, const std::vector<GaloisFieldDict> &b) const { if (modulo_ != g.modulo_) throw std::runtime_error("Error: field must be same."); unsigned m = g.degree(); GaloisFieldDict temp_out(*this), out; if (this->degree() >= m) { temp_out %= g; } if (temp_out.empty()) { return temp_out; } m = temp_out.degree(); out = GaloisFieldDict::from_vec({temp_out.dict_[0]}, modulo_); for (unsigned i = 1; i <= m; ++i) { auto v = b[i]; v *= temp_out.dict_[i]; out += v; } out.gf_istrip(); return out; }