356 {
358
359
360
361
363
364 if (iii >= nodes.size()) throw_cfg("no node index", iii);
365
366 const NodeConfig&
node = nodes.at(iii);
367
368
369 if (
node.type == NodeConfig::Type::INPUT) {
370 check_compute_node(node);
371 size_t input_number =
node.sources.at(0);
372 m_nodes[iii] =
new InputNode(input_number,
node.index);
373 return;
374 }
else if (
node.type == NodeConfig::Type::INPUT_SEQUENCE) {
375 check_compute_node(node);
376 size_t input_number =
node.sources.at(0);
378 return;
379 }
380
381
382 if (cycle_check.count(iii)) {
383 throw NNConfigurationException("found cycle in graph");
384 }
385 cycle_check.insert(iii);
386 for (
size_t source_node:
node.sources) {
387 build_node(source_node, nodes, layers, cycle_check);
388 }
389
390
391 if (
node.type == NodeConfig::Type::FEED_FORWARD) {
392 m_nodes[iii] = get_feedforward_node(node, layers,
394 }
else if (
node.type == NodeConfig::Type::TIME_DISTRIBUTED) {
395 m_seq_nodes[iii] = get_time_distributed_node(node, layers,
397 }
else if (
node.type == NodeConfig::Type::SEQUENCE) {
398 SequenceNode* seq_node =
400
403 }
else if (
node.type == NodeConfig::Type::CONCATENATE) {
404
405 std::vector<const INode*> in_nodes;
406 for (
size_t source_node:
node.sources) {
407 in_nodes.push_back(
m_nodes.at(source_node));
408 }
409 m_nodes[iii] =
new ConcatenateNode(in_nodes);
410 }
else if (
node.type == NodeConfig::Type::SUM) {
411 if (
node.sources.size() != 1) {
412 throw NNConfigurationException("Sum node needs exactly 1 source");
413 }
415 } else {
416 throw NNConfigurationException("unknown node type");
417 }
418 }