12 using namespace Eigen;
17 typedef std::vector<std::pair<std::string, IP*> > Preprocs;
20 typedef std::vector<std::pair<std::string, IVP*> > VecPreprocs;
24 class LazySource:
public ISource
27 LazySource(
const NodeMap&,
const SeqNodeMap&,
28 const Preprocs&,
const VecPreprocs&);
29 virtual VectorXd at(
size_t index)
const override;
30 virtual MatrixXd matrix_at(
size_t index)
const override;
34 const Preprocs& m_preprocs;
35 const VecPreprocs& m_vec_preprocs;
38 LazySource::LazySource(
const NodeMap& n,
const SeqNodeMap& s,
39 const Preprocs& p,
const VecPreprocs& v):
40 m_nodes(
n), m_seqs(
s), m_preprocs(
p), m_vec_preprocs(
v)
43 VectorXd LazySource::at(
size_t index)
const
45 const auto&
proc = m_preprocs.at(index);
46 if (!m_nodes.count(
proc.first)) {
47 throw NNEvaluationException(
"Can't find node " +
proc.first);
49 const auto& preproc = *
proc.second;
50 return preproc(m_nodes.at(
proc.first));
52 MatrixXd LazySource::matrix_at(
size_t index)
const
54 const auto&
proc = m_vec_preprocs.at(index);
55 if (!m_seqs.count(
proc.first)) {
56 throw NNEvaluationException(
"Can't find sequence node " +
proc.first);
58 const auto& preproc = *
proc.second;
59 return preproc(m_seqs.at(
proc.first));
69 const std::string& default_output):
73 m_preprocs.emplace_back(
74 node.name, new InputPreprocessor(node.variables));
76 for (
const auto&
node:
config.input_sequences) {
77 m_vec_preprocs.emplace_back(
78 node.name, new InputVectorPreprocessor(node.variables));
82 m_outputs.emplace_back(node.second.node_index, node.second.labels);
83 m_output_indices.emplace(node.first, output_n);
86 if (default_output.size() > 0) {
87 if (!m_output_indices.count(default_output)) {
88 throw NNConfigurationException(
"no output node" + default_output);
91 }
else if (output_n == 1) {
101 delete preproc.second;
105 delete preproc.second;
116 const std::string& output)
const {
127 const std::vector<std::string>& labels =
m_outputs.at(idx).second;
128 std::map<std::string, double> output;
129 for (
size_t iii = 0; iii < labels.size(); iii++) {
130 output[labels.at(iii)] =
result(iii);
141 const std::string& output)
const {
152 const std::vector<std::string>& labels =
m_outputs.at(idx).second;
153 std::map<std::string, std::vector<double> > output;
154 for (
size_t iii = 0; iii < labels.size(); iii++) {
155 VectorXd row =
result.row(iii);
156 std::vector<double> out_vector(row.data(), row.data() + row.size());
157 output[labels.at(iii)] = std::move(out_vector);
VecPreprocs m_vec_preprocs
LightweightGraph(const GraphConfig &config, const std::string &default_output="")
VectorMap scan(const NodeMap &, const SeqNodeMap &={}) const
std::map< std::string, ValueMap > NodeMap
std::map< std::string, size_t > m_output_indices
std::map< std::string, VectorMap > SeqNodeMap
ValueMap compute(const NodeMap &, const SeqNodeMap &={}) const
std::vector< std::pair< size_t, std::vector< std::string > > > m_outputs
std::map< std::string, std::vector< double > > VectorMap
std::map< std::string, double > ValueMap
LightweightGraph::NodeMap NodeMap