using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tensorflow.Keras.Layers;
using Tensorflow.Keras.Saving;
using Tensorflow.Keras.Utils;
using static Tensorflow.Binding;
namespace Tensorflow.Keras.Engine
{
public partial class Functional
{
public ModelConfig get_config()
{
return get_network_config();
}
///
/// Builds the config, which consists of the node graph and serialized layers.
///
ModelConfig get_network_config()
{
var config = new ModelConfig
{
Name = name
};
var node_conversion_map = new Dictionary();
foreach (var layer in _layers)
{
var kept_nodes = _should_skip_first_node(layer) ? 1 : 0;
foreach (var (original_node_index, node) in enumerate(layer.InboundNodes))
{
var node_key = _make_node_key(layer.Name, original_node_index);
if (NetworkNodes.Contains(node_key))
{
node_conversion_map[node_key] = kept_nodes;
kept_nodes += 1;
}
}
}
var layer_configs = new List();
foreach (var layer in _layers)
{
var filtered_inbound_nodes = new List();
foreach (var (original_node_index, node) in enumerate(layer.InboundNodes))
{
var node_key = _make_node_key(layer.Name, original_node_index);
if (NetworkNodes.Contains(node_key) && !node.is_input)
{
var node_data = node.serialize(_make_node_key, node_conversion_map);
filtered_inbound_nodes.append(node_data);
}
}
var layer_config = generic_utils.serialize_keras_object(layer);
layer_config.Name = layer.Name;
layer_config.InboundNodes = filtered_inbound_nodes;
layer_configs.Add(layer_config);
}
config.Layers = layer_configs;
// Gather info about inputs and outputs.
var model_inputs = new List();
foreach (var i in range(_input_layers.Count))
{
var (layer, node_index, tensor_index) = _input_coordinates[i];
var node_key = _make_node_key(layer.Name, node_index);
if (!NetworkNodes.Contains(node_key))
continue;
var new_node_index = node_conversion_map[node_key];
model_inputs.append(new NodeConfig
{
Name = layer.Name,
NodeIndex = new_node_index,
TensorIndex = tensor_index
});
}
config.InputLayers = model_inputs;
var model_outputs = new List();
foreach (var i in range(_output_layers.Count))
{
var (layer, node_index, tensor_index) = _output_coordinates[i];
var node_key = _make_node_key(layer.Name, node_index);
if (!NetworkNodes.Contains(node_key))
continue;
var new_node_index = node_conversion_map[node_key];
model_outputs.append(new NodeConfig
{
Name = layer.Name,
NodeIndex = new_node_index,
TensorIndex = tensor_index
});
}
config.OutputLayers = model_outputs;
return config;
}
string _make_node_key(string layer_name, int node_index)
=> $"{layer_name}_ib-{node_index}";
}
}