#edit-mode: -*- python -*-
# Copyright (c) 2016 Baidu, Inc. All Rights Reserved
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#Todo(luotao02) This config is only used for unitest. It is out of date now, and will be updated later.

TrainData(
    SimpleData(
        files = "trainer/tests/sample_filelist.txt",
        feat_dim = 3,
        context_len = 0,
        buffer_capacity = 1000000,
    )
)

TestData(
    SimpleData(
        files = "trainer/tests/sample_filelist.txt",
        feat_dim = 3,
        context_len = 0,
        buffer_capacity = 1000000,
    )
)

Settings(
    algorithm = "sgd",
    num_batches_per_send_parameter = 1,
    num_batches_per_get_parameter = 1,
    batch_size = 100,
    learning_rate = 0.001,
    learning_rate_decay_a = 1e-5,
    learning_rate_decay_b = 0.5,
)

default_initial_std(0.2)
# Output layer, label layer, cost layer, preferably set to the same environment.
output_device = 0

model_type("nn")

# Input Layer does not need to specify the device number.
Layer(
    name = "input",
    type = "data",
    size = 3,
)

# Calculate in the CPU.
Layer(
    name = "layer1_1",
    type = "fc",
    size = 5,
    active_type = "sigmoid",
    device = -1,
    inputs = "input",
)

# Calculate in the GPU 0.
Layer(
    name = "layer2_1",
    type = "fc",
    size = 10,
    active_type = "sigmoid",
    device = 0,
    inputs = "layer1_1",
)

# Calculate in the GPU 1.
Layer(
    name = "layer2_2",
    type = "fc",
    size = 10,
    active_type = "sigmoid",
    device = 1,
    inputs = "layer1_1",
)

# Calculate in the GPU 0.
Layer(
    name = "layer3_1",
    type = "fc",
    size = 10,
    device = 0,
    active_type = "sigmoid",
    inputs = ["layer2_1", "layer2_2"],
)

# Calculate in the GPU 1.
Layer(
    name = "layer3_2",
    type = "fc",
    size = 10,
    device = 1,
    active_type = "sigmoid",
    inputs = ["layer2_1", "layer2_2"],
)


Layer(
    name = "output",
    type = "fc",
    size = 10,
    device = output_device,
    active_type = "sigmoid",
    inputs = ["layer3_1", "layer3_2"],
)

if get_config_arg('with_cost', bool, True):
    # This is for training the neural network.
    # We need to have another data layer for label
    # and a layer for calculating cost
    Layer(
        name = "label",
        type = "data",
        device = output_device,
        size = 1,
    )

    Layer(
        name = "cost",
        type = "multi-class-cross-entropy",
        device = output_device,
        inputs = ["output", "label"],
    )

    Evaluator(
        name = "error",
        type = "classification_error",
        inputs = ["output", "label"])

    Inputs("input", "label")
    Outputs("cost")

else:
    # This is for prediction where we don't have label
    # and don't need to calculate cost
    Inputs("input")
    Outputs("output")