From 1733a777fe4bbf9c8491455c78f06845cc2bc9e5 Mon Sep 17 00:00:00 2001 From: Yu Yang Date: Tue, 29 Nov 2016 19:36:06 +0800 Subject: [PATCH] Using ApproximatelyEquals for trainer config unittest. * Make float equal works well. * compare 0.01 and 0.009999999999 will return true. --- .../tests/CMakeLists.txt | 4 ++ .../tests/ProtobufEqualMain.cpp | 59 +++++++++++++++++++ .../tests/configs/.gitignore | 2 +- .../tests/configs/file_list.sh | 9 +++ .../tests/configs/generate_protostr.sh | 14 +---- .../tests/configs/run_tests.sh | 30 ++++++++-- 6 files changed, 100 insertions(+), 18 deletions(-) create mode 100644 python/paddle/trainer_config_helpers/tests/ProtobufEqualMain.cpp create mode 100755 python/paddle/trainer_config_helpers/tests/configs/file_list.sh diff --git a/python/paddle/trainer_config_helpers/tests/CMakeLists.txt b/python/paddle/trainer_config_helpers/tests/CMakeLists.txt index cf52b06bf..78505c85e 100644 --- a/python/paddle/trainer_config_helpers/tests/CMakeLists.txt +++ b/python/paddle/trainer_config_helpers/tests/CMakeLists.txt @@ -4,7 +4,11 @@ add_test(NAME layers_test python ${PROJ_ROOT}/python/paddle/trainer_config_helpers/tests/layers_test.py WORKING_DIRECTORY ${PROJ_ROOT}/python/paddle) +add_paddle_exe(protobuf_equal + ProtobufEqualMain.cpp) + add_test(NAME test_layerHelpers COMMAND ${PROJ_ROOT}/python/paddle/trainer_config_helpers/tests/configs/run_tests.sh + ${CMAKE_CURRENT_BINARY_DIR}/protobuf_equal ) diff --git a/python/paddle/trainer_config_helpers/tests/ProtobufEqualMain.cpp b/python/paddle/trainer_config_helpers/tests/ProtobufEqualMain.cpp new file mode 100644 index 000000000..06f7de930 --- /dev/null +++ b/python/paddle/trainer_config_helpers/tests/ProtobufEqualMain.cpp @@ -0,0 +1,59 @@ +/* Copyright (c) 2016 Baidu, Inc. All Rights Reserve. + +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. */ + +#include +#include +#include +#include +#include "TrainerConfig.pb.h" + +bool loadPb(google::protobuf::Message* conf, const std::string& filename) { + std::ifstream fin; + fin.open(filename.c_str()); + if (fin.is_open()) { + std::string str((std::istreambuf_iterator(fin)), + std::istreambuf_iterator()); + bool ok = google::protobuf::TextFormat::ParseFromString(str, conf); + fin.close(); + return ok; + } else { + return false; + } +} + +int main(int argc, char** argv) { + std::unique_ptr config1; + std::unique_ptr config2; + if (argc == 3) { + config1.reset(new paddle::ModelConfig()); + config2.reset(new paddle::ModelConfig()); + } else if (argc == 4) { + config1.reset(new paddle::TrainerConfig()); + config2.reset(new paddle::TrainerConfig()); + } + if (!config1 || !config2) { + return 1; + } else if (!loadPb(config1.get(), argv[1])) { + return 2; + } else if (!loadPb(config2.get(), argv[2])) { + return 3; + } else { + if (google::protobuf::util::MessageDifferencer::ApproximatelyEquals( + *config1, *config2)) { + return 0; + } else { + return 4; + } + } +} diff --git a/python/paddle/trainer_config_helpers/tests/configs/.gitignore b/python/paddle/trainer_config_helpers/tests/configs/.gitignore index eb646b4a7..c654bd41b 100644 --- a/python/paddle/trainer_config_helpers/tests/configs/.gitignore +++ b/python/paddle/trainer_config_helpers/tests/configs/.gitignore @@ -1 +1 @@ -protostr/*.unitest +protostr/*.unittest diff --git a/python/paddle/trainer_config_helpers/tests/configs/file_list.sh b/python/paddle/trainer_config_helpers/tests/configs/file_list.sh new file mode 100755 index 000000000..3f1d99701 --- /dev/null +++ b/python/paddle/trainer_config_helpers/tests/configs/file_list.sh @@ -0,0 +1,9 @@ +#!/bin/bash +export configs=(test_fc layer_activations projections test_print_layer +test_sequence_pooling test_lstmemory_layer test_grumemory_layer +last_first_seq test_expand_layer test_ntm_layers test_hsigmoid +img_layers img_trans_layers util_layers simple_rnn_layers unused_layers test_cost_layers +test_rnn_group shared_fc shared_lstm test_cost_layers_with_weight +test_spp_layer test_bilinear_interp test_maxout test_bi_grumemory math_ops) + +export whole_configs=(test_split_datasource) diff --git a/python/paddle/trainer_config_helpers/tests/configs/generate_protostr.sh b/python/paddle/trainer_config_helpers/tests/configs/generate_protostr.sh index bb594ac2c..e55f9bd38 100755 --- a/python/paddle/trainer_config_helpers/tests/configs/generate_protostr.sh +++ b/python/paddle/trainer_config_helpers/tests/configs/generate_protostr.sh @@ -5,24 +5,16 @@ cd `dirname $0` export PYTHONPATH=$PWD/../../../../ protostr=$PWD/protostr - -configs=(test_fc layer_activations projections test_print_layer -test_sequence_pooling test_lstmemory_layer test_grumemory_layer -last_first_seq test_expand_layer test_ntm_layers test_hsigmoid -img_layers img_trans_layers util_layers simple_rnn_layers unused_layers test_cost_layers -test_rnn_group shared_fc shared_lstm test_cost_layers_with_weight -test_spp_layer test_bilinear_interp test_maxout test_bi_grumemory math_ops) - -whole_configs=(test_split_datasource) +. file_list.sh for conf in ${configs[*]} do echo "Generating " $conf - python -m paddle.utils.dump_config $conf.py > $protostr/$conf.protostr.unitest + python -m paddle.utils.dump_config $conf.py > $protostr/$conf.protostr.unittest done for conf in ${whole_configs[*]} do echo "Generating " $conf - python -m paddle.utils.dump_config $conf.py "" --whole > $protostr/$conf.protostr.unitest + python -m paddle.utils.dump_config $conf.py "" --whole > $protostr/$conf.protostr.unittest done diff --git a/python/paddle/trainer_config_helpers/tests/configs/run_tests.sh b/python/paddle/trainer_config_helpers/tests/configs/run_tests.sh index 968328835..5f6ed9103 100755 --- a/python/paddle/trainer_config_helpers/tests/configs/run_tests.sh +++ b/python/paddle/trainer_config_helpers/tests/configs/run_tests.sh @@ -9,9 +9,27 @@ files=`ls $protostr | grep -v "unitest"` ./generate_protostr.sh -for file in $files -do - base_protostr=$protostr/$file - new_protostr=$protostr/$file.unitest - diff $base_protostr $new_protostr -u -done +. ./file_list.sh + +if [ -z $1 ]; then + for file in $files + do + base_protostr=$protostr/$file + new_protostr=$protostr/$file.unittest + diff $base_protostr $new_protostr -u + done +else + for file in ${configs[*]} + do + if ! $1 $protostr/$file.protostr $protostr/$file.protostr.unittest; then + diff $protostr/$file.protostr $protostr/$file.protostr.unittest -u + fi + done + + for file in ${whole_configs[*]} + do + if ! $1 $protostr/$file.protostr $protostr/$file.protostr.unittest --whole; then + diff $protostr/$file.protostr $protostr/$file.protostr.unittest -u + fi + done +fi -- GitLab