From ac0fb2a2f2a62d84343b0a0b75bfac2cc0ebfebf Mon Sep 17 00:00:00 2001 From: Ari Archer Date: Tue, 23 Jan 2024 19:21:37 +0200 Subject: [PATCH] [docx] split commit for file 6400 Signed-off-by: Ari Archer --- twml/libtwml/src/lib/TensorRecordWriter.cpp | 162 -- twml/libtwml/src/lib/TensorRecordWriter.docx | Bin 0 -> 37993 bytes twml/libtwml/src/lib/ThriftReader.cpp | 33 - twml/libtwml/src/lib/ThriftReader.docx | Bin 0 -> 36922 bytes twml/libtwml/src/lib/ThriftWriter.cpp | 91 - twml/libtwml/src/lib/ThriftWriter.docx | Bin 0 -> 37405 bytes twml/libtwml/src/lib/discretizer_impl.cpp | 167 -- twml/libtwml/src/lib/discretizer_impl.docx | Bin 0 -> 38159 bytes twml/libtwml/src/lib/functions.cpp | 158 -- twml/libtwml/src/lib/functions.docx | Bin 0 -> 38128 bytes .../src/lib/hashing_discretizer_impl.cpp | 241 --- .../src/lib/hashing_discretizer_impl.docx | Bin 0 -> 39393 bytes .../libtwml/src/lib/internal/endianutils.docx | Bin 0 -> 37305 bytes twml/libtwml/src/lib/internal/endianutils.h | 137 -- twml/libtwml/src/lib/internal/error.docx | Bin 0 -> 37063 bytes twml/libtwml/src/lib/internal/error.h | 29 - .../libtwml/src/lib/internal/interpolate.docx | Bin 0 -> 37371 bytes twml/libtwml/src/lib/internal/interpolate.h | 74 - twml/libtwml/src/lib/internal/khash.docx | Bin 0 -> 43198 bytes twml/libtwml/src/lib/internal/khash.h | 627 ------ .../src/lib/internal/linear_search.docx | Bin 0 -> 36876 bytes twml/libtwml/src/lib/internal/linear_search.h | 17 - .../src/lib/internal/murmur_hash3.docx | Bin 0 -> 37032 bytes twml/libtwml/src/lib/internal/murmur_hash3.h | 37 - twml/libtwml/src/lib/internal/thrift.docx | Bin 0 -> 37269 bytes twml/libtwml/src/lib/internal/thrift.h | 69 - .../src/lib/internal/utf_converter.docx | Bin 0 -> 36758 bytes twml/libtwml/src/lib/internal/utf_converter.h | 10 - twml/libtwml/src/lib/io/IOError.cpp | 61 - twml/libtwml/src/lib/io/IOError.docx | Bin 0 -> 37543 bytes twml/libtwml/src/lib/murmur_hash3.cpp | 335 --- twml/libtwml/src/lib/murmur_hash3.docx | Bin 0 -> 39068 bytes twml/libtwml/src/lib/optim.cpp | 274 --- twml/libtwml/src/lib/optim.docx | Bin 0 -> 38969 bytes twml/libtwml/src/lib/utf_converter.cpp | 53 - twml/libtwml/src/lib/utf_converter.docx | Bin 0 -> 37131 bytes twml/libtwml/src/ops/CMakeLists.docx | Bin 0 -> 37691 bytes twml/libtwml/src/ops/CMakeLists.txt | 79 - twml/libtwml/src/ops/add1.cpp | 92 - twml/libtwml/src/ops/add1.docx | Bin 0 -> 37513 bytes .../src/ops/batch_prediction_request.cpp | 183 -- .../src/ops/batch_prediction_request.docx | Bin 0 -> 38453 bytes .../src/ops/batch_prediction_request_v2.cpp | 224 -- .../src/ops/batch_prediction_request_v2.docx | Bin 0 -> 39236 bytes .../ops/batch_prediction_response_writer.cpp | 82 - .../ops/batch_prediction_response_writer.docx | Bin 0 -> 37893 bytes ...atch_prediction_tensor_response_writer.cpp | 81 - ...tch_prediction_tensor_response_writer.docx | Bin 0 -> 37889 bytes .../src/ops/binary_sparse_dense_matmul.cpp | 330 --- .../src/ops/binary_sparse_dense_matmul.docx | Bin 0 -> 37711 bytes .../src/ops/binary_sparse_dense_matmul.h | 75 - .../ops/binary_sparse_dense_matmul_impl.docx | Bin 0 -> 38790 bytes .../src/ops/binary_sparse_dense_matmul_impl.h | 145 -- twml/libtwml/src/ops/block_format_dataset.cpp | 243 --- .../libtwml/src/ops/block_format_dataset.docx | Bin 0 -> 39684 bytes twml/libtwml/src/ops/block_format_reader.docx | Bin 0 -> 37327 bytes twml/libtwml/src/ops/block_format_reader.h | 50 - twml/libtwml/src/ops/compress_sample_ids.cpp | 138 -- twml/libtwml/src/ops/compress_sample_ids.docx | Bin 0 -> 37859 bytes .../src/ops/contrib/get_substrings.cpp | 116 - .../src/ops/contrib/get_substrings.docx | Bin 0 -> 38132 bytes twml/libtwml/src/ops/data_record.cpp | 1891 ----------------- twml/libtwml/src/ops/data_record.docx | Bin 0 -> 47771 bytes .../src/ops/data_record_tensor_writer.cpp | 81 - .../src/ops/data_record_tensor_writer.docx | Bin 0 -> 37892 bytes twml/libtwml/src/ops/discretizer.cpp | 293 --- twml/libtwml/src/ops/discretizer.docx | Bin 0 -> 38781 bytes twml/libtwml/src/ops/feature_extractor.cpp | 134 -- twml/libtwml/src/ops/feature_extractor.docx | Bin 0 -> 38214 bytes twml/libtwml/src/ops/feature_id.cpp | 58 - twml/libtwml/src/ops/feature_id.docx | Bin 0 -> 37471 bytes twml/libtwml/src/ops/feature_mask.cpp | 83 - twml/libtwml/src/ops/feature_mask.docx | Bin 0 -> 37803 bytes twml/libtwml/src/ops/fixed_length_tensor.cpp | 190 -- twml/libtwml/src/ops/fixed_length_tensor.docx | Bin 0 -> 38502 bytes twml/libtwml/src/ops/hashed_data_record.cpp | 520 ----- twml/libtwml/src/ops/hashed_data_record.docx | Bin 0 -> 40801 bytes twml/libtwml/src/ops/hashing_discretizer.cpp | 260 --- twml/libtwml/src/ops/hashing_discretizer.docx | Bin 0 -> 40557 bytes twml/libtwml/src/ops/hashmap.cpp | 84 - twml/libtwml/src/ops/hashmap.docx | Bin 0 -> 37700 bytes twml/libtwml/src/ops/isotonic_calibration.cpp | 81 - .../libtwml/src/ops/isotonic_calibration.docx | Bin 0 -> 37726 bytes twml/libtwml/src/ops/num_intra_op_threads.cpp | 39 - .../libtwml/src/ops/num_intra_op_threads.docx | Bin 0 -> 37405 bytes twml/libtwml/src/ops/par_add.cpp | 75 - twml/libtwml/src/ops/par_add.docx | Bin 0 -> 37673 bytes .../src/ops/partition_sparse_tensor.cpp | 125 -- .../src/ops/partition_sparse_tensor.docx | Bin 0 -> 38352 bytes .../src/ops/percentile_discretizer_v2.cpp | 241 --- .../src/ops/percentile_discretizer_v2.docx | Bin 0 -> 40381 bytes twml/libtwml/src/ops/resource_utils.docx | Bin 0 -> 38164 bytes twml/libtwml/src/ops/resource_utils.h | 126 -- twml/libtwml/src/ops/scripts/get_inc.docx | Bin 0 -> 36697 bytes twml/libtwml/src/ops/scripts/get_inc.py | 5 - twml/libtwml/src/ops/scripts/get_inc.sh | 2 - twml/libtwml/src/ops/scripts/get_lib.docx | Bin 0 -> 36697 bytes twml/libtwml/src/ops/scripts/get_lib.py | 5 - twml/libtwml/src/ops/scripts/get_lib.sh | 2 - twml/libtwml/src/ops/scripts/symlink.docx | Bin 0 -> 36947 bytes twml/libtwml/src/ops/scripts/symlink.sh | 12 - twml/libtwml/src/ops/sleep_op.cpp | 51 - twml/libtwml/src/ops/sleep_op.docx | Bin 0 -> 37528 bytes twml/libtwml/src/ops/sparse_normalization.cpp | 378 ---- .../libtwml/src/ops/sparse_normalization.docx | Bin 0 -> 39364 bytes twml/libtwml/src/ops/tensor_record.cpp | 692 ------ twml/libtwml/src/ops/tensor_record.docx | Bin 0 -> 41543 bytes twml/libtwml/src/ops/tensorflow_utils.cpp | 87 - twml/libtwml/src/ops/tensorflow_utils.docx | Bin 0 -> 36787 bytes twml/libtwml/src/ops/tensorflow_utils.h | 13 - twml/libtwml/src/ops/var_length_reader.cpp | 46 - twml/libtwml/src/ops/var_length_reader.docx | Bin 0 -> 37411 bytes twml/setup.cfg | 8 - twml/setup.docx | Bin 0 -> 37010 bytes twml/setup.py | 29 - twml/twml/__init__.docx | Bin 0 -> 37431 bytes twml/twml/__init__.py | 61 - twml/twml/argument_parser.docx | Bin 0 -> 44720 bytes twml/twml/argument_parser.py | 561 ----- twml/twml/array.docx | Bin 0 -> 37515 bytes twml/twml/array.py | 101 - twml/twml/block_format_writer.docx | Bin 0 -> 37315 bytes twml/twml/block_format_writer.py | 65 - twml/twml/constants.docx | Bin 0 -> 36860 bytes twml/twml/constants.py | 11 - twml/twml/contrib/__init__.docx | Bin 0 -> 36925 bytes twml/twml/contrib/__init__.py | 21 - twml/twml/contrib/build_graphs_fns.docx | Bin 0 -> 37155 bytes twml/twml/contrib/build_graphs_fns.py | 32 - twml/twml/contrib/calibrators/__init__.docx | Bin 0 -> 37032 bytes twml/twml/contrib/calibrators/__init__.py | 18 - twml/twml/contrib/calibrators/calibrator.docx | Bin 0 -> 38797 bytes twml/twml/contrib/calibrators/calibrator.py | 157 -- .../calibrators/common_calibrators.docx | Bin 0 -> 43728 bytes .../contrib/calibrators/common_calibrators.py | 707 ------ .../hashed_percentile_discretizer.docx | Bin 0 -> 37071 bytes .../hashed_percentile_discretizer.py | 22 - .../calibrators/hashing_discretizer.docx | Bin 0 -> 37327 bytes .../calibrators/hashing_discretizer.py | 35 - twml/twml/contrib/calibrators/isotonic.docx | Bin 0 -> 40869 bytes twml/twml/contrib/calibrators/isotonic.py | 317 --- twml/twml/contrib/calibrators/mdl.docx | Bin 0 -> 38400 bytes twml/twml/contrib/calibrators/mdl.py | 118 - .../calibrators/percentile_discretizer.docx | Bin 0 -> 44019 bytes .../calibrators/percentile_discretizer.py | 577 ----- twml/twml/contrib/eventbus/input_fn.docx | Bin 0 -> 37424 bytes twml/twml/contrib/eventbus/input_fn.py | 59 - twml/twml/contrib/eventbus/reader.docx | Bin 0 -> 37987 bytes twml/twml/contrib/eventbus/reader.py | 119 -- twml/twml/contrib/export/__init__.docx | Bin 0 -> 36654 bytes twml/twml/contrib/export/__init__.py | 2 - twml/twml/contrib/export/export_fn.docx | Bin 0 -> 39970 bytes twml/twml/contrib/export/export_fn.py | 264 --- twml/twml/contrib/export/exporters.docx | Bin 0 -> 38152 bytes twml/twml/contrib/export/exporters.py | 145 -- twml/twml/contrib/feature_config.docx | Bin 0 -> 37613 bytes twml/twml/contrib/feature_config.py | 85 - twml/twml/contrib/feature_config_parsers.docx | Bin 0 -> 38712 bytes twml/twml/contrib/feature_config_parsers.py | 224 -- .../contrib/feature_importances/__init__.docx | Bin 0 -> 36611 bytes .../contrib/feature_importances/__init__.py | 0 .../feature_importances.docx | Bin 0 -> 42892 bytes .../feature_importances.py | 414 ---- .../feature_permutation.docx | Bin 0 -> 38605 bytes .../feature_permutation.py | 129 -- .../contrib/feature_importances/helpers.docx | Bin 0 -> 38104 bytes .../contrib/feature_importances/helpers.py | 96 - twml/twml/contrib/hooks.docx | Bin 0 -> 37231 bytes twml/twml/contrib/hooks.py | 42 - twml/twml/contrib/initializers.docx | Bin 0 -> 37358 bytes twml/twml/contrib/initializers.py | 61 - twml/twml/contrib/layers/__init__.docx | Bin 0 -> 36876 bytes twml/twml/contrib/layers/__init__.py | 11 - .../twml/contrib/layers/embedding_lookup.docx | Bin 0 -> 42293 bytes twml/twml/contrib/layers/embedding_lookup.py | 419 ---- .../contrib/layers/factorization_machine.docx | Bin 0 -> 39548 bytes .../contrib/layers/factorization_machine.py | 179 -- twml/twml/contrib/layers/full_dense.docx | Bin 0 -> 40811 bytes twml/twml/contrib/layers/full_dense.py | 380 ---- .../layers/hashed_percentile_discretizer.docx | Bin 0 -> 39885 bytes .../layers/hashed_percentile_discretizer.py | 217 -- .../contrib/layers/hashing_discretizer.docx | Bin 0 -> 39283 bytes .../contrib/layers/hashing_discretizer.py | 156 -- twml/twml/contrib/layers/mask_layer.docx | Bin 0 -> 36984 bytes twml/twml/contrib/layers/mask_layer.py | 29 - twml/twml/contrib/layers/stacked_rnn.docx | Bin 0 -> 38556 bytes twml/twml/contrib/layers/stacked_rnn.py | 189 -- .../contrib/layers/zscore_normalization.docx | Bin 0 -> 39454 bytes .../contrib/layers/zscore_normalization.py | 247 --- twml/twml/contrib/metrics/__init__.docx | Bin 0 -> 36751 bytes twml/twml/contrib/metrics/__init__.py | 5 - twml/twml/contrib/metrics/metrics.docx | Bin 0 -> 39139 bytes twml/twml/contrib/metrics/metrics.py | 209 -- twml/twml/contrib/metrics/search_metrics.docx | Bin 0 -> 41014 bytes twml/twml/contrib/metrics/search_metrics.py | 292 --- twml/twml/contrib/optimizers/__init__.docx | Bin 0 -> 36751 bytes twml/twml/contrib/optimizers/__init__.py | 4 - .../deep_gradient_compression_optimizer.docx | Bin 0 -> 38481 bytes .../deep_gradient_compression_optimizer.py | 180 -- .../contrib/optimizers/pruning_optimizer.docx | Bin 0 -> 38871 bytes .../contrib/optimizers/pruning_optimizer.py | 164 -- twml/twml/contrib/parsers.docx | Bin 0 -> 37004 bytes twml/twml/contrib/parsers.py | 21 - twml/twml/contrib/pruning.docx | Bin 0 -> 40657 bytes twml/twml/contrib/pruning.py | 363 ---- twml/twml/contrib/readers/__init__.docx | Bin 0 -> 36765 bytes twml/twml/contrib/readers/__init__.py | 5 - .../readers/batch_prediction_request.docx | Bin 0 -> 36784 bytes .../readers/batch_prediction_request.py | 8 - twml/twml/contrib/readers/data_record.docx | Bin 0 -> 36898 bytes twml/twml/contrib/readers/data_record.py | 10 - .../hashed_batch_prediction_request.docx | Bin 0 -> 36792 bytes .../hashed_batch_prediction_request.py | 8 - twml/twml/contrib/trainers/__init__.docx | Bin 0 -> 36784 bytes twml/twml/contrib/trainers/__init__.py | 5 - .../batch_prediction_request_trainer.docx | Bin 0 -> 39405 bytes .../batch_prediction_request_trainer.py | 180 -- .../trainers/pruning_data_record_trainer.docx | Bin 0 -> 37608 bytes .../trainers/pruning_data_record_trainer.py | 59 - twml/twml/contrib/trainers/trainer_utils.docx | Bin 0 -> 38450 bytes twml/twml/contrib/trainers/trainer_utils.py | 111 - twml/twml/contrib/utils/__init__.docx | Bin 0 -> 36968 bytes twml/twml/contrib/utils/__init__.py | 18 - twml/twml/contrib/utils/datasets.docx | Bin 0 -> 37708 bytes twml/twml/contrib/utils/datasets.py | 93 - twml/twml/contrib/utils/device.docx | Bin 0 -> 36940 bytes twml/twml/contrib/utils/device.py | 27 - twml/twml/contrib/utils/interp.docx | Bin 0 -> 37625 bytes twml/twml/contrib/utils/interp.py | 94 - twml/twml/contrib/utils/loss_fns.docx | Bin 0 -> 39645 bytes twml/twml/contrib/utils/loss_fns.py | 302 --- twml/twml/contrib/utils/masks.docx | Bin 0 -> 37088 bytes twml/twml/contrib/utils/masks.py | 38 - twml/twml/contrib/utils/math_fns.docx | Bin 0 -> 38595 bytes twml/twml/contrib/utils/math_fns.py | 171 -- twml/twml/contrib/utils/normalizer.docx | Bin 0 -> 37108 bytes twml/twml/contrib/utils/normalizer.py | 39 - twml/twml/contrib/utils/scores.docx | Bin 0 -> 37051 bytes twml/twml/contrib/utils/scores.py | 33 - twml/twml/contrib/utils/similarities.docx | Bin 0 -> 36854 bytes twml/twml/contrib/utils/similarities.py | 17 - twml/twml/dataset.docx | Bin 0 -> 41641 bytes twml/twml/dataset.py | 372 ---- twml/twml/errors.docx | Bin 0 -> 36771 bytes twml/twml/errors.py | 13 - twml/twml/export_output_fns.docx | Bin 0 -> 36998 bytes twml/twml/export_output_fns.py | 17 - twml/twml/feature_config.docx | Bin 0 -> 37175 bytes twml/twml/feature_config.py | 54 - twml/twml/filters.docx | Bin 0 -> 36790 bytes twml/twml/filters.py | 9 - twml/twml/hooks.docx | Bin 0 -> 43388 bytes twml/twml/hooks.py | 562 ----- twml/twml/input_fns.docx | Bin 0 -> 38728 bytes twml/twml/input_fns.py | 129 -- twml/twml/layers/__init__.docx | Bin 0 -> 37037 bytes twml/twml/layers/__init__.py | 21 - .../batch_prediction_tensor_writer.docx | Bin 0 -> 37364 bytes .../layers/batch_prediction_tensor_writer.py | 51 - twml/twml/layers/batch_prediction_writer.docx | Bin 0 -> 37343 bytes twml/twml/layers/batch_prediction_writer.py | 51 - .../layers/data_record_tensor_writer.docx | Bin 0 -> 37315 bytes twml/twml/layers/data_record_tensor_writer.py | 50 - twml/twml/layers/full_dense.docx | Bin 0 -> 39244 bytes twml/twml/layers/full_dense.py | 259 --- twml/twml/layers/full_sparse.docx | Bin 0 -> 41707 bytes twml/twml/layers/full_sparse.py | 370 ---- twml/twml/layers/isotonic.docx | Bin 0 -> 37627 bytes twml/twml/layers/isotonic.py | 76 - twml/twml/layers/layer.docx | Bin 0 -> 37317 bytes twml/twml/layers/layer.py | 50 - twml/twml/layers/mdl.docx | Bin 0 -> 39974 bytes twml/twml/layers/mdl.py | 256 --- twml/twml/layers/partition.docx | Bin 0 -> 37498 bytes twml/twml/layers/partition.py | 74 - twml/twml/layers/percentile_discretizer.docx | Bin 0 -> 39909 bytes twml/twml/layers/percentile_discretizer.py | 209 -- twml/twml/layers/sequential.docx | Bin 0 -> 38000 bytes twml/twml/layers/sequential.py | 160 -- twml/twml/layers/sparse_max_norm.docx | Bin 0 -> 38955 bytes twml/twml/layers/sparse_max_norm.py | 221 -- twml/twml/layers/stitch.docx | Bin 0 -> 37307 bytes twml/twml/layers/stitch.py | 54 - twml/twml/learning_rate_decay.docx | Bin 0 -> 38256 bytes twml/twml/learning_rate_decay.py | 168 -- twml/twml/lookup/__init__.docx | Bin 0 -> 36824 bytes twml/twml/lookup/__init__.py | 11 - twml/twml/metrics.docx | Bin 0 -> 50544 bytes twml/twml/metrics.py | 1380 ------------ twml/twml/optimizers/__init__.docx | Bin 0 -> 36735 bytes twml/twml/optimizers/__init__.py | 4 - twml/twml/parsers.docx | Bin 0 -> 36986 bytes twml/twml/parsers.py | 20 - twml/twml/readers/__init__.docx | Bin 0 -> 36804 bytes twml/twml/readers/__init__.py | 7 - .../readers/batch_prediction_request.docx | Bin 0 -> 36779 bytes twml/twml/readers/batch_prediction_request.py | 8 - twml/twml/readers/data_record.docx | Bin 0 -> 36866 bytes twml/twml/readers/data_record.py | 15 - .../hashed_batch_prediction_request.docx | Bin 0 -> 36787 bytes .../hashed_batch_prediction_request.py | 8 - twml/twml/readers/hashed_data_record.docx | Bin 0 -> 36836 bytes twml/twml/readers/hashed_data_record.py | 12 - twml/twml/saved_model_cli/__init__.docx | Bin 0 -> 36611 bytes twml/twml/saved_model_cli/__init__.py | 0 twml/twml/saved_model_cli/__main__.docx | Bin 0 -> 36763 bytes twml/twml/saved_model_cli/__main__.py | 9 - twml/twml/summary/__init__.docx | Bin 0 -> 36773 bytes twml/twml/summary/__init__.py | 6 - twml/twml/tensorboard/__init__.docx | Bin 0 -> 36611 bytes twml/twml/tensorboard/__init__.py | 0 twml/twml/tensorboard/__main__.docx | Bin 0 -> 36909 bytes twml/twml/tensorboard/__main__.py | 16 - twml/twml/tensorio.docx | Bin 0 -> 38698 bytes twml/twml/tensorio.py | 161 -- twml/twml/tracking/__init__.docx | Bin 0 -> 36697 bytes twml/twml/tracking/__init__.py | 5 - twml/twml/tracking/experiment_tracker.docx | Bin 0 -> 42561 bytes twml/twml/tracking/experiment_tracker.py | 543 ----- twml/twml/trainers/__init__.docx | Bin 0 -> 36823 bytes twml/twml/trainers/__init__.py | 10 - twml/twml/trainers/data_record_trainer.docx | Bin 0 -> 46775 bytes twml/twml/trainers/data_record_trainer.py | 821 ------- twml/twml/trainers/trainer.docx | Bin 0 -> 59923 bytes twml/twml/trainers/trainer.py | 1777 ---------------- twml/twml/util.docx | Bin 0 -> 48432 bytes twml/twml/util.py | 942 -------- twml/twml_common/__init__.docx | Bin 0 -> 36611 bytes twml/twml_common/__init__.py | 0 twml/twml_common/initializer.docx | Bin 0 -> 36890 bytes twml/twml_common/initializer.py | 14 - twml/twml_common/serialize.docx | Bin 0 -> 36806 bytes twml/twml_common/serialize.py | 16 - twml/twml_common/sparse_inputs.docx | Bin 0 -> 37010 bytes twml/twml_common/sparse_inputs.py | 24 - unified_user_actions/.gitignore | 4 - unified_user_actions/.gitignore.docx | Bin 0 -> 36657 bytes unified_user_actions/BUILD.bazel | 1 - unified_user_actions/BUILD.docx | Bin 0 -> 36686 bytes unified_user_actions/README.docx | Bin 0 -> 37056 bytes unified_user_actions/README.md | 10 - .../adapter/AbstractAdapter.docx | Bin 0 -> 37060 bytes .../adapter/AbstractAdapter.scala | 19 - .../unified_user_actions/adapter/BUILD | 11 - .../unified_user_actions/adapter/BUILD.docx | Bin 0 -> 36796 bytes .../AdsCallbackEngagement.docx | Bin 0 -> 37453 bytes .../AdsCallbackEngagement.scala | 125 -- .../AdsCallbackEngagementsAdapter.docx | Bin 0 -> 37074 bytes .../AdsCallbackEngagementsAdapter.scala | 28 - .../adapter/ads_callback_engagements/BUILD | 18 - .../ads_callback_engagements/BUILD.docx | Bin 0 -> 36885 bytes .../BaseAdsCallbackEngagement.docx | Bin 0 -> 37457 bytes .../BaseAdsCallbackEngagement.scala | 68 - .../BaseTrendAdsCallbackEngagement.docx | Bin 0 -> 36956 bytes .../BaseTrendAdsCallbackEngagement.scala | 18 - .../BaseVideoAdsCallbackEngagement.docx | Bin 0 -> 37290 bytes .../BaseVideoAdsCallbackEngagement.scala | 54 - .../EngagementTypeMappings.docx | Bin 0 -> 37549 bytes .../EngagementTypeMappings.scala | 69 - .../ProfileAdsCallbackEngagement.docx | Bin 0 -> 36997 bytes .../ProfileAdsCallbackEngagement.scala | 26 - .../adapter/client_event/BUILD | 16 - .../adapter/client_event/BUILD.docx | Bin 0 -> 36917 bytes .../client_event/BaseCTAClientEvent.docx | Bin 0 -> 37238 bytes .../client_event/BaseCTAClientEvent.scala | 46 - .../client_event/BaseCardClientEvent.docx | Bin 0 -> 37016 bytes .../client_event/BaseCardClientEvent.scala | 26 - .../adapter/client_event/BaseClientEvent.docx | Bin 0 -> 37572 bytes .../client_event/BaseClientEvent.scala | 68 - .../BaseFeedbackSubmitClientEvent.docx | Bin 0 -> 37328 bytes .../BaseFeedbackSubmitClientEvent.scala | 46 - .../BaseNotificationTabClientEvent.docx | Bin 0 -> 37296 bytes .../BaseNotificationTabClientEvent.scala | 48 - .../client_event/BaseProfileClientEvent.docx | Bin 0 -> 37014 bytes .../client_event/BaseProfileClientEvent.scala | 25 - .../BasePushNotificationClientEvent.docx | Bin 0 -> 36993 bytes .../BasePushNotificationClientEvent.scala | 22 - .../BaseSearchTypeaheadEvent.docx | Bin 0 -> 37666 bytes .../BaseSearchTypeaheadEvent.scala | 87 - .../client_event/BaseTopicClientEvent.docx | Bin 0 -> 37026 bytes .../client_event/BaseTopicClientEvent.scala | 23 - .../client_event/BaseUASClientEvent.docx | Bin 0 -> 37397 bytes .../client_event/BaseUASClientEvent.scala | 62 - .../client_event/BaseVideoClientEvent.docx | Bin 0 -> 37156 bytes .../client_event/BaseVideoClientEvent.scala | 34 - .../client_event/ClientEventAdapter.docx | Bin 0 -> 40051 bytes .../client_event/ClientEventAdapter.scala | 272 --- .../client_event/ClientEventCommonUtils.docx | Bin 0 -> 38895 bytes .../client_event/ClientEventCommonUtils.scala | 169 -- .../client_event/ClientEventEngagement.docx | Bin 0 -> 43074 bytes .../client_event/ClientEventEngagement.scala | 687 ------ .../client_event/ClientEventImpression.docx | Bin 0 -> 38652 bytes .../client_event/ClientEventImpression.scala | 207 -- .../adapter/client_event/HomeInfoUtils.docx | Bin 0 -> 37070 bytes .../adapter/client_event/HomeInfoUtils.scala | 32 - 395 files changed, 30106 deletions(-) delete mode 100644 twml/libtwml/src/lib/TensorRecordWriter.cpp create mode 100644 twml/libtwml/src/lib/TensorRecordWriter.docx delete mode 100644 twml/libtwml/src/lib/ThriftReader.cpp create mode 100644 twml/libtwml/src/lib/ThriftReader.docx delete mode 100644 twml/libtwml/src/lib/ThriftWriter.cpp create mode 100644 twml/libtwml/src/lib/ThriftWriter.docx delete mode 100644 twml/libtwml/src/lib/discretizer_impl.cpp create mode 100644 twml/libtwml/src/lib/discretizer_impl.docx delete mode 100644 twml/libtwml/src/lib/functions.cpp create mode 100644 twml/libtwml/src/lib/functions.docx delete mode 100644 twml/libtwml/src/lib/hashing_discretizer_impl.cpp create mode 100644 twml/libtwml/src/lib/hashing_discretizer_impl.docx create mode 100644 twml/libtwml/src/lib/internal/endianutils.docx delete mode 100644 twml/libtwml/src/lib/internal/endianutils.h create mode 100644 twml/libtwml/src/lib/internal/error.docx delete mode 100644 twml/libtwml/src/lib/internal/error.h create mode 100644 twml/libtwml/src/lib/internal/interpolate.docx delete mode 100644 twml/libtwml/src/lib/internal/interpolate.h create mode 100644 twml/libtwml/src/lib/internal/khash.docx delete mode 100644 twml/libtwml/src/lib/internal/khash.h create mode 100644 twml/libtwml/src/lib/internal/linear_search.docx delete mode 100644 twml/libtwml/src/lib/internal/linear_search.h create mode 100644 twml/libtwml/src/lib/internal/murmur_hash3.docx delete mode 100644 twml/libtwml/src/lib/internal/murmur_hash3.h create mode 100644 twml/libtwml/src/lib/internal/thrift.docx delete mode 100644 twml/libtwml/src/lib/internal/thrift.h create mode 100644 twml/libtwml/src/lib/internal/utf_converter.docx delete mode 100644 twml/libtwml/src/lib/internal/utf_converter.h delete mode 100644 twml/libtwml/src/lib/io/IOError.cpp create mode 100644 twml/libtwml/src/lib/io/IOError.docx delete mode 100644 twml/libtwml/src/lib/murmur_hash3.cpp create mode 100644 twml/libtwml/src/lib/murmur_hash3.docx delete mode 100644 twml/libtwml/src/lib/optim.cpp create mode 100644 twml/libtwml/src/lib/optim.docx delete mode 100644 twml/libtwml/src/lib/utf_converter.cpp create mode 100644 twml/libtwml/src/lib/utf_converter.docx create mode 100644 twml/libtwml/src/ops/CMakeLists.docx delete mode 100644 twml/libtwml/src/ops/CMakeLists.txt delete mode 100644 twml/libtwml/src/ops/add1.cpp create mode 100644 twml/libtwml/src/ops/add1.docx delete mode 100644 twml/libtwml/src/ops/batch_prediction_request.cpp create mode 100644 twml/libtwml/src/ops/batch_prediction_request.docx delete mode 100644 twml/libtwml/src/ops/batch_prediction_request_v2.cpp create mode 100644 twml/libtwml/src/ops/batch_prediction_request_v2.docx delete mode 100644 twml/libtwml/src/ops/batch_prediction_response_writer.cpp create mode 100644 twml/libtwml/src/ops/batch_prediction_response_writer.docx delete mode 100644 twml/libtwml/src/ops/batch_prediction_tensor_response_writer.cpp create mode 100644 twml/libtwml/src/ops/batch_prediction_tensor_response_writer.docx delete mode 100644 twml/libtwml/src/ops/binary_sparse_dense_matmul.cpp create mode 100644 twml/libtwml/src/ops/binary_sparse_dense_matmul.docx delete mode 100644 twml/libtwml/src/ops/binary_sparse_dense_matmul.h create mode 100644 twml/libtwml/src/ops/binary_sparse_dense_matmul_impl.docx delete mode 100644 twml/libtwml/src/ops/binary_sparse_dense_matmul_impl.h delete mode 100644 twml/libtwml/src/ops/block_format_dataset.cpp create mode 100644 twml/libtwml/src/ops/block_format_dataset.docx create mode 100644 twml/libtwml/src/ops/block_format_reader.docx delete mode 100644 twml/libtwml/src/ops/block_format_reader.h delete mode 100644 twml/libtwml/src/ops/compress_sample_ids.cpp create mode 100644 twml/libtwml/src/ops/compress_sample_ids.docx delete mode 100644 twml/libtwml/src/ops/contrib/get_substrings.cpp create mode 100644 twml/libtwml/src/ops/contrib/get_substrings.docx delete mode 100644 twml/libtwml/src/ops/data_record.cpp create mode 100644 twml/libtwml/src/ops/data_record.docx delete mode 100644 twml/libtwml/src/ops/data_record_tensor_writer.cpp create mode 100644 twml/libtwml/src/ops/data_record_tensor_writer.docx delete mode 100644 twml/libtwml/src/ops/discretizer.cpp create mode 100644 twml/libtwml/src/ops/discretizer.docx delete mode 100644 twml/libtwml/src/ops/feature_extractor.cpp create mode 100644 twml/libtwml/src/ops/feature_extractor.docx delete mode 100644 twml/libtwml/src/ops/feature_id.cpp create mode 100644 twml/libtwml/src/ops/feature_id.docx delete mode 100644 twml/libtwml/src/ops/feature_mask.cpp create mode 100644 twml/libtwml/src/ops/feature_mask.docx delete mode 100644 twml/libtwml/src/ops/fixed_length_tensor.cpp create mode 100644 twml/libtwml/src/ops/fixed_length_tensor.docx delete mode 100644 twml/libtwml/src/ops/hashed_data_record.cpp create mode 100644 twml/libtwml/src/ops/hashed_data_record.docx delete mode 100644 twml/libtwml/src/ops/hashing_discretizer.cpp create mode 100644 twml/libtwml/src/ops/hashing_discretizer.docx delete mode 100644 twml/libtwml/src/ops/hashmap.cpp create mode 100644 twml/libtwml/src/ops/hashmap.docx delete mode 100644 twml/libtwml/src/ops/isotonic_calibration.cpp create mode 100644 twml/libtwml/src/ops/isotonic_calibration.docx delete mode 100644 twml/libtwml/src/ops/num_intra_op_threads.cpp create mode 100644 twml/libtwml/src/ops/num_intra_op_threads.docx delete mode 100644 twml/libtwml/src/ops/par_add.cpp create mode 100644 twml/libtwml/src/ops/par_add.docx delete mode 100644 twml/libtwml/src/ops/partition_sparse_tensor.cpp create mode 100644 twml/libtwml/src/ops/partition_sparse_tensor.docx delete mode 100644 twml/libtwml/src/ops/percentile_discretizer_v2.cpp create mode 100644 twml/libtwml/src/ops/percentile_discretizer_v2.docx create mode 100644 twml/libtwml/src/ops/resource_utils.docx delete mode 100644 twml/libtwml/src/ops/resource_utils.h create mode 100644 twml/libtwml/src/ops/scripts/get_inc.docx delete mode 100644 twml/libtwml/src/ops/scripts/get_inc.py delete mode 100755 twml/libtwml/src/ops/scripts/get_inc.sh create mode 100644 twml/libtwml/src/ops/scripts/get_lib.docx delete mode 100644 twml/libtwml/src/ops/scripts/get_lib.py delete mode 100755 twml/libtwml/src/ops/scripts/get_lib.sh create mode 100644 twml/libtwml/src/ops/scripts/symlink.docx delete mode 100755 twml/libtwml/src/ops/scripts/symlink.sh delete mode 100644 twml/libtwml/src/ops/sleep_op.cpp create mode 100644 twml/libtwml/src/ops/sleep_op.docx delete mode 100644 twml/libtwml/src/ops/sparse_normalization.cpp create mode 100644 twml/libtwml/src/ops/sparse_normalization.docx delete mode 100644 twml/libtwml/src/ops/tensor_record.cpp create mode 100644 twml/libtwml/src/ops/tensor_record.docx delete mode 100644 twml/libtwml/src/ops/tensorflow_utils.cpp create mode 100644 twml/libtwml/src/ops/tensorflow_utils.docx delete mode 100644 twml/libtwml/src/ops/tensorflow_utils.h delete mode 100644 twml/libtwml/src/ops/var_length_reader.cpp create mode 100644 twml/libtwml/src/ops/var_length_reader.docx delete mode 100644 twml/setup.cfg create mode 100644 twml/setup.docx delete mode 100644 twml/setup.py create mode 100644 twml/twml/__init__.docx delete mode 100644 twml/twml/__init__.py create mode 100644 twml/twml/argument_parser.docx delete mode 100644 twml/twml/argument_parser.py create mode 100644 twml/twml/array.docx delete mode 100644 twml/twml/array.py create mode 100644 twml/twml/block_format_writer.docx delete mode 100644 twml/twml/block_format_writer.py create mode 100644 twml/twml/constants.docx delete mode 100644 twml/twml/constants.py create mode 100644 twml/twml/contrib/__init__.docx delete mode 100644 twml/twml/contrib/__init__.py create mode 100644 twml/twml/contrib/build_graphs_fns.docx delete mode 100644 twml/twml/contrib/build_graphs_fns.py create mode 100644 twml/twml/contrib/calibrators/__init__.docx delete mode 100644 twml/twml/contrib/calibrators/__init__.py create mode 100644 twml/twml/contrib/calibrators/calibrator.docx delete mode 100644 twml/twml/contrib/calibrators/calibrator.py create mode 100644 twml/twml/contrib/calibrators/common_calibrators.docx delete mode 100644 twml/twml/contrib/calibrators/common_calibrators.py create mode 100644 twml/twml/contrib/calibrators/hashed_percentile_discretizer.docx delete mode 100644 twml/twml/contrib/calibrators/hashed_percentile_discretizer.py create mode 100644 twml/twml/contrib/calibrators/hashing_discretizer.docx delete mode 100644 twml/twml/contrib/calibrators/hashing_discretizer.py create mode 100644 twml/twml/contrib/calibrators/isotonic.docx delete mode 100644 twml/twml/contrib/calibrators/isotonic.py create mode 100644 twml/twml/contrib/calibrators/mdl.docx delete mode 100644 twml/twml/contrib/calibrators/mdl.py create mode 100644 twml/twml/contrib/calibrators/percentile_discretizer.docx delete mode 100644 twml/twml/contrib/calibrators/percentile_discretizer.py create mode 100644 twml/twml/contrib/eventbus/input_fn.docx delete mode 100644 twml/twml/contrib/eventbus/input_fn.py create mode 100644 twml/twml/contrib/eventbus/reader.docx delete mode 100644 twml/twml/contrib/eventbus/reader.py create mode 100644 twml/twml/contrib/export/__init__.docx delete mode 100644 twml/twml/contrib/export/__init__.py create mode 100644 twml/twml/contrib/export/export_fn.docx delete mode 100644 twml/twml/contrib/export/export_fn.py create mode 100644 twml/twml/contrib/export/exporters.docx delete mode 100644 twml/twml/contrib/export/exporters.py create mode 100644 twml/twml/contrib/feature_config.docx delete mode 100644 twml/twml/contrib/feature_config.py create mode 100644 twml/twml/contrib/feature_config_parsers.docx delete mode 100644 twml/twml/contrib/feature_config_parsers.py create mode 100644 twml/twml/contrib/feature_importances/__init__.docx delete mode 100644 twml/twml/contrib/feature_importances/__init__.py create mode 100644 twml/twml/contrib/feature_importances/feature_importances.docx delete mode 100644 twml/twml/contrib/feature_importances/feature_importances.py create mode 100644 twml/twml/contrib/feature_importances/feature_permutation.docx delete mode 100644 twml/twml/contrib/feature_importances/feature_permutation.py create mode 100644 twml/twml/contrib/feature_importances/helpers.docx delete mode 100644 twml/twml/contrib/feature_importances/helpers.py create mode 100644 twml/twml/contrib/hooks.docx delete mode 100644 twml/twml/contrib/hooks.py create mode 100644 twml/twml/contrib/initializers.docx delete mode 100644 twml/twml/contrib/initializers.py create mode 100644 twml/twml/contrib/layers/__init__.docx delete mode 100644 twml/twml/contrib/layers/__init__.py create mode 100644 twml/twml/contrib/layers/embedding_lookup.docx delete mode 100644 twml/twml/contrib/layers/embedding_lookup.py create mode 100644 twml/twml/contrib/layers/factorization_machine.docx delete mode 100644 twml/twml/contrib/layers/factorization_machine.py create mode 100644 twml/twml/contrib/layers/full_dense.docx delete mode 100644 twml/twml/contrib/layers/full_dense.py create mode 100644 twml/twml/contrib/layers/hashed_percentile_discretizer.docx delete mode 100644 twml/twml/contrib/layers/hashed_percentile_discretizer.py create mode 100644 twml/twml/contrib/layers/hashing_discretizer.docx delete mode 100644 twml/twml/contrib/layers/hashing_discretizer.py create mode 100644 twml/twml/contrib/layers/mask_layer.docx delete mode 100644 twml/twml/contrib/layers/mask_layer.py create mode 100644 twml/twml/contrib/layers/stacked_rnn.docx delete mode 100644 twml/twml/contrib/layers/stacked_rnn.py create mode 100644 twml/twml/contrib/layers/zscore_normalization.docx delete mode 100644 twml/twml/contrib/layers/zscore_normalization.py create mode 100644 twml/twml/contrib/metrics/__init__.docx delete mode 100644 twml/twml/contrib/metrics/__init__.py create mode 100644 twml/twml/contrib/metrics/metrics.docx delete mode 100644 twml/twml/contrib/metrics/metrics.py create mode 100644 twml/twml/contrib/metrics/search_metrics.docx delete mode 100644 twml/twml/contrib/metrics/search_metrics.py create mode 100644 twml/twml/contrib/optimizers/__init__.docx delete mode 100644 twml/twml/contrib/optimizers/__init__.py create mode 100644 twml/twml/contrib/optimizers/deep_gradient_compression_optimizer.docx delete mode 100644 twml/twml/contrib/optimizers/deep_gradient_compression_optimizer.py create mode 100644 twml/twml/contrib/optimizers/pruning_optimizer.docx delete mode 100644 twml/twml/contrib/optimizers/pruning_optimizer.py create mode 100644 twml/twml/contrib/parsers.docx delete mode 100644 twml/twml/contrib/parsers.py create mode 100644 twml/twml/contrib/pruning.docx delete mode 100644 twml/twml/contrib/pruning.py create mode 100644 twml/twml/contrib/readers/__init__.docx delete mode 100644 twml/twml/contrib/readers/__init__.py create mode 100644 twml/twml/contrib/readers/batch_prediction_request.docx delete mode 100644 twml/twml/contrib/readers/batch_prediction_request.py create mode 100644 twml/twml/contrib/readers/data_record.docx delete mode 100644 twml/twml/contrib/readers/data_record.py create mode 100644 twml/twml/contrib/readers/hashed_batch_prediction_request.docx delete mode 100644 twml/twml/contrib/readers/hashed_batch_prediction_request.py create mode 100644 twml/twml/contrib/trainers/__init__.docx delete mode 100644 twml/twml/contrib/trainers/__init__.py create mode 100644 twml/twml/contrib/trainers/batch_prediction_request_trainer.docx delete mode 100644 twml/twml/contrib/trainers/batch_prediction_request_trainer.py create mode 100644 twml/twml/contrib/trainers/pruning_data_record_trainer.docx delete mode 100644 twml/twml/contrib/trainers/pruning_data_record_trainer.py create mode 100644 twml/twml/contrib/trainers/trainer_utils.docx delete mode 100644 twml/twml/contrib/trainers/trainer_utils.py create mode 100644 twml/twml/contrib/utils/__init__.docx delete mode 100644 twml/twml/contrib/utils/__init__.py create mode 100644 twml/twml/contrib/utils/datasets.docx delete mode 100644 twml/twml/contrib/utils/datasets.py create mode 100644 twml/twml/contrib/utils/device.docx delete mode 100644 twml/twml/contrib/utils/device.py create mode 100644 twml/twml/contrib/utils/interp.docx delete mode 100644 twml/twml/contrib/utils/interp.py create mode 100644 twml/twml/contrib/utils/loss_fns.docx delete mode 100644 twml/twml/contrib/utils/loss_fns.py create mode 100644 twml/twml/contrib/utils/masks.docx delete mode 100644 twml/twml/contrib/utils/masks.py create mode 100644 twml/twml/contrib/utils/math_fns.docx delete mode 100644 twml/twml/contrib/utils/math_fns.py create mode 100644 twml/twml/contrib/utils/normalizer.docx delete mode 100644 twml/twml/contrib/utils/normalizer.py create mode 100644 twml/twml/contrib/utils/scores.docx delete mode 100644 twml/twml/contrib/utils/scores.py create mode 100644 twml/twml/contrib/utils/similarities.docx delete mode 100644 twml/twml/contrib/utils/similarities.py create mode 100644 twml/twml/dataset.docx delete mode 100644 twml/twml/dataset.py create mode 100644 twml/twml/errors.docx delete mode 100644 twml/twml/errors.py create mode 100644 twml/twml/export_output_fns.docx delete mode 100644 twml/twml/export_output_fns.py create mode 100644 twml/twml/feature_config.docx delete mode 100644 twml/twml/feature_config.py create mode 100644 twml/twml/filters.docx delete mode 100644 twml/twml/filters.py create mode 100644 twml/twml/hooks.docx delete mode 100644 twml/twml/hooks.py create mode 100644 twml/twml/input_fns.docx delete mode 100644 twml/twml/input_fns.py create mode 100644 twml/twml/layers/__init__.docx delete mode 100644 twml/twml/layers/__init__.py create mode 100644 twml/twml/layers/batch_prediction_tensor_writer.docx delete mode 100644 twml/twml/layers/batch_prediction_tensor_writer.py create mode 100644 twml/twml/layers/batch_prediction_writer.docx delete mode 100644 twml/twml/layers/batch_prediction_writer.py create mode 100644 twml/twml/layers/data_record_tensor_writer.docx delete mode 100644 twml/twml/layers/data_record_tensor_writer.py create mode 100644 twml/twml/layers/full_dense.docx delete mode 100644 twml/twml/layers/full_dense.py create mode 100644 twml/twml/layers/full_sparse.docx delete mode 100644 twml/twml/layers/full_sparse.py create mode 100644 twml/twml/layers/isotonic.docx delete mode 100644 twml/twml/layers/isotonic.py create mode 100644 twml/twml/layers/layer.docx delete mode 100644 twml/twml/layers/layer.py create mode 100644 twml/twml/layers/mdl.docx delete mode 100644 twml/twml/layers/mdl.py create mode 100644 twml/twml/layers/partition.docx delete mode 100644 twml/twml/layers/partition.py create mode 100644 twml/twml/layers/percentile_discretizer.docx delete mode 100644 twml/twml/layers/percentile_discretizer.py create mode 100644 twml/twml/layers/sequential.docx delete mode 100644 twml/twml/layers/sequential.py create mode 100644 twml/twml/layers/sparse_max_norm.docx delete mode 100644 twml/twml/layers/sparse_max_norm.py create mode 100644 twml/twml/layers/stitch.docx delete mode 100644 twml/twml/layers/stitch.py create mode 100644 twml/twml/learning_rate_decay.docx delete mode 100644 twml/twml/learning_rate_decay.py create mode 100644 twml/twml/lookup/__init__.docx delete mode 100644 twml/twml/lookup/__init__.py create mode 100644 twml/twml/metrics.docx delete mode 100644 twml/twml/metrics.py create mode 100644 twml/twml/optimizers/__init__.docx delete mode 100644 twml/twml/optimizers/__init__.py create mode 100644 twml/twml/parsers.docx delete mode 100644 twml/twml/parsers.py create mode 100644 twml/twml/readers/__init__.docx delete mode 100644 twml/twml/readers/__init__.py create mode 100644 twml/twml/readers/batch_prediction_request.docx delete mode 100644 twml/twml/readers/batch_prediction_request.py create mode 100644 twml/twml/readers/data_record.docx delete mode 100644 twml/twml/readers/data_record.py create mode 100644 twml/twml/readers/hashed_batch_prediction_request.docx delete mode 100644 twml/twml/readers/hashed_batch_prediction_request.py create mode 100644 twml/twml/readers/hashed_data_record.docx delete mode 100644 twml/twml/readers/hashed_data_record.py create mode 100644 twml/twml/saved_model_cli/__init__.docx delete mode 100644 twml/twml/saved_model_cli/__init__.py create mode 100644 twml/twml/saved_model_cli/__main__.docx delete mode 100644 twml/twml/saved_model_cli/__main__.py create mode 100644 twml/twml/summary/__init__.docx delete mode 100644 twml/twml/summary/__init__.py create mode 100644 twml/twml/tensorboard/__init__.docx delete mode 100644 twml/twml/tensorboard/__init__.py create mode 100644 twml/twml/tensorboard/__main__.docx delete mode 100644 twml/twml/tensorboard/__main__.py create mode 100644 twml/twml/tensorio.docx delete mode 100644 twml/twml/tensorio.py create mode 100644 twml/twml/tracking/__init__.docx delete mode 100644 twml/twml/tracking/__init__.py create mode 100644 twml/twml/tracking/experiment_tracker.docx delete mode 100644 twml/twml/tracking/experiment_tracker.py create mode 100644 twml/twml/trainers/__init__.docx delete mode 100644 twml/twml/trainers/__init__.py create mode 100644 twml/twml/trainers/data_record_trainer.docx delete mode 100644 twml/twml/trainers/data_record_trainer.py create mode 100644 twml/twml/trainers/trainer.docx delete mode 100644 twml/twml/trainers/trainer.py create mode 100644 twml/twml/util.docx delete mode 100644 twml/twml/util.py create mode 100644 twml/twml_common/__init__.docx delete mode 100644 twml/twml_common/__init__.py create mode 100644 twml/twml_common/initializer.docx delete mode 100644 twml/twml_common/initializer.py create mode 100644 twml/twml_common/serialize.docx delete mode 100644 twml/twml_common/serialize.py create mode 100644 twml/twml_common/sparse_inputs.docx delete mode 100644 twml/twml_common/sparse_inputs.py delete mode 100644 unified_user_actions/.gitignore create mode 100644 unified_user_actions/.gitignore.docx delete mode 100644 unified_user_actions/BUILD.bazel create mode 100644 unified_user_actions/BUILD.docx create mode 100644 unified_user_actions/README.docx delete mode 100644 unified_user_actions/README.md create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/AbstractAdapter.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/AbstractAdapter.scala delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/BUILD create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/BUILD.docx create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/AdsCallbackEngagement.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/AdsCallbackEngagement.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/AdsCallbackEngagementsAdapter.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/AdsCallbackEngagementsAdapter.scala delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/BUILD create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/BUILD.docx create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/BaseAdsCallbackEngagement.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/BaseAdsCallbackEngagement.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/BaseTrendAdsCallbackEngagement.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/BaseTrendAdsCallbackEngagement.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/BaseVideoAdsCallbackEngagement.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/BaseVideoAdsCallbackEngagement.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/EngagementTypeMappings.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/EngagementTypeMappings.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/ProfileAdsCallbackEngagement.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/ads_callback_engagements/ProfileAdsCallbackEngagement.scala delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BUILD create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BUILD.docx create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseCTAClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseCTAClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseCardClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseCardClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseFeedbackSubmitClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseFeedbackSubmitClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseNotificationTabClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseNotificationTabClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseProfileClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseProfileClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BasePushNotificationClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BasePushNotificationClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseSearchTypeaheadEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseSearchTypeaheadEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseTopicClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseTopicClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseUASClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseUASClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseVideoClientEvent.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/BaseVideoClientEvent.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/ClientEventAdapter.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/ClientEventAdapter.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/ClientEventCommonUtils.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/ClientEventCommonUtils.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/ClientEventEngagement.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/ClientEventEngagement.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/ClientEventImpression.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/ClientEventImpression.scala create mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/HomeInfoUtils.docx delete mode 100644 unified_user_actions/adapter/src/main/scala/com/twitter/unified_user_actions/adapter/client_event/HomeInfoUtils.scala diff --git a/twml/libtwml/src/lib/TensorRecordWriter.cpp b/twml/libtwml/src/lib/TensorRecordWriter.cpp deleted file mode 100644 index b1fe98e64..000000000 --- a/twml/libtwml/src/lib/TensorRecordWriter.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "internal/error.h" -#include "internal/thrift.h" - -#include -#include -#include -#include - -using namespace twml::io; - -namespace twml { - -static int32_t getRawThriftType(twml_type dtype) { - // convert twml enum to tensor.thrift enum - switch (dtype) { - case TWML_TYPE_FLOAT: - return DATA_TYPE_FLOAT; - case TWML_TYPE_DOUBLE: - return DATA_TYPE_DOUBLE; - case TWML_TYPE_INT64: - return DATA_TYPE_INT64; - case TWML_TYPE_INT32: - return DATA_TYPE_INT32; - case TWML_TYPE_UINT8: - return DATA_TYPE_UINT8; - case TWML_TYPE_STRING: - return DATA_TYPE_STRING; - case TWML_TYPE_BOOL: - return DATA_TYPE_BOOL; - default: - throw IOError(IOError::UNSUPPORTED_OUTPUT_TYPE); - } -} - -void TensorRecordWriter::writeTensor(const RawTensor &tensor) { - if (tensor.getType() == TWML_TYPE_INT32) { - m_thrift_writer.writeStructFieldHeader(TTYPE_STRUCT, GT_INT32); - m_thrift_writer.writeStructFieldHeader(TTYPE_LIST, 1); - m_thrift_writer.writeListHeader(TTYPE_I32, tensor.getNumElements()); - - const int32_t *data = tensor.getData(); - - for (uint64_t i = 0; i < tensor.getNumElements(); i++) - m_thrift_writer.writeInt32(data[i]); - - } else if (tensor.getType() == TWML_TYPE_INT64) { - m_thrift_writer.writeStructFieldHeader(TTYPE_STRUCT, GT_INT64); - m_thrift_writer.writeStructFieldHeader(TTYPE_LIST, 1); - m_thrift_writer.writeListHeader(TTYPE_I64, tensor.getNumElements()); - - const int64_t *data = tensor.getData(); - - for (uint64_t i = 0; i < tensor.getNumElements(); i++) - m_thrift_writer.writeInt64(data[i]); - - } else if (tensor.getType() == TWML_TYPE_FLOAT) { - m_thrift_writer.writeStructFieldHeader(TTYPE_STRUCT, GT_FLOAT); - m_thrift_writer.writeStructFieldHeader(TTYPE_LIST, 1); - m_thrift_writer.writeListHeader(TTYPE_DOUBLE, tensor.getNumElements()); - - const float *data = tensor.getData(); - - for (uint64_t i = 0; i < tensor.getNumElements(); i++) - m_thrift_writer.writeDouble(static_cast(data[i])); - - } else if (tensor.getType() == TWML_TYPE_DOUBLE) { - m_thrift_writer.writeStructFieldHeader(TTYPE_STRUCT, GT_DOUBLE); - m_thrift_writer.writeStructFieldHeader(TTYPE_LIST, 1); - m_thrift_writer.writeListHeader(TTYPE_DOUBLE, tensor.getNumElements()); - - const double *data = tensor.getData(); - - for (uint64_t i = 0; i < tensor.getNumElements(); i++) - m_thrift_writer.writeDouble(data[i]); - - } else if (tensor.getType() == TWML_TYPE_STRING) { - m_thrift_writer.writeStructFieldHeader(TTYPE_STRUCT, GT_STRING); - m_thrift_writer.writeStructFieldHeader(TTYPE_LIST, 1); - m_thrift_writer.writeListHeader(TTYPE_STRING, tensor.getNumElements()); - - const std::string *data = tensor.getData(); - - for (uint64_t i = 0; i < tensor.getNumElements(); i++) - m_thrift_writer.writeString(data[i]); - - } else if (tensor.getType() == TWML_TYPE_BOOL) { - m_thrift_writer.writeStructFieldHeader(TTYPE_STRUCT, GT_BOOL); - m_thrift_writer.writeStructFieldHeader(TTYPE_LIST, 1); - m_thrift_writer.writeListHeader(TTYPE_BOOL, tensor.getNumElements()); - - const bool *data = tensor.getData(); - - for (uint64_t i = 0; i < tensor.getNumElements(); i++) - m_thrift_writer.writeBool(data[i]); - - } else { - throw IOError(IOError::UNSUPPORTED_OUTPUT_TYPE); - } - - // write tensor shape field - m_thrift_writer.writeStructFieldHeader(TTYPE_LIST, 2); - m_thrift_writer.writeListHeader(TTYPE_I64, tensor.getNumDims()); - - for (uint64_t i = 0; i < tensor.getNumDims(); i++) - m_thrift_writer.writeInt64(tensor.getDim(i)); - - m_thrift_writer.writeStructStop(); - m_thrift_writer.writeStructStop(); -} - -void TensorRecordWriter::writeRawTensor(const RawTensor &tensor) { - m_thrift_writer.writeStructFieldHeader(TTYPE_STRUCT, GT_RAW); - - // dataType field - m_thrift_writer.writeStructFieldHeader(TTYPE_I32, 1); - m_thrift_writer.writeInt32(getRawThriftType(tensor.getType())); - - // content field - uint64_t type_size = getSizeOf(tensor.getType()); - m_thrift_writer.writeStructFieldHeader(TTYPE_STRING, 2); - const uint8_t *data = reinterpret_cast(tensor.getData()); - m_thrift_writer.writeBinary(data, tensor.getNumElements() * type_size); - - // shape field - m_thrift_writer.writeStructFieldHeader(TTYPE_LIST, 3); - m_thrift_writer.writeListHeader(TTYPE_I64, tensor.getNumDims()); - - for (uint64_t i = 0; i < tensor.getNumDims(); i++) - m_thrift_writer.writeInt64(tensor.getDim(i)); - - m_thrift_writer.writeStructStop(); - m_thrift_writer.writeStructStop(); -} - -TWMLAPI uint32_t TensorRecordWriter::getRecordsWritten() { - return m_records_written; -} - -// Caller (usually DataRecordWriter) must precede with struct header field -// like thrift_writer.writeStructFieldHeader(TTYPE_MAP, DR_GENERAL_TENSOR) -TWMLAPI uint64_t TensorRecordWriter::write(twml::TensorRecord &record) { - uint64_t bytes_written_before = m_thrift_writer.getBytesWritten(); - - m_thrift_writer.writeMapHeader(TTYPE_I64, TTYPE_STRUCT, record.getRawTensors().size()); - - for (auto id_tensor_pairs : record.getRawTensors()) { - m_thrift_writer.writeInt64(id_tensor_pairs.first); - - // all tensors written as RawTensor Thrift except for StringTensors - // this avoids the overhead of converting little endian to big endian - if (id_tensor_pairs.second.getType() == TWML_TYPE_STRING) - writeTensor(id_tensor_pairs.second); - else - writeRawTensor(id_tensor_pairs.second); - } - - m_records_written++; - - return m_thrift_writer.getBytesWritten() - bytes_written_before; -} - -} // namespace twml diff --git a/twml/libtwml/src/lib/TensorRecordWriter.docx b/twml/libtwml/src/lib/TensorRecordWriter.docx new file mode 100644 index 0000000000000000000000000000000000000000..4b888c5f3b65d1f0eb19f17f589d8b1c34f36c08 GIT binary patch literal 37993 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

H|;?xdW7u4!)Gh`OD zu!D{tcPdKYMvm(bUUO-9=X_VL}OcnJ7NEH}G zL)*3sV3^Os)mcmd2EhYW?_lD#+MIS5CatvL5p23!W=2zxcMpYhoxfn4k)VZ|M zgCJj*SyL<~HhpR!UJpOxw0|xymJq&<)-1~&7Su9T629gU@UD&_&81U@=*0Jxmk672C#?X0$EyfnYyNdB;+*cQ3XXmP#&a_I#39eQW2 zy%9mV%s>~e@S2eUqS;qj6+z?mCoR5JcOvzhNiOmGSjD?T+w=8Ptsng71)nZ>3Ti^U zXemPnvNoh)t)NG$(3Y>PNGz2DI@lXypNb_;Ura~;jkFa2U00=eIZx(~?^S_6zWYM8OX1L&-lX)rcB_DhHtdsDuEm`))GQ_RE|3 z&`b>57A`;<)a32~l$aq*TV6{WLBfJBUI!ay^zMGr)#vQri0kZ~We~+$ z>(*7;@(0zvj~2cqJ%u4&x^oBj0igs%+1b7ID#kj!WItwi(lL@Y$hkz0SP`2VraEMX zSyV5|VTD{*Zre(EGrDoq-A60SO1o(*ohZd(mYQvb8s)Sw=v?#@ebX-~=KwOA(miOP zvo5!voRRX^-_Dm%^;LPVirFqj6&;LfB21@tAkNk(Q}YpP8SbD~206oR(bj+K$|mU8 zm>Z&->}6;VQ*~Qqj?L~T<5)73Q%uWbHmnl|ahLeEYaM1T8rhV$&`|+{iQJaUstJQ; zw#E}*_A-G<(|;#%|L>&asRM?)!|Oqwa3{2*KUCi<5p6CNGSMd<2YI5|K6!Sc9aTy+ z{WFt_BKJlOvX}W+oPk0{ehI4ClxjNM+4r;`#d^JyIq`=BCUdvFKEzv3wgW}GZ(%ltXqR4G^CPPmq=x9$|vI+50YDd8L? zo-WHdPv)^aV8KgyX2JWn!aRaQ0vF*-^r^oUy8ds4*O@n=Q}NrCoSrIqB4?$a9LF3> z^`Wl^^L{Xl&Q}+HVmt6q9}??B>MLJTht{z%c@?YO&WefOCipW#A3tqx_RxQH2zBO! zsNl%xhoV@yZqUy&J&!dV-yI!CPbyW%lq?)P9aj_UWnVD+R5dpouC=NVAC_7t`3)1E7+k{!?*zu_mu&vb zQ>}9S+-JZ;4~jYv5Ed8Gfhe&Sl_fZU3Vs&@CBwfC@13KwxPX|HyH$=$zk9Db-H+x@ zW*$hGiTjqwfo$X!A8l({9`)G324|LmT)U{)bxbFKRR(HMHEH+4p4I))Hch z@n6)gW)nbaKF+_Xe^8)DBK<$8uet|eJHvB~w!GV=J&?B=uS=>yz;lV}Ha zHj{Up3ZX}mxrb>X$<+?pYm=Jo+6^RdnwHGe4hnbe_o4lnWfy&F@mfIm2l>6rD3DwY z`Y-Yp7IySV#{UQToUzQ#Q%vgihT}iT`;BFuRJ9)Av|3a!e)K#4fIe1hi)ZRGGTiP8 zXcKsBWNU}ZBKT-O9+%C(dtBc8-c<}yQusozjTG@K8c>%s?6Z<9Lc7MJIbYzX(3Mqn za^=>17)NhezBLb`t8&&PuSDSDHn6VM)P-zRpFYcRSJ*C4W>02QBABwN88SBL&JY&> zdna1E;6;K$aSB3#zA{NKblTJ;h6~~Pyh+zjY)$#qcmK0m)=zoX^YCmd@fipk%ko1! zsxLp(G^7l+>?4+ZjnJlKbl>1e)1mUMFpa*KJ$xfcUjj|1oZS%dJ^xx^3ITI_+u;@? z!mhCNIxJSgYn5)cfvzwgRt&o`tv3vejwn7q?q#lX z(p4W;?BZVx%ia;6^Rjl53l1jmc1~e|qL9eZb2VG0m`?fWL42M)-wLdmP2(ndp8Z!@ zc>yDUSK(_HAnTmH$`uk-0er6UdMhBs^Flb^iXhhtY^vwyQFk+MM1ZhTj~5-T_`KN^ zfZw@1u~=qUV2(ZdOS=D={G#_hyMkx=N$CWh;{4jhei@HKg^`H(yfAxJXKH!TmR#}| zUFa|A!ffKbfgdTn^!=`$x9!W7|MaN)P&_vDA7D3L^JagU{KZ~%*FD@m-?;WqlX7|| zT}9!4n+#3Iu6;Ze1Rs>i>*F*ZL(Vl2n(<=art60KATfI z-~(5b>%-R%_Eyi1KwCGc7{G5Ok{dCkF|~E28ABK84qH5jaK`V=ZYpKBjXpa*x%*nr zs_=k`_36x^%fI0%rUqkvA}7uFa?9MQVLZ$5(ZDolp&@q?##uy&#qHH)235|yef+Vb0UheHptYX{ z+zO2PEb$eKN}Ayif*%G0!^ZkYAIbs$~xQGG`^+VE)>{zk=2 zT`Hh-R~zTczgWlS3;D8Vm0l_uOR1dsFc!s?_BG%hH3y+%sg%ZqJQsEs~bgo0}_1 zyEq{FT&x}o_cf7}x7tQ4socS<|5f)(;194Hc*^c0uYM(&$r%uPxyhPHN#es$Q|yTh zFQ==Jt7IbH);|zI}W==0c(GF=l~+-Wi7d+hs&UcTv;@Zn zrG!{N=JGw&wZY-%9L!%d)T7t250}09DmcGyQ~&h+4M%lK6aJJ2Vi*48G7B^Ks{9-6 z4&`#Ch|xk95dYM)eWIB4RF;o%*?K9_+w^tQ`A}<1epVGgDLq*OJ_%s8&swmXmk;Ju zJ_Hso_z4yP-q;tcAn<$6WoyD@jpIf(a}O3SdUM|^y%5X_rs9$s+6^1X2HMSOK5E$0 zE^|*j_M?sQjQlABYtMZ~N;#X5MiLky_HW|5zp1d6Q~~h7B7jfMq|IQ#rxN6mQQx5B zU^LFucxsOd_ME7Eet8uiN!~ot;;=LNZgj(7vA%kA1f{lHLVjoo(n@i-EJ22HBUTs5 zb@SGXrF3e0e)F~KjlEw`Na7Ds_e_mzRmSw|IG(rO31T;}2L4Zw`(>y0qzfUeLIENo zh$9uDA-C8ygqTZ;`p){R=ervF_rXt1v-F+O7q73qyGgw||FcyyIi9~&vDvCxMqk&2 zq=o-cKYQphgVSQxp6fTCOIx3Li?D2!Mw+i1gI!KbkSbJl0V20DHeX;u(C|K`m?(LVx2txRhSdjer;&jBCLcGszCcMKuo$kU;V+Ap^-$JN@-sZYMrZ z(B|vHkgu^_GbJJSD$P-eYqB-^q+~<{T!r4zRT?3M&o8Ser`d!wC|2SxS1eqN=lrQt z#pa$=*AyrbMu=2-44buNT9LCPMjf$n zW^*UDR=Oia6A0%^!1UPUh>_0dzWth85=hivn9XNTjR&rNIlug(kaq34|Ehk;*0d9v z4SshAM*EnDn*rxrtSB^2@cou|Fu}XRg>$On6L5-k9kMJK3)EB zzNN#(K%)8Bay%bO--CD+mV74LR5pme8s78d+YQvxa@usQGyhT;T{piE5tQyMi)^2G z0{x6E!ueKf_stXq5&@+t083)pxng9vrn>O}ka3-ea}QtbOe(A9#=%Iio` zV9xMAoB4mOjcdV^$*>Of_#P6lzPSLGt{q@USs{f09*@_+tuVCePx;vAds_Y>U01nj z{f4Y~bTdB@m!SBxcRmdY@jwd_u~zAii3I5{N1D?(gr%WpeA5rKh^t~2E)mx-fWuKj zF4fC_xNSn7nJD3a$v2}02z>5cBCi%{Vjt1p!nZmJ9|zaKwDGkEsRTXvb}~1opaE8@ z+@k?2vN85>DkgZ{?cL%FYa6%&(Z@19N`azC+!;x{;rP4PoQahfXA26UWmARO9B@NQ zyd~<-ZXEkAd{vyZ3eOxp@ zcZD^rW)EEPA4C+j-*ET3g^uAWnl$Wn&^M>;z1j;%faFFJluy`k&)I3cd}4(dfsJuP zjp6I&Yg|#dx7Adn;x=p$`Lot95#vC@y@mNd0UVV60Gx#X1z`W+7Pt>F(g8Da)=L<( zvhB`WnW<>sX%Q3!X33i!ju*VsdUbz{j1Q1a>+;`k9as0?9~!`cv&Z*F0q?sK>~q-N zs{Drny`Z^40w*y49e4PzBcbS)yx3eYeGdC)b41)*NvvL=BM!-BAS01g3Gnv#8kocT!w7PI}M0b}B+H`D=GzfY&!&ewF1^2S7Ptjp3fJ7-jUFJb~ zmME0`Xt&6^oQ?841=l}G>^m@#tYP392FFQtunYRtY@7E^j#wl@uGDFQ{sE&H#CZ7{ ziUvkecg_8b*{LFIVAT?154qe13ECM~Si>Q$O02&Tlj5;gw6&6e^Bop}emS0%trQFz z9S5toA3~CXu$T?`28_=50zg42DPLJ2KdH+d$ zp0|K%(ka8X)drzM$4S;so36CMxMp?jVpvzMb*hvnb`4Ky&AR1K_0a!kg1d> z?K(`#$UtLEJvBE+#QCnBrnn?*YMy<%?i7#Ian?{Da^%5wrN>}teu7ZEg7$sHcqc0$ zypNa-2lSP3#uy?OGq`V*loRN(?|9Pq&n%#+>~})wGz*T7q!L0gAHuNCic{(`2LZI| zU25OYe^N06sc@qHP%%dine5cfaG3&avVQkqCi1i~8Ew~iHk8Ru#^e*b(f-sa!d}N} zrkQg3oRa3RPfa)B;yR7MYf@y`_?g73wp@xrvzUeMrmGimB~iH<)AC3=P53t&-6=I) z!|=JyWc4U3-Yl>^(ltB>hsD7Y2k8&SivVL2b6_I@$SJ2Df?jH@Uqx+Pke5dBo^0wT z+BHnfuPZB8h%-mVcYON8lSvv_K@~}7#vyh{|FffDLiXPG!D(+$Rlv$N%ZgN1@>SZL z$83P&d9u8qp#KM>r;ZLd6s2ZyBFC(@4)a4MPX`+mkTEeC@@6Q?Ns;$dGdwxGw*FY0 zQV=uJDC9@Y#I#+$QI=qC*;Vm&lOli72$xP(Zc7#2|J7k*m69a zk{QQfHzvxsS>(7`Zz=8n%6 z4DBsAE&Fyy1wff33dfJM?xMl9G_E5LL7m!0fwELsSp>Uu=ee5;ZCb-t6w(h1L4Xt7 zbjvzRIj^up6_>Ubj}}$^7+U>Hw~XR;ZvRRSBYrrgTa#GG2BLYcXdW_|2xK5!x-cZu zC1qxoBTxjbI*tdZr4Zze=4mh-MYP}#WzemIpj=U=Tv7Neyk{s(u&*}ADugy&1!3xs=y;99z^}LmIx%wcb66ZD-zLHT8vLC z!3g8&KNgk+4oH~FGvdU}FHm6Ok`(Or=+O3w`Z}O&L{l^N4!|U4sH%HNLN5yr7sk96 zAXujksIu3*)Q)dTzeE#J1|4h7et>jg%=UupMT_PM-&u?v8=Pd2z~Z5BmZIa8+G1NH z6HEdhPcwF^^E%$jA8cQPQEc2W4S4s1k+B_1LV@ z7&~4hurw&DrRX%JXIR$AG>-*OW`bDV7mCCo&pA3|h0MV3#w`X&50^9w;zhxcBi(GA znek>;;45{2K&t-$!u$iI_b(vZKR^q9lU=^jdGD4>Ff>t{W#*CmHrR20A@ElKpDhkd zHt00Kbw5&7>Q&e@Nw~|bxL^zznuQ3Aqd5HMO~r7zkFaw2Cxw{xD_ya>ElFW z;JRyfl7W8}A~2W<+Q5t#9g`eoSM>)3lNSn0=P4HEHfxj$0P|2wo=N_8V2n&Po%Gg( zWIQdAGmk(O}s9aX52up7HT?@$vkA>elg=Gc&PiaQ$+3 z-ceJ7d~uO;58T?n)wM3b&tQbr(bH8)*qpI>IR6en&Pa93P|DFno^UhbS|4$nHsy6Xu#-+~4M_-`k-mlp9Db>Q)&+ntzz|YNke|^HIu;+=fE#Sh}&qL6t zv#kBzy`bcS=fh;eDRCqxI3u(r^}y4wwaab&z{znS>EjM(1X!)mKHRAQg`~H;_)6588jhzGc4o-Yy_ym)?9SPvZn@Z=>C;2qp=Ezs` zbiD__1*lnG(zLF6YkhaLqSJvAU*nBdxu0{j=DOLnx=NSNO%1*9eeK+`!6wQ{FF?RY$V zmgaUB*0bG1ySp}lo!OODkNi@z*`r#;Oa%t}^or2ORZWZYBo^RB;hoX2!7ZLEjgSW6 zWVh{MjP!oD6`KN^Ug)jS7vqwl<3F-Z1#HhJqic@D}dt0fbB#0=5se(u| zHg@9f^>tO}pnkn4R$D4A-5ZL3;#&Zcn8g(Vlv{>v(2?xU}35K(u| zW^V{Ebi4x$;Q&Ky_jf{G+W7C?PrK3x96iL^1fKzP+%X2PKO~C2t1(p+p|^&lKQ&=08go z?Ti3BCgcR( z*;JqC@OIr3!s}66w!$`OF&UeU9uN1l?V4w}W-`u7S}e~s%;~v~m|P!$KU-ciin6a_ zFm2<>(F?w?Kt>K18wWRET-5GOI;p2OjWcX=rXEyo8S{nWQ6pZIx7SVQmQS2(c#Doq&JSXmpa_>QRia~r70&!8^Ab=nfx5*DrGkuidHMR zBM+-hwgJXniE0Nr^{4~36xQtTDL43k2zv{txR$M37`NcT-QC@S1h>ZB-CcqOcXxMp zcXxLuxI4iU2=bb9?!E7x?|<+8gTZDncJ*9y&e~nQs&?02S|A}p{q(*AIJ+3V22u8( zcCN?Enn4hilz}Ixe*jMqT>?+U0#DS6wL;qe2Lf*yrUm3R9k+*k@1xPbU;WX@ZOR4| zuekIBrSSv)FO>go@ZTu^XBJrOEs*x9`9Hw8Waex^@t`bPKoA20fneeCq&9!2Ukc(O*Tfko+_(j{K7J z)$+$<_N<7RshHX=DiyGUkF?s>e?NY?3OPK?8t?!0ITBY=z-_{N%azOZ`HH8_>;2ej z{>JZmyVvNuNzt2=zLinTYpX&s-c@ZjKj053E=nI1YGvd z5eOm|x7QAJ0biJmx2GO(n=4*pB8)5F+8DZaA8up5pN<_bJx@Fxtlhs@)Jwtq82uXc5G`^r=55&vb)sTj|3Fxj*u@t6 zm8c=e$&vDXA$HT1v@jz&|ADZka)rdY!&e@BCqbGi{yn6@j6c(<)|ro!KYRi2!VPZ$ zY^esSyauJzd)tqPg|KwP%Bq5hKrO(n5@m3|J7D!Ea%h*(a}CVi_xUI_nD=(6I}yl1 zm~3TIw|tbogl5(KAjmf%5lqgO%S$l%d?)>_U_$YH%r^QgrZ=IGhyBuyG|n=ho0*gaME2g zPZpIsdg43URk3GTP1_o~z$hWJ0=}5yIZkqY8J78jA|w>p`T*lFhO!4nyac1*JP}=^ z#0>r5CKVvyYTmkxjcdAnr?j4{7cj!N&>`P2@N)t0uH@VJn^ad}$9{5lccK&4v{BF9 z^vXAPPde`%L^teyShVxSI(IF;9Ji<&TW!SQ0f+i8Th7|gB7n_hx6{^65^u-27EHRW zi_DZ9uA)yzqjSyrx}duJbtkIhdwf-CQp=SI_>d@`_}vFlrX)v>ssol@wjJI=#doQw zc8&6qh7Xf&KhIZ_(jumGZp`&q^+CUJ(fF0@C-pDfG*&rquPXZ|+ZGwg1OWGeHLSWo z30xe~FGW{li>2998xtSuo!S!bco@?zoe@zMr|Ui6Oyt%IE#0!Db;EJQ_zYraUT0Nl1r8>QZ3G|j6lDXE>;hJ<0$QZCFOw| zePSSW!&lS>s9@pu=yPyf0BFR(59oAf_jmu_z>vwnc zhK^fV3``ZjY+a%cMq^U8Q$FEOIh!qQe9<-7K&w7gC^;mkO8-$pz-|+~a$mZx8T01l zW>S<6 zr-!0_>(TaG#SwhB&J;ksu&#UAd6XOBgtVKIw^rL@mV`3r6!~Mb4nAa^aO0&1Sq+ko zHrV%?Cp8#HcV!l#@2!DcAP!mL@g5rpJF*1ukD88^cOw_K`_yj_sej1Bg$J5G#TLX{ z&nrl-eGi$)F=l2c zigamGVwh0LFGLgvzNz=%$iXHi$Rfjy1lUTB#xj5W;5`%YYVoh0_F|vXqmn}wBuPp# zZt8!QLScH;yK0*#*CBObt5-U*B&x+3Jc$np55K2!3MMDL@Abr zQIX@Vqij+&o53P!3PV}P#Kr|j#_S*XR&~~;VEq6jZCk-3{oL}3N2-; zz?H*ti=)h9g{q__9_$~7NFtXn#q-nD-;E6}x__E@Pp+5wl(u-%jA%S&n-wqCK7;Li z`t6dA;rlW?{OUjPv?B|aJsGXq+>3{I<73ke1)OPyEa|08<71?x4g`g*{rKcUr;!j3 zJ9P5{X@sP3(WA%I0TH3cnz71D)8^YB2;i3q5l3a>``Nf744y95yqt=etitb#1!3(Z zcRTjjc=@ytGm(Oh9+5cpm*7@1s=jr3baU4r%tCf1ZV4Jt()S#+#7iUg(zssU>@d1t zWX-BV_8voCL%%eI^bCNd^38q$r5lvrZk>yP1;=`8-njZHDX$IPnCxq>&63SPcfIT0 zwu;f_b$eX0bSJbU`K}X-Pl$N5rr~ixMcmrbFimU+)*L!)zqTX_Z3>t^@5%&gkvqH`3|O^S{(Lv zJ6rO?s<=&P9pDqC1k*rs~yMmchxy#!E9vA%LKsxDkj<0 z=iJDs6L8t!_T;qpyx5WnAi|QJcoyC4+O;OULfF7{9JMS+HvFcK-4y5v4&NLl)XMpK zwB(HzL`qTP>Lk9qrOpH77Dc(UWy~7mI^TsowB^ia^b=|&7x2E3G1mLb6rj;l+QFH5 zInd?jDU7ILv-p?PWP7{6r2Z;i>EwwVkYqEswPgH;b`@1LAh@#?39*r3&9MMz=e)At zlLddYwRe&KbG+r&XU+fX|DPRzE#fZc+lC{1D<=jLxS!|#r&i82IE5@{JCc<#z~DZI71{l0bYaF=e*^5h8F+3;^oxdZ!AZ^4w*GLy}V5R=govvPV>QAO^tBD6`H zx7>tm8%%5~W<)*g_g!|C($x(FMhk@a(&NUs5>QhhqlTbI=c%zjRyahNOdH4Nk4DHJnsM=lQUxDWf3SAJ-G0aR)tJ& z*26MYyi^4x#+^l3htblu`l!p4XtopSQ)r~R6{*g*%IJtin?<+0z}?B$O`9#x4Y4Mm@dl;5o0 zjIKUkY6+b@5TnJM5)fSl_DkFeJ^wVM))J)ioLtS%?A7T|E*8o*1g*sf!R@8k?k`I6 z%02^}x+E@T5nY-w3cFAWm-E(j+UY<+q#!PqjMIC?KH2S z!MxD}4AA5U;DhgxP6?fRhnotOh(SPvS(ygW7G@FlsoGb^SE{B6E&)s+FpFQEa1NPN zeLJUmK?H3DMqNT+Xr#kUg(1+$MNvpbb%W#cgA>tAo=)50VHgOg!qc^WBa_tXe6B4i z*Rcrg&8&CTgdBD)XCM)o-9r;w(w)=~gh3_&!LN0oKUEF|>79j#XMSJ{7v?m^bRHwT z1cd%~NMz7|hdf_31BP_D_$wsOWAI{~*}p<&LLrj~hV~-L_GT-N7ZHOwSyEe}W35v^ zL?H`BD5Wxr=+B@H!`m7_k&5WwkOm;Gb|gE~h=AyuLj~u0oQW%N0o9h5*j|}``wAhL zi;=!S6;cOwU=s`j;`m3Xnpb4!CK#sv`O8;`;Xs(*5nU6L_HoN5M=cV6P#d%g-OG^u zT0#4U0v15NLcpM`=E2&}U~ST>UZ$(ykRY?>IjzmpFx}SJz@RuA!`%hJT%`4<_R)WM zK<8~d3+lNN4+w$*fuHI{R+1aw$`nb6sH*fhJB)Uv6aj&-%;S!7#G)14G7SYGY9Tym z7lt6+Lhgeh2Ky`wq05vpBWs26}~E;5k&T(=cv@0+Tk|W^I9v^|Znf2*bk?#BGJ5&KkrVpq1JOgQEU2nhX9| zO`ZjZ0)mz9M_iiCGe1jFpzEdG+3 zJ;Z#0xWQ(aZ=Za@u+TGfjbLL$Cqd>UYIU>6`Ja5Ggdq$moEfwLk9KD!^Sc^v%nM6m{n$6!J*|yk4+)ZnDZSgd*7M^b{Hd2lii?iQq>?xidGQjtNIlv@61ISwq)gwI z()L93I--44KN5-FC$mbUc`E!hswiu$>S!=W_i^9(Xr|_+uYz;Ff)Ki)ud~px2&zYS zEOSz|##r94Lam{dhxVz#$ZQ z(Az?GcGTH2!rvoEf0ufuMye!MwyQfJbw zNw|rN#WltN(+M>es=8g;wS?Pe6Z-!1kd^Jw6-EJa96e)Ab<=b`^T<5A1tJ(RwPPyj zZEcrgsG6LC^S_0yYX*y5qUi==H{O2ZL*j<;KrbnqX=Ob$v*6dtMUFz2Ynk(k#65n1j2~X>g9EEe6i* z`u`K9eT8s%mn=Pz&TXyW`g!VH)a`YI zofHWl%CHij3gw2fH@>~bW9&Wv@dnRRa!{ifS?K9lrx@9WXIs9;^?SLv? z%ea1C|Mgr|<8IU6Y~Z6{64CV*Ki_4dD|{ z8mLF0mQ%C*ra0}oBh(*2_CVBj<0;IqAx#C^{|TgAqe=n13MKTI$m`GkvKO^)VnD~C zS|+K4G-f8o2Kr}A$z=&pwI~K}d=O=PLl1%J_${B3KfIZR?=;Kj7io*1w2ONzWSg1Z z+Lk94`*K0C%o}xgonD)`RFh;Hzh{G>QRNEC;(so;Kb2Q)4b)EVf_KC|U>P-e)!rS# z(vOjX{mRsUS&TeMl)BdT;sTEPV%_hR?G)Nw5`Tzo+7HkfMhDDz4(5)$^L4=X7 z@yHTtiabS>{@@gZY2^E*d=PeSQaAN0TY$Og@$Cwzgv;0dIo^5XsY#R+qVy$jcw?M= zY3VDckPw*{5 zO^-sQk*Cf;p;!>+;Hj9T*!F4VuH=&`L(G99^8dp4mxwb#VYUwuKvw^65mAF84bok@ ze+yvFg`I<^?IbW=FJL)Cp1KI4{-EW`;Dhh0Oi6~!F~0N)789p~LW+f% zcBh)VQhx*T`G^n2Mx1UCv{EP*S<*f7Nd5vgNt_E> zX}Us+6s&(VHF?j}3F^78G0Qb`dUI&4vcS8hG_|mQa6kJRu~0W5>Qu|5&@ybUyESb6 zoae6dRIl=u?YMt^o!Aq|xI}6&c968QNMm|mvuzs9js%R%-^rZ@P3rMqJf;owojELp z=aeFt4&u@a8z?%~1=n%nhg6!`<7@?>d#;r$D5L4!t_uraaSIB>cA*X*?5 z6Hnp%m_mSi#izC-YDQ6XHTkXnpkjrs zujo}9^?S(jy3>zB?n3Ukpg2@DBn!J&W)otliI{@sfwy7~{m5%;gSX@IMyAiu!?S#{qVD&< ztoWSzVa223zabt=fmVF}e^@bWa1b}%mAi)e% zw026Zf_VAaozmgY9!R|61e!C}+hiJ|$&m~UE3&CXy=!;_p0K0;c)VpHUXb8G*sP+T z7+qT)dSd-KYSe11P@$hh0i^mXmP>;PPSRpy>RC|$VqWk~dnNmt7cc!%BNIHb6&KNB zy!yc1ExgIJStvWQmBg)VgcH7Sy~aem71>0v`Uh&A7#)2LdSm^$;RkA^pZdR0hj5Y# z&;CNK3y$lXPv^VO!m!fBf(m8FL$;Kx+$~kzkyoYlRR^yNE>!gAT463k44`WhOM?z& z&xD~zw;Dtp*Ak-bU|0@Cz#ha2W!Lmwic#Rys#Ktc_Ak@rIYG9xN8yyZoM(xbnYw%GiXYWVhSD*DK@Ab012s{txM&8s6VdmGmIW(`%K(%&V=dTC zKaI!OrOt&acSX$Ir*ZN~bX8}^t0UMAg`t4KqcHRzj25Rbtdymg49imxc?NNUrSxT& z#%&|mr;xx0aS&me$d>IFIb5i$GQI*$6IN7H$vnqWY*I0nw72E!X74C2uDo{f}d&@Y#wAq^`t;yZ`3N9wi|Z#n*NvN&i~Z{0dyRMq^XYKW-c z*lcw&PBZg&5$1iYRgS%`xxNK(K{J)Mv)g;`mN?zu`5anw01at5MJ{5=H!U5x?dp>h)q8T;)&@&yV=)ART_*Co{on zBfDkx4V=1GusS_goI^t6Gg>2)CpIiS-bb?6sEo$Vtjt0wi~!8QVui^)74Ktv^NEBK zn_$9Ad$K=E7(xjclPMTP`%&OXem2`DLVTi3MG#TgCoNMNItw>;FPBh=gI8wu#FoXc zal?z0b|mCkipW*gfk$^zOzKvKA5XMYsG}4`hoys46xE2x4S%kX^rbPq78XNCKf)@_ zk5gujG}}*``O;^d8~!nV(WtHnk12_Udr;+uuT4ml8tzOVC&W)m+dhy`38N=Xj>(IX z2cRk|jAf&#kkwL2pqtS9)11wiAe5)}Az`a1ryAvkizyDdV+A*G|AJ`nqXCWtF6HW3 zQD5ZHsq5q|X$(D+89p$g;{C3f~ zZ|LNI@!f~~K;G;KzjcCFo|7o&!VM}2eGP`T@?R4~XXlUSQK_63Nht|OOFI!nZ%COt zu*-l7a2O*wQ3Fy2t_4p@nz#WeC*+I&56UE9|D?>7I%8_BJCv@^Auk#gLnepL&2N_X zJKSWRhgBrn(1@EsoG>#TgR=3(W};T@ZJE53#%Eu#Q@PPy2z7jk56cYN@lt}`(lJuu z0CMht(98~@I>&;&|cxXf|j5yhAo+bYHwP8gaO7Zj>N`>Ug33X5GFDj=de}v z+a9%V$@l9?r1u*~P&It%Q5RK&2`R9v&lfpKXxeiiphUQY0@8{!v?nYtX{UJOlg`MN zM2m@(i&2yVxon<^<;tYVvrWU78(`cK0gYaXpmFiZ-5!aj?&W1wkzW(d?*cu11cp` z1}X)}^Ml9Q^Tg3_Nx+(+$w_T#8a`l>;Yo0%07wKDY8l^CaE1S5|kRqOBC{_X|`y+n0mtPLYI6(o*gOGeSzp4R5r-Q6d5D=8Yw(Qm!zl(~yH+D0eF?w7 z1*dC~0;cHIY?cHhb)wx>CGiO5{#}awTU11WZ8d1qPX(*EuptGvX~G&$@TiDnnYYH& z9}Br_5#y!3SY(d7FpUgJpTu*&r)hJ6O-&s3qi_(Ve+roaAIYIa~NxTa}9c%A_m~D>%tWq!oO&4o_QD!HZ@hK!FazdKx#Vdyh6L9x;Sdubf zjX1Qw!t$i;m;Fqlqw)4*mPk}YH`gh5EEoL45~K*3o>CD(V=dSSPm=>G!If3&VVNKJ zS-egSwaEDY>oc!gzd265Fq#a%zF(k`+@^&hY)Hnx;)0}3#TXuw<3;0fp_SPcr!8Dk zacnMd-=1(!@lkjgHz5jrQuGMPMZlgCo(O8_781lf++p&vRTL)>Ug60; zK}(g=^{kwRP#&VQS)CL(Ck%%W3<_nRJ;di<$=UsAanRCC;j7?OL9Q?}!$Nqs9h;&2 zAS<&jHHr_Dk$2e$ zA)nuGVGb_ek5_)Qo-O(0OoJU1YhzhZlEdChn^DM zj)QpKRUrO$3`?lGQ=cQJL4X1O=B|_`3dRZJ26|G%^N8+)*s8D6ha@Ka0-$WglbUxX zIB^u-z~O&t@$&l}5c3};bH9awi(ZnsTr<}|!2-fBeK3ybF&|U7p6}iSDn%#;AHBhC zHS;0o1{&8M*c*FD#YR9m@^G)nh(`_aa&GFjoO?*U?0ZP2lZ-&X)>ZE(i>CF40L0U^ zjsc59t^v1L?oB`@v0Uqa;2`B=^5Ym?FY8hlY3^9Ce1P*60i zABvwW5q6m#9Tjo~{rMqF{8T^(O7&`cnJlryGe3-I^EesiJUp&C$V9#nYT z8)MQ}s|>DySHrHZr?aoz48fm?`u^ydVxNq?ziMH&_8@+fm<0iG=B+eakum!jyc#l>7~&11Nb?oWTEhomS?N1u{edwbNGH+HN2a8XMq5=xWG# z8-m!;UpMh1Y?tlZss+IxrID<=|1;PZKneHxT)#!|f_2csq>?=5zv!%mZLZ=+um1FM zugt;%IE7>#DO|{ouzEA~T3l5xY(Qb`uzj;2+GSg3jSUAlN#@<*mZas5a(_rc@L8Bt zfJFQcP*$J$UW~LV1lQE7WBTUqU1>qZ=c?A&eq}w$u*^e zBf&NG2wzyb;H3^N(1kBU{)u|sj9<_BTesAv(RA@P$Fvc{_3?tPgHr6MvR)b_;3j@C zs8OQ?Ky@%>D6`>pXHwf|xX4C`7!#w2i%7Tbt{I2?pOEG+EQPILUKV1hU< zx!a#jO-WKUK}Goyk`fq_`!vN7RW6^2rozmv1NJMopCj0z2)vys4ds3v>$laP2&`7b zLfmbc94g$@@D>JL+=R9Y+!o+Y@_+-PmGQ@UC_!gh$~mf3hzkf2x?qz4N7Uhlo5)vp zs`I$q%+$Qh#6>JRB>A&iUWG0mm;Cm#!KmlnR*z#}9ZD26(ueh4Cmx;ZneB2)cdgNSuWUWCyzv9V0-6j>@IQ z@#Fjk-c#vTL&1X>wevEo$>!f5i}Cn$w~N8<&%p#8C5Y%)WzA>n@ zJy0)13bUt=RbPa+OuBms$GTNbRaT)j`Ol{%aAljs&~n< z@>~i`7sZf(=^~2<3>(s6q29P8+OYTJ*2-N|Zf+(FE#*c;{Fg2g$HZ zD#Xn!%uP*QtqG*Gs2=n;B@q!kWHo?@GdA|2Na1%_;K7}W@>LPANA*a;p*GeN2E0nt zxp#FFFY=n@0qyyj5O1S|wXk0rP>KG@0wXB_=**$Wf1Ghdh0epQb;_&9N=6u$#G5o@ zZFcPUAfuwRp{5k5a{YtTc3>aYE)p-B2^SWqO5!(RDOsjuv?`L+!Q%{nBUl{A>$H~f zh4uT2mu>bp4Yy#t!*0oZH7}6MZqrlwyXClMA*LM%8h23&#TNgqQZkjG8HFdnZ{RJG zwyaiVa#|N}cJJRYzx=e{pcM`BGK1h3q^T>g{F5;lAm}fRRJf6q{{GPs6Ov&^{d(v)9+keDxzHfpi^HFkj?;|i1;@~@vI6SM}#h85i!LGbjK|p~9AN(2^;@w{a+;$t1Dkr+U%-`qb9JQxVt225gp+i z%Z-69iQkSf-AYMi)p4NVj#}JGEX4aePl{XmX1;yz@Tep%3XxuHEB(Zf-V+-eQBRS6 zwJ}WzPjcz_+L2`O)>UxBGZL{)1pMltX|wtnEsrPL7Y;Qv$a{= zPzg_bhGuh6-`H9|SDD0od{dZ@72%~Wse68k=&u!$2FA5sVs?I1(1^;3?nIL~w6&C8 z5+H`?W00tnS$l1ks91qMYGfNB9^HH_pfOn#@MY!OT4Y9ARmBWleH0LfWWbFhyRL`8 zWC|Tuy>M8ZL_f~OBEFt3oP|yY7-ctcFzUuS zdwFybg%W%a7#gj}boGpMiacWhmvk)G1GQusc>f_($eZb=^w>cG2nd z_%4-Uiktp_sl)dFP$!K1ztvg81J!ZCbosuXq5lWW_~6+o&bj1oAX^M<=)1K@*|vX^ zVxhae^-0KjdH)}!Fbf34^m@QSK#pPmt8ko?iL0RG@OZApP$DU`+NJ_fzigK%|Cd9h0aR7fF~i;dBz+GUbU?MQC= zCN@W#EJ>ObE6uOJ_UZ4r9kddP=&TU?IZ!BZu#Sj=))Y-TIp6fUh+7{3u0PT1_9xFT z2X-PIe<`ZfU>p}7!zU(_V+CLirpd*I^V`1!6s)XbVs+5gIRqUU%w|4MBJfhiVR+;Q zQ9RpcLNYFNM8&3~!5;}vnz}_rK2wkrUM%1X9YbPeDDY--fkeceZ=imH!G(ig|t#+{UZ{-A$7Ppou3;tK|fd6nCm1eb>AG@Z#mYfOa7kh>PNS< zI=I{)i_d4ds<0|BKfjElDUOh|S;i6jdLxKf-z+Y%6%EUS5olCrSK1Sg-U?tQ4-(}A9|kl zl;h8inao_Ss%%yEQzR(isiKc!WF>;Op5^UYRO(zMV22}nsu;fx?+0lg8=(JyEFNOa z*#QogF+ju16E3Ve{&eXUjU_7n;>;L|lXLfWKr$o8tg96vo{T@pIO4!E-KFc4r(db% z4?&XvcRGTbRUJ|1Y$Cj>EiWKbEHB5d?Ai^qm2n4a?7Tl<-{BJ$0Bgct`wMd8Z8%O- zpo^0!Z9Zq$Hb6KhanG{V=Rt);PVl|Vq)OAdCd~45U!|Yximt2{Dbcg7EMh|ocEes= zp1ypBck>>&>zBVtqQ?}TP-0+H40G_e)m13;;3}^0nAdM4>}>&8XEUB}l|kqVfbzwYombIlr=}3z0h6)|L_w}O_(f7r=9G50_DMMWs^Ail7 z8ha*T2{sNd?9~@$nZiEKw@t<}S9#ABBRWNnJ{#x|iiE={*kAtzk7NeNA8 zPY6I*SBtI<>!#58DZvZOhsHkXS|U$n-T^Y$J^w^i4`kMRoad1w|9-t5ZcPjGIo#U< zu2cBjfipfIALi3XC`EIKJpxlpjA3k6}mV;^D8V zS z^65{Yj}^caI!8|IW?)Qw(r(`fjT7%BxPtiz8f+RB9XjcjM^6&5HM#&8T_@~p7J>5| z26W!?=1~*tH$iq!zT)s%t-YUJ91swoi-<9--j3I8ZXy5a*dOj(CnI1L+&^$2AgKR# z%oJGkS=qqQ`ma*Bo5_8)KbY`_e|`_AO39S6PG~|yp&1TtoIu3&1o@0ti?JSeDcCmu zXPVbKhUv0avg6(+*5i_Pk_^-z2HRO!0-TupedfvV{r(kSv*jCIJ%tDjP3zBI9DBNc zaOOg<175=Cu8CkH>Zm7VasSWTX()#q&5W80rc|w}$!%E`6ra32D_u66bz#1jLnB~>abnd-B(QdQy0(+ZSfc$a zn4^})Z9GEPl}8QeLPD4eThy0H+ zP%u%ENcPr;M{V`gRi~%ZIk-)W-@J#RNTiCCBbhP71q#tZ z%!y6e(yPca%@vT1$^&ksGV~==D(Ftaqa)KxL02pLrfFtdc3mMaC(G>A{1;2=bo_$2 zPXn}Uhl}Bra#->!TZ}EcKEvO=cE&#G`ti7d^4$rW9;jS{mFztHxPWo-=t8KeF4N}Z zYaKW*4p;MlWz8{icVWg&6;*Z6ydC4Bch9@C2P+*N(^BnpIqcOo$+XQLIz8Q8Ul>3- zzqu;^nYKH&gLdICX9a_ng6PArYUQ;&VkkaOAWdGVDWj~CA?kq zV)b&l7y-3KIHplV%bH4o=#;D*;nJbk*I=`D0PdoBptefz)5ZL2x-EV);)xy>^;$TU zg5%MU><@D25t1i9uO2!tG$0?s(eO`ZX7L(4cjV9$tT zi{h6})O%JdH9Db*J+D@Gy~KVNssW26?SpvvR32-$A)M+gv0{`-Jx3T`?~y84EVV1{v=>5#_ik zk&slJEZ4Ag>Wp(vk**nBoGrIN!+DOY@>%wa@B&q>tXaXjO}aS_cDgCQ?E9@pgKeP& zg}Ju>YnK-)def=k0ud@x{(&j8v~+!=;#^I^qC}>v14(o#BZhH4G@;^h%6a1^EZQox zAx#F59aKWHh07+voYBMXyKO7g=)fye8-M zW^e7>j{p5Ggi^E>0V+gt1H>~lfcFICLSBwWuaO+5o;(j6bC1kAXHnVk9}Z_0R*yFhX%YuW}WnB@s(>*P9FO zP)7{yMm2eov6>K_jWNz3EY)zb{CzgB(0)L+u}0Xq{i|XtEJ-@1ZEu*bZk_5ZspO~) z)y7v**OJL)ypbUIVrCMwd%Qt+;@=DzmNc93O%6iFHgRPo!l}KUL9y$x^JK;eS1vjy zkV75@+p_-rd!8&xM61R5>ip%$wI0dQL2rAZ?J;rc^ElvC3oX{1zf@Q{F z@&{eZiA_B+&c3Y*sP^0$cSx^WC%poi<5sr$Uwe5rgBuMD>P!Bte-&)6aG`d(4w+lz z*d5#!WAU5u{NXOg`_sa#w1mD=s^X`y$4dB>&t1pnoXd=s^E$4a86N@P#tyv`qu4R`r7gM7i2qIrQIY z^h)pBPhQcIlMyl5?|+H&5Ta=ytOD(2*Z+- zh>_Y)^*H!_sdtJJRoE|+^?Z;fmn=ao+kj(1*?@|AP|73=`NWqw;~1&tm`Q-rJ}We$ zky7hjQd(s*~zRzrS7SX81BEhVx!PKy%YpDF>bYK(0;H0lv8R16UiO zS`|us-FCBe-~62A1?0%DINLuiPWdI^Ro0rxR*#w0pXZ?>BVp$1R4kS>7d4Z9sYINNA@7>AeQjnEb2p@Ea$z%~>2M}NUU$g?XCnLD3|{1Nroh9K zIsvZX^44qYS2n|5Hc3A?OhbFh)ZC9k0+;U+)ty(9@1Wo?XK0^?w>Tv^_2eedZ)UEV${lUK^~jt|-Km{Xx~K-LnV zw~^bM%#knjkZDoDg%rK&Avgl3($3{SaED{fAfhek=BYtCiJs&|)>HAVq`=f_m?uC& zEQ-?9s9M~zjQI7F#8Q6vB){P)nFPg(``5O0WmX^wZD><4@gn@w_f82VqhfCqT|n31 zgamu+lSwKMC<37rEaw~yKw|IMkS|s^EPF7(MpcRrsf=|=945v?!!gnf(PD60h}1Vr zSeT?R-{5hf?BdY)SfYM)mf6aNdl@@qR}h<3EyXBW!#VA+jK&mkn~YJP5-N=}+L($A zo*+xqkTJMfuT3tcaSkjeS?y?n+~_*civ}^}+Tvp9`Xy&fw`f04zn1rXH;oR~F^224 zM&~#5KXb8cU!Ii`;0GQQFnj$B{A=Xmdj?J=#|NhI##s{gQRfr;HuC%y3$@j$m-ht!HY}Lm$iKyA3kyec9 z47Bk1s^CkXWt*}2O_+!f33eM(iCxtgJu;n2DpB%8Ah$Y$QMOC{m7&>eM*G|RQx979XfAr=AbR-Hq7X8?Y?mG3AcO=AbD5m(4VY8_j6-x2nz#0>JAs;r7kS%<2? z>&h$GKRdLkLq>KNDA*7v9P1y#KP1aL+Sxn()vH;tb+!RaXrkY``)~Kgm~$b_(LyCa zsI8WybnxAL$*oD(MWV{zJY{*JLkC1RVyKXy-R4qU;Ad=k@9Hvd(oNRQOO*WHC*m8P69S-Q?j%5i< z^*V1yV9;zbpe7nQU{O@+bV_@V!jk^P0PZSvd{NixHusws;05yc%XL8f7GfBh6USA6 zR>`(7-I4U<^8VYeloN`JUy876sHoGktv-Sl@4Ig?Gk;Ll=OIyPYD%cod45pdtp1Ql zi?rsA;tcJ-Pu^3%POLewnJk-9qs1fjoEe&T#osYj3)^9qQW|0nvW8Zw$Srtb;egw} zop;HU-!xKn=&T8)3@zIU{{&amj&2o%T(f>4=0G982T7q$z@{cYcQL%ITC33KptO|7 zOsdjrE-slidG2`kH6l+WR62Z;n3cee+K`2I1|zi8pIe%fi~DRjQ5KSuT=Ftlj-x}) zcYFFi&DWD150;VICoO<#jJC!MVj42qJRHtJ64q{oj+XoT@5iY^ZuD=PfOP@LZ3=OY zjp)m;E>-RF&o78-yK|?@^R7dDcKZ2<$Wh{QR>P3m$SQG)oh3OE=ekXltrA7PbuaBj zU7X+KCh882sp*EK(bt7on)5GMQ#G5TXX)d9fBHdu>nI_gR)9%Cl`*|QCM$uR>Cu}e z_nk8)HVaXoJu#w;g2p%v{+4d(E2*X|gF+-V8G7HRXN4htzje#E8sH9GbMm{>gN#u) z#XoezEaFuLW#@skLqaE9Jlp)HhQ;KwBBJV>Hbh$IZ+7lNY1udHYqx7|`NxbyP!x4$ zQA62(09?-6@4^w6f0_)>?SC0|P}Chq4Mh|9;lg)GiW^eS+zOT__3S98RCi0dt=#v+ zT6N9tUUgl|=!!&jU4Pw%?$c4z89oT|6lH|6%|hq-(e=5zFASN@6%4-D_)J!_F?T2# znQVsU_3o$7+dE<-VVGekS3;R8dsN*s#*J6*CjiTdh{dxh7;9Nh9lCNjFxw4s_(rk6 zadbJEA(y}A^&`sRr`)U&#+U6Wp4%oJ&Ob2SP!xJyM^z3`M+$7`CxYo-U$(J3Zkklg zUSO&bWvYXtbh5Y;dcRNpSw+`#Q}f!!|ITw<9_{+x{Yh2~9v62P5gJrpSNoTn&W&@^ z?XCci4jpSk)|;)zzI9toZLX1-el<46VlN--MK#pp)yN~t(Ms>tWUUYa9n(N3&T22b zla+oRHk75lFzY0D&>H1?-q!o4e~wuBqswMpkRTv|L?9rTz!B?zwRP^{Q00FdKknBC z%?Oc{ute_H6;^FqNtA42-A%(75@VSemuU#OEaRRumQ^h>Q`<5>m*m=ta*vQH8oA8K zHL>%<9#)IM<(YjuR48N{O?GW#5B0CqW2YeZg0_+f+sy5 zj+K~-Gw(#y6G?i_F?v}}!cxX^lEf(VaOL$0K`n%s&B3>8G{sloTM$s@!!;{b$dc*6 z3|ELlIu{nz;nJZVOJ+@dpd|2b+m713{I9@A(_G}{?Z)u^;qn6b4F&EWKCfN zH3FXNafVVQ3H%?(d2>RG!ukhcrk0PB7Dbk&T?^Isl|E1g@UBXQOw6o1F`ulSR$ShaVC%JUZW%9^~{91+SD0eJbS1hG$v z`0%!n6O3|8(S>(BXY`ji>&Loz?lnM4^)hafh83Y$KPc!-2z8k-9)&OZXxAI;ZJ*S~~Nz zT~O;}Z>)R-v$KpPPYC;P{{bc9WB(W>GC!!bH_IggIaoq_y4*YXEdxjQ9it|jG3H+| z!a3$E?A8X?&vM52hhIY9OhS26^T~U~ohHz6s}&nB;b+v{d*0M>xWl6rts|AjQeX6GgY-s6}fN8!J1t zsO3IbifG4EspzK8b(7_pdj0-L2`yE!LacT5)kBc-GV7 zfqZ3I0Kn-4m<&exV_h%d0+2z@>(Ln$fK#@zSOPC) zfO%w*uWIl}{us6J_`6fStF3 zUCHg}+!VGc|M$taLv|g7q>_E#CTIeHi#;D8wuAILc)D>TL0B9Hxlyi!jsf(Cl3(>i zE;sWXV#x0$p&V$Pbc@r8{mR)^M1jhog_kY)v(QaBqznTkKnoFDgjw7sVMkd4s)uHc zxAf6rn|f#t8H#}V?=3`l)UIwE3V<5jEr5OWcEE177s`Tq$1T?Ro7-7Cog|b3wOU&g qWX$HM>@Z$XJv1KN(gX3^rr6Ht(AJ6%oI&feN&;{Pr^j6K`q@8#pCGUR literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/ThriftReader.cpp b/twml/libtwml/src/lib/ThriftReader.cpp deleted file mode 100644 index bceb74c13..000000000 --- a/twml/libtwml/src/lib/ThriftReader.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "internal/endianutils.h" - -#include -#include - -#include - -namespace twml { - -uint8_t ThriftReader::readByte() { - return readDirect(); -} - -int16_t ThriftReader::readInt16() { - return betoh16(readDirect()); -} - -int32_t ThriftReader::readInt32() { - return betoh32(readDirect()); -} - -int64_t ThriftReader::readInt64() { - return betoh64(readDirect()); -} - -double ThriftReader::readDouble() { - double val; - int64_t *val_proxy = reinterpret_cast(&val); - *val_proxy = readInt64(); - return val; -} - -} // namespace twml diff --git a/twml/libtwml/src/lib/ThriftReader.docx b/twml/libtwml/src/lib/ThriftReader.docx new file mode 100644 index 0000000000000000000000000000000000000000..3cc7e8e20a286d83d85f821df833db0c00e7ac17 GIT binary patch literal 36922 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 MiNNe}xEsU+0PFtl!vFvP literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/ThriftWriter.cpp b/twml/libtwml/src/lib/ThriftWriter.cpp deleted file mode 100644 index 4f298a154..000000000 --- a/twml/libtwml/src/lib/ThriftWriter.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "internal/endianutils.h" -#include "internal/error.h" -#include "internal/thrift.h" - -#include -#include -#include - -#include - -using namespace twml::io; - -namespace twml { - -template inline -uint64_t ThriftWriter::write(T val) { - if (!m_dry_run) { - if (m_bytes_written + sizeof(T) > m_buffer_size) - throw IOError(IOError::DESTINATION_LARGER_THAN_CAPACITY); - memcpy(m_buffer, &val, sizeof(T)); - m_buffer += sizeof(T); - } - m_bytes_written += sizeof(T); - return sizeof(T); -} - -TWMLAPI uint64_t ThriftWriter::getBytesWritten() { - return m_bytes_written; -} - -TWMLAPI uint64_t ThriftWriter::writeStructFieldHeader(int8_t field_type, int16_t field_id) { - return writeInt8(field_type) + writeInt16(field_id); -} - -TWMLAPI uint64_t ThriftWriter::writeStructStop() { - return writeInt8(static_cast(TTYPE_STOP)); -} - -TWMLAPI uint64_t ThriftWriter::writeListHeader(int8_t element_type, int32_t num_elems) { - return writeInt8(element_type) + writeInt32(num_elems); -} - -TWMLAPI uint64_t ThriftWriter::writeMapHeader(int8_t key_type, int8_t val_type, int32_t num_elems) { - return writeInt8(key_type) + writeInt8(val_type) + writeInt32(num_elems); -} - -TWMLAPI uint64_t ThriftWriter::writeDouble(double val) { - int64_t bin_value; - memcpy(&bin_value, &val, sizeof(int64_t)); - return writeInt64(bin_value); -} - -TWMLAPI uint64_t ThriftWriter::writeInt8(int8_t val) { - return write(val); -} - -TWMLAPI uint64_t ThriftWriter::writeInt16(int16_t val) { - return write(betoh16(val)); -} - -TWMLAPI uint64_t ThriftWriter::writeInt32(int32_t val) { - return write(betoh32(val)); -} - -TWMLAPI uint64_t ThriftWriter::writeInt64(int64_t val) { - return write(betoh64(val)); -} - -TWMLAPI uint64_t ThriftWriter::writeBinary(const uint8_t *bytes, int32_t num_bytes) { - writeInt32(num_bytes); - - if (!m_dry_run) { - if (m_bytes_written + num_bytes > m_buffer_size) - throw IOError(IOError::DESTINATION_LARGER_THAN_CAPACITY); - memcpy(m_buffer, bytes, num_bytes); - m_buffer += num_bytes; - } - m_bytes_written += num_bytes; - - return 4 + num_bytes; -} - -TWMLAPI uint64_t ThriftWriter::writeString(std::string str) { - return writeBinary(reinterpret_cast(str.data()), str.length()); -} - -TWMLAPI uint64_t ThriftWriter::writeBool(bool val) { - return write(val); -} - -} // namespace twml diff --git a/twml/libtwml/src/lib/ThriftWriter.docx b/twml/libtwml/src/lib/ThriftWriter.docx new file mode 100644 index 0000000000000000000000000000000000000000..c696cf11ccb9172ae585fe86cb1d3d412f8ba8e9 GIT binary patch literal 37405 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 -#include - -namespace twml { - // it is assumed that start_compute and end_compute are valid - template - void discretizerInfer(Tensor &output_keys, - Tensor &output_vals, - const Tensor &input_ids, - const Tensor &input_vals, - const Tensor &bin_ids, - const Tensor &bin_vals, - const Tensor &feature_offsets, - int output_bits, - const Map &ID_to_index, - int64_t start_compute, - int64_t end_compute, - int64_t output_start) { - auto out_keysData = output_keys.getData(); - auto out_valsData = output_vals.getData(); - uint64_t out_keysStride = output_keys.getStride(0); - uint64_t out_valsStride = output_vals.getStride(0); - - auto in_idsData = input_ids.getData(); - auto in_valsData = input_vals.getData(); - uint64_t in_idsStride = input_ids.getStride(0); - uint64_t in_valsStride = input_vals.getStride(0); - - auto xsData = bin_vals.getData(); - auto ysData = bin_ids.getData(); - uint64_t xsStride = bin_vals.getStride(0); - uint64_t ysStride = bin_ids.getStride(0); - - auto offsetData = feature_offsets.getData(); - - uint64_t total_bins = bin_ids.getNumElements(); - uint64_t fsize = feature_offsets.getNumElements(); - - uint64_t output_size = (1 << output_bits); - - for (uint64_t i = start_compute; i < end_compute; i++) { - int64_t feature_ID = in_idsData[i * in_idsStride]; - T val = in_valsData[i * in_valsStride]; - - auto iter = ID_to_index.find(feature_ID); - if (iter == ID_to_index.end()) { - // feature not calibrated - // modulo add operation for new key from feature ID - int64_t ikey = feature_ID % (output_size - total_bins) + total_bins; - out_keysData[(i + output_start - start_compute) * out_keysStride] = ikey; - out_valsData[(i + output_start - start_compute) * out_valsStride] = val; - continue; - } - - int64_t ikey = iter->second; - - // Perform interpolation - uint64_t offset = offsetData[ikey]; - uint64_t next_offset = (ikey == (int64_t)(fsize - 1)) ? total_bins : offsetData[ikey + 1]; - uint64_t mainSize = next_offset - offset; - - const T *lxsData = xsData + offset; - const int64_t *lysData = ysData + offset; - int64_t okey; - okey = interpolation(lxsData, xsStride, - lysData, ysStride, - val, mainSize, - NEAREST, 0); - out_keysData[(i + output_start - start_compute) * out_keysStride] = okey; - out_valsData[(i + output_start - start_compute) * out_valsStride] = 1; - } - } - - void discretizerInfer(Tensor &output_keys, - Tensor &output_vals, - const Tensor &input_ids, - const Tensor &input_vals, - const Tensor &bin_ids, - const Tensor &bin_vals, - const Tensor &feature_offsets, - int output_bits, - const Map &ID_to_index, - int start_compute, - int end_compute, - int output_start) { - if (input_ids.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "input_ids must be a Long Tensor"); - } - - if (output_keys.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "output_keys must be a Long Tensor"); - } - - if (bin_ids.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "bin_ids must be a Long Tensor"); - } - - if (feature_offsets.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "bin_ids must be a Long Tensor"); - } - - if (input_vals.getType() != bin_vals.getType()) { - throw twml::Error(TWML_ERR_TYPE, - "Data type of input_vals does not match type of bin_vals"); - } - - if (bin_vals.getNumDims() != 1) { - throw twml::Error(TWML_ERR_SIZE, - "bin_vals must be 1 Dimensional"); - } - - if (bin_ids.getNumDims() != 1) { - throw twml::Error(TWML_ERR_SIZE, - "bin_ids must be 1 Dimensional"); - } - - if (bin_vals.getNumElements() != bin_ids.getNumElements()) { - throw twml::Error(TWML_ERR_SIZE, - "Dimensions of bin_vals and bin_ids do not match"); - } - - if (feature_offsets.getStride(0) != 1) { - throw twml::Error(TWML_ERR_SIZE, - "feature_offsets must be contiguous"); - } - - uint64_t size = input_ids.getDim(0); - if (end_compute == -1) { - end_compute = size; - } - - if (start_compute < 0 || start_compute >= size) { - throw twml::Error(TWML_ERR_SIZE, - "start_compute out of range"); - } - - if (end_compute < -1 || end_compute > size) { - throw twml::Error(TWML_ERR_SIZE, - "end_compute out of range"); - } - - if (start_compute > end_compute && end_compute != -1) { - throw twml::Error(TWML_ERR_SIZE, - "must have start_compute <= end_compute, or end_compute==-1"); - } - - switch (input_vals.getType()) { - case TWML_TYPE_FLOAT: - twml::discretizerInfer(output_keys, output_vals, - input_ids, input_vals, - bin_ids, bin_vals, feature_offsets, output_bits, ID_to_index, - start_compute, end_compute, output_start); - break; - case TWML_TYPE_DOUBLE: - twml::discretizerInfer(output_keys, output_vals, - input_ids, input_vals, - bin_ids, bin_vals, feature_offsets, output_bits, ID_to_index, - start_compute, end_compute, output_start); - break; - default: - throw twml::Error(TWML_ERR_TYPE, - "Unsupported datatype for discretizerInfer"); - } - } -} // namespace twml diff --git a/twml/libtwml/src/lib/discretizer_impl.docx b/twml/libtwml/src/lib/discretizer_impl.docx new file mode 100644 index 0000000000000000000000000000000000000000..bf06ea7632c2125ce0fec05daf4e42ddca0da1b6 GIT binary patch literal 38159 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 -#include -#include - -namespace twml { - - template - void add1(Tensor &output, const Tensor input) { - T *odata = output.getData(); - const T *idata = input.getData(); - const uint64_t num_elements = input.getNumElements(); - - for (uint64_t i = 0; i < num_elements; i++) { - odata[i] = idata[i] + 1; - } - } - - template - void copy(Tensor &output, const Tensor input) { - T *odata = output.getData(); - const T *idata = input.getData(); - const uint64_t num_elements = input.getNumElements(); - - for (uint64_t i = 0; i < num_elements; i++) { - odata[i] = idata[i]; - } - } - - void add1(Tensor &output, const Tensor input) { - auto type = input.getType(); - if (output.getType() != type) { - throw twml::Error(TWML_ERR_TYPE, "Output type does not match input type"); - } - - if (output.getNumElements() != input.getNumElements()) { - throw twml::Error(TWML_ERR_SIZE, "Output size does not match input size"); - } - - // TODO: Implement an easier dispatch function - switch (type) { - case TWML_TYPE_FLOAT: - twml::add1(output, input); - break; - case TWML_TYPE_DOUBLE: - twml::add1(output, input); - break; - default: - throw twml::Error(TWML_ERR_TYPE, "add1 only supports float and double tensors"); - } - } - - void copy(Tensor &output, const Tensor input) { - auto type = input.getType(); - if (output.getType() != type) { - throw twml::Error(TWML_ERR_TYPE, "Output type does not match input type"); - } - - if (output.getNumElements() != input.getNumElements()) { - throw twml::Error(TWML_ERR_SIZE, "Output size does not match input size"); - } - - // TODO: Implement an easier dispatch function - switch (type) { - case TWML_TYPE_FLOAT: - twml::copy(output, input); - break; - case TWML_TYPE_DOUBLE: - twml::copy(output, input); - break; - default: - throw twml::Error(TWML_ERR_TYPE, "copy only supports float and double tensors"); - } - } - - int64_t featureId(const std::string &feature) { - const char *str = feature.c_str(); - uint64_t len = feature.size(); - int64_t id = 0; - TWML_CHECK(twml_get_feature_id(&id, len, str), "Error getting featureId"); - return id; - } -} // namespace twml - -twml_err twml_add1(twml_tensor output, const twml_tensor input) { - HANDLE_EXCEPTIONS( - auto out = twml::getTensor(output); - auto in = twml::getConstTensor(input); - twml::add1(*out, *in);); - return TWML_ERR_NONE; -} - -twml_err twml_copy(twml_tensor output, const twml_tensor input) { - HANDLE_EXCEPTIONS( - auto out = twml::getTensor(output); - auto in = twml::getConstTensor(input); - twml::copy(*out, *in);); - return TWML_ERR_NONE; -} - -inline twml_err twml_get_feature_id_internal(int64_t *result, - uint64_t out_size, uint16_t *out, - uint64_t out2_size, uint16_t *out2, - const uint64_t len, const char *str) { - uint64_t k = 0; - for (uint64_t i = 0; i < len; i++) { - if (str[i] == '#') { - k = i; - break; - } - } - - uint8_t hash[16]; - if (k != 0) { - ssize_t n = utf8_to_utf16((const uint8_t *) str, k, out, out_size); - if (n < 0) throw std::invalid_argument("error while converting from utf8 to utf16"); - - MurmurHash3_x64_128(out, n * sizeof(uint16_t), 0, out2); - n = utf8_to_utf16((const uint8_t *) (str + k + 1), len - k - 1, &out2[4], out2_size - 8); - if (n < 0) throw std::invalid_argument("error while converting from utf8 to utf16"); - - MurmurHash3_x64_128(out2, (n * sizeof(uint16_t)) + 8, 0, hash); - } else { - ssize_t n = utf8_to_utf16((const uint8_t *)str, len, out, out_size); - if (n < 0) throw std::invalid_argument("error while converting from utf8 to utf16"); - MurmurHash3_x64_128(out, n * sizeof(uint16_t), 0, hash); - } - int64_t id; - memcpy(&id, hash, sizeof(int64_t)); - *result = id; - - return TWML_ERR_NONE; -} - -static const int UTF16_STR_MAX_SIZE = 1024; - -twml_err twml_get_feature_id(int64_t *result, const uint64_t len, const char *str) { - try { - uint16_t out[UTF16_STR_MAX_SIZE]; - uint16_t out2[UTF16_STR_MAX_SIZE]; - return twml_get_feature_id_internal(result, - UTF16_STR_MAX_SIZE, out, - UTF16_STR_MAX_SIZE, out2, - len, str); - } catch(const std::invalid_argument &ex) { - // If the space on the stack is not enough, try using the heap. - // len + 1 is needed because a null terminating character is added at the end. - std::vector out(len + 1); - std::vector out2(len + 1); - return twml_get_feature_id_internal(result, - len + 1, out.data(), - len + 1, out2.data(), - len, str); - - } -} diff --git a/twml/libtwml/src/lib/functions.docx b/twml/libtwml/src/lib/functions.docx new file mode 100644 index 0000000000000000000000000000000000000000..59d6e825ee3c8cd127f09dd07191b0eb369c82d7 GIT binary patch literal 38128 zcmagFWmp_rw=Rlna1HM6?he7-J!sHIfY8I#&sLU$gu(;^1A_xAP2<+CR4t540tW*dg8>7>0FCO21MI(=+kZ7u_i!+G zHehnMvu#XLP+Ap1{dWF}mCP(e;w6rPRkq_mJyCsCb#%cHZzd@2v|ct61xrZJ-& z0>c!Sk$Ue#v|1yETr5X7AW8cXESkD9MiZTQC>Tyva11)MI)8>cw}ae4UG;c`dYAso z{+P1s>x8cx*`v6hWY+5v6P0GBO*%rGKhO6t;|mR`Z^jMr1J1Rsll1jYmKu(AtG$KD z?n8(G)Sr8HJxp%nTI|O#b)}IvYPuWf*1>zH0GlAHn%N`BEUkBY{+yFlP5Lh#x;oM7 zK32zp(s-Wt;>Z~%Jpr`T^`r)gFllTZF_qpy_x<@UOa; ze(5aQcUcX{GnHpZrqz2*A}m1bj{E%V^@Lbl{!v1x_hqqoeP4L&o-FSfQ^62S`M;{@ zK_w^h0IJ>w1Q-}1=&zBJxveuZ)1PBy{G==-E2`hQkmLwuv3-+? zvm$$-bkRyzr;3DuHg+%3;rXtq#X@>M{t|tWZJ?Hk&U`@bVz2fl?PWu|(HdMbe1|`& zyZTO$j%`}REjhA?In_Ovg(is*{RYOM9&P>EjA)gZgb|&cG;&E$X#&~};#V3i7azu1 z01QA%zKJuuxUzN6)-C)&xaq63v7g9stOJ@_s-hVy4o?BHj3dU4xXj^nbXja`26o$1 zyYd&k@=KLYs8-Xgm4%0-xS!z?x zbsJ-reBefB^tjIdJ3*n}5Y?@^nE_0dod6Eb%%%V*^FKFvX8gEfKMShl zy|?6?f@at?Dx9PY9r$s$tTd+oQtKTDr-JQx7T4tFZh@U{4!tYUCjaoYgU~v6V>6^_ zaC|UvNZh%DK`xAvFkjK}fl{Oatyt3& zWiX3HGoWPJq<=DWP39fd`@VmA`?y3v|G<3-g?ns?Y)CunCjR!)cZL7ob-7tx#W?}h z#TE(-4D~155oxmHC0QwYRrqQ-elsE2-d+_iGKR)3bM#XgI7_zqJ#I37jqHG->$U} z0~blkjY}KfRalh5%OPK@zm$8FObc>;+Pyv2NlrpSmV)^F$__Q|QEo-E94dvQK!VR| z+<7ta1+5Zu*)OylOFKOrfmw2q6CwtOtJx0^0|Pz`!k>&1? zp`Q4~mR_(W=vKsGbqQk=no==*YsUcBzqxrnBvf8OYJ-Pg?L8l4)?g%xSP?9@p;7ou z%?L@>j@OjS?l4u53RVqKQzR2Un-JsEo6??X9Uh7=>KZ8OMPX%g;-R@xZU+Nf!S?~w z(1|vJxXPbgb$5vGzu>*1GF{rS9&SCl2qGT4!SDcE>fwn}PT_4|MgSz{!jm^r>~R15HkU?u=9YceULn^!HBRL9R?*0=P#Q1&?j9L!uy}>oY%Ir|YK; z1!{6zN|jp57>0y=z?rXadtD~f7urq<(%`i^uG1D&Z8V&PAu`p%hfl>GQn z);^FeHyR{+HT9RZZXKP?;9;NHjC12V>K*$NqKHwtJOu4w$CSvKkVv3Y8-{B)X`>>; zRvUG9V%!Jfttq@K(K%T(j3hZZapAHThh$+JEjm@2Eo(J}l+exGM)o-6WO-Yq1*3Hb zUUnLEs?WC@V=?gVDOFih+?{j24ty{?CKbx9{^^cyH8c?_hlb!R-k^)YwwS3}X3k$+ zD;O7;Wt9(hdP2j%S03_Y5pWQ)1OJLkTK_59DM|0rIxU2zCVo_UK&{hwVL zE44Rzcj(MpO8BR3WC(5Va44}EisWai$9_!w+fUj-((+mEk#Nl(*zps5n-3@I?B#3Q z-fgck`fjuKIORjn8T}8P9;p~A5;sVZ7_ zZh7g`*Sjr~kx!*V@2_ZbQv7Ev1r|Tmv}04M2j&Z*J0m#`bfmRNBG$Y3$erjntg{vJ?B1 z(U6Vy?UAla$8-s=-;nHE<>g6hkvIb<0-W^B%BqYM7^R!1ZL?Ju9UQxQpB~$?$D(h|xo8U4(<*=+S=Y6M5 zlirBz!n4nWkE)kp#*5ofR@lQS%5NDr!z@7?&ZA7i%*Jgf40;=8V{{%ls6|vb?{6IH z3`jg0ifq^e<9aX<4-CB>ar!}hoxU$;zZI%aS3Xs`p+C&d3Bh5pbIH*C5Qg+_Muu}J zYgGsuyM;2XZjpYVP5S# zQW)r3yCSePQIM7mWthxOMfIh*{{BWsH`UD{x-hw2*aVL&PS7HrceiYF*k&Yt!r_$jlF7Po4dT0^$MP1x_p0Da$|u(4VS@7Pm_}xZX*_)>te;}g2BImfB6dp< zcN}{d7`~2#k!j?_VY-f^7HDX`7lTwH&G$e7l?Gz%a;M5lRG;Up-Yj!Cgl3z8Wqvst z%*`%dLC?igH(#OOS@()lip&D{8nno``E=>NC1MSMla|iI$hMD&yyI`Nb6Mjxk@6;O z6bE*6b%qV8Jj>v36s4EVQ(UAwFJkKqYmiH;%^A#S%(zq( z$xmFFelp*6c}fBs!svR#3wK&fJodU}`a%_d6m!&?q~kHhClZ+64%ohBWlUnB-ApMG zrTcA^!mo+_3c5`?;dseC72-K7{C$;+rLA7NzCY_9buSLk(A zaO2TmEH(a1h{b7?UiYoK{cbSGA+`xI?^BV5AEdgE0GDnScQ7g5okeQ+7J|M;&(tmS z0`qod^27z0OB`eFvdc%(II^iId6d&)Bg0YPI>c@q9Pb`+=n|bl`3N!+%jY`r^mcu> zih9G z_Mtic3XafSG^;U_C-Kwy=8NsUatGIf+sHZ~f z%_+Og!WOOEDbqqIy|5|Sn&$Jrx}55Cd^Di-{DTWe_2ip*vz6M@EsU}^C!Ook{Cr&v z78k4?*m{B@#P7&dM}PORydy|7=|ssTAv`dNNuM# zK{WeM;kdk33f4D8)Kr^+KBc5C{hP6JN_FR?0$n%`CINcGiRj2+B)VQOfnkKkN(?mb zqr~Ie-Tnn(*JwG(+18>V&+?5GUIsko3)0oL`qjRl^L2!VFW=mTGgb4K*DBSf(XxEI zLk=4&`n{yQBg1QbnlA$>slJi3cS@*4g%>T75>Kp2en8=oy%wL1C#EsCUIBmt<0{Hs;?dj<5L4a487p+r%oKo;C@=Whso!3mf}_7NX{=TWuONmUnm2TQHQ z--+*U>aCkGi0}CC-gEh6Q`^l>-l;8Y@Z-`q$OiC4LZD#I1}mGR3s|D0ob=R7YlzxZ zlECxT^m27B35Y4ooYp3NsW_BPRCqzCZKWKjL!fBPwHIl{s){N&l2VKRR>!Rip(8O9 z|NV1FcGg$VcCyRKs+OzH3Y#tA^)%<+Eya4xfIc*++NF7819DDEvjO}71x{p@!-r|_be-U z_0|6MEM0hU81VKO^Zxj}cphCW+$W{4WcS$PwNBv8?!9dz zm>IZ2Y?xepG2MR{lCr-&zIxJJ{yKhg)!?ya%Uvu?T+!Rpsq~FEG_vmf#;RV|>v?{4 z+|w;w_}xJp(2sWCzI%Oe>;CbyeB_JKeMs?QKd@1VsNWK}oHgvFWAD27`J3YBoRrDq z8sRhH%r|Tyd8bd8%G<*sfe%K^tIr@&ZkxUvrzqpYr%&rXJU?EA#U=$$wKhNtMLRD( zDPJO>5QQ(5@8CP)UHk0i*@@fuu66w*t}GI)`*M(JXZC4y`twE7?Uj2PA@}%A1kj1m z^Oe_={5qk0m)6Cj%VT9tSVAnuH<< z-JAaugS0v<_NE2}x-jGnoo_m%9wnr@O8B+L$VW%mhbNf1qdmqv7{~YZ?Xcg%7w+|D z{q<{_{!0yTxnom6u+r`PEF^{dEQ?#|c94J_oZNK=AG0>G9*|O4os(82>1K4@k zd#}~)mde8KYSWYAdZc~o;qts^rKEm)SUqs%K1Ad#y&QaR4<(?wGm-HyWX{L!#@9qh z+kvb5zAKCLxg2G?1cgTl;ok9eSmy3p`1D*TLq)35V1DkR|KR%i*IB=F1_ym` zD?y=F)O-Jddl^y2HH}6f;_{FE2TI=y;zgzO=9CC)s2`y=^x-vSk~|`4ao`d}p9|Q! zdS2UmF3IsD*50+vz5SoFOCkYUG0d4(9kI>f!He2_t~k%9Zx_Gp=rf3hexi9}k>0`m z6!j)FqLGO#BlnsdsOVr#&j(krz07WYEyeq;8_w|dyl&OWUv)lEupC~)%DySHq;0p8fLg!> zDGR5Xjz9_3dnn;ZdYq6S#L%dtDi*u)m6jCFas#u+2=2Pb4>QO^O$1@3gO&u*ZlfYI zUm8x8oE|;EA->sfAgiN1c#9GMuER5`CxWVYg^e1N&;dQdD0YP%8xY$8 zU6AwV5LPx3qlJ9 z;r>_X-&9bg)aTZu?*D_}T!kDog7BA$nDWI$VQU9wP}NbV5BM%0c!SN&_K0JK`1a&7OzFwEkU(48mgBGPp6 zIe!HA)$!FOUT9D1kwuX7PoYkXEoo_T@7nZj#n4-_b0(0`o;z@CUmhN}ePf6eWYSB1 zIUihqzIACeupjgied%AEaLxU)*M>rkIERrIqS={i?6rac}oHXO5uicXwAYcquMGV#aLUU z)=~m?yLBD;Wb0e+dfbr89i4i=Q_|YT@u~Yt_ds;=eNN)fD=MDuuWo8zrjSRmLr=;Y z+##Wc=`^snON|!N176<-E{c>6$JsW%5`}fhjHRo}j;C+E#FueH(~2*gE6DH>v(?Xf z*oY>{oi6xhNT6#`6wNK0)p_ig87-VFW{W+dfS#Xl3clVWPouj}vu~)@J*fj5jxOmB zcF)afdrZPFU7ZNB{PKfCJNv$JT-cwOow%_rg*;ZZ2@JaI7=QxrZjQh_jUZ}fH>>u1 zW4v~Yml<4}Z*N3_6RZ1hil5kl%HLwiqb&orvT38!YdWyYi46!!YvHrWD*(uA|=;H`5|OU%uP1eVd!y z=cR~Zk>gy_vp|xc=JC#fI5D@%r+nUThzc!C9KBz2Ww`af zRKy_CI#huNIwPTaTaDco(iSl*v~SB{_;|y!5`N~@Eh-p$^bFC#m~1C0#y}hP`DSv~ z-+it&=Tp3wwR#Hh=-K}2 z=mETcOL|{8eVYCCa_qqJx#O)xIP;GAWqKIe^9>ATIo+d02+C-)y*Xw0mh@3I?wQkg zEhxX_%-I=PQem8GJo_#MSvnHGtwa4ROSM%l5b&dF{`m!?yW3mE?~+sZMML7Tf#eYh z@QhW1O@A8?(c<)) zWH9IHlb2tyz0j9>`9;&Cs)gNT1m1301$h7+)5h#1s=TrBhhW|*qRWH8p@5wISfz~j+GXr+cO}C)a?uj+6Ag#t?Gisu z0+^je-4` z5_dGlL1J~K*E$rzP2ty%&EiwSfSbNn6{q?9B7-|Ng0ZWyW!oc#j;r{dA7c#qYB9ej zFdUNd@K&@MwT?oIQA<)IPUh@m)H_w9ZlU(&e%2`XNDhsb4e^}_FH zh&z@ppO%*4q}LMVdTZ!J`TJ&`*s~ABsyO44EfUmC8{{c45N|IM(s@Jah`!J!@;XBt z$YB9wl+y1!%=@pM?s@r&j)ipeV)&z^rnM(3Wf1T1ve%o|jQMDSKST+5u_g>m8)ixz zd);jt|NPNEz1g(Nxq5ycznG@cpM>!3{o(CtfdHpM4kd$yr+dkrqekO1XFh_WIz`zR zKAxqrniI`IrOW#aTLp^hUpXNv?4DZ^!;gcW`Tc2acXJrZ!K;yUJTq}6c?(CVnu9I& z8Vr4xT}Qr)pwk*A&N@$zL3%ZOQ`Q*;A4oxM~M4@JLg&(^%Q=3{V&9ACbZP8D{Nt)l09JsjXOz)CZ9y+%4rb;NfG8SeTwF+jvuZ|pu z$q!DC(X!>%9!w zP7v3k*P_rqk1y4NpstUle_mUW_UYS*M*FC7Ji~QK+O=pT-MOj0 zAeN^%J+*!*BUoDNY^5*9aJD@_c|HMYW|np0brm&-m7^Xv5(fDbd&+HU>qO<5rne6k zzY{&ZJXS$TSxo0LtV*ehlH*-bzk0KyIp@lVwOJ{2$Ntr3gk1ks2g1+E2_3!>`%ft( zq_+*sv|PlgMUG)2+!5)jdGs@>P?DJv)dRy=EE@6l-n|}AD*N|zxQs}9e5MnimCo(< zi^12mkNFUG$f{qin8KK*oryxE>)Y8ZIxTp9Ka^m)n60Vb>_VnWgi znbYvr2GwFxy5ymAWUR@)L}Dn0jHfa6R&z7su&-(nSM3($vs=)0|L&ejX)i`e@2-0K zXt>J`{KO;hPKb*pw9R8P*xa&%zex$h$;x71^z`WP`lEPq+Z`dwYx?UT;;*T@pAZj} z41f%z8L!q-}#GY7||Vag@BnP;s?GC2%B|l0I?%X_;UaTwR2z_>mpOw+$((JZ>)@$0BDCj{hNY4!5O{9)tcyU;u{ueofHE*Nk0IjsPy|jSOM{ zGaWI&fgi?rHuN&I{vdDt;t`S>2xbyX98eW@G}*j9=%?n@zF&x((`+o@La12evJKzi zq%8*Eo4SP9@Z%ar93i`rN~XNA_`m}%uz7ifPj~HXk^Lt{1vB`ETf@@CYrDjf#=86P ziw{07Uq5N6@;~3&!Kkimh2TYUAip?KP=@+mr2+M;y1a#cZ}!QL=1``7rOjw@;!*%4 zr6_D$_>~pEuI^6G8z4AKf4|4gn2F2{rkB~4tkaq0f)rf}&!WBLjTl2xgPSe86a3L` zg)nkhiY13rYd2N4tO?;G)r@%|2ChVta)2tRUuM`K*Cbw-iEzAsneyfc zw(8^t>sIzI;z#@Phmn)gU)pLY1qnebGD9 z@%=lpbg5j>ZVxKb>>g(<=j6bdF)xBVt&nH>3y&o`&G;!+OLGhjl}b2{gSmsq=E_$V zCC`hLYg`29tjhvRxGm>x%M*q24H4XP{ix^UoI{D2G_KnW>jm6Q#A2z`|z#M zjx|n0^4-`OV;9vTs+jUNGBoNLEuJDhX}5wQvXq%8Nj+QCJ4;e*L(KTC=ANtj55fXn zcT;jm?(6zeMVL5g&_1#+UZc3oZ7P4FBw>Q3LFom$@ks>|Xr)gMOBbG>870536K_n5 zT}$Lwh)1&W+b93RdEL{!d2+syI-u4XRy)4(zHX4gEDbf8j6BMnBAv9^U3S$fv-pw} zry}BW|AY?3FjNvX4q;Wsb-(!<_9;JBZNFtstE(ZJ^l6F+DYmQ3sx`(tU!$zJ zc6wgxi9CCD;P99R;%a5OIKuDZ?phs+VJTx}8X*#a4gw*D{$t@BQ+7BJ)hF&|xDq+{ zat*=b-x7+FB79!{eWd)tN4gUEWF*i=3B4lJkzYVm0g=S+O~Yqdshwq3XtDp|fui^) zkK(Qj4)}KQr7~KLvGef|GYee_91X});?G~A>NhOBZLN|b27P*!$0~=t4C+wo3=qe- zD459VP;(b=&#WJm%-qUDX|8{nk7X6WW;mky8VA>ya4 zcAQ->!97ASia@UV;Y;DPYj_D2DgMp&IsAXH@w)tfveAsV`*UAXFUHj$ekrcD)`g6;kJ2^X5S0h+tDogl(f_>#{8$~?+w%Kgvh!)66K7gl;u6ss~TibW)*kM$(0VW(UU zPh~}tB3DtGrCCElTBb@OSGLIcKsnL{9KRFLe6#u1!| zvbRT5PPx!5_k;_k#sXiZ{eNbYW&|qh+&%DQ6s2uK z>=+oKZts+iDhH+u^K;ImcYDfB(VO&U*Sjwl&IsROw^rI3J}8$O=pqzcF)>0l0hLuh zXuRyv5mo*EX1~Z_!2aRU*3&ALN#Fm=vBmk_{ z)W059>OQqKHXncMXuudx_}PFPIe$6qUbpW1PVb2THl#2xQ(K-CpDEzdd%~*0CRc$J zl{P0~3e1V*Q#SZOPqae{wgf{FJ;OJ$`pl7v>ey7?MHa6e^K6|DylvpoiVRYlkO}y* z#%YAh<&+V$Sp?&ztQXg&VS|`;+iQjlR2ho?Tq~FmaS*9uBu-#za1tLv2S*UeuxGKb z#p9M0%@&{`oM73_V}2jAN05Hv?wJW2Jo4HxRb!BQ87&!WgP8uciG#(tJE!2w`DXR!^OZu}%;9&mUW9n2Bo?+@gnUNR9QA?J`5Gs^?|!!mdjkfQ+VeH#+zamz$4Yk@Hqx&lb@1RrxN9 z*e}Es9gV8PO((aYPFJW>@{np6Z()`OxWeqvSAXlu#_QOc8)BI3q-zgRcUfhO{@6{z zwPY-#oRZ0?UnL3TDF(J_9c0WK*_JiaQ-cN*cq|uH;|I*_jK{z1WPpOE{tn{#-$6-} z`;4~-R|C9Z&gh4KsJ>Sq*3%Gu{)z@n z?v(~?C*!YiMoJm^1(+sN>Zveu@12aH)DMD&Va^MAx_{2MBe8`#9~XO>Pw99#1Qr4v zARQI|8c&Wl<6=!+6v*bGPQDCt#@>IzcJuUg@H0o5M4|_F``;&2GwyNMG`@Vzu`>vZ?-HrA3A0pu{@ScZlfN;0iuyDrZg4aH(4D@FvizyN&+ zrM3wV16rL!^Jkg#+F46&lbnqiV^AwzFX*Lab!Yut19hu8Zw%kOZh@WL<7J1=&>KwI z3N%R7ZrCO@*Wc7XDKR3D z{~y$sT?6nPVcA9--mRZHjp2_g%X-o6XR{a>{M~+&Y6o;QQM8{3V?>a`JKxMh+GZ!FY;zq4vYw<{|EVuvCP(E zbjs$M(?7`jjAb5GwH^?(npH4=_I>>cd!*JH$J}XTxY_C7D)`XA-iDA#_}+FjCYyKr zu(= ziO|KZe^slo6UC@5?FZ*=L7QNy1G#On5NHER@aTX$W2`^?tys;R7bz;`2^b~D(gcI> zNn@ip9+d0TI(;9BHI)r;_p@5&o;=%GSeBK=#w(K zuLxvmFnLy3M&C>CzmcXbfTvOYSQ7=F*_4|?!QI@nyG4s~C@j1Ti5K%(rJ1c^D9nZy z!7ojzPjV~H78I97w{>iDRK5x+q|G)wVM%ZxNz9IUnd=;P)`b?i_!Yr(w8v#XuN>z< zLI}Q|QCgrXBye_L{wP&UqxyI+G0Tx>1<}N=aUC_w@vF2fp9#RHVABc6JmaWzg+^0= zoN2h)@K5$U7s<0C%&~%)?A|-UjSl_?*tOTJ*YdLvtA&s#9|sGMKRW%hIh7*;=#6q+*y{ey^64RX%NjK! z)^9u$4 z4Anv+lSsl`Ld_#ud21FD2Qgs^N6*q}%asM2)soT}hOG?HKw@@ikFmIf=y;~t4mM$~ zHx?jv<{H(TsDX8nhx{{5LXG%y%tD5OZ$pF7I{u)!i&nzwhFtzZV|KWMnH*x*S{h#& zKrCr4`-anEcTwjKz5x?+Ax8T9@XmyF`}aaa>SvT*L{wVT4zM`L9z;}Dk`6E&iZGl# z=v!!J8qVEcEQWp_AGV?InhmlJC$aks7pM$HIyE>udQOKE2N5rT@ok$EwKy8LQIFmFw^9bTGyrJ?5!p!Fmuxs2tM0w_P*lSYDMvC!& zi;EKdBMvv{LhRCJWYlDf_je63Yd=u~5S#@1&jGd$bbx6Bf-^|Fz6LbpbZtQwo{ka@ zA+p4fcJvrxvRp|CJ?k+ir!=+!!LK#vFCg4PJh7R3+)6MEY0lizr(jJLm)b$eJ1qkx z?-UMp#NW0B>c5j`m#zPgE--mY*8co0I zSZuwP<PtCd*h z=+*b4`z7Ef#5E#S*P&ORlFY<3n1kFzb%YejL5L~Nc)FMKWy1#9wN1BZJm0mNB<+^t zcA@{uA0B#usCj8~4%xvX_yKq3^db3_p)3B_3lt1=V@nAU_RpC-Pjzib#2H8PXASkJ zRh)xGZ~k(w@0&Dxz~2beC$wRYsbKbDk1jvp240kZqu-)lEEO_Y=mO#%8#j*?GapOy zFfUpzBzqcd*1sNTZOH#n1yD&(R6|Yx*c>wF>}TbJ_>>Po$qRaf|A1%=gvby0o_*00 zKT++pmc`PIjfc_H`@$d$w}hp*poV_U4z`AVeUgV3`nb)~9f$K^YdkG~!pPQrm!4e4 zF07FVL4@<0;+W-A}9%v6Vs{F*oY~Fx#Tq07`T`X)775ZBSPKBDxaTUB!-jL z54AY$jlLUQGg_=JA0EP}Z5LAGMsQ!h_FyZW*qvS5biQ)*2?Nw5mCYkBE5gzu|Hz*MY^lLX5nK1wtIvg< z&#XmgmP!My&Dubx^8&OAb*;bXjg0LVxL|brkI6Y^L&*xNWTy8)ij59DeN?dDxb`ok z=XArN1_olA3B*mZLh#Vc1NikHv}cs zILf6c^GoW#*VifZcnmlLBM@ z39Q`q)hrrkatI9T<>nTsR@AYSLZ8i54XjBam zc*Lu0#GC_iU0b?kd3=+<)(_Z=@^)SSK1f)ywJ5rI>rN0T8Pnz0>Z zP=0d&E}dJTin2iq13VtCKwDwx)F1P3&UUo?f;%sBQu_?q@ad=bkQQM0wYNSF2=l@U z5wlh5kBSEBFGiTtI)5h<3?FhIanLMhS9yT55fnI13Zgv&Fd0SJEX zS)iyAZR8l%-ypC$4jY5iz_JB8fK`C+e>hf*|!rKLG zLG`jujZmU0l5|9ntU3MeF=u8Y!QFuQ(7dj~Vh*?_BiRu1<1mhS6S*u(Tt;MxE|-Vq zF%+n40~_ug*1#Y*#~{EF>W$vw>Ahs?b6l(=7(ajl>%GLDQgZ;k@gG1Eb69itx`B=6 zE}Sszanv`b>$%+VkB8<#7Lt$Oa?jpsxp-uQ8itQ{LyP9`;%`_|xU#L6i{L=ujSAU&Db(w@y;1QG1$u!q1BA{Hep~K{Hp3wp zmV7weaJ`PZr!&Mn8;NXQ;KPndrC`GmmGOuU1Zz~Of72gw{DZ#O)KXvz8f5-py9Ll5 z0p5Nv$nihJX(5MqA6{>;Q3$B~An>|7fNma;m=Q*?GKks&u+s5~Nm3MyxekSA=dGRb zqiTg*a><2m8#!2Ibe}4>MCFP+FTNK}Dy!i6I;Z8*MZGFtL?}9OZbku9F-d(+*IHb7 zIHS5s2W;EdhwFtrn-I&5n1gy)S10Ll6u=^tA1`uYJc|{If3{g%UVqn!A?Et;l z3Ju;7TTsm@txBT57M<*|Q@F7dkNX||1H)n*8+!=^ECw!iPal*NB~cMO$~6SN@i~B! zN=m*WUw%TDCxW$I4c3uWgDF|f-d?svzbYk))7W^&lurjTDsGZGBAD5!`qa5@*`3I} z>!K2!KEcv_aHvQ?6XqNsTQLEpNd=lOlScED8&txQtR}_+!pg968A{%AIHeaSfo~-jAF+ClfDdoi690~WkcBiugYa=`1;?EOHXUs@|sb?){UB1w@4#`G<-nV$fu( zcADE1WRvZ?2Me*Mt;tB6#*?8;RuUG!__g-O4pEL;HZ#rSlc(fVKYbedaTnLA4}2zt zh7F%dy=uxnQEC>k(qDJ>AT1>*H(^;GYNv|)MyEfap|2l0vz@3KVZ;9cDvxwE@BTqi z(D;7Zz41K2*u)%ENB~OmiHDGv8k>!ntqaP+2>zpO-FTaZiTPDU#S%%z@Yt45Usw`p zJsY?p+4LCH7TJGR6hhd+`z|Q;6{ZrD*(O=hiVFS;+q393aC}eJXH<;;VD!|{frO#b zEK1<~p{>JmpTXPC4g+FLNP@l|jC5AyJJAeF3ahC*lAsd8iZBZPSv@{wpJ$XQlv8?H zwArXAP&mx3Q<>9T3YfON``Wkmvt4^GGRc`cQB)w<;Bc{BMPf>SUu(FHDkum#PDcVQ zbSOvs_RuzckmLz#LY?camx~SYdmr%(e&e`3W;lEqK5p@}Q;-`oRqPLx*dN}XbOYd_ zFyN?ArCa`f?`!Xx*mKwH1#7` z^)FpAikmroOW8~WVN`C7;=yZ3<~d@yDCDBh0SIX#(99Q98JSKX5p?Rf9^jV3(ASzL zK?sylLO+$kH}(T_#F%r$5HsxYfJD0&^flp$&2Zu;N^{ z_2-XugHz98n;t3`;IU*~vx{>fyia&VgAGN3v70dNk?5AD2GVO!iYBnB|D^&ELv}j$Um4H^_qiXo7|_)TJcglx-R(=MNAcV zr1j$+tP}G`57xL;WNl=f7o9iDUDGpzMDL}E?XShVA2wI~`7AV)@uti~Rd6B}?qNyQ_)fW8~I=qEc^(8!MygG7mNv;E3~KfQ!lp#uU^{Ra@%A0WMd z0onZln)99L1WM<=SuViQMy{8dM+n&B#QudKP!4*wI5OK}(1PCkk*U%w!>39iTx7-u zVZzbQg<~e(AvA_y9t$h#3K#t415?VMov_|5pT$cbHwqKaUAu!E(ngrjU^;LOD^6@w zYJ@}84-iCAAR?WsSdi1CQ6dP6Lo0qF{o8>t3iVXtYa^~Rd-#krC=-Kv#mdiNot{KY z6``22ccMjc5Z=TTq|jmrE@aS+nPR7)xR~`>kc0OLJW}XQR~$A%rbsCSBmssU{}h*O zveHBU6z&3t$HhzHca;C$w{PqbFw4sc2IgE11BUnC`}Vc0zJ8IkurN3M`u7%oAA^*9 zsk+nWN36!RA;a{^dN{Ce1uh9xEo5){UY{H70;o6F zPVXXacXvGM4ZGeCruWa%-yhH4pWaT~+F!G$$JY(6o^Q|EtE*AY&$I79Tl+UUR|N$a zjj-FhJ1dBq($^1W-vB7-DQ@XX*_tThZbsaz!){Z?JUlPmi>C*lTURNE4kB*PBi3I_ zTT_sXY?vcLuHRi?0%fl5t$nO^@1nV?$6cJRW-XrUmZ*L0g{ixjfF542TvpdEwMIVr zg4K7vMRt!V7C>L$_a*~hH|yQiai4kWoiz+nsxU@jLIk$+&aEaCT67 zNOQ`*r*BKA+v>ivQ-AvHnboc5DfjY1e1g)U6df_ob&ZixNY+YD$m-zYo^KV>)!N(c z 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 -#include -#include - -namespace twml { - template - static int64_t lower_bound_search(const Tx *data, const Tx val, const int64_t buf_size) { - auto index_temp = std::lower_bound(data, data + buf_size, val); - return static_cast(index_temp - data); - } - - template - static int64_t upper_bound_search(const Tx *data, const Tx val, const int64_t buf_size) { - auto index_temp = std::upper_bound(data, data + buf_size, val); - return static_cast(index_temp - data); - } - - template - using search_method = int64_t (*)(const Tx *, const Tx, const int64_t); - - typedef uint64_t (*hash_signature)(uint64_t, int64_t, uint64_t); - - // uint64_t integer_multiplicative_hashing() - // - // A function to hash discretized feature_ids into one of 2**output_bits buckets. - // This function hashes the feature_ids to achieve a uniform distribution of - // IDs, so the hashed IDs are with high probability far apart - // Then, bucket_indices can simply be added, resulting in unique new IDs with high probability - // We integer hash again to again spread out the new IDs - // Finally we take the upper - // Required args: - // feature_id: - // The feature id of the feature to be hashed. - // bucket_index: - // The bucket index of the discretized feature value - // output_bits: - // The number of bits of output space for the features to be hashed into. - // - // Note - feature_ids may have arbitrary distribution within int32s - // Note - 64 bit feature_ids can be processed with this, but the upper - // 32 bits have no effect on the output - // e.g. all feature ids 0 through 255 exist in movie-lens. - // this hashing constant is good for 32 LSBs. will use N=32. (can use N<32 also) - // this hashing constant is co-prime with 2**32, therefore we have that - // a != b, a and b in [0,2**32) - // implies - // f(a) != f(b) where f(x) = (hashing_constant * x) % (2**32) - // note that we are mostly ignoring the upper 32 bits, using modulo 2**32 arithmetic - uint64_t integer_multiplicative_hashing(uint64_t feature_id, - int64_t bucket_index, - uint64_t output_bits) { - // possibly use 14695981039346656037 for 64 bit unsigned?? - // = 20921 * 465383 * 1509404459 - // alternatively, 14695981039346656039 is prime - // We would also need to use N = 64 - const uint64_t hashing_constant = 2654435761; - const uint64_t N = 32; - // hash once to prevent problems from anomalous input id distributions - feature_id *= hashing_constant; - feature_id += bucket_index; - // this hash enables the following right shift operation - // without losing the bucket information (lower bits) - feature_id *= hashing_constant; - // output size is a power of 2 - feature_id >>= N - output_bits; - uint64_t mask = (1 << output_bits) - 1; - return mask & feature_id; - } - - uint64_t integer64_multiplicative_hashing(uint64_t feature_id, - int64_t bucket_index, - uint64_t output_bits) { - const uint64_t hashing_constant = 14695981039346656039UL; - const uint64_t N = 64; - // hash once to prevent problems from anomalous input id distributions - feature_id *= hashing_constant; - feature_id += bucket_index; - // this hash enables the following right shift operation - // without losing the bucket information (lower bits) - feature_id *= hashing_constant; - // output size is a power of 2 - feature_id >>= N - output_bits; - uint64_t mask = (1 << output_bits) - 1; - return mask & feature_id; - } - - int64_t option_bits(int64_t options, int64_t high, int64_t low) { - options >>= low; - options &= (1 << (high - low + 1)) - 1; - return options; - } - - // it is assumed that start_compute and end_compute are valid - template - void hashDiscretizerInfer(Tensor &output_keys, - Tensor &output_vals, - const Tensor &input_ids, - const Tensor &input_vals, - const Tensor &bin_vals, - int output_bits, - const Map &ID_to_index, - int64_t start_compute, - int64_t end_compute, - int64_t n_bin, - int64_t options) { - auto output_keys_data = output_keys.getData(); - auto output_vals_data = output_vals.getData(); - - auto input_ids_data = input_ids.getData(); - auto input_vals_data = input_vals.getData(); - - auto bin_vals_data = bin_vals.getData(); - - // The function pointer implementation removes the option_bits - // function call (might be inlined) and corresponding branch from - // the hot loop, but it prevents inlining these functions, so - // there will be function call overhead. Uncertain which would - // be faster, testing needed. Also, code optimizers do weird things... - hash_signature hash_fn = integer_multiplicative_hashing; - switch (option_bits(options, 4, 2)) { - case 0: - hash_fn = integer_multiplicative_hashing; - break; - case 1: - hash_fn = integer64_multiplicative_hashing; - break; - default: - hash_fn = integer_multiplicative_hashing; - } - - search_method search_fn = lower_bound_search; - switch (option_bits(options, 1, 0)) { - case 0: - search_fn = lower_bound_search; - break; - case 1: - search_fn = linear_search; - break; - case 2: - search_fn = upper_bound_search; - break; - default: - search_fn = lower_bound_search; - } - - for (uint64_t i = start_compute; i < end_compute; i++) { - int64_t id = input_ids_data[i]; - T val = input_vals_data[i]; - - auto iter = ID_to_index.find(id); - if (iter != ID_to_index.end()) { - int64_t feature_idx = iter->second; - const T *bin_vals_start = bin_vals_data + feature_idx * n_bin; - int64_t out_bin_idx = search_fn(bin_vals_start, val, n_bin); - output_keys_data[i] = hash_fn(id, out_bin_idx, output_bits); - output_vals_data[i] = 1; - } else { - // feature not calibrated - output_keys_data[i] = id & ((1 << output_bits) - 1); - output_vals_data[i] = val; - } - } - } - - void hashDiscretizerInfer(Tensor &output_keys, - Tensor &output_vals, - const Tensor &input_ids, - const Tensor &input_vals, - int n_bin, - const Tensor &bin_vals, - int output_bits, - const Map &ID_to_index, - int start_compute, - int end_compute, - int64_t options) { - if (input_ids.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "input_ids must be a Long Tensor"); - } - - if (output_keys.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "output_keys must be a Long Tensor"); - } - - if (input_vals.getType() != bin_vals.getType()) { - throw twml::Error(TWML_ERR_TYPE, - "Data type of input_vals does not match type of bin_vals"); - } - - if (bin_vals.getNumDims() != 1) { - throw twml::Error(TWML_ERR_SIZE, - "bin_vals must be 1 Dimensional"); - } - - uint64_t size = input_ids.getDim(0); - if (end_compute == -1) { - end_compute = size; - } - - if (start_compute < 0 || start_compute >= size) { - throw twml::Error(TWML_ERR_SIZE, - "start_compute out of range"); - } - - if (end_compute < -1 || end_compute > size) { - throw twml::Error(TWML_ERR_SIZE, - "end_compute out of range"); - } - - if (start_compute > end_compute && end_compute != -1) { - throw twml::Error(TWML_ERR_SIZE, - "must have start_compute <= end_compute, or end_compute==-1"); - } - - if (output_keys.getStride(0) != 1 || output_vals.getStride(0) != 1 || - input_ids.getStride(0) != 1 || input_vals.getStride(0) != 1 || - bin_vals.getStride(0) != 1) { - throw twml::Error(TWML_ERR_SIZE, - "All Strides must be 1."); - } - - switch (input_vals.getType()) { - case TWML_TYPE_FLOAT: - twml::hashDiscretizerInfer(output_keys, output_vals, - input_ids, input_vals, - bin_vals, output_bits, ID_to_index, - start_compute, end_compute, n_bin, options); - break; - case TWML_TYPE_DOUBLE: - twml::hashDiscretizerInfer(output_keys, output_vals, - input_ids, input_vals, - bin_vals, output_bits, ID_to_index, - start_compute, end_compute, n_bin, options); - break; - default: - throw twml::Error(TWML_ERR_TYPE, - "Unsupported datatype for hashDiscretizerInfer"); - } - } -} // namespace twml diff --git a/twml/libtwml/src/lib/hashing_discretizer_impl.docx b/twml/libtwml/src/lib/hashing_discretizer_impl.docx new file mode 100644 index 0000000000000000000000000000000000000000..8bcfaa71d98171a05eaedccea472ab52ce28bb70 GIT binary patch literal 39393 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

-KZ^1VxL|kC%ki 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

T$a#<|77Dzni}PzTf7P(b|6zLLi}ahw>m#ec$yU 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 !NoW{2)7J}@k!Njua7Q4fkP8zKPYiiLVkNeht zB`v>Mc~fqP-4)_n;!i%mbt=e(RPA)J8)&m1D+;?k&)<0+L zfNBJAQEOxn1DI)x0rvbb#lY4?R6#HkSmJ=Hu!D)_wE;g>ueRMn;V#JV5X5aKY|wNw)2wZ%Igc!7{jr5n-#+FekqnLPOaT!*^&l?k5n_}xfr-2P4XV9pkA3lgKU#{T_(ce?oFCZ zzJYuGd#XeIaoDP(Ypk1(x8dL0mfj5?l?Kb>C<8#@*zbI#I{pYR`73<(-{A+p!vl%L zI?8;wuI+z7UV2);%t+3r*IPHaNM@ee}SSighFi7~Mb)u%k zT%D|echie+g?6ZZ5|Z!6&KR?x8eYYex1OP1&uH-&;Yqt043VY8JVEN&qSjH8Y#U<6 zZ#DZ=-M1GO=(>}fLvmNwn<~P@NrU#Dec=klWp+d910@L)EDcHz(2Y+jkU%qiVo191 z?9?#nZH;(+O6*D^zd}5MmES(;7tYI1o$E*EYpFeI%^}spOYf@&8O+j9lZl9f+)2_2 zo1GxF#(q(2faRLwS`0T%7 z*gxv96Hbnh%jMWFKc-3o=jDaPE9ca&btBjF)&YrM-DUwuY;+}|)B;sz5h}h~bjB$J zYpW(%Ok0&2VOK2%S`c{yNq+=KNt~5td&5XNDgpiI8GC z%dA?Xz4O(}ifgClG#|;cXZrUKX&^3_r;5Y<&Tp^Opcoc2mZuOR5a=KfqUqlk&N5|x zC8GMk-3(VE>t3!dcz7(KASuG<<=;!nFMOaQkxxbfZ5ZDpLLKo5L=_N0?A|nVnw8p7 zW`!2>ZyqR$fAJ{n$l!o)6<;W!)fhP+4l=XQmB7(}QcC#oOH}Qeh4)*lq=CS1o zxtYcNLwbm~DXVQ~7ff)E5R4*FR(~mbS@_qGduTPti6uH-)02R?5ytp2({6p{!6egjj z>x@t)qr4@C3fZSU`zK2~DZ*>1@cXK>OTE7m8vD(D11$J}!Tf;l0QhgnS zf=ebws3xG2$~*PvpL7IPo$)j;COIUpBjvA-t&f)vHNJ?(vpyY&lr%*6ksk~k$y<>J zH3RRdL#ik5C=mUiuMS~#SSwn%T;2E9s?)8U8{r z%pJC+W;+T1Yc=(+hn2cZZH>vt-#q9y!V`Yd=SI$73cJ&(OWE!@62OKO24-r>k>WE2 zTzHRLHQ40JlcLh*#7}}bk$lJo@9&OsNXC|6D57WhLROzSTu~j9%DcegwQZiQ{f_q= zc$5Nz)COcc{zs!U!liP`aM~<_F;mv_E7Pz6%(|^r0|u%L1%Iw(Oo&*BR521KFjY8- zccBBrh-BC^SlHsROA2Q5&=5|r?B>zOhwR~`AGo`x!v+q#woO$Tq^j9r8_ie;^3U8E zV1QsmwJBm;88Gon8LBgm--}Q~F~9rAgYm{-(14qWFi07o)}~a|;C>xOU}{f#EkWvz?F;O&%7l^K#-sdYmE==68= z!Cjsphy5GgAVd8LO-UF-wd6Fl-bq^U$7Cjaq$GYvCgm4aJzpAD(8exglgkX7ZZ3|`oE z@w&ByFTE32&3(9{w4{@+!kJ1uYQD*Kpg~p>lio!y9+-AcH4Tu_knTbU|L$`A{xfpk z%FF3Inw|>ZMG^bCn1Z8W^;gr0O{kM)s^mPR8pa!##eS|ZJM@)fosV(aw&n&HCfn&+ zgVdc?86)3!5^*gV%P1#hGU``I0(pvo-!%6!<_vAin(3)Q#&{mf1(mpdGdrWPPum%w zpvgajc>ZTl;>0fF&E91{Z8GwLsCz+_)&z_v5~urpH1$j!qvnNm-NnR{<%45q#lGzfE^&(rxm-iE{$>U>!2 zWj?9x;Sg8|bbxeJ_`{wQXU4^vx*(9vL!ERH=8R{_cI{3%sU2?phZ3$~lF8ES(?nj& zT~_?0M^^m*D9k0?BXkkTz?k?`q3i!tc$sk(G7-B`!R4u(D|%A$-f6_CL=X0|KlcaY z@Jv;~d-h!qwE^)Sng(x^W#Y4!Oi|bXfq&2uXyceu1ck=agRPP z12|fre`ri_8T;&UzUh!`7|JWG}iqxp@F(OAW{3wm?692&I+@4+C1AL$k3=dhLv*mPyX~v=L}4UN7jSYISS!& z)a_-5&d?J~*$UK8)oR!xHQ;6FLGLpT`%NwT2Q@l~8dmoA?t8p-eI6;v=nraFvoR1g zKi8ksKPWN6k^c|si_U)d_ONWjb??>>9Y*knm1RBX_A^-w4E}D%q*?*(O%!cM!WiM? z?xC8;N3 z>Hi>~Hj>$Vh)UjAb^43E*GT3;Me`m(vsoGQNAKq!um`HGvCJKY1{)pzt%COr?B5VF z3E#dQjDF0!xnI~$=_rCKE_hT5k=(Ct3O1I3bF_Z5r-;r5)c;VKx7sFs# zwmt)QM({|#J7bJL{Eb-6tQRRN zL2vi z9lp*34bdlLbY2k1(qQteunbd5@4k?x&4Z^=eP0y?p4ya~Lcv{Mx4A`$a>&m=4~iG_ zS*4k+V#v>g7Qru0s!eb!%oG%tMSW}E;;4KPl24myc*K(6K$4gl^)lB!?5GPZa`7vI z=V*(~ep)`vfrJozIi<8fm5=A_y7*qIkVf_XPGW{5&kCZ6UHvL@hT~UhSw0hhPu`{j zka@~c=?aY|4>{d%x$d9jc_xx)MVMm+G12vNzq5(&tG|e1mlr*r#EjVlK;Uy(e38tc z;50|%r!>D4xjFA04tdYA!;&$4g_-5Eol;);azjyx84-@k_T;j{b=kyEIWz$u%j^S&m=<< ze<#U<_&doCyZ^r=dE{-nrrP#6DuJLRF^a6-_-wOU2#NA>u<-b!(v8ij90@>gl;C4f2-vqM|7 z#RWwB6U|nz33I)X0I@UIi0*g|tcx7v?`0Bd*q>ttG8B9Z8idyV8_iv`5>_YV;x`(z z!!69jAiL(`*m6H&Npsm3oEE$DI(P7OnCNpc(&PPG6V|Qc`G!TGV#1SjcWf zR92F9FdT|7oS)D)(9ATPJHJ>A{5;-mLEkp(XYEg5_ZrMo8HjYKbGCP%3?&R8o&)8A zaK6gl2aMQG=E5VhAB$GLf~knuS%W)~=#zl98Sdar(&)^?h==e7N=FFO#_eENxV?yS z%;~UKq?U~oWB(BsDf(L+ZqT{dh0XAY$tLe{4KZsUQ3DX11p4;{whnZGX##>XNV~oS zG~{${LKmKl5Dp@;M3c668(^|rN(nvbGAAWBeglGEY0RBNxP^FPGk3d{U>MMxx}{IT znkp=|fr@uh1}feO9PF^aZ41;ti)WXu_gC?1I&3>rCKlsa{!)n0hq!x0ur-EHJ<$zm zZKO(_Q|e9w=UGaC4xvs53%waP$|_1C;h-kduYBU|_m1np3r(nM_zPq}~`n2(1v>~7KQ>VP!U-fAc`9jS?QzEE%QxgLe zn9J|QI}eSbUvVt9Ud?joz;2ps?zwI6Mp#6=3_U~JAnz=WL<>F3T^vY%BA@(9wuWo? zWXCznn@#r-JQ~q8=CRS9@2dP>OtHfep0x{^rE9>5!+{6QS~NAgJ10kqZmv)4u}Cc% z!6u%JugX?4q0G^%_gUvtzz>KkM5@kxuU60djmQbqX6XnJ|}}<_ZHBvtg>*Q)^hL z>rmPF=~-eZacy6d)7~(}@QTr5WodsOMs=&0V$Tw+g>r8}k{tC)yf&Qs>ZKc7@yPD< z%BJImqgO~+@;6cERJChm`sDK{zPIinQYWYeeh<()rAH2Av%ze_{-UBtL**gC*ErQg zSn~>cpY@hbx72rTgB}{cGqgvZJwJDEC3I{5cdMqdJ&#pz*ejcdpO=NDMgFRv18k}O zQ4w3$<%`d`ozIL#XqIvVt<7qGhx0tNGIg!L=(UXPC%9mA{P#&YW`jxcDrBa2K?;oy zJiSz~U$}P9rDt`%LiP8@G!uxMWQE|NnFshwA_I%b!7^2kem$1iOUw|q0$mvM)HkXp zBxRqaIV8(21tey zAy*v0XU?0JXU~gM3VlRX+dgs+t4?Hh{4Dyo2P=s6fLe6DI)br;o5PmfxegdjSis*e z7RxRT7P=-Vsm4(%MVVVvJ7#xzRCXbsP+%wDu+E%tt6mK`+_8r4x)fiwy%Aq7+5A8o zfB+<9zHfBGOk;B2c+M#fAnq;5;&-6Ihg3VCS$L99z4Y99Ry${J+ziQryt#p(yU)c- zM*tQn2#*q`T=VtEd6&CzZFB?>mqnLjJ=5KumSs=KKns6FQ#(KM?5U2#U~%br`Yrew zmFi}d*BK-@;6H)`vP+?b{}kNwTk!dB!BzN2F0QN(8b`LBUeLm7#G3T?iNqte<-{X$ ze*wGqR3`>T{|i{@+h?;VoQXj&tmo?+plVV3I*%~cvmE1n?!JgmhaUp4WUvTCG!tEh zZ{=zx_z&R7egt50{B-H&2WVj=RVb`y+-kR%b}#+&&IeINXyFJhizU^WXPNY%DT36)AH~-f3*+rGt%32EoFePWOG4u1{en9#a#DK@*zoD6ej?4o z@M~?p?-%BU6(VM<)Ef~E)LRHQr*#ZX#Yq367hn-n$s$rLp{|dBtB6vfn|F8Jh%z-+ z%n6rgMgtHu?w+Tp5^dxd(px96It&|yRL8OfI)GJx?|wO)o|adKC{gNChZkKPxjPaU zy6p6B2Ey9~Y(n+0P7YI|Dv-2?ldL)&cbhY_k>IYwylY-lW-$j`k&`EeLUzlvNG zB`hJbM3u`y^B4%!eFGcn8B)g}IKv>o5$cKBUCVGBN*F*0_(ZJo>X-Jz47ly z5_4E}_qv9S;w~IF=yudIr|Z7h_K$<+K^BsW+jP&~Y&m~mgBpU5azl&a@8oY-l)tsp zP@v{9s2BbHu3s|Bk(6g0>%RdU6@LR9hW!EHaOW1V12xnJH+0fX6t%eF&R3D4;LvUn z7y)6)mlcK|wApfTdw@a!_?X(^x6?AJ=C?D@hl}7q;Ef8|b0O5@xV2vKmjd0u>3%|I z2)|8tM4O=y3`;&7Znz%Dos(%|p7jJaFYqD9#8R-K@X9zu2ZB|q)IaI>IsT$AHnkMk zga#$Qx77k@3kPr88{qiwa9YTro%@$-Y!m`2KM1_8cA%RFBxbl_j0~cd0IYOeLZTD} zW3EHt=~-(>+=yx+muym@+j&gT@jyza|(!+T!jAyZY@sDp7ndjdl zJdYst4&!@vO{A(Bxd$O}lO62?e>K_VzEU6+ic%=Hn_#@bDFiZ|KZl@0P}W}ZJYuyg zi|AW5M>#+*v_gZo#}rg^N~@6QtwtqzY!|LC#^I*GzhhX4Wn(XafW^SY?(T(>q9iI} zN4bKaH#!4QQc1~Gw(Wr;oQZ9~dkW(11Aue5@FU(x3vZmx&{JN)5_kiB{vI0byqk?My8L z;|diKTH3H$OYXLe47Yf=7H<+J=IFmTi&yoG^qCgMM)6o!YS}U?{0B#$r@h%M0UT!X zp>}m_%qfwU$C8T`x|AAJQ=?yB>^v&ot?wmiy=S8zyQvzL6G2W$+L zm4g-3Gfc(>%ChHR-01f%pt1BgE@YAwS6fQ)T@nAgLG4B7k_50n~3tn^nM-AIe^N=;an`&y|Y$LRD&H1zd@r?%r&!)*B9 zLG6*Q=H1;Z3L4u@yEB>t7@3%Z8VNv2I`Rp(SiZ&V*1PX_^wJUR)O94~1x1W1gf3#`MMkG3OCx{9J>+dhLDN9W1?P?Bv zqY4Uwj@6bx3mwc6zuC7(C{g-x$cTis>9Y<;cMVC$vC&oz zP$G@M^(Cu4t9LDlY0G`5Mq?{aRU)D!ic_-r*vXAPsct6*?Th_RkPFgu-8xe#x1d-B zkFFb^4o&RNtl6j6;E(*CQbO1t{2sHCKRYs;0NCcf4 zt_QfKF!YtiQ4j)Uq|gr~@b%rm95Ln`F~m&#M;I&!8(Wmc;sh4W;RR$YCvLUQu)rJ$ zQE2^~0IXP-Exoxzo#50n*rxl+d3dakuGz)85Z*_;qQM3t!Pre0cSv-Lll|$nM@8e< z)c;n2i1Me3;O;9zg>q$$Dr=X@fPFnC};Z-i@aHm|YOu zC1oy4kC8AxLxqb;khkBaN8cgtX@jv9OHSY3g^--0uIeHUInUpl9r2olVw>2d&RX_T zJ-90Q6iG}Kc%b?H4Xgw6dpFp2q*$)Vjm7YR{$V;PJU%K{2?ly>x9B6=n^(_|6@x?xceDM>fo<_@zk%$21I_x5cL1exUoGe1Xd~82&BFz3abo^J5GV)DEso5#7_^}Geq<^% zOYo^u2uAM&t0pX9MVRZ zP=6|L6)RS3L~58r#SaifQ6M6nt5A^Bq+TKjibE@YB>gi3BNXb%gqKEKXZEkt(x6HV z=oTwIg>`rmF;#?Oe!LYeiiPkdrXYnDLvSI3Zp;)r0mVhH&44m^8^w@ zLO>E=*!E9$$tEk^_fO_7aClg_Abvyn=ed0&kAN9oPB1X%Y8WuQf1cadwEFx>(!#>r z^z)xb_J2*I_NI1E)88J>-X33%+}d8Ur^eRwFQ0Bs+p4Qk&d#!L zK}Y-7J5~e*7!9%8x;iR|n$p+yW?lg(>B(;CirE?{V{V4rD?@IRMm#*vT?;3B#;q%q zgL~mOXW?rvrLD)nhJBmopYmb&J%#_QKR%i$D*r z7cQ$Sms&#~J;CZ*-y*w*WDB6L?^~0;ubcJG%9u|<*8@|l{~6HNL&&hb^xLg_e(@Xc zo5`4S{7`mKdPsBfuBUHHhug}ovr}LC&8gLm=Lz@Hd|bTZz7!oX&sB|~VMx|;PRPo@ z!cX5Sq|4RUor@35Q$zgK_KrN8xUmgkW6bXMq<|}LYVC8M#G^FZeW1qCN*90|P`xm( zVO{ys^6F$ouMH!y%onMAJMC)CeYItEktUau9C8MHZeO>>AD5j_ibTK zzfM5Vo~U=XcwprUm`ub=u<}|bNXSpbM=bE>^31%p zJU-tx=i_A2x_DyQHb>^g#z!bSC0vNZ=KD~yVu=h}J~a2zmT|LYIHKOgoVBsRKRHqQ zP<8$D%H-w2+o|>Sc7wR?E|vG1mG$8jSo?C@cf8ztcgD8n@JPO(9Okd7vC)D3Xn*(3 zU5n7(?82%`ZobLvUbTFx9Ft>mQTXkmy7}`sHsDGAmC2yqEtWf#i1yv#R_ome+3i*f z4kZqQ@JoZoeVzAnjiN$(m#~&1^6S%(VN>}8m-gz$hGKDXAaN3NIk84`^w`bQ)7C@p z&CH?W!&_F;k?&bj^uo>?KJngL=|ITDil?u4jx4O;8BxA4QBw7 zYwEU$T5)_p`4J-_3Z@(}^6Oju+E#1+sGJ}p&aWyT?ute(%7#4_d>p_KrS%ZGwWY*t zl;Z4UN=YWXGQaA8>uq`nxk|lVi)vQ(nn=`{B{$s8(-Kn7JRw8(}Xkg4fQ6E$MfhT~)VJW6L*o(zO{`x2bK0*ee73C)+o_n0BGLiw@Hs&Tk#3 z+-AfB(qC&f>{V`cO~)MJY$chi6~ou8H35+(JV1Hv^|g)W@*y3s{J59O!CvO6@Q~e^ zJ=eX-Y8YTkZNr_GQw0}L_(y4Kv=a21)+Bq^?Q2!E%&&v zI<)5X&{aAtrY6Jty=^V~rYY{J^poOd%Tsl82JU@k*Lxx<`(?ujhe}4%R^Dvgpfd{; zlrZs8Nb|Wlt?q=wItHV!7CzW4()CJ+xD;Bo&=n($Yi~NQoy(c<&G#*5Z0*gr*lTgf zXeMlLPfbe;@n#`n-|ihd46EG6_=Vz`puHwe3LpX%YYGvx$QN~?E6{A~Am%aMbb+!G zD^-4?0WX@}cs)`KMv)F5_BMUg_}M~e%Lr5ZFi)b!jbmIt*bj!F*GO&3!E2GPLhw|e z*@I8qYeUS3Hu-tV_UnR$i1sr2_2F${cN<4KAa0(ImNtPQtEzzpXqQ0)BqyMO7|=kC zR137jzaa?b;hMo-((t<|w|_hREBd#S`-B}hK~c$Xl!o8%f1v!`;qNH_y9!*+W@v|$ zyk!U;xoLZF0vM}iFyz1>5E$n_wEiV&8RC!;4FGb32f5k&<<I~hOS00LI8^607ZiLJsCVZgfxn+>D4{pZt= z-QCR5-aCv4d>LW)G2pr@kL%+pU#s`qzRizAn_JGxp&f3-Vz)6AoY#Bz2e=a_uU{{# znVnbynQiM&znH3Eo7&92W>pcr+in$h**QWYikRJ4+BHxRWHH;AxWR8Ke~At^t9Wf? z>e#xujQ068vOo7Y_V9D*`q`>>LeGgX^eR}j^^_-L(i<)H`Nq7}`-Qi)%PrVcxN?3> z|911HZzOt5G2QNm&-zcl$r-nVWX@BEn?1X1pv1$>*;F!r>#Eo(`RM9GGT&Y^2* zaA$bm??;#kWoKe4mVXf*FXpYM8QWv=ZQkKOY-$$*PS_ISG+wpnC;c z|4wJ%;u&gahv;K9+_uk;NKLr6Zy&EDp!?yn)X3fQ(0bxK$=z**0_K9hh;B(peZu`N z=AnbMTPj7P`1Jn>dkdhrwyj$jcXxMp_aMQoad&r@V8Pwp-QC^Y-3jha@B{+nb zzI(p^z4uoao1&^2bBwX}UOm^`z4k;pj(AaA?ZmMWe-{O-9T8y}cju<#-w>4D=o* z34An+Bf2?n_`JNm#fb}M9s53Lzb_q5Hoi3r>2ndtRWiM`Z+z!wCSbHjc6eUq$cRs1)@*z551ereyzHBKmT8WOcnO>7XLvM(T#$f!9wo#8!I->Au*dzi&;fqbKazc6Z6 z;8pCIB5vbVWWTKMKe)ebm34FrN5z(8!M-KLvV9d7 z-+cE$Wi#I(XiQ+KOR;I_`x3!J*_X)=nV#aV!_?f~WEY%SlfH-9wJ)CD48D6v9=L-Ty+_Po$!g0m<5uq)zchP?Gp4OP#72V)!-8p~5M=gFVo zdjU6iUKGCDt8XD`0p~8VTaG+(J>I^Y(4dSyPM=`&IQ?NY^^pf-cMW8u2w`p4dA)8S z{zcN+eUCaf$D>De!uikJb;G{YretU5LNV#HflM>1o4e!AvXNI8?eVAEFW_>N*C~lL zC#qt_`%Er`Lb*uoowirat7eoorv+1DsWYWrwmj+0s}=*B4-bvT&O13wELA`3-C~c% zbJwHZk>TI5L zGhKWN^;qiYsyumr!8-gdHE#REJ*WP`iRcO{$B}D@%Y{SvzspQahyz^dpjL@Sy z4bUj6?^$sf<3T(n>!ISS)A5`mrOG`+`P`~U2-zUoeC?y^;tMdo%4x$(D4*e&vB;Ki4l;O-ZHo=n*7P6*r53lqDyH377svLUrVy z{s@i|YG#HaHrh;ttKw`b_bULwJBgs4@aE+p{v|UeHEcWW-P!tDHuNo<1&X;H0f9Sm8VuuJXTfrd`;O9mg(z+p|e+4W9&u6 zB!qag#*ce>E&M?{*<)|zs(`OGSt=n{mujwGZx)|km^N(l&@T*j3LXY5_flLfKawum z27RUAZZmg!8O_Dkx4(7Jy(p^sGSyjRFLnYjJ*C*p@?a!K?Ho)eJ2g2|ri4yUy;P=s zr?HCZuB9Z{n3epxa~Lw)&Y8+Ke2=}j&lB%%zm=UQG+XLPradS=1n)I^_*)_x?KMXwg>;yEfdTCZFKZKaO!1G z9xQh{R=u^KfZ)#0t``cp(hOTMNSh_ZN=qLKiP-oC@5Z2&ln6U=_YHZBta#b0&)f+K zvCo#d#z))k%P$DvmkE)^!$8&Na%9knIOBK6a`U*GL9dtT+tt3&pmLf%5ZwS@Hz zfu#$~e*$F~R@`l0h=T>k`Dop``7W)f3*DUR@2Ja`%fxWI@7b}A)!}o0TDI~avM2pp zFP@MX>10F8>xzc7%gJagrGL{1#dqEI_aMm`F$CuB@#co~K}Hus1kDYm7)c_xs6;FGdJCRh_$w;N254|!j(7ybs~qxi{dHa$FtA*7A^L3c1(h3;k~71#(~YCz!Mt z$mpBkU0RWUK;0nnnzks(Ht^R+YY+B-LT!$cY-Q;`T<}D9*QeK40Y_p7I1u{oYggTeBqSB0-h|Oq-+GdfOevdJ)2VGwa zT|dJo)sm1mAAgojzUOR^ziE+wh=9cvsrkAD6o(O9bVa91u0Q8#m8Q`l&D-X|5V+pO zK)qc(b1{ih5E5l`m;!vFcn)n_EpAiq*Ac{}?QWs!=6oq$<5Sk=&gRJSS_o+~FKG+q zH9RA*+|&VQ(S{1GY*Wur5V)*SqCgL8OYNz?Q{6pSnu`}ZXjDP=oZPSBJg>pLO`WTO zbEtuJkQWSVi$&N*JOwG!cipeiIs`X0_{P|;K2%^f`d1vVDdo|eg@CoP8t#V~MVz@8gne4oO z)N8+IBJKS8l{VtXwMlFai?TSH2CJ8StsZqXapubK>36dJ_}lT2eI74CHIc>$snwRz zg|hEi!3J!hRurZrZNYPrs!jptquoK_B;-krM9N6)xme}h`rY{Y>$Q%^*%K*7+&K}+ zP4J-9gUIW5V_F?y2Jh+h!t8#%F4aM3kLn7-MN3@sOr-eR8d4hUgl=0s^!A*#+;IMcu!9rXNJuUTEAc42DiN z(p(e*gHjxoY+OGyu`o0l!|dg}69I;ah$b>q=O+qTy&igfS*4y;cz<@IyEf#gdnFT@ z*!%&8#ESm3VK58|83@*R``7*a5FQ3!pO ztT|b0^*A`+KruSjfYlPT2-s%kBni2E&kk*fK`61NIhO1-8@ z8&sH#`3_qvOq`cBu3#8Gwh&$$R895})*zkq0T@)xxAA=N=UU1fI8+dv%mC8zT)qW{ zS!&b1%t_$c@ZUqTq74Dk@kFvlNOtQf3L*Fzf+`f|;BNVc%=|I-8^j$h(_-iJ8vX$y^*W`bheJ)`C&3|3W+g?SPwFK7dKR7} z8U#5B0i_f8J`^zIpErO?{6UZOYiwjFZEkZ$XE5v`beu^q%M_R`V$@`e@N#j^F=78Kf zo%Xrt=a`b5iJFt)JpJcG*OR%rw}C3|#VTUxrh)Ea=Mtzs{fX>p^*U2U<0_3t>f`Mx z?O;FT-@T~6^?hYHddHjVr#brOaYT2zJ=hRxX?%PiyioQ1z755uujRci-rXf<8<%Rs|eGQMR1ZXC!Uhry$7K{*-wx z?)KG+x_#Y$;y!qqQivGE&cI5|IKjpukn6Y z%J!%ROa!KVf~(u@)(>9Gd#GzqybN304PRpxqQo;W)z&o6G_Z^=a9ARNkkv|+- zXR0uHnbrbRN38EhuHW~TZ0VC=Wt3s%TfiFHi%ExfDr+@#=`i@8D4lD>qx%$@$qXJF zMYpdrm*O7pV{D&4>;EpfKi)Ph6@>Zp48>Wwm0!&DmC{9-_^ARX`K4H4BzNn} zdm`5U6A*9sGA$1+hMA3#fqjOVV|2dlbHbpHo1Dix(6#ieo{X&9*UcZVHFchLgRMq> zN@h_#ABl@SX8JXgV>JwRIes5K~tOm zFM2MJj^XtO{;9{o4_B7F74hP z5XBQo$DOyRpq4BR=pZ~urB;m+cnxa!DT&Xo!&M(z|Ky;qV~uQbDOv1ntSwA*Z0S`g zP>mQSUqTR7LSrwX*~A^cvS0k!#lPuRFRwC|;dM*Up9F&j_`I!oZ=-bn4ZX&?3Pq)OuzMH%FNv$$WAN!8Y;# zR5=X0Fs+~dnIp*3{PcbeRLbr1-~#_5%FHxs8cF5~ID#o&A+DlfvgN3T!A3!K9l`>G zH?A1_AB@+I!6?>#BFx4ROLJy9(o7MKCYP5>kYYa4{WC(VaPyOJS(KRzP$)LU1q2!v z8ID7Gg&W0G>M%>7h{C@x{w3l9E^7#`Vii0%M zC}gczBD$=1?3wZnY??GP;sB!%7x!;5&i_|2mKq$ttXisQGcxo=l&RQ%X>0ReXc9H@ z-eOm3=k@2&+vI@v%xLT2e&c=hH({e~LDH+0OQUDn-t=hN`M${8;H_EXE8q3_{yude zly!~VWa=dCV3oo0d&9nEJU1FJw)miM9x`npc=enyG;rax5}8+yXg-Y3C~Bna+z{Hp zO&C^f;fS{rgz3FesicZwaK9-kdc!L$i~uH0tW8qo`C7NvMo3KSeYLjY_4{KdX6B1n z%cpp-ykj~@zoV99w>=R@cyHt+o^* zZlJ*uXZB~IP8h7<`mJdCF>%EJ&nozi6Iy0*Obx}I!H`m=ozIvxTa5=Oiu$w9BAz0i z_@H<+b!1EXHx^S8Xvx^ZmcjQDPJ<{L8^iaK*9F~p#L_wU>S;z(D*BOlw)x#5@bX37 zA$T|)W+RmO-PzYc_ks6ZU>u72;-y2|bEz>DG|c|<2**!FGz6?K1vd1@D?g+zlG{4N zWpeM8RTV*x8Fel3ju}nsXBp{i{HC zc?!c7=VLkp$?QZ9h8@LRs?j~Ni9pmja5B-lm>@)WC}LhYK!Ty805iGq5-nyuUZglc zst8i^9mlQ73@>H5IsKv}2&o|SuCtnR!-t=7rI`f*#fFDuIZ<=y;U2+k)*_q}#YXC0 zKFWnqv{7p+(S~9wRPzsNg9HO(9cFXmrSTus>Hy7up^o6C6kq&>+7OyBu$U?En1f}b zjRO_VNq}N4UA;j1Y*Fq(sLHC zfJ|R~ezG=-(^wP=7(52c@X2I(2FpfOhQ+ut4T*0UFI2`*er3`=igN}Td>9W2riEhF zahc1F#wP1C&@@qH4Ylk`9OV|ZRNW#PhG9HFaB3u{@iBExeu^Hp&2T7!G2$>DWBxFAG^Ch{Y zw9qk{S-f#!843O*d(EmCysWBh)S`&M3@l!h(p&j4zQ2$}B)J79vb--BUCJ0r$dp3K zC^mo!Pa56gkOb+4Ivr6=>5#laW#l5#)U#4bDFH#1)f-oyu+D=ZTGpAEZzU>URSyBv zMLDHc6=5>jTB(6r921rSPFY+lDnIhIO4^^!{8m%~6Y~V8yf8tPHQM4ZWA4*{ZGPmR z`HN0{O>{y#5QaRsUsyZavU~1bD1J z7R+=-CcTh6u1D>ad!Z(KX()|kFLy=KL7DBSsWwpms4eUiU-*Ja`4`_q$Un&2U6J=L z2&xNGl|1+%Md9zE&^Cb^!kC*c%D`Ii zw6vKAkaAL?d2KGw?Mn7o1(1wSLr7Wvr4VvS9BnIws` zGqI?f-|VL9H9l4;%jx_MmAh4&Jw?zaR|Ie@pq;O!7_FV7m5v}6j)*NB5X&x(L}EU1 zuZJ8IZz|~s+hf^ND5>{n6h;|g&ErXJZ5b5bwufM&U~rGx)P5Y$`j>sZoksqB=M1Vr zC_C<^jyNR)c7uMEmx7_Y00K&aPb?&>Ohir)<_G_!JHZ)wt|^z+@iJK9Fzg;v%t2*QKsV(QxHl-V9=Axh)h z2Jwz0`?{e!j$;I9Nbz8>W#9Ll21yWpzW76;#eVV}kftQCXJcaCzkT=$X4mlYSImTo z?SkneBv@!Pfal^kaG^m-`?v*W5r}Rf@C>&5Jg(^@fKv57p-jOeXaYqW) z0z*M&N89)bn}R@!C#`^ci#045yckG{*JF_(j+9?);0PQ`isyOxk|f2keWJZPcxdhi zZ11IwFNQbyzN4z96AgW}@L)i&%Eh4qRBxIzWQvYzH<$@ZnxmL@T7sk4x3qXivCOnY z$6-Vm8J=t?l6}|0$fyLgSo9HAew^V8=08p`i8{2K0O?Bw1TVSViWRZMuII8PA#0NC zud7H#sSfT_9p0lM3GHe?o5L5a0BxNi!DSMGBd3ziq2NJ8G$YjREj63+{?N!7+tbK1FgjL|LZfq$Dk!% zqbP=)pkY9;iNdy(GHh7Zzv63WVx7eOi&Z68x-l*uz#wM1neCS)x1 z)Jl6{^QmjPk!d<2G_kKjRMfbzr=pzNDQNN0r#FO7Yr-uouF`G}yHR%SS?1#gDb_F-Iud_-3B=*?<2r z_AH)!-qBa`@wJhR3@Mz4K1blsAke!o8l>&`cT&Qta)ATnJ&SOmX1UsvpoM;uU%N;`ag~eVEEcGK z{n;%Rvt%FsKZ6i?#NR;gpqE%9e*&X?Y^~qf3YesQH|^LC7Xk(n`a6(7MC$Avw5jfA z;CsXPhlxA!{BDbArZx043&+|>7Qigmm8%W<}HJA6VcwBoJf4qdcXsWRKGjzTavPe>;XFQrm6F zmDeQ1M0od5P8S2?f^`Qyt>t~f@Q2vCzses;EQCcs*~({izggfUQTc;M|Ea|%;Ac?W zf0Qiz6a^N&r1N>^Zh?Y@MBfHroH676EaCdT`Vy&?pc?%d4PKkMKXUG%@g0Gqae!QE z0+gc&_l|;e(v+y+p=r;3fZWe{fNVa^3_vHs@X!D0WS>}}Korrs>~w7G2LqvT0WQSu#?1F&NL_;sQ{N)?Ilio0 z5&cpb%X#=egM9*&@m?+rT7@pzhAd61C}RJM&PK%cI$`YkcOTE{92|g4Sk8&kmHZgH zFH67GP3_Va6xJTc7b}u|j!pLXNPvrU!2^C-M*cYOA1R1_OVdh_NdE!K8L&KvlU0Y{ znR$24+}wOWv1=A0y6WOD=9Ma%#^Gme>AZke7kY5hQA z2xT42{CBQbG0T4DG9UqWiOV6)T4ey5qZwnlEuROo z8W&eqmqnE}{Q=k&{JQF5N#)ol_YN{{XKfR>{6M-P?e+IZ;-&AiMEt981OU?Id1i^{ zdjCNTfxr?Us6{ExLbb-@U{gDfsiF~TEs>TNk<8ClZ{MExg#h};zr>I!n7mB-G)?zw`G6)K$8w}1tG=|Y8K>-HrjL-{q9L~nUJ5IUXY!WIxLB;*KPR6AF&6 zjRZK8RcAXg%RDRU&`|3s0VEbYj<9yyYH7kDkB^+csU8=z6o-8M@M#x6E=HUd;Y|qA z<%fj+W5qGWBRTh8g@9$8GaE8+j{hx1HVGRep{T6fAV;2GUJVnI?^xi37Z8rmP>UK) zgTjUv0K5qUJUq<9c$K2^C=oP;+`n}t&%*?Bg58Ku5TQZG$Knj+Vu6kkMslvPWwrwmYm;Efn}arD&64CDY7`-dIWWX&EFoAW z-@k@q->IdksM0FUR!m+Cc2;hm=Q%D`)Fzk2d)vBaN?9N`xMo{>EeEEH63D=Gk+z#ns&C6%1|@3_)_zl$AQM@8-+t`!nuG zfbIvhvQa^H2*Q#qZ52*nDi#w236gD0u7b;?mTkU_2UlPQ+0p*4K>$PHraij{)8*>nx+h_o4Xh*{pzqAe;#IomC zY(8P7#~aJQTT(s(>a5+4a?~8xf+`FUmtfPvE{qVKr9q#t+Q)T1dZco}AEzC!NK}ef zAv{`+D|8(0DOeW<6ln<{Y=9v>{6)ZXujwe63|8P@1gMUocrkG&oH%m4!Ne8hD9S=C z#uJvZ7DY+QNXld+L;!BVPlt}miPB*$1)3rNNh94vG5;5-nZ%_|)h;b(nFI^$qh?3a zaVz47+`#O}4qTHjEGDrO4^tL@k*a(^_RkK?ro)BgT@eA~s9GNFDB6;g?K4Cgr~Pfn z2ErdcDL{n33@J?o2lA0#%L-<97l_H2Ul()M296VNk2F1!Gn{j!DbOX!`w5nN8JV00 zE)4u}t9z-X#6Z_+No)V?kFQ-`)ubh1vdbOi@JyL~@$pfORGBwhv(yM=*Us$o(9`EkiwDpTi54^dewvu>kdjqaD4* zEbh-Yg$39V-x^YS7iUQRs*p4>Z}gLL3Zj8VRZsOMnvO~< ziVV@BJBSGw7UKcUsp5c7YhN~^vodO`<`^1dfH-7B9$dK%eMDw6nE0B-qmpEX32s)2 zjSPuo@@Sf-`=9H_d+VjnlQCMG#^>X<{NIh~F9!z55YNSIw2s#E_?Q$70>oPvH9ED9 z1Q3RBf9o~`hy%+YU|3pdb2L+AwD-6H;=r>x>IyL`d4|x4KPr3fG$>J{PYW3d%Swt` zdx}gFSO#xWL10O0dd?7UT>v7PqCgKN&RJ->j6h*k+$F$hn(7@CFhmtg2|!?JwWBaJ zGBYUiO$1#tu-y*TQ)ChRhfpzpwuj1d7x}a<$XD|OyT_F0A7qmIG{$KjhX17wH}H=- zQI!9!&K3cvjt8d4|NR2jm9JbX-?vVDJqJBr7$`<&L z0FcJ7Aa;-3i3kM>yX2dZ6RGCu*H@VLFSC8UF2iFA%-M+U`G_gTf^f`%3m{^&^mJSg z3u|SzZ$=y}so{|*oG2=pk)?0=R$2Y&e|0ydK(%cK)HPQHOO}e2S2q zN{JJMJ)EHsA1Ubg7F4vhj*Zhr-{2H-VlNqn_LC~^vklcmI;%>xpZaJhvB4}%XG&Fh6E3k8vLy%a-5ka0{IBM)h# z%>GL(a!clTd$uq?WQuX2xH;cNT;{Pge$aZNTc7fGs(S##%KGr?U_7CK^}5o!(Bk4M zp0*@n%60`;{QI3SQe&&6)J`lcA6BqQgF|^=B4#_7wftOPT!8}G<}-jKLZ!wEQlWOD z;}gqx{b;st5Wdp(+Nkp5Izm6Q>8(B(iSE&yR8(0|AVTrA(vbG|{9wqHaoLcE!X9ySdm-Sf!^ z>h}DAY>9$Ahl*Pd(01lMoQcc9phG8k901OgqwXh^=KDyzmS8s*bNWK=o?U=wUh;u; zyWf)PsKi#>T_M2HKdL7TrEy9d21b*MI_ldy>ZrFS!9d) zx!$*!%H0&aR*m_gxJ_-z|B$yUF__qf;<`59L4%xf-z6tDqdy}8VP7w~HEx)}6r=_( zvK*O!*SAKQ$$kK2aeDuXsU6C0^tvn{Oa1wNJKCNR;dgwn1FTc{J%BU6o*ox6MkxhF z$?eOUmOKMfORP~%SI@Aburdjv5fL;<>7Q_IA~!r6{mKjaPIwU8{;z$OYrCNT++KO6 zeXIfkY(dou{Q1))_OBLHU(AeE{_BE|nIEtoVnG0z_wF4$N>n*Cjb{Cv$c97Ml`PVV z>_|Y#+5+4RHS_v|U5g8+>ye7|oU~%c4{wHPPrBgGetR}3^@IGYWmDqsVcRC7G%)-y zF<6;baLL!3#rlu6N}j-t&L<#T*CbfLM>W2nwhtD{*#;Ck zk(KLPVb;FY(hx1i+_lm0#L5h^Pd0(#uX^5yNTM>%OfJN=ZWS_~L7ystDRqyXIn2SB z`DNUH5Su1HO7VmW5H;B~D?4>Ftd5^0<7)K)uzJooIjn*gxr`Wm6)j_?Ht#|lUi>8y za@zaR-JB2+p-V`yY(7pm?d~D}>DVvcd>0d7SJ7W^ARuV}cFY{uL|4_w*!Hj1qT8th z_TN|tM!$cJq)E$`u}x~hK&2ZEZJt8H_Xa^HsK?q&xEAhM{58vO8^>~8FWvQM7w>gV zKTQD|2!rb?Dg{o;`+M%i`1j*Gp?2FBhDIteI=c4n{dkTHgW#;iK1ck-uRT+tCbTgx zD3XEbyBVm*TdmC6OXf7~>Zu($RaEdk-qmhfu6mf!utSwp#)C09a1-@hY0gJ%3_?_Q zW+a-?oP_h?7a36??Ts$@p5ak2qImHdWKuZ$d_B7<6l}49Rje^9lXhO=o2uhR4C2Dc zY&zyjCu1zfHuz`PIIMV51!Cnk=Ik$#%JeS$5a;3Its{XaS*X}($YckbqvQ4ln(DK& znOwZ)r60bdP-HSCs?n_2k-|j^jz^pMMV zGFgVwX;lnok+IR4<)G`;1G9AVZTs$!*V7da8iC7Y4SE3~yyrnW_M@c;DtT;$)orHM zJ?IDz@7?h)`T=|%paKt~=0|F`U}bwx->zWXym}DpYAbZP1=@!$OCvSBVA=CbJl$CF z)5X=DwC^W)7(ELf9Kp)RCv?=i-H!Wp&9d!tN6ydpH~VhCun$#@fYGNM)raa#<1+zBrykZCTG? znPV?Kk7POC2lvhR!-e&COM9QebYGsJy&OWs+uS`Bnsh|lW{zkC9cpJ+N0Kie<^`7TN=wwK~0axH=eY zPZ+88xw`(=V>nb@+LU(2Fw#CT@S~{?R5K!s`-B)-q#)?TRq_(+jx7dHlwVl41!3P- zw-;bGVGuA%+^)euTt0{rh}839lTv?E=Y4CEVU?67PrwjkD3qIj8WPH35kC@~v8wmW~G-;ebqZor-bZmP$$~O;u>xId{doq{`F| zEzMO}qT{~AS3{ToB)UXXFKm! zrSQm{RaUmKS$UzZXjv-T-H9x=oEgis5SmzdHSMx_8x~_7+88e%wVARO9+rsBheD(s zZeTcZIeX^eG+EPs69Kx=?kjjkJa;2z1XV6TE*GO3aj(tGkIz;SpCJMzeCeWV`?$kgE?LjkrmbIP~n~OEc zBr4N%w)%CxpxALpzPV1+wDYraJ1kiywtatuzkY-IJh}9^9nIEfard(6Rf4e)gi=;A zj7NfDPtu=ES=Myhi7iedrgjMxWuoc*-XZau@rx9uNjGkKXOJUaM!WKXf(PDgDkSTr zg_?qur}bW`u^}G^;hk{_nvI{ghfLN8qOHvb;ao74dP3zUUgJmwnLkZj2g>+ZGIN+ta77uxeZ%b=Gq_Lm0$~)^Zw?k!2jLK zqP&c;TBho|sn=TMjo(Ap_JZ4-j_W4A(P#IO=?uyrJI~%RQd5zzIUj#W z@)2X`EJv)aOrC@k6h3@aIY>?J?x0&R4&kcyKzO!qqad2Mix8dE$d zm-Bj*p^z#?E8m1?Mcsskc2v$H5BVaHJ?9*);har`+Bq*Wrj=IjTjJhYRL)Y7Hvgl! zu%?^l+hCwW`F7+gH?zp=`S4fU{7bw}O|rT`2MKrB8utxqbAT22{+ksWIQ4 zfTj9=cPMw+|11TDJqrh*@7ob`-G~l9R`4Fkzh7{il&EUdyC(d`RMwcidGlz;T}3!9 z$w_SjqoWVNfvDtZW}FO`HS2=cwf&LNy_Bw+tPawcP74n5`TbT%^jF0wZyNQ%oUQDU zn%vbMtDz>B(LP&n>&W!ZZ~HZw6_0!v_;uSPxsd5^pS5UM(k;TDQE|(ScU0{g{rMdL z8=Y1AE?``o)oZK!?Z5ka&{lVkD-=}{`ik38YnvqC$m-@ zJu7T_NhL$I;r+2|Tb&b3Mjzf1O1g~j^0iw^#iZ01RUgnZJSD{$|6-QT2Z~561IxVt z1CTm6H5P~$jmRAivQw84K(1h4k%Wo!(sGWrK(ZR%6(RS}5fvpXE;M>xs<=8fJ(X%) zpJ%nP<6XrK+ZV=V*GMyo)pE@^uAnnV+NEGNq=w2Mk2R&CKp@HyH)alPHRw=CYhD1$ zOVv18qBOY;_Mt;cyS2I+xqZu<&@VYGFs$eQy`RAV>m0}PUZ?jH`k%R2u0P*e8Sn!S z3Yfj31Am*ixwtymY1-K`Te+Iq{q?a|6Wste$btd#!&iJFaiWwj9Ailtg&MU0u2%Z> z8&qOo$$Urk1vj6CwB55V8k4JfHrYy7e_enYY71HkB1ZC2b7S@5E1C?S`5`M*2MRU@ z3di|}@IR6jogExq{u4mtN05-v%C8^ImpNPYWW1MAbC52D96Zn zT-|q_#%h+Jn2;#$iHPLyrg(E{3)=*>dnzuHVOUnA(ias|5&BP&xb|W0BbT4!0hfnYYuxi zJ7Y6vU{&T%b~mHBZGXUn)3aM9oFJjw5|P9K!O>hOtgaU$LEiEJLWNU*kvGoDvUMYS zZ8Ae&og-8p$u5WHJ{5!Rx6AwC19*e{`F0zWxPugd;lgzjq*Jyl%5Wk(y?XfZBkhdp z>W4Dy1{&Jze7m2p)$jd}xVc}bn~RWWbaiDkntb1=@7BLbWklQZ$8d)aKBgXM-X_-_ z*-cl>XwVaod(Vw5x)bi1YDDa@%BYO6huA`^ROJ`Fv2np2-Y>dkD{h;pJ9XEEQ-@dV zMZ&|CbYj|spww+1NjOm{9zarQ5^-oKE?kYSs@E$GIH{}@u#&6wTS`i2OkX-be2yv* z3zv2WQHegc-a+gYyYb*9TqDNh~68#NHV}Id% zbQcXjx?QTozu~R3q=);9!c@btDJ{c@Eas*N zTWjGJd%AXO>^x(_Pxx=7_s&v^8AaGsG+DDt6!KEI*NHC_H5zfud@#h#ATK1>kYj{Vf`G{j0_J z((#9J7gfV)%t$Oz06s#Gw4^ch+`VvRO5dJpT5Yei$J*l{tWD4S{!P!VoW590&+X@3 z=m9+qz0so(Z*gWQ`y5QZZ$0R}0}&`3?qCT0rWf+s&G{p#C=_#a?+@SoK7J!L6Gs?_ z^CVTMbH+5hV%_=V!vomP#H?P;!PqPE8ZcEOf!S_|(-*44t&{8NEQP`ipKmcv-xcOf zus-e1@ZGoQasPtpg`zU(IjM1iI#J@dJQL3J`Lv7Mb=RV1@di_iBv%_6qnE>*)cAH>NYJ2)`no?n^zK|+?)QcG^cdKaaz5<64sAQ? z>hn!33~O<*miq? z7wr6o|L2TVIKFDp0|^2WOacOe4VpM;X3k*{ki1_ulM>ZI?M-?^FB2 zu|k8P`Fk{PSQZ3uGY^r+=H4m$mRd)iDw!)xE?1DVwvNGl5F0Q{gvr9DWn=A5+Yaen zc!uaej`2{AG#xl>UII-2AnW~3r*jw<3}gl3t>1OzGr(C8gbLDgoV)`+p$+5~^owRP zsH?@i{yali!sU0dTvFq}@tNecs_yiAz7%FP4o(2Qb7s`QwTowb8)=?;nrWTFfi=?P zI1OfC;MtcfOJ)M&@k?YF>GPf8uTe#;C=qqsP~TlE3cNs#k!rT7Q+Z9ghprpd$n(N| z{4`q?f0-T$iQ`#E#VbG>hIx)8YOBrdY+h7p1qz^dj4^N87(cHX>Y1hRrCr;?FglKM z{Mt^$^oBZ2$h(JqhT|kg68PK@^9=ujV^GY1l}DeJS!s92QzK|of)|Fa(K$&t-jq;> zE;>ucX;G^JlgzjBb8DymD*U+r2^u^F(^}3Lg`z}agz1;{X?xuNiW@z<~H{DxuB6~cnBB~Lcwj6;3-2e z>f}I3Rs=Gy?!7P&ZHPxW%RBZj!rL8>(Z6st5dtD#E_5JEk zI<3tl>}0Ya%~f!Q79KO?n>*VlJK=Jc-NixtH@Aq**bN) z*23DTLs@oN|8Cw%zL#?^>)*#&di=Lk^MtoI|8BT_^6eu#cH!-_Uq7>Z@(oyfzgOM6 zTKau|WBK|k((9*HvAy2Pz}S4$;FiI`fEh4eE;e}_R3wri?0?&u5<{pl4-em{muUyIYw4l`Zv@^`Y-F3UcHxJt zi}CL#`&OoX&IuN*Tg5Wj_QgEIvro8Ke7d}iI-68Fe4EnQF1%k*Cd=v%?`Z zeU=%&x#vZ)3vYWW*l=C7Va-g=Xuf%!%5f|&WTkG4}*||J{}Bjl0+M(VyuJpUZEDZCiirW#AUS6f7UqU~u!m<(n1flim0~ z2&u927o3W0*jlGxSe=^lcGHb~(VKi`>k{U@c<^XW=#q=V2}}RW1N`Hn4_ zt6Q_EM=(P9u;k1aauVG;Kdn;umzWyS_ra?6)PyT0B5x$PbPgBlJgk_Pka>pr1$)wy z_TJOFmw4l!TaN_u==Y!3PkG`ITzvY~wRX9>Cl|NAmaDFLylnZr zx@R|^&#PZpeEQn-xVqHatJm-SdF{6Ky~^#`&)4E0=W2f6{r)$--lG2DqxJh^fBo&Z|G%iz@Br@=yNuWyEN!YS%2iR~hs}Z;Cw_Qb zRC>5e>}Blgw*K?clP4wK+)!EleFEptbH&Q9jySKJDV+Yz*UH~JSZnvzL%041r!u#y zzOv$bDU)ZRoZj-Y;Hej1$p-#qO>9yb3mUN!|BXAo9kLJbW@Hj!1`UsMFsz(q9BOnP7V0VBm>a0u0Rs&{F$RWcXW(FPYFT@5+M{diXyXpf1S+`*)F_Ce@i|ZgUiT#D7lB8j(Y1fMeOvrBPbH8~}|d%?0`$oA$g0X(1z^<)?v0 z$e>u>0}KPOc8JfB4Z#`;y{pBnyY(3u;zC&&_)$#y!2>m^xTG>C6+B&u9tP+KO2YIv zFmA9x(TsMyB)U21^P~uK6pLWyAWfp6Ye%1WL1^bMgK9^chCw$0eIf#3f@3+<1e9qB zbp7a~#t8jaDxvz($B@yDK<|Gej5ynXwKtA#0D4CkVZhQxWCO5ud(q88?>i#Qn%9JE z7HUrt-4yh$7Q&RR&CpOm>3E^*M{f@z^ar#fWiiy&VSqO)Fb9Ehl^{bRFnc)lf_MP! Camu*> literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/internal/endianutils.h b/twml/libtwml/src/lib/internal/endianutils.h deleted file mode 100644 index 3b27797d7..000000000 --- a/twml/libtwml/src/lib/internal/endianutils.h +++ /dev/null @@ -1,137 +0,0 @@ -// -// endian_fix.h -// ImageCore -// -// For OSes that use glibc < 2.9 (like RHEL5) -// -#pragma once - -#ifdef __APPLE__ -#include -#define htobe16(x) OSSwapHostToBigInt16(x) -#define htole16(x) OSSwapHostToLittleInt16(x) -#define betoh16(x) OSSwapBigToHostInt16(x) -#define letoh16(x) OSSwapLittleToHostInt16(x) -#define htobe32(x) OSSwapHostToBigInt32(x) -#define htole32(x) OSSwapHostToLittleInt32(x) -#define betoh32(x) OSSwapBigToHostInt32(x) -#define letoh32(x) OSSwapLittleToHostInt32(x) -#define htobe64(x) OSSwapHostToBigInt64(x) -#define htole64(x) OSSwapHostToLittleInt64(x) -#define betoh64(x) OSSwapBigToHostInt64(x) -#define letoh64(x) OSSwapLittleToHostInt64(x) -#else -#include -#ifdef __USE_BSD -/* Conversion interfaces. */ -#include - -#if __BYTE_ORDER == __LITTLE_ENDIAN -#ifndef htobe16 -#define htobe16(x) __bswap_16(x) -#endif -#ifndef htole16 -#define htole16(x) (x) -#endif -#ifndef betoh16 -#define betoh16(x) __bswap_16(x) -#endif -#ifndef letoh16 -#define letoh16(x) (x) -#endif - -#ifndef htobe32 -#define htobe32(x) __bswap_32(x) -#endif -#ifndef htole32 -#define htole32(x) (x) -#endif -#ifndef betoh32 -#define betoh32(x) __bswap_32(x) -#endif -#ifndef letoh32 -#define letoh32(x) (x) -#endif - -#ifndef htobe64 -#define htobe64(x) __bswap_64(x) -#endif -#ifndef htole64 -#define htole64(x) (x) -#endif -#ifndef betoh64 -#define betoh64(x) __bswap_64(x) -#endif -#ifndef letoh64 -#define letoh64(x) (x) -#endif - -#else /* __BYTE_ORDER == __LITTLE_ENDIAN */ -#ifndef htobe16 -#define htobe16(x) (x) -#endif -#ifndef htole16 -#define htole16(x) __bswap_16(x) -#endif -#ifndef be16toh -#define be16toh(x) (x) -#endif -#ifndef le16toh -#define le16toh(x) __bswap_16(x) -#endif - -#ifndef htobe32 -#define htobe32(x) (x) -#endif -#ifndef htole32 -#define htole32(x) __bswap_32(x) -#endif -#ifndef betoh32 -#define betoh32(x) (x) -#endif -#ifndef letoh32 -#define letoh32(x) __bswap_32(x) -#endif - -#ifndef htobe64 -#define htobe64(x) (x) -#endif -#ifndef htole64 -#define htole64(x) __bswap_64(x) -#endif -#ifndef betoh64 -#define betoh64(x) (x) -#endif -#ifndef letoh64 -#define letoh64(x) __bswap_64(x) -#endif - -#endif /* __BYTE_ORDER == __LITTLE_ENDIAN */ - -#else /* __USE_BSD */ -#ifndef betoh16 -#define betoh16 be16toh -#endif - -#ifndef betoh32 -#define betoh32 be32toh -#endif - -#ifndef betoh64 -#define betoh64 be64toh -#endif - -#ifndef letoh16 -#define letoh16 le16toh -#endif - -#ifndef letoh32 -#define letoh32 le32toh -#endif - -#ifndef letoh64 -#define letoh64 le64toh -#endif - -#endif /* __USE_BSD */ -#endif /* __APPLE__ */ diff --git a/twml/libtwml/src/lib/internal/error.docx b/twml/libtwml/src/lib/internal/error.docx new file mode 100644 index 0000000000000000000000000000000000000000..b9ea1c02802e7dfc84fbd3558152ea729748d6b7 GIT binary patch literal 37063 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

_Z*@lAxge;{OI7gThZKgtg+ki|t_x#w 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 ZLv0-fc(Vd?5GYp(G9&`C$CMrr4*+X*Yk>d& literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/CMakeLists.docx b/twml/libtwml/src/ops/CMakeLists.docx new file mode 100644 index 0000000000000000000000000000000000000000..e6f5b8f76eb857d77178da46ece4dd96f05dd27b GIT binary patch literal 37691 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/CMakeLists.txt b/twml/libtwml/src/ops/CMakeLists.txt deleted file mode 100644 index e2feaff23..000000000 --- a/twml/libtwml/src/ops/CMakeLists.txt +++ /dev/null @@ -1,79 +0,0 @@ -set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) -cmake_minimum_required(VERSION 2.8 FATAL_ERROR) -cmake_policy(VERSION 2.8) -set(CMAKE_MACOSX_RPATH 1) - -file(GLOB_RECURSE sources *.cpp) - -set (CMAKE_CXX_FLAGS "-Wall -std=c++11 -fno-stack-protector ${CMAKE_CXX_FLAGS}") - -execute_process( - COMMAND - $ENV{LIBTWML_HOME}/src/ops/scripts/get_inc.sh - RESULT_VARIABLE - TF_RES - OUTPUT_VARIABLE - TF_INC) - -if (NOT (${TF_RES} EQUAL "0")) - message(${TF_RES}) - message(FATAL_ERROR "Failed to get include path for tensorflow") -endif() - -execute_process( - COMMAND - $ENV{LIBTWML_HOME}/src/ops/scripts/get_lib.sh - RESULT_VARIABLE - TF_RES - OUTPUT_VARIABLE - TF_LIB) - -if (NOT (${TF_RES} EQUAL "0")) - message(${TF_RES}) - message(FATAL_ERROR "Failed to get lib path for tensorflow") -endif() - -find_path( - TWML_INC - NAMES "twml.h" - PATHS $ENV{LIBTWML_HOME}/include) - -add_library(twml_tf MODULE ${sources}) - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "$ENV{LIBTWML_HOME}/cmake") - -if (UNIX) - if (APPLE) - set (CMAKE_CXX_FLAGS "-undefined dynamic_lookup -stdlib=libc++ ${CMAKE_CXX_FLAGS}") - # -Wl,-all_load ensures symbols not used by twml_tf are also included. - # -Wl,-noall_load limits the scope of the previous flag. - set (LINK_ALL_OPTION "-Wl,-all_load") - set (NO_LINK_ALL_OPTION "-Wl,-noall_load") - set(TF_FRAMEWORK_LIB ${TF_LIB}/libtensorflow_framework.1.dylib) - else() - # -Wl,--whole-archive ensures symbols not used by twml_tf are also included. - # -Wl,--no-whole-archive limits the scope of the previous flag. - set (LINK_ALL_OPTION "-Wl,--whole-archive") - set (NO_LINK_ALL_OPTION "-Wl,--no-whole-archive") - set(TF_FRAMEWORK_LIB ${TF_LIB}/libtensorflow_framework.so.1) - endif() -endif() - - -target_include_directories( - twml_tf - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${TWML_INC} - # TF_INC needs to be the last to avoid some weird white-spacing issues with generated Makefile. - ${TF_INC} # Needed because of some header files auto-generated during build time. - ${TF_INC}/external/nsync/public/ - ) - -target_link_libraries(twml_tf - PUBLIC - # Since we are using twml_tf as the "one" dynamic library, - # we want it to have the C function symbols needed for other functions as well. - ${LINK_ALL_OPTION} twml ${NO_LINK_ALL_OPTION} - ${TF_FRAMEWORK_LIB} - ) diff --git a/twml/libtwml/src/ops/add1.cpp b/twml/libtwml/src/ops/add1.cpp deleted file mode 100644 index 66281841a..000000000 --- a/twml/libtwml/src/ops/add1.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -using namespace tensorflow; - -REGISTER_OP("Add1") -.Attr("T: {float, double, int32}") -.Input("input1: T") -.Output("output: T") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - c->set_output(0, c->input(0)); - return Status::OK(); - }); - - -template -class Add1 : public OpKernel { - public: - explicit Add1(OpKernelConstruction* context) : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - // Grab the input tensor - const Tensor& input_tensor = context->input(0); - auto input = input_tensor.flat(); - - // Create an output tensor - Tensor* output_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, input_tensor.shape(), - &output_tensor)); - auto output_flat = output_tensor->flat(); - - // Add 1 to input and assign to output - const int N = input.size(); - for (int i = 0; i < N; i++) { - output_flat(i) = input(i) + 1; - } - } -}; - - -REGISTER_OP("Add1Grad") -.Attr("T: {float, double, int32}") -.Input("grad_output: T") -.Output("grad_input: T") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - c->set_output(0, c->input(0)); - return Status::OK(); - }); - -template -class Add1Grad : public OpKernel { - public: - explicit Add1Grad(OpKernelConstruction* context) : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - // Grab the input tensor - const Tensor& grad_output_tensor = context->input(0); - auto grad_output = grad_output_tensor.flat(); - - // Create an grad_input tensor - Tensor* grad_input_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, grad_output_tensor.shape(), - &grad_input_tensor)); - - auto grad_input_flat = grad_input_tensor->flat(); - - // Copy from grad_output to grad_input - const int N = grad_output.size(); - for (int i = 0; i < N; i++) { - grad_input_flat(i) = grad_output(i); - } - } -}; - -#define REGISTER(Type) \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("Add1") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - Add1); \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("Add1Grad") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - Add1Grad); \ - -REGISTER(float); -REGISTER(double); -REGISTER(int32); diff --git a/twml/libtwml/src/ops/add1.docx b/twml/libtwml/src/ops/add1.docx new file mode 100644 index 0000000000000000000000000000000000000000..b3de720ed22ab7eb186ab4390c7ba926be704e9e GIT binary patch literal 37513 zcmagEWmsIvwm*z(a1HM6?hb+A?h-U;<4)tj-GaNjySs)BS5@!cO0tkpm|$RFaA0L=+**|?g>gyXU|?e~U|<-aQC)F>owJ#pv!R-Y zy_u6fle?`=W0Jh$stD?rvlpynW+4(UaTKhw9eWykhB!Ql>hv2P?Iq?DIf#e53BEA( z8Kn>yrnrpMJ0GIeI>9dQCMsQVi4%SO49$Ep$YSsO^*p9ibM8IKI8vEK>0QFPL71AB z4Da{TT;MFbHT`^s=)q@VIXVGJS`T2+)Ri$B=)^<8a4Ldh(4p1&Gu*iy}lw4mXeBH<%#Qh|*UY3}sG%~Hz5!(EDzJ?i{t4n<`YKR|js&$>DuXnUicc@$K zEkt%7LIj|G|6$w1?Qoke>ts{wf?atz6|x-UtD1!&!IpPsxP5sS;;O9=HoFBY%w36I^8Yf_geST>M2lrIqK z`8si0WCxTkTIuRkmeAM2?j<@n+chy?NYBS#qA#)u)HK$f56E5Y)!L-JXlOTFgG+|* z@F#Uw+X>RPNsG84M;0-oy5lm}AQ7V9z!=n}tv{U+trC+kq_dSqE(t14K)XhCrqOiq zVVniP0HoxaIKzu8TYuQNh2IM|IZGS)i5$h+qp7AUn6l#V6d=nuU|fsK985=-#kOW( zw>`Eiebz0%U^)yGS5!4{r?`fh>_8vjv1kw|o@v?ru+K+GKe3jKnpY6-f{XFvr)0~N>=V4~y*uyXWM*y`layAo~k4`0~}t#dav zLz)D~2NQ?Ho%x%FBWh#4t{P*nJ!MJK@m3}U^_}%R&R$Yk@R^MDL@49EL#WAulu2jR zms<$sBOj>aP8z@)2Djmh0!wp?lywxV8Rp*+vN0UodUm&3lQqZpt zgGMU*8D=y!Fl+=Tt`E@fP{7$mlv7pQS~S?U!cUwW9X6+3A@$4OHHW-IPJW*|b5c?v z5|9hGrt7)^7$~eAo}1fQV|1eQ6LvOjVXwh>X&UFDPWc4PSkFZsb`!J+fzM35yS}hw zO;41;EEdgxl4+Cv&d@cPcUbTH_TlyY5&``^_XQO0kp;2=?W~*l>vP{F{y+P2y}F8X z4C;#w6c`xl-}~~(-u{oasEymLvY>W6(L?Dwhg-smD&xinEQrpCujAFkXEe`^k$sGV zYGvI4`aFbU@qS^x3FEKle`*+eS`;;hZBY2Ejy3*}H=^XQj?h>gKD@s=c|hg_RR&#( zr7?)6?_fARRyhyD2=AP#sZ=%QMOJS-aX|!Y@1#gS?Yx34veDpG)UIIf{q5OIMDmww z?ft-cl2YT+##dz)#qe^-m+H^u9wpO)oF8^?jmI(0Mjg)=y&oYt51O5YqV@F|22o$mfQML{#az$ zTV$w5ezB!zYzev*aabL~*o3B34By%@z|}8qo_7hAmylZE;g>(2_A_fR5=ATtmfO%M ze5PiEBx}cO%0KQfRgel+4N+4h6FwOemMJ-7%W9=XBr09)$eiBeABZC*wr$BFz~Y&KJp zgeEmNDfmM&aMZnQ6ys6`R%L_>6+d)#q%%J=6P?4SKV0Fz&ENbY{^yNhHTGpE2^tJ6 zgyGK*tQ)}5lo|A?b+H9)PQUMr6P-7w6)wy-AK&1qPHVYzqXg3ir;nb5q`X!7eGtpc ztI?`9;8r%H)T7@TQr>(N>!RfA&9!?>ows2b#=m=I->ILy-{^S34F3Evs34=U3D3n1 z5pDm1N<%_lqJ{?B4LB!R(C<7bjgX} zr=oO_nP6VmR(y=w`axX(2l68fiy_IaUu{T>k;c6~WRx}5CR~Hx$3`TdfpcWP4*K;M zeUR=FCoR{c22A?4wnHP}=v%N%mPo7O-C;iuY0b#uskl^Havqo#G18+=jDP+$;czHO z1a@Ae{FQm%ty13KJjFYt1!cr}T)D^*avF^SswZO2$bey?E z$GNs&Rtkvdz1_J<%OwnHddPCV0VZ%cBX?~kL(pCCz|lSvSjIFUlk)3dZs{1BT+L%V zUe0`A2ZZ-0yNvcOXZCYXJ*PgXgiO<1^;3|Hs07I{Ns(sr3gHaAhbKT2ao9U=5vsk` zFoO$Cl#`q&NOqQ94uu;TH;u~h5a=Kah_koMnhJEFT3HGOr+9CYoda>wYa+^bmf`#q zIQ4K|VWE2#kn?F?<5S!te_@a`!;Xw$t>#&O8hyzZ|$+eM)DS6e`6Tsm^7l@5!xCwjii6 z8w`*pD;nUFIKObqikbJPu=@JZu6=bmW2WY0!Ah3zNEi%NqIdhtBSN`^=f<*EyUG{t zaTQzNsosNK!Brp5-_Fi zl8%G@0TU9oEYjYU2_q;;jqJi@623MGMjOd=8fWRMm6? zFN}aYL_u1K2d7*fKRQq$=d-AlSgZ`@a<7JM)%SgI$o@m#=$*jC8y2%DomOn@@0yLv zh}7X02%i~qN@GZDT;|e@^!bV_*D@pFR|7=sM8D>8JXH6GmOdDm5+JVDQoJ*vEaP0% z2DooL+~j#}{6yI<7=1SL>UFTkbtIls;X}oFXRTn{-lR|a4FHVXWIn7qf?R2FA5!M$ zT(a`-R$ifU=O=(J@!!7)*Y?}G&o}w94^c(xBgz`7aAm5Ta?M`av?U7H1~j#9!dz;L z<%ny-&HW zUB=(p5y&wR6(j5tr>Os9$Tf(ssr$G}3GsgJJ+M0S6YZd|r>|BY1c@E_YK=iH&(^{+ zGqxUgzQr>>`x`9Zu&$2Yqfu4QYIu%JoVor1<1hSKk0uZAD5-!Ch^0oNBb=^Tl<(d` zUa#mseDwMjk8HG4is(~de5)-Ym57$;mV66Fx3Xfq@wn^oeGji?`swFg=GE*}$o4eO zI?9KfAeT`fLZ$dC;(43dhZ3Mf(H!-y@)k0-G(IL|(6 zYC*{ElxO)hihbYeFl#+^Xn&a9s7+G53CeO#w{xn_RJ{F^kh;DK;7Z%Cwz+6|d!IF> zqhaFawmDBv&GLG|8JX$a%dB;!Eb!&wWr$upGMc)q1-c~s!=R6}RADhj03^g`gA=?< z@+tM7t{F5=>9toLG@rPfK6Vbt!LA9TaeQmYrTMA62RYVRluk=C|K)wr+oV%?H!ATf z^gq{dJ3oAMHqhoi4%*xaK%4s?Yxti>)4#9ee;!j4MHK^CaKD_rBJ>3(U>4a$y#JL) z)lMf>UFaPwwGw|TzPG8nZpt9Oo7$qZe< z0wv|Rr(RlJ)Vh)cp0B2tt8+;}On&C1HtBQ4!N)}TXN1~T%7HoripE?!kyfm#sDeW& z)%Y)U+&U225;O5%KZRsxIeWH~T})QBTy|DiZwarbIrVNS)N2Ivp+VIy%^T^Hb5a`Z zoE?0-xi=;7eStMVFmISA5HH&Ef0oyaLN|ocxXXa-XTLYH9NRTtFaeWr>lRNDXDh79 zP~C>SEM|`o<)N%gQw_2Xem`l=V|6`~IN+%O@9YH&A-pRTSxm6QOQ>b7Jg)iSSg`N> zE4n`kwJo;ON{Pn4(V8sJ%Job&6z@aecjkZAI;tF-KY|$y%s?F)4CP<7c5?QxF?0H3 zx7629*paI9>F&IGqE@j!_(qfbg^*r@vi>;!}>*g%6$9N!R*hQ_K=X> zBafFlfmhqNwvAwB;0m!pa`E|e|3OH~-uC$FadY|0`0-_f$C?dyu`qE(Z%?P<7v9jw zy0>e~dL6H)`PFexw{YP%do4ge+FkqZ)&7n9`;+pK&xUs)#f$yGMj@hp3*d6ru$Q)- z>*A*`3ZHUPCXZ@_PlYpIv4!LuKU^qn4~GQa8#1pxfke4&`fi+{j1QkYuKVzOdl43! z6g<(~0G;4%z4)YjiGV^BzEr-0Z-}?;vlpkwZsWUF^$)lokzn1IgG@TJPomSG&XaB~ z-O~uU$FC!Rj*Ol!yq@G&3FW)AE*@PTD{I0MVllqK%&%Q*UG2>k<4J?8zP9aaK3#gc zXI(Eh;*aJkDMbAao9oOdo4~J<#NN_bC!}u!)eqgqz18FMRLS+v&N?ALv@}XQ=XUtc z^9{WA6k(u8gj%~d{|N?Zby)0m4GMH&$SFGCbVxl)NOhI)OO2tAwy+ORFmp$Hj9D;_ z@5}2!zqv2m%k}z;bDG|B4RE<*Q$VoN?d&uph5Iy%Tk-hK$KVVoSe0$J_=Yjil^of! z(tVP+ITMS)hw+*Y)s;s%fI*lzxq8}dW=$tng{?27c{pLI5_#V4rvGQnrcV{7iMEyTbIRhuo`X{b zc0tKw4BC0?)8eNqHCn5IREzt-w+{WPh3Ti0*+=_3hnHcQ+biLdGocJ+sYdX5!>Vb&M-}de)eb0#(71NtjBCMdkg<8{x*OW=} zh@i!ROAvi3VC(96Y45op$B$Th(=zk+f66Y21Zc)EXIgf|Hiri8nso#Vpp7LN#QIuFnbK)u8RCHgFIA4 z5LP;9Nf2!}Dl+q>;Z(@!(F5$`oBc>Ke(3YZ#Gw{sb(9BhQ3AlVc}8_bP!%q*QG*gX zphp;WR3vvmo96xxiT{C$^}MXY4oCq- z{au(VK1h!WD#$Bl!w*IhM8^M;$VdW5?STmQhw8Zmw?@>C-%iLKu>7PQK7+ccP?wA~KVvPhC%^ciOy-rJM?J8?#jX(LpIwNk>2&A~O2+f$(HQidDS;A$6> z?{K!X?XhG0LF=!9a6t8re^m@>sf`bfK;PAaBg2uy`<3%e{)Jgv?sn#sG2;X z+=zM`tn#izrk#Pgc$l{TdX6vShNcx? zIFpy*BWA0g^{^IAl08}Q&5%IXq$rwOHm&p6F*RH`Ud$GIKmo0vaPq$1BafrIkF&3+ zRz0Z$8xAh%_qI>Xsy~>7pSwB{KJv>A4(;su%5q_UV0Prjwh;1I)gsXEvSk1Yytz35 z^VEZ=ncXbg^NsM@&7Ws*t-rhy1x~E)!6|%T2P%D?p-Q1IjT*z4*Jhe)9=xGIoK0W= zS2Q-Qe9WL4>H`y5ANb_48v>Zk4G^e-dWqz&2l4 z;7^KZzl1gE^d=#b<0JO;E8o@g9JIwisjoyFM_*uhAKjIPWEqB$r#7YFwsIZ(wz!!V z0eW)X4(;3A6B+_Qi?0l|SV3enFIP zVdCg@&XwWT`&TNl8Q%GCHEZ@E@i{ax9&r0}-SEs08?7=fc8)LGa zq!b>YPvUkF4EOfx=DM^+7;s*|rA%{ZEH<%vs{*%`>vM*R;9zX}8Dg z;mg;{p+V2~7Y7gE-D}d@!pY<8&*vk1mQNk8Ey9_%%+J%q(4MbgD9h;{EkaO+o9)dh z!#AW4DsfMoMr%R&C8thK$ddBoRO8vVDag{1_-!3(r&%hkvVnkaRr62J7~S38%6=D| zI?w774-F&_NPs7-8f^NTc$lV-NH(PJmyXi>@ynBC(`K1Ci=#{x+THep#C}~JWpxNn zX|mS12&lZTAwmXonm&I18QTkep_^YcJ*raJO-A7DmQ|1k&^BqzPNK>i8@~_cogxaI zaEzH?KUNzmHhe@zlv*JOf4hUe%<8N+B=uxL^M%Nk8N7lq?l}BFWX5~|gVOV>1 zbmAytFQ-aYlQ{R$nr<*o8(a=MT50A4Y#bxv{ybvSvK$J?*^5=oc&lB;?siu+m?IZ0 z@jh0!Pu?!^<0ODtK-C+gNke4Q`0)^7B{lL$xG8@vhk&P>O8ACW*yXY_j?cMRQcZ`2 zS!u@am$Naj7gOSn#yCiRU(u0}wr&i6l+?7=M5PSkEnfC|)0z<yZ^}~+lgMJ)fMCHTYz@6jU<9-zZO86_v(FhdOdI%L z`o}f#*W4nR4MWa1J}pBQ?+{`PG5wg}x3N%jC|2NUr+T<}p2IR^mgp4SKu%{bRlq~h ztD=y&M)+2Py_IBtS3&>dg&K%exZrlBOna1dTgf#)irjHE!{kwzS*=k>99KQM6E|i& z7r(-jNmKKKKMb^Y7%+t&xi(XqSSil0s!(mwPr^x>-IDCPxM)xBl2jfzwDhJ*D7Z2f zW*N2$X1%SB?2F0JM}Ms35v$uNLDZ=5wN5TLSyNeUm2PrsH)=29UY5~u)Uz68ji($Y zY^HdX;+A1o_&CWU%C=j8Xl`RspIRVTTzH#7w(PV5?Pb-n9U&i!J?e4iQC<~)tQ0?> zrNv>qqUdt4Rarsavb%qTtBs2g(?e>4GJ;wM`=iO`%z25uiJ3BGk1VpciUEvLo*wa0 zYcaau0k*v>=lQdW_2GL8bUY~;Sryk-Qm-insbx~es)|RW#m3?u(RJ0HjU{V&+?(Z6 z!n?z$JKn6fGGtppT=QP@Lc2V^RC9v5KK_D$ZedZmnDX|1!Bz8u5Zb^xXM1f-c+)`^!@)ErihdfZ4Ds@?m8TlsK3M#Y^z?FA1tn!Moy)MwrOJv9w?+MG%?@UqDrO+LFmzxo?{g)jG z-zO)u`9|zMq>zx_G%(Y05vLY8go$uRq^so7&!j?0W=d2K3}dmV$J=@LdORxc-O=GP zBK_bqnE-v$x!Hc!cV2s+4`GX}^7*Q1lH+GO_+tgll$r12cL&Jp?MbGFfyd63Vc$TX z=iD4%!fGNWB(0Dc4R38wEheQ)9y&+H+Q;We426*KG^XBaZe|?zRZZfm-GY2}bGq(d z-BT&;#VG0BRgdotcG-a+cm&=EanXdfd8`MUTXyg_DPcHSS?r1)AM9Vg6;E!vBSd*k zI}alMoVxuEaZg#!k+`?)&ilBK?DgmiY))d!PD6u>cO^7S^PyAtIfDFSQX0uRx!I@c$=8spTe-GJ!w zoa*^%)*K(B^YG5$@okc0enCqO>8sEk;I^(fv63ZG46-AWxSw~H4Yrf!U4 zmy$h1H9_*X^k}CJKkl5#3y3BLy9Vo+l$Ac$O(kwe}J6BZ6Tz~ptlhifZ@JZ6SU!+ zu?wmZz(uW*K@4E3Ee6>4!x+zoUWV2i6^dN8;X53)!~lF#7Z4kMT*HVXWY<#3l-K6(c;E##FD~)vuAI!Xf0w9W2LE7d zSekfkmsrwBXAgey-p9rHgSra;(~T{R%F0#cKcF+%3(kyr9^`3>JkwuzB-v@oPqA8>V_=|I z!f_PL9Yi))zOpEJR-{zpA~h0zD3ou2;GXM8JtylFO2njo)n-sf7=5Cq z#9W=Cfp^n~Z;5uKeiD-J#?BbKs2Wkll(&(gUe9R$80ks76%3K3#5_sr*`n52l428L z%5ORMRNcQH7U;U0l0$M=*Ow~7#7Tqpo_+BO#bs_&=>sJR6D$o%FVKxoDv&@keR5d3 z@a)tu`E8weV_NJ=BELdBl9k^s`6tfH51s2rr)#NwYRzHQqf76r1{uuKP~*wS!`vy- zN$cHZSIsi>&q;C0B0hJI=uiwpB~jxLmStRbn=fG>@?%x^TIN*iY|~}tG;snC@A&N6 zFzg<6*a@db$>nnFRvuF&feZ4&;+6C2*Sb*~c^iPFaJM-C5*uAfD78S9X{3s;7Tu?> z1nX%Eq16~U9St$F(3QZ^fGj0`|0$|=&BEK(Dk-Ahr(1cX ze9+6F2BpRTafFM4iL3@ScmDds`rZ=Tdj%VO)HS{-fp(;&>ny5@+yW(9&Tzf~PP%J` zZhm&@;D{a~e%f-!$psVKBLt%e+<^Pk7X2ji}`+|Bg zuKwV2akZ5W6vgJ}q$A5;PB&QKqX!%pt$g8r9rbCmk|Ouolb|Bnffv`~m467nfx;xz zbe$E-WR#ag3CvI5#865&*RToD*sbjZ5uU)8d=gONQ9@Jde>xjBEzmx<)Psg|4Z{&!u^D+ zvbg}v#91kd+l1ILFhbqlDIHbzOy_22oJntXl$)a0>CLXUpU<5TzQS&;v^Bg_D%ICP zD7a)|glYmRsk~Ev{y|4z*_A-^Vw^+rI$Hkf(E51!P~(gEY0jq;k&=c8Kk9>l19>a* zkY?aLbx8Hp9VKEx8to%z16<6SuHl_VRVQh3Z;rUSx@ZujJ8LK~6+EMB;TjwBzl!3TPx?NhKN7>ei_zL3>tj#N~~rt&VbcFYro@d z1CLfFtxRTW~p~muS zlX>k+|4k!#d76%L(PFO5Z{N#;zkTZ5o>5l0W;K%6+NdDpiRaKq~uTf2)K7ul;H~-1^g-W#3dB#}>g~ z8rT#k4Kmc9(1e6BR7*}%>z$-If1EZB+{n%CgsacVe-KwWI!d96G*_)EwdD4y zfcNIW;_iZAFP)jaTmKNk!mO;GI%Om69`f(sw$d;Y*C@C}57>|z>nGb~hFDe3%HV}v zm#$k&_|m&@)!auaN=v%vDx9dqqZgWN1{-8GG3j0O5`byvR5Jh>4e4%l@NX{H@12qJ zR$opR(DYRJE{fRC#S|P2tHVtux1df|s8aHfY8Y=|mIk=OY|&SL>3odWwlOonFy2Ym z8lvv9%ozQ)n}ln@SVlP|lTp7)639~wY}4G&m^ZX3Yo@0L4JPndEULs0nA#eRf8NOe zB~AUA#PdIsk|y^UZ}u+-c*C5~4}Md9tw6Flm(Rc$zaQX@Vt?=1fqqaS+4y_j72g!~ zU{3LFETjIC22A#a25cwek8wsy8My_RCKKwZFf;F+jG@$bf(Btu3wb)f=i8CkLYa>KMHdR_X%A@GB76pROtFY6<%gsg-ph6R&aSL=Zc<`ymuUREYX9#9LW97 zI5JyR@Sc6oLv2vJ7rD1=K@C>h#`syhW-~K7ZjAJ=+%ltUnczAPg7&W0-6J_j5$W^Iy{nV?^ z%K(nn?;jc)+>Ru<5}7H~j|O=Y4I?A4is+rKJwJz(n6pua$FO~?GS!FfPHq-J*-}HX z7|Dtefh{mVA3~{R%)@|IXW#ruCcSpnLd!U3W5x({6t5TbQnkFbda8lC(U>=aZ(cXY zPVVutMQ7*@rfdc3r)o89lN#_c^rH8F3j0kh`v)~Th#FS*_vw40bz=c3+2{{ySJQD2 zH9yy%)ZZyFB9Q+N>Wi)c_>Qn_!wv7&51mHvN0nv0=ytPN3=IBmzeu$LI+`fjkA*QJ z$lXIVk!5QJ?6t^Dx9$4lxlD?uYX(F*cYD!)pRx~0 z4g2r~pdtFCjLr)JSsF~9C6?jW(z`FDX$#fILh@;|4Ubq797qzgV_s(3N1b({MJ|3t z@Eq-N*-tA+Igk*7FQ=5|sPYM%-51|V71F5Q-$~4JJ#p@9hHpZE6lE(?UwS&mm7*o%!+VScBGUQZpbEm)`9(;Cc-Y! z6Y!SI$I$2MdEK^H@h^`$cSWOve*?Snnl=5yMRWV(_~1} zZ<9QTzfE@9{{NZek+<%iZr|sq1cFRr6j{FU*<`g466NDy;qgbOe=?(TAOJm4t_xe; z+gUz20B>2NW`w+!OlrWC#?sP}W(t|7-*5ID#2vdey{h=QY52+U!5wJzO_>)$yjOb$ zbyjzRR~HTv4#8{56!itcbE#!8&TGH2NUc^JZ%vO-5gAT%?CPl zY(a(+fQk8qf`5W)A(2TWVJ@NO5v{y24T*!8FoC0I>9pa>g3W44X$-?w0;nS~+qcJ< zUqEy`(QF4BGuIml5Ib>=>Q2Lb@vkoS)`wSMS3`9EBIXikzh7$)7&w+A5 zIN|d50i!lkx$wyBzeFov!Bj+St-u{g^hrR+40muQX>{fh#3OhErDKGdPaR-axP6Fn z%;~UKq!x`7f-XE6B^*Lzi6QOiF~DTGloEQMMxx}{IS znkX!_gNk=j1}feO9PEg{O$*dNi)Wjy_gC?1I&HeXPA(;|{G||~A93%PV0#>&da?)7 z%1D(ur_`MW&a;#N9YUQB7J4gwj8&9G!d^{gK>5Vm#}6k8(606oyyktsTfSkh1%X0g zaTCJ3pu2&9(9ymTIYGOc*>I$JuNzzd6gEqj)$^-y)EZWuENS7ea31Y?GMB0am#M{^ zZnzxi$6I-(1~fecJgi+L6!sslUEESo3KT`9jS?QzEE%Qxgjm zn9uLSI}eSfUv((9TFbKU#BQ2u?!E2kL0Ce(3_U~JB=0JYLJK|1T^dY(BA*H;TgNqg zvgMrP&8GVZ9)su_``Bp5cU68brr7BK&)SX5(miOzVb6nRC7PPulanJwH{UPzSfmz% zV4Xn5S7oD_Smxl>_pI|d;5)<>B30LcSD&KH#59<_>_l~h6v=*w3C?)Bm(xYV2HBN$ zw`e@ym8vA|mcw?T|H^M3dVr`|X>$(Q{v!B3cjoi~`ILbx{@61V40K~l2@&@9nLJN5 zEl9)}2eT)2wWw8`{Y7v7a;~qNG(Uj95U7u7!yZz>?7|*gzQGMVEB!*hK|Nn8WHQ$Q z#62`_9w}r#l;&Zcx13A%G+M7a?`v+zeNzEYNl#QmP5{{KGw1AP<%0N>_Cdu9dVqh2 zXat1F5BQpW-V#4i?YNf3(v6LW(bW6QAPl#JrLdrie#H*9hJJONhZg#<&C(r*b8llb zEqBbw)_t3vT*fY}o(MsN^NZx>Pb%yM6#ycr2#^!gsnghqDTKM?G*=k7m<`j_o?0V9 z-ABrwo}ML!lhzM3IqeL;8eTD)uPz@Pz^HB)Q|w!SwNUOaN|K{qiPuJOU%m8TD<0dP zURig(aP$cYOa3P6nyz-OOrLrl!}r!bLh1t5!0!QixAfSaY%Z8h*k4o>X}CNj_!_60 z2x~z>&slHzbX$G*Ht3=88$(Cb+4FPHc4CkAf46En+w+$S4tr(u$n%P@w8&revxhC! zKQ3bHzI^dHxAmDd56x0;ptW8b=yY0uR;I4?7rmCT`3x6~j{iP6$8;!JUWLr$E=Zx# zo~Mrr_6yhEx%8Y)IMl#EY%_tlaaIT(npuFqBr>p=94u4y_~&Dpoy06*E6{~8Pkpm` zQd0I=nzI7Wcw^*2(U2JQ6naZXahMD-ue7|3b{$&3NKv3npxXtFyL)17V}N8R z5pu;LeCC2ldG>-hrO-!IwVh-4u<9gs2WQd8eON)P2h^hLwNZ>^+#I&-t_{Fg;v)V* zu~>F#u+TL@Ni~jADa!nk+AnsOM`aiCNdgFx9YW!qg^ZL?o06%n;Y?!lC2N4 z0SG`s=KDrR%rqwV&F7rr0OG!aEPi_$d`PwP*~KUM)JxCZXSH+o#;uSn$eSAoy8B$b zbOd0Lg76sO*K59kc<*u-uFcK>;tY^C0)3WSI8ED~;Xlm!jp1svk7%VQmPrn5} zqf*_h@j8J72mD8HKz1p#@SlQve+xeUEw~E**u|CgLF3q_%L`gqjaZZZK8bkLrkr?G z?k`~X-s+^ln12B)wKt6>6OSTq8H;+6)eun1}fK^(( z(}e-VAZhZTl9+UC81*urdxu;h!5p_Z(cS;Vx>h?E|2h|VG3T=MJX{!%J@l_;{;#!h z&3`Z+(xw^PK?c<~2jJ4V1?ngpv@pQq{u1;m44v9T9?t2GreAR9MNVp;0UJL3^be#3 z7=Ep-_XEPbutLOam3pJ1fqIJ(X0#5WsTk>B^a9LdD_KN}CDip1a1~KXbo1`68&Rgm zi#g%)OlbgupL!N3sze((hV?cGERVv*Al0#Kfc9V&;Co+=W@hBoAxf0G)!{|gM(>Wr zg)Y0in}P7Q0b5YLtWzVDs0t(<5hQDlzk1A=*+_6VVBR&aE3=pZuE#QZpnVqQfq ziV~L*S)$A3pm_`g>e|4DdxzCA2+lAFaD;lJw|IIlnED(R>j=j8p}=}Cu%}e*K~MY# zki_iQ+`X=0qqz$w40;^&%;e*x$JY>_QEIHEEh(Vk$9D)mqL1CGDwi%l#9 zwxB`g_qSUB?GfPZ`-2?+olXlmynFw0jg3M;>Qxg{!F={!Qgk#jQ& zn2Jg2bF$Xr!owNWRXSkPzCK(p zWf6VL=4gB9#a3wWj@W`~PH7bqy|w6MkDbDerFh)0@b4HFXzM!+`G;z(diQ`%m#;w1TGHySd!($SU}j>LkCmK z;Dka&q?R_U*0Q?|Bf~8ouKAmUu^IYL&f+yaBYmdD@i9CWmRh#V3jd+8=NWG{3jl|y ze5h?58}rvFi(isU6}prfRMTVOFSZ^P?>6?6wcfMQkKa^{$%!B*Cha}Wn!_||m*UuJ zfze~&CTXQkRoGx&vblCLt}4|yRmhRJh9$WqCPh78jF@MmjM(JMRLGHa?kA?Fqcf!( zo0%cue$`4_%DZM}bMa2T5 z!j1e*#S$@Syj45RZ342%_SJ)h*we;%q)q+NKqe~*i(mXo>wSkPM=hJFM)L7va;l#m z4gI)_>(o0w<3fXmPo!QoWgjRtidgBdI(v|o5|o;-EDp3%MSh{vAJfp+51rafRE@CV ze*?8gx|(-yzbI&YFYV4~9$;i_25KY#CHdGx$V-*YTFk};Wnl#W!KQA!P2Je+vZ7*% zBx87N%cn0aiL{;#T!CzQ3~Gz)?;V8@w)egbN_~N;1XZ@_qi971e}&Cy^cpz6C+ia` z#@`q{wY4E(s5FWaIKOFWv)pCywzI>47!#79uLdKX6!?xc!ji&j>JBBSgs>tEgTGgg zPub-eW(wt$UKDLMDhLz~b8A=TG?xOVZEl_W*1orE%|#|TaVLrj1nVCxwku0a>FsF_ zw^0QJLC0xJpoI?Qh~FI8qz{rjVoj)Vz4mgkA%5*6p22S%x5EsFFT=+zo^}j!W2TDz zh7$YD`-4sZJQM~T6{=ipQ;CHacrm%3ok(x`Q@#-mu-ru~IKC>)vIGoJDx;K(qm&!W z6$XU`M~A9LQbOX}V~rXBeXEIHp*K&Z2FCz6og4%-DwHUFKVn3}+Va_eqq~NrJl{v!+)gtZOIQgI@S=Ex#4mLs=XS6E;U zgebIrP5@S%%eLP9kxp>x8En&in{W-cKZyLs1!ioQ6&qM>TuYiFt@x&;b~D- zN-$_kPOz;|Xz%kMOogz!&J;+3AG5W|3s^wEjhpwA?Jub3$B99rM7Y^Fv*1rJAy#OE zfK>hh!uk!Q`)?rI-#~M|6P-Zm+*gYQINHedQnLsF8=Tlb5CqCWYl{Q34F)afxgVJd z%`$wd6vBCCY!D_K?OZr!;w?gB2M#vN? zg@7c$u;ZWNl1)~6;Ge=>VE?dqLHvgD&-eC?JOXBUIl;i3s$szJ{`ua%rls>|Npo{E z6X!o);rG!`$(O1-d3wNVJQ`HYN(Lhx9ru|+hZr&#-@Qn^y%#DkpVLpPia+{D*9>}# zUnJWPeI!PDBv|>E@!jUTH?I4AyH?dv(}t%7};OxqIxIkm%B9xOM^CW&*0;#^A;lc%>-*NE@9So@yE^Vu(EY&F>VF3G^$;@bC~doS&o6%C zeKQ_+N*K-#N)KsH+4J;m>2zD&b8_rYzd5zM@jT&PUWiXnJdmOz=DDgdGz`gF$q88< zT>Rl%g>9t`bR`{ZnZ)aSsxUaS?FVf_4QbNvv&m9{!IK(>bg+7b2b6%Vdn0aJ*0307b01PS?x_=pAGT%P$iD(>3bt2Y^4QOf75M_(u_yDQMe zg(nu;=Y1T_TbE8O+ULo<*!T!#r-ch~*nA&qRxOZW%ZKM*+B0s}4M)|xnX@)G`KKmJ zAF8f@Tp7PScssVf-fj}t-KFwgv$8(C0&8Dx`+u$U-JP+m+dq;oDu?-NYHW65Kib{3 zxoZ*HnO<0S%PlmS-m8{Rmt%5FEeXF}R5v?MU<01yUzrT*-Qu`YiD=&)ZMWWylHG2% z;85Z)2){IV+}C+O*C;A6D3#w%*)WLGbrePc6uy7 zxTbE8tQE%xlpiw^qF~AqBfq}YuWz^JkI4x#;{2@g;jU=pqHNe_!N&m%Q(6s^TUkiV zMJvuteJ#m^SLRn8biGXvAy=ulZBfn2UKfczv*3o?eOgA!xd*xi5_e^<_XLB64!1x< zxS%2S+Z$moErQpshi&P1oZVHo)8i{Qw$im3S+}X}hS;lv2PZo>KbiKRxr>g{9?owa zrrl=61JYk>Htkeybxp<{;A|wBs}&>Gtuz5q#ymiI?Tz)#=JH`3ul)Fz%Ar2y>4=cM z*?rKff}Kw;55op!aoOB%#L)yLz#e$dz2fa2Adx5ZOV+um=Eb904_}lLB zVRdND8=-4-SWHcZ_xn3qc1_dV)9EM0%@(KXW(?d1%&zxDQg$nbk@l60Cat{Lx=v}J^;{g@}w6Q5#TKiCb0pw~!k$-!%puR-us zpxJ>>-fKfFgf{tk$`0s)g^2bs`t{>&WA}WDvPaxHA1iGFLsnG-P0+4@CP+>|6S1I) z8mSg&`+q|aEWkB`y`9o zyYIho{vPl*&oxpF&~v(E8=x?BP}py4$kvYKGLOi&SC`RG!F!~8x>V2AG6@}EK<_zU zMq$S0@f*nDV@6Dk>1jHnBkNnv%HdsZ#A3H`6r9(4_XoHWN3WkR zYnfeG0-5a_Pd}NeV4K=a!?UW0-tDvsyX+n#5k<~zF7FvA2(p-NPTt@*mA}M9m{z>D zGIeg>T*mnP96gwS9Dn$+eEn=$JE`YL7ixpo+U*u>B3!vJ zu7A6A(?1$Bu9$B7-Dl&6-_)#IVhZP}{ms5@Hc;YW_G~(ZzjaOQlzeP$v2ruTXSMBK zaj?1a=jeBUt`q3{>uMU&l<#U$tQ3kFa-uu58=7g=5>cZC6mSc5K^5MHSn&ZQFJ#R>gKIu1YF+yUw}yzVF=sz4y1> zveMGpP9MGZxz^lcjxv8f^<(g^aXMjbxr4O;tw65b>7QU|mDbsQUJP;=CRdf*qY!lD*FN=iHw@VlNsI<_4S(E+52zUEs(EN@aIO& z3cQLvQ^ak&itHEl{rh(}t+I}8;i%Y>EZBFZ?%$A4!Y}lUxEU^6r%NiGy$PKiYB+Oj zzS*0)!Kk3H13sA(I8XC@8kPHvDk2ix{s`kVfw~Vyx(uV_Iu%=|!V3N9ArmCzZrQ$q zi*LSjudwKCy%~IWkvwn* zVKFY28a#Cb@;qX0?RAkxhnyNeZM*8ehyk`%JkHv?$$Xs?+OQe6FSFC~cuL@p$LCuO z^+ELo8&1_H_XTP)WLBz^2q96u340G?%*l?O)rYKo?7MtLO7GLr9GVrSjUT5yeq5}j zWJJyA-C7#38-jk}p$jNGNEuwbZLV?RT~iHAwJ$M|3j*!~Yg%)I61qHMT#l{9mB?_U zH6=YVII}0+^)jVjJ}03r%`|wqoyxBlS-xY-=!N5o^CLoAVDF;+uTR4 zh%|{qREH{_SvnmV8|;j$NcN$Ckr=)1xCfRf`jX|J0#Trzy$vJDm9j;WX_{M z!H)uN@VqE|w-?_+(gMyMWVal7V&gjH*1D{sZGhw&V^#qrvsU0RM)phon<30F52UdH($WzD6diy zYmQaLiuagY2!(Qy+Bo0#q`?!;xLPc4e$qGE#Hc+}Dmx;o$^2eM#Az40`cS^19ry0zVOCNos(`JzoKuwA z)nq+MTxaP!$*;1LlZu{`N%W|5Jzq)dcRoK_)~y{Et8+2$x$t29rj7>5>w0#C*3{WN z>1Mj{80xXu(N%f;_KbI6-m6%~Rs7AIzs368fN!~Zf_bR|dU8j&?%m|Jek(a@oB8Yv z4R-%dg)mS_-ryRW_)CWy2e0G1)AxWg_FjAUiB_R+wkjzaNMY-aE{`P#w&R_5%438c z-D!YEQGL&fix>~$DOnE{U!9Jp94S@q8Oo`Ry*T}x7~A?W){dX_^D_$iftOtL1S=~PRi-RCDNMNZClabd z|MUlNlu$D>6tU4}B3u<`Q@P&(2;NBq^@P{Y`|;12F{xpT(qv^>w~ar_p|HIg-F3}W z8<2Z&HLIQ3k~I>Ho+U>_N8%#ucEB#%vKs4d6;4bwU_;sSVwB4xXebHm*6`EdK&Ic@ zvnel8Q&)fOLKhj5(?~Glv58G8dhfho!||XSDog@$9s5Z*p6rA+e(F zi3bLgRT+DU6Npmh4KiZ^&Pl=eIT#l?tfEQ3+b=z}dg8IFy60-jhOkUuCJddux*B88 zD<&btn>Bvk$!p;c+Q}YyD^~@4t;tdexx7$w{d&Fd_{_9!n}>dGuw8IJV7Z&(YWbdY z-Ztnf1$UFV-OFe$wzl=XgYH>T)t9NxB730|faxj4W|jvdIcn!%I@zhonKC7Ga^j^j z?K_QCOm`(E!N#oQ*PX+V*>=WMw(fi6#eJ4|d-J{QETP#_Pdcr%3|ahY(wifTs-bd6 z0!+mE<<%uD^l*_DD(mXNS;qtWJRZ<6I)iJvneDTmMJ^&prK4&Syn0k=b(~$QRFksI zhx`2qS?ubybm1HAS5u?Q-XCVZ(;F3jB0sJx{(zsmWAO~-h(evfHk4q_wP2_#4Fsy_0Ue`Vczkm)>Hgd@E z6Ee5qGTdrb&6ggpUfw#yImqthZDAv7#=gV0L|LSMI`^yFU1rbAoH=#K{u9U>=+~C8 zz9F!5fw@nh48w{$?elT4;5hHCo7X?26?LJTQ~e!v*>af}ZuUGo*04H!?oP^j8J^nY(EA`PKhBfcaApJr3Y$%8ePYxsiz!Vhq9Ar z)b-q7BUt2Xd3|8Qm=2W$$cn;g*%d2aA~6)DINJCRw6emimabOwxeoC}!c}*UFYj(@ z3LrpS%Uk)PhkC0d92etX&n&roU8VQlDC)aLJkeoU=wkVy!{z9(yR9gyj^BdO1wK_y zxruLBZ-+40bH-U03w&yqftFUP#!1{@PlGEC%x2btToA&~QnEcm?#-+QA-7FlZ*E8L z%Wb(J5*+!d7xAs0JzL^y#7%tXaqFT~<1dD|Ey3R42(2+9?c8t2%f1*Pd(^EZocRtX%3@1YvwN)*D)nS!n@ni5Sv-HT#JBC?rX<=dGIHDM>oaaC)*wa zwt_$Z|JeaJqVDs)Y&vtcb7LWc2Y4UAw{x$K^FGbtvONlm5BP*_lGLKjb%}^xp3A>&~;w zQ?@n7n=5R0Gq64F9_)Lg6-!FnY%V`yTvl7$>e+Qw4W-wr$QFIUN(+j8D5<@K3GHaW zSNSz+cMlL49T3thuUpeOmQaM5L*D!Klg#}%4Jhcs`Sdqd!Q z7X$TX<(8$%WFQQ&Ag;7 zl-KZ-z;Z(eoJAWdw6aY-LqXu8Mu`GFtSz;t`c`#ke{nWmY`;+j*>iHQhV!fj^Coq+ z2F{@d)ENN? z0$O`GL5j=_%e`z;*0-Cs@x&{?c-X8@;VBF=-I6upT5X$^5jBnv>DWAUwFqqAWjFvS z?$u0KXs#v*_3R;BEk!YPbJF*4PJ@b`2yblT`OmYlsP?o>9zJS0#E`js>TbC-i#bWb z&hrg5tx3!Al8QujsF8N4@o)1XGXPTbu(^Xha4QaS;Mo&+EQEKMk#RtD>7V1BYi)xv zY(_w!b-4Pmv22o(=FU@hoo$Am)Xyu*_nx|VON_^?dNQ~8>VTISCTo=|+Y!Tk@y2B5 z{j*;CEfZ<`_wTe3Kdud8b6Avx(KJ}S>?`%C%ZXE0hEE^K`s1%hL-u*R1l2?uBcxWF zM(4`Drv>Yj^>d`>A#YOHzDt&jDv{$;&w;R~F2o zZq%Zc{0-d>dQcE)NK0jtj6U(tc0V7lXjzo$9A(j3d#2ry3}CtuaMbLC}hIn{Yditxyq9zq+l-Av^JPH8?=uxC?ZiR>C9q=vlycY z_C`?TVurWmK}c&|sjhTlAcmGuq4{3tl1e;4wUuS|*Op&CLkQ<%WiHZ$HGm!3g~EV1 z{}!p`7u&rJg=u{G^ci9_80J@0&(ySI!iw2(o78W#CY@r>3Y36$(1DSlMUc-BFsN$< zu#U4hTlDHznQC}sDC`9;>kD)&cXf6!sII1P_aQKs8H4EqjDI{}@HL$S^NsWXyHgT4CZmuW|*$@UeyP+MsH(hp-0eqz}NLYQB!=gFn?$=D?wX;A94nmgn-# zGkl{q?aQ15o(=zVXqL4hKsp{tRtd>&JVhY{KSNN3!tCEJ{gjzI!hVIg#bsLPoPNc! zGB9?J;$X%kL*XWA_i)7fZ$2`j5XMxlOgh?-67MaDq=B(=M!hHjpHy(z+e2`pQ36Kd z5cmv#XfITtfch8U;uxP>5lHCswEr0}-~aP~0SL){jomptKHUN9zUiBAzwitk%{Dx}kZQG7VmBz_Vc;$&7*1p1^-((fnX zNuoiJ;}B3ffgeKwL;iUKsKoE|NWaHMhSFv?W^@L_?o&6sn-rY+IJ%oTdfPdAx}_$= zLS$je?{{wu0{Do37-W#+W1_LBC67g4zD6(6j<=CTEaIoAGIpeOJd?bQ=^i(ZMPm-g zteHXdo>s3jRWz>BXrw;c zn$iyTL;mPR{m}Q7;piQ2uAk=Uo5K;^?)G3qsEvz9Oc+>n7+oCOyqwt#9^2_0BknXJ z5T}IKf1>g6z4t=Z_xnB+o4%U&CWWlu$EyD!Km>h|Xsil2f}(6Wqt8fMze_=ovHd0U zRNU>W6?OBn_sG5fIHeFVik*R#nsJPcXL7pX!-D5wTeqWRVSV$$+wD6&vpp^E@mAyg zrj+eb4VVZ_`vh0F)2$!8n)g&sfBb0i$=%~^)Z;CHKTkpCT(&(0KY6LN&JsAU?mp63rx3JZn z-qjz#E0|8}rcrY5F>4jbbdl(3xcj|Y7O8Frr_K*g!CWMQ;Y!V3Q8}wOkvD_UU?P7w zw9Zsv@*=GTrjA(Ok6gd+HQCZ9!OAGZ%C~?uv=@^O??l#W=)z&}KT$eYiAVP+GLsoR z){AalW-i1%-p1HIf7bsfIY;UCP3nHXH5G*U^aRCOxtU+g^_9{^nfS2+C;7QpVI+6+ z%UdGW-Xjoi_#!P2Erywmk%4`NnPYUW?Q_DQkDHvw8_>1%te%Xlo0pBBFEw?Zc7v@( zeoAIhJ@1JNJ!bks;-Cf|Z|hT*aK8XS1MQ|kcl6ve74ilX*{WZWFoW2R_*5?^FhNtB z|1WyZk&fW?2mYzY!4FrKycO}{fr@CGZ;5@DmcB-v=u`wEoFKT}K+(+iX| zweYB?$Tfe>1;L=n7nUbPuXH?9RBsQ~P3=K&#yw;kH+$3F8^JM*lY#xr(u7@#GEI`c z-tp=NqMQ@&_z=q>#_lpq8E*av0-h0S359_}nd#K4Eulq%RjBpE7H*C*Lz4OE5`t~w z|EY2qc79qv{WC|9rTNL-DyWp(=fQdY1(ca-)HIUJWpD&jyh2<>!(_`*4TJT9>NSaekV>37BJi>K860%>;#%h%oO>w{)ld0_5{2J`@LO zrcuahu|#xP@7NRNE7&w?X2d>5AujIUVx0f4Vk|W{ep|Iv(Pm`mizrjE|JK&#Ki4E` zUwEbg&x4~Pp##g@U;q7f| zUnuJexyjT?+QBM=cgNj%YrN&nRl7?A#FA zz)cudZQ+Qw9fawwUSp?Dg@!9W(Pq ztmRWYSl$sGq~BpnvfHkRBRqDdgd@BgkHS|+m2efWfqh$I3T%ot)ck;BIyQo9-&R`+ z5jW6aiBtR2P$vvlaQ#*^{g}97fM*qa$1yFlIHrc;_Fzb<()MS}n$5<26h-}SPa>Wo zp7@}6G<9T)d)F3I5@^ZT!j{2z5>A6C>+8dJl2--Yc*N2slvNc$j~I0=@s1cx>%TG56M-Hb*%BvXC;w4#N5@9^w+c_tU~_%j@F8i{*Y~?u zMR(vSOF=})eGI9uY64sb>XYE7bIXQK^jyJMu-D`x<_Q@B-y(a#RA`z~7{$a6@628K z1D|cyMlyy-{SC(@RC0Yh{sQnL%u1i{aD3ixGwWJ zqVg1mE6)3L29nva91J^(xm2TjWD|j?bKqp6bumGR@KD5@a)1OwM*(JX;{{sGTD(Yc zfK(Br<{OS%lNnyhQgixwNf1&&=xt{;=eiF+<8m_#0*Va}$x@=`(ES~P**A-DP81ud zJNYOVLeWO8sYDx!sZh;7s0|VfjCGjJjTgp$P^$wp|Ajh&mr{KG7ivRj!oWhNz(Wp} zjW!NcI41#$wRH7fx%#f6I=#OpctdEhav;wtYcWy~Lx)5LbU0@=3?rt^FxsS!2z?jR zN;o3!FkU#Pw*PXR61PsZ5-oIKg+AXYiVY5304JtuC*ul-(0{lpS&S7_H-R@m86!%^ z5IfbHNI{ZnImdvB1I3_f)2)Q3d~OI-ch{>%#b^7Ys2QY+xX8X$vq*UyPNm0nj&y~k zx38h}Nuz8e6Dt(d7!f*H8_kA?ZkRV2bDv~IxSF&AKz%#WhTHPPbb?dnLZo_6%+m84 zUICfD`rKq~6sNH$6fk%Umf@qx(hQc3stk*9Wf~ISFkYyPq5SfseH7;mGWaka5=;xl zisKTO8;woYXP{}K${K3f7dXl-YN@(KGz`OdfZ)_fPU9o$n*0 zvGOd&m2wQ^QB`I_*Kp2g{kGC==l@L>55wlYSMQU$Mu1Em3GF+FyK~_$j>d3E_x$_l}t5UUl|@Y zea6&Nl3ii7iaNz&NS`kg*FD62Ud=;moQe_!k$xU#A}si2C)sS~w#~hR)7A^uX68$B zNok>DG_!c)!ZH&4N%opmF?d;3*{DSkff-o5D5baZLwtWBiAZt_Ok{aqF1nO4l#nTf zl2L2`6`nM@#Q_P@Gj%$mn9>1xh04fzq^W16lu`nMDyuiHJYk&&LA0zhG2e1jzN#Jq zri*e)uPVZ1vb9nJwKyg$1DvwBR#blEOO>=go%xNZ1SaM&PI+O1Dr>aGLB{N-0o(k@ zKl2xz`l{%Jig=_KO@8G1lvKI#?zfYq#A#XkM=}~w%#`T~MRCd?G*zXETnsgedKxKA zGsZx=^I0>*%JczbTs75nll({tV9QK?3liY5 z{#Y>66`Ax*@~{@QTkeIL?4_YJlD*UwNe5-Nt)|*Q{j;{PQ+)mlCgopz4

_Z*@i9 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 -#include "tensorflow_utils.h" -#include "resource_utils.h" - -REGISTER_OP("DecodeAndHashBatchPredictionRequest") -.Input("input_bytes: uint8") -.Attr("keep_features: list(int)") -.Attr("keep_codes: list(int)") -.Attr("decode_mode: int = 0") -.Output("hashed_data_record_handle: resource") -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that decodes batch prediction request and creates a handle to the batch of hashed data records. - -Attr - keep_features: a list of int ids to keep. - keep_codes: their corresponding code. - decode_mode: integer, indicates which decoding method to use. Let a sparse continuous - have a feature_name and a dict of {name: value}. 0 indicates feature_ids are computed - as hash(name). 1 indicates feature_ids are computed as hash(feature_name, name) - shared_name: name used by the resource handle inside the resource manager. - container: name used by the container of the resources. - -shared_name and container are required when inheriting from ResourceOpKernel. - -Input - input_bytes: Input tensor containing the serialized batch of BatchPredictionRequest. - -Outputs - hashed_data_record_handle: A resource handle to the HashedDataRecordResource containing batch of HashedDataRecords. -)doc"); - -class DecodeAndHashBatchPredictionRequest : public OpKernel { - public: - explicit DecodeAndHashBatchPredictionRequest(OpKernelConstruction* context) - : OpKernel(context) { - std::vector keep_features; - std::vector keep_codes; - - OP_REQUIRES_OK(context, context->GetAttr("keep_features", &keep_features)); - OP_REQUIRES_OK(context, context->GetAttr("keep_codes", &keep_codes)); - OP_REQUIRES_OK(context, context->GetAttr("decode_mode", &m_decode_mode)); - - OP_REQUIRES(context, keep_features.size() == keep_codes.size(), - errors::InvalidArgument("keep keys and values must have same size.")); - -#ifdef USE_DENSE_HASH - m_keep_map.set_empty_key(0); -#endif // USE_DENSE_HASH - - for (uint64_t i = 0; i < keep_features.size(); i++) { - m_keep_map[keep_features[i]] = keep_codes[i]; - } - } - - private: - twml::Map m_keep_map; - int64 m_decode_mode; - - void Compute(OpKernelContext* context) override { - try { - HashedDataRecordResource *resource = nullptr; - OP_REQUIRES_OK(context, makeResourceHandle(context, 0, &resource)); - - // Store the input bytes in the resource so it isnt freed before the resource. - // This is necessary because we are not copying the contents for tensors. - resource->input = context->input(0); - const uint8_t *input_bytes = resource->input.flat().data(); - twml::HashedDataRecordReader reader; - twml::HashedBatchPredictionRequest bpr; - reader.setKeepMap(&m_keep_map); - reader.setBuffer(input_bytes); - reader.setDecodeMode(m_decode_mode); - bpr.decode(reader); - - resource->common = std::move(bpr.common()); - resource->records = std::move(bpr.requests()); - - // Each datarecord has a copy of common features. - // Initialize total_size by common_size * num_records - int64 common_size = static_cast(resource->common.totalSize()); - int64 num_records = static_cast(resource->records.size()); - int64 total_size = common_size * num_records; - for (const auto &record : resource->records) { - total_size += static_cast(record.totalSize()); - } - - resource->total_size = total_size; - resource->num_labels = 0; - resource->num_weights = 0; - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_KERNEL_BUILDER( - Name("DecodeAndHashBatchPredictionRequest").Device(DEVICE_CPU), - DecodeAndHashBatchPredictionRequest); - -REGISTER_OP("DecodeBatchPredictionRequest") -.Input("input_bytes: uint8") -.Attr("keep_features: list(int)") -.Attr("keep_codes: list(int)") -.Output("data_record_handle: resource") -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that decodes batch prediction request and creates a handle to the batch of data records. - -Attr - keep_features: a list of int ids to keep. - keep_codes: their corresponding code. - shared_name: name used by the resource handle inside the resource manager. - container: name used by the container of the resources. - -shared_name and container are required when inheriting from ResourceOpKernel. - -Input - input_bytes: Input tensor containing the serialized batch of BatchPredictionRequest. - -Outputs - data_record_handle: A resource handle to the DataRecordResource containing batch of DataRecords. -)doc"); - -class DecodeBatchPredictionRequest : public OpKernel { - public: - explicit DecodeBatchPredictionRequest(OpKernelConstruction* context) - : OpKernel(context) { - std::vector keep_features; - std::vector keep_codes; - - OP_REQUIRES_OK(context, context->GetAttr("keep_features", &keep_features)); - OP_REQUIRES_OK(context, context->GetAttr("keep_codes", &keep_codes)); - - OP_REQUIRES(context, keep_features.size() == keep_codes.size(), - errors::InvalidArgument("keep keys and values must have same size.")); - -#ifdef USE_DENSE_HASH - m_keep_map.set_empty_key(0); -#endif // USE_DENSE_HASH - - for (uint64_t i = 0; i < keep_features.size(); i++) { - m_keep_map[keep_features[i]] = keep_codes[i]; - } - } - - private: - twml::Map m_keep_map; - - void Compute(OpKernelContext* context) override { - try { - DataRecordResource *resource = nullptr; - OP_REQUIRES_OK(context, makeResourceHandle(context, 0, &resource)); - - // Store the input bytes in the resource so it isnt freed before the resource. - // This is necessary because we are not copying the contents for tensors. - resource->input = context->input(0); - const uint8_t *input_bytes = resource->input.flat().data(); - twml::DataRecordReader reader; - twml::BatchPredictionRequest bpr; - reader.setKeepMap(&m_keep_map); - reader.setBuffer(input_bytes); - bpr.decode(reader); - - resource->common = std::move(bpr.common()); - resource->records = std::move(bpr.requests()); - - resource->num_weights = 0; - resource->num_labels = 0; - resource->keep_map = &m_keep_map; - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_KERNEL_BUILDER( - Name("DecodeBatchPredictionRequest").Device(DEVICE_CPU), - DecodeBatchPredictionRequest); diff --git a/twml/libtwml/src/ops/batch_prediction_request.docx b/twml/libtwml/src/ops/batch_prediction_request.docx new file mode 100644 index 0000000000000000000000000000000000000000..273428ba986bd26b78d0debbd35d0c0f3101e695 GIT binary patch literal 38453 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 t6s6c-y|N|o0_(x?;HJJa{ -#include -#include "tensorflow_utils.h" -#include "resource_utils.h" - -#include - -template -class DecodeBatchPredictionRequestKernel : public OpKernel { - public: - explicit DecodeBatchPredictionRequestKernel(OpKernelConstruction* context) - : OpKernel(context) { - std::vector keep_features; - std::vector keep_codes; - - std::vector label_features; - std::vector weight_features; - - OP_REQUIRES_OK(context, context->GetAttr("keep_features", &keep_features)); - OP_REQUIRES_OK(context, context->GetAttr("keep_codes", &keep_codes)); - - OP_REQUIRES_OK(context, context->GetAttr("label_features", &label_features)); - OP_REQUIRES_OK(context, context->GetAttr("weight_features", &weight_features)); - OP_REQUIRES_OK(context, context->GetAttr("decode_mode", &m_decode_mode)); - - OP_REQUIRES(context, keep_features.size() == keep_codes.size(), - errors::InvalidArgument("keep keys and values must have same size.")); - -#ifdef USE_DENSE_HASH - m_keep_map.set_empty_key(0); - m_labels_map.set_empty_key(0); - m_weights_map.set_empty_key(0); -#endif // USE_DENSE_HASH - - for (uint64_t i = 0; i < keep_features.size(); i++) { - m_keep_map[keep_features[i]] = keep_codes[i]; - } - - for (uint64_t i = 0; i < label_features.size(); i++) { - m_labels_map[label_features[i]] = i; - } - - for (uint64_t i = 0; i < weight_features.size(); i++) { - m_weights_map[weight_features[i]] = i; - } - } - - protected: - twml::Map m_keep_map; - twml::Map m_labels_map; - twml::Map m_weights_map; - int64 m_decode_mode; - - template - void Decode(OpKernelContext* context, ResourceType *resource) { - resource->input = context->input(0); - const uint8_t *input_bytes = getInputBytes(resource->input, 0); - int num_labels = static_cast(m_labels_map.size()); - int num_weights = static_cast(m_weights_map.size()); - - typename RecordType::Reader reader; - twml::GenericBatchPredictionRequest bpr(num_labels, num_weights); - - reader.setKeepMap(&m_keep_map); - reader.setLabelsMap(&m_labels_map); - reader.setBuffer(input_bytes); - reader.setDecodeMode(m_decode_mode); - // Do not set weight map if it is empty. This will take a faster path. - if (num_weights != 0) { - reader.setWeightsMap(&m_weights_map); - } - bpr.decode(reader); - - resource->common = std::move(bpr.common()); - resource->records = std::move(bpr.requests()); - - resource->num_labels = num_labels; - resource->num_weights = num_weights; - } -}; - - -REGISTER_OP("DecodeAndHashBatchPredictionRequestV2") -.Attr("InputType: {uint8, string}") -.Input("input_bytes: InputType") -.Attr("keep_features: list(int)") -.Attr("keep_codes: list(int)") -.Attr("label_features: list(int)") -.Attr("weight_features: list(int) = []") -.Attr("decode_mode: int = 0") -.Output("hashed_data_record_handle: resource") -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that decodes a list/batch of data records and creates a handle to the batch of hashed data records. - -Compared to DecodeAndHashBatchPredictionRequest, DecodeAndHashBatchPredictionRequestV2 is used for training instead -of serving. Thus label_features and weight_features[optional] must be passed, and labels and weights are extracted in -the output. -DecodeAndHashBatchPredictionRequestV2 controls what DataRecords we want to process together in a batch in training. -For instance, we can put all instances for a query in the same batch when training a ranking model. -Notice that this OP was added separately to make sure we would not break the API for DecodeAndHashBatchPredictionRequest. -It requires some discussions if we merge the two ops into a single .cpp file in a future API revision. - -Attr - keep_features: a list of int ids to keep. - keep_codes: their corresponding code. - label_features: list of feature ids representing the labels. - weight_features: list of feature ids representing the weights. Defaults to empty list. - decode_mode: integer, indicates which decoding method to use. Let a sparse continuous - have a feature_name and a dict of {name: value}. 0 indicates feature_ids are computed - as hash(name). 1 indicates feature_ids are computed as hash(feature_name, name) - -Input - input_bytes: Input tensor containing the serialized batch of BatchPredictionRequest. - -Outputs - hashed_data_record_handle: A resource handle to the HashedDataRecordResource containing batch of HashedDataRecords. -)doc"); - -template -class DecodeAndHashBatchPredictionRequestV2 : - public DecodeBatchPredictionRequestKernel { - -public: - DecodeAndHashBatchPredictionRequestV2(OpKernelConstruction *context) - : DecodeBatchPredictionRequestKernel(context) { - } - - private: - void Compute(OpKernelContext* context) override { - try { - HashedDataRecordResource *resource = nullptr; - OP_REQUIRES_OK( - context, - makeResourceHandle(context, 0, &resource)); - - this->Decode(context, resource); - - // Each datarecord has a copy of common features. - // Initialize total_size by common_size * num_records - int64 common_size = static_cast(resource->common.totalSize()); - int64 num_records = static_cast(resource->records.size()); - int64 total_size = common_size * num_records; - for (const auto &record : resource->records) { - total_size += static_cast(record.totalSize()); - } - - resource->total_size = total_size; - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("DecodeBatchPredictionRequestV2") -.Attr("InputType: {uint8, string}") -.Input("input_bytes: InputType") -.Attr("keep_features: list(int)") -.Attr("keep_codes: list(int)") -.Attr("label_features: list(int)") -.Attr("weight_features: list(int) = []") -.Attr("decode_mode: int = 0") -.Output("data_record_handle: resource") -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that decodes batch prediction request and creates a handle to the batch of data records. - -Attr - keep_features: a list of int ids to keep. - keep_codes: their corresponding code. - shared_name: name used by the resource handle inside the resource manager. - label_features: list of feature ids representing the labels. - weight_features: list of feature ids representing the weights. Defaults to empty list. - decode_mode: reserved, do not use. - -Input - input_bytes: Input tensor containing the serialized batch of BatchPredictionRequest. - -Outputs - data_record_handle: A resource handle to the DataRecordResource containing batch of DataRecords. -)doc"); - - -template -class DecodeBatchPredictionRequestV2 : - public DecodeBatchPredictionRequestKernel { -public: - DecodeBatchPredictionRequestV2(OpKernelConstruction *context) - : DecodeBatchPredictionRequestKernel(context) { - } - -private: - void Compute(OpKernelContext* context) override { - try { - DataRecordResource *resource = nullptr; - OP_REQUIRES_OK( - context, - makeResourceHandle(context, 0, &resource)); - this->Decode(context, resource); - resource->keep_map = &(this->m_keep_map); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -#define REGISTER_DECODE_OPS(InputType) \ - REGISTER_KERNEL_BUILDER( \ - Name("DecodeAndHashBatchPredictionRequestV2") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("InputType"), \ - DecodeAndHashBatchPredictionRequestV2); \ - REGISTER_KERNEL_BUILDER( \ - Name("DecodeBatchPredictionRequestV2") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("InputType"), \ - DecodeBatchPredictionRequestV2); \ - -REGISTER_DECODE_OPS(uint8) -REGISTER_DECODE_OPS(string) diff --git a/twml/libtwml/src/ops/batch_prediction_request_v2.docx b/twml/libtwml/src/ops/batch_prediction_request_v2.docx new file mode 100644 index 0000000000000000000000000000000000000000..4cc88e1e2523852c1ddea39ddf8c04ed7c8f4035 GIT binary patch literal 39236 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 z%0A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

*0%ZyAYa@8J?K~}%n5|+nIH-#2{ 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/batch_prediction_response_writer.cpp b/twml/libtwml/src/ops/batch_prediction_response_writer.cpp deleted file mode 100644 index 4876dd48a..000000000 --- a/twml/libtwml/src/ops/batch_prediction_response_writer.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include "tensorflow_utils.h" - -using namespace tensorflow; - -REGISTER_OP("BatchPredictionResponseWriter") -.Attr("T: {float, double}") -.Input("keys: int64") -.Input("values: T") -.Output("result: uint8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( - -A tensorflow OP that packages keys and values into a BatchPredictionResponse. - -values: input feature value. (float/double) -keys: feature ids from the original BatchPredictionRequest. (int64) - -Outputs - bytes: output BatchPredictionRequest serialized using Thrift into a uint8 tensor. -)doc"); - -template -class BatchPredictionResponseWriter : public OpKernel { - public: - explicit BatchPredictionResponseWriter(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - const Tensor& keys = context->input(0); - const Tensor& values = context->input(1); - - try { - // Ensure the inner dimension matches. - if (values.dim_size(values.dims() - 1) != keys.dim_size(keys.dims() - 1)) { - throw std::runtime_error("The sizes of keys and values need to match"); - } - - // set inputs as twml::Tensor - const twml::Tensor in_keys_ = TFTensor_to_twml_tensor(keys); - const twml::Tensor in_values_ = TFTensor_to_twml_tensor(values); - // no tensors in this op - const twml::Tensor dummy_dense_keys_; - const std::vector dummy_dense_values_; - - // call constructor BatchPredictionResponse - twml::BatchPredictionResponse tempResult( - in_keys_, in_values_, dummy_dense_keys_, dummy_dense_values_); - - // determine the length of the result - int len = tempResult.encodedSize(); - TensorShape result_shape = {1, len}; - - // Create an output tensor, the size is determined by the content of input. - Tensor* result = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, result_shape, - &result)); - twml::Tensor out_result = TFTensor_to_twml_tensor(*result); - - // Call writer of BatchPredictionResponse - tempResult.write(out_result); - } catch(const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -#define REGISTER(Type) \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("BatchPredictionResponseWriter") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - BatchPredictionResponseWriter); \ - -REGISTER(float); -REGISTER(double); diff --git a/twml/libtwml/src/ops/batch_prediction_response_writer.docx b/twml/libtwml/src/ops/batch_prediction_response_writer.docx new file mode 100644 index 0000000000000000000000000000000000000000..835e7744ae5d1cd40ee680bdfcfa423dbfc14fa3 GIT binary patch literal 37893 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 -#include "tensorflow_utils.h" - -using namespace tensorflow; - -REGISTER_OP("BatchPredictionTensorResponseWriter") -.Attr("T: list({string, int32, int64, float, double})") -.Input("keys: int64") -.Input("values: T") -.Output("result: uint8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( - -A tensorflow OP that packages keys and dense tensors into a BatchPredictionResponse. - -values: list of tensors -keys: feature ids from the original BatchPredictionRequest. (int64) - -Outputs - bytes: output BatchPredictionRequest serialized using Thrift into a uint8 tensor. -)doc"); - -class BatchPredictionTensorResponseWriter : public OpKernel { - public: - explicit BatchPredictionTensorResponseWriter(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - const Tensor& keys = context->input(0); - - try { - // set keys as twml::Tensor - const twml::Tensor in_keys_ = TFTensor_to_twml_tensor(keys); - - // check sizes - uint64_t num_keys = in_keys_.getNumElements(); - uint64_t num_values = context->num_inputs() - 1; - - OP_REQUIRES(context, num_values % num_keys == 0, - errors::InvalidArgument("Number of dense tensors not multiple of dense keys")); - - // set dense tensor values - std::vector in_values_; - for (int i = 1; i < context->num_inputs(); i++) { - in_values_.push_back(TFTensor_to_twml_raw_tensor(context->input(i))); - } - - // no continuous predictions in this op, only tensors - const twml::Tensor dummy_cont_keys_; - const twml::Tensor dummy_cont_values_; - - // call constructor BatchPredictionResponse - twml::BatchPredictionResponse tempResult( - dummy_cont_keys_, dummy_cont_values_, in_keys_, in_values_); - - // determine the length of the result - int len = tempResult.encodedSize(); - TensorShape result_shape = {1, len}; - - // Create an output tensor, the size is determined by the content of input. - Tensor* result = NULL; - OP_REQUIRES_OK(context, context->allocate_output(0, result_shape, - &result)); - twml::Tensor out_result = TFTensor_to_twml_tensor(*result); - - // Call writer of BatchPredictionResponse - tempResult.write(out_result); - } catch(const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_KERNEL_BUILDER( - Name("BatchPredictionTensorResponseWriter").Device(DEVICE_CPU), - BatchPredictionTensorResponseWriter); diff --git a/twml/libtwml/src/ops/batch_prediction_tensor_response_writer.docx b/twml/libtwml/src/ops/batch_prediction_tensor_response_writer.docx new file mode 100644 index 0000000000000000000000000000000000000000..57bc03ff9abd365fd9d48c80dc5a333999000c0d GIT binary patch literal 37889 zcmagEb9`jYwm%%(p4hhSWRi((Ym!OQ!Nk_Ynb@{%+n7vjdt&?7^WdEGoO|#4{Skx= zsK@APW8IJ-r?4W7^6mT;Gm%M<*h35%vvk{z+KxU3SG+3imRoC)=~Nc%@qU~)RBc)@ z7>Y3_J>}kuaHUqD)3cFMM@;-wPcK~~j}*MfGjA=I@ywiSPa=jydO>Q3V0Hkix;fqR z!xSed^Gp005}B`yjFjpbU((=O{kW4u4KLIrzZurY_B+-%PteslSg6_8uJjZj zxemeuP=4;(bThh)X|Nqb)s{rusA#XFSq1H$0=@)NR?i%QXKK9L@@1c_sMCFJ*Vc+s z^|Cw;kivDp7eh)v>Gr3gsw2^hhe~B_|6bu4c;9z_PgC%nT<~!*ME`zvM$Tqj&3732 z8;6=ujdGjF_rwu49%+w4G{B_45kuXb?*0ctisf1cH3jt{9_dk0Ni!1F(AQU?3pyz)u4QGiygC#^2Y9*ojZzEGWL`f)c|NMYfG<;`vMZ;)inig5AmE zXN9)jQiaQ%9ZKSQnpi!A2j@E`=JRQJc#Cv})&UyET66w63q6_}G?(>l2CFcMu% zuBzLCTGpxIw`54dW|a4w=IX?PbnEB?Iy7}>(;}6k;s&%fQb@&tC2^=X@L#DloV*xj z08ju)*+!1AqKcMXYnQMGp~kOLhQ7kb(RQdRDe|T)*xdO@()Q>#V$ugwQKiu>=~%5# zZHk|D$}SlX1H=?m^j*nspeEYU`nfIY`HQBTcRubjkdsYlxKElptp_Oi*i8}sVy;O# z*KYW}=mj$}t;2c#&jf{hgIBQx-saQ51fc>GWC}1*bO6{nGMNAz%zoeG8L?yXeat8l z_ns27a_XViC@>Pzw4ldfpQJGS7F+JvIpnOzGC3zUcJghsv+0}(H~5CG?F84j8k)dO zf?|V+f@9A8OvB){FyB^;u~wfmC1`mn5(0bAyPsyRC@pwRM!Un6a1r3DGr^_PSoCD) zLwL#hYdP3wzfF>4G%FY89Ez%-$}N3U7mlTFB|{|M!=O3x^CJw6Ba5v=Eomww1W89N z&H)Wg>^G8~)Q6Z^EQ1Yj*s_Lj#;w#=*gjm>VZmK#L|pk=-TGv5#p2^lpp6*#>*Ii- z@_xD*bu|<#{;BgLBmy!ho3K)fvP-i%>t@)gql5j%lry+q8A4Mq0#f3Koaxiza$)}* zm{lF;bwGbX&Cu-Z_9}xTg|E<8(`L46^w-8QZmJ|B@AS1Cq#+jpi(uG{`1_knOO~{F zX^bL~bO`BIsh{+n6S;?VKJOpjJ}lzXJ#bw@;2c{Z>C?=(h`qh^Ug7<-E;lPH*eAfc zSVMq-p!{cDjO^_GD2wWt?FutW`!gMc-q$coXb~lxSpRvEX|Xlj>e%$A*-_F@F%T^* z+umM}A(%Yhm~KP)>iC}PN1qo&%%SV$KdWJmJ?0K8+ONSiRD})guS^_}Izp5}mSCz6 zpz7HhOpR8|K{3F7P0>)S9Q7crGakPrgtl{3pqu)-j3m5X?@`z$Z|C{r#Y|Y@mvhZS z|3!jg!{U0f60<^B8Tf0}=Q6kADFKd;JGaMLi3x~El3+%!Y!G8^WtP-SA(Gf~#CR-* z9T(%DA*|p%zTVcF9-(Gi*yv#M&yWe95YpRS%^*DV!|h_5VSU$gZ_Qi9-w z#s)cGa5}b{hqXdXQvZsyP=Uh7j`lRB7be0B*tExMy!W}=Uqt`BF}|X5#UMh1fNWC# z`Ga)XWc7W>$SLa zN!`{lET54?1cRtVXol;f9AyYs;TS?dbz(a@H%$)d!5(tub9Ig5PNZM8C1oEV(3 zPqN@W6hy_Jx_4-a5Izf+qBHg$%U9^LS%hwa#-PnMFyomVnQj|*rq<&?KOV_fG$Jp= zPnhzH_oMf2Zuy4e&^2R-xr*r)jBpOiR_7+M=USDTahMwq%28pCkC|Fe*&Vv@gKS3b zP!o+4;eGKl4}L+cfs=Y3HIi)c)4(JL>rNj*mD_I@P{ZZN-xDRwxac*dlJ)`!bT(MhWjSy50om%wFm@-CIQdRU- zn%5GezJ!#IONOh&o%kJnw*v#kfY!GdZthM(B?cRexsy5oshy!fE_zB%uB!YI>;uMr zImm6rn}na<;eOG{>tWtG+cOmpsf3HROWjM39T1{W3W}Z2i^5ImyIndOH#$6BMN1~E z$pT3e=Uymi22M)M6!)&grtm^XiW53Nucb$HP$t!(5{FaWj$7&?p|n{PCVBPYAkFGP z5U9H!AZ~vGosZ$ko`x(!D{yjsAjR~Zg_SWOi?}T ziK-wih3>(s7;3_3N6aS>HZ$>*Q!zxlBO$CT0XVv6tm5vgHKkHIC z>2M?qAjGo(QopoHBXmVfacPhXeBFG+YM;eZbUpf4yWX4y0B6yeE=(M5`cy(T_JzX@ z?vegztxF(CdYt^|sB%<(mS`-Llc1vh)YPZNRn?yg4l)SZ3gmXbnH}58U>>HdW`b8# zJ?maR*ptv?*D)%Sm7^GT^oo(jIBP?!@xmD?W(wus8AmaUxUdcQ;vfmE=%4feeSBO-1zctKYi5j?B>nDG&X}xP{7F=ps(1l|IPe?M zz>i;Qtw=ccXkpA>!(DWA2QkBpUd7@<#kM4GyT+=)U1$=>VTBodeLygrZ{3i@$Sp)lolu|p`QQf%SjT89uFv8DPasbqdq-2( zJPW9&zaUqbKn|y6s5o`qfPDJNn>}9hfeS02ey>D)q`YXBPDwLBDb!V2GF@T@vGUQo zdi9$nzJeFxjCxeA+%0$DM4*mQ1Hs3b4BxXy(8t(}K!2M0U507IObjZ4I_Spz{c*UX zt_Qle z_Crgw#;rS2VjDue($CRfc*(Fo3v_Vv&@7k2S5){o^Pk&d!*k|y5rPDC7EDznoO26b zo}M9lk2|cB(svFutJL}u`7^;OBed0^*el=ewbxCk%eA6&{i(05eJB(c_X;5t#kGN(=C#;+jQSAT^s9dnF zAWG=pk36&S%Bpy&~XnrK6Vvn8$4xw597>3QihdTkDYQFnS}4 zLwGjWI?6wqb#cD4a^HoS^jQnOE+x3&n|H@h*nHD}tw5CwCgbRWC=MICJ_$j<%8Y_R zg3WeoGwDa>)__myQ%xC@)$1mMbz%Ei>g27&Of&V|2c#Hxjl#%Q3znh`F8#W*Bcav zQD__f;a4tY8?9tjfoG89a_pVh-iFSaDZSXX-_AX!R~D7c%*36_{5l^FUHvD2?g%hs zjF})sGc`gFBQbFywyFN9gF;;a?__Z37^XkKE=zuz}2)+^w+|XH{{p~ zw_sLA<{wI`#D1&g(gxEKpN>s73eL*>>fT0rIZ@es)lvRsQ)n&Kv1e1hPTjv36{2Qw z&QOnxgTiq8{NTs!gDJkxE3`hGdHo!|SmB=Ei=1vGngN9ReL8p_+k>Iy=#Kfk35d8$ zmspY*Ye99o$`<%l5nH$jH$`o#O5m5E4-;Rwt!}2{``zVXzj{D}3GE0*6yb045NLi; z8q@fABG7x0jOIs7WrO9oT&%utxGKZFd^24I!SfjKlj)zijx59C3ugiW(N}{6LH;|} zj$hrZ%^ZKPQh;0ExNXT=udc4#JcE~Ao9IB0p-EeiSZ91AkB-cmb2d4)nO{GCV1NF8 zYT!dbB21*Ftfu~{G`5znHxo;dW=|s{PSx!7HOr^n`rO-qC@SssY>lh03$e3B=Un}{ zXyWX;4dDHXH+iG%q>1Bdp);Y3H!ML}hmV(vTSLJC4+cyt&p=Tw8$Ro&$YVpN zPitP>KVF4ICj?G4)`2@G8xLMdA3|?Iavw^cfp_@3wwcSb6PK|atGY*=Pl(X2OMxaG zS*KBH&ld@|SFWi9Tw^!k-VO}zuRQK#*KuV#G)``vZp*7e;-cSuf|%YqS3BF9%EuB0 zSbS{SR=qlPbm6Hhj>^Ih!kT<-OC5SwwGEYg~`>P(ijC-oa<|q^EUcPDv zd!wdO;C^j`?YLOSZA%jJb_-W+^W-~4C#edJzNtorEC@bBT@X`|U z;tpbJZ~JZ*gzfYCcFj0jo zEd-zP&RE(_pD7Qg3r`&`bsMHOdFKxK{{`XUL4V zlXK_I(5dAB6`a26W2pa(s(0=tSwa?dv-lnr9HAnxsfSKTsTu(Mwom`sZ}s6_?_peO z5n9kze#OZQ441aBmHc$$wVj_{h$yjY%4K?0J6f5wH@ImiZm|Ms&i1zNsCvVz62nBx z%J?N|;b70+u^cPE_~|?9Ma%Po(X}d#Rey@bL%@5xUgiAM^Xbf!-M#(mko4WP(CN8g zx{_pr-rVd(-~RRW(OI8kIy+rZ3x0t{8(tNEQ6>5QNlHno7)?2z ztt^m!4}*?GhGF3oOssrsSGmsyKGTExX!{Vxe0e)dS{|s9^<`GmYYA?$b{PHJ^O|J` zU*&m!{!&;q3)_bDqNdGu97;YX_$L_UG&l-~o&#}vlH<6%K>7wPWzp#6uQVhu7V8+@ z1~Au!z8HaSD#CEf?KH&jHtXdXc~UUSWOQi$cCk&q#Ob?weBWbG@-y4Zf;K4tpjzA` zI>IROS6C>4aqW=945C+9(f-lxkonoaJ3j+EvHtFa*dhmjiu^UcvH_QZ5rWALez;e9 z9qe!HQ}$S3C^2vx%^#uKK(rtr?mt5Rq=G1+I=3Qm{V#%ZB{ELSh ziq%g#w{@cHXYz_`&k=VLsylg|KZ5#b`Dhc(w020g&iTCPdad&?IFnVi=kbC1rEs5PQ(_t3M1-we45=9i_zDi<-ap`q6>@*#5)v#RlK}j15;C zQ_{&n4A#`xt_c^s?mCN{GofimKo0H(f&6}`Rcwbz(cTWr>%UjP{%%IX8t!ke`!s`0*sq1oAe^laq zcKpvPO75<&E-IfVkw&mWPD<-t!6Ald)v&fo4Cd4PU*GyK3Kb5$YubFn_X;CHjaAe15{n z`FIXLjqE(lyrEcir}VGeJEc9?JU6NAG77zPcEEk&lN}h`-t&>+#QMnOz=dTY=(eJX zuh(fq@6G@2V(*=+7D&b9V%e5wh}&lVGL7@)+Z$oP_{tuP{6{u##pG$qB)XEwQS>=2 z#@VKUTXOiBIC@Y8W7CSKbh;%Ay**tqvh*=n%D$E%$I5oP76c6kRNayN*4W6SPmMX1 zrcQkc7#aOryrBU{+kzO(Bz9+m;NvmnSR>ff0{( zVgBf&d$1PzL>qAtI_i+uH{-Luu5*=HucF<|oiqM|4Vkq8KuPJAI^V;QeHz9LQPajb z>HAyiY}=H})6LM;+tuKJd)uqMoA>=&!u$N`)6CJ!u^qEf`&+Y6#vRkk)DWcm8wm1J znp?9VguzBzQ_|2a$)j@2Gl$`7U|#W=qa%`p+!*Cp)?E^kR0LjYyXsk{a*Ip=;78@$ z^9y=cm#32NC5QHln)qWq@gpMO8M7LT?lu;x@e`so$%n<`R6o43M48kXMvkILQ~5TR z{Xo%Q*T$4)<$8f;8;L8X`*Ton7OPg=NL2p*jJbSG&2imo6isN_{d!0m*e!BM z3tTL`ir?v1UmP6S3)#vj6II18yfmlkjZ+7fLXVf5H~{M>@Hj`uteTdC{@Huc3hD1P zOITg53i`8TBE_C3YIccR#l9T)Q1d9dqtvPJtm?au;Z~BvPXrrsH?nZJIw=J2s0E!) z+hcef3&mBmm>3mie7@Q1{d?bwT~QeZh*T9`Ymo&ugkC>1iA@RtZhBjk9Om*0_3l{l zN3TYgtPkbduVTA@jMD3>eE&6$ZkLdYyR6ZmaTrpBQk)WgGHd%?wL>}b7Gh84XSJM{ z#NbHjAn%FL5*7V4ULxCt3`ALAun|hLL|QjOI-hyeunt5$K96U&mVnL8;vU*E9d923#n>-32@)uAKsqk@v+Ng zkkgsDyB1y9tJRD+^5EoE$xA=;axa!vpQsNgT;8W!%aKa4V(f3|*wlx_~v&;|N&Y3&)fUigxs*QQNyIIMX>+0L` zYxmD8%cM|NV9BrQ&i(wl8&X2?&E(Mi(Y}TESITW!(qRJW_f~I^pkmhgo<$IR8sgRy zSHSt_^lHX+yl;JD8hEQN5ljZb7wbk#;6>X6=!1;A<9yZ@s`f?l+-;PPmoKxJ22A1| zBI`(LY$fuz$hwu};x}+VsMz&){jb~$*xihG%clknrbB8`-*s*gHm5G(Y+=?>gCfx*#gxMYOzLS&I)DCgQ zfqipNinzQpLqVoNi$Lc4%J9CZG+orE3U1Nb?P7TKa-T1W`KPPOD=kuuj%|i*g>_M)I#qzTAzPiWNT!iNZKQf z=&7U!p^&44f6`ot%727z>&$-nto-Hh134P5q_m8(a|?;bB)#Mk2}5Q1li@-`QMbsN zO85HW7df2Ur4oYs!^nG{%=c0x8vz{i9`gd*T;3FO{Muf=eE%*bCvz-Tz``m-?0HRj z>c?-xYHcHivGmu)sn;SAwC5(e0+{Y%bX2+}3?Qj3GZjAULs_-}#kn}d=^2*s*AhFY)Q8%E#nnu>YiShd=7MUvY7eBrQbW2pp{CL6zuN``&66k%{Z2atxQWG z+xM@aqKrL$b#Vz&eI!AxA~QM@%sI`*<}60$QA4RkH?!?c z=j=&Lk_Z`_K_DM-gyqCpTKzOrZO0Jt{J66hDwoioebyxTF1V`#`5+-2bKe3N-k>VS zE2|3q%&JYF@alr{<$A^(5542?-s+aPGdY7I@5{k*IDxL2bjiW%+l9vY9C(oV#$>F6 zJdJo8{*OVy3vtJCs6!TWN^SIqWrWyPiBaFc#rm`r$aYX0XY6Q+;z)X#;R&42+e`YJ z&pe-Fv)G;^))X=GL)JBQHgOIkJJ97FZ#bQ-7o1%;Fr8pJU_EJ|q&E}#(A;P2qp&Za z>Us2qv2wU->2tVDx?uKx~%He)#rKAtQfuD#wPZLqs)^utOX2Z|jnjxm+IH_Jxi>9KQpkY%U8y9eUmM z0DpAXz3RaAujxC$908nE8|Xy=rdpzaeP8skEXXBD-2tAug+oLYAj|}&7@#uraH45# zz*ohiZLa_+yUCE>i9o*4X$!X9K~ogKJ9!DV?#np@KTLWfnMiSCj=&Aezj1kmM|StV>4O0qz>jK*@ST+3aUVzw2va7TdH3# z(p*iy7J@(^Y+tS_>Z#e)u~)fKarf)Qj`R_9yt2yVdKA#B5rfRil$cmJ$>T7sxkRYj(%Bz4@|UOY?GW3|)ZJQp^G=mnMVO2*vvbhSDL^QQ=Rn#~}vOhu*% z68C1+j^ZTiU{gNJ+2^Xh{m=mCouq8y``X?VVMY#W)DLV6*T_z@8;Tz(h#8@&k$b#d zcqIeyHPR-AqzcZ@3=-ehh}Ne>uf_Aq#UfbvY!i>LUw5@{o*Zu^_o+07RF1Dauj{2T zN1G6mUyx({Y{g@Z6ve!JTQfreY zJ*$BoaCpya+lp@cq|HV!IYK6zZM*!GBH=wRCnQ!er*@+gxt_ZYNCQMm8L-L)zN{bKs^6kG%x zEg0N)x(@}jj9FoXlpnd8V2Wj2%hUvpe~HUW2=jXQ^^))j9cqi`krG21#PtYMMSKQQ z`9~1BHV&O-rgW5AqDKFV2ZH=>9{C+)`VE6FU7 zqht-{>S3fhr)lSA77vc;z+$H?w;i1@K;44T3xTfsU`t>$t9c0I$^Xq}6!u?iJWl_g zY}CW9eq5JS3o&&EpNp!jv?0hhJ|`So{&Kv<1RXhGziiK#$>H=HLh#T&$^^CYyrs~4?b_t+o)dm7 za3SvuO<58=M*mCCam)HIIdUW@G}&>JAP&SIvq1a1qwJEf#OVv^=)aNHWek^BMW^sA zFnes9WoaSsw1P&-(@SoE$Kic4OeI(I4oreT-fMzrM{_B`6oa7@{_jKsMp~tp~3cX|% z8+3yy%Rt__D?OAq2w_dKC}%oU+)}#AjQx*7ln{&`esLf?(dg8m#=`WH`Y1KYmDM<5 z@&EKKF#?1H zURbKVSbqA4415h5P&92sPiZ&}A88z%0a}x6Jk)aJ z$-HkWhHV4qCk5*C3_k2v{|+AFM_@wC5TYrop@|@2&KIMF4KsXuH}33p`ftP)_VyBp zLX8!x3QgI)O791A@1m~!AP?>7y*s~Pf`ZJb_;#bMJL=IRH8|o(7 zqz74)&r4y2oEL9eih0vIaa3K0%S(zoY0Dic#iHgLtq1C5G%)C#bmP2JFDR!0(&|!O zXrMowZa#cP%3XOqn@81E=DjRryAYMPH>e6Tnb?FlU8YRRMXYAHg<9>Z{(=vVJ$4&x{1w$#tq;z`S3UL5;k$0=ce)^n&b!ihF6|gam+hRdE zw%^poaP0GTIxuMR&mivq8I&-w$8fuU)z1^^h<5OsD!Cld`a&)pee9v1Cz9=hdpp`e zxkSV7erG&Wl!IA?`_c5eD{2s#S89;$^gr4eD5PcQp&Cu7CPU3Ux6=nx5Crr?9p`hk zfA_Z`vW7Sw7kQXXYPs136nNW#+spsao)~M&$&#|bpT$j;cp2)5Yr%TsN-?PwZuN%} z&SB!olB}}?9*aE|yu>FKynidqA=oEy5>7{-_*0?t|5SLDejPj!vr*3Ju9PEkTKvIb z#GzOh`l>(YC&TbeW&Q`YJvY?>u^yzJ(s@;AEoQe672JLSn< zG*>b+e~RX6@`VT%^l&Wxe!5@^O=E6))LOeHBk8o784FG0?Dc6w;8MI!z(d9I&g!`u z;#Pgm5VmQ}94oQg!v>AMCy1iOTQ5bkev3q(hrS1`&nWaawag#XXh3Rcncu7L@s{;@ z#6-hCsGUv6fYf}Pe^URXKo3XyKd3J|`(fKdvkcZfTRwIe!X8(Y_Mq9$WYW|7x%?v0 z^lxt@Z#xk}4<~aC(Lj=^?zht?%3%;`@PC8_|W7ri|`luozpOo zTm||M@+KB`^l--igM8Xhdh;!Ta>QPfM_e7HpnUvIJxw#Xf$*n8`P%$;JD3i6)3SIvn~=$TvHDk>33y_ z_Jh3@t)BHDL7_MSp+H|8rx!YDXb{7NaDG~&>m|0L{NlZ1q>`~K%X$`?X(>JhVQo>m zk4N?Sr;6G~y>+{=d2a)>32E(DIMP(8TuV%Y5aWaLLc)7nMe}wr{alyb8*t&eT6)inAk%&y0GQ zX&raeh7>ya7Q(W(#biA%A7_Ju3A~e7;k{BUff1B0eL`UeTUZTCgsY z@L3!BbE+_#c(?z1A}@Wfv-?f!LiyhwweJf@2L1!=+GED_50gji6}O#(tuyt@f18xi zIqoP3{nKP{!f%t@@V`xV*!=&Q=&TF07OhA~2jfu+_m1bl{ zX^#(lqg)%hvbVi-dH~wIO2q(vBau*#A%&@_EyWl-N4MYPK7ccNXL?=!X~V$C;nCIG z>W2~!m{^b2G|G(5IFAktI1HS}qAAKNocm()K!6Jh00RcHG*vK*#Ls=kq8BR2muSi& z0J15F9E%sY>evJi!3Pob4FNTRXeO49CuS<9;ufj6H4Tmd8#jTWWA3o#%!JNtPHG6n zQUs_WGTF6#H@^gHf2Q6FGG?kXR+GTxd~ZtIzliA&-|UFy;~oH`ASmoS%)bxsiD;y^jdxH0?Z}Y9gC^k zr5IhG`phM5652$5u??8K(^6paPGO*j{j8fI{+T?REZx77SKVRVnLM!=$NZN14*ijY{VsSfF>3*eCPcL8WNI;wFC(!B- zeJ*(hJr?-#1x1Z;2!Z$g{vjj1!?FUl)iYs;a~`)i00=DRPOFzU^Uvk=;$DPA(XH4QS*>Q;bzn74Huc=Kcf&2hUxl2bZjf~rMWTkB=PVAS zJ(Ep_k*?twJlk;0@?_C|0{sr}9R1W_%X?k+Aga(|56jYp#N0Jt$Zp4tY9*4A)t#L! zNjujk`c$a;9qvmUDQ~5MNIj56|`$MkX5wnlU&r0 z$1Ucr80-gY!ztMl2G*{-w8T<2A+>lgLhN6}w|`P$%_{@ofk^-#pGuj+f=?pIA)~%V z$HAzds&dyH7VJ7!GJ1XyA4*s|(BQB&NH(};Fke|ZIDk^wDk9&v0BNS!UyvX}xfZJl z=emCF#!@)3IlKPS@ygySC?xTlsB@~yxgu@yWfad-=NPdQm;>KO$eofCJJQ)8Rv|wT z5yYXg;Gi4qDniV8dEKwNOJ`eZJ9mMP4L|7HBhO!6y0_xHwf?(QQ(5l6l(E?=nucGN zg`|Z4%AXx{iQY*eYuDAQ*M*JOjCn|=Qa#O=)&360c}OLy8b6U6Y3t80L1=g%60=PQ z6XldiP3{Bb8|=7yDWSh{?p;XDYKKAe_eVG3iy3DIJ=*Rm&)hQ#c=Lw zRj|3n*EIM`gb*T?AHrtLo0MhEi%|%ELQ&m5aSg3XV6*=!^0W^vfcc10c(Xc!zJ!y_ zn$@`u7>!@RJ17#(DhU$2!7r}DRxClDTU7nU=JcfGL^dJMMz&#SuW+uedk5>f~{dQ zI1~K#7L4{G2R9AQyHH+elpy(rw?Edi%!zZO!=I@1dl}{n?cG^v)`T>q&?i*Yixc;r zsz`KZr=I8Ef?rT5Z&!I7fr9=2E!aP+1XAcv!9BkPU;GwaiFe}U%<`yyV%_NhDWpoI zLHCeAG-6#wG$Q*Kuxn3MLcsUGffZZ7nnqzy41!?3+}wJr6t=H(3t_& zl1f1xi!h{+SI0&?O%>N9uvG=#`;bS`fGHd3x~62);`kFK<;uZGzaHhso67C;7V;VHY{2EL)8fle zfq&NE-^Ki2bK{)%XgsJzJ-Uqq%x^ZpsbdpZQC3JHfZM|r@F)ze>SHeU*|vsnP{(C< zO0PaE9^KR~;ye_e=H`cfAs%Q!BGwAs5s?7hg>W+(`;Zj$v~Rlp=Ft_*!bRe0dT=-j z$i+Ij_csm5Q)5LOFuA7G00E=!dGbn;2KFJ{b$rX?&{1$TOlxmDkaEzyZ^zTqa%y13 zid|~3BC8|!Ct`wEot{nJur~gi5IroD!xSj;#O>k4s}8@q&6rq;an_*_n%0z<%>dV= z#OtEI?1tapgf9!@m*APB%48wA_4#XCL56yU)X?$I(ebebd!jbEdoCG!?H6kC$MzvW zdM>dhRqTLo{QD6_?N(hqZlI&M3dZ%j?RCv)yDzu>Vj;Pa1Z874U9&cuFCJMThG3&y zP^0)d`RW(t?rhZMskrs)M1H^Pmx!__;a@wK?hN$dz}ew@qJZ~Y3ijA< zt(X6$Kqp|jpTH5!cheRA%TO@71ur%iOppD}=`<1ddOWKK=#YIv3CK`*MJ&7>{wih4 zpY#Xpf6*72SnzK`0?qGlH3QnhLEH8R*#A4627GAe;q?X!8K2S@47aP@+r_G87Sh)kjTMRLJ}q7tr;V`>g< zjW#)N>QHgHb1?!8kILWXG^b0YpY{g*E z=r~y2y%3TVgoSL#*I;yp=Ku;yN!ju|*>P>|aF#X|XnPhl#zYlc+fU89l}V8thKAcF zyjtLqF%wkbK}-%+r;fEtu7s|g7Zqr9aTaC+gN6L+Q0IV8<>L_Ql)(8iVI)_vUMV!e za(vW3^!%}%v3X!zzC1!x3tDr@)tZ6+4j0G#UEJ6V?TDjjRo76Dabau}mzlYSHKW{b zaP(!`lhp#iZYmdIQ_ISf9BJ`OVzFF@LY;DIH0;&JtsG%}KT-1oE8W;_<*2MMQhdVR z(~LP(gH{Q)jV1^kI!=OS%4E4U#uck`2g8bDwPU#~v2$pGQ+z_?%jK|n7V@xlo^-h^ zX~%wiS{fQ-(utWFB2Kbqiu}B=iCN~!ien5?+i6{G(19DK7MaQHC4gzT9 z+oYb|zp0pkR5%g8shGnDj5lkhxJ-aHS(DwEiQKJ?hg;R2^rbTsF!{u;H9xeAu-CAf zswbX2C8qf5Qqzq&IZq<+8W-r-8yOtI>6s3A$9LEn$E#~`lo;EfpAY)ttp7fsip;;;12m*8sv)=e;zX+Vs3h^ z!_eM<)3R^0l>rnDci9q_pr3ynb zT~MZHH~>Y^s^YkTS_na2tDgkIQA7&^tTDWR zgz3Pg+8G*<4JHDqm+g-k5&a&K zc5$*lt>&a~9E<8-D&Ud-R1wsDO(0*Uq+V&|RN;T1z=Nop(iDb-`R269e@P_8yqT6jfyxN$^G9{_Kdy zEClPs9#!VDhsxn~@#jb)%78HG`G<~Pu+&v=KoRL+~lJPb|5T8UXWzcqIB9|-(qz-Nm+ zlQlXG@Vy_YGW8N{iX_}cMsy$s49#p9M*JOILomj%ki51~{vSRtB>mV3>Rj@eJ#=v* zF>qZq+sVMc2odN_1*~Gmh>l1Ovn%@o0?G4*rE=u+vm4cl1%Pp=MNcGuIxs}0nv8#K zz;R>?o0bA*VnC-z@j0}^osh9S1mn}4NMQ_^ClNUbq$r#dDP%*2=qWJn``Qf9!TUHa z3FL+|HY)*Rgd`jyKmE2}l2aCG$$?)ISH9ij!X?o=@;}e*8@l<=@Nj^DI95S{;QsU6 zzJ}%3&l2Y5W+q?%Ji_m#my{=2d;0u{*>F6dkeLWVGBV~hi3T>PKelt3a`zxuRyM1b zS{Zx%iM9!NieEU(7j5{v)NtUbcQTFehv*hI$04MUhc}-$SGUe*ua>n6&XfBMgm=z| zecKlAMgGe9tPP**bAufK)yC@SUHI+Jwp*Qk=llND-dWoFp( z?O9t@74rFc)*bL@|9Z!Y06&8PR$Es`Ibmbk+WyQN068tmB~2kq9eK>ffNN#QWzvwF z`=x8)bl<3Dg<^0&{PsM2?X{#O3DMvSQ+V+8yAxD^^wqtUm*vh~6lc|#lf%`F`E%_e zm5;3uRo9}oo5w4s<+W3dftRj8)tyhF&0~_ew~xH-ooimvJI}lEm}A^fR$y9iQ_`NhPjiRM%ATV`U)t@N<*oZE*V24!oWg-5EfM#1 zwShr!=5luM%D}>|PbK2j>f6rcN2aMEzA9UL?oFJS`p_{ZS6dRmwI`LzdsY*@9B2 zpN9HI2iBAAeXFY`fvxGKWtZ%Hqv?Z6*;E+@`{bg~`(;(r*KsVsv)mh_ew|AUR|+8w z!tqwi{RrvZRx>sQHoeemz1u^r=S#JMe0!IWrUKI2^N>Mf*#xK7>c)mbQBeRz6wv|uvjI-6#d%&axxsB;T0n4RY(#Ow!e=K!M4 zthMeSVAJ6yun7m)#CCTp+4g}~8Oc{eq-d}||Blb(5((q@3QGH`IZeS5^X z2gy}R=r`Xe5YeFW)EX6!BnLXzGkHXh&1N*meX2a+h{5q()P%U zeXSVmWts{P-kaG69u@3(c6uDrFOA9Kav_SsFZS++b>AzRJ1Bb9>kTGyqkp0R?=jmg znzJOhvG zTGxWjW4P#e%ZRU3`il6!YINiFNYWcd+I`&L^it(x4W=n2Na@2kjT$$KcK&EP7>rge zxhV^)Nwx~cU5;uCI`Nn_u;0}?FK%i!CGyM@(l6ln*)c`;hj2!f=d3hba+ z26hmi0z0CC9o3S}kaquqz@LX{0(niv>!R5HJ?QV~--BEyY(Vh~i+`ik|Azkq0*9js(k?l78H`(Y+7=Wa%CZRrDIgFC#_hy6do-U2v| zCF>Fvlf}%;%xr)EZFvYGqdx)e|P`rP<1FG``mL* zR%PGJ>a1)1uV#JrcAs{c#hU-%Y=LpZFZ{vz?*{*+xlX(Za!H$X8`umL*zAuqL~Ex? zsTahj`@5Lm!AB%V+LW)gQi)w4KHf{d41x@;laJt|7YyiXv$M1YDf`e_{}g0TBw z<@RgttQl{V^w&qzcJDWy_TI0-#)8!=le$m4kAvf}lk%Ci3*WX6{bm-wCZ%#*J3JoS z=K6>}FaDTKy|y!O{<@JtIODsK5o3HE>v4Tc zwD7k3N?#)wQ3?$~^qub#uvF1qT#hkP>&NIxXt&qZT$xq z6F!3-lKs;XdwPuOZIAq@`)<3B*K^xuj!}HEmGe;r-L{$=-BXi+ePO^6tK18e%97S>f;pOibcPD znU$K$UHs{IY`(=n4^&T}{#0#ZpT9a?dZj9n020NEpyx2!jP%$^ZP3cwuG2@jke$-Fw@XWIy`h|H$V8&yB=$eeo$E$>-QXa?O@Qs>9ur6&#S(!|oMm8lyX?qB?YE z=&FW{5GJVUJgd_wz&lSoz3W!vVt;V2ia+~xvu4nn(wOArR3IvK+Mi)cd3}4-Q9AtM ztTpy{^A%i{;wm|z`dCG@XphmEKrjcft;6QBX~mSn`Xql+G-bM^(}p{(X~n#ML-F}7xU%K&w7TN=rw1GrALI-8Q)6@Ic!5#AIdhgV&A>p zO^XXe_0DQ_!+A2p_et=PPJ@&*w)3sv@hm879OnL z)KDRLT+WVA8#|gNTul}pL);hJJ1dUgo^cP%dK5}Ii)PIDnyt?Dd6%2UnU>0-Cw7Et z-;HnUwvr;Zna<8oVfXKp2?7-5^sljqzP7uv^EkXae)m6P>#=hiZxNiaQBGDz3|)6{ zek?w)8SA)H8YOV=N(D5C=y{Z1M7tAB%D5~0XtzIQOR8{9Q#`fk5DTw#JG ztswH|?SB8B;8Q4TN1yLi^qpefptqxf^-DM3R@S7#z~$M!S3BXeSG(RLSR&8l3-VCL zDyzWpJ2Pox7%{K-<0*E0q45%u3wy?aki+KNi{sDn(XAh&ZFq@4zaXO>c*;hNv#>x> zX2_6{z=TPCCZ;^}OM3uE4ly-F79D9K#8GxKk^Sut@0EyOM{xbTANQOQof5hzMOvD9 z+wh|d3d^&>O~+KF9;q8gqsoajNj={1Sz=gZI5who2kf#nv!V7@{=`HbHiRuVTB$6Y znu4Hq4KEcAWa_;wi{cU`nTewP0dW{|Uj?`hkjAHuK1VrcYM-xG>a6|pu(bH=jE2uN zj*TYvO?FEpI7Y-R;Xr?)GJP*$96|EDUV7BuDKQ8y8~q}iMI`Ze+ogwQcN}JA*Iae! zAg0O7xPg;rXG6?+`2>Vmllsp)IZeC)TbUy-rAq&A)tSn{mlvuo->w%PpBdL}a?#H9 zxAX7&Eq0S#EZ!5(TL*k3;chavdl<|_*S5a5(>^Px_%PO*XDxI9Fgzq#O>rI^g9%%`ygG-594^v8WnLXPX}e>c#{ud`rg2O*v%L2+$%F+cwN`alRiRiC(>yEX>e+GcmmE`C;lawNdU{*6Kw&s`->-Ub0m80=E0< zmum*5-|NW8TfpS=t{hm-RE%0nA3pxAuWb($aHbi$te-kVfSH;$7#zO-{gW%bW?};D z@a=b`QPQF%&t5Y}M1)=&rfP33+poVNfIlWg9Ft8LVCRW6e7;=wb}nJIj<_!og0+|0 z>)dDOvna!%j9vH zJ*NiQcLI3>{n{MbI|!D>Kld4wen?@bZ9Wzj9Q(ax^ZJLBf(~?3il2iHYYrp*&7Md5 z8fLrq-AU>4z3{Hohi)7J5#sT>rspL!NvEUXXma0%A+pb!&Bp-oDG>z5&e6uYRDaD+ z!|Rw-wd8~A5H_;(+V1;nc=J3>&kqb3lfhzt84);5+aje)MEb&H2W!9n78aP*lGQ3+ zmqG3bxT=n^<=ssUet3v$IZGe35HIEU<08E4=_TiHt8`u)g}v7ZC)&&loyuJC^wj{TIminfz9m|?jqB}r z*#|wCjI!3vSz>QngBQpxnre63ge}%>p&Ms-+lAlw2h?gF;A1m$yzi$OK(n{3lPl|L zu-o5D1X0s==`X1%4)%XZ{aLcw#Tzv!#cp_K#q<^ZI=XmJXm>jbVl&f*a}m(Nb?vY( z2mWN|;HvQZWZS*pM&RfFKRW<>z@MHVDa;=dDQm7XqYO8q`bnEijdWC zkji?2if)%7w;N4Q6HPDOJH>*4Cl7CiRj&JVfUj|ZZxEl^1+nR>7!;cUTx40hQnoMq zafQ0UKGn(ds%q3LR-?BaMXTIE&J z;>u#r^qdcFH7jln;W0SHx7g4IXV!uWsc2P8m*>BzRwPFYZB6N}x>ecPU!08--EUAv z@|f7G<~XayxJj9w%4&spE1<~5X8!HFbbBDhz3Opujn#O;?mhUcrAWpu4!UlRDNvCUp^a@^zj;<>mG0(=!$(c~ zXj13TUCo!K(I?4RxjrE#)v4K@k`YMu)l&A=ey!f5`ap{A)_1T6u0?_N+JA|Bo$US>q;&1a{SbV{_{tY-q`EW zpj|ExeifnmFp1@+;klB}Y5qEFfo3Fz1Wo=^qKbAt$Aj&D!35-SwRrMy%$aD#?b_|w z+RK%;@aZE7dh8h?@paIE9KFXbe;$-if zbHJHv(sDNOl{u4$E0stEUwxOoE)+y6;!^1ZgLmAs?a#+68fGQh$4q5I(Mp>&04P4p zI|INFU11PD+0WB%vTA3ElMhtOFi~k&rqfL;DvpX`L=wU1^1` zWmsQUgPRuQh+73Csp#B3y7;o*ltB;-GARf_og>4UN*GAr96UVBBYT7hmkE~3IMEd# z?7u@IgZ?|@#hN)Vr0eBhA$gxdmg>#_6*3D7nN%pO4^gf!M`@y%1kBlr#u@{AgXS?B zSvXQTjY-sC7JUTX&Jc=B)ZmsZ5OJ+D#f4TB#J~b7B+v6)LXjJ&wxZPT+T!aM2%$X8 zj793uday&=5Eu}r-@-L~qPw>tFbyxCzd(!x!TgHso}6-sUokyymHds`s9oeyj_ltC z+CLn)2=WC224yWD)?pTVi%#t-Llu`4nJwRWeSwzwuGSU?#l-~fJ{aaQeITu$;g1LO zJ|=UZUaJX!U>Fei={{s-`9bb1(ZtB=D$nzy7&j_W5D2S$o@gg*I-zZ|Fc9KaqQedm z2(oSDei#xkG!Y0r=FC|cE45fSp8!!>7XOuE)Nt4)rbKbsJdbuQhyf_k#-v*up)e2< zFg|wBYn(!_;R@Zx32PLX^tpB$OAPGiRn8z7Ue;h9YZMK(V3t7bw0;;Ajn}a}@TVGz zY&aAU>U||s_IYbdfpqLQj0=OBz)OTf zn8-{FN1M=2{QV>}K{x<%91Kd!|6|a9&@ZCPaAu8m*hlfunbJu{qBvvKQGY_{d6)s3{+;-q|vC$*Qh0$u~yRXMZ9DchW6C< zXX3X}o#TelD2#sDHCnARkuTB3+2hs6L%DiS2QJ66wXgk^Tnm*%(2f0FMNY*~y?WzW zQ);y)3PzRc4OB;4lUhN(NFO~YA9_C0>^);mbyMuUbJ!x=UGA*#HL-CB@%@YTBa5S( zm(!a;qdOg=L>-3sViceBo~XTj?mbcTe7_IIq^;(@Nh0a>vgm#A6G9&(7^wh`peUNp z=+YC{?~>uAZGK5V6?OS&M&7*aJ#y_oPRfUmV5MWGq#tA98lP@>Gvm73)b1#nTiv|y zbooq8Z%@g&zg2s^DQ3A>0mcJTKf~4Tbm;}H=04TY9Y30Xc5{ClaewpY%axZtmuXAJ zOIj+aH367SsUyt|L9E@uuJy&0Hxmx0zf!eR zP|EB{;7MoDAI}>KsWp+GxJYe=sU_0$CDZGDO|tNgw=_(*^vP!l>A|4IJ&~~-ys#hm zPn3>TqLDrFj3j#Z^}?H%=?gLUw^7zFU-UkT&yl-)61(1SO$1;*KS6O+Y~~elexqtHpl6$AVjr1n{SrUm?JDd326QbgvpYTW z=4IpOOLeV>?Ldp6ucB#W_j|%Zx2c|>7^uGc+xnyh+%G_2f163*9UT{Sxt#uZmdZCo zj6l{SUX{yn4A7LO|BIe;#G_Ao{r}Ws?~5Zt)`D>8h=8UHHR!-6kP6LeMeu5ruoGhM-v=w+G=52eok!|f zWRfyiS(uv`XjoD!lA!9*j6MV)Dg;KJf-?!*zNNqUvWh-vS1vBompFqhcHFK*a%Qk(>0YRtE6Oto9t8h3|P-_d)N$G}n!Z~CeGkw$98^$(> zm4^Mo+=x|zJVl(g-u~(eqLdxy@DRf;%H}*o5oY!X0-hdX0fmlDk>S{*C9X+~S)lpE z8fJz(O`P%Q9E@e`_qk#Sc794P?F)OLh1tp7DyXFEmw|b{1?1@|lvLu3WpH>C+yWd0 zgCvU)b^Z1Hs#^GYdM_MNwm%pz?E{f4eS{bd!4_srvLqS8?2XRP7a&EvBzva>mSJYc zVKT_m=b%um2=nmN%+l-!bn@2ho|czG}|a-Jx89t45s-*%Z<^Oz)yvW9KV|kVSWnV5tw6q?h`5@$pD2E4>#*c zvv8yN3gq)AJ`_7ihGFn(k$6;T&*&4yE7%lCM)*E@0S?aJVx0c3Vl33ze_J+J(xj*B z2`f>u{nparJJ%p=;JLx7(8}%0rL)ck?*=}B73Vw8i=QzoO*5iyjch6%L{ZYu#1 zjo0PsvggP9cJ%aD(dN%_V7W)MkiLh_Nv^xX4xg|x#2r4la?5{nP!3b}?BBN`BF7?c zMalC&re(#y_Gz&p7j^{=5{ z$t@))LW#YH!%iArk9jaTkCep_Y2Qhhy`;8y78yqU4H_EHK6E zXEdsaS7;toj=%Ro5|k#Ei% z+w(D!8ZJ_z5VI26#R#H`aWoo+$YIJ@Y;PoLzN&(!fEJcWc^zGv5&|w@| zFbo*hL#Pwl!gQUCD`5yYL%3laT7Jv1id@=NiZsvx<$AoQ$ky1j{u~%89Ske%g8$*F zXg-=>)d*e>WrQFVP2^Z(ED1@X=@bnn1{8y$MY|G~{G~oX%}uuo1&{TQq9%|^qC&eC zjY6d{IOT4aIg%CTp5FSBC-u_d49pNvBLwImEmUi6+994KjD6x2p(>Jc0M+eyD^Bwd zlW`8|3*o9gQ45b5+0sY1G(i1 zyGV{{B=8|zM3`ps6^A8GS8D6bFF?~ol+;zTF0hrFRa0~dsp*Gs0YNDd97ab})p^Of zSk^-!@J0wjxD0*gqh*;4D`n_NBPvV;E@2!|daWhfPXC)MF1q!5kM3tRb${tvVw!h$ zJKfB)tb#p+1z#K06Ym@DuYugq%;g3#T`c9P%7@eALzqX^7;1MRmv1XU-2xS#k)E3+ zoOOo>Dj2IdztKNzdXK6lC%M3C7Iuh6lRRH0thPUF$;gx7l+;8+Z({bsfn~t|lk7FAp!2Y(uu_R205h;S5ehG*hq%51V&SA_ zn256895hKIC_xi)MZ*|>N?a*4^8;eUXR0&=QN;tYa^>Ok2osMANyT`06&5cXIf7bu z{3sbGBHrc5JQZDd3}>a}9u@eBBrC;wDlrULdN?I9P2gjZUn-^iXw7a!#4#|AvC9hL zRam0T57K8p_uJ$}{29M!)mBBumBk`Fsq-S%Cnd{_c4tl!6Q*SB9!aT1Fp{Un6~rh4 zQB@SjbI?`E>!>9$Oc?@b&u2{$D$@Fqa8y;&jPoMIm4-dALmGL0LNxl*0!ISZ3XSaO z&+-^F4fTPvW=w@N+*p4ywcblrrT`^K9hE7mJFrwSRnB~D3gNylQMVOteK78aE1Y=f>?AcxjY7sfO-C} z2-5{#HqjU(V;)8cqO1%|s-{=l$vXA-6^b%i-vgyCl_n2i)QM$&Y;$O*D@g_`rzpik z$oWGeb9;o+^F!h2&s=N4`$Zdy+Cp}icI1j`edz^}hM04>lAD|QMK^81SjgyHBi1$V z`!s%~-)^RmK5m^r)d^(AT-6XJrNOSzE_0L7b>=}piSdX8Wt3>?PFY{m&+sRvT#&7Z zmy)QKqNxV+*u9b}RLB-ORGduxpG+HQKCv^U3TUqRS@f6)fFs-T#=p%-u2V*3r@hrf z1>wPPz3|h*aD5TFsQ-bm2elhti%uX~n7}nX=t3#o7V>+llnLEjm(I49A$WnM)ib=% zz?rC;78*sCJ8H1v*p_~r1M!|t$hN~MJ}P1y7;Nc}UB>}p_+QU{kf<@AJ^H06@aJSkY8WrHNFb14xP|!SVf*Hq+(b3LzsNgF8Q5pgVR7$P_ zR0>cK0FQIvjc3@Fgf&N(m)_Pgdc-2fm*h^(=h|cm4FWF$QsQx6ppPZt6YW0)$CTuL zTDl-kc4!-K>k1m2{R!K1VeNzNMYiXlqTxtQS0yyyAEbPKAP?1(Dg~LWt@tcge(#CvPX5|Jtcdz1%vsEC3)>dM!bzO*DRdTuJPV+r&ZamJKCl*By7>kP zG;7B66yfU>$sPzzoP#G~jsqsJdcZ6+eVoH(xxG~8r_j`>Ng3`}?_6Rm!2RE0Ny|kv zL%bR{s{v(;5*2kYkGD!);Lbt-HLg+VZuo7fOYGov?jZhOjZ7!%JcXpYlRY4G% zM7=s{vC03}XFm4<3)}_~bXfrd{~%-eElVZX(9D0u1xcHZH9DcdkHP0gFSjpAU%aB` z+*;(hJLQ??r}Q>yMil;}fd}1rF$xD}3A2Ou@H@~n# zvoYjS0m8dCU=VOu?4^H3BME7uYI}1Y##xD$pFnC8`|Nu%4)NKKD)51*w9z&X5lICv z#;V&4zI6S&S?U+Ry@#07II=khABl&T22xVQFmB>~zc7(jQp9|`5sLCP6lV}Vk*R(m zE7h`%?A*pMUgGmP-BdVdOvg}6N)_LI#Fw8bIRohN&@#*sYv9zuZZNYW!uWTcTVVnq zt6>6ZEWJwyNHIdMdrCt%x6ngG$i8{(0lxx4Z$qgOx8mMN2rA3?_mOtZ!vvdTYmNiw z`;33@APUA-EQB$eqxkk^HJi_nzWeXn;Gq=ztI$wZoL-~e?I&gh&3aO{mb-9_Ao)<{M1pRVJ-VGqyGoXZ-jm(27 zBtas7f$t-wHM&h}{^3>!S{f!u{BFQ2j^YbaJV*59)1bo$qt1|1C-DCo6kldzpYl;6 ze*a%0oZNnYKKZBhT=6dv?9fDu0iCkXBVVF_f&aqUM`B2<1l|Ubj_~z(<*$$?8^{9E zcV5Zi`70jhF8UuYWJjs@k@C>Lli&~aGvhk|J^L>yWd6SfVg7bZ=rzCc7Mdz!_&Le_ zB$)R@7273^;Qe1sMr$@5^YTVVp58Sp)nXLGKfS?Y zJ^M$_Ei|43us8ORN{oSW6yV;F5sw=aP6`wFF|e7L7=7prGj3 z-<3XDA?z_fIVt7|1qeWv`m2Htmg(2^FYQuo3uM7B5Xg(Ew~&X57=?*22Gy-r~2Ki1{sUGL?Fq zxA$D!27&^dzh)l;VM_nNl>QB)3n+b7nk4x1Iqj@tOJs;b8t3iy^}Qe= z5fbq~K-v8k`>`@=5Zu#mP8nN!Lzz&o20)RzrR@mxK(qy+0m~M1VvOwLg!3#e0GqHW zfP2~@Bhxj*Lprq&NDRKTor&+(!fckLSNOsfv-n81;g~fS6xmB+pb{Vg>sz^d9=FzR4l*>uW7%ne>c2H~W?SW|V z#|$Cg3LHLwWND5`{He}w0G&Ue*c)m=lA}Pi;V8(&)_t;Ym`YQ)dBPT+lPkL-mR`o4 z2C>>u#2jizeP?eL8mBOw%~JM?0IrLriJ)(KDS9~Li{ttZsN=l!G2xnQ`57&cFuP^)w5b!6S+@1U%qid?Exs8GaWn*fR8-WZlkW6I(G+n) zYHuKihKjU$lA7vINGf1Rp0iXZRQUpC+DdcxPS`Iz{!U;=qVV=+v{VQ6Y+u)YAh21J z2=laOajNprz*`!2^AOo7@>qg9D*z6OS0|nppoCoLsOG8DATA+9=|fBdolr*_Z=>Ek zs4wF4veNRil9sUPl>yY!2w!+;bS$!*l&IO_$Po1GJW>?_aLFG|)t$jBrb%e=PZYqz zaemf=EDz3bViAT8N5pz-S zw|DP0v7;h{DPf-YKpj3v=s#8*kw1`e?UwUf#5%De0mt|cNzw_}XmJH4rFvPiys|2o z=sbsfM_m6fJo*}xFluC0Tz}wA7~tW44#u+tgPs0gT@*(Gri-keFziT2Mfwv`=p#N;+pG7@d3jkdbX1#>37?lRC#2Mq(9ADqM=oJ- z8e#C05+^N{lN0~NiIdH<$&ZJc$|=s8s!-w+$b8QHAktu1He2*?os9y(tk40y9+Gi| zOqhp7golQvMhi%3NhA1gN}{6p$m#%57aW`;(V}m#z=H=h)teGvpZbZEQ+>QQ9C(&! z@a*X&UFNqa06Ge?Al}D_>R>-Nq7wg;1!i(0(3vCA|2X4>3Z0Kt=bYbwoq{kSg+FD^ z*5WkaNlr~=OG71C?e-hD{m>!2Lo`7y3oblJjnseAN~&Dhcuh39lh+0QR;VPN&v`xb zGuyXSZ@ZkYn(iU^M?F#n>fRt%J!WSL_bc%&!pyslv>sxVO05CgW#p>Cvx?7vU%*== z?b&TA6m+gW96rBdfBNgZLn|5PX9dGA%Ft9|2c%#!LNHtztMVW#|NYVx7nbEf{&Nd6 zAt}B^X^}Zh{5I|*K7*pvwYi|-FsVQReav$2OWdLW<~1k}aGvP>pqvJM zPy<_P&bY-j*g)o8-y*YdOI@BAdY z)8PZ9Gu{}@Sb2hCoHD`TQfz_4Pe`Pj~A-|tA|BF<`J(6EmKo%_yB+s%iAX~-a za9hEKxO9&`!YK7`L)PK{@JR+D{AEZ<3OJCD)M{oBn;U<0`rMkRlNPX_c)F$N5S`$h zDolVbN!*Py-$_en*K?xdjalAFE+z!HOi5VzWxapv^sFK&4wYGIFZ;xp(Hj>R*+7|b zy*Wb#PkQC_)|EOnKM%r|lF#=_#6$obYi%NA!jZEu(Bpd>$ppjLRJxQkV=dIOAhG-xT>7YAjPJJ(- z=`;qOM$w1_sX@G}WkLge0;wFThRNQSy0M-*$+IN%md3HU*iFATBf5+Jeo}-pQESb^ zwOn3Cd3}GemId_=%|m|pL7WerdVewCG6)!^X6h{UBq_}uj=vc2Y>vD{h)kL$FyxEO znmq|jQ18`5Ld3L`q|%xsl>jb-H!8z3CpJE%i?z%HkxY=G2NPz^HJpc`Fw1Y_VKhv1 z_w(r^izN9WFg4qd=^L2nm3YSkujpBC2J6T(@&7}ph%d`s`Kgm^N(bbdS-kB-^3zXJ zi9KqgRCj~_Qil`pN1X`r|5j%M4^+nu)9v?mj`1HblfxJ1c$d<@f$T7GpzqhC)9zaXxlS` zZE=)6pgAM2+m@rW0X`%Eq~RNg?E_Z=e7^h+*+#^8idov#CC1(JOmC0#(5O697J^$I zLb8zn98@b)-3hyd$yp88+qTxfs?=jxH-!w3y61@S9GR7hdg%gwRpx)stZohTlL zW_BmrY$@7RYppLo4;UVJ9JLdR>8%k5I8mr@v5$#^*Og4WxZd@FOU^U*QNAZ#3=1;%8 zHncJjN5F5jrnn}!u&{!wC4rE|tZ9RtgY8Dv~a!bv<#{ToSyR9UmY|JU`dI{Kg%$jcFHq{9+*R!0{6{0DICw=QDECT?B4( zkgKy9T>)434nQO~Y2T{N_feHpUg)FTv|7uhHr(p$Ky`ron!daaDaot7JaSVTcGE#Z zfuUlSZ|ecL>sO#zveyirNOEvX9Bb&8^>rBZ&>Eh|xc4t4oEZdUTsK5&?hQ~kYSs_nn-2*Z?ynaX53}!WWUgVRe{Cc|?X-g0HJ=)&} zu2cBlgEPIH92GD`Dh5W%?#Y-GKLJxq%n=P2kI=%w=G->$e(Yh6kDR>KQmp zP(Cn;V)>H5icQd&B;11JfKS2F4BQMg{qmDdlM}o1fs*8mqHLFNmm<1dKHi_h+o2@he(aeSsSEIkb#d%9>KR3lhxU0u(rsmg!ky)V$VE6D~yGwo-G)NDr`0G=k!-cw7rhpfF5N%*VED z7BHMbpD2PUc8#9e&%&7crr*62nIt_(a)+TU;>AgKR# z%nVqJS;f%E=C2a9TPgi^-=XpgpMGhJOgX1D12~NWEG5c)v@$g2V)%umbfl`!~w(UnBt^@r5 zI7^ZDAs^98_hg7MP4qLeL;%`OI?B;z3zOEO8FialN_%!CF@jA{_r$bhHLCRZGVvQ&cg1NBs^hl7l24_5vut*pY+&FboN$fq|?ww?E)|h}w zmgwaPThFi!l`%tlF`*<@Z8OE=QRX9SywfXe7F@}E(K2f@w&w^XI%htJvoNui;eg{z z6f9IE(*2E*F*|(?wV9a=P9C$8cb^d`Qt4uqC>E>;p+b3w!;QQ{Y`MlBt}J+IVrq_BcjMd)9{KkUU}amGi-SlP zxA&!^O!^;+Se#Fb36}0$v{)TXXbZW+CP;&E+wq33#sdgKb0Djx(Xby7$e&wTI=Krd zEmegtilf68#gX-9?WE=qEyjA`z8k$evwSqS_3BUc<_g%!!iT@k-ch1Tg;!1B zF?;aEZCT!>2)5|$su(yN_NUwnq$rP8)$Q9uf-z0k|2X;M2(vUh(br ze-!6U5+-dM0oDcYqy+)N`1dL4Vqt1)%JkQf<*y27T5|RqoY*}-)sZ_6mtHnpBRa$` z*REDd5Kvo1Vw*&@ZKxHA&&Ycat{nUP47chA;VxSS>#Bu5T`s(3*b%fKp6X-MtVd8Q zIvo$oeW!pPC4J`i?$uYiS-uD*1pOW6DEs!Lb)@8hK)h3e_%wRe>=pPvyn?$6_JT;h zByrVDvv0jxtJ?-w3xnkWBiS}v+t+dghoVE1+{O?}(klvnIN6S3N{D_JA1#9z2%WG( zR&3S2N$-LD8}lYV^!v)zJj@0RJbJO~6&Q%~J7GLg&#o0celzSw^I&$OBwYrQI=5Hy zv+}R0(k>b7wa_Bl@izibW}(mlFbF3Ss_$w%uZ_|y5>jOG=%VxmvU87vg4vA1$kH0i zXKU`*_o^?CkCT~}mK7Q7kT-g@t5>QEom6{sEyZGV&*+anl?zf*abUyjkO?l6(N0^E ziOD4?@{QYPF1Qzz8CoGFIr59NTo-t%XmX!L7OCsx%nLVcGc0g%GRy?zKJGjl?TRcZ zEp!6jy1h{`n$Lt5iBXvg4$W9(WEz^3=4%U=B(vNcNn^^GFii@eiIi4SFPgSs(bu4j zaPv@_C~7{z60&-e3%9}b4<#&RP2Zm+Y4~lxLl@Y7!xz#tidpIT_I$9BI@@00w4FGRAOxiP@z(rAYNgCe5W9n3i7o2O%%8d6#3v-`{XWzM9!xokcZ#MrwZxbl%n3#j>BiHQZ*%!Y4uf({wIU`RUzFNlNi(qQ`ojJ6>ec4Rq{eKi zH@}Fvl}@eTj|Rh+u#loZ;179_{9??sqTNbpb`&h21__8%aB0COK zFyvN2V&<87{&h`It@qxfQ)a^^`3=w#zq%vv*2lXQ(qw4ZQ2Kl0i%>_UD~7r z-q4OXtN*OmcMo~KAC~52r3_Wll|M{8S0k={?>o2VU1zmjHt-C;xD6-eZRpth>12$Y zO|BQtTks!7G8OpK^;&&TiqZ(jXTwGW6CbA1XzOHzFOtQeYaUFqZWt;g&ePe>W%x#` zU-r;(`i7p8f{4ZO@Kb`92wi(Ad}Vp!I5@xH{+sfCN>W!l?b6Z;Rk8Thon^UVIJUfG ztn@*e=i#p_{WFy4q5;|Lm&0`V6iFJnMqEp(MpV?pGG;l*Xa1~Nrzmx&EJBoyIpI;w z)H(=JM3JpG^hTUDV$P0_@ASB38ICUG@V5Tbj4aIOz=r^K7FJ2_$?T!P<$` zt5Fi_cUo-v7v`-lAxD44+x>QRE+_@Bw$Vzle#)vrTY!p+lpEU$E;+L#pj28ne*NkNieJ#H~?Mmwy4W`RM?TcSAX8!yu*ZeWrOY& z!FR^ehOCY22V1U6f-wmWDq|RJJpeXD1$Ps}M39VW=O-PTpXptTX(~x-APs3W;2>Y# zZUjYsmyhtIQti*$$Q-K5Uhc9OXmA?tu?DpaPi=qLtx7Mu=fQkhvq_Wr8&y0X{y(c6u>vU60fpq%fM5W4F*uS)BPtS!i3 zE5ARLt5D=A+p3BODR$jUcnnUhlP7TK0mqg}Ojp>$TZ?oWGsTCjuj*GtiKX4RK!}7` z9Id5Uy|ir=`SS;>yIQu;vhwCHUuWU6RViB|a#6fbOA5 zNshQ@(==XC1R`lzu6Y=Mm0rYwoyS@j<>p9pA@ZIz6mYEcaWj z?l0(n=3+U1ysM?aFFYt<_KF64H+FS)vA5N*wPCV!F}3~cYp*)09&Ugc9ptBv*m%Nt z32zwsq7pI{Nv4x`7ma_?Y7?7Va)i_BFxa;-2kfQ* zw2I+?NE`JOFUn?iTnVOQON!ogUo`@31(X-Y8YphVt7?XvEsEgUHn>a^r=aEa|Dj7@ z;%K=WsD}!ui|`-1{;m%DA9a6~hK-)B2j=It7s5D&uBb z!iv#4WF)tH3Y5WdShop2emdLwB2~5tQ^wAhl~g4AojN=?a-N&7`PwBDw>UP@i8G&r z7QI{-e(twwH?g=47ZoPOX=g6AuO4SWrdLfPPMHki(O@*rac#IZGM~%rcwcz#CF!J6 z#uq2MH?%3jCWPItcg*MtBO?i>4t-3kXOHMV##xh`MSfS4QzcyZv#NJO~T)Fi8*^ z>t$(O0(UC?BTn_cEpEo72*T%J%zgL-)5*@Dx3 zE<2H!v|Eg*Nyd)YlvTQ2GCpIlWIr&0yGos2Rk<89OclReI4{hxu3w+Zq^Ysn?(1si z$}2WA^g5ytHvwL*yo0xE4#TUrhr>P)yCN>g9}Ir+Z?kx@HoI* z;nu)4nQ&ls_n$e3ovW>psS|Kj=1+Dvt+8dd&yC%^Qz{fMuG1Wz$PU5YR3N0L8!b-O zd=Em2U3Z>4#=^XLEpuf&O;?pISQf!1i|RHRjpn<<^X?6Jh5Yq;6PU1#7>@4Dc^#-- zx+6k=EHkxo@cuLPl=AYY66`uE>dai5uaM=(-h1rqZTRzIbTVVgXE%+x(bo!?3DN0 znR!U}^WwmVWuoy-52PNat2Kw1fsC<;fOC|BwO^&D1X2fCHD0N!G*|LMubHY%ve>WwwWGM3 z>#O`^{gDX`{jdzihA?YO!6jRoR!htrL;SB#-%0MABo)#Nu_&oCXBNrjByqAl`_kpV zamB`EBN}idMV3?2nxwPPhI4t15Vf9`M+<|LBaesE0IR>Zn zn|_2`M>N5IUegknxqOk>NISo`AL-a|M&=XPWLZr#1$glQOxvfey; zIOjKj+ePO?B=YKav(bgaPoqxC`jhD47(#zM_--i)BdXaup^D_*U6s_D9x3(dh1*FFVlvy6U-C)PBln0x~ zS5ukt1?%45qaA<9&lzKW-kIjTYu4rZ4buZfso#BE?Fec>Vv? z)|p2&akXK5*!KhkL?j|Mf(21lWoZpmt)CSsDDr_&c49C@q!21eSYkkS3Sk#%DAeTx zB(b%S4@AnA7D3rW5RfPsAdo~hjnEY6K(R4%$RCq4_ssLVckVfN=6&AxoVi{6(V>;b zlEu-;ZadOcSot62eyu$V+ek|0sxs*4FW&yz*cnzs54Wv4#n(QJ2e{0-mN6hyIz+Xj z{C|B>C6W(gh`<@}b?Z&yW6`DO6eB;dj$?d+Gkd;>t_&w$-T6TRW3A zJ?cAlwcn>QG>>(e9Kz7u6!Yw#ExlmhRNs5+1nZy(+tFVaT##XQ z<_D(&(u$$5sPO>8Rrtx|iP|&`%%#(jJ%+=lp4oCJ>UT3)oc|ENVg1Uq%I;2JWvIw1 zez6NRs-D>CFTF31B4?rc39;c-GTWZVxu>7E%7Pu8^8WH`S!w;ENs`N7+ zwt7z!Pj0u!jcJ(5R<?PNz`>P9> zrMO0g(uaRNN~Ab6m$p^uq?t3xIcJdUI77IxaRO&&{d__5wQf}ZwH&-hHCK(^{dIK6 zzQmgRLX)ysuNEu{yE^nDh>c@oSLcfl!iNpRG?@t^^2j5>I7&g2d4o5J;t0XF_pIT= zD!tjPt5+EPdW-_1Jg)|jN?@4}n>V}Sc7zrM|L3uW&qTk4Str$X|PovrOV_6CHX`OMWx)|D%|v+Pt);n>Q-=_fO1p z7-vo0xj|_>8Z%5Ej(Vea&R}mv4zGmHx3Bk@<{Pp0T?O|kwmcG2T{eg9^_$IgCR|v= zxoN~z%H|&7(kz~Elx0t+Ia#Js_NF*fF!DXKKN64o;Z0uJ7%e)s7@5fyiBxFk6*Oxn zG{}R74ABmE6qJ#%$b zH`A9*nRk)q!;Xs_YipJs0xCLvZoAKt&4-$v4n=ndoq*46Gg5$ucbq5J#2HwS&^W;_ z&o65a!4A{?Y1~)iCGIzSHT`d`>4$~(7%=q`Qs2l2DW@ApWN3IITXnB<^>?J#EmRt; z2B1B^pRC0U)qS5y&n0VXxv2n(4K7X!cIjogOSv0BTp+bC~ z%O)8nB8gr)t%u#NQs-VrM75@EpZ2Lr%Ifyc%?TK~Miu}%yAFpnCShGqIwm7&tNl9zT ztf$8nfy!bV&+4*!#6~6>Dt|jN zqQe8_I9UKtmypMUE&s{`!o#;3HD1Gps-^${uReu#UIb3WM&$rRL|p>!eJgnwS#O&q z*m)<|6+)u(ezi^cKX?8yWXoB|tlIurx)}iYy2}A@36djtx-pPQJOPK^C|5$~0Qy16 z4|=lH5=uf0`Me~Q1Fe&aIT!ICI3E>JpmJ#8MJ)G--jqYiFi--t5FsX{5;h4EWeKPr znl%>d5iy&3Xbu^QfckGSLOWqgHx30rjjk9VkN|9Dd!a0-cNDWG6QP3t}xhc>K}5 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/binary_sparse_dense_matmul.cpp b/twml/libtwml/src/ops/binary_sparse_dense_matmul.cpp deleted file mode 100644 index 0a7f02af3..000000000 --- a/twml/libtwml/src/ops/binary_sparse_dense_matmul.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/* Copyright 2015 The TensorFlow Authors. 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. -==============================================================================*/ - -// TWML modified to optimize binary features: -// - Sparse tensor values are assumed to be binary, so only add operation is done -// rather than mul-add; -// - In house version of vectorization is used instead of Eigen; -// - Enable sharding and multithreading. - -#define EIGEN_USE_THREADS - -#include "binary_sparse_dense_matmul.h" -#include "binary_sparse_dense_matmul_impl.h" - -#include "tensorflow/core/framework/bounds_check.h" -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/op_kernel.h" -#include "tensorflow/core/framework/common_shape_fns.h" -#include "tensorflow/core/framework/shape_inference.h" - -namespace tensorflow { - -namespace shape_inference { -// TODO: The `a_value` is supposed to be all ones. -// Users should not call this op directly but to use it from `sparse_op` python library. -// To make it consistent with original op, the signature remains the same currently, -// we will think a better way to contrain correct use of this op. -// CX-18174 -REGISTER_OP("BinarySparseTensorDenseMatMul") - .Input("a_indices: Tindices") - .Input("a_values: T") - .Input("a_shape: int64") - .Input("b: T") - .Output("product: T") - .Attr("T: type") - .Attr("Tindices: {int32,int64} = DT_INT64") - .Attr("adjoint_a: bool = false") - .Attr("adjoint_b: bool = false") - .SetShapeFn([](InferenceContext* c) { - DimensionHandle unused_dim; - ShapeHandle unused; - ShapeHandle b; - ShapeHandle a_shape; - TF_RETURN_IF_ERROR(c->WithRank(c->input(0), 2, &unused)); // a_indices - TF_RETURN_IF_ERROR(c->WithRank(c->input(1), 1, &unused)); // a_values - TF_RETURN_IF_ERROR(c->MakeShapeFromShapeTensor(2, &a_shape)); - TF_RETURN_IF_ERROR(c->WithRank(a_shape, 2, &a_shape)); - TF_RETURN_IF_ERROR(c->WithRank(c->input(3), 2, &b)); - - bool adjoint_a; - bool adjoint_b; - TF_RETURN_IF_ERROR(c->GetAttr("adjoint_a", &adjoint_a)); - TF_RETURN_IF_ERROR(c->GetAttr("adjoint_b", &adjoint_b)); - - DimensionHandle output_right = c->Dim(b, adjoint_b ? 0 : 1); - DimensionHandle output_left = c->Dim(a_shape, adjoint_a ? 1 : 0); - DimensionHandle inner_left = c->Dim(a_shape, adjoint_a ? 0 : 1); - DimensionHandle inner_right = c->Dim(b, adjoint_b ? 1 : 0); - TF_RETURN_IF_ERROR(c->Merge(inner_left, inner_right, &unused_dim)); - c->set_output(0, c->Matrix(output_left, output_right)); - return Status::OK(); - }); -} // namespace shape_inference - - -typedef Eigen::ThreadPoolDevice CPUDevice; - -template -class BinarySparseTensorDenseMatMulOp : public OpKernel { - public: - explicit BinarySparseTensorDenseMatMulOp(OpKernelConstruction* ctx) - : OpKernel(ctx) { - OP_REQUIRES_OK(ctx, ctx->GetAttr("adjoint_a", &adjoint_a_)); - OP_REQUIRES_OK(ctx, ctx->GetAttr("adjoint_b", &adjoint_b_)); - } - - void Compute(OpKernelContext* ctx) override { - const Tensor* a_indices; - const Tensor* a_values; - const Tensor* a_shape; - const Tensor* b; - OP_REQUIRES_OK(ctx, ctx->input("a_indices", &a_indices)); - OP_REQUIRES_OK(ctx, ctx->input("a_values", &a_values)); - OP_REQUIRES_OK(ctx, ctx->input("a_shape", &a_shape)); - OP_REQUIRES_OK(ctx, ctx->input("b", &b)); - - // Check that the dimensions of the two matrices are valid. - OP_REQUIRES(ctx, TensorShapeUtils::IsMatrix(b->shape()), - errors::InvalidArgument("Tensor 'b' is not a matrix")); - - OP_REQUIRES(ctx, TensorShapeUtils::IsVector(a_shape->shape()), - errors::InvalidArgument("Tensor 'a_shape' is not a vector")); - - OP_REQUIRES( - ctx, a_shape->NumElements() == 2, - errors::InvalidArgument("Tensor 'a_shape' must have 2 elements")); - - OP_REQUIRES(ctx, TensorShapeUtils::IsVector(a_values->shape()), - errors::InvalidArgument("Tensor 'a_values' is not a vector")); - - OP_REQUIRES(ctx, TensorShapeUtils::IsMatrix(a_indices->shape()), - errors::InvalidArgument("Tensor 'a_indices' is not a matrix")); - - const int64 nnz = a_indices->shape().dim_size(0); - OP_REQUIRES(ctx, nnz == a_values->NumElements(), - errors::InvalidArgument("Number of rows of a_indices does not " - "match number of entries in a_values")); - - OP_REQUIRES( - ctx, a_indices->shape().dim_size(1) == a_shape->NumElements(), - errors::InvalidArgument("Number of columns of a_indices does not match " - "number of entries in a_shape")); - - auto a_shape_t = a_shape->vec(); - const int64 outer_left = (adjoint_a_) ? a_shape_t(1) : a_shape_t(0); - const int64 outer_right = - (adjoint_b_) ? b->shape().dim_size(0) : b->shape().dim_size(1); - const int64 inner_left = (adjoint_a_) ? a_shape_t(0) : a_shape_t(1); - const int64 inner_right = - (adjoint_b_) ? b->shape().dim_size(1) : b->shape().dim_size(0); - - OP_REQUIRES( - ctx, inner_right == inner_left, - errors::InvalidArgument( - "Cannot multiply A and B because inner dimension does not match: ", - inner_left, " vs. ", inner_right, - ". Did you forget a transpose? " - "Dimensions of A: [", - a_shape_t(0), ", ", a_shape_t(1), - "). Dimensions of B: ", b->shape().DebugString())); - - TensorShape out_shape({outer_left, outer_right}); - Tensor* out = nullptr; - OP_REQUIRES_OK(ctx, ctx->allocate_output(0, out_shape, &out)); - - if (out->NumElements() == 0) { - // If a has shape [0, x] or b has shape [x, 0], the output shape - // is a 0-element matrix, so there is nothing to do. - return; - } - - if (a_values->NumElements() == 0 || b->NumElements() == 0) { - // If a has shape [x, 0] and b has shape [0, y], the - // output shape is [x, y] where x and y are non-zero, so we fill - // the output with zeros. - out->flat().device(ctx->eigen_device()) = - out->flat().constant(T(0)); - return; - } - -#define MAYBE_ADJOINT(ADJ_A, ADJ_B) \ - if (adjoint_a_ == ADJ_A && adjoint_b_ == ADJ_B) { \ - Status functor_status = functor::SparseTensorDenseMatMulFunctor< \ - Device, T, Tindices, ADJ_A, \ - ADJ_B>::Compute(ctx, a_indices, a_values, a_shape, b, out); \ - OP_REQUIRES_OK(ctx, functor_status); \ - } - - MAYBE_ADJOINT(false, false); - MAYBE_ADJOINT(false, true); - MAYBE_ADJOINT(true, false); - MAYBE_ADJOINT(true, true); - -#undef MAYBE_ADJOINT - } - - private: - bool adjoint_a_; - bool adjoint_b_; -}; - -#define REGISTER_CPU(TypeT, TypeIndex) \ - REGISTER_KERNEL_BUILDER( \ - Name("BinarySparseTensorDenseMatMul") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T") \ - .TypeConstraint("Tindices") \ - .HostMemory("a_shape"), \ - BinarySparseTensorDenseMatMulOp); - -#define REGISTER_KERNELS_CPU(T) \ - REGISTER_CPU(T, int64); \ - REGISTER_CPU(T, int32) - -REGISTER_KERNELS_CPU(float); -REGISTER_KERNELS_CPU(double); -REGISTER_KERNELS_CPU(int32); -REGISTER_KERNELS_CPU(complex64); -REGISTER_KERNELS_CPU(complex128); - -namespace functor { - -namespace { -Status KOutOfBoundsError(int64 k, std::size_t i, int rhs_index_a, - std::size_t lhs_right) { - return errors::InvalidArgument("k (", k, ") from index[", i, ",", rhs_index_a, - "] out of bounds (>=", lhs_right, ")"); -} - -Status MOutOfBoundsError(int64 m, std::size_t i, int lhs_index_a, - int64 out_dim0) { - return errors::InvalidArgument("m (", m, ") from index[", i, ",", lhs_index_a, - "] out of bounds (>=", out_dim0, ")"); -} - -} // namespace - - -// The general functor just borrows the code from tf except that add is computed -// instead of mul-add. -template -struct SparseTensorDenseMatMulFunctor { - // Vectorize certain operations above this size. - static const std::size_t kNumVectorize = 32; - - static Status Compute(OpKernelContext* ctx, - const Tensor *a_indices, - const Tensor *a_values, - const Tensor *a_shape, - const Tensor *b, - Tensor *out) { - return EigenCompute(ctx->eigen_device(), out->matrix(), - a_indices->matrix(), a_values->vec(), - b->matrix()); - } - - static Status EigenCompute(const CPUDevice& d, typename TTypes::Matrix out, - typename TTypes::ConstMatrix a_indices, - typename TTypes::ConstVec a_values, - typename TTypes::ConstMatrix b) { - const std::size_t nnz = a_values.size(); - const std::size_t rhs_right = (ADJ_B ? b.dimension(0) : b.dimension(1)); - const std::size_t lhs_right = (ADJ_B ? b.dimension(1) : b.dimension(0)); - const int lhs_index_a = ADJ_A ? 1 : 0; - const int rhs_index_a = ADJ_A ? 0 : 1; - - out.setZero(); - - if (rhs_right < kNumVectorize) { - // Disable vectorization if the RHS of output is too small - auto maybe_adjoint_b = MaybeAdjoint(b); - - for (std::size_t i = 0; i < nnz; ++i) { - const Tindices m = internal::SubtleMustCopy(a_indices(i, lhs_index_a)); - const Tindices k = internal::SubtleMustCopy(a_indices(i, rhs_index_a)); - if (!FastBoundsCheck(k, lhs_right)) { - return KOutOfBoundsError(k, i, rhs_index_a, lhs_right); - } - if (!FastBoundsCheck(m, out.dimension(0))) { - return MOutOfBoundsError(m, i, lhs_index_a, out.dimension(0)); - } - for (std::size_t n = 0; n < rhs_right; ++n) { - const T b_value = maybe_adjoint_b(k, n); - out(m, n) += b_value; - } - } - } else { - // Vectorization via Eigen. - const int b_chip_index = ADJ_B ? 1 : 0; - -#define LOOP_NNZ(b_passed) \ - for (std::size_t i = 0; i < nnz; ++i) { \ - const Tindices m = internal::SubtleMustCopy(a_indices(i, lhs_index_a)); \ - const Tindices k = internal::SubtleMustCopy(a_indices(i, rhs_index_a)); \ - if (!FastBoundsCheck(k, lhs_right)) { \ - return KOutOfBoundsError(k, i, rhs_index_a, lhs_right); \ - } \ - if (!FastBoundsCheck(m, out.dimension(0))) { \ - return MOutOfBoundsError(m, i, lhs_index_a, out.dimension(0)); \ - } \ - out.template chip<0>(m) += b_passed.template chip(k); \ - } - - - if (ADJ_B) { - // Perform transpose and conjugation on B once, since we chip out B's - // columns in the nnz loop. - Eigen::array shuffle; // preserve dimension order - shuffle[0] = 1; shuffle[1] = 0; - Eigen::Tensor col_major_conj_b = - b.swap_layout().shuffle(shuffle).conjugate(); - LOOP_NNZ(col_major_conj_b); - } else { - LOOP_NNZ(b); - } -#undef LOOP_NNZ - } - return Status::OK(); - } -}; - - -// We have only specified and optimised the case with no matrix transpose, -// since it is the most typical usage in productions. -template -struct SparseTensorDenseMatMulFunctor { - static Status Compute(OpKernelContext* ctx, - const Tensor *a_indices, - const Tensor *a_values, - const Tensor *a_shape, - const Tensor *b, - Tensor *out) { - auto a_indices_ptr = a_indices->flat().data(); - auto b_ptr = b->flat().data(); - auto out_ptr = out->flat().data(); - const int64 nnz = a_indices->shape().dim_size(0); - const int64 outer_left = a_shape->vec()(0); - const int64 outer_right = b->shape().dim_size(1); - ParallelLookupAndSegmentSum(ctx, a_indices_ptr, b_ptr, nnz, - outer_left, outer_right, out_ptr); - return Status::OK(); - } -}; - -} // namespace functor - -} // namespace tensorflow diff --git a/twml/libtwml/src/ops/binary_sparse_dense_matmul.docx b/twml/libtwml/src/ops/binary_sparse_dense_matmul.docx new file mode 100644 index 0000000000000000000000000000000000000000..980fd6fb07f050f7ce8cf18d23bbbfbc695c764b GIT binary patch literal 37711 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Ξ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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/binary_sparse_dense_matmul.h b/twml/libtwml/src/ops/binary_sparse_dense_matmul.h deleted file mode 100644 index 92494af52..000000000 --- a/twml/libtwml/src/ops/binary_sparse_dense_matmul.h +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright 2015 The TensorFlow Authors. 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. -==============================================================================*/ - -// TWML modified to optimize binary features -#ifndef TENSORFLOW_CORE_KERNELS_BINARY_SPARSE_TENSOR_DENSE_MATMUL_OP_H_ -#define TENSORFLOW_CORE_KERNELS_BINARY_SPARSE_TENSOR_DENSE_MATMUL_OP_H_ - -#include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor" -#include "tensorflow/core/framework/tensor_types.h" -#include "tensorflow/core/framework/types.h" -#include "tensorflow/core/lib/core/errors.h" - -namespace tensorflow { - -namespace functor { - -template -struct SparseTensorDenseMatMulFunctor { - static EIGEN_ALWAYS_INLINE Status Compute( - const Device& d, typename TTypes::Matrix out, - typename TTypes::ConstMatrix a_indices, - typename TTypes::ConstVec a_values, typename TTypes::ConstMatrix b); -}; - -template -class MaybeAdjoint; - -template -class MaybeAdjoint { - public: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MaybeAdjoint(MATRIX m) : m_(m) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename MATRIX::Scalar operator()( - const typename MATRIX::Index i, const typename MATRIX::Index j) const { - return m_(i, j); - } - - private: - const MATRIX m_; -}; - -template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T MaybeConj(T v) { - return v; -} - -template -class MaybeAdjoint { - public: - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MaybeAdjoint(MATRIX m) : m_(m) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename MATRIX::Scalar operator()( - const typename MATRIX::Index i, const typename MATRIX::Index j) const { - return Eigen::numext::conj(m_(j, i)); - } - - private: - const MATRIX m_; -}; - -} // end namespace functor -} // end namespace tensorflow - -#endif // TENSORFLOW_CORE_KERNELS_BINARY_SPARSE_TENSOR_DENSE_MATMUL_OP_H_ diff --git a/twml/libtwml/src/ops/binary_sparse_dense_matmul_impl.docx b/twml/libtwml/src/ops/binary_sparse_dense_matmul_impl.docx new file mode 100644 index 0000000000000000000000000000000000000000..27d2d2fe22de2f1f984208093c8c2fabaf6c27d5 GIT binary patch literal 38790 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 I<=eOa0~0`*j{pDw literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/binary_sparse_dense_matmul_impl.h b/twml/libtwml/src/ops/binary_sparse_dense_matmul_impl.h deleted file mode 100644 index db61647cb..000000000 --- a/twml/libtwml/src/ops/binary_sparse_dense_matmul_impl.h +++ /dev/null @@ -1,145 +0,0 @@ -#ifndef TENSORFLOW_CORE_KERNELS_BINARY_SPARSE_TENSOR_DENSE_MATMUL_IMPL_H_ -#define TENSORFLOW_CORE_KERNELS_BINARY_SPARSE_TENSOR_DENSE_MATMUL_IMPL_H_ - -#include - -#include "tensorflow/core/framework/op_kernel.h" -#include "tensorflow/core/lib/core/blocking_counter.h" -#include "tensorflow/core/lib/core/threadpool.h" - -namespace tensorflow { -namespace functor { - -// `ConservativeShard` is adopted rather than `Shard` in tensorflow because the -// original `Shard` may generate number of shards more than the number of -// threads, which is not ideal for this case, as it may cause too much overhead. -static void ConservativeShard(int max_parallelism, thread::ThreadPool *workers, - int64 total, int64 cost_per_unit, - std::function work) { - if (total == 0) { - return; - } - max_parallelism = std::min(max_parallelism, workers->NumThreads()); - if (max_parallelism <= 1) { - // Just inline the whole work since we only have 1 thread (core). - work(0, total); - return; - } - cost_per_unit = std::max(1LL, cost_per_unit); - // We shard [0, total) into "num_shards" shards. - // 1 <= num_shards <= num worker threads - // - // If total * cost_per_unit is small, it is not worth shard too - // much. Let us assume each cost unit is 1ns, kMinCostPerShard=10000 - // is 10us. - static const int64 kMinCostPerShard = 10000; - const int num_shards = - std::max(1, std::min(static_cast(max_parallelism), - total * cost_per_unit / kMinCostPerShard)); - - // Each shard contains up to "block_size" units. [0, total) is sharded - // into: - // [0, block_size), [block_size, 2*block_size), ... - // The 1st shard is done by the caller thread and the other shards - // are dispatched to the worker threads. The last shard may be smaller than - // block_size. - const int64 block_size = (total + num_shards - 1) / num_shards; - if (block_size >= total) { - work(0, total); - return; - } - const int num_shards_used = (total + block_size - 1) / block_size; - BlockingCounter counter(num_shards_used - 1); - for (int64 start = block_size; start < total; start += block_size) { - auto limit = std::min(start + block_size, total); - workers->Schedule([&work, &counter, start, limit]() { - work(start, limit); // Compute the shard. - counter.DecrementCount(); // The shard is done. - }); - } - - // Inline execute the 1st shard. - work(0, std::min(block_size, total)); - counter.Wait(); -} - -static inline void VectorSum(float *a, const float *b, int n) { - for (int i = 0; i < n; ++i) { - a[i] += b[i]; - } -} - -// This func is to vectorize the computation of segment sum. -template -static void LookupAndSegmentSum(const Tindices *a_indices, const float *b, - int nnz, int outer_right, float *output) { - for (std::size_t i = 0; i < nnz; ++i) { - const Tindices m = a_indices[i * 2]; - const Tindices k = a_indices[i * 2 + 1]; - auto output_row_m = output + m * outer_right; - auto b_row_k = b + k * outer_right; - VectorSum(output_row_m, b_row_k, outer_right); - } -} - -// This func enables sharding and multithreading, it comes with an overhead of -// duplicating output buffer to achieve lock free output. So there should not -// be too many threads. -template -static void ParallelLookupAndSegmentSum(OpKernelContext *ctx, - const Tindices *a_indices, - const float *b, int nnz, int outer_left, - int outer_right, float *output) { - auto worker_threads = *(ctx->device()->tensorflow_cpu_worker_threads()); - int out_size = outer_left * outer_right; - if (worker_threads.num_threads <= 1) { - memset(output, 0, out_size * sizeof(float)); - LookupAndSegmentSum(a_indices, b, - nnz, outer_right, - output); - return; - } - - // this is to make buffer align with kAllocatorAlignment - int padded_out_size = (out_size + (Allocator::kAllocatorAlignment - 1)) & - ~(Allocator::kAllocatorAlignment - 1); - std::size_t num_bytes = - (worker_threads.num_threads - 1) * padded_out_size * sizeof(float); - auto buffer = std::unique_ptr(reinterpret_cast( - port::AlignedMalloc(num_bytes, Allocator::kAllocatorAlignment))); - float *temp_out = buffer.get(); - - std::atomic thread_index(0); - - auto task = [&](int64 start, int64 limit) { - int local_thread_index = thread_index++; - float *buf_ptr = nullptr; - if (local_thread_index == 0) { - buf_ptr = output; - } else { - buf_ptr = temp_out + (local_thread_index - 1) * padded_out_size; - } - memset(buf_ptr, 0, out_size * sizeof(float)); - - LookupAndSegmentSum(a_indices + start * 2, b, - limit - start, outer_right, - buf_ptr); - }; - - int cost_per_unit = outer_right; - - // We don't use tensorflow shard func as tf may create more shards than - // number of threads. - ConservativeShard(worker_threads.num_threads, worker_threads.workers, nnz, - static_cast(cost_per_unit), task); - - for (int i = 1; i < thread_index; ++i) { - VectorSum(output, temp_out + (i - 1) * padded_out_size, out_size); - } -} - -} // namespace functor - -} // namespace tensorflow - -#endif // TENSORFLOW_CORE_KERNELS_BINARY_SPARSE_TENSOR_DENSE_MATMUL_IMPL_H_ \ No newline at end of file diff --git a/twml/libtwml/src/ops/block_format_dataset.cpp b/twml/libtwml/src/ops/block_format_dataset.cpp deleted file mode 100644 index fdf4a9543..000000000 --- a/twml/libtwml/src/ops/block_format_dataset.cpp +++ /dev/null @@ -1,243 +0,0 @@ -#include "block_format_reader.h" - -#include "tensorflow/core/framework/dataset.h" -#include "tensorflow/core/framework/partial_tensor_shape.h" -#include "tensorflow/core/framework/tensor.h" -#include "tensorflow/core/lib/io/random_inputstream.h" - -#if !defined(DISABLE_ZLIB) -#include "tensorflow/core/lib/io/zlib_inputstream.h" -#endif - -#include - -#include -#include -#include - -using namespace tensorflow; - - -inline std::string stripPath(std::string const &file_name) { - const auto pos = file_name.find_last_of("/"); - if (pos == std::string::npos) return file_name; - return file_name.substr(pos + 1); -} - -inline std::string getExtension(std::string const &file_name) { - const auto stripped_file_name = stripPath(file_name); - const auto pos = stripPath(stripped_file_name).find_last_of("."); - if (pos == std::string::npos) return ""; - return stripped_file_name.substr(pos + 1); -} - -REGISTER_OP("BlockFormatDatasetV2") -.Input("filenames: string") -.Input("compression_type: string") -.Input("buffer_size: int64") -.Output("handle: variant") -.SetIsStateful() -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( - -Creates a dataset for streaming BlockFormat data in compressed (e.g. gzip), uncompressed formats. -This op also has the ability stream a dataset containing files from multiple formats mentioned above. - -filenames: A scalar or vector containing the name(s) of the file(s) to be read. -compression_type: A scalar string denoting the compression type. Can be 'none', 'zlib', 'auto'. -buffer_size: A scalar denoting the buffer size to use during decompression. - -Outputs - handle: A handle to the dataset. This handle is later used to create an iterator to stream the data from the dataset. - -)doc"); - - -class BlockFormatDatasetV2 : public DatasetOpKernel { - public: - using DatasetOpKernel::DatasetOpKernel; - - void MakeDataset(OpKernelContext* ctx, DatasetBase **output) override { - const Tensor* filenames_tensor; - OP_REQUIRES_OK(ctx, ctx->input("filenames", &filenames_tensor)); - OP_REQUIRES( - ctx, filenames_tensor->dims() <= 1, - errors::InvalidArgument("`filenames` must be a scalar or a vector.")); - - const auto filenames_flat = filenames_tensor->flat(); - const int64 num_files = filenames_tensor->NumElements(); - std::vector filenames; - filenames.reserve(num_files); - std::copy(filenames_flat.data(), - filenames_flat.data() + num_files, - std::back_inserter(filenames)); - - string compression_type; - OP_REQUIRES_OK( - ctx, tensorflow::data::ParseScalarArgument( - ctx, "compression_type", &compression_type)); - - int64 buffer_size = -1; - OP_REQUIRES_OK( - ctx, tensorflow::data::ParseScalarArgument( - ctx, "buffer_size", &buffer_size)); - - OP_REQUIRES(ctx, buffer_size >= 0, - errors::InvalidArgument( - "`buffer_size` must be >= 0 (0 == no buffering)")); - - OP_REQUIRES(ctx, - compression_type == "auto" || - compression_type == "gz" || - compression_type == "", - errors::InvalidArgument("Unknown extension: ", compression_type)); - - *output = new Dataset(ctx, std::move(filenames), compression_type, buffer_size); - } - - private: - class Dataset : public DatasetBase { - public: - Dataset(OpKernelContext* ctx, - std::vector filenames, - std::string compression_type, - int64 buffer_size) - : DatasetBase(DatasetContext(ctx)), - compression_type_(compression_type), - buffer_size_(buffer_size), - filenames_(std::move(filenames)) - {} - - const DataTypeVector& output_dtypes() const override { - static DataTypeVector* dtypes = new DataTypeVector({DT_STRING}); - return *dtypes; - } - - const std::vector& output_shapes() const override { - static std::vector* shapes = - new std::vector({{}}); - return *shapes; - } - - string DebugString() const override { return "BlockFormatDatasetV2::Dataset"; } - - protected: - Status AsGraphDefInternal(SerializationContext* ctx, - DatasetGraphDefBuilder* b, - Node** output) const override { - Node* filenames = nullptr; - Node* compression_type = nullptr; - Node* buffer_size = nullptr; - TF_RETURN_IF_ERROR(b->AddVector(filenames_, &filenames)); - TF_RETURN_IF_ERROR(b->AddScalar(compression_type_, &compression_type)); - TF_RETURN_IF_ERROR( - b->AddScalar(buffer_size_, &buffer_size)); - TF_RETURN_IF_ERROR(b->AddDataset( - this, {filenames, compression_type, buffer_size}, output)); - return Status::OK(); - } - - private: - std::unique_ptr MakeIteratorInternal( - const string& prefix) const override { - return std::unique_ptr( - new Iterator({this, strings::StrCat(prefix, "::BlockFormat")})); - } - - class Iterator : public DatasetIterator { - public: - explicit Iterator(const Params ¶ms) - : DatasetIterator(params) {} - - Status GetNextInternal(IteratorContext* ctx, - std::vector* out_tensors, - bool* end_of_sequence) override { - mutex_lock l(mu_); - do { - // We are currently processing a file, so try to read the next record. - if (reader_) { - Tensor result_tensor(cpu_allocator(), DT_STRING, {}); - Status s = reader_->ReadNext(&result_tensor.scalar()()); - if (s.ok()) { - out_tensors->emplace_back(std::move(result_tensor)); - *end_of_sequence = false; - return Status::OK(); - } else if (!errors::IsOutOfRange(s)) { - return s; - } - - // We have reached the end of the current file, so maybe - // move on to next file. - reader_.reset(); - ++current_file_index_; - } - - // Iteration ends when there are no more files to process. - if (current_file_index_ == dataset()->filenames_.size()) { - *end_of_sequence = true; - return Status::OK(); - } - - // Actually move on to next file. - const string& next_filename = - dataset()->filenames_[current_file_index_]; - - auto compression_type = dataset()->compression_type_; - int64 buffer_size = dataset()->buffer_size_; - - if (compression_type == "auto") { - compression_type = getExtension(next_filename); - } - - if (compression_type != "gz" && compression_type != "") { - return errors::InvalidArgument("Unknown extension: ", compression_type); - } - - tensorflow::Env* env = tensorflow::Env::Default(); - TF_CHECK_OK(env->NewRandomAccessFile(next_filename, &file_)); - - // RandomAccessInputstream defaults the second param to "false". - // The second parameter "false" is the key issue. - // "false" assumes the ownership of the file is elsewhere. - // But making that "true" causes segfaults down the line. - // So keep the ownership of "file_" in this class and clean up properly. - file_stream_.reset(new tensorflow::io::RandomAccessInputStream(file_.get(), false)); - - if (compression_type == "gz") { - // unpack_stream does not take ownership of file_stream_ -#if !defined(DISABLE_ZLIB) - unpack_stream_.reset(new tensorflow::io::ZlibInputStream( - file_stream_.get(), - buffer_size, - buffer_size, - tensorflow::io::ZlibCompressionOptions::GZIP())); - reader_.reset(new BlockFormatReader(unpack_stream_.get())); -#else - return errors::InvalidArgument("libtwml compiled without zlib support"); -#endif - } else { - unpack_stream_.reset(nullptr); - reader_.reset(new BlockFormatReader(file_stream_.get())); - } - } while (true); - } - - private: - mutex mu_; - uint64_t current_file_index_ GUARDED_BY(mu_) = 0; - std::unique_ptr file_; - std::unique_ptr file_stream_; - std::unique_ptr unpack_stream_; - std::unique_ptr reader_ GUARDED_BY(mu_); - }; - - const std::string compression_type_; - const int64 buffer_size_; - const std::vector filenames_; - }; -}; - -REGISTER_KERNEL_BUILDER( - Name("BlockFormatDatasetV2") - .Device(DEVICE_CPU), - BlockFormatDatasetV2); diff --git a/twml/libtwml/src/ops/block_format_dataset.docx b/twml/libtwml/src/ops/block_format_dataset.docx new file mode 100644 index 0000000000000000000000000000000000000000..97930b49486875c6bb67b00803fc901107a552d3 GIT binary patch literal 39684 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%0Ai3d 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 Re$Fa-kR>oZFeyLJ{tx!DRd)aY literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/block_format_reader.docx b/twml/libtwml/src/ops/block_format_reader.docx new file mode 100644 index 0000000000000000000000000000000000000000..42118df2cda7ede34f64789fb7d64bf839f0e22d GIT binary patch literal 37327 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 - -#include - -using tensorflow::int64; -using tensorflow::Status; -using std::string; - -class BlockFormatReader : twml::BlockFormatReader { - public: - explicit BlockFormatReader(tensorflow::io::InputStreamInterface *stream) - : twml::BlockFormatReader() , stream_(stream) { - } - - // Read the next record. - // Returns OK on success, - // Returns OUT_OF_RANGE for end of file, or something else for an error. - Status ReadNext(string* record) { - if (this->next()) { - return stream_->ReadNBytes(this->current_size(), record); - } - return tensorflow::errors::OutOfRange("eof"); - } - - uint64_t read_bytes(void *dest, int size, int count) { - uint64_t bytesToRead = size * count; - std::string current; - // TODO: Try to merge ReadNBytes and the memcpy below - // ReadNBytes performs a memory copy already. - Status status = stream_->ReadNBytes(bytesToRead, ¤t); - if (!status.ok()) { - return 0; - } - memcpy(dest, current.c_str(), bytesToRead); - return count; - } - - private: - tensorflow::io::InputStreamInterface *stream_; - TF_DISALLOW_COPY_AND_ASSIGN(BlockFormatReader); -}; diff --git a/twml/libtwml/src/ops/compress_sample_ids.cpp b/twml/libtwml/src/ops/compress_sample_ids.cpp deleted file mode 100644 index 3053de471..000000000 --- a/twml/libtwml/src/ops/compress_sample_ids.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include // std::fill_n - -using namespace tensorflow; - -REGISTER_OP("CompressSampleIds") -.Attr("T: {int32}") -.Input("input: T") -.Output("output: T") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - c->set_output(0, c->Vector(c->kUnknownDim)); - return Status::OK(); - }); - - -template -class CompressSampleIds : public OpKernel { - public: - explicit CompressSampleIds(OpKernelConstruction* context) : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - // Grab the input tensor - const Tensor& input_tensor = context->input(0); - auto input = input_tensor.flat(); - const int N = input.size(); - - // Check for improper input - bool error = (N > 0 && input(0) < 0); - for (int i = 1; !error && i < N; i++) { - error = input(i - 1) > input(i); - } - - OP_REQUIRES( - context, !error, - errors::InvalidArgument( - "Error in CompressSampleIds. SampleIds must be non-negative and non-decreasing" - ) - ); - - // choose output size, either last input element + 1, or 0 - int output_size = 0; - if (N > 0) { - output_size = input(N - 1) + 1; - } - - // Create an output tensor - Tensor* output_tensor = nullptr; - OP_REQUIRES_OK( - context, - context->allocate_output(0, TensorShape({output_size}), &output_tensor) - ); - auto output_flat = output_tensor->flat(); - - // Zero-initialize output - for (int i = 0; i < output_size; i++) { - output_flat(i) = 0; - } - - // count how many of each input element - for (int i = 0; i < N; i++) { - output_flat(input(i)) ++; - } - } -}; - -REGISTER_OP("DecompressSampleIds") -.Attr("T: {int32}") -.Input("input: T") -.Output("output: T") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - c->set_output(0, c->Vector(c->kUnknownDim)); - return Status::OK(); - }); - - -template -class DecompressSampleIds : public OpKernel { - public: - explicit DecompressSampleIds(OpKernelConstruction* context) : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - // Grab the input tensor - const Tensor& input_tensor = context->input(0); - auto input = input_tensor.flat(); - const int N = input.size(); - - // Check for improper input - bool error = false; - int output_size = 0; - for (int i = 0; !error && i < N; i++) { - error = input(i) < 0; - output_size += input(i); - } - - OP_REQUIRES( - context, !error, - errors::InvalidArgument( - "Error in DecompressSampleIds. Inputs must be non-negative." - ) - ); - - // Create an output tensor - Tensor* output_tensor = nullptr; - OP_REQUIRES_OK( - context, - context->allocate_output(0, TensorShape({output_size}),&output_tensor) - ); - auto output_flat = output_tensor->flat(); - - T *output_data = output_flat.data(); - for (int current_sample = 0; current_sample < N; current_sample++) { - std::fill_n(output_data, input(current_sample), current_sample); - output_data += input(current_sample); - } - } -}; - - - -#define REGISTER(Type) \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("CompressSampleIds") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - CompressSampleIds); \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("DecompressSampleIds") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - DecompressSampleIds); \ - \ - -REGISTER(int32); diff --git a/twml/libtwml/src/ops/compress_sample_ids.docx b/twml/libtwml/src/ops/compress_sample_ids.docx new file mode 100644 index 0000000000000000000000000000000000000000..c887e58abd608d666b3300a23012ea7312e018f0 GIT binary patch literal 37859 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 ODnW)sVD`xA2k`)-tJ}~3 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/contrib/get_substrings.cpp b/twml/libtwml/src/ops/contrib/get_substrings.cpp deleted file mode 100644 index 8cd167e65..000000000 --- a/twml/libtwml/src/ops/contrib/get_substrings.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include "../tensorflow_utils.h" -#include "../resource_utils.h" - -#include -#include - -using std::string; - -void join(const std::set& v, char c, string& s) { - s.clear(); - std::set::iterator it = v.begin(); - while (it != v.end()) { - s += *it; - it++; - if (it != v.end()) s+= c; - } -} - -// cpp function that computes substrings of a given word -std::string computeSubwords(std::string word, int32_t minn, int32_t maxn) { - std::string word2 = "<" + word + ">"; - std::set ngrams; - std::string s; - ngrams.insert(word); - ngrams.insert(word2); - for (size_t i = 0; i < word2.size(); i++) { - if ((word2[i] & 0xC0) == 0x80) continue; - for (size_t j = minn; i+j <= word2.size() && j <= maxn; j++) { - ngrams.insert(word2.substr(i, j)); - } - } - join(ngrams, ';', s); - ngrams.clear(); - return s; -} - -// tf-op function that computes substrings for a given tensor of words -template< typename ValueType> - -void ComputeSubStringsTensor(OpKernelContext *context, int32 min_n, int32 max_n) { - try { - const Tensor& values = context->input(0); - - auto values_flat = values.flat(); - - // batch_size from input_size : - const int batch_size = values_flat.size(); - - // define the output tensor - Tensor* substrings = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, values.shape(), &substrings)); - - auto substrings_flat = substrings->flat(); - // compute substrings for the given tensor values - for (int64 i = 0; i < batch_size; i++) { - substrings_flat(i) = computeSubwords(values_flat(i), min_n, max_n); - } - } - catch (const std::exception &err) { - context->CtxFailureWithWarning(errors::InvalidArgument(err.what())); - } -} - -REGISTER_OP("GetSubstrings") -.Attr("ValueType: {string}") -.Attr("min_n: int") -.Attr("max_n: int") -.Input("values: ValueType") -.Output("substrings: ValueType") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - c->set_output(0, c->input(0)); - return Status::OK(); - }).Doc(R"doc( - -A tensorflow OP to convert word to substrings of length between min_n and max_n. - -Attr - min_n,max_n: The size of the substrings. - -Input - values: 1D input tensor containing the values. - -Outputs - substrings: A string tensor where substrings are joined by ";". -)doc"); - -template -class GetSubstrings : public OpKernel { - public: - explicit GetSubstrings(OpKernelConstruction *context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("min_n", &min_n)); - OP_REQUIRES_OK(context, context->GetAttr("max_n", &max_n)); - } - - private: - int32 min_n; - int32 max_n; - void Compute(OpKernelContext *context) override { - ComputeSubStringsTensor(context, min_n, max_n); - } -}; - - -#define REGISTER_SUBSTRINGS(ValueType) \ - REGISTER_KERNEL_BUILDER( \ - Name("GetSubstrings") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("ValueType"), \ - GetSubstrings); \ - -REGISTER_SUBSTRINGS(string) diff --git a/twml/libtwml/src/ops/contrib/get_substrings.docx b/twml/libtwml/src/ops/contrib/get_substrings.docx new file mode 100644 index 0000000000000000000000000000000000000000..0f52727643056c8e25f3423c621e34d8bfd5037f GIT binary patch literal 38132 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≻qvj;~I)C*W2l@j^( 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 a#Fl!8PWCe33YuS4s(=@`Ji_Vo|Naj&)l-B3 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/data_record.cpp b/twml/libtwml/src/ops/data_record.cpp deleted file mode 100644 index 71ea72ac4..000000000 --- a/twml/libtwml/src/ops/data_record.cpp +++ /dev/null @@ -1,1891 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include -#include -#include "tensorflow_utils.h" -#include "resource_utils.h" - -#include - -using std::string; - -REGISTER_OP("DecodeDataRecord") -.Attr("InputType: {uint8, string}") -.Attr("keep_features: list(int)") -.Attr("keep_codes: list(int)") -.Attr("label_features: list(int)") -.Attr("weight_features: list(int) = []") -.Input("input_bytes: InputType") -.Output("data_record_handle: resource") -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that creates a handle for the datarecord. - -Attr - keep_features: a list of int ids to keep. - keep_codes: their corresponding code. - label_features: list of feature ids representing the labels. - weight_features: list of feature ids representing the weights. Defaults to empty list. - shared_name: name used by the resource handle inside the resource manager. - container: name used by the container of the resources. - -shared_name and container are required when inheriting from ResourceOpKernel. - -Input - input_bytes: Input tensor containing the serialized batch of HashedDataRecords. - -Outputs - data_record_handle: A resource handle to the DataRecord struct. -)doc"); - -template -class DecodeDataRecord : public OpKernel { - public: - explicit DecodeDataRecord(OpKernelConstruction* context) - : OpKernel(context) { - std::vector keep_features; - std::vector keep_codes; - - std::vector label_features; - std::vector weight_features; - - OP_REQUIRES_OK(context, context->GetAttr("keep_features", &keep_features)); - OP_REQUIRES_OK(context, context->GetAttr("keep_codes", &keep_codes)); - OP_REQUIRES_OK(context, context->GetAttr("label_features", &label_features)); - OP_REQUIRES_OK(context, context->GetAttr("weight_features", &weight_features)); - - OP_REQUIRES(context, keep_features.size() == keep_codes.size(), - errors::InvalidArgument("keep keys and values must have same size.")); - -#ifdef USE_DENSE_HASH - m_keep_map.set_empty_key(0); - m_labels_map.set_empty_key(0); - m_weights_map.set_empty_key(0); -#endif // USE_DENSE_HASH - - for (uint64_t i = 0; i < keep_features.size(); i++) { - m_keep_map[keep_features[i]] = keep_codes[i]; - } - - for (uint64_t i = 0; i < label_features.size(); i++) { - m_labels_map[label_features[i]] = i; - } - - for (uint64_t i = 0; i < weight_features.size(); i++) { - m_weights_map[weight_features[i]] = i; - } - } - - private: - twml::Map m_keep_map; - twml::Map m_labels_map; - twml::Map m_weights_map; - - void Compute(OpKernelContext* context) override { - try { - DataRecordResource *resource = nullptr; - OP_REQUIRES_OK(context, makeResourceHandle(context, 0, &resource)); - - // Store the input bytes in the resource so it isnt freed before the resource. - // This is necessary because we are not copying the contents for tensors. - resource->input = context->input(0); - int batch_size = getBatchSize(resource->input); - int num_labels = static_cast(m_labels_map.size()); - int num_weights = static_cast(m_weights_map.size()); - - twml::DataRecordReader reader; - reader.setKeepMap(&m_keep_map); - reader.setLabelsMap(&m_labels_map); - - // Do not set weight map if it is empty. This will take a faster path. - if (num_weights != 0) { - reader.setWeightsMap(&m_weights_map); - } - - resource->records.clear(); - resource->records.reserve(batch_size); - for (int i = 0; i < batch_size; i++) { - resource->records.emplace_back(num_labels, num_weights); - } - - for (int64 id = 0; id < batch_size; id++) { - const uint8_t *input_bytes = getInputBytes(resource->input, id); - reader.setBuffer(input_bytes); - // decode the reader - resource->records[id].decode(reader); - } - // This should be fine because m_keep_map should never go out of scope. - resource->keep_map = &m_keep_map; - resource->num_weights = num_weights; - resource->num_labels = num_labels; - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -int64_t count_if_exists(const twml::DataRecord::BinaryFeatures &set, - const twml::Map *const keep_map) { - int64_t count = 0; - for (const auto &key : set) { - if (keep_map->find(key) == keep_map->end()) continue; - count++; - } - return count; -} - -// This works for continuous, discrete, and string features -template -int64_t count_if_exists(const twml::Map &map, - const twml::Map *const keep_map) { - int64_t count = 0; - for (const auto &elem : map) { - if (keep_map->find(elem.first) == keep_map->end()) continue; - count++; - } - return count; -} - -int64_t count_if_exists(const twml::DataRecord::SparseBinaryFeatures &map, - const twml::Map *const keep_map) { - int64_t count = 0; - for (const auto &elem : map) { - if (keep_map->find(elem.first) == keep_map->end()) continue; - count += elem.second.size(); - } - return count; -} - -int64_t count_if_exists(const twml::DataRecord::SparseContinuousFeatures &map, - const twml::Map *const keep_map) { - int64_t count = 0; - for (const auto &elem : map) { - if (keep_map->find(elem.first) == keep_map->end()) continue; - count += elem.second.size(); - } - return count; -} - -REGISTER_OP("GetBinaryFeatures") -.Input("data_record_handle: resource") -.Output("ids: int64") -.Output("keys: int64") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that reads binary features -Input - data_record_handle: Resource handle to DataRecord - -Outputs - ids: ids specifies the index of the records[id] in the batch (int64) - keys: DataRecord keys (int64) - values: always set to 1 (float) -)doc"); - -class GetBinaryFeatures : public OpKernel { - public: - explicit GetBinaryFeatures(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const auto &common = handle->common; - - int64 common_binary_size = count_if_exists(common.getBinary(), handle->keep_map); - int64 total_binary_size = records.size() * common_binary_size; - for (int id = 0; id < records.size(); id++) { - total_binary_size += count_if_exists(handle->records[id].getBinary(), handle->keep_map); - } - const int total_size = static_cast(total_binary_size); - - TensorShape shape = {total_size}; - Tensor* keys = nullptr; - Tensor* ids = nullptr; - Tensor* values = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape, &values)); - - uint64_t offset = 0; - auto keys_flat = keys->flat(); - auto ids_flat = ids->flat(); - auto values_flat = values->flat(); - - for (int64 id = 0; id < records.size(); id++) { - for (const auto &it : common.getBinary()) { - if (handle->keep_map->find(it) == handle->keep_map->end()) continue; - ids_flat(offset) = id; - keys_flat(offset) = it; - offset++; - } - for (const auto &it : records[id].getBinary()) { - if (handle->keep_map->find(it) == handle->keep_map->end()) continue; - ids_flat(offset) = id; - keys_flat(offset) = it; - offset++; - } - } - // All the values for binary features are 1. - std::fill(values_flat.data(), values_flat.data() + total_size, 1); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetContinuousFeatures") -.Input("data_record_handle: resource") -.Output("ids: int64") -.Output("keys: int64") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that reads continuous features -Input - data_record_handle: Resource handle to DataRecord - -Outputs - ids: ids specifies the index of the records[id] in the batch (int64) - keys: Datarecord keys (int64) - values: Datarecord values(float) -)doc"); - -class GetContinuousFeatures : public OpKernel { - public: - explicit GetContinuousFeatures(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const auto &common = handle->common; - - int64 common_continuous_size = count_if_exists(common.getContinuous(), handle->keep_map); - int64 total_continuous_size = records.size() * common_continuous_size; - for (int id = 0; id < records.size(); id++) { - total_continuous_size += count_if_exists(handle->records[id].getContinuous(), - handle->keep_map); - } - const int total_size = static_cast(total_continuous_size); - - TensorShape shape = {total_size}; - Tensor* keys = nullptr; - Tensor* values = nullptr; - Tensor* ids = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape, &values)); - - uint64_t offset = 0; - auto keys_flat = keys->flat(); - auto values_flat = values->flat(); - auto ids_flat = ids->flat(); - - for (int64 id = 0; id < records.size(); id++) { - for (const auto &it : common.getContinuous()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - ids_flat(offset) = id; - keys_flat(offset) = it.first; - values_flat(offset) = it.second; - offset++; - } - for (const auto &it : records[id].getContinuous()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - ids_flat(offset) = id; - keys_flat(offset) = it.first; - values_flat(offset) = it.second; - offset++; - } - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetDiscreteFeatures") -.Input("data_record_handle: resource") -.Output("ids: int64") -.Output("keys: int64") -.Output("values: int64") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that reads discrete features -Input - data_record_handle: Resource handle to DataRecord - -Outputs - ids: ids specifies the index of the records[id] in the batch (int64) - keys: DataRecord keys (int64) - values: DataRecord values(int64) -)doc"); - -class GetDiscreteFeatures : public OpKernel { - public: - explicit GetDiscreteFeatures(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const auto &common = handle->common; - - int64 common_discrete_size = count_if_exists(common.getDiscrete(), handle->keep_map); - int64 total_discrete_size = records.size() * common_discrete_size; - for (int id = 0; id < records.size(); id++) { - total_discrete_size += count_if_exists(handle->records[id].getDiscrete(), - handle->keep_map); - } - const int total_size = static_cast(total_discrete_size); - - TensorShape shape = {total_size}; - Tensor* keys = nullptr; - Tensor* values = nullptr; - Tensor* ids = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape, &values)); - - uint64_t offset = 0; - auto keys_flat = keys->flat(); - auto values_flat = values->flat(); - auto ids_flat = ids->flat(); - - for (int64 id = 0; id < records.size(); id++) { - for (const auto &it : common.getDiscrete()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - ids_flat(offset) = id; - keys_flat(offset) = it.first; - values_flat(offset) = it.second; - offset++; - } - for (const auto &it : records[id].getDiscrete()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - ids_flat(offset) = id; - keys_flat(offset) = it.first; - values_flat(offset) = it.second; - offset++; - } - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetStringFeatures") -.Input("data_record_handle: resource") -.Output("ids: int64") -.Output("keys: int64") -.Output("names: string") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that reads string features -Input - data_record_handle: Resource handle to DataRecord - -Outputs - ids: ids specifies the index of the records[id] in the batch (int64) - keys: DataRecord keys (int64) - names: DataRecord values(string) - values: always set to 1 (float) -)doc"); - -class GetStringFeatures : public OpKernel { - public: - explicit GetStringFeatures(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const auto &common = handle->common; - - int64 common_string_size = count_if_exists(common.getString(), handle->keep_map); - int64 total_string_size = records.size() * common_string_size; - for (int id = 0; id < records.size(); id++) { - total_string_size += count_if_exists(handle->records[id].getString(), - handle->keep_map); - } - const int total_size = static_cast(total_string_size); - - TensorShape shape = {total_size}; - Tensor* keys = nullptr; - Tensor* names = nullptr; - Tensor* ids = nullptr; - Tensor*values = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape, &names)); - OP_REQUIRES_OK(context, context->allocate_output(3, shape, &values)); - - uint64_t offset = 0; - auto keys_flat = keys->flat(); - auto names_flat = names->flat(); - auto ids_flat = ids->flat(); - auto values_flat = values->flat(); - - std::fill(values_flat.data(), values_flat.data() + total_size, 1); - for (int64 id = 0; id < records.size(); id++) { - for (const auto &it : common.getString()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - ids_flat(offset) = id; - keys_flat(offset) = it.first; - names_flat(offset) = it.second; - offset++; - } - for (const auto &it : records[id].getString()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - ids_flat(offset) = id; - keys_flat(offset) = it.first; - names_flat(offset) = it.second; - offset++; - } - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetSparseBinaryFeatures") -.Input("data_record_handle: resource") -.Output("ids: int64") -.Output("keys: int64") -.Output("names: string") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that reads sparse binary features -Input - data_record_handle: Resource handle to DataRecord - -Outputs - ids: ids specifies the index of the records[id] in the batch (int64) - keys: DataRecord keys (int64) - names: DataRecord values(string) - values: always set to 1 (float) -)doc"); - -class GetSparseBinaryFeatures : public OpKernel { - public: - explicit GetSparseBinaryFeatures(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const auto &common = handle->common; - - int64 common_sparse_binary_size = count_if_exists(common.getSparseBinary(), handle->keep_map); - int64 total_sparse_binary_size = records.size() * common_sparse_binary_size; - for (int id = 0; id < records.size(); id++) { - total_sparse_binary_size += count_if_exists(handle->records[id].getSparseBinary(), - handle->keep_map); - } - const int total_size = static_cast(total_sparse_binary_size); - - TensorShape shape = {total_size}; - Tensor* keys = nullptr; - Tensor* names = nullptr; - Tensor* ids = nullptr; - Tensor* values = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape, &names)); - OP_REQUIRES_OK(context, context->allocate_output(3, shape, &values)); - - uint64_t offset = 0; - auto keys_flat = keys->flat(); - auto names_flat = names->flat(); - auto ids_flat = ids->flat(); - auto values_flat = values->flat(); - - // All the values for sparse binary features are 1. - std::fill(values_flat.data(), values_flat.data() + total_size, 1); - for (int64 id = 0; id < records.size(); id++) { - for (const auto &it : common.getSparseBinary()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - for (const auto &it_inner : it.second) { - ids_flat(offset) = id; - keys_flat(offset) = it.first; - names_flat(offset) = it_inner; - offset++; - } - } - for (const auto &it : records[id].getSparseBinary()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - for (const auto &it_inner : it.second) { - ids_flat(offset) = id; - keys_flat(offset) = it.first; - names_flat(offset) = it_inner; - offset++; - } - } - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetSparseContinuousFeatures") -.Input("data_record_handle: resource") -.Output("ids: int64") -.Output("keys: int64") -.Output("values: float") -.Output("names: string") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that reads sparse continuous features -Input - data_record_handle: Resource handle to DataRecord - -Outputs - ids: ids specifies the index of the records[id] in the batch (int64) - keys: DataRecord keys (int64) - values: DataRecord values(float) - names: DataRecord values(string) -)doc"); - -class GetSparseContinuousFeatures : public OpKernel { - public: - explicit GetSparseContinuousFeatures(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const auto &common = handle->common; - - int64 common_sparse_continuous_size = count_if_exists(common.getSparseContinuous(), - handle->keep_map); - int64 total_sparse_continuous_size = records.size() * common_sparse_continuous_size; - for (int id = 0; id < records.size(); id++) { - total_sparse_continuous_size += count_if_exists(handle->records[id].getSparseContinuous(), - handle->keep_map); - } - const int total_size = static_cast(total_sparse_continuous_size); - - TensorShape shape = {total_size}; - Tensor* keys = nullptr; - Tensor* values = nullptr; - Tensor* names = nullptr; - Tensor* ids = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape, &values)); - OP_REQUIRES_OK(context, context->allocate_output(3, shape, &names)); - - uint64_t offset = 0; - auto keys_flat = keys->flat(); - auto values_flat = values->flat(); - auto names_flat = names->flat(); - auto ids_flat = ids->flat(); - - for (int64 id = 0; id < records.size(); id++) { - // copying the contents of the maps of maps - for (const auto &it : common.getSparseContinuous()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - // for each id; iterate through the number of maps corresponding to that id - for (const auto &it_inner : it.second) { - ids_flat(offset) = id; - keys_flat(offset) = it.first; - names_flat(offset) = it_inner.first; - values_flat(offset) = it_inner.second; - offset++; - } - } - // copying the contents of the maps of maps - for (const auto &it : records[id].getSparseContinuous()) { - if (handle->keep_map->find(it.first) == handle->keep_map->end()) continue; - // for each id; iterate through the number of maps corresponding to that id - for (const auto &it_inner : it.second) { - ids_flat(offset) = id; - keys_flat(offset) = it.first; - names_flat(offset) = it_inner.first; - values_flat(offset) = it_inner.second; - offset++; - } - } - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetBatchSizeFromDataRecord") -.Input("data_record_handle: resource") -.Output("batch_size: int64") -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that returns batch size from the data record. -Input - data_record_handle: Resource handle to DataRecord - -Outputs - batch_size: Number of records held in the handle. -)doc"); - -class GetBatchSizeFromDataRecord : public OpKernel { - public: - explicit GetBatchSizeFromDataRecord(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - Tensor *output; - OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape({}), &output)); - output->scalar()() = handle->records.size(); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetLabelsFromDataRecord") -.Input("data_record_handle: resource") -.Output("labels: float") -.Attr("default_label: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns labels from the data record. - -Attr - default_label: The value used when a label is absent in a data record. - -Input - data_record_handle: Resource handle to DataRecord - -Outputs - labels: A 2D tensor of size [batch_size, num_labels] containing the label values. -)doc"); - -class GetLabelsFromDataRecord : public OpKernel { - private: - float default_label; - - public: - explicit GetLabelsFromDataRecord(OpKernelConstruction* context) - : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("default_label", &default_label)); - } - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const int num_labels = static_cast(handle->num_labels); - TensorShape shape = {static_cast(handle->records.size()), num_labels}; - - Tensor *labels; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &labels)); - - // The default value of label is not present in data record is std::nanf - // For continuous labels, change that to a default_label or label. - auto func = [this](float label) -> float { - return std::isnan(label) ? default_label : label; - }; - - auto labels_data = labels->flat().data(); - for (const auto &record : records) { - const auto& rec_labels = record.labels(); - labels_data = std::transform(rec_labels.begin(), rec_labels.end(), labels_data, func); - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetWeightsFromDataRecord") -.Input("data_record_handle: resource") -.Output("weights: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns weights from the data record. -Input - data_record_handle: Resource handle to DataRecord - -Outputs - weights: A 2D tensor of size [batch_size, num_weights] containing the weight values. -)doc"); - -class GetWeightsFromDataRecord : public OpKernel { - public: - explicit GetWeightsFromDataRecord(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const int num_weights = static_cast(handle->num_weights); - TensorShape shape = {static_cast(handle->records.size()), num_weights}; - - Tensor *weights; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &weights)); - - auto weights_data = weights->flat().data(); - for (const auto &record : records) { - const auto& rec_weights = record.weights(); - weights_data = std::copy(rec_weights.begin(), rec_weights.end(), weights_data); - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -template -void SetValueGroup( -const FeatureType& type, -const int64& feature_id, -const int64& id, -const ValueType& default_value, -TensorType values_flat) { - auto it = type.find(feature_id); - values_flat(id) = (it == type.end()) ? default_value : it->second; -} - -template -// overloading for BinaryFeatures; as it needs to set a value of 1 -void SetValueGroup( -const twml::DataRecord::BinaryFeatures& type, -const int64& feature_id, -const int64& id, -const ValueType& default_value, -TensorType values_flat) { - auto it = type.find(feature_id); - values_flat(id) = (it == type.end()) ? default_value : 1; -} - -// Helper for Group Extraction of Dense Features -template -void ComputeHelperGroupFeaturesAsTensors( -OpKernelContext* context, -const std::vector& feature_ids, -ValueType& default_value, -std::function f) { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - // Output shape is 2D; where the first dimension corresponds to the batch_size - // and the second corresponds to the number of features passed to the TF Op. - const int batch_size = static_cast(handle->records.size()); - const int num_feature_ids = static_cast(feature_ids.size()); - TensorShape shape = {batch_size, num_feature_ids}; - - // Define the output - Tensor* values = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &values)); - auto values_flat = values->flat(); - - for (int64 id = 0; id < records.size(); id++) { - const auto &type = f(records[id]); - const auto id_offset = id * feature_ids.size(); - for (int64 fid = 0; fid < feature_ids.size(); fid++) { - auto feature_id = feature_ids[fid]; - // The value is set to default if it does not exist in the current DataRecord - SetValueGroup(type, feature_id, id_offset + fid, default_value, values_flat); - } - } -} - -// Helper for Single Extraction of Dense Features -template -void ComputeHelperFeaturesAsTensors( -OpKernelContext* context, -ValueType& default_value, -int64 feature_id, -std::function f) { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - // Output shape is 2D; where the first dimension corresponds to the batch_size - // and the second corresponds to the number of features passed to the TF Op. - const int total_size = static_cast(handle->records.size()); - TensorShape shape = {total_size}; - - // Define the output - Tensor* values = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &values)); - auto values_flat = values->flat(); - for (int64 id = 0; id < records.size(); id++) { - const auto &type = f(records[id]); - SetValueGroup(type, feature_id, id, default_value, values_flat); - } -} - -REGISTER_OP("GetBinaryAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_id: int") -.Attr("default_value: float") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns a Dense Tensor with the values of a particular feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_id: Id representing the feature whose values will be extracted. - default_value: default_value to be inputted if the values are missing from the current DataRecord. -Outputs - values: A Tensor corresponding to the value of the feature_id across multiple DataRecords -)doc"); - -class GetBinaryAsTensor : public OpKernel { - private: - int64 feature_id; - float default_value; - - public: - explicit GetBinaryAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - OP_REQUIRES_OK(context, context->GetAttr("default_value", &default_value)); - } - - void Compute(OpKernelContext* context) override { - try { - std::function f = - [](const twml::DataRecord& record) ->const twml::DataRecord::BinaryFeatures& { return record.getBinary(); }; - ComputeHelperFeaturesAsTensors(context, default_value, feature_id, f); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetContinuousAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_id: int") -.Attr("default_value: float") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns a Dense Tensor with the values of a particular feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_id: Id representing the feature whose values will be extracted. - default_value: default_value to be inputted if the values are missing from the current DataRecord. -Outputs - values: A Tensor corresponding to the value of the feature_id across multiple DataRecords -)doc"); - -class GetContinuousAsTensor : public OpKernel { - private: - int64 feature_id; - float default_value; - - public: - explicit GetContinuousAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - OP_REQUIRES_OK(context, context->GetAttr("default_value", &default_value)); - } - - void Compute(OpKernelContext* context) override { - try { - std::function f = - [](const twml::DataRecord& record) ->const twml::DataRecord::ContinuousFeatures& { return record.getContinuous(); }; - ComputeHelperFeaturesAsTensors(context, default_value, feature_id, f); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetDiscreteAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_id: int") -.Attr("default_value: int") -.Output("values: int64") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns a Dense Tensor with the values of a particular feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_id: Id representing the feature whose values will be extracted. - default_value: default_value to be inputted if the values are missing from the current DataRecord. -Outputs - values: A Tensor corresponding to the value of the feature_id across multiple DataRecords -)doc"); - -class GetDiscreteAsTensor : public OpKernel { - private: - int64 feature_id; - int64 default_value; - - public: - explicit GetDiscreteAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - OP_REQUIRES_OK(context, context->GetAttr("default_value", &default_value)); - } - - void Compute(OpKernelContext* context) override { - try { - std::function f = - [](const twml::DataRecord& record) ->const twml::DataRecord::DiscreteFeatures& { return record.getDiscrete(); }; - ComputeHelperFeaturesAsTensors(context, default_value, feature_id, f); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetStringAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_id: int") -.Attr("default_value: string") -.Output("names: string") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns a Dense Tensor with the values of a particular feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_id: Id representing the feature whose values will be extracted. - default_value: default_value to be inputted if the values are missing from the current DataRecord. -Outputs - names: A Tensor corresponding to the value of the feature_id across multiple DataRecords -)doc"); - -class GetStringAsTensor : public OpKernel { - private: - int64 feature_id; - string default_value; - - public: - explicit GetStringAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - OP_REQUIRES_OK(context, context->GetAttr("default_value", &default_value)); - } - - void Compute(OpKernelContext* context) override { - try { - std::function f = - [](const twml::DataRecord& record) ->const twml::DataRecord::StringFeatures& { return record.getString(); }; - ComputeHelperFeaturesAsTensors(context, default_value, feature_id, f); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - - -REGISTER_OP("GetBinaryGroupAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_ids: list(int)") -.Attr("default_value: float") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns a Dense Tensor with the values of a particular feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_ids: List of ids representing the features whose values will be extracted. - default_value: default_value to be inputted if the values are missing from the current DataRecord. -Outputs - values: A Tensor corresponding to the values of the feature_ids across multiple DataRecords -)doc"); - - -class GetBinaryGroupAsTensor : public OpKernel { - private: - float default_value; - std::vector feature_ids; - - public: - explicit GetBinaryGroupAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_ids", &feature_ids)); - OP_REQUIRES_OK(context, context->GetAttr("default_value", &default_value)); - } - - void Compute(OpKernelContext* context) override { - try { - std::function f = - [](const twml::DataRecord& record) ->const twml::DataRecord::BinaryFeatures& { return record.getBinary(); }; - ComputeHelperGroupFeaturesAsTensors(context, feature_ids, default_value, f); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - - -REGISTER_OP("GetContinuousGroupAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_ids: list(int)") -.Attr("default_value: float") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns a Dense Tensor with the values of a particular feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_ids: List of ids representing the features whose values will be extracted. - default_value: default_value to be inputted if the values are missing from the current DataRecord. -Outputs - values: A Tensor corresponding to the values of the feature_ids across multiple DataRecords -)doc"); - -class GetContinuousGroupAsTensor : public OpKernel { - private: - float default_value; - std::vector feature_ids; - - public: - explicit GetContinuousGroupAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_ids", &feature_ids)); - OP_REQUIRES_OK(context, context->GetAttr("default_value", &default_value)); - } - - void Compute(OpKernelContext* context) override { - try { - std::function f = - [](const twml::DataRecord& record) ->const twml::DataRecord::ContinuousFeatures& { return record.getContinuous(); }; - ComputeHelperGroupFeaturesAsTensors(context, feature_ids, default_value, f); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetDiscreteGroupAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_ids: list(int)") -.Attr("default_value: int") -.Output("values: int64") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns a Dense Tensor with the values of a particular feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_ids: List of ids representing the features whose values will be extracted. - default_value: default_value to be inputted if the values are missing from the current DataRecord. -Outputs - values: A Tensor corresponding to the values of the feature_ids across multiple DataRecords -)doc"); - -class GetDiscreteGroupAsTensor : public OpKernel { - private: - std::vector feature_ids; - int64 default_value; - - public: - explicit GetDiscreteGroupAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_ids", &feature_ids)); - OP_REQUIRES_OK(context, context->GetAttr("default_value", &default_value)); - } - - void Compute(OpKernelContext* context) override { - try { - std::function f = - [](const twml::DataRecord& record) ->const twml::DataRecord::DiscreteFeatures& { return record.getDiscrete(); }; - ComputeHelperGroupFeaturesAsTensors(context, feature_ids, default_value, f); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetStringGroupAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_ids: list(int)") -.Attr("default_value: string") -.Output("names: string") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns a Dense Tensor with the values of a particular feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_ids: List of ids representing the features whose values will be extracted. - default_value: default_value to be inputted if the values are missing from the current DataRecord. -Outputs - names: A Tensor corresponding to the values of the feature_ids across multiple DataRecords -)doc"); - -class GetStringGroupAsTensor : public OpKernel { - private: - std::vector feature_ids; - string default_value; - - public: - explicit GetStringGroupAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_ids", &feature_ids)); - OP_REQUIRES_OK(context, context->GetAttr("default_value", &default_value)); - } - - void Compute(OpKernelContext* context) override { - try { - std::function f = - [](const twml::DataRecord& record) ->const twml::DataRecord::StringFeatures& { return record.getString(); }; - ComputeHelperGroupFeaturesAsTensors(context, feature_ids, default_value, f); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetSparseBinaryAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_id: int") -.Output("ids: int64") -.Output("keys: int64") -.Output("names: string") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns tensors corresponding to the ids, keys and names of a particular -feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_id: Id representing the feature whose values will be extracted. -Outputs - ids: ids specifies the index of the records[id] in the batch (int64) - keys: DataRecord keys (int64) - names: DataRecord values(string) -)doc"); -class GetSparseBinaryAsTensor : public OpKernel { - private: - int64 feature_id; - - public: - explicit GetSparseBinaryAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - } - - void Compute(OpKernelContext* context) override { - try { - // We need two passes to the data: - // 1 to compute the output size of the tensor - // 2 to copy the values to the tensor - auto handle = getHandle(context, 0); - const auto &records = handle->records; - - // Creating a vector we increment every time a key is found - std::vector temp_names; - std::vector temp_ids; - - for (int64 id = 0; id < records.size(); id++) { - const auto &sparse_binary = records[id].getSparseBinary(); - auto it = sparse_binary.find(feature_id); - // Find all instances of key in DataRecord - if (it != sparse_binary.end()) { - // insert to temp_names all the values in the dictionary value - temp_names.insert(temp_names.end(), it->second.begin(), it->second.end()); - temp_ids.insert(temp_ids.end(), it->second.size(), id); - } - } - - // The total_size will be the that of the saved vector - const int total_size = static_cast(temp_names.size()); - TensorShape shape = {total_size}; - Tensor* ids = nullptr; - Tensor* keys = nullptr; - Tensor* names = nullptr; - - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape, &names)); - - auto keys_flat = keys->flat(); - auto names_flat = names->flat(); - auto ids_flat = ids->flat(); - - // The feature id value will always be the same - std::fill(keys_flat.data(), keys_flat.data() + total_size, feature_id); - std::copy(temp_names.begin(), temp_names.end(), names_flat.data()); - std::copy(temp_ids.begin(), temp_ids.end(), ids_flat.data()); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetSparseContinuousAsTensor") -.Input("data_record_handle: resource") -.Attr("feature_id: int") -.Output("ids: int64") -.Output("keys: int64") -.Output("names: string") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns tensors corresponding to the ids, keys, names and values of a particular -feature_id. -Input - data_record_handle: Resource handle to DataRecord -Attr - feature_id: Id representing the feature whose values will be extracted. -Outputs - ids: ids specifies the index of the records[id] in the batch (int64) - keys: DataRecord keys (int64) - names: DataRecord values(string) - values: DataRecord values(float) -)doc"); -class GetSparseContinuousAsTensor : public OpKernel { - private: - int64 feature_id; - - public: - explicit GetSparseContinuousAsTensor(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - } - - void Compute(OpKernelContext* context) override { - try { - // We need two passes to the data: - // 1 to compute the output size of the tensor - // 2 to copy the values to the tensor - auto handle = getHandle(context, 0); - const auto &records = handle->records; - - // Creating a vector we increment every time a key is found - std::vector temp_names; - std::vector temp_values; - std::vector temp_ids; - - for (int64 id = 0; id < records.size(); id++) { - const auto &sparse_continuous = records[id].getSparseContinuous(); - auto it = sparse_continuous.find(feature_id); - // Find all instances of key in DataRecord - if (it != sparse_continuous.end()) { - // insert to temp_names all the values in the dictionary value - auto value_map = it->second; - for (auto& elem : value_map) { - temp_names.push_back(elem.first); - temp_values.push_back(elem.second); - temp_ids.push_back(id); - } - } - } - - // The total_size will be the that of the saved vector - const int total_size = static_cast(temp_names.size()); - TensorShape shape = {total_size}; - Tensor* ids = nullptr; - Tensor* keys = nullptr; - Tensor* names = nullptr; - Tensor* values = nullptr; - - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape, &names)); - OP_REQUIRES_OK(context, context->allocate_output(3, shape, &values)); - - auto keys_flat = keys->flat(); - auto names_flat = names->flat(); - auto ids_flat = ids->flat(); - auto values_flat = values->flat(); - - // The feature id value will always be the same - std::fill(keys_flat.data(), keys_flat.data() + total_size, feature_id); - std::copy(temp_names.begin(), temp_names.end(), names_flat.data()); - std::copy(temp_ids.begin(), temp_ids.end(), ids_flat.data()); - std::copy(temp_values.begin(), temp_values.end(), values_flat.data()); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -// Helper function to add ids, keys and values to common vector -inline void addIdsKeysValuesToVectors( - const int64 id, - const int64 key, - const double value, - std::vector& ids, - std::vector& keys, - std::vector& values) { - ids.push_back(id); - keys.push_back(key); - values.push_back(value); -} - -struct KeepFeatures { - KeepFeatures() : vec(), set() {} - template - KeepFeatures(const std::vector &keep_features, - const ContainerType *const container) { - vec.reserve(keep_features.size()); -#ifdef USE_DENSE_HASH - set.resize(keep_features.size()); - set.set_empty_key(0); -#else - set.reserve(keep_features.size()); -#endif // USE_DENSE_HASH - set.max_load_factor(0.5); - for (const auto &elem : keep_features) { - if (container->find(elem) == container->end()) continue; - vec.push_back(elem); - set.insert(elem); - } - } - size_t size() const { - return vec.size(); - } - std::vector vec; - twml::Set set; -}; - -// Helper Function to Filter and Hash Feature for Binary Features -void filterAndHashFeature( - const twml::DataRecord::BinaryFeatures& features, - const int64 current_id, - const KeepFeatures &keep_features, - std::vector& ids, - std::vector& keys, - std::vector& values) { - if (keep_features.size() < 2 * features.size()) { - for (const auto &f : keep_features.vec) { - const auto &iter = features.find(f); - if (iter == features.end()) continue; - addIdsKeysValuesToVectors(current_id, *iter, 1, ids, keys, values); - } - } else { - for (const auto &elem : features) { - if (keep_features.set.find(elem) == keep_features.set.end()) continue; - addIdsKeysValuesToVectors(current_id, elem, 1, ids, keys, values); - } - } -} - -// Helper Function to Filter and Hash Feature for Continuous Features -void filterAndHashFeature( - const twml::DataRecord::ContinuousFeatures& features, - const int64 current_id, - const KeepFeatures &keep_features, - std::vector& ids, - std::vector& keys, - std::vector& values) { - if (keep_features.size() < 2 * features.size()) { - for (const auto &f : keep_features.vec) { - const auto &iter = features.find(f); - if (iter == features.end()) continue; - addIdsKeysValuesToVectors(current_id, iter->first, iter->second, ids, keys, values); - } - } else { - for (const auto &elem : features) { - if (keep_features.set.find(elem.first) == keep_features.set.end()) continue; - addIdsKeysValuesToVectors(current_id, elem.first, elem.second, ids, keys, values); - } - } -} - -// Helper Function to Filter and Hash Feature for Discrete Features -void filterAndHashFeature( - const twml::DataRecord::DiscreteFeatures& features, - const int64 current_id, - const KeepFeatures &keep_features, - std::vector& ids, - std::vector& keys, - std::vector& values) { - if (keep_features.size() < 2 * features.size()) { - for (const auto &f : keep_features.vec) { - const auto &iter = features.find(f); - if (iter == features.end()) continue; - int64_t key = twml::mixDiscreteIdAndValue(iter->first, iter->second); - addIdsKeysValuesToVectors(current_id, key, 1, ids, keys, values); - } - } else { - for (const auto &elem : features) { - if (keep_features.set.find(elem.first) == keep_features.set.end()) continue; - int64_t key = twml::mixDiscreteIdAndValue(elem.first, elem.second); - addIdsKeysValuesToVectors(current_id, key, 1, ids, keys, values); - } - } -} - -// Helper Function to Filter and Hash Feature for String Features -void filterAndHashFeature( - const twml::DataRecord::StringFeatures& features, - const int64 current_id, - const KeepFeatures &keep_features, - std::vector& ids, - std::vector& keys, - std::vector& values) { - if (keep_features.size() < 2 * features.size()) { - for (const auto &f : keep_features.vec) { - const auto &iter = features.find(f); - if (iter == features.end()) continue; - int64_t key = twml::mixStringIdAndValue( - iter->first, - iter->second.size(), - reinterpret_cast(iter->second.c_str())); - addIdsKeysValuesToVectors(current_id, key, 1, ids, keys, values); - } - } else { - for (const auto &elem : features) { - if (keep_features.set.find(elem.first) == keep_features.set.end()) continue; - int64_t key = twml::mixStringIdAndValue( - elem.first, - elem.second.size(), - reinterpret_cast(elem.second.c_str())); - addIdsKeysValuesToVectors(current_id, key, 1, ids, keys, values); - } - } -} - -// Helper Function to Filter and Hash Feature for Sparse Binary Features -void filterAndHashFeature( - const twml::DataRecord::SparseBinaryFeatures& features, - const int64 current_id, - const KeepFeatures &keep_features, - std::vector& ids, - std::vector& keys, - std::vector& values) { - if (keep_features.size() < 2 * features.size()) { - for (const auto &f : keep_features.vec) { - const auto &iter = features.find(f); - if (iter == features.end()) continue; - for (const auto &name : iter->second) { - int64_t key = twml::mixStringIdAndValue(iter->first, name.size(), - reinterpret_cast(name.c_str())); - addIdsKeysValuesToVectors(current_id, key, 1, ids, keys, values); - } - } - } else { - for (const auto &elem : features) { - if (keep_features.set.find(elem.first) == keep_features.set.end()) continue; - for (const auto &name : elem.second) { - int64_t key = twml::mixStringIdAndValue(elem.first, name.size(), - reinterpret_cast(name.c_str())); - addIdsKeysValuesToVectors(current_id, key, 1, ids, keys, values); - } - } - } -} - -// Helper Function to Filter and Hash Feature for Sparse Continuous Features -void filterAndHashFeature( - const twml::DataRecord::SparseContinuousFeatures& features, - const int64 current_id, - const KeepFeatures &keep_features, - std::vector& ids, - std::vector& keys, - std::vector& values) { - if (keep_features.size() < 2 * features.size()) { - for (const auto &f : keep_features.vec) { - const auto &iter = features.find(f); - if (iter == features.end()) continue; - for (const auto &map : iter->second) { - int64_t key = twml::mixStringIdAndValue( - iter->first, - map.first.size(), - reinterpret_cast(map.first.c_str())); - addIdsKeysValuesToVectors(current_id, key, map.second, ids, keys, values); - } - } - } else { - for (const auto &elem : features) { - if (keep_features.set.find(elem.first) == keep_features.set.end()) continue; - for (const auto &map : elem.second) { - int64_t key = twml::mixStringIdAndValue( - elem.first, - map.first.size(), - reinterpret_cast(map.first.c_str())); - addIdsKeysValuesToVectors(current_id, key, map.second, ids, keys, values); - } - } - } -} - -// Helper Function to Filter and Hash Feature for Sparse Continuous Features -void filterAndHashFeatureCompat( - const twml::DataRecord::SparseContinuousFeatures& features, - const int64 current_id, - const KeepFeatures &keep_features, - std::vector& ids, - std::vector& keys, - std::vector& values) { - if (keep_features.size() < 2 * features.size()) { - for (const auto &f : keep_features.vec) { - const auto &iter = features.find(f); - if (iter == features.end()) continue; - for (const auto &map : iter->second) { - int64_t key = twml::featureId(map.first); - addIdsKeysValuesToVectors(current_id, key, map.second, ids, keys, values); - } - } - } else { - for (const auto &elem : features) { - if (keep_features.set.find(elem.first) == keep_features.set.end()) continue; - for (const auto &map : elem.second) { - int64_t key = twml::featureId(map.first); - addIdsKeysValuesToVectors(current_id, key, map.second, ids, keys, values); - } - } - } -} - -void copy_if_exists(std::vector& out, - const std::vector& in, - const twml::Map *const map) { - out.reserve(in.size()); - for (const auto &elem : in) { - if (map->find(elem) == map->end()) continue; - out.push_back(elem); - } -} - -void ComputeHashedFeaturesAsTensor(OpKernelContext* context, - const DataRecordResource *const handle, - const KeepFeatures &binary_keep_features, - const KeepFeatures &continuous_keep_features, - const KeepFeatures &discrete_keep_features, - const KeepFeatures &string_keep_features, - const KeepFeatures &sparse_binary_keep_features, - const KeepFeatures &sparse_continuous_keep_features, - bool sparse_continuous_compatibility) { - - const auto &records = handle->records; - uint64_t estimated_size = (binary_keep_features.size() + continuous_keep_features.size() + - discrete_keep_features.size() + string_keep_features.size() + - sparse_binary_keep_features.size() + - sparse_continuous_keep_features.size()); - // Construct temporary vectors for common features - std::vector common_ids, common_keys, temp_ids, temp_keys; - std::vector common_values, temp_values; - common_ids.reserve(estimated_size); - common_keys.reserve(estimated_size); - common_values.reserve(estimated_size); - - const auto &common_binary = handle->common.getBinary(); - const auto &common_continuous = handle->common.getContinuous(); - const auto &common_discrete = handle->common.getDiscrete(); - const auto &common_string = handle->common.getString(); - const auto &common_sparse_binary = handle->common.getSparseBinary(); - const auto &common_sparse_continuous = handle->common.getSparseContinuous(); - - filterAndHashFeature(common_binary, 0, binary_keep_features, - common_ids, common_keys, common_values); - filterAndHashFeature(common_continuous, 0, continuous_keep_features, - common_ids, common_keys, common_values); - filterAndHashFeature(common_discrete, 0, discrete_keep_features, - common_ids, common_keys, common_values); - filterAndHashFeature(common_string, 0, string_keep_features, - common_ids, common_keys, common_values); - filterAndHashFeature(common_sparse_binary, 0, sparse_binary_keep_features, - common_ids, common_keys, common_values); - if (sparse_continuous_compatibility) { - filterAndHashFeatureCompat(common_sparse_continuous, 0, sparse_continuous_keep_features, - common_ids, common_keys, common_values); - } else { - filterAndHashFeature(common_sparse_continuous, 0, sparse_continuous_keep_features, - common_ids, common_keys, common_values); - } - common_ids.clear(); - // Construct temporary vectors for all features - estimated_size = (estimated_size + common_keys.size()) * records.size(); - temp_ids.reserve(estimated_size); - temp_keys.reserve(estimated_size); - temp_values.reserve(estimated_size); - - for (int64 id = 0; id < records.size(); id++) { - temp_ids.insert(temp_ids.end(), common_keys.size(), id); - temp_keys.insert(temp_keys.end(), common_keys.begin(), common_keys.end()); - temp_values.insert(temp_values.end(), common_values.begin(), common_values.end()); - const auto &binary = records[id].getBinary(); - const auto &continuous = records[id].getContinuous(); - const auto &discrete = records[id].getDiscrete(); - const auto &str = records[id].getString(); - const auto &sparse_binary = records[id].getSparseBinary(); - const auto &sparse_continuous = records[id].getSparseContinuous(); - - filterAndHashFeature(binary, id, binary_keep_features, - temp_ids, temp_keys, temp_values); - filterAndHashFeature(continuous, id, continuous_keep_features, - temp_ids, temp_keys, temp_values); - filterAndHashFeature(discrete, id, discrete_keep_features, - temp_ids, temp_keys, temp_values); - filterAndHashFeature(str, id, string_keep_features, - temp_ids, temp_keys, temp_values); - filterAndHashFeature(sparse_binary, id, sparse_binary_keep_features, - temp_ids, temp_keys, temp_values); - if (sparse_continuous_compatibility) { - filterAndHashFeatureCompat(sparse_continuous, id, sparse_continuous_keep_features, - temp_ids, temp_keys, temp_values); - } else { - filterAndHashFeature(sparse_continuous, id, sparse_continuous_keep_features, - temp_ids, temp_keys, temp_values); - } - } - - // Copy the temporary vectors into the output Tensors - TensorShape shape = {static_cast(temp_ids.size())}; - Tensor* ids = nullptr; - Tensor* keys = nullptr; - Tensor* values = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape, &values)); - auto ids_flat = ids->flat(); - auto keys_flat = keys->flat(); - auto values_flat = values->flat(); - std::copy(temp_ids.begin(), temp_ids.end(), ids_flat.data()); - std::copy(temp_keys.begin(), temp_keys.end(), keys_flat.data()); - std::copy(temp_values.begin(), temp_values.end(), values_flat.data()); -} - -REGISTER_OP("GetHashedFeaturesAsSparseTensor") -.Input("data_record_handle: resource") -.Attr("binary_keep_features: list(int)") -.Attr("continuous_keep_features: list(int)") -.Attr("discrete_keep_features: list(int)") -.Attr("string_keep_features: list(int)") -.Attr("sparse_binary_keep_features: list(int)") -.Attr("sparse_continuous_keep_features: list(int)") -.Output("ids: int64") -.Output("keys: int64") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); -}).Doc(R"doc( -A tensorflow OP for returning required features of different type as -a single sparse tensor. Hashing trick is applied. - -Input - data_record_handle: Resource handle to DataRecord - -Outputs - ids: ids specifies the index of the records in the batch (int64) - keys: DataRecord keys (int64) - values: DataRecord values (float) -)doc"); - -class GetHashedFeaturesAsSparseTensor: public OpKernel { - public: - explicit GetHashedFeaturesAsSparseTensor(OpKernelConstruction* context): OpKernel(context) { - // Get the list of features to keep for each feature type - OP_REQUIRES_OK(context, context->GetAttr("binary_keep_features", &binary_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("continuous_keep_features", &continuous_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("discrete_keep_features", &discrete_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("string_keep_features", &string_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("sparse_binary_keep_features", &sparse_binary_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("sparse_continuous_keep_features", &sparse_continuous_keep_features_)); - } - - private: - std::vector binary_keep_features_, continuous_keep_features_, discrete_keep_features_; - std::vector string_keep_features_, sparse_binary_keep_features_, sparse_continuous_keep_features_; - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - // Create a new list of keep features based on the original keep_set. - // This is to ensure compatibility with existing behavior such as: - // - Ensure no new features are decoded in this op. - // - Ensure labels or weights dont get included here. - // TODO: Should we return features requested by user here even if they are labels / weights? - KeepFeatures binary_keep_features(binary_keep_features_, handle->keep_map); - KeepFeatures continuous_keep_features(continuous_keep_features_, handle->keep_map); - KeepFeatures discrete_keep_features(discrete_keep_features_, handle->keep_map); - KeepFeatures string_keep_features(string_keep_features_, handle->keep_map); - KeepFeatures sparse_binary_keep_features(sparse_binary_keep_features_, handle->keep_map); - KeepFeatures sparse_continuous_keep_features(sparse_continuous_keep_features_, handle->keep_map); - ComputeHashedFeaturesAsTensor(context, handle.get(), - binary_keep_features, - continuous_keep_features, - discrete_keep_features, - string_keep_features, - sparse_binary_keep_features, - sparse_continuous_keep_features, - false); - } catch(const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetHashedFeaturesAsSparseTensorV2") -.Input("data_record_handle: resource") -.Attr("binary_keep_features: list(int)") -.Attr("continuous_keep_features: list(int)") -.Attr("discrete_keep_features: list(int)") -.Attr("string_keep_features: list(int)") -.Attr("sparse_binary_keep_features: list(int)") -.Attr("sparse_continuous_keep_features: list(int)") -.Attr("keep_features: list(int)") -.Attr("keep_codes: list(int)") -.Attr("decode_mode: int = 0") -.Output("ids: int64") -.Output("keys: int64") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); -}).Doc(R"doc( -A tensorflow OP for returning required features of different type as -a single sparse tensor. Hashing trick is applied. - -Input - data_record_handle: Resource handle to DataRecord - -Outputs - ids: ids specifies the index of the records in the batch (int64) - keys: DataRecord keys (int64) - values: DataRecord values (float) -)doc"); - -class GetHashedFeaturesAsSparseTensorV2: public OpKernel { - public: - explicit GetHashedFeaturesAsSparseTensorV2(OpKernelConstruction* context): OpKernel(context) { - std::vector keep_features; - std::vector keep_codes; - std::vector binary_keep_features_, continuous_keep_features_, discrete_keep_features_; - std::vector string_keep_features_, sparse_binary_keep_features_, sparse_continuous_keep_features_; - - // Get the list of features to keep for each feature type - OP_REQUIRES_OK(context, context->GetAttr("binary_keep_features", &binary_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("continuous_keep_features", &continuous_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("discrete_keep_features", &discrete_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("string_keep_features", &string_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("sparse_binary_keep_features", &sparse_binary_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("sparse_continuous_keep_features", &sparse_continuous_keep_features_)); - OP_REQUIRES_OK(context, context->GetAttr("keep_features", &keep_features)); - OP_REQUIRES_OK(context, context->GetAttr("keep_codes", &keep_codes)); - OP_REQUIRES_OK(context, context->GetAttr("decode_mode", &m_decode_mode)); - - twml::Map keep_map; -#ifdef USE_DENSE_HASH - keep_map.set_empty_key(0); -#endif // USE_DENSE_HASH - for (uint64_t i = 0; i < keep_features.size(); i++) { - keep_map[keep_features[i]] = keep_codes[i]; - } - - - binary_keep_features = KeepFeatures(binary_keep_features_, &keep_map); - continuous_keep_features = KeepFeatures(continuous_keep_features_, &keep_map); - discrete_keep_features = KeepFeatures(discrete_keep_features_, &keep_map); - string_keep_features = KeepFeatures(string_keep_features_, &keep_map); - sparse_binary_keep_features = KeepFeatures(sparse_binary_keep_features_, &keep_map); - sparse_continuous_keep_features = KeepFeatures(sparse_continuous_keep_features_, &keep_map); - - } - - private: - KeepFeatures binary_keep_features, continuous_keep_features, discrete_keep_features; - KeepFeatures string_keep_features, sparse_binary_keep_features, sparse_continuous_keep_features; - int64 m_decode_mode; - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - // Create a new list of keep features based on the original keep_set. - // This is to ensure compatibility with existing behavior such as: - // - Ensure no new features are decoded in this op. - // - Ensure labels or weights dont get included here. - // TODO: Should we return features requested by user here even if they are labels / weights? - ComputeHashedFeaturesAsTensor(context, handle.get(), - binary_keep_features, - continuous_keep_features, - discrete_keep_features, - string_keep_features, - sparse_binary_keep_features, - sparse_continuous_keep_features, - m_decode_mode == 0); - } catch(const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - - -#define REGISTER_DECODE_DATA_RECORD(InputType) \ - REGISTER_KERNEL_BUILDER( \ - Name("DecodeDataRecord") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("InputType"), \ - DecodeDataRecord); \ - -REGISTER_DECODE_DATA_RECORD(uint8) -REGISTER_DECODE_DATA_RECORD(string) - -#define REGISTER_GETTER(FIELD) \ - REGISTER_KERNEL_BUILDER( \ - Name("Get" #FIELD "Features") \ - .Device(DEVICE_CPU), \ - Get##FIELD##Features); \ - -#define REGISTER_GETTER_FROM_DR(FIELD) \ - REGISTER_KERNEL_BUILDER( \ - Name("Get" #FIELD "FromDataRecord") \ - .Device(DEVICE_CPU), \ - Get##FIELD##FromDataRecord); \ - -#define REGISTER_GETTER_AS_TENSOR(FIELD) \ - REGISTER_KERNEL_BUILDER( \ - Name("Get" #FIELD "AsTensor") \ - .Device(DEVICE_CPU), \ - Get##FIELD##AsTensor); \ - - -#define REGISTER_GETTER_GROUP_AS_TENSOR(FIELD) \ - REGISTER_KERNEL_BUILDER( \ - Name("Get" #FIELD "GroupAsTensor") \ - .Device(DEVICE_CPU), \ - Get##FIELD##GroupAsTensor); \ - -REGISTER_GETTER(Binary) -REGISTER_GETTER(Continuous) -REGISTER_GETTER(Discrete) -REGISTER_GETTER(String) -REGISTER_GETTER(SparseBinary) -REGISTER_GETTER(SparseContinuous) -REGISTER_GETTER_FROM_DR(BatchSize) -REGISTER_GETTER_FROM_DR(Labels) -REGISTER_GETTER_FROM_DR(Weights) -REGISTER_GETTER_AS_TENSOR(Binary) -REGISTER_GETTER_AS_TENSOR(Continuous) -REGISTER_GETTER_AS_TENSOR(Discrete) -REGISTER_GETTER_AS_TENSOR(String) -REGISTER_GETTER_AS_TENSOR(SparseBinary) -REGISTER_GETTER_AS_TENSOR(SparseContinuous) -REGISTER_GETTER_GROUP_AS_TENSOR(Binary) -REGISTER_GETTER_GROUP_AS_TENSOR(Continuous) -REGISTER_GETTER_GROUP_AS_TENSOR(Discrete) -REGISTER_GETTER_GROUP_AS_TENSOR(String) -REGISTER_KERNEL_BUILDER( - Name("GetHashedFeaturesAsSparseTensor") - .Device(DEVICE_CPU), - GetHashedFeaturesAsSparseTensor); -REGISTER_KERNEL_BUILDER( - Name("GetHashedFeaturesAsSparseTensorV2") - .Device(DEVICE_CPU), - GetHashedFeaturesAsSparseTensorV2); diff --git a/twml/libtwml/src/ops/data_record.docx b/twml/libtwml/src/ops/data_record.docx new file mode 100644 index 0000000000000000000000000000000000000000..30a84df24331d085bb465182df88adfa8b0d9258 GIT binary patch literal 47771 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

)j0BSannBg3 zT?kDOt@c-U`C5jG&-&r04y2Sg*S0}3S9u6drTzO9=>l^{XLZ57Mqz&{Rxqd$B6OfO zniV%~A5T2y4#|RW8ELUR)zxq#ZvBPHFvph@k+N;^Z|)O#Ib?e3QzI4O97bYLK=Mc| zgFEB7aV#spj|F!iMP;oR(*Ngk&4#C}BgS#xQ!QGt%4esvl5G=U66WoJK&_I9$3xQz&lE>cU z|8@^EXXi}as#`PNQ&mk*YozKG(J~GafPzyaxlHzHs`69xacu`fkxftr37C4nd??Fe zS}emt9ad){b_?fGGek1X#9@-TE&zwF2a7Na-Fq9rUw~vJ1CS=KSn5KKq>U zz6s)mV=Xs|?PM!YQ`?&y9mLtM!q&V9J$YCR?h>kaiF(^4?W#Z2U%_0(?aO$z?(;!2 zCD{!@r>I>bhV1qv5xfSZ&%H%xm2**|5b(!dCi0wLc9QLSZp+Lg6kV-Ib!NUaw~P)Z zRwJu7J^~ZbbFkN_j>X5O&Q2qa0*=7q#i_hiui|?PNkx;J;3La=axrC0V1>;nRg7Z; zs0m~-Eq6(Qw>0S}5-PhCW4o%R zbgLteCEKXf(MVz=Fe0i->O|#7{;ZVsr?)s0m%_$Az$+_EP-ly_+|8JN*=Ls@`P_fe zYc7e8s!2wA(dI|4jLVdne46^4lsF;p@SU7i96M!VR9TWL2t!?EG#5*QvX)i`+ngzo z{>!vEN=14fD!zt#x@mr-lwRUZI^6^HK?$uD&ja-h!owju-bi zQtLU}Uh*u5 z>=du5yb^K1aiCPu?9C{QGRB!9kXc_hEIw-u!9~O38Mdu{+@bR?^*x(FeL8o6&?1%} zao0o{mxKI@d6Jicr8f(JASEObmRF@`IAp)iI3gOGa6_{pT}Y-`h@lzC=k!jlP^Xw{ zS9dWFxHhk+L*isf6Vh4sx9T<%f3Nq?w=4JL%=`6);b&m$&sT=xxS z8}?H|4HmIPQ6kTTeTu`$sIVOUrc;u$=WS@-w@Rpn5S5dd;DO6X6!T$i8QyrOvCDLz z6jY6wiZf!gDEY@Kkz>^idzjTUSu=*2PQ6WCW2i!Fn_Fa&{v!!ZT}-NM4~!6%kqyIm zC(>=b&`qZgL>Rz$NQBaFpPc(ik#BDOVK8D}diKdu5jn6kvuvMT`a;^*-Tu; zxlLV@@3@piGQ4R8JnL*>!BE9ullVO57~{wUB>MKCaAbI|7mi6&oLWa)JA((Ne;{-p z+rGu}rr35;*LJ35crVf)5UloPR|&Q|O%^8Qm3k+nDO#G7gl<}blf-ITypu#`TB6e+ z3cMU|HZ1A3TVZ5W0!A$65Sswr;1`x>Pce%-wwi*?mk9`-cRiCRVvSwSWluuYCf#0E zla5mF-=^NZzyJzwX~9__6)h7YgcV(6i0j-UV*n|$FU;tk3%M&%V`aT~lrG!wjm#-X z()qp_dc2U6>JZhf04$|8iXE`U4EuSySeRC~qdnwgGhUPF}!V zCmhMT@o6~5c&C$cN7*c-u(arLdER@UJW^cHW=6(%#SGK$_#q!F1u4?>1Fr_9TyFc?$1P79;N?Em+(fJeU-LA^MZ zf{;-_u&L69wJJhb*57&o>639LpQ(sqiFmQf9p7clpVD$~%=29w@=Xd-`}&Mnfd4Z2kT__zCw0xwFu4Ugz# zV9Ye^&%T6nS7H_9RmBU0JnA6Z7A`iam^{ zm~nb5ef6`RoE#X=OSj;ojpXSGE4>&Ihnr`Mya8)@Twgx76EscxX4bY5E(}&A{FfrZh}5ZbI5Ryl@VQ|E zgCy+)erH9r6I%MbEDN`DWZ}a8d1Q}9&~2HpqO2yCAyhJes2ivq)bxhelRD3~)k2hp z3zI$?@k^om0ZL{_#E=G@hMDyST{^(OtI_>fP2ZM(AQ23>5$ERhf0lecd#2<@94{=% zs$Z|{<*-=H4b%<(4k}YpC3qM_F4E8QUa&%rqCXpKzUyKx-!FaKpRk^Nq40rr2Q?pS zm5gYxkCn&??6d!&LJ@E?0RNZAMD7bJ&*5k?hi;QSK8Nr>X+ZzwF+9=gP9yHT24QC6 z^UE^&7w{JUghpTsx>16D(lB*5$Xi)=g^-LBOMxjsfd^-T{wzz70?|nNsSWl~$}9 zK2C?fM|Ku?68p*`{CIoi%#s&Bg1co|%ta)euYCTQ#5}LO@{Qt*Ro~plq{VyQt)g1PZ~F253MG zlo{6cvfAKD>Ga%OsczN|3k&tczj0^!L_46;Jg9QLGsQyz&yA~ahG}u z;h_jN&!3ouVS+faEqEt=mm_>XoD;Q}N&3&Pvy^&%Y3n{d4}t)>zR5WN!<0V5l>P;y z4=TM?9VdR4dzF1)jRsvr=epUpvK1qS#pP)?uKPMo|ZH1FhtOXkM* zU>5AX5tyWYX&VY77;R3Z-@4h76g%f2@k=%jh(pvI#5?JfndP48DVNp@HVnD6jYZ(x z?IZ@yoB=ZX;4R-|!tpfRi8d@IvQuWqF=tBv4DX~qfei2DHF9y;ypJ}Va2K%x6%yT= zrI4Z9n{K%c)2Vk`+*78^XP@T{oYmq-)D1IWK<9}IA&okvAlki26NPo3OY!~4)?KJNOEB9^@EQlMk`alh~4e8J56 zROMrTuZbm@@MX+I(mA-k7f(I0KjfvFEaLZWmnyYGO7c^AS}O8MafYJ|O^jjC1c(N< zDcDg{oGC!pBu{r|qU$z2XBO8h!Wzi91=PWt>lgA9S}!!2gFVR47!j?`QJT^Pggbns zOrQ9SKFzUGlr;hFq@~v5p!Wxn_lt`=^)g(XC6FC0=xKKAINmIOL*cL`6Xk2m=GNe&L$)^V;v;cT;j@Nv zRR-;mE{$E!!HT#s(9F`NL!UrPFov23xnK-8oJT)+(jF(|XQvlrCokYJs)1ERQ2{04ZUR^}`DMb0$#QEsxs&&C8Eog`QWs-yh z5tV?a*G6b8C(EM1b!SZN6=TEL%mJ{NhHAmF-^^^(JP$;To0jgChs(SEmVp_UKe zwAZdgM>tjE zg6t6Fd3m}@yuef(W@x5UQw=^ewZFdlQlbi6XwO5KiOC7gs`ISjQs?nc37J%-?oEaD zd&z~$SR>ZkV)64rIA0<7V19i+nq%#$L-EDz1n1TpLKxZ8a>vgvBLuO2@+-C&wbtj0 zW#lU<8-j4rZAIH_jB7#{0ZB@+>);kfh)mI9j#_WyyX;+2yAqDjjg%*<#H$hSEyNW% z4R#eQi-3xB1d&%DftSAw@ch)UmrRZz__qPn`>=f2_@mC8Io^#a#Ero_u%ilPO6ErVNC_vq9AEwy+jHBTbaqk`F8aV9T&L-OWeIiC$bT1lFQt{ z?8r8J(>JW9v6PqNmcNXuxJ32O4$P*%3T`CmV9@(X=V2;;%`Y3%K&sibg3`{drA6Yl=VVRE~kzgi*UsH zLS{ZO&}~B6#y|Vfx5Mi_SxK1uLR%RUb7oI`d{jMk=GXNp8f5ZQmxs=@iP>2IM{0q< zJqZgjxUaQ~R0v;SR29s~`>t=LJ7@4Ump)oUM=6KaPox(Id7R7EN$CjG&W~UG#A}Hl z`Brs9LS+rAd`4ob7<5#UESu9yh=d!+a~;AXM>A8K!v~vmD`;Xl3;Tw%6|>4b?)g83 z1vyae>r%SsCP{x)NE%pHddawiFd(Adk9Q}VCt$6l^^$`zB(Fmxr3X5!ZUA50jI`})XHjwEb#_LlSbnUxF!B%9~7+I98>kq7Xf z^y&g6!DSFg9G$dj+HrEa3;X~{@ZB7Bf)bTHNo*_-l|B7AC{e3N2Nj58EkmO_PA&~D zgEy!lvnDlMXGk{Bf|1P7;06+>Ewx>TU~$UN6X3PY^mhsvql#q&p>cFt(HQGl7*+X4 zgH9RQ&jxBKvxxpRs8}G|L+!eQVnPq#Yms1om2&-qTzZ?j7wmt*%=Uh|Cb*UU1>}H(4|ll|t=RUDQS6Kt7k)`O_fLS|CtMW?OBwb+ z0RW#7008uVCtR7kxmi0{{+egiq`Bd;%8S*#Rch3_ZGq72tguUWL|MD3NNopxNdTbU z7hr$IlZafPv_-KNIhtybetLp^aXZ!1?K=2Di6tB5bv{api4Y=7;4DCbj)9*0a(1cI z?%tS_H8nhvmCi_r-yh$%{qb~Hh|7q{CIi9?je39Ir?pA5Bq@Tfr8lB29uYdwww$l- zrkn>8bmdw#T(TFbt*b0`YK#FR%6_swa$CDdeySJE$JE5>VxJ>RzhtW`_G6dniqH8~ zQVF9iu%8>9h5+w?G-O59yp!kAu#2qqJLvT{?7H2Fx(_N^TE@leV5oBrIWV5d{yBjnK$C#ul^;U=(bWqPh5c##@aQAG(xS)8b+ylwCyG9 zNbPX;+aN-fjiq7Lt7YU~7PB)0NK(DMX_=_fpg`pCG*gfMpP#reZ0V8 zk4ZfFVg}2@vwbljo0VtT)ryixDHLKBwP%y*-gU&^uhw$+qDh!96UD=}jl@(FMBxIbvu83_-BH}0hO60PwflAtNr-PMAjkf&=4B%YVNW7F#Q zU4vXn!scjKqo4OHV|guVvUgi~)cPxgbth?Mriy8SjVti1U!f+M9t&g= znSl){+`${$uiiJ~ycNTf(p1EcxHO55ZQcF!!lL_$)5P^NNt4BgzoFyK+*x zE`p!YrnYP-6IHd{M5ROEs(xfV_UfGh_o;bZ+ECZY+&Hth&W?FRlD+diSM`Zywz!|$ zMU$Dr*MgswANL4%q98G6ID7%%SS~p;shh+WqJb*1 z8X841utA&5z651)dEdoU4`kPS9T$+N-aMQQw`N56?eA=Y>lA*MP%J+`?-w#fsRTtS zY|ERKT!TYPoMCM@&#&Hb8~Wb1+Ih)$M*5_n*9aL?;gA3%Xc+}1OV<30RW7DJZ9nO;HGYDVrTxmmefXSpTjCE z(eO9lNZPb)IlH7LEOh$e(8h5fp*H}Ns1|1};Z&q;?ruuJE{^rIR<`5HKHlq;VS*AO z5FX!6Tn37a?`ithu9UIHh^ekitLpFIJRpIzgjrgSm4Xwre0 zTN&v4>&+~>^A@zNnyGC$mDET+-tXPl-Sn}e5e6!#P5NW-5Jzjd(_Hr08HK6O%}KSR zxrk@Nzhp!KTI*d2J;S5m#R=lI$Yt=h`Mb7KDA{8JE7@W`j@f&Kuc?n1GfIjiv%j)X zIrzZ3Z%cT1ipNGEQy@`hYr%0FsmkCg0DTlL**p|@kcEzmfl9u!Hay~BsI56QmC4O# z@$T{MFf6%TiFz~}Zlp+&lGEN={+?;a@k$?_yyTS^H@y{^1!razWwwFsBpcj#_~WrFHrNA$&(cuN;QoA*52(!-<|eAqNHIi2LaaY7E(k_hW>to&xb3))%S5%?6*;jhy!S zQZI#4)jqth-EoA0WSOk{w(lD;<$j;mO?_PIrC2Rh;d@T_`z@I)O5QpQ3jlP`0|40n z+>&lq=Jw_+zqV|@RyfmDbX?=c>;9pI*1os!bIm=nUGil4bnzVuMvHh{qr@vaS{2eG z%5IcX=U#u~joJakljeciDiNfUxra;#;%4BXAs*dIB&~|e!I0uA72F5%TS1>5L)Ej7 z$6+rZ?!uiF9z#6|b~91hDUY`tR%}1|KyfXAjc*xOOb#j!C0s;^L;=#hglR&PW$80vIpL!#?SBH$Fr=hD>6A@ z&J1dnPBrE_XtrmXOC%X?vA(~poRgJ}haBRBNpu^JaoLbbN_m&6)UbKvMsQ4>sT=w( zS81M}=a^6fQ}LzvJZ-I_Wzm{_rWFBxriGB=(}h=qL$Nirm0sXOmk$PZ(~-zLDF$od zo&}q{e0`(pY)#REO!jMM^4KyK9J4|=64k}DcUF!ag`O_MXe3)vV8dkB z0p8(30*8PTWhHvUMk<1Ossbq79ZI(W64yg<80Nt5!Igbq703c4{eg4DPI;pyufki| zJj>{sj_V_2KBR`W?t2lKM5)ddyk7>iB;(1hDc+w$wk=a4EC)FCD8F~05B37DGfTj{ zUVKchm|{;}gczF;2d(VthFU;=4;9VzWM`bE0+NOl?9GRAt|Nov-9Hm*(S9kqGm?1CYEyX~g9dC9u(&cxB z+CmkdYrRrqLmqd++v5_n>%}$(OqYnFZ7li`U9nZVLKQ~g3kP3UkXd+TeR;Ditl4vE z)*-)Um+}B=PFUI!dg$ff2yHYrt}ne?6BB8#bfN|m8gY#^|vX~4kPD`QoJxfRTwc8S(<$$o*}J|p@;C$08v$?N8#GS>36nIDaX zRh_h}{eg~U8XjP#n)@?Q0_07%NoWOke zk>GIW?pjz1Rb{7}YI~hsjX4J!9i=$35zecZ(#(90@~(pW%NSK@wevb{17N4atJ)L z@F1C;&nANL;t{!nLH3$*f~e&jAEn{rymVZmErHg9TcQ;HIpX5v#f8S#^W`V|W}jv1 zmuJ{)?fDk*!?s26IkeJDV|Cmz_RHxlfLoL-Ml`S)6tQNsl*lh~Bu!XCn+@BP(i&$W z^HQ}A=BZ52f_>kHXaKAtJa{c+2O2H32 zSa9@;3ErE!ySh2rYunqgSi70q|9b3IMb{zrvtj{$ypVwEhY=^d#z4%9p};6RtyFL7CQbrr zmIG_5o)te$VmxK^pUl;;yvCx|GNott!kdX$!QkF(6mOoX9HUr<=n|Fx%y2HoFVepzzr@ ziJyMB+WVnawu(~6&6d5ZNbx^(x^m|JV!7<+kV4w*+{hrs`URr+=hvc_eKu`oR_75C zqU88(tfh`sqfBUw8tJ5|3aP$=)v6n#wVt6JO^L#EK>Prn~=QXOt};+6pUN20&-~QBI%O!=K8IVof5Z z;?Y}?pUd>an`*bO9|een_k$gb-p|m}%u-Xrt5*sXgl2d4aB)(M@K^H-S;O$P1yOw< z=XHC%<@}*)9+nwMdGTUDWAglPz0-1{nL@^a#|w6Uz<_WxM|iT=Z7T|geuEh!+0+@2 z`n`Uq{M!)(if=gJS*0%b8a&RK<|<;xu5&Z&D_;-g(=|Emcl34glvJ9SdYsWo8$mx$ zeL^;?_adq`hr*wLosq|sS4KC2n{3{k^`&EQHL3&0as<7qq|A%4Tl|GysoWMkpwBdridg?XwJq$5l#IVDT<~`05x9im%I@+*7dLQ zr>2t(?{kF9A~_T=UXRCM`fc$&`hf0XZtl;55;uVnSgzb(gI<+xi8CI^Pb}^}{zyBd zKKY@Fu!4axHPh-RV*RxJ7&m=~zBUJgL0?l!tIfYkbH2PPlM!tv5W^GRf0eqUeU@Ca zXFpLssl`A<;XOSx_nP>VnO4LnHaWE+ju1OIwaWaWdvA8P3O*WnQ0*+ulQ}kMqG^>W@vpmYFX`fWqcmQ(Z$`&BB#*r& z%HCXf!jZ1q96Q65aD%i;cHttUoKb{JO`A0}PpK$_pY7F~q2$XG7oP((;!2Jxr=~Z{ zK)zu7C`O^H$gC1gM~U5s^iyR>C}7Rzu?9Q?*NW=$XfJC7QT2{-m|eQcxcoSnVMz3l zmw!vh!sH#*jD)22hCS)4<3~qN(Tv>lwUvt%kHXI^L$K6!mN7%QcOYIjy(jUg)4L{< zW2YY`9n^K7V}@d11P~&3$x55hOkappr1X4JPpj^h^;o*yU%ZzuJY_-4}tz`5F?r*X)a;Ze#vXDjMZ9{ln!qzsDzFBT0lw zIB!z9CRa?|Pn>g~d?XP2p@j8M3rLRgygF?4NN}_p;{1kscm3dWB1@@o#b-6f`J2*= zDbCBSN&br_eV#k`Zdhu=u7fIP*aH>L<3o{5pO;(s9p_CNmiO@0K!xhi82uc+q+Z{N zyJc)c4=tZ9VqgBx6|t|Mx{(y6kO>L5fp8GY26{g{^v~UzF1CgF^%*&mavmMLcJ10~ zYV%DkjjHi+7J3CaPO4$AzkawzKUnJhI#DZ%!pJ(%NwD0D>}qRNfDdb9B+fCx7qUY0 zRIvGk^m~t0II?Kj1p@#ClL7#^;2sOSaQCln3Y>X?+oyxEwH>pKley)ormYjE29{8V zHxHftBpNLf7F>S^dv7t57y~4?_3FE1?qa4I=TO-sMa)cU<2UoEpqzxCfbU^~K2LR6 z>TcQ2%Cmv|s*)noaA-(ac*Ep2=UjqVhEV708^s99!3l;_CmSmd-PxBLuG4(ppB)N6 z6dDf9Twr)3up&d5dx%~&c8@zWRXg!k%AH_yy8#Yc+WNNvwvblHV}%V1Cc5o*ZL(WP zjM0IdBcYsWuMlzhh_L;GY_{8-kKkFcP?bp5pK2&3!Mz}W8pd;kqKz=21#kxOMmrh8 z&2q+IhA}MR_?tv7nMvTtWb#sFXZi(y3X29O7l^?nGpg^@)ib_@EKf7dtVU_a1~@iC ziyatv_$JGWg~(*&7!_XjXmijvs)!9OqJ{_dn_GE-7laA0YJ(<~&$M&kv|fWEFWkpZ zyIJ|pY)@E{z$PkQ3C1YQb0|?)V|sJ#OQlYrAZFVKmNi?G>qR4d^A!HHQ#*Jjr(w>! zjYMp3*xiJ@3xsP#E)t-iSY6CD(k-50F(XbMLt18q{W))ykZlP;7^YVH81YC$LJg+) z6g`(^wHkaf|Hqs4&DxXj{oe0zP$}3p3MOcjB~nAocQ#`SZDy&_EGjwjsooD%*Xi9% zM9SCX2U5+E=$7^ht}|4tavyp30@2>b4DCsK=?yiuaKujs4MihC!;2CNZJ-5@8$r?} z2g0x+lY4c33IpguUm;qZbG#9OT7_NW!vZgb8tG;JS~w@B61iGMi!y4Gt9U z%Nwl3jbv@{PgJ4Ud`pE&M;Ek5(0-oU7cwoh5R&MoRdt9`Jq_}(q6uzFNuw|D)$O+t zvUyxtH{G<`w0S(wWJX=3a=>f}y7ONfJ>3z4!)(bqJ`mcw20y*OQFT=kev1ouQ?o!= zlj;R~+ysCK8e&~#?NheHvrRWElNsbN!*@Y352ZWAe|ffj0(&Z&{8`m?U|&aZe(n@XXcVNk=NI*sZ0H@zig^ES6TtzUM;UIB7f z8|5B;+R4@^p2ajOd3xbsJ44z+7!>gp))X;{&LtXMn_>Vz7%i^cI+9y z?^yf-C)NobBIAHF=>|o1*p%W# z4dz-{v4uqpQOZl}i{$K%cT=6-izk8o-tUK+6X)2yJ>3;gcc^Z>HeU3-`gU29yeFgP zI{sxb?8V!?*{0(c-afnUN^{>HtbES(D{viOOfz_EzE)Y&b-TDGu<6-i`?)$!X!CM( z)AvsJ;beTk@H-Ko*ZUtHTStylK6e{G9xVNM{kC^%dh~xj#0ftYy0i77Bnw&TFGGh? z1ygwG;tp`D1tgs9y0{NS;vDH$hQ>|5N=h_dsrB^!5sz>?mILv>Flb65T6=8S+L;q;M_kSe~8cEBmX{oOdVZ* zRighCzgk#2zYKA8^RzSnHC*|p5B_|i^DPlP`QBK||5$p0JRw_%At<^QZ2|0myE__zF@HRL}b{>;DsgQzM0 zKeO>a0sc&M{{slC_+NnkEA9Og>(AWrKP>;s|Hb+}ll&9q&s6I_l(hGMd*!#p>reSV j -#include "tensorflow_utils.h" - -using namespace tensorflow; - -REGISTER_OP("DataRecordTensorWriter") -.Attr("T: list({string, int32, int64, float, double, bool})") -.Input("keys: int64") -.Input("values: T") -.Output("result: uint8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( - -A tensorflow OP that packages keys and dense tensors into a DataRecord. - -values: list of tensors -keys: feature ids from the original DataRecord (int64) - -Outputs - bytes: output DataRecord serialized using Thrift into a uint8 tensor. -)doc"); - -class DataRecordTensorWriter : public OpKernel { - public: - explicit DataRecordTensorWriter(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - const Tensor& keys = context->input(0); - - try { - // set keys as twml::Tensor - const twml::Tensor in_keys_ = TFTensor_to_twml_tensor(keys); - - // check sizes - uint64_t num_keys = in_keys_.getNumElements(); - uint64_t num_values = context->num_inputs() - 1; - - OP_REQUIRES(context, num_keys == num_values, - errors::InvalidArgument("Number of dense keys and dense tensors do not match")); - - // populate DataRecord object - const int64_t *keys = in_keys_.getData(); - twml::DataRecord record = twml::DataRecord(); - - for (int i = 1; i < context->num_inputs(); i++) { - const twml::RawTensor& value = TFTensor_to_twml_raw_tensor(context->input(i)); - record.addRawTensor(keys[i-1], value); - } - - // determine the length of the encoded result (no memory is copied) - twml::ThriftWriter thrift_dry_writer = twml::ThriftWriter(nullptr, 0, true); - twml::DataRecordWriter record_dry_writer = twml::DataRecordWriter(thrift_dry_writer); - record_dry_writer.write(record); - int len = thrift_dry_writer.getBytesWritten(); - TensorShape result_shape = {1, len}; - - // allocate output tensor - Tensor* result = NULL; - OP_REQUIRES_OK(context, context->allocate_output(0, result_shape, &result)); - twml::Tensor out_result = TFTensor_to_twml_tensor(*result); - - // write to output tensor - uint8_t *buffer = out_result.getData(); - twml::ThriftWriter thrift_writer = twml::ThriftWriter(buffer, len, false); - twml::DataRecordWriter record_writer = twml::DataRecordWriter(thrift_writer); - record_writer.write(record); - } catch(const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_KERNEL_BUILDER( - Name("DataRecordTensorWriter").Device(DEVICE_CPU), - DataRecordTensorWriter); diff --git a/twml/libtwml/src/ops/data_record_tensor_writer.docx b/twml/libtwml/src/ops/data_record_tensor_writer.docx new file mode 100644 index 0000000000000000000000000000000000000000..7034b3264ff741154bf1455a2747078cfae9fdbb GIT binary patch literal 37892 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 -#include "tensorflow_utils.h" - -using namespace tensorflow; - - -void ComputeDiscretizers(OpKernelContext* context, const bool return_bin_indices = false) { - const Tensor& keys = context->input(0); - const Tensor& vals = context->input(1); - const Tensor& bin_ids = context->input(2); - const Tensor& bin_vals = context->input(3); - const Tensor& feature_offsets = context->input(4); - - Tensor* new_keys = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, keys.shape(), - &new_keys)); - Tensor* new_vals = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(1, keys.shape(), - &new_vals)); - - try { - twml::Tensor out_keys_ = TFTensor_to_twml_tensor(*new_keys); - twml::Tensor out_vals_ = TFTensor_to_twml_tensor(*new_vals); - - const twml::Tensor in_keys_ = TFTensor_to_twml_tensor(keys); - const twml::Tensor in_vals_ = TFTensor_to_twml_tensor(vals); - const twml::Tensor bin_ids_ = TFTensor_to_twml_tensor(bin_ids); - const twml::Tensor bin_vals_ = TFTensor_to_twml_tensor(bin_vals); - const twml::Tensor feature_offsets_ = TFTensor_to_twml_tensor(feature_offsets); - twml::mdlInfer(out_keys_, out_vals_, - in_keys_, in_vals_, - bin_ids_, bin_vals_, - feature_offsets_, - return_bin_indices); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } -} - -REGISTER_OP("MDL") -.Attr("T: {float, double}") -.Input("keys: int64") -.Input("vals: T") -.Input("bin_ids: int64") -.Input("bin_vals: T") -.Input("feature_offsets: int64") -.Output("new_keys: int64") -.Output("new_vals: T") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - // TODO: check sizes - c->set_output(0, c->input(0)); - c->set_output(1, c->input(0)); - return Status::OK(); -}).Doc(R"doc( - -This operation discretizes a tensor containing continuous features. - -Input - keys: A tensor containing feature ids. - vals: A tensor containing values at corresponding feature ids. - bin_ids: A tensor containing the discretized feature id for a given bin. - bin_vals: A tensor containing the bin boundaries for value at a given feature id. - feature_offsets: Specifies the starting location of bins for a given feature id. - -Expected Sizes: - keys, vals: [N]. - bin_ids, bin_vals: [sum_{n=1}^{n=num_classes} num_bins(n)] - - where - - N is the number of sparse features in the current batch. - - [0, num_classes) represents the range each feature id can take. - - num_bins(n) is the number of bins for a given feature id. - - If num_bins is fixed, then xs, ys are of size [num_classes * num_bins]. - -Expected Types: - keys, bin_ids: int64. - vals: float or double. - bin_vals: same as vals. - -Before using MDL, you should use a hashmap to get the intersection of -input `keys` with the features that MDL knows about: -:: - keys, vals # keys can be in range [0, 1 << 63) - mdl_keys = hashmap.find(keys) # mdl_keys are now in range [0, num_classes_from_calibration) - mdl_keys = where (mdl_keys != -1) # Ignore keys not found - - -Inside MDL, the following is happening: -:: - start = offsets[key[i]] - end = offsets[key[i] + 1] - idx = binary_search for val[i] in [bin_vals[start], bin_vals[end]] - - result_keys[i] = bin_ids[idx] - val[i] = 1 # binary feature value - -Outputs - new_keys: The discretized feature ids with same shape and size as keys. - new_vals: The discretized values with the same shape and size as vals. - -)doc"); - - -template -class MDL : public OpKernel { - public: - explicit MDL(OpKernelConstruction* context) : OpKernel(context) { - } - - void Compute(OpKernelContext* context) override { - ComputeDiscretizers(context); - } -}; - -REGISTER_OP("PercentileDiscretizer") -.Attr("T: {float, double}") -.Input("keys: int64") -.Input("vals: T") -.Input("bin_ids: int64") -.Input("bin_vals: T") -.Input("feature_offsets: int64") -.Output("new_keys: int64") -.Output("new_vals: T") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - // TODO: check sizes - c->set_output(0, c->input(0)); - c->set_output(1, c->input(0)); - return Status::OK(); -}).Doc(R"doc( - -This operation discretizes a tensor containing continuous features. - -Input - keys: A tensor containing feature ids. - vals: A tensor containing values at corresponding feature ids. - bin_ids: A tensor containing the discretized feature id for a given bin. - bin_vals: A tensor containing the bin boundaries for value at a given feature id. - feature_offsets: Specifies the starting location of bins for a given feature id. - -Expected Sizes: - keys, vals: [N]. - bin_ids, bin_vals: [sum_{n=1}^{n=num_classes} num_bins(n)] - - where - - N is the number of sparse features in the current batch. - - [0, num_classes) represents the range each feature id can take. - - num_bins(n) is the number of bins for a given feature id. - - If num_bins is fixed, then xs, ys are of size [num_classes * num_bins]. - -Expected Types: - keys, bin_ids: int64. - vals: float or double. - bin_vals: same as vals. - -Before using PercentileDiscretizer, you should use a hashmap to get the intersection of -input `keys` with the features that PercentileDiscretizer knows about: -:: - keys, vals # keys can be in range [0, 1 << 63) - percentile_discretizer_keys = hashmap.find(keys) # percentile_discretizer_keys are now in range [0, num_classes_from_calibration) - percentile_discretizer_keys = where (percentile_discretizer_keys != -1) # Ignore keys not found - - -Inside PercentileDiscretizer, the following is happening: -:: - start = offsets[key[i]] - end = offsets[key[i] + 1] - idx = binary_search for val[i] in [bin_vals[start], bin_vals[end]] - - result_keys[i] = bin_ids[idx] - val[i] = 1 # binary feature value - -Outputs - new_keys: The discretized feature ids with same shape and size as keys. - new_vals: The discretized values with the same shape and size as vals. - -)doc"); - -template -class PercentileDiscretizer : public OpKernel { - public: - explicit PercentileDiscretizer(OpKernelConstruction* context) : OpKernel(context) { - } - - void Compute(OpKernelContext* context) override { - ComputeDiscretizers(context); - } -}; - - -REGISTER_OP("PercentileDiscretizerBinIndices") -.Attr("T: {float, double}") -.Input("keys: int64") -.Input("vals: T") -.Input("bin_ids: int64") -.Input("bin_vals: T") -.Input("feature_offsets: int64") -.Output("new_keys: int64") -.Output("new_vals: T") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - // TODO: check sizes - c->set_output(0, c->input(0)); - c->set_output(1, c->input(0)); - return Status::OK(); -}).Doc(R"doc( - -This operation discretizes a tensor containing continuous features. -If the feature id and bin id of the discretized value is the same on multiple runs, they -will always be assigned to the same output key and value, regardless of the bin_id assigned during -calibration. - -Input - keys: A tensor containing feature ids. - vals: A tensor containing values at corresponding feature ids. - bin_ids: A tensor containing the discretized feature id for a given bin. - bin_vals: A tensor containing the bin boundaries for value at a given feature id. - feature_offsets: Specifies the starting location of bins for a given feature id. - -Expected Sizes: - keys, vals: [N]. - bin_ids, bin_vals: [sum_{n=1}^{n=num_classes} num_bins(n)] - - where - - N is the number of sparse features in the current batch. - - [0, num_classes) represents the range each feature id can take. - - num_bins(n) is the number of bins for a given feature id. - - If num_bins is fixed, then xs, ys are of size [num_classes * num_bins]. - -Expected Types: - keys, bin_ids: int64. - vals: float or double. - bin_vals: same as vals. - -Before using PercentileDiscretizerBinIndices, you should use a hashmap to get the intersection of -input `keys` with the features that PercentileDiscretizerBinIndices knows about: -:: - keys, vals # keys can be in range [0, 1 << 63) - percentile_discretizer_keys = hashmap.find(keys) # percentile_discretizer_keys are now in range [0, num_classes_from_calibration) - percentile_discretizer_keys = where (percentile_discretizer_keys != -1) # Ignore keys not found - - -Inside PercentileDiscretizerBinIndices, the following is happening: -:: - start = offsets[key[i]] - end = offsets[key[i] + 1] - idx = binary_search for val[i] in [bin_vals[start], bin_vals[end]] - - result_keys[i] = bin_ids[idx] - val[i] = 1 # binary feature value - -Outputs - new_keys: The discretized feature ids with same shape and size as keys. - new_vals: The discretized values with the same shape and size as vals. - -)doc"); - -template -class PercentileDiscretizerBinIndices : public OpKernel { - public: - explicit PercentileDiscretizerBinIndices(OpKernelConstruction* context) : OpKernel(context) { - } - - void Compute(OpKernelContext* context) override { - ComputeDiscretizers(context, true); - } -}; - - -#define REGISTER(Type) \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("PercentileDiscretizerBinIndices") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - PercentileDiscretizerBinIndices); \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("PercentileDiscretizer") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - PercentileDiscretizer); \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("MDL") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - MDL); \ - -REGISTER(float); -REGISTER(double); diff --git a/twml/libtwml/src/ops/discretizer.docx b/twml/libtwml/src/ops/discretizer.docx new file mode 100644 index 0000000000000000000000000000000000000000..acadc7e2772e02beb5b40592a312502ff8bbddda GIT binary patch literal 38781 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/feature_extractor.cpp b/twml/libtwml/src/ops/feature_extractor.cpp deleted file mode 100644 index 9e0910bae..000000000 --- a/twml/libtwml/src/ops/feature_extractor.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include "tensorflow_utils.h" -#include -#include - -REGISTER_OP("FeatureExtractor") -.Attr("T: {float, double} = DT_FLOAT") -.Input("mask_in: bool") -.Input("ids_in: int64") -.Input("keys_in: int64") -.Input("values_in: T") -.Input("codes_in: int64") -.Input("types_in: int8") -.Output("ids_out: int64") -.Output("keys_out: int64") -.Output("values_out: T") -.Output("codes_out: int64") -.Output("types_out: int8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( - -A tensorflow OP that extracts the desired indices of a Tensor based on a mask - -Input - mask_in: boolean Tensor that determines which are the indices to be kept (bool) - ids_in: input indices Tensor (int64) - keys_in: input keys Tensor (int64) - values_in: input values Tensor (float/double) - codes_in: input codes Tensor (int64) - types_in: input types Tensor(int8) - -Outputs - ids_out: output indices Tensor (int64) - keys_out: output keys Tensor (int64) - values_out: output values Tensor (float/double) - codes_out: output codes Tensor (int64) - types_out: output types Tensor(int8) - -)doc"); -template -class FeatureExtractor : public OpKernel { - public: - explicit FeatureExtractor(OpKernelConstruction* context) - : OpKernel(context) {} - - template - bool allequal(const A &t, const U &u) { - return t == u; - } - - template - bool allequal(const A &t, const U &u, Others const &... args) { - return (t == u) && allequal(u, args...); - } - - void Compute(OpKernelContext* context) override { - // Get input tensors - const Tensor& input_mask = context->input(0); - const Tensor& input_ids = context->input(1); - const Tensor& input_keys = context->input(2); - const Tensor& input_values = context->input(3); - const Tensor& input_codes = context->input(4); - const Tensor& input_types = context->input(5); - - auto mask = input_mask.flat(); - auto ids = input_ids.flat(); - auto keys = input_keys.flat(); - auto codes = input_codes.flat(); - auto values = input_values.flat(); - auto types = input_types.flat(); - - // Verify that all Tensors have the same size. - OP_REQUIRES(context, allequal(mask.size(), ids.size(), keys.size(), codes.size(), values.size(), types.size()), - errors::InvalidArgument("all input vectors must be the same size.")); - - // Get the size of the output vectors by counting the numbers of trues. - int total_size = 0; - for (int i = 0; i < mask.size(); i++) { - if (mask(i)) - total_size += 1; - } - - // Shape is the number of Trues in the mask Eigen::Tensor - TensorShape shape_out = {total_size}; - - // Create the output tensors - Tensor* output_codes = nullptr; - Tensor* output_ids = nullptr; - Tensor* output_values = nullptr; - Tensor* output_types = nullptr; - Tensor* output_keys = nullptr; - - OP_REQUIRES_OK(context, context->allocate_output(0, shape_out, &output_ids)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape_out, &output_keys)); - OP_REQUIRES_OK(context, context->allocate_output(2, shape_out, &output_values)); - OP_REQUIRES_OK(context, context->allocate_output(3, shape_out, &output_codes)); - OP_REQUIRES_OK(context, context->allocate_output(4, shape_out, &output_types)); - - auto output_ids_ = output_ids->flat(); - auto output_keys_ = output_keys->flat(); - auto output_codes_ = output_codes->flat(); - auto output_values_ = output_values->flat(); - auto output_types_ = output_types->flat(); - - // Iterate through the mask and set values to output Eigen::Tensors - int j = 0; - for (int i = 0; i < mask.size(); i++) { - if (mask(i)) { - output_ids_(j) = ids(i); - output_keys_(j) = keys(i); - output_values_(j) = values(i); - output_codes_(j) = codes(i); - output_types_(j) = types(i); - ++j; - } - } - } -}; - -#define REGISTER(Type) \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("FeatureExtractor") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - FeatureExtractor); \ - -REGISTER(float); -REGISTER(double); diff --git a/twml/libtwml/src/ops/feature_extractor.docx b/twml/libtwml/src/ops/feature_extractor.docx new file mode 100644 index 0000000000000000000000000000000000000000..aa1101ab1ebbd0ddbc15af106afa67e8747e9b99 GIT binary patch literal 38214 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

^kOmY#Mp7b7NlJenOr++KBni=a_kZj7v~% z$Um<|W3+u`aPG+6fUG)QP(5oZj+prsSbwH%?*fxi^Do>{blim{gP;zYEy()~(TymA z08ud(4a~ey!6~Ybqvku<4*Pc$j<_S#Bc*W)F-rLR3(aAxCqq^oXgU%*pFSr{R7_MXB_;%L4!Ga5Q;d@g zZp>8|0*LEt$BFnnNleDgw<))4I7r2sV(vHC5s#P?-e&n_gtcNDeq}O@BD)WLl zommla&;<4qcc&yRq63^mnGw(>@taYm8!4&GS`IYa5%U{~`8YqP32_UbjJI#??iIv^ z!O{z@B_9~lx?^I(>nPGL*QY4qNiG~-JCY}6XF*t#a(Q0}8S#PFTB|UbkOewLzSQjd zFJ_u^I+s~A5h@yTnN;3_Js9xg?3Q+NCxA8{?1JB1rm&)3iW?#dYv83bB2xu`lfnea z%pTkin0}lOft*s5Gc}pqQ1MTE2Bx!6U)fqdRvJgY|5BKb72%~ev1@LU=+6vEJ>zN* zF*`phXn4hVSAuaY+G=tS2@pf{Ay8Dxw5=vnR4iW)HKLUek8Umo(2yhw__X|WH6lH= zvV5AZE)s}C((lTVRohKqJc*90UN9t1q8ICI9#=;fM8UzeOBYB!?oP_!Y z+gB8LG>4xfgeOem>+^2ohy$m=>y_Y{;_Dw$MVn@UNJhxe z{c+Q#>W+g@7^T;-FzQBMc5~^%3ncg;Ff>|_>FOBi6nRGdFX&jV`fJG2@%~MyfH%Wc z>7ku;LL20pNv!o<;=@l8@f|9IWLLfaP>1dJu1*;F|EjZs2dd+O>GXL$MgKRL(f+ez ztW)t{KsFfI(6_4*vaSCj#X@&;;~k&*^83H)eC7*?>2`yIfE>a8M^!vWV<#tb8`D4Q ztQu7}9KLg*b!`>vwd|O{HrdPUQJ;|2Y|2tt0Ur_oQuhtS`i?UWK38swbS-Q&$t30C z9R22Ls=Lc^U|5bZ1HmN+A<=*zj?r%xM1-1_hU0d2x!CGOpN%OgB#en#kDtc}`&--F z#U4Mq9=$~>s5>&n!GUK>qiSJ%D0OpBXlo1{gr8+8ckN>-=SRSuW93lcewezZyx4_4 zDx?t0`TEFH%@WClb_6$lBb$SDrXrRL|Kd-QkQ_FD0Ube4#H94M4HScgP`tBS@Q zoNv0F#4Yy#mmlc0dlP3D{o4@^KNZ!gF^&q3;1iO_vHURyQsrX8`0ZZ&^OsjJvD#^C z?E??>XEL5A5O^tLG2C+kDW2^zAQ|V|BV*Fg;17i-Ok5))o+-!)&*$-ljv%qp6?ika zK*D3s)=@ve;6g@lyCX_NL1bRcM^fOW9*{@MLRu=a{t^jWmpa&(%F78Hr=Klo$Z-^v zx@(H*vl#8rA^)A^;!C%lKP8=!BWEDmDS$sP`t(O<*U11_{G?qu->jU_Vf{L~1FlXK^$Uot)0w6g^v zj*LIhD16@{&AIc0r%$Q*7eS){cN&7LWi3(1Oai>B4KE-=EH~S>^vV^qg>f5e^sLW+ z&;A1z0BhV%`xA1*O&CsNfU~0sZ60Um7C<;VVb`L?`(A}aPVjfBaiykHb*RP3o=P9r zC0%I^Qi4ZoY52Mp?7E$}Jbl?T@5UW))h~aeM7Ie%p+x_N80NsEOQGGotL*dt*vPAyy>)^J_)uJTFo+E5-ki<*+bG$h3~1BG_pySkC_ zsJkK^jtk@3 z&vHqU9$&A9T2e#34|X?!^Az5<;Ec~l2YK}23jX0TJJLpl55UwCV@Tb}EjT~8Sd3s$ z2o+ND5w2P2l54d`aaPA32V%qLx!Y`c3-q7MD~~k~lt6$bsG5L(?-iT>l%V=*Y@qZX zCw$~guSGu-JjjekSKoe|(w?M}G``qyVPSF??)04P)$`dhG|kvkAMJONQ`0mcC==F1Nl$K zesSkG8UjoF{(=JmLH(CwCcui;%K8RYf9m{hB=y>SXTlr$@hyxhIYY`Sz7Y+DW+e;I{AUnCaXXbnfQ!#)e00L8U2k$MC>{!GYeYB)$sog=PWNH~lz zPK+9f1lA5u=T;&aOO#(ZbL8TfwR^~#@`yg2s9*w%mWjgQFw=o0?(qc{Gmb>ANQtEh z>rfng>eN&k2e(Plo7WH&iBzF-1T$usV7{E) z{#wqyVf)!?FP60EojV7O8L%jj)eUUf&8hNxt%MI!dyk@tS~ZUZX}b^tcK1k(?)Uz(QKp}?z_R8BlGXZmTujN z?reS=8Tinb=^F}E$X{obTo{v@U0ike+pNHE69+8+ns zLZ_TxlDjC*irr!VU%6N+LO^X6j&2aqvZ7KTIw9*qxUlc>(ch@)hdXcTuc;LL za6b2%W`o~^c&v*>y&6WP;BYu7`<)zmnBSnY>YkYbvifXUl>=p!QYoQW?|M~;L!@5FTg+?-w0v}yS6Rp z@ET#)8v8TjC1}%-)VMqnpOhXaiaVsSR)PzxM_=*XnFNFTz#trmDZi_7ztl@Hi%XKm zqKVMu$;{mM3uH0~Axo(*o~*cH-Ksp_-;bx8o0p}rL0;)pFJGw4wNviQG!=@{KB3)v zmCs2^#()j7LB=_aM>=ds#3vRd$<=S3IN_X8q-h2fWy#IcaGv3+e3bnpJWo|4Yns1i zoo0rEoo2!>`}@Yd-lo8u!c5!mwbK(7z41hFo(PpGZ{LJjTDq=5ake^tK_bJ&o+PS- z5yL1Cnow~m`K)0B7HtLE04E2ffxPMiECGurnNSN{??Bu_#^mi$g1XNdJanG*H#|WN zgQ%shZ%=z`$Vr6kZ>{deEcvcrGF`N|Ca^Q|*5Ux0v zTd@MtoPZ^{Ci`*?*1AFlyW(rtEni_n6W|^%c!>*OLQoUrP+_N;Pquz7ijmg)zn;ELDHJ^lc`$z^-4mp<39e?XzMF zEJ+%sO;4zgPOa(;spN)6s_ z;glYaz?ij|IWnX8OXn}gkb~~}Te5!qyB;h`L@Pyk>ilI#HSS4Kfp5DZZPBsnb)Pr- z4VUpEEKK^~9MKgzgJecw@&;VWh)vwnPrt4RsCM5PwM(yACB6chVwbo0Uwe2qf*SPo z>xzG^eHLshccyl{3Z7ly*csRoWAUB#`0ggh`@`I{q?o=!s{DtM`*PT&_ig*etn;*% z(;BY+XP3c*oHcD*AMLcElkwI3Su?)MiXI@C7pH zw2l2KmURR9L^;}<+4SFNbW85qj$hG|k`OW3?|zE&5Ta=Nu&^jVJc0Y`PqDgt zIBJ3ySy#oUf&x>kevSYMu`p6oqjF)>BK+qM5)1jE}Z_ z#0&6G-#R3e42!%_bO4js?j`Kt9YJhXwPeF64X4zD zQW_J)Eiy(uN~l!QC?hH|c!Eq(1IC~x-B!8ehFP%eB(=kNa>J_tPa4GJEA#WgtC#Fi zox;6by&B%%JE?TA4$)k%)n6X}tAJ{j56^Nj@Cy$Ln7w`kz8g9_I@wyQTU#-jI~iO5 z`P!?DsDiv#6w_9h}F77=ZBS?V;c;a^P8@5OhWrvYC>pxQ26!D%EP0e?hAJp7{fkQa ztPS$O>K3?kBZq*+)&J7PKX$O#3DiRg)J5jwlu6Wxd5;fU3(26mgf)+eq=6~w7Xf-ms4iyn1!ER+LwyhkcN2XIrAxat#;8tfa z%yO=~G%%e>Z+n}2>LzZdRKgP@z16oWz#@R%thG<;@W*en^ci8KX=q0^&mZ0#KX^lD~It&Kku zn&{WAzMI`q<{St!v=9jpYRg5bFZixLB9Ucp97Q`dz`kyF=#dzP!kO8u_!9ObVz%Rz>@yJ0In)^cv0cBPcv5d zeC9Ye!?JpLES;jtX1)7GBU?_Pk-pm=g{T4WeBl|mS+yTpxj7i}8?htojOkYseE+{Sqlg+IR~>fmL&wJ;KbiekpxnI7wTPDNqu|Due1W9{JIGi~G$J z@B;bxa^)Yli5QCJ$Z_efRlFrkcPKrvwD0c;o zbC9Ss)x}imJl`p=SH4T6Mp*Gia)$KXCGDzTB~ExT zDGjm)T0tw7=j6YzaKP=|%sFSsZy2iDcT|T^hLmoHeSj-$L$?e>u3p<0v!{^Xg``j? zU{jNyJs(<9tx@Q;S6a+vCROP%6PHY#ICHrD9G)u@A{{nC%t~NOZNNf1jS*7f$1Tmt z#eKSzAPdP!E_o3o$I&k5vo&>>>f^zV2g^w9o$60DN?UCTF$EcA76xZ832VDdN6Y=~ z@nN!n8~y7BU`+sWi$a`ZJ?bK~Q&qd{;|rqN&g{w3oXa4etzI4?a-_JNC+AnW@!A6;YPvyb^fe)tro4036wRin8T#1A58sJz93LhWF@dO+P>7%=L+}0YtT4#$ zyJqoL4P1e1Mt*y;pFRSo_=|3cMZ8kK^eljOQ0SP8XN%v&pon}%L{xplnn>&H&DKpQ zHS2n9^=8#I?}%{_ilWvuaxm)`fXhkyw{ZByuSSD2yPpQ_6tzc@gHZ&&xbU5l;s%t{ zH-cq}-P_8^Rb7&<%XfXSmYp*@mz`HKIwFysSD&|_d%viC8QKr@5M_k2$wcS*-ubbs zHx!x81q{B&=u}p-A!jfNnQWTo_4bGN+i%1M!cc<{uJ}?__Q=}*)7F`XL$$_n{Mg1a zvNV=NQlhKKT9}(9b-R^B$*qX7G!0{tWyH*&X{=dd>`BB`U1X+icevIoO9@#@gl0s8 zVaQTVX>R78+)B>l{Bh26-sgP2?|I+n`Mu}2JkNPQDb0o5fFCj9?DP3_R@k^W|DNLU zc+lI84hYeH{c>!&{hEDYf7n1$z>IyDmy*TM6XZO@)s!z$2h&E?j+F(##*UhBIo3I0 z7DFo4a||cUzY;W=!?c(r*X!nK_2KRO7mBFR6JbLe!ja=8S1t(Z;CB0^RaJ*&#DyH( zPJak>ox?NchpmvVy2feO7yXE@ah3GDH@qirRHEuVL?%ygXUdhYxNC)*p?T{>|4P;iO<$O)}Lv_eAa|Jq7WGYNPrhJ)7;qyL<+2rSB@zqX)zs zOtVAeXnTY_%RF+O`U!X+yE{y9PvJN|H^8Brf;{$%^{?V`aD{abH)H2^?p8pF%)Mk5 zNjgMPQ5{pv{?B!}Z<#@z=A?1I!bgRu#;*CbBuN8l5p?LDcYoEj`7vnzW~GOw6nEhP zPDN$IFyJffE!|ppzsJ+L3Rih>2(Ft*F=>f0$#RiWHdj+5M`DMo0wyF36lCo;z7)_k zpMa|%pe;sd(X3RZRsgd?At%#?@R%;QF5OrvcV=JSCQnMslk~pQn(TRGhQ5=@&Li6c za}pj*2N6;#Hs$}8b%t&~f|Y4)`ALyN;e=fC)>rdv;mS%JoM1JDC;V5-*lTM3yd+O*=SG>`HusWv@P&1#B3-5Y?O8b` z=jP1HEPZdTk42oQYTeLspGrsU?bx;xLvxf!M?U}fl67|~ZnXZrxJZT~_OPeimYe&V zckr>TJ(XuN6ZMZ?x6LGd*5YN?>8UyJHjnKukC(@sI~>%dHE`&;8Ji+^C#jkJEAe#m zUlqnFosrFna8Zdp8!VY}QEl$RThl3GhSHmfHLqd;XVG_3-gCww)*=J2K63?dE7W)* z`hwN&!P?}8K#BRjHgH$WhtcC7*H43mPW}6zcW(WRkFDUobzeH7c@Gy z#kn6Zagok^-%rhLB2JG;{ll+M8>i)LsM>+qlxH6(Zrvc$l<_Q$JJiQpY}uEn{xn!H z{4V^QL-75@dCbR%I`RD4e;-FttRCbyl`6*@RFG4TYO*4wwUX^Uqm!*V$>X=LQR-~M251ApZ&Z(KY$;CV=F+B+RVOB-MER&ZxlfCH=c=TOOx|TpH&IT`=#@CTd&c=5bwEnZ0%4Mlhv(VdF6>SS zb(=61KFyL#T4bsuxv?m7_QF##`}o%7jE}VdT=}Wv#$#lI{`zPAp`Bj)WoOrFi_7}A zo+2|MGz>{--1MI>&MWrI?4r5nabAt&Iu&&z+;0lh{d~JLDpVsczkzv4CFleu%AeG1 zRJqDgUzbohU!t+-fj)U<78%}}(qp19wN6U6F+g`XG|%0qU4$d<$&O8G(|fuG#eSNM z%Ai)9Z5&IN%$#Ow=Eio|wbK!Uu|;RkCaGmu_{^v0R^RHVA@xpC8c27V%Tu2kkqE(d z(<53RiA?neE;DcG>FfiJL2Z-0vFZ`*ZU$GK6!!Yo?YxMw{_(tv1wn1SS#A;N!BTqd zLhsAsV9#RAHhdiU>+I%jRvn|p@*Qv|33bbYYzqEV&ING;3M52D8B+62V1^> zd%VsEE@h&j_`AVDWiE*0L;*l<1%451`Hp+|`>*!ai6%DE$0PtCa}TuhY;Yo$DhHrM z@HueotKoiR)wM=o=WSqDYAZTdk^PGQKk^?%R-J{UQl+00^Z~%lNelqd?*~~Z8XVQq ziv-~bIP_Av5;_OaA4-0s$wC&^D`3d)C80XdI_a_wE%=+x4@DFx4lTSaRgn#9sIb^5=H2z+eaE@9v8ixu%1Kni-qv#(6RttNf zTF}^WS!;XDk6J4uNvH}m)LK@tiTye&D*`Vl5A_F^d1m|%CbrT$bg&fzE$E9?$paps Kd32_Hx%&?~A$-mN literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/feature_id.cpp b/twml/libtwml/src/ops/feature_id.cpp deleted file mode 100644 index 150b5614c..000000000 --- a/twml/libtwml/src/ops/feature_id.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include "tensorflow_utils.h" - -using namespace tensorflow; - -REGISTER_OP("FeatureId") -.Attr("feature_names: list(string)") -.Output("output: int64") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( - -A tensorflow OP that hashes a list of strings into int64. This is used for feature name hashing. - -Attr - feature_names: a list of string feature names (list(string)). - -Outputs - ouput: hashes corresponding to the string feature names (int64). -)doc"); - - -class FeatureId : public OpKernel { - private: - std::vector input_vector; - - public: - explicit FeatureId(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_names", &input_vector)); - } - - void Compute(OpKernelContext* context) override { - // Get size of the input_vector and create TensorShape shape - const int total_size = static_cast(input_vector.size()); - TensorShape shape = {total_size}; - - // Create an output tensor - Tensor* output_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, - &output_tensor)); - auto output_flat = output_tensor->flat(); - - // Transform the input tensor into a int64 - for (int i = 0; i < total_size; i++) { - output_flat(i) = twml::featureId(input_vector[i]); - } - } -}; - - -REGISTER_KERNEL_BUILDER( - Name("FeatureId") - .Device(DEVICE_CPU), - FeatureId); diff --git a/twml/libtwml/src/ops/feature_id.docx b/twml/libtwml/src/ops/feature_id.docx new file mode 100644 index 0000000000000000000000000000000000000000..a7ea69c251018c6c4676d34d395e5db45d0e1dcd GIT binary patch literal 37471 zcmagFWmsIvwm*z(a1HM6?hb+A?h@P^2@Z`12=4Cg1b25QxLc4waQA;_X3jY?=id9i zUp5a_wSKbJ?yB0mtCeISp)kR~z~I2j)3~)NRSIJh!NI^rVZgvJK&`ss0Q=8o_MZ*a zJRHoN^_kr5Y#S2g6<0-2znr~bB{2(;c!{H6mF+mtI55QGNmQrb@MteFpU6Qx+>P^v zsm~~dz%a#Tq~7@ut=0;5dN)$(ic6g6>t|@@lR*}H=db56otks+Nyd`OEK2VZ&JDoS zG-r6fpW*^%*{$j0Gei$Q6U)&FNYr`&i=wWK)<7p742Dw?9EA?8&Y$7VZ6|k7Q#l%@ z-lezP8&z_B8TWM~dl2`N%z9a3qSDB;Nk?e)=Sc}OI#-waVpJd3@BGbmg1*klLfx@; zwWko-eGn0V`u&GpHnflJs*&}*rT;cdr{wJxCWO5 z-|kQ9uC^1TZJQQ;LyjzBMs>$!u0bM1zkxBJOIvq3BU&XUVMu2uja(8`8jp63_?br2 z#fNbg00WScYvlY|T-ox&*6r)PaN}obBR`R&7zZ@fR0UI39G(JX8Apt3ahZdusIr)r z4D8m&HYH2l@(ZTJKygJ?19ysRn2C1uejbZ@f#R9w-4FYW6yy_{o|EP-8-dEc4pT(G zSiU8n=`=(y`M{0L=yIL?GeMzW5LK-}xA_bxL1>@^nF36doB$5a%q9RQv)?y)X55%U z9}BAFowwwiyhhj+Dx9PY9r)4LkJ6a_OD(q?obt9~SzHsFy9IVSIrOeXoBTsp4nphP z4NZ_H!EwRFA+cxvre6`Yv0hh=vDcomB-=8Qfo;Un$|~?OIBYXp$<~e zuMY!8D*G8`G&L}61ShT!(C<*d*+rC7Rot32*tWi&I6FCRPPszrm%nQYd54_zK6mD% zq(USh7j8}0bpy~}_-$xzZfA|rnbJ@AvuQJX4aQ637!P&wCt${UF7l9@phXCLX2RX| zg%xXhf(&M{XaO-Nav?doS_-S(oe8 zRh(l`U2LJiz)=5Qmro83f0RXS%zl*xwf%`6O8@g$D_Buw+_-=R(HZe|yqdU-rnynF zkFiiKtUExThfpluFU&V#{B`_K^`lRVqUNym3YO|vV-I=5N{;IY4b@+V_E#qk$ef|d zpi8kd2GH~!4W~vc=V2J(Kc{LcRgHR))ftap5WzY)E7DJWUO^VwsP`&rQ*iK}el`=4 z{N?)XzW+Q?sbOg&MVUqMYdPdgwPm?S$&?`Hhuxba?W9B`WGRSGFYHib9_3av%b`*@ z@+A1IMjhwlmQdD+UY~DjO@E^0SlH>}2+Wd;91}4(T+Y6`???E7V^Xjs0-U~)awyL{ zrC9~T`C5NmN1|F=su_A2c@op5B|4PD%L(}+P7^WmojlR{6QJiBEnCZf%`v9=wyu;v z23htN8S0T=Z0Q+Wf^J0|R);VqzA+WU_uDAo>K8Z9yZFjWNGV1aXx-&x|lpfX+9u^wzaxCkO1xxw%No9p0-l271mUq&Lvi2R#v zH&nmzwe9*Z9Bj!7wT)Lp{S(@SyLD#b?R!V%hv@*2y*@1 z<&jRz;BKXa0ZB6GxZ0SmWsMceG2`+oVJ&pSQz9X^c7A1ML!WUKj(io?9c*{)K ztYT>~_KKDF{e%?lguwnoKK3kdoWRC)LZwLfz4m%xiuM#O1q$8!Cs_h> z1u(Dx?Ib3c@Tb8fk@7L)FWzv&PNOoCEx`veX%I#|>b;j(fapY+%n`BS4#X-(*DSZF z1@_0Ve&^;2C?P1In!@OJ^oJL8{#Qr_V+jTe0jOTPOhgKogLL7jG`^PEn`XiIykX7n zOP=4qJe$)ZLiD`FsxOyxax@U7$OJeqiM)sZqRK?ksQ`|~5*6`*ZwNKBO7eO{&-sZv zZvT>7^vdYVY?d=)_j1Q>@<#2{>(5=o_taKs%0Dbe6Js3d_KDEqJiqn7hsNa28eR=E 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 -#include "tensorflow_utils.h" -#include -#include -#include - -REGISTER_OP("FeatureMask") -.Attr("T: {int64, int8}") -.Input("keep: T") -.Attr("list_keep: list(int)") -.Output("mask: bool") - -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( - -A tensorflow OP that creates a mask of the indices that should be kept. - -Attribute -list_keep: list of values which should be kept(list(int)) - -Input - keep: Tensor for which we will apply the mask (int64, int8) - -Outputs - mask: boolean Tensor. (bool) - -)doc"); -template -class FeatureMask : public OpKernel { - private: - std::set feature_set_keep; - - public: - explicit FeatureMask(OpKernelConstruction* context) - : OpKernel(context) { - std::vector feature_list_keep; - OP_REQUIRES_OK(context, context->GetAttr("list_keep", &feature_list_keep)); - // create set that contains the content of the feature_list_keep, since tensorflow does not allow - // me to directly ouput the contents of list_keep to a set - feature_set_keep = std::set(feature_list_keep.begin(), feature_list_keep.end()); - } - - void Compute(OpKernelContext* context) override { - // Get size of the input_vector and create TensorShape shape - const Tensor& input = context->input(0); - - auto keep = input.flat(); - - // Create an output tensor - Tensor* output_mask = nullptr; - - // Output shape is determined and now we can copy the contents of the vector to the output Tensor. - const int total_size_out = static_cast(keep.size()); - - TensorShape shape_out = {total_size_out}; - - OP_REQUIRES_OK(context, context->allocate_output(0, shape_out, &output_mask)); - - auto output_mask_ = output_mask->flat(); - - // Check if value is in set, output is boolean - for (int j = 0; j < keep.size(); j++){ - output_mask_(j) = (feature_set_keep.count(keep(j))); - } - } -}; - - -#define REGISTER(Type) \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("FeatureMask") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - FeatureMask); \ - -REGISTER(int64); -REGISTER(int8); diff --git a/twml/libtwml/src/ops/feature_mask.docx b/twml/libtwml/src/ops/feature_mask.docx new file mode 100644 index 0000000000000000000000000000000000000000..94e0c07247ce666e4817c8715c4ced9d651dd263 GIT binary patch literal 37803 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 Bx4r-X literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/fixed_length_tensor.cpp b/twml/libtwml/src/ops/fixed_length_tensor.cpp deleted file mode 100644 index 876367ad3..000000000 --- a/twml/libtwml/src/ops/fixed_length_tensor.cpp +++ /dev/null @@ -1,190 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include "tensorflow_utils.h" -#include "resource_utils.h" - -#include -using std::string; - -template -void ComputeFixedLengthTensor(OpKernelContext *context, int64 max_length_) { - try { - const Tensor& segment_ids = context->input(0); - const Tensor& values = context->input(1); - const Tensor& pad_value = context->input(2); - - auto indices_flat = segment_ids.flat(); - auto values_flat = values.flat(); - - auto pad_value_scalar = pad_value.scalar()(); - - // Get maximum length from batch if user hasn't specified it. - int64 max_length = max_length_; - if (max_length < 0 && indices_flat.size() > 0) { - int64 current_id = indices_flat(0); - int64 current_length = 1; - - for (int64 i = 1; i < indices_flat.size(); i++) { - if (current_id == indices_flat(i)) { - current_length++; - } else { - current_id = indices_flat(i); - max_length = std::max(max_length, current_length); - current_length = 1; - } - } - // This is needed if the last batch is the longest sequence. - max_length = std::max(max_length, current_length); - } - - int64 batch_size = 0; - if (calc_batch_size) { - if (indices_flat.size() > 0) { - // The last value of segment_ids will have value batch_size 1; - batch_size = 1 + indices_flat(indices_flat.size() - 1); - } else { - batch_size = 0; - } - } else { - const Tensor& batch_size_tensor = context->input(3); - batch_size = batch_size_tensor.flat()(0); - } - - TensorShape output_shape = {batch_size, max_length}; - Tensor* fixed_length = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, output_shape, &fixed_length)); - - auto fixed_length_flat = fixed_length->flat(); - - int64 n = 0; - int64 offset = 0; - for (int64 i = 0; i < batch_size; i++) { - for (int64 j = 0; j < max_length; j++) { - if (n < indices_flat.size() && indices_flat(n) == i) { - // Copy from variable length tensor. - fixed_length_flat(offset + j) = values_flat(n); - n++; - } else { - // Pad to fixed length. - fixed_length_flat(offset + j) = pad_value_scalar; - } - } - // Corner case: truncate to max_length if user specified max_length < current length. - while (n < indices_flat.size() && i == indices_flat(n)) n++; - - // Update output pointer - offset += max_length; - } - } catch (const std::exception &err) { - context->CtxFailureWithWarning(errors::InvalidArgument(err.what())); - } -} - -REGISTER_OP("FixedLengthTensor") -.Attr("IndexType: {int64, int32}") -.Attr("ValueType: {int64, int32, string}") -.Attr("max_length: int") -.Input("segment_ids: IndexType") -.Input("values: ValueType") -.Input("pad_value: ValueType") -.Output("fixed_length: ValueType") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( - -A tensorflow OP to convert variable length segments into fixed length tensor. - -Attr - max_length: The size of the inner most (i.e. last) dimension. - -Input - segment_ids: 1D input tensor containing the sorted segment_ids. - values: 1D input tensor containing the values. - pad_value: The value used for padding the fixed length tensor. - -Outputs - fixed_length: A fixed length tensor of size [batch_size, max_length]. -)doc"); - -template -class FixedLengthTensor: public OpKernel { - public: - explicit FixedLengthTensor(OpKernelConstruction *context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("max_length", &max_length_)); - } - - private: - int64 max_length_; - - void Compute(OpKernelContext *context) override { - ComputeFixedLengthTensor(context, max_length_); - } -}; - -REGISTER_OP("FixedLengthTensorV2") -.Attr("IndexType: {int64, int32}") -.Attr("ValueType: {int64, int32, string}") -.Attr("max_length: int") -.Input("segment_ids: IndexType") -.Input("values: ValueType") -.Input("pad_value: ValueType") -.Input("batch_size: int64") -.Output("fixed_length: ValueType") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( - -A tensorflow OP to convert variable length segments into fixed length tensor. - -Attr - max_length: The size of the inner most (i.e. last) dimension. - -Input - segment_ids: 1D input tensor containing the sorted segment_ids. - values: 1D input tensor containing the values. - pad_value: The value used for padding the fixed length tensor. - batch_size: The batch size to use. - -Outputs - fixed_length: A fixed length tensor of size [batch_size, max_length]. -)doc"); - -template -class FixedLengthTensorV2: public OpKernel { - public: - explicit FixedLengthTensorV2(OpKernelConstruction *context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("max_length", &max_length_)); - } - - private: - int64 max_length_; - - void Compute(OpKernelContext *context) override { - ComputeFixedLengthTensor(context, max_length_); - } -}; - -#define REGISTER_SPARSE_TO_FIXED_LENGTH(IndexType, ValueType) \ - REGISTER_KERNEL_BUILDER( \ - Name("FixedLengthTensor") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("IndexType") \ - .TypeConstraint("ValueType"), \ - FixedLengthTensor); \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("FixedLengthTensorV2") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("IndexType") \ - .TypeConstraint("ValueType"), \ - FixedLengthTensorV2); \ - -REGISTER_SPARSE_TO_FIXED_LENGTH(int64, int64) -REGISTER_SPARSE_TO_FIXED_LENGTH(int64, int32) -REGISTER_SPARSE_TO_FIXED_LENGTH(int64, string) -REGISTER_SPARSE_TO_FIXED_LENGTH(int32, int64) -REGISTER_SPARSE_TO_FIXED_LENGTH(int32, int32) -REGISTER_SPARSE_TO_FIXED_LENGTH(int32, string) diff --git a/twml/libtwml/src/ops/fixed_length_tensor.docx b/twml/libtwml/src/ops/fixed_length_tensor.docx new file mode 100644 index 0000000000000000000000000000000000000000..e8512e28ef525d2d92305417ee621cf5ba0c38b0 GIT binary patch literal 38502 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/hashed_data_record.cpp b/twml/libtwml/src/ops/hashed_data_record.cpp deleted file mode 100644 index ba094c3d9..000000000 --- a/twml/libtwml/src/ops/hashed_data_record.cpp +++ /dev/null @@ -1,520 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include "tensorflow_utils.h" -#include "resource_utils.h" - -#include - -REGISTER_OP("DecodeAndHashDataRecord") -.Attr("InputType: {uint8, string}") -.Input("input_bytes: InputType") -.Attr("keep_features: list(int)") -.Attr("keep_codes: list(int)") -.Attr("label_features: list(int)") -.Attr("weight_features: list(int) = []") -.Attr("decode_mode: int = 0") -.Output("hashed_data_record_handle: resource") -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that creates a handle for the hashed data record. - -Attr - keep_features: a list of int ids to keep. - keep_codes: their corresponding code. - label_features: list of feature ids representing the labels. - weight_features: list of feature ids representing the weights. Defaults to empty list. - decode_mode: integer, indicates which decoding method to use. Let a sparse continuous - have a feature_name and a dict of {name: value}. 0 indicates feature_ids are computed - as hash(name). 1 indicates feature_ids are computed as hash(feature_name, name) - shared_name: name used by the resource handle inside the resource manager. - container: name used by the container of the resources. - -Input - input_bytes: Input tensor containing the serialized batch of HashedDataRecords. - -Outputs - hashed_data_record_handle: A resource handle to batch of HashedDataRecords. -)doc"); - -template -class DecodeAndHashDataRecord : public OpKernel { - public: - explicit DecodeAndHashDataRecord(OpKernelConstruction* context) - : OpKernel(context) { - std::vector keep_features; - std::vector keep_codes; - - std::vector label_features; - std::vector weight_features; - - OP_REQUIRES_OK(context, context->GetAttr("keep_features", &keep_features)); - OP_REQUIRES_OK(context, context->GetAttr("keep_codes", &keep_codes)); - OP_REQUIRES_OK(context, context->GetAttr("label_features", &label_features)); - OP_REQUIRES_OK(context, context->GetAttr("weight_features", &weight_features)); - OP_REQUIRES_OK(context, context->GetAttr("decode_mode", &m_decode_mode)); - - OP_REQUIRES(context, keep_features.size() == keep_codes.size(), - errors::InvalidArgument("keep keys and values must have same size.")); - -#ifdef USE_DENSE_HASH - m_keep_map.set_empty_key(0); - m_labels_map.set_empty_key(0); - m_weights_map.set_empty_key(0); -#endif // USE_DENSE_HASH - - for (uint64_t i = 0; i < keep_features.size(); i++) { - m_keep_map[keep_features[i]] = keep_codes[i]; - } - - for (uint64_t i = 0; i < label_features.size(); i++) { - m_labels_map[label_features[i]] = i; - } - - for (uint64_t i = 0; i < weight_features.size(); i++) { - m_weights_map[weight_features[i]] = i; - } - } - - private: - twml::Map m_keep_map; - twml::Map m_labels_map; - twml::Map m_weights_map; - int64 m_decode_mode; - - void Compute(OpKernelContext* context) override { - try { - HashedDataRecordResource *resource = nullptr; - OP_REQUIRES_OK(context, makeResourceHandle(context, 0, &resource)); - - // Store the input bytes in the resource so it isnt freed before the resource. - // This is necessary because we are not copying the contents for tensors. - resource->input = context->input(0); - int batch_size = getBatchSize(resource->input); - int num_labels = static_cast(m_labels_map.size()); - int num_weights = static_cast(m_weights_map.size()); - - twml::HashedDataRecordReader reader; - reader.setKeepMap(&m_keep_map); - reader.setLabelsMap(&m_labels_map); - reader.setDecodeMode(m_decode_mode); - - // Do not set weight map if it is empty. This will take a faster path. - if (num_weights != 0) { - reader.setWeightsMap(&m_weights_map); - } - - resource->records.clear(); - resource->records.reserve(batch_size); - - int64 total_size = 0; - - for (int id = 0; id < batch_size; id++) { - const uint8_t *input_bytes = getInputBytes(resource->input, id); - reader.setBuffer(input_bytes); - resource->records.emplace_back(num_labels, num_weights); - resource->records[id].decode(reader); - total_size += static_cast(resource->records[id].totalSize()); - } - - resource->total_size = total_size; - resource->num_labels = num_labels; - resource->num_weights = num_weights; - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetIdsFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("ids: int64") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns unhashed ids from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - ids: ids specifies the index of the records[id] in the batch (int64) -)doc"); - -// This Kernel is used for both training and serving once the resource is created. -class GetIdsFromHashedDataRecord : public OpKernel { - public: - explicit GetIdsFromHashedDataRecord(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const auto &common = handle->common; - const int64 common_size = static_cast(common.totalSize()); - const int64 total_size = handle->total_size; - TensorShape shape = {total_size}; - - Tensor *ids; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids)); - - int id = 0; - int64 offset = 0; - auto ids_flat = ids->flat(); - for (const auto &record : records) { - // Since common features are added to each input, add the common_size to the current size. - // For training common_size == 0, for serving it can be a non-zero value. - int64 curr_size = static_cast(record.totalSize()) + common_size; - std::fill(ids_flat.data() + offset, ids_flat.data() + offset + curr_size, id); - offset += curr_size; - id++; - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - - -// OutType: Output Tensor Type. FieldType: The storage type used inside HashedDatarecord. -template -class GetOutputFromHashedDataRecord : public OpKernel { - protected: - using Getter = std::function&(const twml::HashedDataRecord &)>; - Getter getter; - - public: - explicit GetOutputFromHashedDataRecord(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const auto &common = handle->common; - const int64 total_size = handle->total_size; - TensorShape shape = {total_size}; - - Tensor *output; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &output)); - - const auto &common_output = getter(common); - - auto output_data = output->flat().data(); - for (const auto &record : records) { - // This is does not copy anything during training as common_size == 0 - // It will copy the relevant common features coming from a batch prediction request. - output_data = std::copy(common_output.begin(), common_output.end(), output_data); - - // Copy the current record to output. - const auto& rec_output = getter(record); - output_data = std::copy(rec_output.begin(), rec_output.end(), output_data); - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetUKeysFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("ukeys: int64") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns unhashed keys from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - ukeys: unhased keys / raw feature ids from the original request. -)doc"); - -class GetUKeysFromHashedDataRecord : public GetOutputFromHashedDataRecord { - public: - explicit GetUKeysFromHashedDataRecord(OpKernelConstruction* context) - : GetOutputFromHashedDataRecord(context){ - getter = [](const twml::HashedDataRecord &record) -> const std::vector & { - return record.keys(); - }; - } -}; - -REGISTER_OP("GetKeysFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("keys: int64") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns keys from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - keys: keys after raw feature ids are hashed with values (int64) -)doc"); - -class GetKeysFromHashedDataRecord : public GetOutputFromHashedDataRecord { - public: - explicit GetKeysFromHashedDataRecord(OpKernelConstruction* context) - : GetOutputFromHashedDataRecord(context){ - getter = [](const twml::HashedDataRecord &record) -> const std::vector & { - return record.transformed_keys(); - }; - } -}; - -REGISTER_OP("GetValuesFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns values from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - values: feature values. -)doc"); - -class GetValuesFromHashedDataRecord : public GetOutputFromHashedDataRecord { - public: - explicit GetValuesFromHashedDataRecord(OpKernelConstruction* context) - : GetOutputFromHashedDataRecord(context){ - getter = [](const twml::HashedDataRecord &record) -> const std::vector & { - return record.values(); - }; - } -}; - -REGISTER_OP("GetCodesFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("codes: int64") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns codes from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - codes: deepbird feature code, usually from A,B,C,D ... in the config. -)doc"); - -class GetCodesFromHashedDataRecord : public GetOutputFromHashedDataRecord { - public: - explicit GetCodesFromHashedDataRecord(OpKernelConstruction* context) - : GetOutputFromHashedDataRecord(context){ - getter = [](const twml::HashedDataRecord &record) -> const std::vector & { - return record.codes(); - }; - } -}; - -REGISTER_OP("GetTypesFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("types: int8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns types from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - types: feature types corresponding to BINARY, DISCRETE, etc. -)doc"); - -class GetTypesFromHashedDataRecord : public GetOutputFromHashedDataRecord { - public: - explicit GetTypesFromHashedDataRecord(OpKernelConstruction* context) - : GetOutputFromHashedDataRecord(context){ - getter = [](const twml::HashedDataRecord &record) -> const std::vector & { - return record.types(); - }; - } -}; - -REGISTER_OP("GetBatchSizeFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("batch_size: int64") -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that returns batch size from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - batch_size: Number of records held in the handle. -)doc"); - -class GetBatchSizeFromHashedDataRecord : public OpKernel { - public: - explicit GetBatchSizeFromHashedDataRecord(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - Tensor *output; - OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape({}), &output)); - output->scalar()() = handle->records.size(); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetTotalSizeFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("total_size: int64") -.SetShapeFn(shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that returns total size from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - total_size: Total number of keys / values in the batch. -)doc"); - -class GetTotalSizeFromHashedDataRecord : public OpKernel { - public: - explicit GetTotalSizeFromHashedDataRecord(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - - Tensor *output; - OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape({}), &output)); - output->scalar()() = handle->total_size; - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetLabelsFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("labels: float") -.Attr("default_label: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns labels from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - labels: A 2D tensor of size [batch_size, num_labels] containing the label values. -)doc"); - -class GetLabelsFromHashedDataRecord : public OpKernel { - private: - float default_label; - - public: - explicit GetLabelsFromHashedDataRecord(OpKernelConstruction* context) - : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("default_label", &default_label)); - } - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const int num_labels = static_cast(handle->num_labels); - TensorShape shape = {static_cast(handle->records.size()), num_labels}; - - Tensor *labels; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &labels)); - - // The default value of label is not present in data record is std::nanf - // For continuous labels, change that to a default_label or label. - auto func = [this](float label) -> float { - return std::isnan(label) ? default_label : label; - }; - - auto labels_data = labels->flat().data(); - for (const auto &record : records) { - const auto& rec_labels = record.labels(); - labels_data = std::transform(rec_labels.begin(), rec_labels.end(), labels_data, func); - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_OP("GetWeightsFromHashedDataRecord") -.Input("hashed_data_record_handle: resource") -.Output("weights: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns weights from the hashed data record. -Input - hashed_data_record_handle: Resource handle to DataRecord - -Outputs - weights: A 2D tensor of size [batch_size, num_weights] containing the weight values. -)doc"); - -class GetWeightsFromHashedDataRecord : public OpKernel { - public: - explicit GetWeightsFromHashedDataRecord(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - auto handle = getHandle(context, 0); - const auto &records = handle->records; - const int num_weights = static_cast(handle->num_weights); - TensorShape shape = {static_cast(handle->records.size()), num_weights}; - - Tensor *weights; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &weights)); - - auto weights_data = weights->flat().data(); - for (const auto &record : records) { - const auto& rec_weights = record.weights(); - weights_data = std::copy(rec_weights.begin(), rec_weights.end(), weights_data); - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - - -#define REGISTER_DECODE_AND_HASH(InputType) \ - REGISTER_KERNEL_BUILDER( \ - Name("DecodeAndHashDataRecord") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("InputType"), \ - DecodeAndHashDataRecord); \ - -REGISTER_DECODE_AND_HASH(uint8) -REGISTER_DECODE_AND_HASH(string) - -#define REGISTER_GETTER(FIELD) \ - REGISTER_KERNEL_BUILDER( \ - Name("Get" #FIELD "FromHashedDataRecord") \ - .Device(DEVICE_CPU), \ - Get##FIELD##FromHashedDataRecord); \ - -REGISTER_GETTER(Ids) -REGISTER_GETTER(UKeys) -REGISTER_GETTER(Keys) -REGISTER_GETTER(Values) -REGISTER_GETTER(Codes) -REGISTER_GETTER(Types) -REGISTER_GETTER(BatchSize) -REGISTER_GETTER(TotalSize) -REGISTER_GETTER(Labels) -REGISTER_GETTER(Weights) diff --git a/twml/libtwml/src/ops/hashed_data_record.docx b/twml/libtwml/src/ops/hashed_data_record.docx new file mode 100644 index 0000000000000000000000000000000000000000..3bbb6a5c76c5400bc26135d18158f3dd6c534505 GIT binary patch literal 40801 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 z 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 -#include "tensorflow_utils.h" - -using namespace tensorflow; - -void ComputeHashingDiscretizer( - OpKernelContext*, - int64_t, - const twml::Map &, - int64_t, - int64_t, - int64_t); - -REGISTER_OP("HashingDiscretizer") -.Attr("T: {float, double}") -.Input("input_ids: int64") -.Input("input_vals: T") -.Input("bin_vals: T") -.Attr("feature_ids: tensor = { dtype: DT_INT64 }") -.Attr("n_bin: int") -.Attr("output_bits: int") -.Attr("cost_per_unit: int") -.Attr("options: int") -.Output("new_keys: int64") -.Output("new_vals: T") -.SetShapeFn( - [](::tensorflow::shape_inference::InferenceContext* c) { - c->set_output(0, c->input(0)); - c->set_output(1, c->input(1)); - return Status::OK(); - } -) -.Doc(R"doc( - -This operation discretizes a tensor containing continuous features (if calibrated). - - note - choice of float or double should be consistent among inputs/output - -Input - input_ids(int64): A tensor containing input feature ids (direct from data record). - input_vals(float/double): A tensor containing input values at corresponding feature ids. - - i.e. input_ids[i] <-> input_vals[i] for each i - bin_vals(float/double): A tensor containing the bin boundaries for values of a given feature. - - float or double, matching input_vals - feature_ids(int64 attr): 1D TensorProto of feature IDs seen during calibration - -> hint: look up make_tensor_proto: - proto_init = np.array(values, dtype=np.int64) - tensor_attr = tf.make_tensor_proto(proto_init) - n_bin(int): The number of bin boundary values per feature - -> hence, n_bin + 1 buckets for each feature - output_bits(int): The maximum number of bits to use for the output IDs. - cost_per_unit(int): An estimate of the number of CPU cycles (or nanoseconds - if not CPU-bound) to complete a unit of work. Overestimating creates too - many shards and CPU time will be dominated by per-shard overhead, such as - Context creation. Underestimating may not fully make use of the specified - parallelism. - options(int): selects behavior of the op. - 0x00 in bits{1:0} for std::lower_bound bucket search. - 0x01 in bits{1:0} for linear bucket search - 0x02 in bits{1:0} for std::upper_bound bucket search - 0x00 in bits{4:2} for integer_multiplicative_hashing - 0x01 in bits{4:2} for integer64_multiplicative_hashing - higher bits/other values are reserved for future extensions - -Outputs - new_keys(int64): The discretized feature ids with same shape and size as keys. - new_vals(float or double): The discretized values with the same shape and size as vals. - -Operation - Note that the discretization operation maps observation vectors to higher dimensional - observation vectors. Here, we describe this mapping. - - Let a calibrated feature observation be given by (F,x), where F is the ID of the - feature, and x is some real value (i.e., continuous feature). This kind of - representation is useful for the representation of sparse vectors, where there - are many zeros. - - For example, for a dense feature vector [1.2, 2.4, 3.6], we might have - (0, 1.2) (1, 2.4) and (2, 3.6), with feature IDs indicating the 0th, 1st, and 2nd - elements of the vector. - - The disretizer performs the following operation: - (F,x) -> (map(x|F),1). - Hence, we have that map(x|F) is a new feature ID, and the value observed for that - feature is 1. We might read map(x|F) as 'the map of x for feature F'. - - For each feature F, we associate a (discrete, finite) set of new feature IDs, newIDs(F). - We will then have that map(x|F) is in the set newIDs(F) for any value of x. Each - set member of newIDs(F) is associated with a 'bin', as defined by the bin - boundaries given in the bin_vals input array. For any two different feature IDs F - and G, we would ideally have that INTERSECT(newIDs(F),newIDs(G)) is the empty set. - However, this is not guaranteed for this discretizer. - - In the case of this hashing discretizer, map(x|F) can actually be written as follows: - let bucket = bucket(x|F) be the the bucket index for x, according to the - calibration on F. (This is an integer value in [0,n_bin], inclusive) - F is an integer ID. Here, we have that map(x|F) = hash_fn(F,bucket). This has - the desirable property that the new ID depends only on the calibration data - supplied for feature F, and not on any other features in the dataset (e.g., - number of other features present in the calibration data, or order of features - in the dataset). Note that PercentileDiscretizer does NOT have this property. - This comes at the expense of the possibility of output ID collisions, which - we try to minimize through the design of hash_fn. - - Example - consider input vector with a single element, i.e. [x]. - Let's Discretize to one of 2 values, as follows: - Let F=0 for the ID of the single feature in the vector. - Let the bin boundary of feature F=0 be BNDRY(F) = BNDRY(0) since F=0 - bucket = bucket(x|F=0) = 0 if x<=BNDRY(0) else 1 - Let map(x|F) = hash_fn(F=0,bucket=0) if x<=BNDRY(0) else hash_fn(F=0,bucket=1) - If we had another element y in the vector, i.e. [x, y], then we might additionally - Let F=1 for element y. - Let the bin boundary be BNDRY(F) = BNDRY(1) since F=1 - bucket = bucket(x|F=1) = 0 if x<=BNDRY(1) else 1 - Let map(x|F) = hash_fn(F=1,bucket=0) if x<=BNDRY(1) else hash_fn(F=1,bucket=1) - Note how the construction of map(x|F=1) does not depend on whether map(x|F=0) - was constructed. -)doc"); - -template -class HashingDiscretizer : public OpKernel { - public: - explicit HashingDiscretizer(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, - context->GetAttr("n_bin", &n_bin_)); - OP_REQUIRES(context, - n_bin_ > 0, - errors::InvalidArgument("Must have n_bin_ > 0.")); - - OP_REQUIRES_OK(context, - context->GetAttr("output_bits", &output_bits_)); - OP_REQUIRES(context, - output_bits_ > 0, - errors::InvalidArgument("Must have output_bits_ > 0.")); - - OP_REQUIRES_OK(context, - context->GetAttr("cost_per_unit", &cost_per_unit_)); - OP_REQUIRES(context, - cost_per_unit_ >= 0, - errors::InvalidArgument("Must have cost_per_unit >= 0.")); - - OP_REQUIRES_OK(context, - context->GetAttr("options", &options_)); - - // construct the ID_to_index hash map - Tensor feature_IDs; - - // extract the tensors - OP_REQUIRES_OK(context, - context->GetAttr("feature_ids", &feature_IDs)); - - // for access to the data - // int64_t data type is set in to_layer function of the calibrator objects in Python - auto feature_IDs_flat = feature_IDs.flat(); - - // verify proper dimension constraints - OP_REQUIRES(context, - feature_IDs.shape().dims() == 1, - errors::InvalidArgument("feature_ids must be 1D.")); - - // reserve space in the hash map and fill in the values - int64_t num_features = feature_IDs.shape().dim_size(0); -#ifdef USE_DENSE_HASH - ID_to_index_.set_empty_key(0); - ID_to_index_.resize(num_features); -#else - ID_to_index_.reserve(num_features); -#endif // USE_DENSE_HASH - for (int64_t i = 0 ; i < num_features ; i++) { - ID_to_index_[feature_IDs_flat(i)] = i; - } - } - - void Compute(OpKernelContext* context) override { - ComputeHashingDiscretizer( - context, - output_bits_, - ID_to_index_, - n_bin_, - cost_per_unit_, - options_); - } - - private: - twml::Map ID_to_index_; - int n_bin_; - int output_bits_; - int cost_per_unit_; - int options_; -}; - -#define REGISTER(Type) \ - REGISTER_KERNEL_BUILDER( \ - Name("HashingDiscretizer") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - HashingDiscretizer); \ - -REGISTER(float); -REGISTER(double); - -void ComputeHashingDiscretizer( - OpKernelContext* context, - int64_t output_bits, - const twml::Map &ID_to_index, - int64_t n_bin, - int64_t cost_per_unit, - int64_t options) { - const Tensor& keys = context->input(0); - const Tensor& vals = context->input(1); - const Tensor& bin_vals = context->input(2); - - const int64 output_size = keys.dim_size(0); - - TensorShape output_shape; - OP_REQUIRES_OK(context, TensorShapeUtils::MakeShape(&output_size, 1, &output_shape)); - - Tensor* new_keys = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, output_shape, &new_keys)); - Tensor* new_vals = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(1, output_shape, &new_vals)); - - try { - twml::Tensor out_keys_ = TFTensor_to_twml_tensor(*new_keys); - twml::Tensor out_vals_ = TFTensor_to_twml_tensor(*new_vals); - - const twml::Tensor in_keys_ = TFTensor_to_twml_tensor(keys); - const twml::Tensor in_vals_ = TFTensor_to_twml_tensor(vals); - const twml::Tensor bin_vals_ = TFTensor_to_twml_tensor(bin_vals); - - // retrieve the thread pool from the op context - auto worker_threads = *(context->device()->tensorflow_cpu_worker_threads()); - - // Definition of the computation thread - auto task = [&](int64 start, int64 limit) { - twml::hashDiscretizerInfer(out_keys_, out_vals_, - in_keys_, in_vals_, - n_bin, - bin_vals_, - output_bits, - ID_to_index, - start, limit, - options); - }; - - // let Tensorflow split up the work as it sees fit - Shard(worker_threads.num_threads, - worker_threads.workers, - output_size, - static_cast(cost_per_unit), - task); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } -} - diff --git a/twml/libtwml/src/ops/hashing_discretizer.docx b/twml/libtwml/src/ops/hashing_discretizer.docx new file mode 100644 index 0000000000000000000000000000000000000000..c12ca98053d7d05070a8ce49ad4f5347bd208881 GIT binary patch literal 40557 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 LVtSlr{`&PlVQ^2o literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/hashmap.cpp b/twml/libtwml/src/ops/hashmap.cpp deleted file mode 100644 index ce11ff81d..000000000 --- a/twml/libtwml/src/ops/hashmap.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include - -#include - -using namespace tensorflow; - -REGISTER_OP("Hashmap") -.Input("keys: int64") -.Input("hash_keys: int64") -.Input("hash_values: int64") -.Output("values: int64") -.Output("mask: int8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - // TODO: check if the sizes are different in the input - c->set_output(0, c->input(0)); - c->set_output(1, c->input(0)); - return Status::OK(); - }); - - -class Hashmap : public OpKernel { - private: - twml::HashMap hmap; - std::once_flag flag; - - public: - explicit Hashmap(OpKernelConstruction* context) : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - try { - // Quick hack - const Tensor& keys = context->input(0); - - std::call_once(this->flag, [this, context](){ - const Tensor& hash_keys = context->input(1); - const Tensor& hash_values = context->input(2); - const auto hash_keys_flat = hash_keys.flat(); - const auto hash_values_flat = hash_values.flat(); - const int64 N = hash_keys_flat.size(); - - for (int64 i = 0; i < N; i++) { - hmap.insert(hash_keys_flat(i), hash_values_flat(i)); - } - }); - - Tensor* values = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, keys.shape(), - &values)); - - Tensor* mask = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(1, keys.shape(), - &mask)); - - // copy the values without sharing a storage - values->flat() = keys.flat(); - - auto keys_flat = keys.flat(); - auto values_flat = values->flat(); - auto mask_flat = mask->flat(); - - // TODO: use twml tensor - const int64 N = keys_flat.size(); - for (int64 i = 0; i < N; i++) { - // values_flat(i), keys_flat(i) return references to tensorflow::int64. - // Using them in hmap.get() was causing issues because of automatic casting. - int64_t val = values_flat(i); - int64_t key = keys_flat(i); - mask_flat(i) = hmap.get(val, key); - values_flat(i) = val; - } - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -REGISTER_KERNEL_BUILDER( - Name("Hashmap") - .Device(DEVICE_CPU), - Hashmap); diff --git a/twml/libtwml/src/ops/hashmap.docx b/twml/libtwml/src/ops/hashmap.docx new file mode 100644 index 0000000000000000000000000000000000000000..3041c759cd58dafd29ab1e8155d7b84d8f0e9fc1 GIT binary patch literal 37700 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

vsU_!{d*_BQf+ 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 Dr=^g~ literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/isotonic_calibration.cpp b/twml/libtwml/src/ops/isotonic_calibration.cpp deleted file mode 100644 index 10a8c22dc..000000000 --- a/twml/libtwml/src/ops/isotonic_calibration.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include "tensorflow_utils.h" - -using namespace tensorflow; - -REGISTER_OP("IsotonicCalibration") -.Attr("T: {float, double}") -.Input("input: T") -.Input("xs: T") -.Input("ys: T") -.Output("output: T") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - // output shape should be the same as input shape. - c->set_output(0, c->input(0)); - return Status::OK(); -}).Doc(R"doc( - -This operation calibrates probabilities by fitting to a piece-wise non-decreasing function. - -Input - input: A tensor containing uncalibrated probabilities. - xs: A tensor containing the boundaries of the bins. - ys: A tensor contianing calibrated values for the corresponding bins. - -Expected Sizes: - input: [batch_size, num_labels]. - xs, ys: [num_labels, num_bins]. - -Expected Types: - input: float or double. - xs, ys: same as input. - -Outputs - output: A tensor containing calibrated probabilities with same shape and size as input. - -)doc"); - -template -class IsotonicCalibration : public OpKernel { - public: - explicit IsotonicCalibration(OpKernelConstruction* context) - : OpKernel(context) {} - - - void Compute(OpKernelContext* context) override { - const Tensor& input = context->input(0); - const Tensor& xs = context->input(1); - const Tensor& ys = context->input(2); - - Tensor* output = nullptr; - OP_REQUIRES_OK( - context, - context->allocate_output(0, input.shape(), &output)); - - try { - const twml::Tensor twml_input = TFTensor_to_twml_tensor(input); - const twml::Tensor twml_xs = TFTensor_to_twml_tensor(xs); - const twml::Tensor twml_ys = TFTensor_to_twml_tensor(ys); - twml::Tensor twml_output = TFTensor_to_twml_tensor(*output); - - twml::linearInterpolation(twml_output, twml_input, twml_xs, twml_ys); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } - } -}; - -#define REGISTER(Type) \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("IsotonicCalibration") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - IsotonicCalibration); \ - -REGISTER(float); -REGISTER(double); diff --git a/twml/libtwml/src/ops/isotonic_calibration.docx b/twml/libtwml/src/ops/isotonic_calibration.docx new file mode 100644 index 0000000000000000000000000000000000000000..ab2331255ae12931dd299fd312a5be5ae974a3ed GIT binary patch literal 37726 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

OIu<$1?SN&R}ivhT`$fXG{VG4R$F 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/num_intra_op_threads.cpp b/twml/libtwml/src/ops/num_intra_op_threads.cpp deleted file mode 100644 index 7e5ef0cbf..000000000 --- a/twml/libtwml/src/ops/num_intra_op_threads.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" -#include "tensorflow/core/framework/common_shape_fns.h" - -using namespace tensorflow; - -REGISTER_OP("NumIntraOpThreads") -.Input("x: float32") -.Output("num_intra_op_threads: int32") -.SetShapeFn(tensorflow::shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that returns the number of threads in the intra_op_parallelism pool -This is not part of the Tensorflow API as of the date of writing this doc. Hence, -a tensorflow operation is the best resort. -Input - x: Dummy placeholder so that constant folding is not done by TF GraphOptimizer. - Please refer https://github.com/tensorflow/tensorflow/issues/22546 for more - details. -Output - num_intra_op_threads: A scalar tensor corresponding to the number of threads in - the intra_op_parallelism pool -)doc"); - -class NumIntraOpThreads : public OpKernel { - public: - explicit NumIntraOpThreads(OpKernelConstruction* context) - : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - int num_intra_op_threads = context->device()->tensorflow_cpu_worker_threads()->num_threads; - Tensor* output_tensor = NULL; - OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape({}), &output_tensor)); - auto output_flat = output_tensor->flat(); - output_flat(0) = num_intra_op_threads; - } -}; - -REGISTER_KERNEL_BUILDER(Name("NumIntraOpThreads").Device(DEVICE_CPU), NumIntraOpThreads); diff --git a/twml/libtwml/src/ops/num_intra_op_threads.docx b/twml/libtwml/src/ops/num_intra_op_threads.docx new file mode 100644 index 0000000000000000000000000000000000000000..ca26ebaa8fddf784e774efbe713e688e73b7cbcb GIT binary patch literal 37405 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 z - -#include - -using namespace tensorflow; - -REGISTER_OP("ParAdd") - .Input("input_a: float") - .Input("input_b: float") - .Output("a_plus_b: float") - .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - c->set_output(0, c->input(0)); - return Status::OK(); - }); - - -class ParAddOp : public OpKernel { - public: - explicit ParAddOp(OpKernelConstruction* context) : OpKernel(context) { - } - - void Compute(OpKernelContext* context) override { - // Grab the input tensor - const Tensor& input_tensor0 = context->input(0); - auto input_flat0 = input_tensor0.flat(); - const Tensor& input_tensor1 = context->input(1); - auto input_flat1 = input_tensor1.flat(); - - OP_REQUIRES(context, input_tensor0.shape() == input_tensor1.shape(), - errors::InvalidArgument("Input tensors must be identical shape.")); - - // Create an output tensor - Tensor* output_tensor = NULL; - OP_REQUIRES_OK(context, - context->allocate_output(0, - input_tensor0.shape(), - &output_tensor)); - auto output_flat = output_tensor->flat(); - - // PARALLEL ADD - const int N = input_flat0.size(); - - // retrieve the thread pool from the op context - auto worker_threads = *(context->device()->tensorflow_cpu_worker_threads()); - - // Definition of the computation thread - auto task = [=, &input_flat0, &input_flat1, &output_flat](int64 start, int64 limit) { - for (; start < limit; ++start) { - output_flat(start) = input_flat0(start) + input_flat1(start); - } - }; - - // this is a heuristic. high number is likely to be sharded into smaller pieces - int64 cost_per_unit = 1; - - // let Tensorflow split up the work as it sees fit - Shard(worker_threads.num_threads, - worker_threads.workers, - N, - cost_per_unit, - task); - } -}; - -REGISTER_KERNEL_BUILDER(Name("ParAdd").Device(DEVICE_CPU), ParAddOp); - - diff --git a/twml/libtwml/src/ops/par_add.docx b/twml/libtwml/src/ops/par_add.docx new file mode 100644 index 0000000000000000000000000000000000000000..57f97f38a1b137dbcb484d5d63e2d2a7b0b48024 GIT binary patch literal 37673 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 YYU?n-n-!RYK)FhgArY88HuZsc0O;**bpQYW literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/partition_sparse_tensor.cpp b/twml/libtwml/src/ops/partition_sparse_tensor.cpp deleted file mode 100644 index 4a210ba7f..000000000 --- a/twml/libtwml/src/ops/partition_sparse_tensor.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include "tensorflow_utils.h" - -using namespace tensorflow; - -REGISTER_OP("PartitionSparseTensorMod") -.Attr("T: {float, double}") -.Input("indices: int64") -.Input("values: T") -.Output("result: output_types") -.Attr("num_partitions: int") -.Attr("output_types: list({int64, float, double})") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); -}).Doc(R"doc( - -A tensorflow OP that partitions an input batch represented as a sparse tensor -(indices are [ids, keys]) into separate sparse tensors to more optimally place -sparse computations in distributed training. - -Inputs - indices: Indices from sparse tensor ([ids, keys] from the batch). - values: Batch values from the original features dict. - -Attr - num_partitions: Number of partitions to generate. - output_types: A list of types for the output tensors like - [tf.int64, tf.float32, tf.int64, tf.float32, ...] - The length must be 2 * num_partitions (see Outputs below) - -Outputs - List of dense tensors containing for each partition: - - partitioned indices tensor ([ids, keys] from partitioned batch) - - partitioned values tensor - The list lenth is 2 * num_partitions. Example: - [ [ids_1, keys_1], values_1, [ids_2, keys_2], values_2, ... ] -)doc"); - -template -class PartitionSparseTensorMod : public OpKernel { - private: - int64 num_partitions; - - public: - explicit PartitionSparseTensorMod(OpKernelConstruction* context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("num_partitions", &num_partitions)); - OP_REQUIRES(context, num_partitions > 0, - errors::InvalidArgument("Number of partitions must be positive")); - } - - void Compute(OpKernelContext* context) override { - // grab input tensors - const Tensor& indices_tensor = context->input(0); // (ids, keys) - const Tensor& values_tensor = context->input(1); - - // check sizes - int64 num_keys = indices_tensor.shape().dim_size(0); - OP_REQUIRES(context, indices_tensor.dims() == 2, - errors::InvalidArgument("Indices tensor must be 2D [ids, keys]")); - OP_REQUIRES(context, indices_tensor.shape().dim_size(1) == 2, - errors::InvalidArgument("Indices tensor must have 2 cols [ids, keys]")); - OP_REQUIRES(context, values_tensor.shape().dim_size(0) == num_keys, - errors::InvalidArgument("Number of values must match number of keys")); - - // grab input vectors - auto indices = indices_tensor.flat(); - auto values = values_tensor.flat(); - - // count the number of features that fall in each partition - std::vector partition_counts(num_partitions); - - for (int i = 0; i < num_keys; i++) { - int64 key = indices(2 * i + 1); - int64 partition_id = key % num_partitions; - partition_counts[partition_id]++; - } - - // allocate outputs for each partition and keep references - std::vector output_indices_partitions; - std::vector output_values_partitions; - output_indices_partitions.reserve(num_partitions); - output_values_partitions.reserve(num_partitions); - - for (int i = 0; i < num_partitions; i++) { - Tensor *output_indices = nullptr, *output_values = nullptr; - TensorShape shape_indices = TensorShape({partition_counts[i], 2}); - TensorShape shape_values = TensorShape({partition_counts[i]}); - - OP_REQUIRES_OK(context, context->allocate_output(2 * i, shape_indices, &output_indices)); - OP_REQUIRES_OK(context, context->allocate_output(2 * i + 1, shape_values, &output_values)); - - output_indices_partitions.push_back(output_indices->flat().data()); - output_values_partitions.push_back(output_values->flat().data()); - } - - // assign a partition id to each feature - // populate tensors for each partition - std::vector partition_indices(num_partitions); - - for (int i = 0; i < num_keys; i++) { - int64 key = indices(2 * i + 1); - int64 pid = key % num_partitions; // partition id - int64 idx = partition_indices[pid]++; - - output_indices_partitions[pid][2 * idx] = indices(2 * i); - output_indices_partitions[pid][2 * idx + 1] = key / num_partitions; - output_values_partitions[pid][idx] = values(i); - } - } -}; - -#define REGISTER(Type) \ - \ - REGISTER_KERNEL_BUILDER( \ - Name("PartitionSparseTensorMod") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - PartitionSparseTensorMod); \ - -REGISTER(float); -REGISTER(double); diff --git a/twml/libtwml/src/ops/partition_sparse_tensor.docx b/twml/libtwml/src/ops/partition_sparse_tensor.docx new file mode 100644 index 0000000000000000000000000000000000000000..148c2dc0bee476b84088bb112f8e4ad4afad1708 GIT binary patch literal 38352 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%0As{&l4AVrOZ7SVm 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

n&RJXhz&WSBVvBQ5 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/percentile_discretizer_v2.cpp b/twml/libtwml/src/ops/percentile_discretizer_v2.cpp deleted file mode 100644 index 2a0dac7d8..000000000 --- a/twml/libtwml/src/ops/percentile_discretizer_v2.cpp +++ /dev/null @@ -1,241 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" -#include "tensorflow/core/util/work_sharder.h" - -#include -#include "tensorflow_utils.h" - - -using namespace tensorflow; - -void CombinedComputeDiscretizers( - OpKernelContext*, - int64_t, - const twml::Map&, - int64_t); - -REGISTER_OP("PercentileDiscretizerV2") -.Attr("T: {float, double}") -.Input("input_ids: int64") -.Input("input_vals: T") -.Input("bin_ids: int64") -.Input("bin_vals: T") -.Input("feature_offsets: int64") -.Input("start_compute: int64") -.Input("end_compute: int64") -.Attr("output_bits: int") -.Attr("feature_ids: tensor = { dtype: DT_INT64 }") -.Attr("feature_indices: tensor = { dtype: DT_INT64 }") -.Attr("cost_per_unit: int") -.Output("new_keys: int64") -.Output("new_vals: T") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - // TODO: check sizes - c->set_output(0, c->input(0)); - c->set_output(1, c->input(0)); - return Status::OK(); -}).Doc(R"doc( - -This operation discretizes a tensor containing continuous features (if calibrated). - - note - choice of float or double should be consistent among inputs/output - -Input - input_ids(int64): A tensor containing input feature ids (direct from data record). - input_vals: A tensor containing input values at corresponding feature ids. - - i.e. input_ids[i] <-> input_vals[i] for each i - - float or double - bin_ids(int64): A tensor containing the discretized feature id for each bin. - bin_vals: A tensor containing the bin boundaries for values of a given feature. - - float or double - feature_offsets(int64): Specifies the starting location of bins for a given feature id. - start_compute(int64 scalar tensor): which index to start the computation at - end_compute(int64 scalar tensor): which index to end the computation right before - -> for example, (start_compute,end_compute)=(0,10) would compute on 0 thru 9 - output_bits(int): The maximum number of bits to use for the output IDs. - -> 2**out_bits must be greater than bin_ids.size - feature_ids(int64): 1D TensorProto of feature IDs seen during calibration - feature_indices(int64): 1D TensorProto of feature indices corresponding with feature_IDs - -> hint: look up make_tensor_proto: - proto_init = np.array(values, dtype=np.int64) - tensor_attr = tf.make_tensor_proto(my_proto_init) - cost_per_unit(int): An estimate of the number of CPU cycles (or nanoseconds - if not CPU-bound) to complete a unit of work. Overestimating creates too - many shards and CPU time will be dominated by per-shard overhead, such as - Context creation. Underestimating may not fully make use of the specified - parallelism. - -Outputs - new_keys(int64): The discretized feature ids with same shape and size as keys. - new_vals(float or double): The discretized values with the same shape and size as vals. - -Operation - Note that the discretization operation maps observation vectors to higher dimensional - observation vectors. Here, we describe this mapping. - - Let a calibrated feature observation be given by (F,x), where F is the ID of the - feature, and x is some real value (i.e., continuous feature). This kind of - representation is useful for the representation of sparse vectors, where there - are many zeros. - - For example, for a dense feature vector [1.2, 2.4, 3.6], we might have - (0, 1.2) (1, 2.4) and (2, 3.6), with feature IDs indicating the 0th, 1st, and 2nd - elements of the vector - - The disretizer performs the following operation: - (F,x) -> (map(x|F),1). - Hence, we have that map(x|F) is a new feature ID, and the value observed for that - feature is 1. We might read map(x|F) as 'the map of x for feature F'. - - For each feature F, we associate a (discrete, finite) set of new feature IDs, newIDs(F). - We will then have that F~(x) is in the set newIDs(F) for any value of x. Each set member - of newIDs(F) is associated with a 'bin', as defined by the bin boundaries given in - the bin_vals input array. For any two different feature IDs F and G, we have that - INTERSECT(newIDs(F),newIDs(G)) is the empty set - - Example - consider input vector with a single element, i.e. [x]. - Let's Discretize to one of 2 values, as follows: - Let F=0 for the ID of the single feature in the vector. - Let the bin boundary of feature F=0 be BNDRY(F) = BNDRY(0) since F=0 - Let newIDs(F) = newIDs(0) = {0,1} - Let map(x|F) = map(x|0) = 0 if x<=BNDRY else 1 - If we had another element y in the vector, i.e. [x, y], then we might additionally - Let F=1 for element y. - Let the bin boundary be BNDRY(F) = BNDRY(1) since F=1 - Let newIDs(F) = newIDs(1) = {2,3} (so as to have empty intersect with newIDs(0)) - Let map(x|F) = map(x|1) = 2 if x<=BNDRY else 3 - Consider vector observation [-0.1, 0.2]. We then represent this as [(0, -0.1), (1, 0.2)] - Let BNDRY(0) = BNDRY(1) = 0. When we discretize the vector, we get: - (0, -0.1) -> (map(-0.1|0), 1) = (0, 1) - (1, 0.2) -> (map( 0.2|1), 1) = (3, 1) - Our output vector is then represented sparsely as [(0, 1), (3, 1)], and the dense - representation of this could be [1, 0, 0, 1] - -)doc"); - -template -class PercentileDiscretizerV2 : public OpKernel { - public: - explicit PercentileDiscretizerV2(OpKernelConstruction* context) : OpKernel(context) { - // get the number of output bits - // for use with features that have not been calibrated - OP_REQUIRES_OK(context, - context->GetAttr("output_bits", &output_bits_)); - OP_REQUIRES_OK(context, - context->GetAttr("cost_per_unit", &cost_per_unit_)); - OP_REQUIRES(context, cost_per_unit_ >= 0, - errors::InvalidArgument("Must have cost_per_unit >= 0.")); - - // construct the ID_to_index hash map - Tensor feature_IDs; - Tensor feature_indices; - - // extract the tensors - OP_REQUIRES_OK(context, - context->GetAttr("feature_ids", &feature_IDs)); - OP_REQUIRES_OK(context, - context->GetAttr("feature_indices", &feature_indices)); - - // for access to the data - // int64_t data type is set in to_layer function of the calibrator objects in Python - auto feature_IDs_flat = feature_IDs.flat(); - auto feature_indices_flat = feature_indices.flat(); - - // verify proper dimension constraints - OP_REQUIRES(context, feature_IDs.shape() == feature_indices.shape(), - errors::InvalidArgument("feature_ids and feature_indices must be identical shape.")); - OP_REQUIRES(context, feature_IDs.shape().dims() == 1, - errors::InvalidArgument("feature_ids and feature_indices must be 1D.")); - - // reserve space in the hash map and fill in the values - int num_features = feature_IDs.shape().dim_size(0); - -#ifdef USE_DENSE_HASH - ID_to_index_.set_empty_key(0); - ID_to_index_.resize(num_features); -#else - ID_to_index_.reserve(num_features); -#endif // USE_DENSE_HASH - for (int i = 0 ; i < num_features ; i++) { - ID_to_index_[feature_IDs_flat(i)] = feature_indices_flat(i); - } - } - - void Compute(OpKernelContext* context) override { - CombinedComputeDiscretizers( - context, - output_bits_, - ID_to_index_, - cost_per_unit_); - } - - private: - twml::Map ID_to_index_; - int output_bits_; - int cost_per_unit_; -}; - -#define REGISTER(Type) \ - REGISTER_KERNEL_BUILDER( \ - Name("PercentileDiscretizerV2") \ - .Device(DEVICE_CPU) \ - .TypeConstraint("T"), \ - PercentileDiscretizerV2); \ - -REGISTER(float); -REGISTER(double); - -void CombinedComputeDiscretizers( - OpKernelContext* context, - int64_t output_bits, - const twml::Map &ID_to_index, - int64_t cost_per_unit) { - const Tensor& keys = context->input(0); - const Tensor& vals = context->input(1); - const Tensor& bin_ids = context->input(2); - const Tensor& bin_vals = context->input(3); - const Tensor& feature_offsets = context->input(4); - - uint64 full_size = keys.dim_size(0); - const int total_size = static_cast(full_size); - TensorShape output_shape = {total_size}; - - Tensor* new_keys = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, output_shape, &new_keys)); - Tensor* new_vals = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(1, output_shape, &new_vals)); - - try { - twml::Tensor out_keys_ = TFTensor_to_twml_tensor(*new_keys); - twml::Tensor out_vals_ = TFTensor_to_twml_tensor(*new_vals); - - const twml::Tensor in_keys_ = TFTensor_to_twml_tensor(keys); - const twml::Tensor in_vals_ = TFTensor_to_twml_tensor(vals); - const twml::Tensor bin_ids_ = TFTensor_to_twml_tensor(bin_ids); - const twml::Tensor bin_vals_ = TFTensor_to_twml_tensor(bin_vals); - const twml::Tensor feature_offsets_ = TFTensor_to_twml_tensor(feature_offsets); - - // retrieve the thread pool from the op context - auto worker_threads = *(context->device()->tensorflow_cpu_worker_threads()); - - // Definition of the computation thread - auto task = [&](int64 start, int64 limit) { - twml::discretizerInfer(out_keys_, out_vals_, - in_keys_, in_vals_, - bin_ids_, bin_vals_, - feature_offsets_, output_bits, - ID_to_index, - start, limit, - start); - }; - - // let Tensorflow split up the work as it sees fit - Shard(worker_threads.num_threads, - worker_threads.workers, - full_size, - static_cast(cost_per_unit), - task); - } catch (const std::exception &e) { - context->CtxFailureWithWarning(errors::InvalidArgument(e.what())); - } -} diff --git a/twml/libtwml/src/ops/percentile_discretizer_v2.docx b/twml/libtwml/src/ops/percentile_discretizer_v2.docx new file mode 100644 index 0000000000000000000000000000000000000000..d59a949315631ef98cb8d43a1bafb2580b6e4d65 GIT binary patch literal 40381 zcmagEV|ZlU)-D{|?%1~Nq+{E*ZKq?aW81dvq+{E*J16}-d%qj+Ip6nZ)m3w@F>Z`m zYt9-~a+1IxC;$Ke5CG+AY-*JXg>gxM003iP0078eqnbjtHcrMiPP$6&cE*m{v~Jc` zjY-n7Yy1d5u0Bwc>3H!yh2T-kcJ0XRsN*n&tJ5FY)tBimq<~(YCOE^CXXQe`XyYUg@mnn*Q;gfFzUGgR{lfs4KJH}YsNP1p`Z;t0f-#P)FJ2f=DuGQ7S`vjWoZ z)%0`fA_ZRw=4b>Ysl5P1lU2s3AmI%KLn!c!freJ+&$8uq5ZNgyoQ{y~QJEc#$+>(? z__`9l2>FR*eJsluIGKjQh?ie^r_0xtc=WI=d%B({}JzB}z{4`Ju z)8k19F5|2xfP$=^KsymEjjF%=0_4v0b+NY{+s73baDANVcy>NrQ(ePzOg65yf+kS9RRuisG>WmB>(eQ z^)`V30HD8KbsdbY9O-EPTr1-zC4dokLnK3X_!GD(?FOk^ zrA0gt!SNfDKCzmp;PX;#A`fa()L+gDR0#^}Qd*0_l?0V0Al^eek*hj;)6Cg|*@{Xv zv4j^_w(eWGhClN)If?1{@t?-pAu6WI7%`x;7r=?zBi{>&A5BM>#kOXkwY|2>nQ4~a z&>ja0$tvo&5#NJNb|4L~n>KJ4&$jG+KcpchnpE|eGI8Dvl=rop#yzL6O}Wx&j9K=E z7@gH*z4}jsLVrLjntv_x*)M|-zYH?6HI#F(wR5C1v~@84v&b{!$7TBI5k#K6MCPSc z!tM|tM8qipPs1g|Q2du$ADLOCt;VxhC%5(rtTl3|TyVFzhVSfnH`p4RfenM>gYiP* zuKbO{q191;uNk1Nzh#L~a#SV-^pK-FXci>EVaOD%?S5)IU` zFwg&(BFJn}D9Sw+R78|s`JuuePu@lZi+_MZapLcf8%BPr6Id}ys626xz+@`=2X-6YIw`w>w}{K8+87CP*347!Oa>ioQ?AMlRg2E01XiWM<;i{f#+8dZIW=u|Nih zc$?TS>aNMW<9grE@4vq-V^ck|-GE@6n!@Q&%()8ve($@*`p>%DudShJs6e!x!p*@2@W%izvxL-?sN2FWOJ%8=qx_2@`wNkdykGYU1E1ryPQWGC3C74X283^dV_2Se_= zi^eYAlNsg*0_}}8!_oGOGY|BsD;T>^OFblR$_1p=$7tj@u78WwR!S1@r0NziS4alB zvZs}7T*|i2t%DKW z*QeIm`fGFgvoa2}JstO&5I?)Kf$}E?=0%D_yqy)aoiZcv&}HN6Ezi<(G0Vh? zR0AvF`}7ccA5vbeHV z@pS4Q*j4>P<26C)1@%7Cl{kR*QfztdoJ~)tCh{<(h(FP+PFTvcb&(QRB(q+AH2avT zBEniO&0F1+f8SOHjna!(Ivyq8Y58*3lOgQ}29y}|kzcN4?(+?pFo#_z+NuNa!l^Wm z!pG$PNO*6!ThL{#d*>#{zSM7p%eL!E>FGGe{VqwWzajEsW@IT zH5`JszAw}}HADmB1R@N*|9yeDfR&I72oNSON_I2%J(NtJN#Xvft#O?hu$re4>nFZ^SZ9ww9@H%q4H*7Z3DA4s+`=ZSk%Hw{9S!)uMr1#d50v#|EolphW)!IC zzWb>SV^Xl{;i(%HeY-dDW#{zZTlXGJCNY7oEJAFlDYxQKYW-#`7!$6PW*mR_QD7+?FxW0vH7t2vJoB+Ci@U44lDO2 z-z8J1f1hP?p!8@bD@K>_9PFu?5h&eplh!x$tDH5js@9Ku01qlKfaLZW3N9x60{3p; zcg31Su&wt^tE+N)c5C5lS8d#JJ3_}IeqcGBP?4nKcqW}P0=p}i6bg@PH;OqyR1QZ8 zDpP;#`q<%Hq*Da>`U`t{ojRp&fOtE?{zXO>6C-c>e!pJ%sIyB5qn8WutCbGH?xMKm z0kWP+uGCmH(0fP4JRbZrhtXpDtRGj_z=z_pC_`d<=cq#q&Z@sM-Mr@vhm|Cj5Hfe3wTn{QO*<4%AA45hi8C$`ymsu2x#cL zh8HvFKE!`8BFih{%3E8Rp!j=uMbAyp_`=|G_tGlIiE2sek%Jt%L8CyLs@{qgkT`5% zH@59)hEkU4bB_y?4~sz*zz%|nm8bd=g{NS}^W$z{eobqK03H6DTK~zZqnAf_Pj_gBWda(}cML zv1J_eDSG^3*Ld`!waR|3R$^Z6 zS*XyUtoQ_Ne7JE?2uCHe+mnndu=5tENY){5AepEAfZ6UO69r{3ZS`JySpZAC`@A+2 z5wJ)%8c~&j@81kAJ%a)G=AjT|Fj@7?7Y{Y=%=Ktg$4Mc;Nf-55fdC>7 z)vS3)+4o_Vx6W0F0?pZn*&*W2n6aqe!^+i07vmPs%_&mU5g_HxWK5F=R>h)5{RPDj z5!=EpI*C>)T!gV(J5B*y)?E;i3e&&2sq!k6+%T56HrdLGuhSAWv+{GFd9o zIgHa_o9K0|%sVxVTA(^@B~p&Z*358$8cc(o-Ey0y;HTeI01l(MP;0(-@kPh4HGRuC zt#$piRv>l2PHasI13(jL4fuVSbZb%fVN1IkfHKve8Z%GxgPJpxYQQzH$|E(`0CI4r zvw95J$VvMw&r4KFRl$vY-H?@wMLM|su4?c&)-w1&y=bTj8XmQGI-c!=O>5N}R>hs3 z0>4t^61jHRd>}&|k!L&-cCZ2Q&5&%t)`CC|3edRZFoX$yIAg`4wwVB-?hoDGyPPhG zBh>aZCc2-bsl8e+mvFrutI*}Fg;-)%W_>GXS7~u@FhO`95-hmXl0)-@gTMUky=?W+ zQB>kP@WNwYV5Dn_G+rd1Zg)>>A!Y0yGL(>*qr5@r@H%8E8a~Ngg$?5Wp&@}weqi8H?;k*L=M=wNX-)o{;2J!Ybtfzg;tch2~7ammR&R5itf|opXm+ z=ttH_!idT_Io8?|PgI~e$dL@S*h6$ifJ>dva>cT7DXG>-mNunP^PCy1XbnZ4# z2CX0LXEeS>^Vy}6aUV!&j!&g$ZfQTGvR?&^U%HZl6;@AnC2VuwR*1;2F7CodwB9fDXGK5`7Uwgtmtkkz) zpm<$3I-^v@8bfGKei&U$wf&ftsYdBv<)4bTySW+Z=^eeCzrIFvxnXnhJ{6#q3)EKu zfr(XqU~B;bl9pS$TEFYw&G8PNnwew6H*(H}JA0ngG@u^mk+t`3+zhL))!gYVkVVbl zhFY=44HtWl9mwm2vfJLnyVY?m(<8yN=my&W3gB#ju@EUQZL~9$M4y#k5Rd;L1_{ky zDBu>sPa*d>Zo-bnjNy!;c73H2Y%t6fz9*RC*cUxmk*&N(e64TYN0z1XE<7Q8Olxw3 zZOo;TT29z3unSV6IqMSrF5TT}TKAknmYp64g>|;3ug~v1gb+8QQ*KUbCy9tfYuT-g zAvDsDyVBD8N=-#;_)TTa)vM~EQTk;bWtTP(t-!saTfjO+!Nv)ZP_Zk=sj7uZ8vpwX zzg&{L?z`7PI zhaD^D?^0~gY_5vSj}}((;cn!^O|&S{h}ouUjoFc>fD37o@pXsbczVa+a$;$blow+Z zq8~qdQ`B)fgBB%@S~7ts6J|BNMM7XeqIB(~QN$_>cw_}V2&qwvBmpAL zXke;Xq#16S09ufL==2dEpmC9Z7hktgFS0IveCLs#_Q(SmX?(?8Pq5Vv$(wY zD$hV;cZhvc?Z}k~A%z#@z5tqoL8-Cp_ih)q8E@QR2!P|D0RbR`byT)MxubA1-y?)I zMT{z0CklW51hxM*8ImD2IdGPSHsl6aP|EOX22%?noY$Dgil)r99LJMfzi}3pgB?Qy zw8s9sXD)yO?#FS6_D3 zyt8V|P?TFdf?Fkttl(~-!H{8^&44HQeG-?mpl{EIlhMWZ?0(-LlArwqIAoz=dd?#| zKqgbFi5ULa)dHwXxXkzbHoMttcC|0$XiNl9x%cx*SsW6@j5>Eh!f@HFNyTp`4za}0 zyh{g-r%OwVk|9^xY5b9{|XPh4fCp4YGV;5bPFuoO{zq?ZAt3bVuapw z?fr*lGJ?x$B&Q^o9zj>xv_xWY`b)#flmCpyYlz>y3d{gb<_&)G1&f}0B0U!sSiN1w zbl^`NYpvV58nXTEBCj#vuM_w~XGh02@<=Fch5Qdy1P3j1^k~5>x`{F+_RhSzeu*RL zWQ}DT7QC7mrVPuwSU%V{k;YFvRc_!;#(Zz2vpDfRj>{v4OdS#nQ{}~z(?dtebstml zQzeHnL!r`n&qRq(&pT4V$Se;TFLk`ZO3PlNtXOSP`hb2R&Co7L-hH?(NF62a12%LI zc#P;7Q~z0dn^p3ux4Jr-`g++!4~!-6!~Pt6CyG7mL}$H^9A!z<6}TG# zL=P0P&@nbS)U)$7vkL3Wuw*8Jo?T3Z2A%~}nb9dpE-!USJ@Lkj+Xe>9T`{94>%Its`4XB z)v1xUZq6qdC!2W8Ik9<4B26t#s#Mx$Y#$X@lT`{QmOu)WRw`2iw2bmu-D>wENx)Nk(0xV{Vh@qq`nV zNVMcH)p~7Rdp5P4)ylQc2qt-5&YYmzI)pqIIGijW{&*3DWjD_1t`4~HVd8FyY?uB! z?1!l{ZT_4<{uczz`zSN1TDWAah=0H(f z&o^cC?2Mj=?C!v`Xzy+G=nIS_ftT{lW~Fbqr}S@7a#0c{TZRl(8-x97pgAut>1B9S z#umEOP(r%ej=ABEKFgzZznH^*#P>=l*;5=yqTEsCx#J9&AS&Y5Qfum+AKd$=yjHmDV zCz3xtnKhc@YKh9B-nu0F>iujr2**p{FS`HqI;tFvD}oLHKt~xA0REp|J36^r89V;z zFn#@Ok+3UT=iS|%m#_Q2Zyg&1Fg#@g5buJm@7bAEd&MNpGlY_ zpsXTM7GKBJmxU%raiE%+pk(~*Xr7oGlbxxv=o4cpbKd8P7JJb8K7ZtL@b z;l=fGc<^C6 z$hyya^Lh=>w}rKF57%(MPdhc+e#EEty}QE)w{I8aBWAi!A;nAmK8?J%{iZ%ES;L;{ zHZDv0KV}X@NuB=_~7s$x=SeEqi}Zba$jBN6Bdl|4W|3uwcgdQv}aTEbD^cbD;XA+n~34e1SB%{@qC<#0N2r1ko>_Pz!lv@qlniE}!n9zLYHitnRF*IS*>n?0DWqdmqr z7~S{d_ffxzFT}_F#)ngy)_aZ5O2-yAPo?YCWk?F!Wfq(4*{8S8l@CukGwe539!$0}0vh=e0u@wj*ec(wo80_E2on zM+0$p9lCssZY&k3v|Wh0pL-Ip`sMIDCGZRiczw!v1{J&m!rq}2UZHb7&MsZ|!x!d* zWKcRvFJS?5NE9_)SPZ0^J_mkwXjd&xzg^6|+CABS42wVB@m*Z;X2^>+YA?)R z_aENfom}=iW-wC)w_+EnMt$}lx|QK(+>t8>La)pmJd^ld<1NXiH>X5cfXswiQia!) ziLmn{#sLcB>K8C}^?bDV+z??!tbeK*d-=a*mqgmC#?WP&cf>Y_2QR5{x}d*Z{JuW1 zrpmw_`i1C)O7IBrOTY_9ms~uukcd5j_sXPPd1PJqU5Ow@LQGz)1W6&0sXU1K0ELP` zl4eN)B3`DgyTW%1o9L$DSqZIR}MmY8Fw+-`7uBxknf|c+Z z2Bt0XWi{*F1cU-sU&=SHd@%?GA}XW+yZB~5{EU5Vu9!H4f~=16;B69HKy~&}O@0KKTQr2A zgbvUV8o^t%*nrp$(1M&llV)F&X#bo9*&((C6!^#eRgIV=v>R@n5N8J#MSe z0#d&2`gdY3SYLb;5WcjcH0;yhL(}{hMH+kvGIwZ*zgW*FxHckm{JHCYh6)^o8m3&@ zyO4FVIE6J9@VjtToV~AJ0DaYcHSiYOlX@heMEq085@SnRn%ug!d|Qzw`$uAdJ4SvFHN}Qnk~ECX+96lWmoUGRi7;I${rmY zj^^z=M{V(GH$MpDMceGsuJ9*mMPISRVSc{Z!3fc~PwOF2ub1LvYz?mCKVJH{EN8gF z4z6|4`VMD{S)Vz?AGMwjgxgl{`d7sulv;U{bNAi7I8dM3e_OrY;#!=uW^1QQIXj9& zn;zdcWP{e)WRP~jHR=q^#oWS?ISjLi?=&nv*kgG4Jn)tugSujPzjOBWa=mIvAcim8 zbPTOoe4tTW!yz7Pi&R}sKx?zaM)bEhAzIl4#w%R=qo&1!O`0JLG zz1zuE(QFEC6fN|uticT!WSCMJZKqUsF+Jep_rP_L?9n*mrW0;hhxk~!g2Z_G_IrF8 z8z_a);+3>GCmv({oV%q!lH|prZ-y|EDsj>Licy{Wu95EI*;2OP3;fsf6GGb8Yvgrw z?{)4sf<;g2z^1)(`m^<0v*JE2-+NallmwU5;Lz@YuOutlcRB|)G*e#pH8pJQE^BHZ z?oU^HpFHItGCEiD_Iy3ec9Zv649g$CaRVpT4j^Q{Gx^B6Y7Zyk25>Y!?cQFTDn8a-@_k2;ZP%B?bT?oUF= z9N6Iu3p^o?_Dfh7OK;*eJUeAdzw=$Y&OuxX6#a?IeEI{N1TXWkheC=XI_dTuNn~#?NCq5z4vnIMu@{dJ zb>zu*{9MdMvr_@x2=1=jWrwFZsqAs(zr0@jM)+wy6eKUR6NWZE1pOL3HuOuOr0kl^{< zX;uf%lqy4wGq=LG8eBL4$LX{8lh|I+8_oQp=~0EkZbED?*Q|m(TXn<6>?G2>vGM0% zjw#&G35U1}?I7c=_) z80z(R2S?^2rgG9`CE;stwdn?fw853I)754c+s!j*jFVGFHS?i>oP$`|jL+H?v~D+9 zop~aG60b95yX2h`KNf7TMFg!e@-%2hmHn3p3(=8RoGs~lDJV?MRGd%5!Y=3CaV(al zl4?p+luBbRznsm1gP0OGM4CZ7CE1TUc%Ci3k8jOFQ+&4feXa5i3;9LbkBr!3w___- z$I>0Q@jWwR)LM!$=M%_wNqLy7s*S40p~VO#sS#)MHZe+_3Q-Rr2a>;Pq`gIkM$3jc z&-hlzsAsW~nXV;4Slor|OII#R%h1znadW+t)ua4!!8yq^a?C zmT)M&K-2}^DH1sxfes~6ZN+8NAKi`n?;M^uIEzks)iq!(wCd}c~o6G;ZA`~xOApc z8BBPsDq`V#sF@nH?IgRW3ab4NG9T2!Mb|rdiqoveO4fx@xQ@G7TKB@tYL!B~xa!f} zxG{tI_*M2y@|u0Fu&=#Chc^7wrJ2moLUv(IfpnW{5<vL`7P*9vITB4F&ux_^mTBX9*GP&SlU16dq<#3Z`_<6Z%@iIr)6Y5`Ai;bR8jisLG%r$x(7gmf(0sQZ(9c~$(G zT>OBV8neNwtn<-!Wd%{o-r*^RItEls4}l^42tpnBev{Re(=t;N9ZAXoVPtO=H2{e; z74)mxQgp!!czajQyP1OJ@i$^5Oi^)31(#L=&narr6#|;7idVg*#^N4<4aJ_#WlL#{ zhm}&Cr{kz6j;zlzIBOmZlU|cTn>@}`6YRP^u7ZGWd1n(eM%$%zkoc?GinQ-PMwHt} z_2Q}TO49BGA}Oy7wRliHgs8~0N@)PnTIVW#nTNA&Y~>abU}xtTCO*~>au}HFF(Sd> zzB8pfq_$2}UaEL`qjEV=QAwc|l$6DEu7Jyz%FEh67WFGN+Z(g2j#wC#f_5C-ZbeA; z-*!O#nw(JQ9I^SHf=}?!Ku5ufms(^W#?Ka!u8>DHn+hV5DO^1;j7qN@Z{yYL{wja) zM2SHIyU%Gj@%2sTVdq`jY5iM1kTslw*N!o^i*Ur^p z-$3v8+#H{TwL}zP3SMJ!j@qDF6cXn=B<75DiT6lknUL``+TLn5I&`KrRlKUbf_x?u z%I@>-sg(9&`1J0o*Kay|Og`V)xj%6*5P5glEeD%hcCofdz*rdQZHiuB>^^3SCwJVS zqCBUa2BA-;9)AHnlawpy*lmc1Ixn=V4gSp`54k&34fFnfqH0)39Vb5>z!SVd}-0H zgL`{T`hGWOf`#09{ABTf-}N(-B;WFAH3CP=SiJP;F z@3pXF1=ulz38@D1^D0byo5+}7&~iii8fXWgwF`QzNJ$j6t^s-4F z+oS(lT7I+qw$w0_3s76qKBwO%DezLNdIvZt+4Yz{WakO{Fti)+DmEQ{#0-}DS8j&w z0qBk}KK%e>GRMa1V_0Q@@MCM@ADg12d2F8S_C=0gdHj#ya@b6HHL0~W0|SuV4r+on zoig^mJhF9GYNQslHBuL}J@i8!&jwuq)f(ieUpj_W{7N&4Dr8#~c0Ad3_U`4FPcnpZvw*($-Q-Ri$!_oXp;TMqJmkh zqwQfay!Aai5j~9q$faj*XQ%JV3S4gw)?f;&+aZ{d%y91x#3Z4)KMC#P%Sb+tW!?P%E zI3mVi6(Q!z9(iWk&7nq)N>L@zYptisR#bqzMVnEs1p#HrQw|Y$w90fEB%6flGNDcn z9@50~b=>m5k)CQ#fLEQ}qdrJHM$ELYz>J)g21}#M+kSy{uN&GkMQ~b2|xZ5 z9*8U0S?0}pZ}SWI*2CgsPGmm4-lEA_BwL;iv_q~3`LvKj7(S&8{UQD$)~Yzb!@V== zR|)#&a;RLjg)dTPI+lM&mIkRa;=^G@n)S=9>AWN$9m;i(hdJDAf8nV}rx6$NT4|1s zj%*3@X)s$5;e7e(lE_t&T#Yl&yhT}H37hGHRe2(Bz7CXIt{>UFq+=*9t@2%)P90A4 zg_0ayb&3k+Lm!qo;;HgQNWLo*P3)3lL=|n`W`=S-jmc}I2gP1%86hrTK&^7nJWcqc-z4ZIi-X=WSsbDN91hxT}mJ6@1kw z^?zb-tQ%y}?o_Ibm()LyCf%2;&<6{-_{=o2iw^QYb&&@8YgkwsbA=H`ntJ+Q>3*NW zg^lehGjEOY%2zHcuAN>`eI?4C8#p>82fAIIE{^cKe!Noxp2dfYLoZM_a21zjmKy z<*EEpFSQbg5;f2%20RL!63G1Z?>B~T=4f84Xn>%g{&+3z3CfWcN*JGA{4}Jha z!BKUY`m`b061Y!qc6l_rc7*x~zP;Mk03%nb ztpQbVOG^XNlHnga3Q9{I`AU>+MU8FSP!=cPBInIWAVzcO848 zR=6S6z-O|M>ZvCZ=z=tgSC$5dm~~CvCzYyBg5=&DA!TKOAYeC!P@h!5jIKo(5?gX} zmYa#b#2Pr+9|`eB?t&~Ft<(zm$pIq@Lw75By*w32mb-pp{!%yy9Dbv~gkS?I`=E%r zCs4Y%BUWULX8{1MhW_>7qED%&sE$qLSfcmbHO^Lt z;b;SlmZ28i0#3k^&`ZNvDJO}b$if~sWVpUF3>!qL+gaD4Ce4uXXI(`BiUUd&#CHHt zgb;=a9UOrsM4LlJ6N+1rF>?P#4wnD zan63G2q6?@#yR0pB<9nD5(KdJr@?URi5LB$kr28y zl)o6D^BeGpf5Rtms6UP&K24~al&TtxhzVDmIy%J2!{daD_r#6q;{hHZMLrGjGW)nDKgl(*!Y!@G5P`E0C zuKQ>7uM~Bo&HYY_b|`kW@vXa@I=lNxLSUwG~$p>qY{calZfN z1edq=ak+@7rNDVp#B?nvW3O8sZaBFOa+~a{|-u;JfL|vydB^Ob3{7&1NE~4*6Lb119|*;fFp|On@0!IQH4n3pLrK7 zBZQ-Q*{89L`de}U$q#aX-HgA+X-LGS7Qvbf$)>`Ly>>H(Qek*>!W)2CRQE%*8pxapuoJp8T7k%l~G0n{gL18Mjrz>LH&ia8dHjVbq~S3;cE< z_ZQ8`Tvfq0rUQ4SL7`r_-m*m{aCIw#ccGfC%;>l+oIgAC@ypgmH}z*bUq^PZJchVd z2!grGI`tgg>uBTg!_jfngltuG@%+Kdp?Q9!iDexfeR1)M4vPmi*p$XWmEm(YKuJnVTnbe?-1^(_AO-4c0jCF@y33xLZyp- zuQmrYAY#9NXl!shtjKC)CT~9?@Iy41IQJT~SGM}XJZxglW*H{+&ZELqACeo9aR5n6 z4e?SW19Ai!_W)H0iJAdBHDaAzv%YwG?VPEaLC)r^-q%sQp2t(s{L$jA2IN6yK@YNd z!vrn4$I}{#x;L1l)kiy3tzm~ihl9Eosb4?r547Z8&`4j<;F5n%-xIByi?GRhe?hw# zjekLNvHlJHiv&3W?*9RO(=`Cu5tgmH>DBtZQxEdAvaA=$W-g1G+TZn@KrNu7iMaiY z4>^L!EmRdwvSz?ejnHVvrazw5uz0#=fWLFE7wOL_yYO4H=RC|mz#pAQzQ7g1{{nAj zU`CFh{eOVZ>WOc^M5k=6JNyH@Pfz?sLG>9*wOJnJSD(`_@MFc+IJ!<G zvDBtzn{xmf@)wO#vN+DJ{cEa?o$$JKX)`Pj1#LW~c0^XiyvZ9X!J`9iG_n4W4}vxG zo&*RaX8@2%8&rMx7NnLwd-{r*`%;XTVOi$F(;!x+WrtW~X1^4b zziV&Wg)jQ(B29{Gd_WPVf#sQ_>i#T!`azJk2$)7Xvo7FsX<2Rv0&#!e?iww?EWP+X zBvj04o@TU;EIk)m1i3t=G|472S5RCQ-PW(QSr=O5 z>{kTI+#Z+xwtAWa48-$sNn(N^oxsw4GgB&)M*8hZc#b*G9H@y&`7UaX`J}WgpVpRB z+OpF&^OCvJ1r$*lc(&no(?8kcia*aBC&wIUvU~ritBEt*pI^4ylL}LK&S=t>+o>#} zNPLKAmO08S&F?~L!E29M+N12WWE@LoZuM%flta2)S3r1+$@cs zNw_EAGntdR&&A`uZK>j)8a1AZMhE{b*`4Q{(O)7@m@6N;hT7&DR{tqdQuDO4Fzj!U zAxVEkvP1t7*=ha%Cz4&-vU|Gykh#+5OC)lU`6s7URtpYpJ~}EUS9H3*F{wTFS4X)n zZ0%ro<>CmiWu1%$_+BKb0YwZ|O+$<}WP$3i*<%o6?9u41LSjo--{Hm0$6`jF14yV> zeHLL(bAm$?0vH0ybJ+;t1IlB$WiZec!4?Gqv@DG`o50^=&a@9K*bi^oG!V2om>7-o z>(sFg9EuGf=obp857L4!o`_FZLdGso`Ct?h2Q*;_K}Fwb#hL}4)soT}h9+mL3`=L% z9%FI?)bU2X6Kp_Nug8t&$U3SyQ3LKQ1^j251R3#Xo&ydA+yVW{*6}Bsn?NPFM##;d zY;<;yV3R{ks>|c61JEVSWk1kctgq|b05`#6t_2Csj~)#ecFq?YQuX0`p%Ew$IsoE; zd!P{*@H+s|iNnzMK_5Wr$XWJI=ym+uVRk?to3*o!CeiwI7D;vZJC#{FdM<_&2cfTh zq=L}HrJn;vt)_Az;h4?^Dt`kg@LO8|I^b*Le;qU20BOaL=tiJVA$8==pl02!S4u68;QsNMJ`I<4>^pWYrz}Kkx_$fj`JEkhJM@zA3%K2KNs-2uM1d{4eCv13*X=dM zmMJW5f`SQp8VCp-?HiHev8kC0hh6Y|z_0~DqwlhK|7{Spj#?*4P&mw&N3oI2s%Xk; zWIC@IF7@@}Fr=MQjp2Od)g#s=z)8l8i>st}JJ(G++%*^3Pne^1?SBP6gUByv|p;x)fgXwQXQ{jXg z7`kuPEb|=MloEh3&@QpBjW(Qj<ZyGiU z?<~6o;yLdWMJTrIcMAPi|KL#B3K*9*=MWw)0UoktP9G6X>9}Bxy@P;(Hnx=DqWzl9 z^H5R)hMu)Iep6P8T0=iv^5QCI{kcWH?{f}Cc198Qk_uoG_ToGPG4L*Tj`V(Ss&? zW_@{Q+4;fT$IB=32dHbh+NCmm>U|8$OY;=A>&pYb7tp=ZGdsfhU`9TF0RhV8o-+x}l5e1}Tp#FkTm+RTtMwPS7q>El2u8yCmYicWlq{`4X!sN) z(`d)uM+*Lf_261;ULzc2U?8>`TgV_Q1QXFXz+VK;rO#nBBE$JC?YF zbyO^vT^h`Lk6luYE>{Y_u&i{>3VMIO*-|~WA9z*nyGO+Bn$ZA0f_QB z7c(8or$~lx4Cm)P=RmwyxijllX8>MVOgZX1<>O^p_M|u{p9G@P^_fR+brdqabMM<9 z!tV&A59=I`UxWkxMK~b46qN68!o7b8U;iOog>~la!tkPUX4T~h%BO^Um zH!Agy#BROSNr5r{Of1*tWE71)IRt?Ee*fU3Sk$q}&WHLgMf03{#P8kd2jx>TRP+Tj z7gL61?qbCAABm#|pnOsiW=prfgYv;Df}p-*RJ(q3cxqpFy$HyH@C)wVsje;EHa)%1U+=fwkMeTa_&JDEvb`j*b?Wh@XLte1 zr%J7Nx-bCmi<f~d)a9{rB*gAJ^e^rzbl+V`v`S$CtFqBF!dFYqBs(!(pH#w<&I*eFU z)BCWCU|ee3-v;3d1}c&3R)!Q< zAALF#;=S$iYW9J&4%i0iWtbWvL6E`kh`?WWIPWp0W5mbU1cPbbkf%4cy(7fm6!c@( zi}}reQmVFVe5jCMtg=IY{V zSeAaYR*@lN*Qpoy)9V+BwkKfUME&ms_OgExoQD0C!0yR4U=L)t9b)*R2RC|o%Z;-l zL&mPdBrp=llrt*~D`>mr=J6OF+g2jA({Hb3Ov!I=upa};4%-U>xc7#)*M4WS;vWn& z17`CiMft?C$V!bq7X?(2W&`R^tX2 zi%(1vC8o)>E4;jF?TjB)EM%2TE_B_@K`o>FUb!tGS>$p3vv5*Q9@Ez`EtfLtL+(04 z#(`xk$|n_t!24po#hINYs;hLss(oX)p4X!Zx?GnosE1)~k_ufKAX4t-Iv32NSi1OE zn@Q&NOr*ydu-0ip?}346H4WPkFh+{KP2fqBb?$Fs*g^qf*$xBbPY9Vn+UxfaBp{O7 zTlQDf4taiU^X6zf(4|&Tz>e60Y8EjCe6989WcS^|&EcCNP zlVlOWbPm-Qj&&<;xNcq7l}JW`+OI*!!#( zqp2;kk#wka9V6Y(DARM1ZRz`Y5-Ko7)ffWQx#Syw~Q{GG;4A-jule)E@4T|iAhoKHzOw5@FQ0F;uTVaorj6( z=}5FGXU4{`7(dlgWfu7jjkC_y9OK~HFY4=pkKCDVG-*tYPhpCdk$w*AZD;z2_2M&O z0KU^s>w)B;2K9~*vVN)TJ)Y3}a|&oIJ&zBWV!%)rm4zwdf*Dd@c1&4f!2wrzNa@}G zClvh`6h`D9DEf#&gYDXBHp4HOj6dD!@jR>yM%t8Lb;PrhP`QNe)V_5HFxN5~sU)Ah zCa3yokyDL3yG+4w8Wid@=o5I>{2#*J0;-N>{}RS6cyM=jclW?SgS)%CI|O%vYjAgW zcbDKEJZNy{aPNI@-ur(u^R2V!wdk(izrA;L*Q%;6DU&2uEn=p<>FhyRNmOV;H#<^K z6FNhsJ*A?pAG)xfs2X9xodIT#R5ka(VNvk-LHZy4MLT^%6JSQ#A*Gyp2zV*8SczD> zAT5pHK3dm}w|zAKA<7&c+xF@EmP}mF0tz6R9)s8>`Oh2$6SVif4^Df9ssuXQ zBqLl=!CPT{5wi}8>&g6#{P{m3dTMBZLs6&}C9=<`YcT!E^0U40=c z*@-hrm@h=@Fq;?HU0k z3Uep)2PL7vlQ|Qi%yI;hpi#l{05ubYyiq+3h9i#_m{S1VJP67aVayfzl!f~Qg$`zA zjkHpn#H2Q|jEL^YsnYc=C>Kl^QYSYMJ>F$Ud+|gwB<&Kq>7jB77G1_Qr#KJH`;=Qa zL{}&Tqv`V>1e%qpfsESIq6rMjf3x_6^f!x;o*R5XxuR;7rAuYtkvunoc3N`;BKn)l z3f~p6$O{b`_DV4PSo++;GXDWFV_8O=n8_tFOk9$j?Jh0q9${}gl(k4|#_j=__%vlz zH*whSg2RPTuLTH}$pgylpI*wpZc5Cf2`Pepsm;8DbfV4lfb2$#8?-! zfNfOqLWMd^mT0tXFJf3~WTleN)FtN_mPphO1&_u87+seDqL8N?4bnm;;J0zpev-qb zuLbcU;7E~f*3L}0(<`4UG=M-#{{W$X0BQXj$mRoR!Ed6|S1Rw#Yzc-sYNOO7lFu45 z?k@zsa$wowz-axM8rbhgqC~X{nHIK z{Cc+nCNFKQXfzym^$t>SD?xmn>7aG=c#%OqMS;4ZNze7jhK}JIx(nKtnmD;)02RqA{F9oabf- z0dcB^0>Sz3arNJcP{_y7a=I+t;?9;kY z$#ME;3;vzs;n23#cZIKNDQC;?=2CCZj&f`L{66w-Z`Y$Fw05 z{WWKLd_(8@`R<~Fe)h$ClM-^$@ zO^-D$2D@n%bVcu$62d-_b_=a!ejPAC?b~oOX z8ozy#Pt&cBd{s}^fNLYzRWC28T2{Wcyg6FXYCwtoDaW!B+NvJh*n_n@YfqxAs=YkIzfML&*2;^1{1W z@u$7LdW+r_seG||^p(7_y8=~IaAK)_(Z|uWb>-ZweUZeAg$Mu3wBQd+7Qe@uH8Vu$ z^5MnT_RPBtz0t4TjM-aTyi=2uzw<5R{R#Arn=RM@nrj_&0QVe*7(YzTXw0*_(8dRx*UydYDMtE0>kcE z?u|jW-YuRpjer{dWT*AdD9Qa!3nn=xo#1PO$3va>ON~6Bqgzm29`WsYSg)ykl0##C zYfHYkIEXNXv7AsfHg^2(`FZED?{5CY;qg5?<<##oC3bo59hdO%y>u{aa?R7vJNFAT z|0O|zAVEs?aek(Doo-?Oi_=s2(Jf_rRIMnkUHK_JJ`$QNA>!M6{l-pf!I&&RJ?3$h z4`)Rq2YJIG6E3FRFuCP0sim3NLX7;v)c2AsSVdmtLD&0?FjA#@n-=BloDHFvOEXTG zz2{Yg+y`IRAi}Pkjh+zTsbAZ`Q&_-LtoL_MH_PY z%4uwFY&Dk;YkCzVyjBkNF-}K@9n2pBhYEH+yF3o-mc{3Ax)H|UmH76+dL9%n9u>dp z^o0?6&^?iZ_nPb%FWTza49zFe0o;vejd_fGALQMMaau1!RQ zo9>TFinizbR&7Xz@10GFO^dtZp75;>rFk=aod%tuN$=rsSKYR0nsYkiytvuy;;RWA z=Mkgp1A&C?PrWGnN_wMK?i{V)OH(AIZ=z%1CX0*eJxM2ZbovpdJ{U|=^$MS`$kb~g zD@N%z-ZkI4erCZoKeSx3bTr>%Y$PC}7_z)SH?1xw8i$FrJvemgRk@Ax3M4W>dQF}e zf(6Of{D4y@UD1N9K(Vd^TS9Zw^8F&VR^=}o_^Q@}(Yu<1MCZT@ali{T5-pJS|AxR@f@ubMO~>sf-~CARue(1Ixlh`F z;uV#Apfr5I|Aq3O3H}r1|I7l5y&2N}d;U)_F4hv^?e#$Pwt$zKZGH{)A0>iz@KIJ<`tL_C7hwknSz~>FK1bn73%ZZ{Zn|>0K3(v%dcPl8 z&7D}?vsVu9aegXx8%M%?dvJe*Id}9reqGP%Lg&kB-+Vr1sDf^4H;%}zB7om*6?EA< zMIeY;*jhc%1@JQ&Z%y9eHkH4|MjBVVwK8<>++D}|9FHC?K8-)_uim~`)J|$U;)maa zD7Rj4Wlnjcq`lmkw0ggCw|2XQ7ztJ`jqBWR-}R5ij>~7*%=v8Y`%lfgC8e@o*xw!6 zk~WIEM2^KlA9%;TN8uF8T?)C4cFZM3sD43E=nAgUxQ%FbQr#c3lbZ1Qy zKgt}v@Ez?c*|V&sY>i!Dl#y8h{HA!06I}d5vd<{O!oe+fFb<jFsgCXPRi?=-RV3m=qIltV?MIuE96GA@TYB5J`wAD`d`Gow zP>?pfn{dB8T}e)hoYc88*JITOb>pH5DBer%o4;zPbl_f52~4s5VI&&_oCj9F;sPaj zc0j)vQ-v*&W>0NQe4ux1OT6uAOuKkOL|K%s_jEO$TO+)9&63sy#}VsCfI7$8PR;K% zp*FoGy2|Zr+bMw6ck|Pvi_xs!fD87~r7o}EGd9cAXN=#>MShN6AvJIBV&xi9B>*sr zd$LT4;USrI=Z|-p#|fSjiR<#@n@^m_zJ=tHC5Kdlvm-0mC!>qiEzmGRyH`QE?@r%Q z2^k@bU)6qGqn(d?lKAVoQ;T;Cg(%zD>uZt4sj zH?tU+%KzB9#O#m6rf#Kv!k=_DTU_VYHCRWhI#w(`AgE0LSxmrg6S{m`vZfjP=Iw6s zBVSY=Q++Y3Af>(Da*VLr+;@yuc`GaBb5=URoz}%{8MWWZ>`-xsW^9bs>8!`xt>vpK zDkQh_@d0XmTf>-(@!Vag`+RGA+2QLW&Yo$PLNQ0-lqqkc<%u58V#6roLMimvmQeMZ z(N)bxQsgG%@i8jw?zJ+0prV}K1ty_es|y>q{hPzjfMeD!Ti4Mh!6|FyWHrRFRePtq zAA8m#ZP!Y}`0gF4fI3lKkJ8g6?#jMet@l|{Dx8z#_f0zZkhP)>=bmKMNIKeJ zKGlzEFpeH7EW$o5!CW8?S&|8!>j>L&1n~EojukhfV7Ra*sbD52P=% z2pqmKk<^D1@kreL!iq02T0nAUOWzZ+Uw?ga_%k}ZaXH+AoA^fr`SYHqY}6<-GZaPo z7gA!FaA|%bihcj@x8TU3CML*YLk$Gj%8tge&jIjWiFh^m7mvGfkLl4VVe`@?#Ti$1 zmnBe`o^`I;CMvZ^o!IIXjx0%P@dl5QgQA165!G8@XU!RP)mQRI#%i#ktU1w2CEuvX z@vB#GQ{g}+-dZxr&rp&X$y;v`2O)P=fc*g9dDYNnC}vFT@>GkRw4QDk<{yr!c}?P2 zsbgPdH$+2XL|qg1^v255b`nMrq)uvOh65ZEgK@LaPP3Rr6Q5hoJTyAvFv>e-DvSFu zjGspJ9X;FYVoplOAjBKg{#?sx;P%;kIq*^{5AdnXP!2ge{p##u^)xZu%|r}BjF1V$mvxs(J8qoQ9&7F~MtF+=gH?|~=hal+N_pT)=V4dy!1sYS&| z;^$*tY#9`_Wm^(p!j?}jPGO<@^VCoo=X;J??wBWWfZCx+Y~%Gz@7)YiVF3y)6|3Oo zgEEW5%p%3g z(lPvBhK61P#~-)lz_KS|RGWJ6@UHx9x}bn9&9Fti)G2(7)bITv-&TKqa-q{mOn@D{ z`iV45Qn=vRZR&uC&~43F>8)ww_6z|WOo%ulo6yI`9cl1*w(9Lv#AFq5QzQgyC%x0Y z%f`#6g_wyHa(Iu#slN!foKfl4>Dk3yjW7e*k+dmfKuO=d-<{A!!g<1A}N z6|(0D@;CHLV_0`T*mu4eeo(prg{_v^SXgkZx2E-rOKAmd=!O)3du^6%2D;xn9<3`F zt=`v1#fvw>+tTkkarlIYhpQT%XH>-P4hF-?J!=NYzAM)6eMG+qA<(xD)>fr^tNs{V z#H6Yw?_GqllBQL6-dw<&ZEKBG&hE=6Qc- zfR`wuhRwoXQd8{h{*wBqXt{$Ys$ZJT;M$VW4ecWON59baW)#GFhBe1LppEmwepe3s z-qzkl;rVFOz1Ldc&;LI=09)iuj@!B;dkZH95_o{u-lrDMRXD{gXFHPR93+{1&SklL zzY96O>?hq(1`RqA+WJpUO-O&BE)ckl8x_CQ^43IY_H}|ntql>aXXxIXa7A_0e6J}7 z=ENp2CzLKG<;yp^#)`Q!)&3aOSu90KKiD>>_U6R4^3`|rwr1NEv!P1=S!8cZCfM!w z8&rI2aeuh>X!rQil;y<{w!I$Ml6nL7v(ADkxp_L97a=yIId=K@qP&vab6I$UHgBmB z**28eR>FvSD8NT1V#&l_}uf#xB^gJAghL;N9U!nH(EGInN3_;W6AeIIc86#NvVedA|e_l@gG5Qu(z= za@x}ht#x*%(uC29&#Cp{mX(aL?QB8xr;EFloTn9V?v(OipO#ghR-(Lg73q$9KlNlO zrjEOns;AX=@X)D%rcQQ{0u%ibPpjnB&H7Co@iI4etJQHF`2mJ2k~(aQO_O4Rx{-b@ ztK0TQzRl}2J0QiK%26}*<#@r)9r*KwNQMq}+D`TfP|+iywM`uVSr#Uh&c?C*I}N*N z5-0wS#xs-Xqh!n+-%#Vq)GSY_2qe2oX}e1QW^WQbAVqhpYuG)P!XP`Y9lpE#Pj-_s zb_h;AGu$&x%~1Lc@bJ`j=a*}XM#-tJT-6tuCZ7{~xJ7y1Qs%D+aTryOX69e)aMHuR zSY&@`jpjUkWw7!3Q=|Esj=1^!oI2>ou|{YLi##`!3agWOt{QnZ`pcP)|2;`} zHisLpf4lVidG)`t<7%!802B4MDk$Fu~^yF%GJoq z)47)LuRCJ2*kb~si{L(~8{wx*LuxG{IsKX>QUOiDC&8OjD?<<=_zP&}A7 zdVm3%LO*=yEz&WebI(v?p)xTDh$t)50NVTv!X8!I%Gh${B*8g=2?SBBp~=T4)n(=;UGOT@bJucY!RZI#+c5dgy(?p z{|t!?`md0uD`vouE@yv*bq!U z;Yj80jAHuJXhZO}22iA8`d6euh%4roB#-c0fC?FK~|RU=gJgIjI6BiJUNJQr4$2!u*~C*cEq9;+B6LZA!;VvZxe+e z-9+w%AqM*_3ZcuCG5y6-H5Se{P>hB-VCe_yH`oToL;kXBGM)M{D-@WtnO18Hbgai^j$jxbmJn_$6m`}R<{+)_y)Y>1FC)3&_f_Os za3~;H=>fzg**vp!Q0`jB;XkuxQ4<2B^^Ry6pX9fPD1?9r1Vt#!?$yE{nVAF3 z7lfDt`r&6KMxzr@WcX7LYJ%MBg1_E&lv{5CwUmYcDTF02KM`Y zUw;AC3b=Hg+}eI!kOa^|K-VS1Bje>h`s&BM(e7GyzmO{XzP6-5I`kUEg+qI58w7y29e+S|>yBnl zs8$;*7?!KmQ66lJYX-x&Db&WLCOt5v&V2N&axU;}l#l|7T_s-i5%@41i zO|AzIZ?z2*wi)1wlYi2^r}Fl_@kG(}``I7!eL3e<3Q4z{S@)ff0D3RMPz7)RMc#N! zo0hnGoeVEy{UCE+*x{=Y`TJ?-j&t{JT>je-W*SCH+94*6(XTacCLDL`>Mcbx%imAj z9ljHjn-g;Gua#b}ika>efYHEIez@wb4&C78ockKu!#gv6SNGQ;_tya49C?|OFD=Qq zNee~Q#sJfCH5RJc9op5z>n9WXzSFSft?*?=L2?{DV@-9_bUpK^JiB=!7zwo_sxMpG zE=5q)IsK=93tQgmTD}Cn!897b>m+yXGM0f%=LzlyI^HV2AXaZ-Rr}${n+kuUJO65{ zpp?;-z@0{~H<~*TT5T*pcADAO<$9NpQ1@*=Uc*Dr-`nhIH;cc>*}~U+yfw}x5YT7D$u@9AY~erir|$f;YUQ?&wESW)c#39?FVX^ zq*7lnGcnfDKVwQSNr9?GGx*|zsNfrV3Qi?#`V~L(W){BFES;XEEqu~0>b8(;VtQ*` z8eizm1;sLN(A{x*ZRAo-mTmCK20^3B6_UgMTxNf)pxP3woze;Kh`rA;V)ClJGl-=h zD+4RSRF7GNJVEq*we`gXL@6uI{x*h9jMZs?JlymS1UxO&910DKJl&y7Q$m9XBVXg5 zCEOHwk|_PoDFoBVpTBGXc6LJdy9is5x#`jMGN_b`NZ%~)9P;D@N-9zMA~?J;PCmAR zevj%bDYhNUD4*_~zh`A}FEOELpTfNicDM%p?@y;)Ni*VD! z@Gr=dC!kO)2($21OfqbHwDK1UDU@O6KoR+WVf-WFL`anFLj;i3|64@#fLQ&PPTju+ zFz3R~!qavTn64GDoFGr0g;0Oca%J$t_gA4L!|NnPn4Q3L0M;@1dxVOJ(?KC6zL|D? zH+Q9W1M>NZ55-2DZV<9uC=pfMHGEJ00yaUM{%sd69~=8`F^>ONG3IJ)&lZj4)M;tD z!b%jZ&zhRNC+Y-s+`lo)G;?}#XsxoqJ0~@@uzzwt`5UoNHzMj($)?gWY^=H0Z(h!E z*LtZ}`pUK6zP^s{3TB)m)f+oV+gYSBy|3Cfj$}sxhUaeNk3%N(1kUc$`g>0t79(;> z5KISf=|v5c9BV^sIq}0P%TCpqbJ?O8u{bEat>%9{q`G^T(*VnKVhaz*ne{2lJ~J!4p;W<-L)np!z61) z$qhK9VZpobZL%g4b^#5R_+|Sm)B%kdT(=2TH#)Wu;8Fgm^^lrT99>OevoEAbaZ?1n za=mUBSwVN|Uf4s}0~ZvBs+wee=fZ4U0yPO!$UOL3!l4g&b#>rc@;t8thfq4}S~b;R zTv;~)$2zwom4Yr-VVqz@I>G%WaktMC8~ zHr2Hb@0V72dAoj5a8>$8hjQ)_P{*6ozjVBfuGg`U{69#z|3<}4ynVh3FbW6IDB@XmX-j6SC4J%Dw!Z_ zMdO|UWFs4#V^^hjT$X7o$!G%AS1hMc$<>j#Q@~}Ig)Yzj$gJPmY16(KnW7Xk%#YP$ z>aU3BpFJoYo_9eKl*ZAVvEC-q5KRtcVOWt(rRrQG>hVM!1IH393-LmP`oGO61xV1f z=AkFmouWps#0eJ$NEJY;zhb%6o8TlbG<-k#5rmi*dev6JzUs|Ozu3S8k8H(7w2+|Q ze{&6QGG!Ldj%+1$Ef?v8FIuNDo?t~b9;*Isb&w^xwEpVgwV{Pdfn3YXg@{3PtrBU_;p~|( z^ypRtsAF2fwCxN_;Rx6RIN|J?{)@4SoLUu%)X;&Yx;(#-t*~eU*wIzm=$F_8|IJm= zY&fr?9=sOH5J5Vc(4opm3X)jEF&a!9CW~?fb-B1(?7(5z7|ITP(62nSGhRLuj6_IBECsamXZgI>u zl6?{hd;kX#rjcyPeu2Y<$|^$yXqu>!+SkleETzV;DcS{8bOShm;FJhLxcew`ks^Fk_`H#5;UYC6-IpLaP}zO=Auo<|4kML&FZa7hhJ4KK&G0A`i;$2 zC*wFXe+OaC&-&|;_irw@ATDU8QvH|?=F(K<{mIb*jDt#a)$7o+*QMZ2fiixi$3{sf zox#2`hDr_}y4!W{Vb$a$XIPDbHnC{p$Fqc0cX96*)6hzXf&>A?Kl|zMbAFkLR_oc# zGjHJ3H9}SCxsn`G8lTY`n7puI>G3`)dkrdR+{`L0l%fd08d#htxtG#yTu(lca8e^o zL`iq{XDLG{L1QvSgO~sc9O=(ydqjwjl;07=6!%C=l?P8Ej6KSv6yxDln7y#&@T=YN zqP{p1@+?N?s_4L@J1Hf1slbmVSt{02ilf8Q!6}JrMCL|3l}r26nEn=(Ku15sD#?#m zVU9A}OPl8Jwa$(BD8Fb_mqkaF#UnhaawAs9rAiF9r;ZX6CcfC-kx+@ECr^wjh?57Q zswj?TqkSc-p^`#3p%0`vnKnTv``(L${Z-|=QEr5U(x3-cXg&8Ii248;U`gOork)ke zFON=LR~tlQ%2+_nh51oa>puI+7^noPtui5XxpgcwRrxKKm! z9YN(E3$$y17Q}zT_^@EIJtFau=yoM?yTlVE$x}^nFms_jf(FWD^Q%fN<)5njHt|_E zbn?IW?m>PaZ?s2TJHe~WN|kZph7^RqhC*8ft_q>E3ncJ-t(X!^Esj7-`z3^4pE|p5 zmjM;zFiP@E4M-W-7d#jOsCBUnV6&>KBgh>`Fg-(^yY#@K8N*mM8bZBpC8i40pSU$oF z^&N|;YJMiqbVm(Q9NEx|vnSfo4&AgL#zRGn1A{HT+;-?Af`54QheVCx_vn=-$FpT& zVBGnA;{#?>`}kMP_|c8LiG4&^XjFj5+z7CtK~81#5;TFSDs>c!x=bC&iVT$GOfN77Shpq{Qt$M;A-XE7rRYjv>W$ zzi>*FY~M24(h=N0{Rg(|)XEpli*(0cMcsjlwnC^cAXxciPadi(RT?r`OQi$M2szbW zOfxm!UhHRToV{3jYJ&X$0*nk-CKS<*bACi*JZjA6L1td8ffL3Lrx---T8x17r2>NI zoqmfIFvYB7vm_#^6YZ=hOGc{n?NIDpqaq4!sX?25DpNU; zXx5a;F9f#<;vEp`ID1dTY^`E4a@i^F39)ESi>W7ycj$#v{JjGwE1%? zj*WTl>tEcHd=%csjfldZlsv<75wIskXM)$2XidbNYY#ZVUJGd1ThvUnJqD!)LLBh&Zd(`GxXq&+ctRMlNb)a~KxS(hM6E1g(VkdJKSHF#*h*M?50!_Ceu zQLha+mx1u?^yvp)|M1c~rj~*<{%Z64B%GuCb6x_8b?l?x(I^DJKV{G@VR5}pE+Uc& zZj5E8DSYwjPt#Np|DD^IUvZ=}_P&z0Pjw_Dh~ZpByZ+&#%_N9YJ7030WA&}Bzn{5kwEbS`7uK%@~Pi`h(UY6u^sq-6^b8|k#FfR zAz#3QCgiW{b<5<`}h)k{efceksI7r z(;srKpmFVixv`5>WCWC>0QZWFcvznx@2+mkxr@}pzKdi!!3YFwS@C_eXk4ogLOfn= z@3%PM>UWRh-T-70%cty{tHn5DW3>CbXJ(iL_4|crH0iz7P9qeVCby6$O!4S7ropqH zQxqlKdRmvX#zXd)6R`x7Qb6HZ;nznnPZK=!Vc5DqhhX5pa5iXz*o@z61|!pCQB>{jqZnArOlclL4oc#Hy8SCs(!_$0mb{> zQ6_!0iqLX+HSDT7I{S)^F#PFgpL?%V`xNZG6$`V~JISl0EC`4T$LaM0jvA1#)-T|& zsjJxmD$eQnfa2AFdEhI>QS2drg}~P|e`Xx^8Nixp$~Eb;^37-X3a{B%+<$(ZvDo9J zwd?dM2o&JtmId4a1Elx^ruc6d9YFD;(m4LdeOj4^7RV3<)J~hNt2@C!Xl#HJp{pU| zbr@oMU+wtMZ#!&mD;5OL%EMVV|7S3MKr#2}Y@bEwymiR@gt7wWKXg{VZLHwOtXz6~ zRAgZRoWimW70={`S$&y$EH0|%*P$@B+1xCMcG%Wf<01e~(s?(y#c8=C+#ga9{N^VV zArb!#l+|m#8~a5Sf@|{CF@0laAOq?}A1G3%xD|m8h&CtGXVGLvgr0SnaFWRhU==n2 za825$XSk$$$fWiFiNP1QGV)$IpG8BP(1K+i`f^XkpH4%csY88+w@+_BWor(AZ-Xhc7Id_g04%?8KKP|3tlJCZOl+)+MuHG*z_4F=fQ?`)FR*K{;+jMK28!aFwtS z(x6ccpxU1_lwJ3}F{yNNW_FrWZr1IEUBs=fD3nx+xpQqL;dInAg3Ar0>DOF&y(OH# zoFd>|g2Mw4FU&AX+}HT`q45R&@P?X`V$c6tcMxoB<33(6NU0&*IA#OS!I@PSOZUZ{ z8nMzq)C_7%ZEI&58oMBk)k5|hAFhMB0l#N*A$l-f#Ny@W{f;0&_uyF!iHyMu#+xer zZO@ws?uT!uEH&ewmjg$KYX+wGN^hGNRW$MVlQBbahv2#%ER}@55PoH8xVtXLO66Z< zBMue-fQWJ~}HX^Hh%h=T$6gTlfN?KDRbMH9p^ z>7Bl8YD$vIaVpA>kd(lX+{dYosPg$tH05UQ?XV);0ghk?V(@mRG?aU_tZplp2&`7b z!rZNy9ACMq;Vle0xe09*xh=q*6af1~%VYO*P(seMl(SUdA$YvN0N$6dq$ai1uZH{9Yuh|touI3R&y0qIOM^;<4=`?LZ-qH zpEvIo@q1LIkQ!lj5;A9DTDo-_j!%no)TK1zTJ9i2;y z6Ts;P-d*8dO~Hd0z5Ozy$rjibhjIUSvxC7N$iW01ErjS;Y0YQ@BGxRylrs%&z?>n; z-Crk63bU(^RrdpLiFD^2j&-w&s~q7HjlijkN;6w7?#%7Ls9! zRG6Dtl$)BmN)t$FK|SPeN@8Mo$Z7yFXKd^Pu|gkM;K756@>L12OLb4ep*Gt64fvF( zbMNRTo#izt0NV01A>Kv^Yhd~7QHlPW1x9ir(3u0Ve>>xd3Y~{pH3V*x^MrjO)Nn!6Yg8EDoMb&rF5yX(TZ4dJC8H`l~7SUuhVJ< zKdaBOw{5nYhI=U9L6>yCnm5RKm+7&>%~E`mFw?dJjfXgeQgh&D3E9_>X~jpt1Mm|` zYgUU2IjxH?yYEBnp8)MQXeEQZ%nL@&Xf=mnAC>F&l}W&zKV>DkdtHkq`#B1mEr1DR z+f>>$9A)CoF!vkmiAO95Z?Xe3BU-VI+?b4F$Zp2X{vuU&gXEtXm`Q^T$-O8H$Wk%i z-&C+BD&C=sFiid1kX85(KFL6YzYHl#0SEGtUd{++b>)jrn^_Ta)CA@ecc(Nhq9dGR znK95M$?H+3YZ;lWS`IYa5sPc7`Gi2{2}w);%r~EQ&kEunVP6(nOFl8AcgMv=)={Ki ztWQzGlbk!gcBD?s&VsO}9dpe&-HU9RsIMCGSyX;P zJs9xg>{j;j$AC5-?80|0Ggxt7r42E~HSp3Iv8h79@sA|wtRCD?n1P)4A)GRlGc{S< zP>GLxhGw%+Zfq@|D@|fQMhf$>BD~Zlcg;-_{nbNK&$!w{%r1Zm8d)*km1Gi+wwl^Q z0>lu%4-uC!Ypcl;mnhIjjcO&tqnnEZG^B_F_?O*QqcYMe%ctq;qJcOh{q7vuwcP|J zljykWg+r1g`tdFn33YS{ByyN}>;A8Xw5PqjBnZc1RvP;& zIXn#VdI921b82lG`+V^I*zel40ph@J5HJjl)M=`566$O00CC{c9C?NinKX%Sz#Ex4 zeH4_S)~$hrh+!c`sX0y}3G4>1SB7UwtiMkaZ<+-n86!jYCrq2EI}Ji%lwQTds2l6- z=FvqKO7THpXtW^H)iKg3@r(wY)3N;SuOZ98`!}IN-b{Dp`*zX^Z4e*Rc$?eg`#&U- zJ5+|L?)v|s4mHm6y{%MyoAElCI6GU|n*BA;s!?^r@h2Br*H*E9%Z@2* zlY{IY^)Xq^rW}PeaFGCzIv)_5Th0XdJozoswTRIa)9>eJ=+}=^-Ca%t!}5%o2(GyZ z$%X=OjDfQtV$`%W95=Je#nvwdY)mQP5lqzj0zCfMK5cL3djjnG^p zsy`CHQ8)K|YmI}02(&8Yu6-!w{0z8tsvP>UAEB=+YkCIw7#!=xBd{PQIRuJYuntWV@fc;BQ!SV_wRy%F2L&%}QOy<)B0xxAehG%XF z#gly|B;$O0bX+%)7`Oo z@~CU~0HSZol@^flRimx^Od~ZznZ7}|iW|#AO1CTUJ&eY`b-{?V_ot;Ii-Q8;!%x#5 za{}2hQ<%$CRjf)c#X=Gv%X=w?mm_KGSl)h%%bb1<+UCffEW)qF`$^i%2I$)-OMn=4 zc7TIr4ASuSg8NpLaJ+bp#uA-yc47?0$+>ggFP)KN*4cuPKqe4k9Jz0q?$UY8)2H10 zOwcIEosQscRZG+{lLW77%L~Yq$jh-S{p}9g!nln!dfFGX=kN&&fHiKf&5zu09f8vr z?BZlfo6p&~1rW_i+O=%)yZcHaFZ5n&QmN@&{mt@t?`t2|1zl+kQj%9|Y2>;V?7F?A z0)5#u@5U`~)~`ULRJSQSp;Z5d1m?hl)kQe;zzVMDsP_XB_LiWlvl)+DMF_fLnTdBT z?2)Jhrxq>`Yos1}SNWu5?Kd7e%bJqGbR?xVL&bL9+q#kQnA;*{VxGnWBEq*Nw)q7kN+R!+yvvB@BP)pi3zk}UP zU_XW54LIY|(Lp|aq+(E{?9LbCANRnjCB~4tvqxA#Sg{1bpfD<=^aEV8@CDaukJ7BJ z0}jN7|5La5@)qcSPp|x?d7ume+=8kJ_=ond>6LCKhRXl(!bi{aTJ|%+gUon!_3bAp z?-@riizKjM;kPFVHzC>Mkux^}Cqqp>{bAMMz-qsxAU-B8-SoqmWZ0I@`CxzE-GP2Kj_25*|H3Vpz&jCw+trTq=1KJ1Q3se?=W{ z78k|vgwi%xFlz&l??6(bYk^+%Qbk2D7k$-C#T6sd$2wLIio4`-AuNePKRGrV+q9lf z{|ov^5lpdT_?O)@jEP^`^&6pa(ybI%C?7$+O@op{2i?-huOw`ZP5?&dFLpMI;5iNh zI$s6z=<&6y5W7czN%*Xmp3g202nf(Wh%v0*j@E3hA^+R4XYO1lBQOw=LVqj=(^0AlHMoO>kPbR#fOP>g;)Jz%c#6~m}nxW8!aYS4%kk5EE7;Ew8LalSp zQ@qx(Oy@Py?YA~@p69d^WT1gC*v_I-;KbbT(~pMlx3Bn`&2Dsc6k;?qEtfqw_H=#V z%!S_jyo67k(T~WIfuFb1P!86c7&YfjsajN1TC>V2K6!gpxU4(tphv;>mr)q@ zMPtE@)^Mac?z7MdQe2r3sYkKn&xD_(MS`@{IpKPQN5Y8W#Ho=;VeRmAZY7hk!~~Wz zM=y@qc!sa3j2O^~3nj5=nJOL*GaXpr{yN8E#*xYsE3qf9M4i|443_Q$0 z!9+zO*{>7gu%AydLGE_sF}k2P+vF)l%(nIq1MIS@>@+)7KQJ(%&k^ zaG5-K<2Ed=Qv{oIw^j7*_j^-r1X7fTD{6M_Ai)?XYcCIczD>Ejq;^r97JJH7NtF3q z;r{m{nIufoG6V$z(oO>cg8r{Z(%Ia^#)R>&BlBN7oN3D0tpPXn{-cK6w!iSS<`U5+ zeztPHRD^)qEE?M&re#f~NOVlrg>dfB<8QE0(+_vn)L&C6^yzHwHQg4!3GtU67WHZb zm7?R}pxjS#=wXsaKJRWlrQeIEVFaMh;SRE|_nHSv9tcERMTqyq=Z#)LZ-YxX+h9+K zWDAn#jnunV%hft9aMduF9xzfZ)73pq2XH9b)X6RMVZ_~H;QQmPC?*7G*YVL`5QCr- zmPmhCwyx88AU|XL&I|jwv@r{_1_O`w!{r3)V_lq0Q(kz9*AVSRWXKBQfPqRqmI18D>do(s(p6x_sH0yMDne24Q3w z^~K{AcdVPQPj`3Y85S00>1>d{b*q=pzs|K&?#wj(5T|`ayYnrdla`JH8)Sn_a2}6# z+>lC4E=rNF-#m84Ii*O~3@yr*pQqtG#r^tOj$d@1sz%PNV9h4o90xnyR6y?i+Oyua z(1OBTJMgvB8x_6rSZJOIl_`JUl=;h-x(21$>VgHSOjiezm=Z<|<9ujBrKQx z6=*}8T$Bd#s!y;4EZ$_oEpWX92@9E%H%Ce8{%i2i`8GayLK=oKOI<#XduyrFz2%aO zy8KTEi+jV>1h3i<-LS6?sBeeQjBmbA)DNeRZg$z;jUXe5JzIWHXU%%u+WyGW1E#4(Iin#-$L0clRcl3tU0xdLll zA%k5Bu|ek5@?CTHG9&apHxG z&M(M8PlGMFK!IH^7G9c=bAwjeetLyeLc4J~$_I#m-RK zQJDMz*D_*L&x{kd6+zYR8{_sbYu3rHfTsB6ErHh_o{j(2)^$cTv31c%Z-!6>DWX7- z-dj{aR6wbU^xh05bdU~_8cL)$r3=y|h!T+AjMAh@5s)Aliu5L+2z=4+y{BZEADNX| zv-i!pv+g}-pR;C8WVMymi{gVxWu^LZZ+_2>sKH^Gnb*@Q5)b+VCj7K7tvf(ViiMxu zDqpwtAB$NF*>0E`^zJwDnq;$5zK==Cn>2NWn?8E;rDy!fp#5cBtZ2al!4}7flsLm^ zc1ac>kqU;-@Ku8dO`!&pAi5*N>BZ|OTzRJ0T;U)Ai;|uC#Y4ulG~gNOojp~^IYyJ= z=+Tkx`H1|2?I7LRw3Nm=f#Km%z9N;?Er-(E(Jb0(@wYx__~Z6hExynp3)?lazvD8s z)71DiU!HZ~dr41^D-qKq{dPI4-y_bzBa4%+e&Fg`qx9#&MfYo-l!%q45A0PJR5V_k zXb*KQnTi>eW%im43#&n6OJsyBJMx^7I1bg|uS9j{3@Yf7s-|mTZ9{{OE2MAt5?v0w zJqwD7D`3WHPPnv|mC`bYq?%4D9cS5cj!so+J{t-X zb1fENq`(l~3Z9 zhB8(&65%zNUhJ{U*sT%YJPPU$uw;#h-U(%+i((m2#4a6ci8c1F%M17=SFQ2-@)=Je z8R=(Zqcg9LTbk%cr{_v_bn}CgqCWW#>It}mOcaHkwP$;Cbqf78YW3JiZ>+U&&J$lW z%~QbnQAs}L5`5AOsia+e*n0_Np$C5kK4bE7h?5prgfup)7{)rr?yX;N)OoX5@bX*Q z1v)4By=mC9?C=YM2z2E6VVZA2jcU3!PlM^qwVGb{s7WV$v&(>-I(_aIrR*SumfGxs z_2q89lY$Ef4RMixGJi4F-E{%@QtpduBQ+LSFwCD$YDiq90BKbt^r+Sb?BC>~v$P4rM6AgvP=Q(gMI}sk5r0^A5Z% z<01MSEIM@GMNnjNR;v}lIa9n5m9MBC+j@kLj1$ zwT4CZSK;Gx5ZR|D?eo?4Wp>bu`G&jnMB~bC=gSlNYY;^Y_3CQa<^o+}RtYS}@t&u1 z2yOYRtKj&-lBZ><@I|*BcbO&VhY*)kt{V4hK^3v3Q-$Bxo?K~jth2S>jJ|&L0&AUE zv1>(_Fi1!*gDb5kT;5Q`Cdd25nl*IbasAQIx0dq_e7fu^+}l>LLKaR+Y?b??#xRb0 zCwQl*Ky?GXja<~%j4G*^wt3bMYW<)ieN8=$(guCS!?8o6lQ$IIprJW~H`p3)ILisc zf10f0;p*o3>#k-eRJnwSG2ZZLZr_^i63-*CXGEw0_?<>>nQ{2Sd12g>*O6sM0h$nL zo3}nFueFg&?22>YE|$**1o#HQJQR1!FXcyOHMU4gad$#c5CsQP`MNOPw-@BR?oYeF zt$0r+0_54^oXdQ-x%jaW+FQe|<|6A)HrHX!)|IXJuGMQgmRVp*gg(W_odx{NtWiC< zlahO#8UIwN#}7SO_eXZOm6tt-1|-JU7S%KKrJQHYjB>SaqlH`C>A0%3zOM#GU{Sc} z3M>Y33~Y>9=Gn2_zl;?Rka|(vO}@XKc441Dr6mkRMLXehGST?x?mx}p;_Ym0=Yh}4 z{EY728BV#(%CR&}7b_*In4+VTrAVZz3zYQDkSg5hZ2*|%`BHADxY)-v^;Mg9g3q!Q zOJXE7=!RknaE32us2OqZvJA*1}ARr>_aktM`t6KH5uP1h4Gfp&X~D z?;Cg(qU3Nqa}?iyKsPx=N-t1Ze9;gx!MFKgLM<~6b_pqqXx~YjHQY$4#5wntzB3SH z=MLz{4BhAWWNQ%pN&J>BMlu3Mu3Mh>|&Q-C6uI( z^r3wWmHSOf*D)bM`JnyXcZKpyK2utgilozERhf?uSEHNsP0JX501ajazl;vu$6R)` zEC7O#s@hI(NKHX{iFX={bJdp3(R{Deir`g0>Wi9WeYAV3=4|>vpR-cQuM#v?X>PsW5 zzB6wI=22@&EM9l`eve49G`EWBZVW!!jd1q?fBrbX+WT0$U_5XF>AtQ#V8eW6`W<8o zZ6?Em5q@ z!>yMkS5RcTYj1by=EqvsdY@lCEhN^_c=kgpji-}kJ}a4{(j-`0Vd+;W(Qr>cXDIUV^nAekmYxN2f8TC zNZ#Hc(OM|1EJ!5dF!3}+rck)jJ@RIkNiM z?%YsPB?nP6vb?$AxG8;^(SmsM<5VG~PI#h4-^$eZVRP2@lxM$uz=BJ`+X9P@fi3y~ zN--K@JKw82)y+LFXq1~=`K=Wu885(MZC(2ez=_D7rn}(fu(feLtnTJCwNPBBRA;1A zx(U@8d3GjvnBz>n`xgo^Mq2H2ACD`!-{E&b0GQOTle>;Bu@tDb%dwdZs7(`_rYXB~mvofnxxLl=D> z+l#VWcP`UX-28%l9TfXS928wCOSbM+n(u$g8dx#KmnLu1*s=OTk2@C;7-CqXb6|^8 zym8hsHbI-zGRhB=WUSYZom?t63cbuw_f~Y$$$EFx(#$RulD-O~5O#Ybbug906hQVl zF?Wk{mrD8^@Un6ha+mrWi$$RjbFN_eqcZ1Bxe5iRqO(y92KC(>oi7tB8LssSNJCM& z6e*CA{g2q^D~P$)ujIt3OpY4XAf6%>jL3mw_i&wUTAb+ZZ1uE&L*CttW?^=n-3#+7 zH8FHhXARE*-iccya=1{?Gb9G5>Timvu9Zya55vS!lTcjcP?!RR_gE6~rG%1-(_HXx z{1gQ+CfT8~-<0%GBAy@{lV`-YLXGjayRVpyET=);Hjra`AFjqMo*dY?kU%Ao&X}Mq zmiP^)AQ8{_1f9^!nz5{AoQv|l&($Y@u)JGlLX-A&JTdFF|LQDN%Ry`M0_qV*y$JMt zjigv7>9O6T&g*fUL*Bni4!^7Dt`&em_HwMFzR3`Zn+8B{EuM)hm?+Vh2@Q_}_VgN)l96&#PoKiXhn zSjVHyMQ#s65ndVQnj0T(v z!-!3YwdufEoHA@n)Lu*4vU;4hi{xKqy|RH#8dFDMXnQtT*OxvymDb}MU*#K>D&2vw zhmVY{9DjgGMB?ZVq#J7BYjdxZq3@ZNV_FLzmkAEfEp_w9FBCrxZB`DPKuvhBvEAk3 zDNS0=LajjR4Zf^^F?O8A zhX~Co$y}>uKtkg;zokkq>Kx7Dg27l{^DnYQrdSa2Xo?kSjt$+^CRzbrKTxVc?>7Oc z&kX6Fy8{;+Z+$=R+i#;nyFm{or*-Q#f}?}E!~^VLt1mvdGK~XeP?kB1pJuc43I`c1 zi;g*6oCdgR*}|gN$ZV)$`90$347od4GZ#5oV(YfbxQ?vs3?FVlg1Qrir5IOOsDwJ) zg=TznEFF4@7s;)0QOF+Qq0<()p?Hhb#M*lu^C^^Rt5e)rQGJ@dl?;LWq!Kvwb_AHG?aR%cC(aW3x zfuEli=LFA>FXV*ed-jZ`n+MxXmRB}?8=bs_^{aJSK*cLyx4W=G2a1O)JslQb+2#G8 z?fFiBaqSB{nA$sphRB7?%vQFTeLsv>JTCASZ#|u&U~l$;B$79r+u!(1hm7un#Es7$ z-W@T_U(CuQ)H`V@Ge1s zU)WvbxS`?S+~#fpy`IxP4JA8kpZDOeU&oS&-F8JC^;1NQ#6Q#H6oB$avW69RiV{=t z5o$L+=k`-}{QH69&jA1?*YL?;I~OmDyMAtVo@PIzGeQDCu)5Md{!%PHk4*h98h?bJ zdV{CQmiNdV6I0BpgqC#11}nWF?o9V!R&sOD+%X-@P(59;^C*N z)lPs3UN1?=Ls%#M&BGh~FV7!E6hb&*;pI1+A@mOUOm29e;BbJp7aEq>?0L yA(UFbS?c2dnUxd5ix5v35B|pAP5xtvos153)JgFx=;x}U16bjghf3zpU;hI)FvKzd literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/resource_utils.docx b/twml/libtwml/src/ops/resource_utils.docx new file mode 100644 index 0000000000000000000000000000000000000000..3ec29dfe860e7e3d2eea521cc3c7a755afa3a4f8 GIT binary patch literal 38164 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 Ill1l9Kav_@oB#j- literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/resource_utils.h b/twml/libtwml/src/ops/resource_utils.h deleted file mode 100644 index a41fe6845..000000000 --- a/twml/libtwml/src/ops/resource_utils.h +++ /dev/null @@ -1,126 +0,0 @@ -#pragma once - -#include - -#include -#include -#include - -// Add these to make gcc ignore the warnings from tensorflow. -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-compare" - -#include "tensorflow/core/framework/resource_mgr.h" -#include "tensorflow/core/framework/resource_op_kernel.h" - -#pragma GCC diagnostic pop - -#include -#include - -template -void unrefHandle(T *handle) { - handle->Unref(); -} - -template -using unique_handle = std::unique_ptr >; - -// as std::type_index is not abi compatible, we bypass the hash_code checks. -// https://github.com/tensorflow/tensorflow/commit/15275d3a14c77e2244ae1155f93243256f08e3ed -#ifdef __APPLE__ -template -Status CreateTwmlResource(OpKernelContext* ctx, const ResourceHandle& p, T* value) { - return ctx->resource_manager()->Create(p.container(), p.name(), value); -} - -template -Status LookupTwmlResource(OpKernelContext* ctx, const ResourceHandle& p, - T** value) { - return ctx->resource_manager()->Lookup(p.container(), p.name(), value); -} -#endif // __APPLE__ - -template -unique_handle getHandle(tensorflow::OpKernelContext* context, int input_idx) { - using namespace tensorflow; - T *ptr = nullptr; -#ifdef __APPLE__ - auto s = LookupTwmlResource(context, HandleFromInput(context, input_idx), &ptr); -#else - auto s = LookupResource(context, HandleFromInput(context, input_idx), &ptr); -#endif // __APPLE__ - - if (!s.ok()) { - throw std::runtime_error("Failed to get resource handle"); - } - return unique_handle(ptr, unrefHandle); -} - -template -const uint8_t *getInputBytes(const Tensor &input, int id) { - return reinterpret_cast(input.flat().data()); -} - -template<> -inline const uint8_t *getInputBytes(const Tensor &input, int id) { - return reinterpret_cast(input.flat()(id).c_str()); -} - -template -const int getBatchSize(const Tensor &input) { - return 1; -} - -template<> -inline const int getBatchSize(const Tensor &input) { - return static_cast(input.NumElements()); -} - -class DataRecordResource : public ResourceBase { - public: - Tensor input; - int64 num_labels; - int64 num_weights; - twml::DataRecord common; - std::vector records; - twml::Map *keep_map; - string DebugString() const override { return "DataRecords resource"; } -}; - -// A thin layer around batch of HashedDataRecords -class HashedDataRecordResource : public ResourceBase { - public: - Tensor input; - int64 total_size; - int64 num_labels; - int64 num_weights; - twml::HashedDataRecord common; - std::vector records; - string DebugString() const override { return "HashedDataRecord Resource"; } -}; - -#define TF_CHECK_STATUS(fn) do { \ - Status s = fn; \ - if (!s.ok()) return s; \ - } while (0) - -template -Status makeResourceHandle(OpKernelContext* context, int out_idx, ResourceType **resource_) { - static std::atomic id; - Tensor* handle_tensor; - TF_CHECK_STATUS(context->allocate_output(out_idx, TensorShape({}), &handle_tensor)); - - ResourceType *resource = new ResourceType(); - const auto resource_name = typeid(ResourceType).name() + std::to_string(id++); - ResourceHandle handle = MakePerStepResourceHandle(context, resource_name); -#ifdef __APPLE__ - TF_CHECK_STATUS(CreateTwmlResource(context, handle, resource)); -#else - TF_CHECK_STATUS(CreateResource(context, handle, resource)); -#endif // __APPLE__ - handle_tensor->scalar()() = handle; - - *resource_ = resource; - return Status::OK(); -} diff --git a/twml/libtwml/src/ops/scripts/get_inc.docx b/twml/libtwml/src/ops/scripts/get_inc.docx new file mode 100644 index 0000000000000000000000000000000000000000..d65d511e876e780f1a701b2d6f9c96f3c8156e9e GIT binary patch literal 36697 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/scripts/get_inc.py b/twml/libtwml/src/ops/scripts/get_inc.py deleted file mode 100644 index c50edfa90..000000000 --- a/twml/libtwml/src/ops/scripts/get_inc.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Gets the path of headers for the current Tensorflow library""" - -import tensorflow.compat.v1 as tf - -print(tf.sysconfig.get_include(), end='') diff --git a/twml/libtwml/src/ops/scripts/get_inc.sh b/twml/libtwml/src/ops/scripts/get_inc.sh deleted file mode 100755 index 5cb064338..000000000 --- a/twml/libtwml/src/ops/scripts/get_inc.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -PEX_INTERPRETER=1 "$PYTHON_ENV" "$LIBTWML_HOME"/src/ops/scripts/get_inc.py diff --git a/twml/libtwml/src/ops/scripts/get_lib.docx b/twml/libtwml/src/ops/scripts/get_lib.docx new file mode 100644 index 0000000000000000000000000000000000000000..3c977fe6f1a06c31b0d05073b7246542fd4c4eb7 GIT binary patch literal 36697 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 rH$g)MrQ?OJAH6+@(Eq9xDT|@D4g -#include - -using namespace tensorflow; - -REGISTER_OP("Sleep") -.Input("num_milliseconds: int32") -.Output("sleep_time_in_ms: int32") -.SetShapeFn(tensorflow::shape_inference::ScalarShape) -.Doc(R"doc( -A tensorflow OP that sleeps for specified number of milliseconds. -This is a proxy to determine the number of inter_op_parallelism pool. -This is not part of the Tensorflow API as of the date of writing this -doc. Hence, a tensorflow operation is the best resort. -Input - num_milliseconds: A scalar tensor corresponding to the number - of milliseconds the operation should sleep for -Output - sleep_time_in_ms: A scalar tensor corresponding to the - actual number of milliseconds for which the operation slept -)doc"); - -class SleepOp : public OpKernel { - public: - explicit SleepOp(OpKernelConstruction* context) : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - // Grab the input tensor - const Tensor& input_tensor = context->input(0); - auto input = input_tensor.flat(); - - // Sleep for specified milliseconds - auto start = std::chrono::high_resolution_clock::now(); - std::this_thread::sleep_for(std::chrono::milliseconds(input(0))); - auto end = std::chrono::high_resolution_clock::now(); - std::chrono::duration elapsed = end-start; - - // Set the output tensor - Tensor* output_tensor = NULL; - OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape({}), &output_tensor)); - auto output_flat = output_tensor->flat(); - output_flat(0) = elapsed.count(); - } -}; - -REGISTER_KERNEL_BUILDER(Name("Sleep").Device(DEVICE_CPU), SleepOp); diff --git a/twml/libtwml/src/ops/sleep_op.docx b/twml/libtwml/src/ops/sleep_op.docx new file mode 100644 index 0000000000000000000000000000000000000000..63fc0535f4e09621fd236ba0bbb53ba83be71037 GIT binary patch literal 37528 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"epsilon", &epsilon_)); - } - - void Compute(OpKernelContext *context) override { - // We always return the input ref. - context->forward_ref_input_to_ref_output(0, 0); - Tensor max_values_tensor = context->mutable_input(0, false); - - OP_REQUIRES(context, max_values_tensor.IsInitialized(), - errors::FailedPrecondition("Attempting to use uninitialized " - "parameters: ", - requested_input(0))); - - const Tensor &indices_tensor = context->input(1); - const Tensor &values_tensor = context->input(2); - const Tensor &is_training_tensor = context->input(3); - - const auto indices = indices_tensor.flat(); - const auto values = values_tensor.flat(); - const bool is_training = is_training_tensor.scalar()(); - - auto max_values = max_values_tensor.flat(); - Tensor *normalized_values_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(1, values_tensor.shape(), - &normalized_values_tensor)); - - auto normalized_values = normalized_values_tensor->flat(); - - const int64 N = indices.size(); - - for (int64 i = 0; i < N; i++) { - int64 idx = indices(i); - float value = values(i); - float max_value = std::max(max_values(idx), std::abs(value)); - - // Guaranteed to be between [-1, 1]. - normalized_values(i) = value / std::max(max_value, epsilon_); - - if (is_training) { - max_values(idx) = max_value; - } - } - } -}; - -REGISTER_OP("SparseBatchNorm") -.Attr("input_size: int") -.Attr("epsilon: float") -.Input("means: Ref(float)") -.Input("variances: Ref(float)") -.Input("indices: int64") -.Input("values: float") -.Input("is_training: bool") -.Output("updated_means: Ref(float)") -.Output("updated_vars: Ref(float)") -.Output("normalized_values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that performs batch normalization. - -Attr - input_size: Size of the inputs. - epsilon: The minimum value of the variance. - -Input - mean: float tensor variable representing the running mean seen so far. - variances: float tensor variable representing the running variance seen so far. - indices: int64 tensor representing indices representing a feature. - values: float tensor representing values for the current batch. - is_training: bool tensor specifying if the op should be run in training mode or not. - -Outputs - updated_means: mean updated with the current batch. - updated_vars: variances updated with the current batch. - normalized_values: Input values normalized by the max value seen so far. - -The pseudo code for normalization can be seen below: - - if is_training: - means, variances = update_metrics(means, variances, values) - - normalized_values = (values - means) / sqrt(variances + epsilon) - return normalized_values * gamma + beta - -)doc"); - -class SparseBatchNorm : public OpKernel { - private: - std::vector counts_; - std::vector m2s_; - float epsilon_; - - public: - explicit SparseBatchNorm(OpKernelConstruction *context) : OpKernel(context) { - int64 input_size; - OP_REQUIRES_OK(context, context->GetAttr("input_size", &input_size)); - OP_REQUIRES_OK(context, context->GetAttr("epsilon", &epsilon_)); - counts_.resize(input_size); - m2s_.resize(input_size); - } - - void Compute(OpKernelContext *context) override { - // We always return the input ref. - context->forward_ref_input_to_ref_output(0, 0); - context->forward_ref_input_to_ref_output(1, 1); - - Tensor means_tensor = context->mutable_input(0, true); - Tensor variances_tensor = context->mutable_input(1, true); - - OP_REQUIRES(context, means_tensor.IsInitialized(), - errors::FailedPrecondition("Attempting to use uninitialized " - "parameters: ", - requested_input(0))); - - OP_REQUIRES(context, variances_tensor.IsInitialized(), - errors::FailedPrecondition("Attempting to use uninitialized " - "parameters: ", - requested_input(1))); - - const Tensor &indices_tensor = context->input(2); - const Tensor &values_tensor = context->input(3); - const Tensor &is_training_tensor = context->input(4); - - const auto indices = indices_tensor.flat(); - const auto values = values_tensor.flat(); - const bool is_training = is_training_tensor.scalar()(); - - auto means = means_tensor.flat(); - auto variances = variances_tensor.flat(); - Tensor *normalized_values_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(2, values_tensor.shape(), - &normalized_values_tensor)); - - auto normalized_values = normalized_values_tensor->flat(); - const int64 N = indices.size(); - - if (is_training) { - // Accumulate, mean, count, sum of squared differences. - // Reference wiki: - // https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm - // Reference paper: - // https://www.jstor.org/stable/1266577?seq=1#page_scan_tab_contents - for (int64 i = 0; i < N; i++) { - int64 idx = indices(i); - int64 count = counts_[idx] + 1; - - float value = values(i); - float old_mean = means(idx); - float old_delta = value - old_mean; - float new_mean = old_mean + old_delta / count; - float new_delta = value - new_mean; - - counts_[idx] = count; - m2s_[idx] += new_delta * old_delta; - means(idx) = new_mean; - variances(idx) = m2s_[idx] / count; - } - } - - // Normalize the values - for (int64 i = 0; i < N; i++) { - int64 idx = indices(i); - float stdev = std::sqrt(variances(idx) + epsilon_); - normalized_values(i) = (values(i) - means(idx)) / stdev; - } - } -}; - -REGISTER_OP("SparseMaxNormInference") -.Attr("epsilon: float") -.Input("max_values: float") -.Input("indices: int64") -.Input("values: float") -.Output("normalized_values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that normalizes a batch of sparse inputs based on the current maximum value. -This is the inference OP. - -Input - max_values: float tensor representing the max values seen so far. - indices: int64 tensor representing indices representing a feature. - values: float tensor representing values for the current batch. - -Outputs - normalized_values: Input values normalized by the max value seen so far. - -The pseudo code for normalization can be seen below: - - # During inference - for i, idx in enumerate(indices): - updated_max_values[idx] = max(max_values[idx], abs(values[i])) - normalized_values[i] = values[i] / updated_max_values[idx] - -)doc"); - -class SparseMaxNormInference : public OpKernel { - private: - float epsilon_; - - public: - explicit SparseMaxNormInference(OpKernelConstruction *context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("epsilon", &epsilon_)); - } - - void Compute(OpKernelContext *context) override { - const Tensor &max_values_tensor = context->input(0); - const Tensor &indices_tensor = context->input(1); - const Tensor &values_tensor = context->input(2); - - const auto max_values = max_values_tensor.flat(); - const auto indices = indices_tensor.flat(); - const auto values = values_tensor.flat(); - - Tensor *normalized_values_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, values_tensor.shape(), - &normalized_values_tensor)); - - auto normalized_values = normalized_values_tensor->flat(); - - const int64 N = indices.size(); - - for (int64 i = 0; i < N; i++) { - int64 idx = indices(i); - float value = values(i); - float max_value = std::max(max_values(idx), std::abs(value)); - - // Guaranteed to be between [-1, 1]. - normalized_values(i) = value / std::max(max_value, epsilon_); - } - } -}; - -REGISTER_OP("SparseMaxNormTraining") -.Attr("epsilon: float") -.Input("max_values: float") -.Input("indices: int64") -.Input("values: float") -.Output("updated_max_values: float") -.Output("normalized_values: float") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that normalizes a batch of sparse inputs based on the current maximum value. -This is the training OP. - -Input - max_values: float tensor variable representing the max values seen so far. - indices: int64 tensor representing indices representing a feature. - values: float tensor representing values for the current batch. - -Outputs - updated_max_values: max_values updated with the current batch. - normalized_values: Input values normalized by the max value seen so far. - -The pseudo code for normalization can be seen below: - - # During training - for i, idx in enumerate(indices): - updated_max_values[idx] = max(max_values[idx], abs(values[i])) - normalized_values[i] = values[i] / updated_max_values[idx] - -)doc"); - -class SparseMaxNormTraining : public OpKernel { - private: - float epsilon_; - - public: - explicit SparseMaxNormTraining(OpKernelConstruction *context) : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("epsilon", &epsilon_)); - } - - void Compute(OpKernelContext *context) override { - const Tensor &max_values_tensor = context->input(0); - const Tensor &indices_tensor = context->input(1); - const Tensor &values_tensor = context->input(2); - - const auto max_values = max_values_tensor.flat(); - const auto indices = indices_tensor.flat(); - const auto values = values_tensor.flat(); - - Tensor *updated_max_values_tensor = nullptr; - Tensor *normalized_values_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, max_values_tensor.shape(), - &updated_max_values_tensor)); - OP_REQUIRES_OK(context, context->allocate_output(1, values_tensor.shape(), - &normalized_values_tensor)); - - auto updated_max_values = updated_max_values_tensor->flat(); - auto normalized_values = normalized_values_tensor->flat(); - - const int64 N = indices.size(); - - // This copy is needed because the values of updated_max_values are originally garbage. - // Also note that N is not the same as max_values.size() - std::copy(max_values.data(), max_values.data() + max_values.size(), updated_max_values.data()); - - for (int64 i = 0; i < N; i++) { - int64 idx = indices(i); - float value = values(i); - float updated_max_value = std::max(updated_max_values(idx), std::abs(value)); - // Guaranteed to be between [-1, 1]. - normalized_values(i) = value / std::max(updated_max_value, epsilon_); - // Saving the updated_max_values - updated_max_values(idx) = updated_max_value; - } - } -}; - - - - -REGISTER_KERNEL_BUILDER( - Name("SparseMaxNorm") - .Device(DEVICE_CPU), - SparseMaxNorm); - -REGISTER_KERNEL_BUILDER( - Name("SparseBatchNorm") - .Device(DEVICE_CPU), - SparseBatchNorm); - -REGISTER_KERNEL_BUILDER( - Name("SparseMaxNormInference") - .Device(DEVICE_CPU), - SparseMaxNormInference); - -REGISTER_KERNEL_BUILDER( - Name("SparseMaxNormTraining") - .Device(DEVICE_CPU), - SparseMaxNormTraining); diff --git a/twml/libtwml/src/ops/sparse_normalization.docx b/twml/libtwml/src/ops/sparse_normalization.docx new file mode 100644 index 0000000000000000000000000000000000000000..fca487ab1f4a597ecfdef1c7e3d907627b2d1fa0 GIT binary patch literal 39364 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/tensor_record.cpp b/twml/libtwml/src/ops/tensor_record.cpp deleted file mode 100644 index ad044e378..000000000 --- a/twml/libtwml/src/ops/tensor_record.cpp +++ /dev/null @@ -1,692 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -#include -#include "tensorflow_utils.h" -#include "resource_utils.h" - -#include -using std::string; - -REGISTER_OP("GetStringTensorsFromDataRecord") -.Attr("feature_id: int") -.Input("data_record_handle: resource") -.Output("ids: int64") -.Output("strings: string") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that decodes and returns string tensors from the data record. - -Attr - feature_id: The hashed id of the feature name. - -Input - data_record_handle: Resource handle to DataRecord. - -Outputs - ids: A 1D int64 tensor representing the input index in a given batch. - strings: A 1D string tensor representing the decoded strings from the batch. -)doc"); - -REGISTER_OP("GetStringTensorsFromHashedDataRecord") -.Attr("feature_id: int") -.Input("hashed_data_record_handle: resource") -.Output("ids: int64") -.Output("strings: string") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that decodes and returns string tensors from the hashed data record. - -Attr - feature_id: The hashed id of the feature name. - -Input - data_record_handle: Resource handle to DataRecord. - -Outputs - ids: A 1D int64 tensor representing the input index in a given batch. - strings: A 1D string tensor representing the decoded strings from the batch. -)doc"); - -template -class GetStringTensorsOp : public OpKernel { - private: - int64 feature_id; - - public: - explicit GetStringTensorsOp(OpKernelConstruction *context) - : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - } - - void Compute(OpKernelContext *context) override { - auto handle = getHandle(context, 0); - const int64 batch_size = static_cast(handle->records.size()); - const auto &records = handle->records; - - try { - int64 total_size = 0; - for (const auto &record : records) { - try { - const auto &tensor = record.getRawTensor(feature_id); - total_size += static_cast(tensor.getNumElements()); - } catch(const std::out_of_range &err) { - LOG(WARNING) << "Ignoring missing string tensor with key: " << feature_id << std::endl; - continue; - } - } - - twml::ThriftReader reader(nullptr); - TensorShape shape = {total_size}; - Tensor *strings_tensor = nullptr; - Tensor *ids_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, shape, &ids_tensor)); - OP_REQUIRES_OK(context, context->allocate_output(1, shape, &strings_tensor)); - - auto strings_data = strings_tensor->flat().data(); - auto ids_data = ids_tensor->flat().data(); - - for (int64 i = 0; i < batch_size; i++) { - const auto &record = records[i]; - try { - const twml::RawTensor &tensor = record.getRawTensor(feature_id); - const uint8_t *buffer = static_cast(tensor.getData()); - const int64 num_strings = static_cast(tensor.getNumElements()); - reader.setBuffer(buffer); - - for (int64 j = 0; j < num_strings; j++) { - const uint8_t *curr_begin = nullptr; - const auto curr_length = reader.getRawBuffer(&curr_begin); - strings_data[j] = std::string(curr_begin, curr_begin + curr_length); - ids_data[j] = i; - } - ids_data += num_strings; - strings_data += num_strings; - } catch(const std::out_of_range &err) { - continue; - } - } - } catch(const std::exception &err) { - context->CtxFailureWithWarning(errors::InvalidArgument(err.what())); - } - } -}; - -REGISTER_KERNEL_BUILDER( - Name("GetStringTensorsFromDataRecord") - .Device(DEVICE_CPU), - GetStringTensorsOp); - -REGISTER_KERNEL_BUILDER( - Name("GetStringTensorsFromHashedDataRecord") - .Device(DEVICE_CPU), - GetStringTensorsOp); - -REGISTER_OP("GetTensorsFromDataRecord") -.Attr("assert_shape: bool") -.Attr("feature_id: int") -.Input("data_record_handle: resource") -.Output("output: string") -.Output("out_shape: int64") -.Output("out_type: string") -.Output("out_endian: uint8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that decodes and returns tensors from the data record. - -Attr - feature_id: The hashed id of the feature name. - -Input - data_record_handle: Resource handle to DataRecord. - -Outputs - output: A 2D byte tensor representing the requested feature. - out_shape: A tensor containing [batch_size, thrift_shape]. - out_type: Output type returned as a string tensor of size 1. - out_endian: Endianness of the bytes returned a tensor of size 1. 0: litte, 1: big. -)doc"); - -REGISTER_OP("GetTensorsFromHashedDataRecord") -.Attr("assert_shape: bool") -.Attr("feature_id: int") -.Input("hashed_data_record_handle: resource") -.Output("output: string") -.Output("out_shape: int64") -.Output("out_type: string") -.Output("out_endian: uint8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that returns decodes and tensors from the hashed data record. - -Attr - feature_id: The hashed id of the feature name. - -Input - data_record_handle: Resource handle to DataRecord. - -Outputs - output: A 2D byte tensor representing the requested feature. - out_shape: A tensor containing [batch_size, thrift_shape]. - out_type: Output type returned as a string tensor of size 1. - out_endian: Endianness of the bytes returned a tensor of size 1. 0: litte, 1: big. -)doc"); - -template -class GetTensorsOp : public OpKernel { - private: - bool assert_shape; - int64 feature_id; - - public: - explicit GetTensorsOp(OpKernelConstruction *context) - : OpKernel(context), assert_shape(true) { - OP_REQUIRES_OK(context, context->GetAttr("assert_shape", &assert_shape)); - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - } - - void Compute(OpKernelContext *context) override { - auto handle = getHandle(context, 0); - uint64 batch_size = handle->records.size(); - const auto &records = handle->records; - - try { - TensorShape raw_shape = {static_cast(batch_size)}; - Tensor* output_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, raw_shape, &output_tensor)); - auto output_flat = output_tensor->flat(); - auto output_data = output_flat.data(); - - twml_type type = TWML_TYPE_UNKNOWN; - bool is_big_endian = false; - - std::vector shape(1, batch_size); - uint64 length = 0; - - for (auto record : records) { - const twml::RawTensor tensor = record.getRawTensor(feature_id); - const auto &curr_dims = tensor.getDims(); - const auto curr_type = tensor.getType(); - const bool curr_is_big_endian = tensor.is_big_endian(); - const uint64 curr_length = tensor.getRawLength(); - - // Create the output tensor based on first tensor - if (shape.size() == 1) { - // Push the shape of individual tensors into shape - shape.reserve(curr_dims.size() + 1); - shape.insert(shape.end(), curr_dims.begin(), curr_dims.end()); - type = curr_type; - is_big_endian = curr_is_big_endian; - length = curr_length; - - } else { - if (assert_shape) { - // Assert shape of all tensors is the same. - bool is_same_shape = std::equal(shape.begin() + 1, shape.end(), curr_dims.begin()); - - if (!is_same_shape || length != curr_length) { - throw std::runtime_error("TensorShape mismatch for feature_id: " - + std::to_string(feature_id)); - } - } - - // Assert type and endianness of all tensors is the same. - if (type != curr_type || is_big_endian != curr_is_big_endian) { - throw std::runtime_error("Tensor type mismatch for feature_id: " - + std::to_string(feature_id)); - } - } - - // Copy from datarecord to output - const uint8 *tensor_data = reinterpret_cast(tensor.getData()); - *output_data = std::string(tensor_data, tensor_data + curr_length); - - // Increment it for the next tensor in the batch. - output_data++; - } - - Tensor *shape_tensor = nullptr; - TensorShape shape_shape = {static_cast(shape.size())}; - OP_REQUIRES_OK(context, context->allocate_output(1, shape_shape, &shape_tensor)); - auto shape_flat = shape_tensor->flat(); - for (int i = 0; i < static_cast(shape.size()); i++) { - shape_flat(i) = shape[i]; - } - - Tensor* type_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(2, {}, &type_tensor)); - type_tensor->scalar()() = twml::getTypeName(type); - - Tensor* endian_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(3, {}, &endian_tensor)); - endian_tensor->scalar()() = is_big_endian; - } catch(const std::exception &err) { - context->CtxFailureWithWarning(errors::InvalidArgument(err.what())); - } - } -}; - -REGISTER_KERNEL_BUILDER( - Name("GetTensorsFromDataRecord") - .Device(DEVICE_CPU), - GetTensorsOp); - -REGISTER_KERNEL_BUILDER( - Name("GetTensorsFromHashedDataRecord") - .Device(DEVICE_CPU), - GetTensorsOp); - -REGISTER_OP("GetTensorsWithMissingMaskFromDataRecord") -.Attr("assert_shape: bool") -.Attr("feature_id: int") -.Attr("default_shape: list(int)") -.Attr("dtype_size: int") -.Input("data_record_handle: resource") -.Output("output: string") -.Output("out_type: string") -.Output("out_endian: uint8") -.Output("is_found: bool") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that decodes and returns tensors from the data record. - -Attr - assert_shape: Specifies if the shape needs to be same across the batch. - feature_id: The hashed id of the feature name. - default_shape: Expected shape of output tensor. - dtype_size: expected size of each element. - -Input - data_record_handle: Resource handle to DataRecord. - -Outputs - output: A 2D byte tensor representing the requested feature. - out_type: A string tensor represnting the type. - out_endian: Endianness of the bytes returned a tensor of size 1. 0: litte, 1: big. - is_missing: A boolean tensor of length batch_size represnting if the tensor was found for an input. -)doc"); - -REGISTER_OP("GetTensorsWithMissingMaskFromHashedDataRecord") -.Attr("assert_shape: bool") -.Attr("feature_id: int") -.Attr("default_shape: list(int)") -.Attr("dtype_size: int") -.Input("hashed_data_record_handle: resource") -.Output("output: string") -.Output("out_type: string") -.Output("out_endian: uint8") -.Output("is_found: bool") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that decodes and returns tensors from the data record. - -Attr - assert_shape: Specifies if the shape needs to be same across the batch. - feature_id: The hashed id of the feature name. - default_shape: Expected shape of output tensor. - dtype_size: expected size of each element. - -Input - hashed_data_record_handle: Resource handle to HashedDataRecord. - -Outputs - output: A 2D byte tensor representing the requested feature. - out_type: A string tensor represnting the type. - out_endian: Endianness of the bytes returned a tensor of size 1. 0: litte, 1: big. - is_missing: A boolean tensor of length batch_size represnting if the tensor was found for an input. -)doc"); - -template -class GetTensorsWithMissingMaskOp : public OpKernel { - private: - bool assert_shape; - int64 feature_id; - int64 dtype_size; - std::vector shape; - - public: - explicit GetTensorsWithMissingMaskOp(OpKernelConstruction *context) - : OpKernel(context), assert_shape(true) { - OP_REQUIRES_OK(context, context->GetAttr("assert_shape", &assert_shape)); - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - OP_REQUIRES_OK(context, context->GetAttr("default_shape", &shape)); - OP_REQUIRES_OK(context, context->GetAttr("dtype_size", &dtype_size)); - } - - void Compute(OpKernelContext *context) override { - auto handle = getHandle(context, 0); - uint64 batch_size = handle->records.size(); - const auto &records = handle->records; - - try { - TensorShape raw_shape = {static_cast(batch_size)}; - Tensor* output_tensor = nullptr; - Tensor* is_found_tensor = nullptr; - - OP_REQUIRES_OK(context, context->allocate_output(0, raw_shape, &output_tensor)); - OP_REQUIRES_OK(context, context->allocate_output(3, raw_shape, &is_found_tensor)); - - auto output_flat = output_tensor->flat(); - auto output_data = output_flat.data(); - auto is_found_data = is_found_tensor->flat().data(); - - twml_type type = TWML_TYPE_UNKNOWN; - bool is_big_endian = false; - - uint64 length = std::accumulate(shape.begin(), shape.end(), dtype_size, std::multiplies()); - for (auto record : records) { - try { - const twml::RawTensor tensor = record.getRawTensor(feature_id); - const auto &curr_dims = tensor.getDims(); - const auto curr_type = tensor.getType(); - const bool curr_is_big_endian = tensor.is_big_endian(); - const uint64 curr_length = tensor.getRawLength(); - - if (type == TWML_TYPE_UNKNOWN) { - type = curr_type; - is_big_endian = curr_is_big_endian; - // FloatTensors are stored as a list of doubles. - // If the requested dtype_size is 4, update the length. - // NOTE: All the missing tensors before this have wrong length, this is fixed at the end. - if (type == TWML_TYPE_DOUBLE && is_big_endian && dtype_size == 4) { - length = length * 2; - } - } else { - // Assert type and endianness of all tensors is the same. - if (type != curr_type || is_big_endian != curr_is_big_endian) { - throw std::runtime_error("Tensor type mismatch for feature_id: " - + std::to_string(feature_id)); - } - } - - // Assert shape of all tensors is the same. - if (assert_shape && type != TWML_TYPE_UNKNOWN) { - // Assert shape of all tensors is the same. - bool is_same_shape = std::equal(shape.begin(), shape.end(), curr_dims.begin()); - - if (!is_same_shape || length != curr_length) { - throw std::runtime_error("TensorShape mismatch for feature_id: " - + std::to_string(feature_id)); - } - } - - // Copy from datarecord to output - const uint8 *tensor_data = reinterpret_cast(tensor.getData()); - *output_data = std::string(tensor_data, tensor_data + curr_length); - *is_found_data = true; - } catch(const std::out_of_range &err) { - *output_data = std::string(); - output_data->resize(length); - *is_found_data = false; - } - - // Increment it for the next tensor in the batch. - output_data++; - is_found_data++; - } - - // Reset pointers to the beginning - output_data = output_flat.data(); - is_found_data = is_found_tensor->flat().data(); - - // Resize any missing tensors before type (and hence true length) was known. - if (type == TWML_TYPE_DOUBLE) { - for (int64 i = 0; i < static_cast(records.size()); i++) { - if (!is_found_data[i]) { - output_data[i].resize(length); - } - } - } - - Tensor* type_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(1, {}, &type_tensor)); - type_tensor->scalar()() = twml::getTypeName(type); - - Tensor* endian_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(2, {}, &endian_tensor)); - endian_tensor->scalar()() = is_big_endian; - } catch(const std::exception &err) { - context->CtxFailureWithWarning(errors::InvalidArgument(err.what())); - } - } -}; - -REGISTER_KERNEL_BUILDER( - Name("GetTensorsWithMissingMaskFromDataRecord") - .Device(DEVICE_CPU), - GetTensorsWithMissingMaskOp); - -REGISTER_KERNEL_BUILDER( - Name("GetTensorsWithMissingMaskFromHashedDataRecord") - .Device(DEVICE_CPU), - GetTensorsWithMissingMaskOp); - -REGISTER_OP("GetSparseTensorsFromDataRecord") -.Attr("feature_id: int") -.Input("data_record_handle: resource") -.Output("ids: int64") -.Output("indices: string") -.Output("values: string") -.Output("dense_shape: int64") -.Output("values_type: string") -.Output("valueendian: uint8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that decodes and returns tensors from the data record. - -Attr - feature_id: The hashed id of the feature name. - -Input - data_record_handle: Resource handle to DataRecord. - -Outputs - ids: A 1D tensor representing which input in the batch the value belongs to. - indices: An string tensor containing indices of the sparse tensor as bytes. - values: An string tensor containing values of the sparse tensor as bytes. - dense_shape: A tensor containing [batch_size, thrift_shape]. - values_type: The data type of value tensor returned as a string tensor of size 1. - values_endian: Endianness of the bytes returned a tensor of size 1. 0: litte, 1: big. -)doc"); - -REGISTER_OP("GetSparseTensorsFromHashedDataRecord") -.Attr("feature_id: int") -.Input("hashed_data_record_handle: resource") -.Output("ids: int64") -.Output("indices: string") -.Output("values: string") -.Output("dense_shape: int64") -.Output("values_type: string") -.Output("values_endian: uint8") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - return Status::OK(); - }).Doc(R"doc( -A tensorflow OP that decodes and returns tensors from the data record. - -Attr - feature_id: The hashed id of the feature name. - -Input - data_record_handle: Resource handle to DataRecord. - -Outputs - ids: A 1D tensor representing which input in the batch the value belongs to. - indices: An string tensor containing indices of the sparse tensor as bytes. - values: An string tensor containing values of the sparse tensor as bytes. - dense_shape: A tensor containing [batch_size, thrift_shape]. - values_type: The data type of value tensor returned as a string tensor of size 1. - values_endian: Endianness of the bytes returned a tensor of size 1. 0: litte, 1: big. -)doc"); - -template -class GetSparseTensorsOp : public OpKernel { - private: - int64 feature_id; - - public: - explicit GetSparseTensorsOp(OpKernelConstruction *context) - : OpKernel(context) { - OP_REQUIRES_OK(context, context->GetAttr("feature_id", &feature_id)); - } - - void Compute(OpKernelContext *context) override { - auto handle = getHandle(context, 0); - const int64 batch_size = static_cast(handle->records.size()); - const auto &records = handle->records; - - try { - twml_type type = TWML_TYPE_UNKNOWN; - bool is_big_endian = false; - - std::vector shape(1, batch_size); - - int64 total_length = 0; - std::vector lengths; - lengths.reserve(batch_size); - - int64 total_indices_length = 0; - std::vector indices_raw_lengths; - std::vector indices_data_ptrs; - indices_raw_lengths.reserve(batch_size); - indices_data_ptrs.reserve(batch_size); - - int64 total_values_length = 0; - std::vector values_raw_lengths; - std::vector values_data_ptrs; - values_raw_lengths.reserve(batch_size); - values_data_ptrs.reserve(batch_size); - - for (auto record : records) { - const twml::RawSparseTensor sparse_tensor = record.getRawSparseTensor(feature_id); - const twml::RawTensor indices = sparse_tensor.indices(); - const twml::RawTensor values = sparse_tensor.values(); - const auto &dense_shape = sparse_tensor.denseShape(); - const auto indices_type = indices.getType(); - const auto indices_is_big_endian = indices.is_big_endian(); - const auto values_type = values.getType(); - const bool values_is_big_endian = values.is_big_endian(); - - const uint64 indices_length = indices.getDims().back(); - const uint64 values_length = values.getDims().back(); - - auto indices_raw_length = indices.getRawLength(); - auto values_raw_length = values.getRawLength(); - - auto indices_data_ptr = reinterpret_cast(indices.getData()); - auto values_data_ptr = reinterpret_cast(values.getData()); - - indices_raw_lengths.push_back(indices_raw_length); - values_raw_lengths.push_back(values_raw_length); - - indices_data_ptrs.push_back(indices_data_ptr); - values_data_ptrs.push_back(values_data_ptr); - - total_indices_length += indices_raw_length; - total_values_length += values_raw_length; - - if (shape.size() == 1) { - shape.reserve(dense_shape.size() + 1); - shape.insert(shape.end(), dense_shape.begin(), dense_shape.end()); - type = values_type; - is_big_endian = values_is_big_endian; - } - - // Assert shape of all tensors is the same. - if (!std::equal(shape.begin() + 1, shape.end(), dense_shape.begin())) { - throw std::runtime_error("dense_shape of sparse tensors doesn't match for feature_id: " - + std::to_string(feature_id)); - } - // Assert type of all values tensor is the same. - if (type != values_type || is_big_endian != values_is_big_endian) { - throw std::runtime_error("The type of values do not match for feature_id: " - + std::to_string(feature_id)); - } - // Assert indices tensor is big endian and of type INT64. - if (indices_type != TWML_TYPE_INT64 || !indices_is_big_endian) { - throw std::runtime_error("Unexpected type for index tensor for feature_id: " - + std::to_string(feature_id)); - } - - if (indices_length != values_length) { - throw std::runtime_error("The length of values and indices does not match for : " - + std::to_string(feature_id)); - } - - lengths.push_back(indices_length); - total_length += indices_length; - } - - Tensor* ids_tensor = nullptr; - TensorShape ids_shape = {static_cast(total_length)}; - OP_REQUIRES_OK(context, context->allocate_output(0, ids_shape, &ids_tensor)); - auto ids_tensor_flat = ids_tensor->flat(); - auto ids_tensor_data = ids_tensor_flat.data(); - - TensorShape raw_shape = {static_cast(1)}; - - Tensor* indices_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(1, raw_shape, &indices_tensor)); - auto indices_tensor_flat = indices_tensor->flat(); - auto indices_tensor_string = indices_tensor_flat.data(); - indices_tensor_string->resize(total_indices_length); - auto indices_tensor_iter = indices_tensor_string->begin(); - - Tensor* values_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(2, raw_shape, &values_tensor)); - auto values_tensor_flat = values_tensor->flat(); - auto values_tensor_string = values_tensor_flat.data(); - values_tensor_string->resize(total_values_length); - auto values_tensor_iter = values_tensor_string->begin(); - - for (int64 i = 0; i < batch_size; i++) { - // Fill in the data for id == i for all values in the current input. - std::fill(ids_tensor_data, ids_tensor_data + lengths[i], i); - ids_tensor_data += lengths[i]; - - indices_tensor_iter = std::copy(indices_data_ptrs[i], - indices_data_ptrs[i] + indices_raw_lengths[i], - indices_tensor_iter); - - values_tensor_iter = std::copy(values_data_ptrs[i], - values_data_ptrs[i] + values_raw_lengths[i], - values_tensor_iter); - } - - Tensor *shape_tensor = nullptr; - TensorShape shape_shape = {static_cast(shape.size())}; - OP_REQUIRES_OK(context, context->allocate_output(3, shape_shape, &shape_tensor)); - auto shape_flat = shape_tensor->flat(); - for (int i = 0; i < static_cast(shape.size()); i++) { - shape_flat(i) = shape[i]; - } - - Tensor* type_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(4, {}, &type_tensor)); - type_tensor->scalar()() = twml::getTypeName(type); - - Tensor* endian_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(5, {}, &endian_tensor)); - endian_tensor->scalar()() = is_big_endian; - } catch(const std::exception &err) { - context->CtxFailureWithWarning(errors::InvalidArgument(err.what())); - } - } -}; - -REGISTER_KERNEL_BUILDER( - Name("GetSparseTensorsFromDataRecord") - .Device(DEVICE_CPU), - GetSparseTensorsOp); - -REGISTER_KERNEL_BUILDER( - Name("GetSparseTensorsFromHashedDataRecord") - .Device(DEVICE_CPU), - GetSparseTensorsOp); diff --git a/twml/libtwml/src/ops/tensor_record.docx b/twml/libtwml/src/ops/tensor_record.docx new file mode 100644 index 0000000000000000000000000000000000000000..708a8b7bcd4f0d7b10bef7e1be0518341642dd67 GIT binary patch literal 41543 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 P(gXlg#PAr){&n;}!h0KT literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/tensorflow_utils.cpp b/twml/libtwml/src/ops/tensorflow_utils.cpp deleted file mode 100644 index 95ebc7e4c..000000000 --- a/twml/libtwml/src/ops/tensorflow_utils.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include "tensorflow_utils.h" -#include -#include - -twml::Tensor TFTensor_to_twml_tensor(Tensor &input) { - int ndims = input.dims(); - std::vector dims(ndims); - std::vector strides(ndims); - for (int i = 0; i < ndims; i++) { - dims[i] = input.dim_size(i); - } - uint64_t stride = 1; - for (int i = ndims-1; i >= 0; i--) { - strides[i] = stride; - stride *= dims[i]; - } - - switch (input.dtype()) { - case DT_INT8: - return twml::Tensor(input.flat().data(), dims, strides, TWML_TYPE_INT8); - case DT_UINT8: - return twml::Tensor(input.flat().data(), dims, strides, TWML_TYPE_UINT8); - case DT_INT32: - return twml::Tensor(input.flat().data(), dims, strides, TWML_TYPE_INT32); - case DT_INT64: - return twml::Tensor(input.flat().data(), dims, strides, TWML_TYPE_INT64); - case DT_FLOAT: - return twml::Tensor(input.flat().data(), dims, strides, TWML_TYPE_FLOAT); - case DT_DOUBLE: - return twml::Tensor(input.flat().data(), dims, strides, TWML_TYPE_DOUBLE); - case DT_BOOL: - return twml::Tensor(input.flat().data(), dims, strides, TWML_TYPE_BOOL); - case DT_STRING: - return twml::Tensor(input.flat().data(), dims, strides, TWML_TYPE_STRING); - default: - throw twml::Error(TWML_ERR_TYPE, "Unknown tensor data type."); - break; - } -} - -const twml::Tensor TFTensor_to_twml_tensor(const Tensor &input) { - // TODO: define some type of constant tensor, which should be used for inputs to force not - // changing - return TFTensor_to_twml_tensor(const_cast(input)); -} - -twml::RawTensor TFTensor_to_twml_raw_tensor(Tensor &input) { - int ndims = input.dims(); - std::vector dims(ndims); - std::vector strides(ndims); - for (int i = 0; i < ndims; i++) { - dims[i] = input.dim_size(i); - } - uint64_t stride = 1; - for (int i = ndims-1; i >= 0; i--) { - strides[i] = stride; - stride *= dims[i]; - } - - switch (input.dtype()) { - case DT_INT8: - return twml::RawTensor(input.flat().data(), dims, strides, TWML_TYPE_INT8, false, input.flat().size()); - case DT_UINT8: - return twml::RawTensor(input.flat().data(), dims, strides, TWML_TYPE_UINT8, false, input.flat().size()); - case DT_INT32: - return twml::RawTensor(input.flat().data(), dims, strides, TWML_TYPE_INT32, false, input.flat().size()); - case DT_INT64: - return twml::RawTensor(input.flat().data(), dims, strides, TWML_TYPE_INT64, false, input.flat().size()); - case DT_FLOAT: - return twml::RawTensor(input.flat().data(), dims, strides, TWML_TYPE_FLOAT, false, input.flat().size()); - case DT_DOUBLE: - return twml::RawTensor(input.flat().data(), dims, strides, TWML_TYPE_DOUBLE, false, input.flat().size()); - case DT_BOOL: - return twml::RawTensor(input.flat().data(), dims, strides, TWML_TYPE_BOOL, false, input.flat().size()); - case DT_STRING: - return twml::RawTensor(input.flat().data(), dims, strides, TWML_TYPE_STRING, false, input.flat().size()); - default: - throw twml::Error(TWML_ERR_TYPE, "Unknown tensor data type."); - break; - } -} - -const twml::RawTensor TFTensor_to_twml_raw_tensor(const Tensor &input) { - // TODO: define some type of constant tensor, which should be used for inputs to force not - // changing - return TFTensor_to_twml_raw_tensor(const_cast(input)); -} diff --git a/twml/libtwml/src/ops/tensorflow_utils.docx b/twml/libtwml/src/ops/tensorflow_utils.docx new file mode 100644 index 0000000000000000000000000000000000000000..9a21a5893147679b1268aaf981f3f11ce7107786 GIT binary patch literal 36787 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/ops/tensorflow_utils.h b/twml/libtwml/src/ops/tensorflow_utils.h deleted file mode 100644 index 4940f680d..000000000 --- a/twml/libtwml/src/ops/tensorflow_utils.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/op_kernel.h" -#include "tensorflow/core/framework/shape_inference.h" -#include - -using namespace tensorflow; -twml::Tensor TFTensor_to_twml_tensor(Tensor &input); -twml::RawTensor TFTensor_to_twml_raw_tensor(Tensor &input); -const twml::Tensor TFTensor_to_twml_tensor(const Tensor &input); -const twml::RawTensor TFTensor_to_twml_raw_tensor(const Tensor &input); - diff --git a/twml/libtwml/src/ops/var_length_reader.cpp b/twml/libtwml/src/ops/var_length_reader.cpp deleted file mode 100644 index 62b5fc2a1..000000000 --- a/twml/libtwml/src/ops/var_length_reader.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "tensorflow/core/framework/op.h" -#include "tensorflow/core/framework/shape_inference.h" -#include "tensorflow/core/framework/op_kernel.h" - -using namespace tensorflow; - -REGISTER_OP("VarLengthReader") -.Input("input1: int32") -.Output("output: int32") -.SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) { - ::tensorflow::shape_inference::ShapeHandle input; - // check that input has only 1 dimension. - TF_RETURN_IF_ERROR(c->WithRank(c->input(0), 1, &input)); - // there's no inference on output shape. - return Status::OK(); - }); - - -class VarLengthReaderOp : public OpKernel { - public: - explicit VarLengthReaderOp(OpKernelConstruction* context) : OpKernel(context) {} - - void Compute(OpKernelContext* context) override { - // Grab the input tensor - const Tensor& input_tensor = context->input(0); - auto input = input_tensor.flat(); - - // get the first element in the input tensor, use it as output shape. - int32 len = input(0); - TensorShape output_shape = {1, len}; - - // Create an output tensor, the size is determined by the content of input. - Tensor* output_tensor = nullptr; - OP_REQUIRES_OK(context, context->allocate_output(0, output_shape, &output_tensor)); - - auto output_flat = output_tensor->flat(); - - // Fill output with ones. - const int N = output_flat.size(); - for (int i = 0; i < N; i++) { - output_flat(i) = 1; - } - } -}; - -REGISTER_KERNEL_BUILDER(Name("VarLengthReader").Device(DEVICE_CPU), VarLengthReaderOp); diff --git a/twml/libtwml/src/ops/var_length_reader.docx b/twml/libtwml/src/ops/var_length_reader.docx new file mode 100644 index 0000000000000000000000000000000000000000..5775c0039a4a2f59a6fd5f94735b70021cc09664 GIT binary patch literal 37411 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 - for a list and description of all cmd-line arguments. - - Args: - learning_rate_decay: - Defaults to False. When True, parses learning rate decay arguments. - - Returns: - argparse.ArgumentParser instance with some useful args already added. - """ - parser = twml.DefaultSubcommandArgParse(formatter_class=SortingHelpFormatter) - - parser.add_argument( - "--save_dir", type=str, default=tempfile.mkdtemp(), - help="Path to the training result directory." - "supports local filesystem path and hdfs://default/ which requires " - "setting HDFS configuration via env variable HADOOP_CONF_DIR ") - parser.add_argument( - "--export_dir", type=str, default=None, - help="Path to the directory to export a SavedModel for prediction servers.") - parser.add_argument( - "--log_aggregation_app_id", type=str, default=None, - help="specify app_id for log aggregation. disabled by default.") - parser.add_argument( - "--train.batch_size", "--train_batch_size", type=int, default=32, - dest='train_batch_size', - help="number of samples per training batch") - parser.add_argument( - "--eval.batch_size", "--eval_batch_size", type=int, default=32, - dest='eval_batch_size', - help="number of samples per cross-validation batch. Defaults to train_batch_size") - parser.add_argument( - "--train.learning_rate", "--learning_rate", type=float, default=0.002, - dest='learning_rate', - help="learning rate. Scales the gradient update.") - parser.add_argument( - "--train.steps", "--train_steps", type=int, default=-1, - dest='train_steps', - help="number of training batches before running evaluation." - "Defaults to -1 (runs through entire dataset). " - "Only used for Trainer.[train,learn]. " - "For Trainer.train_and_evaluate, use train.max_steps instead. ") - parser.add_argument( - "--eval.steps", "--eval_steps", type=int, default=-1, - dest="eval_steps", - help="number of steps per evaluation. Each batch is a step." - "Defaults to -1 (runs through entire dataset). ") - parser.add_argument( - "--eval.period", "--eval_period", type=int, default=600, - dest="eval_period", - help="Trainer.train_and_evaluate waits for this long after each evaluation. " - "Defaults to 600 seconds (evaluate every ten minutes). " - "Note that anything lower than 10*60seconds is probably a bad idea because TF saves " - "checkpoints every 10mins by default. eval.delay is time to wait before doing first eval. " - "eval.period is time between successive evals.") - parser.add_argument( - "--eval.delay", "--eval_delay", type=int, default=120, - dest="eval_delay", - help="Trainer.train_and_evaluate waits for this long before performing the first evaluation" - "Defaults to 120 seconds (evaluate after first 2 minutes of training). " - "eval.delay is time to wait before doing first eval. " - "eval.period is time between successive evals.") - parser.add_argument( - "--train.max_steps", "--train_max_steps", type=int, default=None, - dest="train_max_steps", - help="Stop training after this many global steps. Each training batch is its own step." - "If set to None, step after one train()/evaluate() call. Useful when train.steps=-1." - "If set to a non-positive value, loop forever. Usually useful with early stopping.") - parser.add_argument( - "--train.log_metrics", dest="train_log_metrics", action="store_true", default=False, - help="Set this to true to see metrics during training. " - "WARNING: metrics during training does not represent model performance. " - "WARNING: use for debugging only as this slows down training.") - parser.add_argument( - "--train.early_stop_patience", "--early_stop_patience", type=int, default=-1, - dest="early_stop_patience", - help="max number of evaluations (epochs) to wait for an improvement in the early_stop_metric." - "Defaults to -1 (no early-stopping)." - "NOTE: This can not be enabled when --distributed is also set.") - parser.add_argument( - "--train.early_stop_tolerance", "--early_stop_tolerance", type=float, default=0, - dest="early_stop_tolerance", - help="a non-negative tolerance for comparing early_stop_metric." - "e.g. when maximizing the condition is current_metric > best_metric + tolerance." - "Defaults to 0.") - parser.add_argument( - "--train.dataset_shards", "--train_dataset_shards", - dest="train_dataset_shards", - type=int, default=None, - help="An int value that indicates the number of partitions (shards) for the dataset. This is" - " useful for codistillation and other techniques that require each worker to train on disjoint" - " partitions of the dataset.") - parser.add_argument( - "--train.dataset_shard_index", "--train_dataset_shard_index", - dest="train_dataset_shard_index", - type=int, default=None, - help="An int value (starting at zero) that indicates which partition (shard) of the dataset" - " to use if --train.dataset_shards is set.") - parser.add_argument( - "--continue_from_checkpoint", dest="continue_from_checkpoint", action="store_true", - help="DEPRECATED. This option is currently a no-op." - " Continuing from the provided checkpoint is now the default." - " Use --overwrite_save_dir if you would like to override it instead" - " and restart training from scratch.") - parser.add_argument( - "--overwrite_save_dir", dest="overwrite_save_dir", action="store_true", - help="Delete the contents of the current save_dir if it exists") - parser.add_argument( - "--data_threads", "--num_threads", type=int, default=2, - dest="num_threads", - help="Number of threads to use for loading the dataset. " - "num_threads is deprecated and to be removed in future versions. Use data_threads.") - parser.add_argument( - "--max_duration", "--max_duration", type=float, default=None, - dest="max_duration", - help="Maximum duration (in secs) that training/validation will be allowed to run for before being automatically terminated.") - parser.add_argument( - "--num_workers", type=int, default=None, - help="Number of workers to use when training in hogwild manner on a single node.") - parser.add_argument( - "--distributed", dest="distributed", action="store_true", - help="Pass this flag to use train_and_evaluate to train in a distributed fashion" - "NOTE: You can not use early stopping when --distributed is enabled" - ) - parser.add_argument( - "--distributed_training_cleanup", - dest="distributed_training_cleanup", - action="store_true", - help="Set if using distributed training on GKE to stop TwitterSetDeployment" - "from continuing training upon restarts (will be deprecated once we migrate off" - "TwitterSetDeployment for distributed training on GKE)." - ) - parser.add_argument( - "--disable_auto_ps_shutdown", default=False, action="store_true", - help="Disable the functionality of automatically shutting down parameter server after " - "distributed training complete (either succeed or failed)." - ) - parser.add_argument( - "--disable_tensorboard", default=False, action="store_true", - help="Do not start the TensorBoard server." - ) - parser.add_argument( - "--tensorboard_port", type=int, default=None, - help="Port for tensorboard to run on. Ignored if --disable_tensorboard is set.") - parser.add_argument( - "--health_port", type=int, default=None, - help="Port to listen on for health-related endpoints (e.g. graceful shutdown)." - "Not user-facing as it is set automatically by the twml_cli." - ) - parser.add_argument( - "--stats_port", type=int, default=None, - help="Port to listen on for stats endpoints" - ) - parser.add_argument( - "--experiment_tracking_path", - dest="experiment_tracking_path", - type=str, default=None, - help="The tracking path of this experiment. Format: \ - user_name:project_name:experiment_name:run_name. The path is used to track and display \ - a record of this experiment on ML Dashboard. Note: this embedded experiment tracking is \ - disabled when the deprecated Model Repo TrackRun is used in your model config. ") - parser.add_argument( - "--disable_experiment_tracking", - dest="disable_experiment_tracking", - action="store_true", - help="Whether experiment tracking should be disabled.") - parser.add_argument( - "--config.save_checkpoints_secs", "--save_checkpoints_secs", type=int, default=600, - dest='save_checkpoints_secs', - help="Configures the tf.estimator.RunConfig.save_checkpoints_secs attribute. " - "Specifies how often checkpoints are saved in seconds. Defaults to 10*60 seconds.") - parser.add_argument( - "--config.keep_checkpoint_max", "--keep_checkpoint_max", type=int, default=20, - dest='keep_checkpoint_max', - help="Configures the tf.estimator.RunConfig.keep_checkpoint_max attribute. " - "Specifies how many checkpoints to keep. Defaults to 20.") - parser.add_argument( - "--config.tf_random_seed", "--tf_random_seed", type=int, default=None, - dest='tf_random_seed', - help="Configures the tf.estimator.RunConfig.tf_random_seed attribute. " - "Specifies the seed to use. Defaults to None.") - parser.add_argument( - "--optimizer", type=str, default='SGD', - help="Optimizer to use: SGD (Default), Adagrad, Adam, Ftrl, Momentum, RMSProp, LazyAdam, DGC.") - parser.add_argument( - "--gradient_noise_scale", type=float, default=None, - help="adds 0-mean normal noise scaled by this value. Defaults to None.") - parser.add_argument( - "--clip_gradients", type=float, default=None, - help="If specified, a global clipping is applied to prevent " - "the norm of the gradient to exceed this value. Defaults to None.") - parser.add_argument( - "--dgc.density", "--dgc_density", type=float, default=0.1, - dest="dgc_density", - help="Specifies gradient density level when using deep gradient compression optimizer." - "E.g., default value being 0.1 means that only top 10%% most significant rows " - "(based on absolute value sums) are kept." - ) - parser.add_argument( - "--dgc.density_decay", "--dgc_density_decay", type=bool, default=True, - dest="dgc_density_decay", - help="Specifies whether to (exponentially) decay the gradient density level when" - " doing gradient compression. If set 'False', the 'density_decay_steps', " - "'density_decay_rate' and 'min_density' arguments will be ignored." - ) - parser.add_argument( - "--dgc.density_decay_steps", "--dgc_density_decay_steps", type=int, default=10000, - dest="dgc_density_decay_steps", - help="Specifies the step interval to perform density decay." - ) - parser.add_argument( - "--dgc.density_decay_rate", "--dgc_density_decay_rate", type=float, default=0.5, - dest="dgc_density_decay_rate", - help="Specifies the decay rate when perfoming density decay." - ) - parser.add_argument( - "--dgc.min_density", "--dgc_min_density", type=float, default=0.1, - dest="dgc_min_density", - help="Specifies the minimum density level when perfoming density decay." - ) - parser.add_argument( - "--dgc.accumulation", "--dgc_accumulation", type=bool, default=False, - dest="dgc_accumulation", - help="Specifies whether to accumulate small gradients when using deep gradient compression " - "optimizer." - ) - parser.add_argument( - "--show_optimizer_summaries", dest="show_optimizer_summaries", action="store_true", - help="When specified, displays gradients and learning rate in tensorboard." - "Turning it on has 10-20%% performance hit. Enable for debugging only") - - parser.add_argument( - "--num_mkl_threads", dest="num_mkl_threads", default=1, type=int, - help="Specifies how many threads to use for MKL" - "inter_op_ parallelism_threds is set to TWML_NUM_CPUS / num_mkl_threads." - "intra_op_parallelism_threads is set to num_mkl_threads.") - - parser.add_argument("--verbosity", type=_set_log_level, choices=LOG_LEVELS.keys(), default=None, - help="Sets log level to a given verbosity.") - - parser.add_argument( - "--feature_importance.algorithm", dest="feature_importance_algorithm", - type=str, default=TREE, choices=[SERIAL, TREE], - help=""" - There are two algorithms that the module supports, `serial` and `tree`. - The `serial` algorithm computes feature importances for each feature, and - the `tree` algorithm groups features by feature name prefix, computes feature - importances for groups of features, and then only 'zooms-in' on a group when the - importance is greater than the `--feature_importance.sensitivity` value. The `tree` algorithm - will usually run faster, but for relatively unimportant features it will only compute an - upper bound rather than an exact importance value. We suggest that users generally stick - to the `tree` algorithm, unless if they have a very small number of features or - near-random model performance. - """) - - parser.add_argument( - "--feature_importance.sensitivity", dest="feature_importance_sensitivity", type=float, default=0.03, - help=""" - The maximum amount that permuting a feature group can cause the model performance (determined - by `feature_importance.metric`) to drop before the algorithm decides to not expand the feature - group. This is only used for the `tree` algorithm. - """) - - parser.add_argument( - "--feature_importance.dont_build_tree", dest="dont_build_tree", action="store_true", default=False, - help=""" - If True, don't build the feature trie for the tree algorithm and only use the extra_groups - """) - - parser.add_argument( - "--feature_importance.split_feature_group_on_period", dest="split_feature_group_on_period", action="store_true", default=False, - help="If true, split feature groups by the period rather than the optimal prefix. Only used for the TREE algorithm") - - parser.add_argument( - "--feature_importance.example_count", dest="feature_importance_example_count", type=int, default=10000, - help=""" - The number of examples used to compute feature importance. - Larger values yield more reliable results, but also take longer to compute. - These records are loaded into memory. This number is agnostic to batch size. - """) - - parser.add_argument( - "--feature_importance.data_dir", dest="feature_importance_data_dir", type=str, default=None, - help="Path to the dataset used to compute feature importance." - "supports local filesystem path and hdfs://default/ which requires " - "setting HDFS configuration via env variable HADOOP_CONF_DIR " - "Defaults to eval_data_dir") - - parser.add_argument( - "--feature_importance.metric", dest="feature_importance_metric", type=str, default="roc_auc", - help="The metric used to determine when to stop expanding the feature importance tree. This is only used for the `tree` algorithm.") - - parser.add_argument( - "--feature_importance.is_metric_larger_the_better", dest="feature_importance_is_metric_larger_the_better", action="store_true", default=False, - help="If true, interpret `--feature_importance.metric` to be a metric where larger values are better (e.g. ROC_AUC)") - - parser.add_argument( - "--feature_importance.is_metric_smaller_the_better", dest="feature_importance_is_metric_smaller_the_better", action="store_true", default=False, - help="If true, interpret `--feature_importance.metric` to be a metric where smaller values are better (e.g. LOSS)") - - subparsers = parser.add_subparsers(help='Learning Rate Decay Functions. Can only pass 1.' - 'Should be specified after all the optional arguments' - 'and followed by its specific args' - 'e.g. --learning_rate 0.01 inverse_learning_rate_decay_fn' - ' --decay_rate 0.0004 --min_learning_rate 0.001', - dest='learning_rate_decay') - - # Create the parser for the "exponential_learning_rate_decay_fn" - parser_exponential = subparsers.add_parser('exponential_learning_rate_decay', - help='Exponential learning rate decay. ' - 'Exponential decay implements:' - 'decayed_learning_rate = learning_rate * ' - 'exponential_decay_rate ^ ' - '(global_step / decay_steps') - parser_exponential.add_argument( - "--decay_steps", type=float, default=None, - help="Required for 'exponential' learning_rate_decay.") - parser_exponential.add_argument( - "--exponential_decay_rate", type=float, default=None, - help="Required for 'exponential' learning_rate_decay. Must be positive. ") - - # Create the parser for the "polynomial_learning_rate_decay_fn" - parser_polynomial = subparsers.add_parser('polynomial_learning_rate_decay', - help='Polynomial learning rate decay. ' - 'Polynomial decay implements: ' - 'global_step = min(global_step, decay_steps)' - 'decayed_learning_rate = ' - '(learning_rate - end_learning_rate) * ' - '(1 - global_step / decay_steps) ^ ' - '(polynomial_power) + end_learning_rate' - 'So for linear decay you can use a ' - 'polynomial_power=1 (the default)') - parser_polynomial.add_argument( - "--end_learning_rate", type=float, default=0.0001, - help="Required for 'polynomial' learning_rate_decay (ignored otherwise).") - parser_polynomial.add_argument( - "--polynomial_power", type=float, default=0.0001, - help="Required for 'polynomial' learning_rate_decay." - "The power of the polynomial. Defaults to linear, 1.0.") - parser_polynomial.add_argument( - "--decay_steps", type=float, default=None, - help="Required for 'polynomial' learning_rate_decay. ") - - # Create the parser for the "piecewise_constant_learning_rate_decay_fn" - parser_piecewise_constant = subparsers.add_parser('piecewise_constant_learning_rate_decay', - help='Piecewise Constant ' - 'learning rate decay. ' - 'For piecewise_constant, ' - 'consider this example: ' - 'We want to use a learning rate ' - 'that is 1.0 for' - 'the first 100000 steps,' - '0.5 for steps 100001 to 110000, ' - 'and 0.1 for any additional steps. ' - 'To do so, specify ' - '--piecewise_constant_boundaries=100000,110000' - '--piecewise_constant_values=1.0,0.5,0.1') - parser_piecewise_constant.add_argument( - "--piecewise_constant_values", - action=parse_comma_separated_list(element_type=float), - default=None, - help="Required for 'piecewise_constant_values' learning_rate_decay. " - "A list of comma seperated floats or ints that specifies the values " - "for the intervals defined by boundaries. It should have one more " - "element than boundaries.") - parser_piecewise_constant.add_argument( - "--piecewise_constant_boundaries", - action=parse_comma_separated_list(element_type=int), - default=None, - help="Required for 'piecewise_constant_values' learning_rate_decay. " - "A list of comma seperated integers, with strictly increasing entries.") - - # Create the parser for the "inverse_learning_rate_decay_fn" - parser_inverse = subparsers.add_parser('inverse_learning_rate_decay', - help='Inverse Leaning rate decay. ' - 'Inverse implements:' - 'decayed_lr = max(lr /(1 + decay_rate * ' - 'floor(global_step /decay_step)),' - ' min_learning_rate)' - 'When decay_step=1 this mimics the behaviour' - 'of the default learning rate decay' - 'of DeepBird v1.') - - parser_inverse.add_argument( - "--decay_rate", type=float, default=None, - help="Required for 'inverse' learning_rate_decay. Rate in which we decay the learning rate.") - parser_inverse.add_argument( - "--min_learning_rate", type=float, default=None, - help="Required for 'inverse' learning_rate_decay.Minimum possible learning_rate.") - parser_inverse.add_argument( - "--decay_steps", type=float, default=1, - help="Required for 'inverse' learning_rate_decay.") - - # Create the parser for the "cosine_learning_rate_decay_fn" - parser_cosine = subparsers.add_parser('cosine_learning_rate_decay', - help='Cosine Leaning rate decay. ' - 'Cosine implements:' - 'decayed_lr = 0.5 * (1 + cos(pi *\ - global_step / decay_steps)) * lr' - ) - - parser_cosine.add_argument( - "--alpha", type=float, default=0, - help="A scalar float32 or float64 Tensor or a Python number.\ - Minimum learning rate value as a fraction of learning_rate.") - parser_cosine.add_argument( - "--decay_steps", type=float, - help="Required for 'inverse' learning_rate_decay.") - - # Create the parser for the "cosine_restart_learning_rate_decay_fn" - parser_cosine_restart = subparsers.add_parser('cosine_restarts_learning_rate_decay', - help='Applies cosine decay with restarts \ - to the learning rate' - 'See [Loshchilov & Hutter, ICLR2016],\ - SGDR: Stochastic' - 'Gradient Descent with Warm Restarts.' - 'https://arxiv.org/abs/1608.03983' - ) - parser_cosine_restart.add_argument( - "--first_decay_steps", type=float, - help="Required for 'cosine_restart' learning_rate_decay.") - parser_cosine_restart.add_argument( - "--alpha", type=float, default=0, - help="A scalar float32 or float64 Tensor or a Python number. \ - Minimum learning rate value as a fraction of learning_rate.") - parser_cosine_restart.add_argument( - "--t_mul", type=float, default=2, - help="A scalar float32 or float64 Tensor or a Python number. \ - Used to derive the number of iterations in the i-th period") - parser_cosine_restart.add_argument( - "--m_mul", type=float, default=1, - help="A scalar float32 or float64 Tensor or a Python number. \ - Used to derive the initial learning rate of the i-th period.") - - # Create dummy parser for None, which is the default. - parser_default = subparsers.add_parser( - 'no_learning_rate_decay', - help='No learning rate decay') # noqa: F841 - - parser.set_default_subparser('no_learning_rate_decay') - - return parser - - -class DefaultSubcommandArgParse(argparse.ArgumentParser): - """ - Subclass of argparse.ArgumentParser that sets default parser - """ - _DEFAULT_SUBPARSER = None - - def set_default_subparser(self, name): - """ - sets the default subparser - """ - self._DEFAULT_SUBPARSER = name - - def _parse_known_args(self, arg_strings, *args, **kwargs): - """ - Overwrites _parse_known_args - """ - in_args = set(arg_strings) - d_sp = self._DEFAULT_SUBPARSER - if d_sp is not None and not {'-h', '--help'}.intersection(in_args): - for x_val in self._subparsers._actions: - subparser_found = ( - isinstance(x_val, argparse._SubParsersAction) and - in_args.intersection(x_val._name_parser_map.keys()) - ) - if subparser_found: - break - else: - # insert default in first position, this implies no - # global options without a sub_parsers specified - arg_strings = arg_strings + [d_sp] - return super(DefaultSubcommandArgParse, self)._parse_known_args( - arg_strings, *args, **kwargs - ) - - def _check_value(self, action, value): - try: - super(DefaultSubcommandArgParse, self)._check_value( - action, value - ) - except ArgumentError as error: - error.message += ("\nERROR: Deepbird is trying to interpret \"{}\" as a value of {}. If this is not what you expected, " - "then most likely one of the following two things are happening: Either one of your cli arguments are not recognized, " - "probably {} or whichever argument you are passing {} as a value to OR you are passing in an argument after " - "the `learning_rate_decay` argument.\n").format(value, action.dest, value, value) - raise error - - -def parse_comma_separated_list(element_type=str): - """ - Generates an argparse.Action that converts a string representing a comma separated list to a - list and converts each element to a specified type. - """ - - # pylint: disable-msg=too-few-public-methods - class _ParseCommaSeparatedList(argparse.Action): - """ - Converts a string representing a comma separated list to a list and converts each element to a - specified type. - """ - - def __call__(self, parser, namespace, values, option_string=None): - if values is not None: - values = [element_type(v) for v in values.split(',')] - setattr(namespace, self.dest, values) - - return _ParseCommaSeparatedList diff --git a/twml/twml/array.docx b/twml/twml/array.docx new file mode 100644 index 0000000000000000000000000000000000000000..00dd68b63b564426e1f0d95279411a0102a2d3e4 GIT binary patch literal 37515 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 NL54(N_7Ld<@c>P9C}{uy literal 0 HcmV?d00001 diff --git a/twml/twml/array.py b/twml/twml/array.py deleted file mode 100644 index a8524a06d..000000000 --- a/twml/twml/array.py +++ /dev/null @@ -1,101 +0,0 @@ -"""Module containing wrapper class to allow numpy arrays to work with twml functions""" - -import ctypes as ct - -from absl import logging -from libtwml import CLIB -import numpy as np - - -_NP_TO_TWML_TYPE = { - 'float32': ct.c_int(1), - 'float64': ct.c_int(2), - 'int32': ct.c_int(3), - 'int64': ct.c_int(4), - 'int8': ct.c_int(5), - 'uint8': ct.c_int(6), -} - - -class Array(object): - """ - Wrapper class to allow numpy arrays to work with twml functions. - """ - - def __init__(self, array): - """ - Wraps numpy array and creates a handle that can be passed to C functions from libtwml. - - array: Numpy array - """ - if not isinstance(array, np.ndarray): - raise TypeError("Input must be a numpy array") - - try: - ttype = _NP_TO_TWML_TYPE[array.dtype.name] - except KeyError as err: - logging.error("Unsupported numpy type") - raise err - - handle = ct.c_void_p(0) - ndim = ct.c_int(array.ndim) - dims = array.ctypes.get_shape() - isize = array.dtype.itemsize - - strides_t = ct.c_size_t * array.ndim - strides = strides_t(*[n // isize for n in array.strides]) - - err = CLIB.twml_tensor_create(ct.pointer(handle), - array.ctypes.get_as_parameter(), - ndim, dims, strides, ttype) - - if err != 1000: - raise RuntimeError("Error from libtwml") - - # Store the numpy array to ensure it isn't deleted before self - self._array = array - - self._handle = handle - - self._type = ttype - - @property - def handle(self): - """ - Return the twml handle - """ - return self._handle - - @property - def shape(self): - """ - Return the shape - """ - return self._array.shape - - @property - def ndim(self): - """ - Return the shape - """ - return self._array.ndim - - @property - def array(self): - """ - Return the numpy array - """ - return self._array - - @property - def dtype(self): - """ - Return numpy dtype - """ - return self._array.dtype - - def __del__(self): - """ - Delete the handle - """ - CLIB.twml_tensor_delete(self._handle) diff --git a/twml/twml/block_format_writer.docx b/twml/twml/block_format_writer.docx new file mode 100644 index 0000000000000000000000000000000000000000..14ecc5e38301928eb6532365ccfa6a375b410655 GIT binary patch literal 37315 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

+XH^b)oWK9`$aE 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

I3dKnPHS_ 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 PTqVem2+SVGx0=A1Kg?!E8( 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≀{JUvU9|D;veWhULo@Yb?8Hs6yCjA2@@z3uSYz@d^LRsSOs z2!$e>UmEvwsqL|xO0&OKVh5}}<{s0q(W}<>0ETXq1oT&iI`l%saf0NPmKP@=g^Xz1 zyGRxxW`};#VB>or(3C(^2owy`RJ%?M5p@EzT=fU0U}MAyg4BD50CWTIFQxs^GvnIH zUs?Q2jSp{@fW@4?_Ret6B2J7WB@v`9fWjJLa66HSHaHExMK=2e_%Yf z^oB8ZSbd5vB^T)Hytz0_AfNZXe;A1sfj(OCnC307Edr&A?JHNU-cu%U;MO zk_VXrMCAU#_*=vYzaYzp2mq`9T|`8`P@QCl_Fn=Rv!Q2TsoU|4SM!)o5GT$8C_iX9 z(|O@~E0L4nbP&VMjN{k=a*QwC{Dp+6z~CYw#+}Kg&XnH)d_Lksun?x|1uW%@gco%V zJ&?YDj1#7Y?4aagV*Vw@{{Jb)RF&noSwk6RN{Y6C0vYpf4Gr!SHN0BREA�tnMso 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 Y9a@;O0W0X+s^SMZ1It4=^V_%o14$O7?EnA( literal 0 HcmV?d00001 diff --git a/twml/twml/contrib/calibrators/calibrator.py b/twml/twml/contrib/calibrators/calibrator.py deleted file mode 100644 index 7408412e0..000000000 --- a/twml/twml/contrib/calibrators/calibrator.py +++ /dev/null @@ -1,157 +0,0 @@ -# pylint: disable=missing-docstring, unused-argument -''' Contains the base classes for CalibrationFeature and Calibrator ''' - - -from collections import defaultdict - -import numpy as np -import tensorflow.compat.v1 as tf -import tensorflow_hub as hub -import twml -import twml.util - - -class CalibrationFeature(object): - ''' - Accumulates values and weights for individual features. - Typically, each unique feature defined in the accumulated SparseTensor or Tensor - would have its own CalibrationFeature instance. - ''' - - def __init__(self, feature_id): - ''' Constructs a CalibrationFeature - - Arguments: - feature_id: - number identifying the feature. - ''' - self.feature_id = feature_id - self._calibrated = False - self._features_dict = defaultdict(list) - - def add_values(self, new_features): - ''' - Extends lists to contain the values in this batch - ''' - for key in new_features: - self._features_dict[key].append(new_features[key]) - - def _concat_arrays(self): - ''' - This class calls this function after you have added all the values. - It creates a dictionary with the concatanated arrays - ''' - self._features_dict.update((k, np.concatenate(v)) for k, v in self._features_dict.items()) - - def calibrate(self, *args, **kwargs): - raise NotImplementedError - - -class Calibrator(object): - ''' - Accumulates features and their respective values for Calibration - The steps for calibration are typically as follows: - - 1. accumulate feature values from batches by calling ``accumulate()`` and; - 2. calibrate by calling ``calibrate()``; - 3. convert to a twml.layers layer by calling ``to_layer()``. - - Note you can only use one calibrator per Trainer. - ''' - - def __init__(self, calibrator_name=None, **kwargs): - ''' - Arguments: - calibrator_name. - Default: if set to None it will be the same as the class name. - Please be reminded that if in the model there are many calibrators - of the same type the calibrator_name should be changed to avoid confusion. - ''' - self._calibrated = False - if calibrator_name is None: - calibrator_name = twml.util.to_snake_case(self.__class__.__name__) - self._calibrator_name = calibrator_name - self._kwargs = kwargs - - @property - def is_calibrated(self): - return self._calibrated - - @property - def name(self): - return self._calibrator_name - - def accumulate(self, *args, **kwargs): - '''Accumulates features and their respective values for Calibration.''' - raise NotImplementedError - - def calibrate(self): - '''Calibrates after the accumulation has ended.''' - self._calibrated = True - - def to_layer(self, name=None): - ''' - Returns a twml.layers.Layer instance with the result of calibrator. - - Arguments: - name: - name-scope of the layer - ''' - raise NotImplementedError - - def get_layer_args(self): - ''' - Returns layer arguments required to implement multi-phase training. - - Returns: - dictionary of Layer constructor arguments to initialize the - layer Variables. Typically, this should contain enough information - to initialize empty layer Variables of the correct size, which will then - be filled with the right data using init_map. - ''' - raise NotImplementedError - - def save(self, save_dir, name="default", verbose=False): - '''Save the calibrator into the given save_directory. - Arguments: - save_dir: - name of the saving directory. Default (string): "default". - name: - name for the calibrator. - ''' - if not self._calibrated: - raise RuntimeError("Expecting prior call to calibrate().Cannot save() prior to calibrate()") - - # This module allows for the calibrator to save be saved as part of - # Tensorflow Hub (this will allow it to be used in further steps) - def calibrator_module(): - # Note that this is usually expecting a sparse_placeholder - inputs = tf.sparse_placeholder(tf.float32) - calibrator_layer = self.to_layer() - output = calibrator_layer(inputs) - # creates the signature to the calibrator module - hub.add_signature(inputs=inputs, outputs=output, name=name) - - # exports the module to the save_dir - spec = hub.create_module_spec(calibrator_module) - with tf.Graph().as_default(): - module = hub.Module(spec) - with tf.Session() as session: - module.export(save_dir, session) - - def write_summary(self, writer, sess=None): - """ - This method is called by save() to write tensorboard summaries to disk. - See MDLCalibrator.write_summary for an example. - By default, the method does nothing. It can be overloaded by child-classes. - - Arguments: - writer: - `tf.summary.FilteWriter - `_ - instance. - The ``writer`` is used to add summaries to event files for inclusion in tensorboard. - sess (optional): - `tf.Session `_ - instance. The ``sess`` is used to produces summaries for the writer. - """ diff --git a/twml/twml/contrib/calibrators/common_calibrators.docx b/twml/twml/contrib/calibrators/common_calibrators.docx new file mode 100644 index 0000000000000000000000000000000000000000..232b662607d747f28685919bc3df5a76a4b0e474 GIT binary patch literal 43728 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

=kx30Wpoi=)9J3x)ARauThe^n z>*4J2eOpM#?upxb?e`Ds&(^QgAMX`H-Nd4+slLOIr2Xx&)zhZ3_p#HPdbc$z_98yQ z@}BMvxnR!F$lA|4^EyqB*ZI{kcb9O!PdjznKIF%?-P?nESM2k$VKcqQkfOyt?*?9i zK2z`I%pngA8|OuXU|ECgq=}Piz6-vL4-8)EpJLbY+e0A%PkIciuV18GHhnhE5yytk zU)H@i{=D-EPVk(oZG061S$lAa`Ve^YlKD{h41B^qw9Q^$oVtwdTGTybNy0knxf9G^3y^Sy1rFL@bbX!^D6Bdl|31ax@T z;*Fe2j^o${-Ep;n)0V{N?G~Zj=E;4IN?a8ddsmGJUJ!DD!Zj6AhZs^-$@gBZ=cU2t z#Sz5N-WFpVgz5ACaoA_#1NDBl{_dEn{Z{S0+`jppr^4m(A|#3ZB9mS2^wUfC(wnC; z%VzNtwZAhlvU#QJT=sA^#&+jv@3Tg;OEeR=vsFu!?V0+eo6Y@^k(~15Y4yOF{ScP3 zJC(G@~$MjK^fw9F(RWPVXq3|k8<9AVXshX&(K+K zC+E()p>y*AN*G<`=P>_SW$)ZA(u6FkX5oEG7y|h(Q4cMjLbdJJzXQN~zXkTE&eOQ~ z5+tvU?5dM72o6nQE7|$xd;50)A7NtEl*{y*W~?GpZ%ETn{89zNyv=>zarLHGC7Pjz z#gDh7#lwAjhjNVk;+GiYtCrVAgIi^4i~bbTr-09Poyvu&*YnvIyGQ%?A&G}uzVl1o zbOq4{o%y+|zJuG_LU1v4Dm*6C8h66rc*UdY) zD=+)=m&28|4{!;!ujDv?%^|aZSEN>3cfdF~5-VGuz98w#aRPH8@7J z_>p99FpvV{+rfwF1aB~6{bSp~^RxeIH2Z4A_*Wy?HkmE3z(4y}HsFxcgE6?l4);oI zfc(q$IZND^D$!Rz>c3SrzpMp)+5HdIe?WniP+nRPyZ#S=O9j#|3C!Ot65GLza{d>^ z|27rtep89zpY+x1--$Wne(_O6`tlX6evgg_mhOL0q$7f&bc2QZoAq40O9N8-U%mcI zlIPRQdw&Z%N^)xt}RkiI} zbv(~2cesBrlDqvBwaKT`bT3R8ZL>qa%%7kgeaZR@=kwJLPKeHJN*@WZR)U|tIj~0b zaN+H|lESPosj)pnc3ABVMj2-UqmF6neJ_Pkm`ldDTPGh+ zm&@jOGQ@%nhtTSUdpf06e6rEjNVTPSj5do}(utOjp7mdY3J)~OeLoY{Hcrl6SGxM6 z6CbmG&)iUObUC^xnN1>$V1%BQ*1Lj&4biAzY?tUQr1`&p^j{Uq9gZ<=I1+@lON^!| zN{*#%y~UNXgHsDFT*^pr5i-@yx>*V&NS!bEqzj{{krmD@8`Zk)80jsXE@lZnBYu59 zp=5kKhhIi^UuHj$EV@(rH|(9#o~&P+l=kTP-a0#AB)O#r26y&-q}VXT7=E&2nDV-< zs^jT&S_8blf4bOv=c)u!GPszx<>}+JnY>M7Sq6U)1dOllL&=IUd&?(JQzX%rM2(`( zYtYX%4cwE#&c*|P<$f4dyrk1Eo9gUq3z4ReK~wa#3^`P`)3(5={Y2ItIcSZGI+kqA zsWfuxOF+x$-{uMnI3|nsjb9T_YveUNJz-9}^;x~jMqUgMO(tMD35Mi+ag`sG0t_Kc zZi+%}<=FdfvC}WwYD;(7w{5eNdc75rEwWsS7*=9NF?N`(!881fx*{<}dOzqmLOahYZ=Hq5?z`gC=-p%{*BjI!5{AKp|?ZobzLHkEDU&aH&+td)a`v(x> za++H+FPPqDTT{}|J@K>RuUA(6wZOdM3kL@T5t%WHv8;zA1o24R)^_EKOvM(d0NX#6 z^RI8HU0t3EzSpdpZz{si^+eC`wy)^b7_|3s5RH=XR>as#C#in8Wr&f% zC~`-~o`N_h2|~wz{wmiAG~P^HH9DAwh&Nrc;6R}C_ovV0ZfcJ2Rv~Xf(d^ejP{VAI zL0DvG(!^@JaSDrde8Qw|KIoslA1jys zS+k7M9jM3%eq)xMT3r3Va)BDz0toPQ|yXNH$bQ?_g;(0v&r|4-6S;0XM5M%qVRJ*uTbZK z32*dfblK|Y>zFC7`_CvqTPfyj9Mvu%7iUGSLG38C2&p(F;&jd?M!7>V>K<%gYNlGo zOJs1Qbdc+mZjho1PB?ZRnCS+f-d|pzDnN~xP!-eYQx+gtKfh|vWQnZ zrIRZIAlzQWr||^S5O|~h&FKJgAcbx#A(!^xX54rC^O2LQ@Pt=GD~3BtbV_}^LIU;y zCu_ZNO`nS@2rlZo2V;Eylx~LbiO0jX{>-1gsm;b!*44|)xW!bJz66-y&!>-<1w71h zDa7<|99>JUEY&Iota&i9%4DTxTpUZK)u*Zha@UXPRx)H&$JrqY%5d3~v^ z4|AyUL93B89Mivwa~F<~R0o=EQ~D%%&yaoEv- z2y7svF_*~VAZk~V3E#o|sm9n!uzM`0-Fv6>MlV=!xmBP($$Y3_n;$`Fzn!LcE6Au) zEg<|=HL~+-^v7J>3P%Q2^&WTF*W95?AAaK8L}_RtH@~V#u|+!pC1U(Qbl~KqF||un zacJM%lOinZOjnSp*TR$exjK9xC_x)7S-~M#yHgCSTJB?+n18;exY{D#=+LI$R>;0A zq4`tWVuUe{d_e1Yf>~B_ff zWKSgkh+Kvi_CUxy%mV0xir+~L3bCTrPMB=14?a~t?*$P%CfPQpO1&1o@E?=Uq#Ah zWU0f7gg_8uPP$KN8Lzld_4GpL{z*$Kjh?2$ z-~ZCFGUOBB^_G+E9l!b;4V0SKn2NI|um+9XDHnw$eNFN$5>+;2ES0{eik$(Ic~yzTOV>3aV)2yv8en~y6DYR&3wtZ+_ zyacd~2boN5z68N*s874o3bX6c8CPbhgnBu_dRpoeP zRiR#3wCNJuTv5E;&YIw&b{sug+!J*sXOQPv9`)GI#ArgHiTbnx7uPB>>KnLJpSB9#4s7j=87op81&|t^z%tue*4=vL zG>gk(evMq0N6!!4P}kbRI*RH*m36pdbFx}=cHKmGg6e?wq=t~#O6WszpS6$1yn?9b z)aA#>VXp<`up4%V5e8oEv2hpnNIY2RP2-mOqfO&l7V(01)UcmfMsEyW%++F^ff>0# zcgP&xKAVkt$lHNb;U)e_i*{)DWzU|t2C0SW_+<>;kpe2Kz4<6AZTG{p@&Tj6fJPj- z1AS`AB$xfcZ#6ZqNnuNRh}jvWHDQm-cY^|SF-4;t5}fjC)Bw8Um}3am6?6rUfhgh+ zuEv*b#;tzX_AovJe^g3`hN>fY6@l<0YqH=CQHor44-Wf6hc7#RhX~p1ro37J?Tr9` zRM-9LzzxUr-LDwgIw>~*1Z|Bp1Z@v|QOB~tm%+6MIO`UV;FZ42OrQ(dR)!r-G_4Q# zDtWZ+7a(Le>3?^^mo0SKhHn3#q>yPvahL4T%%3?GlRUYwklYK6yDgim51azusFzD6VXU;6$<@y!|925B0f8_13QJ z^yEF;?3EtLCQossPH+CnCS#kBB(rVeTUzwKx;rti1LGi`{D_r49hnnEE3qw7t1-(4 zDzFruNqx;3F$%8)HCy_?^QX-mX85oKT?(_tda`s`6~s%l3GGS{SdJ>`0EtJtRJUHL zQK&Wp=4AgqRU%Kc#(5 zpZhQMqrcPx2n0Jyz1Z$-Wz5 zyEiL$6en4Q7;&4=y;k)dgatV7CS?;n*7m0G)3Z_`V>2(_B09}&%8QW`(L+)p_ISH+ zi3Z@QrA-Wp7hGQGC4R0GZcGW@3g?vzMSfkLCLUwH?`ht>INXUIP^t|no!ofd)=Qw3 zg#MU_Jj$6Qp0M0qc2+AjF-!QR!0+|=f&vB@ERGrjF)w9%+*v?Y(mKe`GmC~Y`sd=>*(yZD3!xJiyo0X}e2;ZxRTV*i7Qu@jiOe72q z2uutucEKEdRyYBL7<&^`v6O3>3eU-zu&f9_mxo_3F*o0lrf?n!5x8D_4?kt3*%y?5 zB%y2L&_!lSN2xh-?0?~ak^Kutc2@!uc)RFY9=TfI;bf5E8%;43)t5`ZXO0Dw@4j)i zwutcS^lDX{C>-_xl);n%ASYOeXb8$+b5|d)jM(NFo+}u@BhGP+@zlf3otIISq^5|` z(t7jtP~x4_H1o4dhbOckaZ~0y4o+ymZXu|JUtaY=mq4jkbK=XA{WqFH`2RrTbo&2A zqZ)SgW51?c{8e{oR#au72}ZVQmT+Qz=5UV=JaWi#-NF^_+g_JCE5iSzG4T~d8{nck zoHDVXdoVP7HRoC03_2MR#DKiCO;q{#D^)9h)!mwoFTiu?VuSDU9P-HWeXo~8M)?|7 z=2~E6s}d`+g+zwWbwsOS=WKQ_rG+B=H&Lo3nS;D)hI0HjoIIYD(InZl@?h{~1lHVX(|g*MQUEWBW>w`A80%pGy70S`QVorlt3&TG>II*pn@!q9PCo>dF}EodTTR zxd2CQOJ&Y_J>L7f8bK~NKF-KZkd?Cqph%SHKdd--yR6^CQ;uS}<16kbjgQ3XI|51q z(XYA(j;wbKqn9&mMagvP57c7lR|hHjn9>rPhr4yuuaCp`s>69Bz#j~zoLfM^vn zWP=goK;ES*0KyxHpe9+6Egd3$IbCVi{!bxNDB2&tcp%PLR4U*f`~Xp1q?+W)YOL^a zXOcR4q*!hZ5|0D%f8$76ma3^xxR@jHm*2}gfBD@LqAqRkb#BCXh3CwM_Yc2CM!rmb zJs7LK7-#%L2ONV2#Njpc#pUo4df>%Um`LH@-O47euw$56|$ z=eGkRAxvu+KXG8ESI}X<`cKeMKYT+Xx=?j#HFY=<6YgIcm{7y_597{W=l^YSm8HD| ztWa&$qC#DIzta23#Ji{~KgdIKdjG*M1iv6Nv%6M7U!$9J=Fe6t+V3?oc7a1C_=dWP zHi$ zaT->}x~M;P($ohjJI&Ka{_G}TnbMV#PfDcMtr7)r6nVF*9i-3eS(P@?Qho{JIZPK7 z;c5g>H zEEj3`tKAvb2YWN`C;e|Z9l3<`0z{)BU+Fp zV*x%<|8Hn#qp>e&Znl3w&yb@=Ap9TD*PZ>)?O|DZ8=fs<9s1BG6{S5WHnW)kfS=15 zvATbIBU#%iA8G`tYp5E6RCT|dI*HM?O;mj2k2$!1fq~4sM<;Er{ro3*ufD{yqS_OTT9X3WOt0e%OL1qo{8pY4J5sA6-o$m)ppkx8 zx>!Hxd%@~C4`L+pQy_BGrEvh?X+wh$4w&=HI&CkJ1%;*eu7Og<|0C=zfa=!vzG2+m zU5mTBOM$}1-MzRKcemp1?(R_B-MzRMw?c8g%{k}Z_ul7wWthnf$;!|EduOk#tR(xg ztQX7h_*7r#lvO|LZrVpI`RJofN^8Bsk)=cBTVU#^mi-AKOYT7+G0>19Z)gx4b7WF1{@KCBpaWlCj|3ou_;QXc)IV~4%!RZuQ{ zzVQiDoE=eoe$3NU^Q5yrtk~JF7?!;~F6a5@NiH~;!0QEt8H!v2NB8wi86ce!_mB8I zd%gu&Gn?vd)I9rfS$P4Y9j}~Kr(M34*mz&t>?VSUnY;) ztM0mne#|%i{Fliu+9#bw;eVS9P5Lm&4gX=X)8_wWl3UKId%FFQy~+n@61~{so!2_M zm5`_a8xxN&I>XSE(t!XtqFf)ocCfp8egxXOPQ?KJTOz3uLkd$vONudck?yd?V-RQT z-sHAYW=r4D@zKr4az>E{OsrRP7G++0f=3$$90tyF#RTOQ&SRx@Fwhmn4g&_VJY6t{ z)Zb&?ybmhak9gWV5V9rs6BaM9*Rc&AMgSt}7Y1qw(MlqnNWxS~#Vt~GXA&9*Hen1y z$J}YnnGK!Yn$i@GrC_Iu$YkFhV|ESJ@l3rFY{b-Hz)$SNIjTKT3+*fm{_!&jG2+iY z4;}`(0|`Xy_&{?Lse;xDz5YOBvcHF#9AZ;n8UHx|U)oY0g57F!RqqD62^DiCN_uv5 zZ^W{5w$zwrh};X0LW9x)5(nM`kHSLI0fPN09D5(~4w8wQWAB(*&(9rU2lBo}H~VN3 zt50un!-2s=XVAz;*cDi0Qk?M$TV4Ma)U#uC(#M3)5E&2R%{ zltN<~fj@!OQ#gg2HS7Sn#p#2WWy*lQB{gsQH2%NDMTvZf!wI?)y|x+|HQMGmt0iXX zCu;NoC4u}{K-U8oP|ZG|^inRb0gbs`+mJ=)ql827%rT@LJ$e|-HvR3;5~9wxn*wDFdk(DXke2%$=Np@@1EfUXrt1LmY?XXki|MP=~&Q8R%tRGC29@(aM_Emf-`lCdf(>^j_Q;q{4ov0 zHvG|f24>(z;SB8#1d#PumXC4OdL_}*WVP|_P<>N&M#+v+YN7^w z!j9EGYr%G2Hi%c@5Ex$2BP;^Efe%V8%OFKw)(01w+v=$t4Bvr$~z^W4$VPY zDGrw<$Wd;^>LR&rUwg3RPi-!4tvX-X`vip~K8U)eYh0=_re1)LYtTMH>;h)s_XxRH zc4|+y5X>s%FCv0CToD@l8@q-Ga|xjHO=tCDM|JN$=&@;rz9Z`L<)vpQu}AZNmTEf3 z<4g>*T|@<)@I8@IU$4Lzn5E7PEHWyn0{Rc+Z=KWh*w)Sgj9qIxRseQq}p3{Fb)< z3KNWmkDHupGL$T*L}vUa2+(BD-A4%>!g+8dwV)LNF)$F@LLg?89g2r)8sIO1YkN@#RH|qY}?(bL3H8pBOj_y{#obOa`A{R#8r~0jXOo z&tDEGT#Vz~*Q{c5ORQ@OkO(6}s{93;wPak8vm{0#D1)N1d+HWmlf>rmP2}kiS^)DA zrTF*yDEcZ+E^AKLrrlWLGX7DCXiizM;BSJ`8f=9!hUUEwUi2Dk&`Ru9j!Bwv2m!IX* zZans0RIb>XwnMYQ@9w~8AM)@r;CzY!LSuxfzj+7Zy(*kJw>kre%VR1qUuf?y%5x^A zA%$d6Rjy7wdTXN4nVox|KLo#^P~NTcH~|F*{4c=)Ic1PSe+%yY5PbC^xElY|*@fj% z?bN!<6H-WpSe@=6iFnkyf_PN+A7HoMnxw#(e*r7}_+}D~Jvjt|`SSbDN4dCTlUoS$ zMV8?q??~9Y(+|$4bf_3eG#^urZ{cDh@L#}D18_bm3A1I}pCN@1l_4-+aB5s%J3Mu- zx*kR3A%(tknyo4qHLwUn3VC;KCDPPzO##;`!~6W=QP5|~1-h;)+crP>U9jG7w;$!@ zvXMGSSh~F|vUTDC^fSB&=ToiGJ6#k&43s7ZjKsKO)1a5>$}9915$d$niT2?b^S8>C zSn5LH^@8)t%WzRZ&d|S#`M=G^rQp$MNRxVO7YUeeuAOt|Hn5_skV1Cu4>!Q6FtjR< z`Pdh`>VCnU*STqZdaU?#)BA`^P<$HOxC25w(1OIQRXU?0fjY~PrZf&=Y3LatIss;} zRm{RA;;OoEIP%D)+WCKeHz7}tmvF%3n^4;c81^iEsupQtAJ*9yCoyp6!l{_h2v9XO6Crh2+-bum1ru+&ip_PH>4%fGyY?z0KWw z&DiI#Tu(552m#W2jWwlg4;=9yKoqrKck}!W9nDoVq1WS}V@lg|z3U$j$&Dl^8^7(A zv)y|2$O9^N9rsB6Z*pCBe zPvC_D-g_#(y~`Huqaz}W#pCosQlH+ZYzP;_%%Y%Z8yhrRPzV(!gER!`7jhomx) z;mE3Zczc3%%Cx`fkJ$gAF9F`oy$uO8f4I|X*B%MlemKbfKX<1AAKrU-{f&i8KJE+(sUIs1ufY#36`z3OtKuL@U@07s6kD4#S8Qt$KiR%dRGsIIaB>-LS|20@Qz_zHcdpdOaB zNjhvfknakQS9wq#C2}QmKg_bOX1;rzg6o_l^d1;V)-Z4lf#ak&*ajXq+vL4{LM#&b zB;R3#{tg2OWW0I_MFXR#yWxJq>`)ZewP=a9hg@!h1nr0|tl^MSBGFloPIlid+FXgp zNrgqAUyfsCD+Pl_$HD69gOH>kDrQ5z1*0>#w4D&|*%y0nw2oPbcH z1pZzojpi#fDuyRnOpFDDUp{s)whm4JD!*%JLTjwLSu@bzlo-V zE{~7lF*Db(W>xwRjlIlzv6|blo5+RP)Uz_BMwy>UtW;`Ks8LRjMZDU$S0Zd4CTrlb z(v9C$kI4!nB_WWS}vooSK><;-qS%0hWY~O|wteoZ^t$&l~E4kKEa=wHeG! zPY{Y%&{BsDwzK@hdr8=EKwlWA4IpwcgL+5EIDsyEe@z&C^a7g7&f-I-Sa38Y>|t#*@*oXAj~^fH9QB0#X;i->3<9s?F@`efrYd~PCj)P^i*cG z618?lUK+uFw5}ijp=xA$Q(3t}k~uuK?cEoiMB2a#3Lu*vgV-kf&x(Qx*?ZjwrM*H` z0h4W(5vi=?tF*p|UI)eZV0lJC{|`nFO-*npO10tyju{P2=0BM{?QBp$#)Kru+rjTn z0Nzuz@TBnC`d{Ldf|!x|!E-g^Q?~i~S%SG`*Tq{+0REz3F3qakmNL6(>-%qg>vQcI z3*VERxDrM9gLRLV+ZDy9bPm*qe^3SmLB?r{qlOLTirpPqXAF`&VNR%UzV&jl!l(8T z&*C?Y+hRn(mgD1;Ogjd-GEv6PAji&lebx$qg+Pa)M3IecE;aWAEg|=_74FS=E-;|> zsc;qzj;~I)C%wH42Qskp+!+4DJAjku|f%eyjMr7)LEodfuXm%m>jfg z0+cGuoiHF`ZhLRS(EbLeW#4MAuu~xYj^j&KciG@l8rzyBDm+45Ky70R&D8A6>ucagQ%0%5`l#I z=DfmxO)C0Ai-EfmgfNyqx3Da5K+05}5i4$bi2@UwC}+D%hqg!D+YV(dnv$`5046a_ zRozV*dR1_^FzUGg!8&EhHL&$dwqH< zlmOs4szjkeJvM6;#24TR^EJR==-orJ8Vw?y8w1f)(@_`}g z&qmnbTEOh7gA;{;=cds?4sInxs5>3Fju|I9DmlWg{``p9bTTNPoeX?z*|_%<8rYED z_}+Ee{exgd#e!~nb^M78Z3}P~zi^Hp+DMGlNYJ@YDvdC1Y#W=?FjCmVo9~;Od)Kpf z+eQ`V>7Olxcg}}H+cuvS{_3TiE#KQq{XILXt@ZQ!$h*B=_XfSL_rvLfi;VZj%lD_Z zQ`h#_oaylm-J9pTi}sot2 zo0}4P z>GRUDX^l;slfWnA@xmyv|LXg`yrEmqFJMd5cTh68cI%Tu#6z(5Rxd!vN5o6a|L*+4 zw^{k8y}f3O!3DWuv1as@qN=+RO-yKFseRGg(X4Id+`N5}%#)Ru@XNGN5jLyuW9^zb z5_HAz;%j^6-G=_CYBy8%))wE?WZ7f&@BLe&*GDhMwzvB&;`%>nJil339^ZWGUhn(Q ze)j#jWZkfTB41Vv_g7cj>co1o{qw_3gV5IG+M-)_soCT~xnjBkgMDg6=>58;<=X_7 z-Lu>qqh5n+99J3<4Z_Jz+n-Ug`<+&73T%3z*GBh;dasvSc|b?EkcK?c+w-t~bHya5 z=K9u_d`U?laWYc{v06;b_}%mK&ST%*{E5Tkdv@}v?`3k#^4>c>@!@;fVCdwUhp$)e z7ifV?q5>hJWZ;t)GIi?p3j1H2o+^%hQ?-Au6T`QwIAtJ2#*igOdV6o!*l8;mlNDgV zKCbrWs%+w`$upB10G#6ipmS31kEzN>erD9mivmpMpYN(HCIx_TN{t!4-u=CmZaagZBE{DsNIGUi;rw7*Kpk(o= z5TJ|7V`^L zQ+lo=CYJ{yN!y?L-|edyjN5o}w1Y0qkded1#=uP%7d3hkPwMFnBFwz8n57yN;Bh`_ z)InB`GHkqSy>C|_Fyr$N4=4Oxk5T@SW|;i~QPMSQK=PbA<~y$7#XlHMT7{`29sw+bI?C`~zG zT0h2l^n_uo%V*o6P_$afZCO|i@^vuoN>p3W$p=larLbl{k1qq-AfY0C41WE1J6Ju2 zQTFiLS7T+(AV|t8zzsA%fg4E9fg56h8)_w6A?^PSL9hhV0`i)U-%YXm(db`$e>8HN zv;ie3F8x4h{DA)p+tec=3Oga7bcE7=ISpiQ<3Y=#DG_F)al z%CSQF3F-d!Ci*$}fb>9{@})*Pp##LnYr&U6h@oZt4t)5O0Yhzin${qB7xA}2!=vNy zA89}B00I`zikRt&$(^E7Av=WcR$B(|M=uwl2M1YWeSgru<4X&>m-r+Y_yv9VDRKB$_cJAEW#CRW%9xXnNKkl#oezB;V)Nv#X zyA4)uyWq~8@Bb`3Tbs#+S?z2Cm;AB`E8&#;;E-rV<_ns-f1;kdBB zJG9C15r3S&oKE3uTNk|`A6s9p+Dh?W`|%(@*iv;oI%lWt1U!FTODCH0T}zKPzKC(Z zxF()^-F~637K$i=h9LgQcZPX+i5)7p>%qN&GtYy2^xZ@-Ckq2$BAA_J;(59t24~<> z-h1{HqJbRZ@a4%IWJEp(+9|+mg*4Xl+5{)al!VE@Q6I@72W!rjqfj?0*5w((qQow? z*uO*_QC^;$Ux3t2PujwqsD43Bt+_gZk4D5dtHGmmndPKB2P6iyWVqA>M-v=WNyVF z2Vk;Q$ldZ$dlS0I-K+%z7K1}XcElyW;>?J;Yat$#Nm9!{BOQc4DlGlLv66Td1FIes zV@1OBPg9OA8!x#JMNpo2REUo%hwBh?xKb0E6_o2$xn>W=kh`lZZtr(qyal-Io(l;c z&y3c?IrNP)r}xJJFa>?zP!Xp2xc7k+-kkf?~T>JGz#f)63CV_zO=4h zaxoDw*dp8AFR-UYt6q1>54&x*`FK9Iu4fy?6*=^a*(S%=@l)F75lN<1?H^6@9I35V zWl!HuVK+g(P{N-WHp=rTbdD3Z@F=jI*7oe)Ts42OcMe0v{>+ShW8yM}d=z%7Ysf`^ z);v*E?&wMAXjjFNWi@4M;tZpV!Uhm9BXFGH78sI!MimhWYQ2MT7)9L$BVB}1{5Bq4 zqs#(*=Oz;<sEO!S3hu=f4*Izq5pE8;I_nd>`kV#uzfE%yDQNNXUe$y zc52zx-ILyD8_5l~4;JHeq0U{KKgTWV+Exc?sNbPpVDp>KlQ>{w$?dqcgUrVQd;Ds?)6uFHUm&sZd(76y`;YR>&7Yvo)wjVWZNQR*+AfZU=1tI zP(o)142#j#xRPo1G$y16`p34U+a4x#izg&h#p(J_*W<6{5qRvCBvaJ6F4o!pS<=$J1q{i`?Kl=9;G;77^e zlatoS-IXi2EX8?JeAS_fc;ODC6QNKxQtJ=vv&JP;3ag{Maq;BI;&yB9)W#+A-nHA? zdLzfpEJo&vKeo=%`y(+aTPg5_li$o2*9G(p*Dc0eKA{3<9jkYRMMdp6RmwZ>pu6} z@>LBDlIPp;0b0Y4#xZA;xw{az`L_1*!`DZ=J+m%_63)UYGrlIv6Mf*Lc1M{O%Am)# zglpc6uWL6FBR83jkI`UvZS9dTQZ2;pAKvGR8K>}HSV?Jo71B0{Xc2|l(U z-hx&LW&L`$cSq9MP;NcrHSwk2JujJh?oVWtx1>|q+>3hQV>#t7^e@2HlE{9w36aI*zpznFeejjCF zfucnwVGF4YA;8F_-u~{jrL)o%m5isgpXHVSmSjAp9(h(<~OTgy+^Xcg@aNtcs4A zs*-*zlc!MwN00XU=##QB2#H4ZKR0rk_>ImMFc6e zRjh)R56UeLGm90gk`{S!e;y!oj6ZJ6fn`rbt2Or!5M2A(bU^{nG(#8lQ>F;9Qd0Ya!&iU8JJV|> z#KR6=|3n@pD_rpCHgiBi?6zjA^3t+#eTD!|CPW&MjqhXUi8OpXTlI1(X10pBEf$8g zliq3HW#{A9M#@AEKDOcZw)DGhEFm${;i{&`88vCUgW+&e&zd2M&x-YXAIUFb2+Xa6wN>ff z>OY1T(J5+4dlw;W&MgCvJ;52OtmClgp3zF=u{Cb;NV3v!Q zD|x^5b4S2c{uo)@Uf1A9fVhye@IeppRE|3=#J`waaPnTJ^IR+FzCb+EW}a(jzSQQl zx7*%S5L3f%!e|E{FQr(=H>kBi=<7V@sEG!?{6k+;GgC{2mU98`>lvdxf6M@y-KFhZ zndkkT{+?n;nl=l6SxvUL`^)N|;^hwB@BPy3hBuZ>t{4|lMg79to8KYUGpsr10YA7d z?04nB?``d!6`qea-FmGB|NOtz0oWsNb6nRQIa;}}kiq>u_uyN(R^b%0zS)s2=OD}E zb1lo|`(DWLXFutUGHTM3(KWz3H6#Clxxt!j2~WXOZJa z647qI@1WvatJ}kkd%OFW<}6Rn(Czhr)|6YYpY;~ZNiEaae26g_Eiuc-7Zp_$9?K#d zba_inD7GP_wvxs)L;l`!D^xCSATZh>q~{*jCY6Ai0$FuLeR@yLz0tx!s%+A-a#JcI zR>OWOt2rvVZHAmqbUjUUy)>`nuY^3g_*1NMoxl3{8s_-=37EejHJ%rN;xK@VEoxWD z_GH~HQPCpLT-0bT#>o zTR+WY8MdyQm70fDDtO40e{&}XNP($AsfSh4>Sn_xok;k8XXzgbphmCmNI z{X0#&C^9F3j;1rysG}t89G?)As+24bsR(4dDrvhazZNeteV{})s~gxo=fXfc?j8QS ze0aM_89PL$o*AB*<`yV}Mg#;JyYtJnMdPFt7w(#iOjGoP9v(5?x8(V2Vmv05qnY^^ zJG}JJFBaKf+M>8lUm0yY|I})|rXy`WKc@`(a;_1Z!J^C!rNHWDo~uQkjsE&ZFYunI zH}Z1OZ=1tIP)VddNNTZec%tOy_(~m8WxUkzaSD7%|60Bo{$_Qnw;cmqs+&!t|aKEBTo{y6q~(BH2cuwS*w}J(OF0 zMM+-SCxBz;#KkO{0Un0!JATTH-P{~I0LgMp75;064kAEP*FcMKmq-#H*kk#s< z*Orv)T7>mv*1Kpy4!M*wl8MjkVn{CPO&A2hppbzO);cg8tAv5{%pf4J+_6W9ahYI$ z8znvmg#9Na3h2KmPgl%=l+I^=QS#o0EYz9*LzxMMLM9y6gCy6Jtu$6d3g%=b$|PGRZ~bzu88Auu40&mz@);@j6DF!fIYq7XwtFb|QP;}iCAOQwe{QqO1&+J)|A zDE_UWy@P@CAfga3s4ID}_R}~UbZY16s(555Y!+;=6_Mj-s_j6~8Cq!0NdYl|YyHJUPKv?GSL^)xgX(FY~oka&$N z90o!P#>WnNfm`4?SgzYJW`zoqHq&Npfr<0D%ozm3%NopMg{r|8%o3=b+6#lK@iLMN zeqT+I1&0cPlkQJin$0^)KSgEIojwNqH2i027PTNi+U`h}3CXV9#UKPlAt*y&cCQ!y z$jlsIzd&5$GS2;&c)_yJH*$$&XTl^y;UZ~uv&Z|NdSt{Pj3~b`YHLACzBM6|21Lsm zcA@wSDC4lT2IGE5@gIyq;5E3^nkz#A^~=M>F*>mzkksRD{V15v|Gr=VLb8Y98;865 z8{oKa>iP??SHP|37P^&RfFse|mr#jde*9!7Qe(yqk*YlBK?;2^WonY^t!4cc+aAQTNj)_H#>z%h7 znjc<2n_LeX-uf|2{KJqyf&yOep4!Xj)&o_~_h)}}>T=Gj6tZ47i{3jw5%gZXkqY1d zilXV5E-hj8CJ8~t`a$Ntu){|)^6F{lj%)XBTt0jVI}Iy2?GPK!_}7{jGoG7u&6c9M z<<%2UhtI_1=7gNvYnA7#Vy0UqU^E~_0Ip`MLoaAK=f0Ni@XlPo#qD*-?bV+zM_%US zOKTE-;zDta3BYVzot3(7hi*0D=E;MvV5&c#qQIsK=98(ZG$TD}B+gK0Id>Ob$?Wh?`g&J*1abi7r5L8{rpsqw{=Hxmh` zKUcL?P|E0v=SgGGAI%*IsWFisJ56bVsUg<$CD-eIN&M;+XJMFT;giP_(uGNjcl5=g z|J1JU-z-0tiHCMRr6JBt90(4`#2szQ$wi+yU_hPE&HwqL^42=-DQj*oS6XMC1CroMqi!fvKft zbf#roJ+1wDs;Y6f>1#IhRWyz4e2bs!G}RN50M&PUT^;`l_W%g&Z8ZtJq2r=1lhYr~ zRPjc_3}ijvRXH2Q1Wj)IKlnL8I)K;f{ck^ZzPMk=n-Nb>KWY8CyEVNoklIYS+uhlR z=Xva}N2HNgw{%sSa@iK?3;c9P(su1BCaC#^8nh1{q+GK~5xfdD?1;qcd2h*!#xF6j z{XjjFTqYoj73ZapQ&{X`UZ^<)XX5l;S(&<^+0=!Ofw}o6Y z^IO}}_(E?kD9+bLy&b35CT_JP*+%bd5De;EVL3wda{FTiwbme=S!^}`7Nz(6}g0YSL1j+|sXD9ShMcD(tnjPINgGxDz_RaFmp-fJorjVpBf+LvV z<>M+CBz_%I*I&)6tU;Ki_rw)v`@nc=>x*RRA;PQ={%Xb~OPVgi-r)3j3R1{Ry7P0t z79(;>5zPkh8N>{g9P2{rxClcl&F%3v12H{U%N12H^l#S0#4dP*g%QA{iM2>7+@ET; zTL_71JkORFJ>K6oqb6O&n*?IPat>%AefOIZowr5o;jz;t?ctrd<-P5d!<0RGcddy( zVSj2t&GkQ|WhJ=qX}10(;tU!j`OEfKhyw--xLz}wUQ|pWz`X*#?U05^0#jXKvoE+< zaZ?ntYQ26JML}=sUc_C*9Ul~rx`u3i=fZqk5-ky1_-oLOq(dLd>gvGF=kvS{JYwmr z8?_X}ab>*-JnP(!V0gKLj$k~THq$|h+>Xriz?*;@PB3-_J&EG}jp^j5Pt;6)GYAKF z1=IvAk9k&f2aA8CP7+&wgvn&zD5)rb9x&*9#XDdyshwh=BLY1*uqIB#PW*6jL(59| zw+naBATvGduzqQkm$#c21sA1%d?@E00e!qV{maMO=z2XX+5bg^bG~M#@8I2&Lb8&c z_g_(L}}h79+E2lt_lLhBQ5EWJLtkBwii;teiab{QhH2>5`w zRK>p1XIRdpPgwHEd~dX|X@h9*p4zy?(4Sa+<=CnNa7rDj#((9_#^bjGwX_5nzPfMY zR?7rhE1L8SpcvcW9lI#Km-vXCHHxIcVG z$zPJbEe|uX{uC{0C03-+U#b97;}yrb!4xlPp)vKOC=e+x6CdG2a1){ja;M?p;*1zzvnKKC5UN(%=njDrBhQo3@dRBc;9jm}R4ye_0rDS&&Kr4T8QzD+U> zI*cO|h5^%R0BuZLgsz=&DGU*J056O~%WpA8kxRQ$kp?=TOpo^$iWLs6KL@7D4~8Xn zp?_;tG#}2ZYyhu=GD4J&B6g@YmVzYJbc_O%0GdJ7qFoA060HkRbJ49t#b^C+)Cf{R zTwvR*QJ^#er`-8%hIEO!tGllFUcF>69V-OX2oX9+3(bm~c7P`lbC+aExRSICKy^LZ zg4=XyGRh%yDpI*4{?&a7FON)5ZDy=GlEX+03P>J>WpHP_Fo|WQBExJ{o`S?XfEOZT zAh$SX8_6+=3_gH|1k?0s$$o*;nc6Bt6d0PAlDcZ~$%qQ?OhB z`LXGg1wX{2NFUGQSKTDMUd%$O917wEk^bzbBh2|` zCRnX!x6HhO)6@!Ar{{j=l+r}UXk_-pg=HZ4=om8mILanSUHTd7Cg|PpPN`e$Z zLA+2)nTn|LPXs!(zzE{tu|6W0Y>!BIB>BA(xn1gkn&_dfIGDN69zhFbx~ZyCNA;&V z|A)k^D<;KXdiNkdkT=>RZk!NQW~Iux@q-J(UPGX*0#=1FIRxW*RV$~&Q%WK*(tZhJ zHl)n%+hsrnI*gM2QU^)~js;Iho4NrdC**(rACk$y{#!D4>a>})-e9@`r-DRO%qMwF z9zpZGhX~U-UN-S)BV!)M&%~MOSX7NKHsiJGZ%Y)Vw7z>v9V(6PB4}fa{5a;&j^|Pg zmX6;Q_aSHZiOua0OHTGhq6D~Bf_Dqo6t#tIv1~sns`aGhM;cla?N24kaO za1B{izwOfam3UuGAirNbf~pgK8F5xa9G3yRKtIb#!qAxo0VTmF7W$$@OZSWQCGD7C zY~mY=CCNe})j||ie=fUcVz~!5=0VYr_7X<@iTg-`1)5qF@r<7zMn#S7xOCTx;y&qjr0XgBQ>9NZs6axN>t z8-f+jqJsKwBM?o8G^Ds=?Z<9YktD%uOcWj9zKf78RtcXfrP)CKOp!LBo9WQm)G`Fm zx3GLf5biq`SJOhL$aF&sRvg*TkF_V+(FxhKA0|LUiUor$x!iW>BSCn0^n*l;7I5#C zrXa9oWn|j9y7dOLseAm3Gj4PvZ(<(_78(uUJ~sk9(V(FDy$)s^J3>c0^Fsws@xy5d z9MI_}6`)gqf*^RTJ#QStrWC9>hP=$CmeC#dCju$%lsv9=me3&ZLZBobw>kP4QaukU8hz)7@p)i_9_|<)O3}?ef~kpCwuZxT`AI#N!ltM zV8$pZ_TpM8arWXrQ)2DK(^KN@2M}RoxHF+hcE06DM8=^-qYtw1;S8KGeI&&wX4h&A zlrQBUH1BjJUcel^lFgcctU2y{-f24AV3XqqeW;uy>F}Y`AfGY;D(Y;Cec^p8 zF(vD-kif8}On)J|PLS?^(8St%AZ6QQ0bhnY4NV_we^zEEodF-3@_qaZ_ls8!2{z#N zZ(6c4G0ixPzi4^W_R21k=xKfYS)>w`Fu&@SJC+MSvj!_crl(Xy(pn2QBGBf5N^xhE zdRXQMp?|JZM=LV<|L4r-*7p^!UJOH4(7->)SboDo2{tt2A6}5u$rz&}3W8_?Zj3U! z;HV&xLO62G*nj+Kp;?ib2tED}#dDS$W$u#T{8rYT~%Bq~$l2MLq_)!J^CN62P z$wfj|!H>4=G(#v^{b`mW>bLVd`d2LZjJ?n2-%s^qWJqD$B)fiLVl8AydH6#VWh|= z+_Z0m34$z#38u1iFYF;l3%~3r4d7lw4-ljH=CTJo1cF|NQX_4|zLFAFl=AN)Z<~h+ zHOf{W2F~^vKW`xk#gxy5F`J|M_GC7hPm#U(Jp>|hOT2(yL(j8BJOEkV)>p2r`HfR9 zP1-iXgn&dse-rVCCr@2No9KuF+lKND5dXmQy(*xdP}k*VT6mlz4HNRqA$>D|XiJ9@ zVKy=krjP=Od;s4?PHk|R)cnv^3tAE;MDk|9D~ak0QZz#>3g2%(#Hcgi*be-^8r7HC z*r#lmnBV_FjFa2%W6zJ)Ger+#IH3t&`*cbLhD4))uW7~IMP^8-0A2=>iSTuQ;V+jV z@5=Kg)x&K2y%-@L#zvNY1LsO*> zJ|?;y1@peELj0W=j!1Qf0cTEw5F_FBZ7FROj1$&1^n|A8A^nH26+h(2ae4N5{d;1Wn7NHt` zRD;KA`oqpOG`>Bs8oS8F#y~p?aIYvxhYj)aZW^{+yU0BpyU1n}OhCZa6`x0ornQDZ zq~q20ev1R{ez#bj4L~NTeDeNR_2_T7SnYmpnHi>m{l3AP&H8V3(}=~ucVkh+Px0zE zr6F*fQx?bn_OLE(i-YX>O2QgMP6071wSe^t=_QvKQbTYQ^!Ak-p@h>>-uIp<_Q|+=D;DOfcb~5lvmhWY9H-Y0IBP*d z+rEIqrmSZBt9(l*1eC1$&jY_woF(ppIEehs^JgZZ=m54%Gww<6m2mIjYl0RN3BUPu zrV{s)wyx9bKu~~_Yt|tUrsM;rVK*^)hIN`^B+L?zIC=dlSPMdA3J3&BbT!0g? zixJaJC{lZ0-T2S&9d_3h3!-P`;jG*LJ(vKXgy(d&&mv^rI(U9USpoYWIji9tD}>Q2 zmtO9bSvUZv(5yqnGr3_lALbs5i|YAxD6DOER|}FI_BFQH2!NAx-YtGfTJ8wXhZRKM z`3Xfxq<;ft^?u!r`Jx8FJ^AXGzOgfq0rg@4G^tzChDZ-Yn-lJ{Xf`Lo%sPxe$>ajC ziI@VoC+*WSoYUQ9QhI>G5K7vZ_^!X5MM0a=fn^^0@Jz;?PD7t*K%pbpr?;Q7xA;SH zPwL`HaZlbO6qe3=X+R5g63SA*)2x{b>VI?XlG!kxD&FFpGG@Fwn%8qsjvZ0aPlE(p z$1emoYL)<~_a}{H*S&5{tDL^EIL#@y==H)b;@4CbepZUUb7>>va?~=0%MGCI*IIe~ zO+0@&MZ~uRM*tvQm|>EBlCNem(7bBhD6-Sn304-P<;=MN_=0ifU-2)U6*5( z@~=;1=U=EP$R@?;j?>i8h5!=)DyXI)J2f!|e=VaNt=);v$JDG@Y>#jYB>F8RO`N$t zL0`f3e4{z2!`!qHk?Jh@DJ_sN+r>|*6Gy1iY^wzs6TpMCf7KA)Mk!rZMLR+Puz5$r%5!Oo19YOjvXb>$L~ z&5Bfnr!A9Hm4^nw!myKv*jACp0^CUfuurl)c0UIt{Ed!kmO2&U3__ef#5B+mZK&b; z`>Q+kXqMogLiXs3m>D{raJ$T795k2mn z0=PKL%ls|NgFBcIMkqM4Jm~L8R+(wfBy+EzO--e%2#}n0+sE2!siqEtJlJ>qsd7-r zTo~;A=G7{3P>47o!V?#$!v_id5yio$-{f4|W&B@b99fZp$M|Cr+JpV9!`fAiLY7|yHf8a$J;No@$#-kXOTaln4_~xZOaRw%c1MEU#ln4zv zDwht=pUV}zyV9+Ok{2mz`(;LpJ)kcZ>;Ca}2a6+slNmZn7|F59n#l%4yhV~ZXByg& zCF3(sf4vAf%&q}WeG$PD`OY~U+h#R&S%qeCrb6O!kfT!T4EI5yf)@E_yqEPG#-v$t z{d3mkr&3^dQ4$&0U1aruVMjhF)E|?^81k9eT)u6}&CP_Nqgs!Q7g)d=lU7eeH$R&m zI)lM&fFVds7`ISPO87?;C!0s39}hK^W2_Zb!Do1o+3eYVWMwy42cYXyK=fjveY zB;yjf2oH-G4-HMV7EscHM)2Q~#Kj3v)B)n(aB&aB3%y~13wLU&S0%tM^*tG<`e=7J z@Kd6}v!j=Ime;HR_>rFp@iszS3oFooM)Kb(u#ysh$sCCPI~hkb=sfINr@VTcWW+IP zf(diBX2(8{Pt;U4G*m)WF3)&v`}W~K#N*{M;lhK|$o$7GrOT9!SHzRrdA}iC3m3=n zIjv?0uz4?g*=D)7|Wbczz^ru_Q-#C!#e5sMws*m*&$3s4@&zy20YG4@r!d7^fM zvg`Fh4Q!}6W9L_31DUsd3(ZC?ba|rbd5TI0K^?VPQT7{SnoxxS5|XT%*!khYQ`G3A z7CX3(`@boj@JDDy%HkDcl?nG3V)E?=I`dY90R@`;2&-U7w|@z6-)`7XB!lJuM*!sk z6b~lur~`YJCzyo1?5C1o^O3muj5#rq5|R=bNfCf^(A}QBQoM9%Q=Wzh;IpAlytv<^ z)MWhp50!RJN0~Tt?EOZ2(h&>d+w6eMh&EhfS7zhrPq*Xde~Bu;MfS@K$fU)EzXB;v{{Py#3aB`eCcL=2YjAhB;O-LK-5nA% z5G3dZhu{+2AuR4ra0xDfpur_*fPa(!a(Cg~ytg}V=gs$ZSI=~JRrOXE6u3TebLkW1i6Y5{H~nX@6bGkN*U8Xjz-LEAIg>G&Xz5gEI{j0gV~ zpK|hoFol_>VkDNdj@a0!TAH+@i)|8RSNdRYZuHcVntR&#E)*(_c9Grzy+ z7NXNrE6T>1YJp%LiXJbXteOr|%TXL6o&0_o3X?cb+xS|hcnT#<9gB7G>cRGE*}X*U z`j3MXG0TDXW{mq?T@)yLlJ>fr^VtF{D#mZ5>Zi1ubvK2Odk7v4YTihJ-5`*-x+&vy z!xZ#q1aG9kZ*$ZEN>t(~iK$>z#`sQfymp5!8Y-@>EUn%!g$&pY{!s&&E#c#3s#N_X zn8^Yit|xxnTF1Q)7PsUy4qnH?a3hx~DqmIz8dtXwovD_UNnKzl_>hU?q^FuHo%rtx zPRnk}j_(WY+1-QoKz5B^^P~Pw6Dk|B=oC87v(id|TlCH=Mu8 zEH-c5<2;J~PvnG40C&C+t{gk0~{}SSqVjBw{-- z_~~kb8GL}Kxcy~JBzPj2Xnr451z70J!)YK5aq1Q|PzlCfo%2pIa#?cJpfUB2!bdgnBY4Nh>8hvG=EJs6FV%WsUvexNns8IrMKdrL#aPSna3UqY zuNnM>Cu_8jq=tBrvWrW(dy^_2ddR~S5rH*W*UuL*qB4H(^BFb=F#h111uQS``dN=$ zdbV|2BT77#aHvJprd^t6+nzwTM#CK`NQ6HP#ml~itaTz0S<6XKIYT-(+qvY#3!;(r z3;xi4ckowNBz$H3VHbnv=yhk2grE>lcPqv`-nKPmiR{D;yT*X;niMLck0q8BdLC5~ zc6(nnyZMfoN~+NkeVa<6mh};qU1U_5OUDIQF2GU0!XViWE97UgJuA|9z1Q|f;c&h4 zL=r=O*JuQ5A}>9x1zweh;;5Bc`qd!pNJ#VQ6A5re8RN8bp63yd0?F(5#VtKvQRwAy)7FEK=&M8 zR=QGhEHEBgf#o^0TE&DJez`{Z%#v}J6u>!OaAH<7iX%)5^}(iZ2+7C}eKg}-Ii1`0 z4p`ZfQR}mxOObqif70KW8WFIyu?qH61e`;$-tKJWF-NHdM=7o=SQK1>RZHA{9S`rY z4`D^pq4Mk7F9eP*h^tn z!ci-?gAU#*d59o7hnQquhj@|*!|WTaQ;10BigKPSMX`}BPUVkEI?^fNX#*YKJNa(T zPah$OX1$NZWH6XVKTXEeFXu7u!tJO*s=k1*r=k9tIn7E3UK(stg-7bo0{SQ~7igxs)=d-N<**X~huppS%qB5P!G`5FfL5?zszO@!*iY zR;%Y$r-5aLQ&!*J-ulvX58D3edC>r?@uM0Z&*gNytrsr?UNbA!RCb>QT2Jh1oT;aI zH;U*4V9pYV@Cc3myn(%iFOSAnQ*6Hg7(O+aNo!NhWRvM6H-Tz1*nzlc_TbL`2x{yw z9_h#yc2Y!+_%VJ)gDDqL{)vdqTQGLT_AFVX-ssB<6PL}d5dDVzT$N!XVii1|H@s})cvWZp79xfLeNrQH7z z)aGy#h9xQXSsYLSH5e{_ma@REX_?6z{SNmeH*9fsWfFb~9vQp9^AHl?{y-Y{to@4} z6EO&33DlFBAj_DBrp@P@bfa-SQq-z|KOdIwICM|q!zLQm4GHZ=PP?eZ|Kp=PyNn!V z9JVA=p5ny!9+6BIF?4yI&wKM;_~)9p-@gy1+uD|dLHBKbm^h$4(P=VFw!BR%b_IpnI`zq_4>PhEFI_3# z6|>@696;1UO8v^fdGRE zoofNN2Mxv@27%~uz57+!_oo{R`_96T=V7!`jVQ2Ta?1eU@L<7Rz=5g?gK-@-VJ&qo z6y64vN6$0&T?rVLpzk4NT}O)KZ=?cIr$}6~hs^ZD8`-^!=|TIo5wZixZyUFK2+g9@ zr*g~Z0S$@xa!X1-P9dA-sSxJhxOAwNJ28a#B#3SkvMlHCQz#`lQhY#s7Z(Gq>h6J- zOYs9Ln)}hgG+j+u22!Xq2gWv5#X?RYZ5rIZES`(CVgN}5|;!-b*MrMfzLXivEDX=eyd%el8S<>woR^mafVit~Z zB}EeNJAFfAmtv==EE0}94R>Msd`#Drf`m7GIW)-T3-fe@OLwY$lHY|sY=k$*#Oc(E zuk@JD5l7oubtAgtsI|RS9D>j5eOXFw<&*yH)x3yS$GJs|!jePMy>flr+?w!xr@+eF zI#biyqPrz=(dIHwdiRsC$r+yY-Zg2CH{-sG-YSB}w${Z(%;oZB#}+Ope~pdg z#MUN;nVDJI0_npu+Y+@1d==Rk`LFMNHm?tj_b`C@-HMsFo2e?vvh+$H32kXVVq$I< zvnj#c2xW}BMQgidkYY4Xhz;nbRKG5GS^uG!tt4gQsxGghm2R;+$hmkWa+Vj@Vq(%?!spFvVR%PC4>DbKf0)MX$|+s}G4dP!HBQM*Iv>o#2C^=#7KW(*)tE^~$! z4+``p&rB#bDy({_0?%)10s`-cp>#bTIxXImjB{wRo@_%Vzdm*@c3&5lg~S^}RA%g0 zmGoGM4&PGo?aDcubonG*R%>`jvdB_Yo3V6s;mBJ?GAP4MYYwk(q>K+;%2&tyDMZ1t z1yf%u!eE8EM#XAE3!6&$&Vr5#nKV<%jP-53ag$0)-6Ujovi9~gwfRYi9|LO2iS0q( z$&c(Iqk^xwCe?zE>#0l#ZZUlKRfgAae@=W^fdX?y;0X^Fti57^&*q-)9?p(Bjt;E0 z9+r;3roD>j8pLikY{1oPsiF9xLV0u>`MdUB9vj>wx#Y^2+$(ISH-wxsf6V- zJ*;5PTA>cDYD7%8a0~go@I)@*Pg|ec!1B<7hd0FgueRu&@vx4kud!7aq0mmxIQB+z73v31!9RCl&e~PT?=IrAB>#1hO z);I;TVN1Pg?>^fYV$XrL!48)N(A$5OHze^2q;{ZOk_47M_$mo-n-9FI^f>w~NG!4y z;$%`j!9Y7nLk0h$OfdItMr#K*7v-QprGT(441ZHF^#BE*$ICU>fr@EZ7F4P;(yi3d z)7|A(>ydg&Stni}*sUHTqM=NY(N2%GC|rgW7R*F*SA3ds!&ZgYg9wzzxZtQ#w;!6k zu4$HP;`{DX6C4Xiy9)2MxEwbOb+c8}K+GMk7-V(Iw}*bAtCgD(6{~&WkEpGY`&1Vu z*Fvl8zFf6MpWv>~lPRvBSZT2nVG;IVpG*W;yZhVbaPo9CvvdP{WqxXRqdF^28+`a} zYek}Q(gvW21TJWJO)Cg>Mo}*y>qBRMoZH1B9uMbx#yEF$^>Ie&%m}3)-0iw2#>kl#G zcNj}kFqjNgMRYm>i?pZni?XTF4uU}5@a~J`4V{z3s!hj{l2L6&VoKlfzNwcaUo5mE zzOc({^l^qdz-g4_eE7k^gZTAq$}>ZC#azp^wJMx8yyQzH5@JC!j(sS4)zYT4D~;*~ z42=#cm$vHULI12)wOW^}#^+piO3h9i8M)MveYbP*s9ec#g~$qmkiRes>trre#oy^#fIVeR6Mh>Sdphvq>H*I#5Q%z8}T_ zT{BL-wJ2M5-v~t8C|eL%^P{<-jrWzxaLtwlJyV|o&XO2Mecl1*d%gO16U=efNQ>lW zZnCPWAMj}C(#NK$lw=7qd^%HA{CQ(yGf_>r6QfFK7%Wne&zL@oQ|c+Ps72FL;dCM0 zs`UxKS+aYm0!QH5P@nH@rVk>j-!b)b$W)k??1wP+iS6X(D0%&{wJ zdus*BS(06Y^CA+g?S{I(qWQYKeK?Y?lDFWu2y{JGnJ~wFzBVdw1~TNmgKvkWF>c$g zaE0AgWA$>*y>Q&n}2xwT0p0q#tv5a&T9?B&tG zCC2t#=g~;D7zz_xPb=YkC$hV}NiG4borwhJ2!H4T?PKohBhsHER^H&ObsG!-5JCn3 z;DJXhaN_P?!xY%^0{2fRQ(FfXI~PmqLoIt3EKO|T7GGX^$5C`TW^B0b7LLw*W^qPH z9^1vjM4o)+D%ZDi2})RLG^Venla({$ZUNuJg!~?BuwQs&xT;PD38+hn%D|x`VdM8x z*qw3?9uR_?qfG`Y8yZIBz;K#TsEQv7&ZtF@7_(Xxv*UPKb2jN?t z-{GK=aO@P#(5VWf`&jPmKFu^)BuBHVWhx~5-cw(`Z)YY}y`! z%(oeYUJmTrl<_g>t83tl9S`n{MuLVHBN1Lf4;eOrq)iNhVMnI$Y5fug(1X4}v^nK` zB?`3&JI9X=PK6rjWBF1f6Ig~^siw_GG#w&~%bwuZx)Y1Yk%Ap7&K7sGDa;Xr{Q(p^ zLhycHRxi8K^Cj6BL%7L{Qhns)?+bAmy*`Hlglxs-7Po&aAIrx5H(({TK=f66wnBEyIgsYY2>2qg;JWjYdx& zyh+%6n%osSE<6(&@1b3>i&8nR>}5k60!m6@$o1FjwiC8{SXee+by&4~I89?gTcmcv zY6!jyTpBvu5Qf8QNZ;QU-n<0Q-pAB!Wkkm@Z(dc+5LG4n!0v+p5W#(Hi)>x04*2%( zEsAA(IV}j>P%Pil?-D#eS&g4lsO&=twwR{X`KDY&iwRJ#+j{epXg(DiqeDH#r+m57d?-NUXW3h#P4TR9tbpR z?;X(e(Y^uaDdu=?Q;~aOH)(vFpyX|J?x2D3x)eI$`EC~b=q4hxVx$5`L=aWDQjj(5 z#Bq*~q_GFX8ZXVcXg3Wj^!q!cEL}LP`YnvWIqJajR0Mt0tO!aY=-srfci~DkoY|)B zfY{a>?{8HeNLflnd6Q9IMti)F2CL}6hZO>#(Q44C3giK*uk{YusEK?F5qs4$bA0ZXoD28N08g!(r{bGtL4kPo+uL?w5@W&HPC$lY&Q5C;JJq z2BP4IBUp39D0;VO3?0fIg4A77{HUh0QnCkAOPzNo0{)+3XSlEr@DZ7MT$$FrvP^78 zpmyQRHp76!%u^`Fn^Q5yNpTHUJ==*0$%iYH8DV2eBUM;SVfj{8K;oq5wr7bMErnyP zzOx5G-M;00_3=|2zTTcnha1$_J}abM`p4&0iJP(-?!(_^!$@CmPJ;GHef_=`7G=HO zUf9VB$aNo{O)+|Hxl~rwb~C#qxa!?tzf&0_ym~&g>VGG4e=yu*{GFKJr~JxmZO?hk z?{4Ml-a3FUV11*i!|?V#M&vQilf4rqQP{?C9{MeH2&Io6UJsAPo4Av&Zk|1nxO;|W zZ)3*w6XH!5s=a-$Vi9h}+$q2HN|dBxSzjs%s3>SKw1B!7A2lqYLaDzApzaYn@ljfb z+_-GXqk2@M6$Zf)+T^_X&#y<$@XKxyRRsu0Y^a~^ad<#^8m~@;dO=(gSVR2;_PPBu zJANO5;A;SYz697AZ0Y1-{KDJC(%tZ4$`CIJ9^H6Wf8{vO;Aubka1SiuyYj$qmU3+@z1gvkLed>C95 z@gIeMp!y5`f64z%@}I2$EW;IyVg&$A*Z3d&e*9nfr#|GT6i@B%e<(In|I-?OO7PUs{fD46?cW6dW%fShdTKlV!v#wJ zH`kw*0S${&W;Q~XnX@E^Q&&cC|YpW30S0t~nZ{p`{h08?=H&@KG= F>wjcYH|78U literal 0 HcmV?d00001 diff --git a/twml/twml/contrib/calibrators/common_calibrators.py b/twml/twml/contrib/calibrators/common_calibrators.py deleted file mode 100644 index 5301901e4..000000000 --- a/twml/twml/contrib/calibrators/common_calibrators.py +++ /dev/null @@ -1,707 +0,0 @@ -# pylint: disable=invalid-name, no-member, unused-argument -""" -This module contains common calibrate and export functions for calibrators. -""" - -# These 3 TODO are encapsulated by CX-11446 -# TODO: many of these functions hardcode datarecords yet don't allow passing a parse_fn. -# TODO: provide more generic (non DataRecord specific) functions -# TODO: many of these functions aren't common at all. -# For example, Discretizer functions should be moved to PercentileDiscretizer. - -import copy -import os -import time - -from absl import logging -import tensorflow.compat.v1 as tf -import tensorflow_hub as hub -import twml -from twml.argument_parser import SortingHelpFormatter -from twml.input_fns import data_record_input_fn -from twml.util import list_files_by_datetime, sanitize_hdfs_path -from twml.contrib.calibrators.isotonic import IsotonicCalibrator - - -def calibrator_arguments(parser): - """ - Calibrator Parameters to add to relevant parameters to the DataRecordTrainerParser. - Otherwise, if alone in a file, it just creates its own default parser. - Arguments: - parser: - Parser with the options to the model - """ - parser.add_argument("--calibrator.save_dir", type=str, - dest="calibrator_save_dir", - help="Path to save or load calibrator calibration") - parser.add_argument("--calibrator_batch_size", type=int, default=128, - dest="calibrator_batch_size", - help="calibrator batch size") - parser.add_argument("--calibrator_parts_downsampling_rate", type=float, default=1, - dest="calibrator_parts_downsampling_rate", - help="Parts downsampling rate") - parser.add_argument("--calibrator_max_steps", type=int, default=None, - dest="calibrator_max_steps", - help="Max Steps taken by calibrator to accumulate samples") - parser.add_argument("--calibrator_num_bins", type=int, default=22, - dest="calibrator_num_bins", - help="Num bins of calibrator") - parser.add_argument("--isotonic_calibrator", dest='isotonic_calibrator', action='store_true', - help="Isotonic Calibrator present") - parser.add_argument("--calibrator_keep_rate", type=float, default=1.0, - dest="calibrator_keep_rate", - help="Keep rate") - return parser - - -def _generate_files_by_datetime(params): - - files = list_files_by_datetime( - base_path=sanitize_hdfs_path(params.train_data_dir), - start_datetime=params.train_start_datetime, - end_datetime=params.train_end_datetime, - datetime_prefix_format=params.datetime_format, - extension="lzo", - parallelism=1, - hour_resolution=params.hour_resolution, - sort=True) - - return files - - -def get_calibrate_input_fn(parse_fn, params): - """ - Default input function used for the calibrator. - Arguments: - parse_fn: - Parse_fn - params: - Parameters - Returns: - input_fn - """ - - return lambda: data_record_input_fn( - files=_generate_files_by_datetime(params), - batch_size=params.calibrator_batch_size, - parse_fn=parse_fn, - num_threads=1, - repeat=False, - keep_rate=params.calibrator_keep_rate, - parts_downsampling_rate=params.calibrator_parts_downsampling_rate, - shards=None, - shard_index=None, - shuffle=True, - shuffle_files=True, - interleave=True) - - -def get_discretize_input_fn(parse_fn, params): - """ - Default input function used for the calibrator. - Arguments: - parse_fn: - Parse_fn - params: - Parameters - Returns: - input_fn - """ - - return lambda: data_record_input_fn( - files=_generate_files_by_datetime(params), - batch_size=params.discretizer_batch_size, - parse_fn=parse_fn, - num_threads=1, - repeat=False, - keep_rate=params.discretizer_keep_rate, - parts_downsampling_rate=params.discretizer_parts_downsampling_rate, - shards=None, - shard_index=None, - shuffle=True, - shuffle_files=True, - interleave=True) - - -def discretizer_arguments(parser=None): - """ - Discretizer Parameters to add to relevant parameters to the DataRecordTrainerParser. - Otherwise, if alone in a file, it just creates its own default parser. - Arguments: - parser: - Parser with the options to the model. Defaults to None - """ - - if parser is None: - parser = twml.DefaultSubcommandArgParse(formatter_class=SortingHelpFormatter) - parser.add_argument( - "--overwrite_save_dir", dest="overwrite_save_dir", action="store_true", - help="Delete the contents of the current save_dir if it exists") - parser.add_argument( - "--train.data_dir", "--train_data_dir", type=str, default=None, - dest="train_data_dir", - help="Path to the training data directory." - "Supports local and HDFS (hdfs://default/ ) paths.") - parser.add_argument( - "--train.start_date", "--train_start_datetime", - type=str, default=None, - dest="train_start_datetime", - help="Starting date for training inside the train data dir." - "The start datetime is inclusive." - "e.g. 2019/01/15") - parser.add_argument( - "--train.end_date", "--train_end_datetime", type=str, default=None, - dest="train_end_datetime", - help="Ending date for training inside the train data dir." - "The end datetime is inclusive." - "e.g. 2019/01/15") - parser.add_argument( - "--datetime_format", type=str, default="%Y/%m/%d", - help="Date format for training and evaluation datasets." - "Has to be a format that is understood by python datetime." - "e.g. %Y/%m/%d for 2019/01/15." - "Used only if {train/eval}.{start/end}_date are provided.") - parser.add_argument( - "--hour_resolution", type=int, default=None, - help="Specify the hourly resolution of the stored data.") - parser.add_argument( - "--tensorboard_port", type=int, default=None, - help="Port for tensorboard to run on.") - parser.add_argument( - "--stats_port", type=int, default=None, - help="Port for stats server to run on.") - parser.add_argument( - "--health_port", type=int, default=None, - help="Port to listen on for health-related endpoints (e.g. graceful shutdown)." - "Not user-facing as it is set automatically by the twml_cli." - ) - parser.add_argument( - "--data_spec", type=str, default=None, - help="Path to data specification JSON file. This file is used to decode DataRecords") - parser.add_argument("--discretizer.save_dir", type=str, - dest="discretizer_save_dir", - help="Path to save or load discretizer calibration") - parser.add_argument("--discretizer_batch_size", type=int, default=128, - dest="discretizer_batch_size", - help="Discretizer batch size") - parser.add_argument("--discretizer_keep_rate", type=float, default=0.0008, - dest="discretizer_keep_rate", - help="Keep rate") - parser.add_argument("--discretizer_parts_downsampling_rate", type=float, default=0.2, - dest="discretizer_parts_downsampling_rate", - help="Parts downsampling rate") - parser.add_argument("--discretizer_max_steps", type=int, default=None, - dest="discretizer_max_steps", - help="Max Steps taken by discretizer to accumulate samples") - return parser - - -def calibrate(trainer, params, build_graph, input_fn, debug=False): - """ - Calibrate Isotonic Calibration - Arguments: - trainer: - Trainer - params: - Parameters - build_graph: - Build Graph used to be the input to the calibrator - input_fn: - Input Function specified by the user - debug: - Defaults to False. Returns the calibrator - """ - - if trainer._estimator.config.is_chief: - - # overwrite the current save_dir - if params.overwrite_save_dir and tf.io.gfile.exists(params.calibrator_save_dir): - logging.info("Trainer overwriting existing save directory: %s (params.overwrite_save_dir)" - % params.calibrator_save_dir) - tf.io.gfile.rmtree(params.calibrator_save_dir) - - calibrator = IsotonicCalibrator(params.calibrator_num_bins) - - # chief trains discretizer - logging.info("Chief training calibrator") - - # Accumulate the features for each calibrator - features, labels = input_fn() - if 'weights' not in features: - raise ValueError("Weights need to be returned as part of the parse_fn") - weights = features.pop('weights') - - preds = build_graph(features=features, label=None, mode='infer', params=params, config=None) - init = tf.global_variables_initializer() - table_init = tf.tables_initializer() - with tf.Session() as sess: - sess.run(init) - sess.run(table_init) - count = 0 - max_steps = params.calibrator_max_steps or -1 - while max_steps <= 0 or count <= max_steps: - try: - weights_vals, labels_vals, preds_vals = sess.run([weights, labels, preds['output']]) - calibrator.accumulate(preds_vals, labels_vals, weights_vals.flatten()) - except tf.errors.OutOfRangeError: - break - count += 1 - - calibrator.calibrate() - calibrator.save(params.calibrator_save_dir) - trainer.estimator._params.isotonic_calibrator = True - - if debug: - return calibrator - - else: - calibrator_save_dir = twml.util.sanitize_hdfs_path(params.calibrator_save_dir) - # workers wait for calibration to be ready - while not tf.io.gfile.exists(calibrator_save_dir + os.path.sep + "tfhub_module.pb"): - logging.info("Worker waiting for calibration at %s" % calibrator_save_dir) - time.sleep(60) - - -def discretize(params, feature_config, input_fn, debug=False): - """ - Discretizes continuous features - Arguments: - params: - Parameters - input_fn: - Input Function specified by the user - debug: - Defaults to False. Returns the calibrator - """ - - if (os.environ.get("TWML_HOGWILD_TASK_TYPE") == "chief" or "num_workers" not in params or - params.num_workers is None): - - # overwrite the current save_dir - if params.overwrite_save_dir and tf.io.gfile.exists(params.discretizer_save_dir): - logging.info("Trainer overwriting existing save directory: %s (params.overwrite_save_dir)" - % params.discretizer_save_dir) - tf.io.gfile.rmtree(params.discretizer_save_dir) - - config_map = feature_config() - discretize_dict = config_map['discretize_config'] - - # chief trains discretizer - logging.info("Chief training discretizer") - - batch = input_fn() - # Accumulate the features for each calibrator - with tf.Session() as sess: - count = 0 - max_steps = params.discretizer_max_steps or -1 - while max_steps <= 0 or count <= max_steps: - try: - inputs = sess.run(batch) - for name, clbrt in discretize_dict.items(): - clbrt.accumulate_features(inputs[0], name) - except tf.errors.OutOfRangeError: - break - count += 1 - - # This module allows for the calibrator to save be saved as part of - # Tensorflow Hub (this will allow it to be used in further steps) - def calibrator_module(): - # Note that this is usually expecting a sparse_placeholder - for name, clbrt in discretize_dict.items(): - clbrt.calibrate() - clbrt.add_hub_signatures(name) - - # exports the module to the save_dir - spec = hub.create_module_spec(calibrator_module) - with tf.Graph().as_default(): - module = hub.Module(spec) - with tf.Session() as session: - module.export(params.discretizer_save_dir, session) - - for name, clbrt in discretize_dict.items(): - clbrt.write_summary_json(params.discretizer_save_dir, name) - - if debug: - return discretize_dict - - else: - # wait for the file to be removed (if necessary) - # should be removed after an actual fix applied - time.sleep(60) - discretizer_save_dir = twml.util.sanitize_hdfs_path(params.discretizer_save_dir) - # workers wait for calibration to be ready - while not tf.io.gfile.exists(discretizer_save_dir + os.path.sep + "tfhub_module.pb"): - logging.info("Worker waiting for calibration at %s" % discretizer_save_dir) - time.sleep(60) - - -def add_discretizer_arguments(parser): - """ - Add discretizer-specific command-line arguments to a Trainer parser. - - Arguments: - parser: argparse.ArgumentParser instance obtained from Trainer.get_trainer_parser - - Returns: - argparse.ArgumentParser instance with discretizer-specific arguments added - """ - - parser.add_argument("--discretizer.save_dir", type=str, - dest="discretizer_save_dir", - help="Path to save or load discretizer calibration") - parser.add_argument("--discretizer.batch_size", type=int, default=128, - dest="discretizer_batch_size", - help="Discretizer batch size") - parser.add_argument("--discretizer.keep_rate", type=float, default=0.0008, - dest="discretizer_keep_rate", - help="Keep rate") - parser.add_argument("--discretizer.parts_downsampling_rate", type=float, default=0.2, - dest="discretizer_parts_downsampling_rate", - help="Parts downsampling rate") - parser.add_argument("--discretizer.num_bins", type=int, default=20, - dest="discretizer_num_bins", - help="Number of bins per feature") - parser.add_argument("--discretizer.output_size_bits", type=int, default=22, - dest="discretizer_output_size_bits", - help="Number of bits allocated to the output size") - return parser - - -def add_isotonic_calibrator_arguments(parser): - """ - Add discretizer-specific command-line arguments to a Trainer parser. - - Arguments: - parser: argparse.ArgumentParser instance obtained from Trainer.get_trainer_parser - - Returns: - argparse.ArgumentParser instance with discretizer-specific arguments added - """ - parser.add_argument("--calibrator.num_bins", type=int, - default=25000, dest="calibrator_num_bins", - help="number of bins for isotonic calibration") - parser.add_argument("--calibrator.parts_downsampling_rate", type=float, default=0.1, - dest="calibrator_parts_downsampling_rate", help="Parts downsampling rate") - parser.add_argument("--calibrator.save_dir", type=str, - dest="calibrator_save_dir", help="Path to save or load calibrator output") - parser.add_argument("--calibrator.load_tensorflow_module", type=str, default=None, - dest="calibrator_load_tensorflow_module", - help="Location from where to load a pretrained graph from. \ - Typically, this is where the MLP graph is saved") - parser.add_argument("--calibrator.export_mlp_module_name", type=str, default='tf_hub_mlp', - help="Name for loaded hub signature", - dest="export_mlp_module_name") - parser.add_argument("--calibrator.export_isotonic_module_name", - type=str, default="tf_hub_isotonic", - dest="calibrator_export_module_name", - help="export module name") - parser.add_argument("--calibrator.final_evaluation_steps", type=int, - dest="calibrator_final_evaluation_steps", default=None, - help="number of steps for final evaluation") - parser.add_argument("--calibrator.train_steps", type=int, default=-1, - dest="calibrator_train_steps", - help="number of steps for calibration") - parser.add_argument("--calibrator.batch_size", type=int, default=1024, - dest="calibrator_batch_size", - help="Calibrator batch size") - parser.add_argument("--calibrator.is_calibrating", action='store_true', - dest="is_calibrating", - help="Dummy argument to allow running in chief worker") - return parser - - -def calibrate_calibrator_and_export(name, calibrator, build_graph_fn, params, feature_config, - run_eval=True, input_fn=None, metric_fn=None, - export_task_type_overrider=None): - """ - Pre-set `isotonic calibrator` calibrator. - Args: - name: - scope name used for the calibrator - calibrator: - calibrator that will be calibrated and exported. - build_graph_fn: - build graph function for the calibrator - params: - params passed to the calibrator - feature_config: - feature config which will be passed to the trainer - export_task_type_overrider: - the task type for exporting the calibrator - if specified, this will override the default export task type in trainer.hub_export(..) - """ - - # create calibrator params - params_c = copy.deepcopy(params) - params_c.data_threads = 1 - params_c.num_workers = 1 - params_c.continue_from_checkpoint = True - params_c.overwrite_save_dir = False - params_c.stats_port = None - - # Automatically load from the saved Tensorflow Hub module if not specified. - if params_c.calibrator_load_tensorflow_module is None: - path_saved_tensorflow_model = os.path.join(params.save_dir, params.export_mlp_module_name) - params_c.calibrator_load_tensorflow_module = path_saved_tensorflow_model - - if "calibrator_parts_downsampling_rate" in params_c: - params_c.train_parts_downsampling_rate = params_c.calibrator_parts_downsampling_rate - if "calibrator_save_dir" in params_c: - params_c.save_dir = params_c.calibrator_save_dir - if "calibrator_batch_size" in params_c: - params_c.train_batch_size = params_c.calibrator_batch_size - params_c.eval_batch_size = params_c.calibrator_batch_size - # TODO: Deprecate this option. It is not actually used. Calibrator - # simply iterates until the end of input_fn. - if "calibrator_train_steps" in params_c: - params_c.train_steps = params_c.calibrator_train_steps - - if metric_fn is None: - metric_fn = twml.metrics.get_multi_binary_class_metric_fn(None) - - # Common Trainer which will also be used by all workers - trainer = twml.trainers.DataRecordTrainer( - name=name, - params=params_c, - feature_config=feature_config, - build_graph_fn=build_graph_fn, - save_dir=params_c.save_dir, - metric_fn=metric_fn - ) - - if trainer._estimator.config.is_chief: - - # Chief trains calibrator - logging.info("Chief training calibrator") - - # Disregard hogwild config - os_twml_hogwild_ports = os.environ.get("TWML_HOGWILD_PORTS") - os.environ["TWML_HOGWILD_PORTS"] = "" - - hooks = None - if params_c.calibrator_train_steps > 0: - hooks = [twml.hooks.StepProgressHook(params_c.calibrator_train_steps)] - - def parse_fn(input_x): - fc_parse_fn = feature_config.get_parse_fn() - features, labels = fc_parse_fn(input_x) - features['labels'] = labels - return features, labels - - if input_fn is None: - input_fn = trainer.get_train_input_fn(parse_fn=parse_fn, repeat=False) - - # Calibrate stage - trainer.estimator._params.mode = 'calibrate' - trainer.calibrate(calibrator=calibrator, - input_fn=input_fn, - steps=params_c.calibrator_train_steps, - hooks=hooks) - - # Save Checkpoint - # We need to train for 1 step, to save the graph to checkpoint. - # This is done just by the chief. - # We need to set the mode to evaluate to save the graph that will be consumed - # In the final evaluation - trainer.estimator._params.mode = 'evaluate' - trainer.train(input_fn=input_fn, steps=1) - - # Restore hogwild setup - if os_twml_hogwild_ports is not None: - os.environ["TWML_HOGWILD_PORTS"] = os_twml_hogwild_ports - else: - # Workers wait for calibration to be ready - final_calibrator_path = os.path.join(params_c.calibrator_save_dir, - params_c.calibrator_export_module_name) - - final_calibrator_path = twml.util.sanitize_hdfs_path(final_calibrator_path) - - while not tf.io.gfile.exists(final_calibrator_path + os.path.sep + "tfhub_module.pb"): - logging.info("Worker waiting for calibration at %s" % final_calibrator_path) - time.sleep(60) - - # Evaluate stage - if run_eval: - trainer.estimator._params.mode = 'evaluate' - # This will allow the Evaluate method to be run in Hogwild - # trainer.estimator._params.continue_from_checkpoint = True - trainer.evaluate(name='test', input_fn=input_fn, steps=params_c.calibrator_final_evaluation_steps) - - trainer.hub_export(name=params_c.calibrator_export_module_name, - export_task_type_overrider=export_task_type_overrider, - serving_input_receiver_fn=feature_config.get_serving_input_receiver_fn()) - - return trainer - - -def calibrate_discretizer_and_export(name, calibrator, build_graph_fn, params, feature_config): - """ - Pre-set percentile discretizer calibrator. - Args: - name: - scope name used for the calibrator - calibrator: - calibrator that will be calibrated and exported. - build_graph_fn: - build graph function for the calibrator - params: - params passed to the calibrator - feature_config: - feature config or input_fn which will be passed to the trainer. - """ - - if (os.environ.get("TWML_HOGWILD_TASK_TYPE") == "chief" or "num_workers" not in params or - params.num_workers is None): - - # chief trains discretizer - logging.info("Chief training discretizer") - - # disregard hogwild config - os_twml_hogwild_ports = os.environ.get("TWML_HOGWILD_PORTS") - os.environ["TWML_HOGWILD_PORTS"] = "" - - # create discretizer params - params_c = copy.deepcopy(params) - params_c.data_threads = 1 - params_c.train_steps = -1 - params_c.train_max_steps = None - params_c.eval_steps = -1 - params_c.num_workers = 1 - params_c.tensorboard_port = None - params_c.stats_port = None - - if "discretizer_batch_size" in params_c: - params_c.train_batch_size = params_c.discretizer_batch_size - params_c.eval_batch_size = params_c.discretizer_batch_size - if "discretizer_keep_rate" in params_c: - params_c.train_keep_rate = params_c.discretizer_keep_rate - if "discretizer_parts_downsampling_rate" in params_c: - params_c.train_parts_downsampling_rate = params_c.discretizer_parts_downsampling_rate - if "discretizer_save_dir" in params_c: - params_c.save_dir = params_c.discretizer_save_dir - - # train discretizer - trainer = twml.trainers.DataRecordTrainer( - name=name, - params=params_c, - build_graph_fn=build_graph_fn, - save_dir=params_c.save_dir, - ) - - if isinstance(feature_config, twml.feature_config.FeatureConfig): - parse_fn = twml.parsers.get_continuous_parse_fn(feature_config) - input_fn = trainer.get_train_input_fn(parse_fn=parse_fn, repeat=False) - elif callable(feature_config): - input_fn = feature_config - else: - got_type = type(feature_config).__name__ - raise ValueError( - "Expecting feature_config to be FeatureConfig or function got %s" % got_type) - - hooks = None - if params_c.train_steps > 0: - hooks = [twml.hooks.StepProgressHook(params_c.train_steps)] - - trainer.calibrate(calibrator=calibrator, input_fn=input_fn, - steps=params_c.train_steps, hooks=hooks) - # restore hogwild setup - if os_twml_hogwild_ports is not None: - os.environ["TWML_HOGWILD_PORTS"] = os_twml_hogwild_ports - else: - discretizer_save_dir = twml.util.sanitize_hdfs_path(params.discretizer_save_dir) - # workers wait for calibration to be ready - while not tf.io.gfile.exists(discretizer_save_dir + os.path.sep + "tfhub_module.pb"): - logging.info("Worker waiting for calibration at %s" % discretizer_save_dir) - time.sleep(60) - - -def build_percentile_discretizer_graph(features, label, mode, params, config=None): - """ - Pre-set Percentile Discretizer Build Graph - Follows the same signature as build_graph - """ - sparse_tf = twml.util.convert_to_sparse(features, params.input_size_bits) - weights = tf.reshape(features['weights'], tf.reshape(features['batch_size'], [1])) - if isinstance(sparse_tf, tf.SparseTensor): - indices = sparse_tf.indices[:, 1] - ids = sparse_tf.indices[:, 0] - elif isinstance(sparse_tf, twml.SparseTensor): - indices = sparse_tf.indices - ids = sparse_tf.ids - - # Return weights, feature_ids, feature_values - weights = tf.gather(params=weights, indices=ids) - feature_ids = indices - feature_values = sparse_tf.values - # Update train_op and assign dummy_loss - train_op = tf.assign_add(tf.train.get_global_step(), 1) - loss = tf.constant(1) - if mode == 'train': - return {'train_op': train_op, 'loss': loss} - return {'feature_ids': feature_ids, 'feature_values': feature_values, 'weights': weights} - - -def isotonic_module(mode, params): - """ - Common Isotonic Calibrator module for Hub Export - """ - inputs = tf.sparse_placeholder(tf.float32, name="sparse_input") - mlp = hub.Module(params.calibrator_load_tensorflow_module) - logits = mlp(inputs, signature=params.export_mlp_module_name) - isotonic_calibrator = hub.Module(params.save_dir) - output = isotonic_calibrator(logits, signature="isotonic_calibrator") - hub.add_signature(inputs={"sparse_input": inputs}, - outputs={"default": output}, - name=params.calibrator_export_module_name) - - -def build_isotonic_graph_from_inputs(inputs, features, label, mode, params, config=None, isotonic_fn=None): - """ - Helper function to build_isotonic_graph - Pre-set Isotonic Calibrator Build Graph - Follows the same signature as build_graph - """ - if params.mode == 'calibrate': - mlp = hub.Module(params.calibrator_load_tensorflow_module) - logits = mlp(inputs, signature=params.export_mlp_module_name) - weights = tf.reshape(features['weights'], tf.reshape(features['batch_size'], [1])) - # Update train_op and assign dummy_loss - train_op = tf.assign_add(tf.train.get_global_step(), 1) - loss = tf.constant(1) - if mode == 'train': - return {'train_op': train_op, 'loss': loss} - return {'predictions': logits, 'targets': features['labels'], 'weights': weights} - else: - if isotonic_fn is None: - isotonic_spec = twml.util.create_module_spec(mlp_fn=isotonic_module, mode=mode, params=params) - else: - isotonic_spec = twml.util.create_module_spec(mlp_fn=isotonic_fn, mode=mode, params=params) - output_hub = hub.Module(isotonic_spec, - name=params.calibrator_export_module_name) - hub.register_module_for_export(output_hub, params.calibrator_export_module_name) - output = output_hub(inputs, signature=params.calibrator_export_module_name) - output = tf.clip_by_value(output, 0, 1) - loss = tf.reduce_sum(tf.stop_gradient(output)) - train_op = tf.assign_add(tf.train.get_global_step(), 1) - return {'train_op': train_op, 'loss': loss, 'output': output} - - -def build_isotonic_graph(features, label, mode, params, config=None, export_discretizer=True): - """ - Pre-set Isotonic Calibrator Build Graph - Follows the same signature as build_graph - This assumes that MLP already contains all modules (include percentile - discretizer); if export_discretizer is set - then it does not export the MDL phase. - """ - sparse_tf = twml.util.convert_to_sparse(features, params.input_size_bits) - if export_discretizer: - return build_isotonic_graph_from_inputs(sparse_tf, features, label, mode, params, config) - discretizer = hub.Module(params.discretizer_path) - - if params.discretizer_signature is None: - discretizer_signature = "percentile_discretizer_calibrator" - else: - discretizer_signature = params.discretizer_signature - input_sparse = discretizer(sparse_tf, signature=discretizer_signature) - return build_isotonic_graph_from_inputs(input_sparse, features, label, mode, params, config) diff --git a/twml/twml/contrib/calibrators/hashed_percentile_discretizer.docx b/twml/twml/contrib/calibrators/hashed_percentile_discretizer.docx new file mode 100644 index 0000000000000000000000000000000000000000..6be90b65b9f262b65b1c931e622b7fbccc24b214 GIT binary patch literal 37071 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%0DsbF4L}d~ugyt4LY>GbdD) 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%0Ajq<_|Z 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 - ''' - - def _get_bin_boundaries(self, n_samples, bins, similar_bins): - """ - Calculates the sample indices that define bin boundaries - - Arguments: - n_samples: - (int) number of samples - bins: - (int) number of bins. Needs to be smaller or equal than n_samples. - similar_bins: - (bool) If True, samples will be distributed in bins of equal size (up to one sample). - If False bins will be filled with step = N_samples//bins, and last bin will contain all remaining samples. - Note that equal_bins=False can create a last bins with a very large number of samples. - - Returns: - (list[int]) List of sample indices defining bin boundaries - """ - - if bins > n_samples: - raise ValueError( - "The number of bins needs to be less than or equal to the number of samples. " - "Currently bins={0} and n_samples={1}.".format(bins, n_samples) - ) - - step = n_samples // bins - - if similar_bins: - # dtype=int will floor the linspace - bin_boundaries = np.linspace(0, n_samples - step, num=bins, dtype=int) - else: - bin_boundaries = range(0, step * bins, step) - - bin_boundaries = np.append(bin_boundaries, n_samples) - - return bin_boundaries - - def calibrate(self, bins, similar_bins=False, debug=False): - '''Calibrates the IsotonicFeature into calibrated weights and bias. - - 1. Sorts the values of the feature class, based on the order of values - 2. Performs isotonic regression using sklearn.isotonic.isotonic_regression - 3. Performs the binning of the samples, in order to obtain the final weight and bias - which will be used for inference - - Note that this method can only be called once. - - Arguments: - bins: - number of bins. - similar_bins: - If True, samples will be distributed in bins of equal size (up to one sample). - If False bins will be filled with step = N_samples//bins, and last bin will contain all remaining samples. - Note that equal_bins=False can create a last bins with a very large number of samples. - debug: - Defaults to False. If debug is set to true, output other parameters useful for debugging. - - Returns: - [calibrated weight, calibrated bias] - ''' - if self._calibrated: - raise RuntimeError("Can only calibrate once") - # parse through the dict to obtain the targets, weights and values - self._concat_arrays() - feature_targets = self._features_dict['targets'] - feature_values = self._features_dict['values'] - feature_weights = self._features_dict['weights'] - srtd_feature_values, srtd_feature_targets, srtd_feature_weights = sort_values( - inputs=feature_values, - target=feature_targets, - weight=feature_weights - ) - calibrated_feature_values = isotonic_regression( - srtd_feature_targets, sample_weight=srtd_feature_weights) - # create the final outputs for the prediction of each class - bpreds = [] - btargets = [] - bweights = [] - rpreds = [] - - # Create bin boundaries - bin_boundaries = self._get_bin_boundaries( - len(calibrated_feature_values), bins, similar_bins=similar_bins) - - for sidx, eidx in zip(bin_boundaries, bin_boundaries[1:]): - # separate each one of the arrays based on their respective bins - lpreds = srtd_feature_values[int(sidx):int(eidx)] - lrpreds = calibrated_feature_values[int(sidx):int(eidx)] - ltargets = srtd_feature_targets[int(sidx):int(eidx)] - lweights = srtd_feature_weights[int(sidx):int(eidx)] - - # calculate the outputs (including the bpreds and rpreds) - bpreds.append(np.sum(lpreds * lweights) / (np.squeeze(np.sum(lweights)))) - rpreds.append(np.sum(lrpreds * lweights) / (np.squeeze(np.sum(lweights)))) - btargets.append(np.sum(ltargets * lweights) / (np.squeeze(np.sum(lweights)))) - bweights.append(np.squeeze(np.sum(lweights))) - # transposing the bpreds and rpreds which will be used as input to the inference step - bpreds = np.asarray(bpreds).T - rpreds = np.asarray(rpreds).T - btargets = np.asarray(btargets).T - bweights = np.asarray(bweights).T - # setting _calibrated to be True which is necessary in order to prevent it to re-calibrate - self._calibrated = True - if debug: - return bpreds, rpreds, btargets, bweights - return bpreds, rpreds - - -class IsotonicCalibrator(Calibrator): - ''' Accumulates features and their respective values for isotonic calibration. - Internally, each feature's values is accumulated via its own isotonicFeature object. - The steps for calibration are typically as follows: - - 1. accumulate feature values from batches by calling ``accumulate()``; - 2. calibrate all feature into Isotonic ``bpreds``, ``rpreds`` by calling ``calibrate()``; and - 3. convert to a ``twml.layers.Isotonic`` layer by calling ``to_layer()``. - - ''' - - def __init__(self, n_bin, similar_bins=False, **kwargs): - ''' Constructs an isotonicCalibrator instance. - - Arguments: - n_bin: - the number of bins per feature to use for isotonic. - Note that each feature actually maps to ``n_bin+1`` output IDs. - ''' - super(IsotonicCalibrator, self).__init__(**kwargs) - self._n_bin = n_bin - self._similar_bins = similar_bins - self._ys_input = [] - self._xs_input = [] - self._isotonic_feature_dict = {} - - def accumulate_feature(self, output): - ''' - Wrapper around accumulate for trainer API. - Arguments: - output: output of prediction of build_graph for calibrator - ''' - weights = output['weights'] if 'weights' in output else None - return self.accumulate(output['predictions'], output['targets'], weights) - - def accumulate(self, predictions, targets, weights=None): - ''' - Accumulate a single batch of class predictions, class targets and class weights. - These are accumulated until calibrate() is called. - - Arguments: - predictions: - float matrix of class values. Each dimension corresponds to a different class. - Shape is ``[n, d]``, where d is the number of classes. - targets: - float matrix of class targets. Each dimension corresponds to a different class. - Shape ``[n, d]``, where d is the number of classes. - weights: - Defaults to weights of 1. - 1D array containing the weights of each prediction. - ''' - if predictions.shape != targets.shape: - raise ValueError( - 'Expecting predictions.shape == targets.shape, got %s and %s instead' % - (str(predictions.shape), str(targets.shape))) - if weights is not None: - if weights.ndim != 1: - raise ValueError('Expecting 1D weight, got %dD instead' % weights.ndim) - elif weights.size != predictions.shape[0]: - raise ValueError( - 'Expecting predictions.shape[0] == weights.size, got %d != %d instead' % - (predictions.shape[0], weights.size)) - # iterate through the rows of predictions and sets one class to each row - if weights is None: - weights = np.full(predictions.shape[0], fill_value=DEFAULT_SAMPLE_WEIGHT) - for class_key in range(predictions.shape[1]): - # gets the predictions and targets for that class - class_predictions = predictions[:, class_key] - class_targets = targets[:, class_key] - if class_key not in self._isotonic_feature_dict: - isotonic_feature = IsotonicFeature(class_key) - self._isotonic_feature_dict[class_key] = isotonic_feature - else: - isotonic_feature = self._isotonic_feature_dict[class_key] - isotonic_feature.add_values({'values': class_predictions, 'weights': weights, - 'targets': class_targets}) - - def calibrate(self, debug=False): - ''' - Calibrates each IsotonicFeature after accumulation is complete. - Results are stored in ``self._ys_input`` and ``self._xs_input`` - - Arguments: - debug: - Defaults to False. If set to true, returns the ``xs_input`` and ``ys_input``. - ''' - super(IsotonicCalibrator, self).calibrate() - bias_temp = [] - weight_temp = [] - logging.info("Beginning isotonic calibration.") - isotonic_features_dict = self._isotonic_feature_dict - for class_id in isotonic_features_dict: - bpreds, rpreds = isotonic_features_dict[class_id].calibrate(bins=self._n_bin, similar_bins=self._similar_bins) - weight_temp.append(bpreds) - bias_temp.append(rpreds) - # save isotonic results onto a matrix - self._xs_input = np.array(weight_temp, dtype=np.float32) - self._ys_input = np.array(bias_temp, dtype=np.float32) - logging.info("Isotonic calibration finished.") - if debug: - return np.array(weight_temp), np.array(bias_temp) - return None - - def save(self, save_dir, name="default", verbose=False): - '''Save the calibrator into the given save_directory. - Arguments: - save_dir: - name of the saving directory. Default (string): "default". - ''' - if not self._calibrated: - raise RuntimeError("Expecting prior call to calibrate().Cannot save() prior to calibrate()") - - # This module allows for the calibrator to save be saved as part of - # Tensorflow Hub (this will allow it to be used in further steps) - logging.info("You probably do not need to save the isotonic layer. \ - So feel free to set save to False in the Trainer. \ - Additionally this only saves the layer not the whole graph.") - - def calibrator_module(): - ''' - Way to save Isotonic layer - ''' - # The input to isotonic is a dense layer - inputs = tf.placeholder(tf.float32) - calibrator_layer = self.to_layer() - output = calibrator_layer(inputs) - # creates the signature to the calibrator module - hub.add_signature(inputs=inputs, outputs=output, name=name) - - # exports the module to the save_dir - spec = hub.create_module_spec(calibrator_module) - with tf.Graph().as_default(): - module = hub.Module(spec) - with tf.Session() as session: - module.export(save_dir, session) - - def to_layer(self): - """ Returns a twml.layers.Isotonic Layer that can be used for feature discretization. - """ - if not self._calibrated: - raise RuntimeError("Expecting prior call to calibrate()") - - isotonic_layer = twml.layers.Isotonic( - n_unit=self._xs_input.shape[0], n_bin=self._xs_input.shape[1], - xs_input=self._xs_input, ys_input=self._ys_input, - **self._kwargs) - - return isotonic_layer - - def get_layer_args(self, name=None): - """ Returns layer args. See ``Calibrator.get_layer_args`` for more detailed documentation """ - return {'n_unit': self._xs_input.shape[0], 'n_bin': self._xs_input.shape[1]} diff --git a/twml/twml/contrib/calibrators/mdl.docx b/twml/twml/contrib/calibrators/mdl.docx new file mode 100644 index 0000000000000000000000000000000000000000..90852a401b7ba315b7af9a93e57e43b38555e5ce GIT binary patch literal 38400 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 literal 0 HcmV?d00001 diff --git a/twml/twml/contrib/calibrators/mdl.py b/twml/twml/contrib/calibrators/mdl.py deleted file mode 100644 index 0fe3265a4..000000000 --- a/twml/twml/contrib/calibrators/mdl.py +++ /dev/null @@ -1,118 +0,0 @@ -# pylint: disable=arguments-differ,no-member,too-many-statements -''' Contains MDLFeature and MDLCalibrator used for MDL calibration ''' - - -import os - -from .percentile_discretizer import PercentileDiscretizerCalibrator, PercentileDiscretizerFeature - -from absl import logging -import numpy as np -import tensorflow.compat.v1 as tf -import twml -import twml.layers - - -DEFAULT_SAMPLE_WEIGHT = 1 - - -class MDLFeature(PercentileDiscretizerFeature): - ''' Accumulates and calibrates a single sparse MDL feature. ''' - - -class MDLCalibrator(PercentileDiscretizerCalibrator): - ''' Accumulates features and their respective values for MDL calibration. - Internally, each feature's values is accumulated via its own ``MDLFeature`` object. - The steps for calibration are typically as follows: - - 1. accumulate feature values from batches by calling ``accumulate()``; - 2. calibrate all feature into MDL bin_vals by calling ``calibrate()``; and - 3. convert to a twml.layers.MDL layer by calling ``to_layer()``. - - ''' - - def to_layer(self, name=None): - """ - Returns a twml.layers.PercentileDiscretizer Layer - that can be used for feature discretization. - - Arguments: - name: - name-scope of the PercentileDiscretizer layer - """ - n_feature = len(self._discretizer_feature_dict) - max_discretizer_feature = n_feature * (self._n_bin + 1) - - if not self._calibrated: - raise RuntimeError("Expecting prior call to calibrate()") - - if self._bin_ids.shape[0] != n_feature: - raise RuntimeError("Expecting self._bin_ids.shape[0] \ - != len(self._discretizer_feature_dict)") - if self._bin_vals.shape[0] != n_feature: - raise RuntimeError("Expecting self._bin_vals.shape[0] \ - != len(self._discretizer_feature_dict)") - - # can add at most #features * (n_bin+1) new feature ids - if 2**self._out_bits <= max_discretizer_feature: - raise ValueError("""Maximum number of features created by discretizer is - %d but requested that the output be limited to %d values (%d bits), - which is smaller than that. Please ensure the output has enough bits - to represent at least the new features""" - % (max_discretizer_feature, 2**self._out_bits, self._out_bits)) - - # build feature_offsets, hash_map_keys, hash_map_values - feature_offsets = np.arange(0, max_discretizer_feature, - self._n_bin + 1, dtype='int64') - hash_map_keys = np.array(list(self._hash_map.keys()), dtype=np.int64) - hash_map_values = np.array(list(self._hash_map.values()), dtype=np.float32) - - discretizer = twml.layers.MDL( - n_feature=n_feature, n_bin=self._n_bin, - name=name, out_bits=self._out_bits, - hash_keys=hash_map_keys, hash_values=hash_map_values, - bin_ids=self._bin_ids.flatten(), bin_values=self._bin_vals.flatten(), - feature_offsets=feature_offsets, - **self._kwargs - ) - - return discretizer - - def save(self, save_dir, name='calibrator', verbose=False): - '''Save the calibrator into the given save_directory. - Arguments: - save_dir: - name of the saving directory - name: - name for the graph scope. Passed to to_layer(name=name) to set - scope of layer. - ''' - if not self._calibrated: - raise RuntimeError("Expecting prior call to calibrate().Cannot save() prior to calibrate()") - - layer_args = self.get_layer_args() - - calibrator_filename = os.path.join(save_dir, name + '.json.tf') - calibrator_dict = { - 'layer_args': layer_args, - 'saved_layer_scope': name + '/', - } - twml.write_file(calibrator_filename, calibrator_dict, encode='json') - - if verbose: - logging.info("The layer graph and other information necessary ") - logging.info("for multi-phase training is saved in directory:") - logging.info(save_dir) - logging.info("This directory can be specified as --init_from_dir argument.") - logging.info("") - logging.info("Other information is available in: %s.json.tf", name) - logging.info("This file can be loaded with twml.read_file(decode='json) to obtain ") - logging.info("layer_args, saved_layer_scope and variable_names") - - graph = tf.Graph() - # save graph for tensorboard as well - writer = tf.summary.FileWriter(logdir=save_dir, graph=graph) - - with tf.Session(graph=graph) as sess: - self.write_summary(writer, sess) - writer.flush() diff --git a/twml/twml/contrib/calibrators/percentile_discretizer.docx b/twml/twml/contrib/calibrators/percentile_discretizer.docx new file mode 100644 index 0000000000000000000000000000000000000000..548b0c7a6a731f3cfbb31c517e0ecb070ad47c83 GIT binary patch literal 44019 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 z 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 literal 0 HcmV?d00001 diff --git a/twml/twml/contrib/calibrators/percentile_discretizer.py b/twml/twml/contrib/calibrators/percentile_discretizer.py deleted file mode 100644 index eefce62c2..000000000 --- a/twml/twml/contrib/calibrators/percentile_discretizer.py +++ /dev/null @@ -1,577 +0,0 @@ -# pylint: disable=arguments-differ,no-member,too-many-statements -''' Contains PercentileDiscretizerFeature and PercentileDiscretizerCalibrator used \ - for PercentileDiscretizer calibration ''' - - - -from .calibrator import CalibrationFeature, Calibrator - -import os -import numpy as np -import tensorflow.compat.v1 as tf -import tensorflow_hub as hub -import twml -import twml.layers - - -DEFAULT_SAMPLE_WEIGHT = 1 - - -class PercentileDiscretizerFeature(CalibrationFeature): - ''' Accumulates and calibrates a single sparse PercentileDiscretizer feature. ''' - - @staticmethod - def _gather_debug_info(values, indices, bin_vals, bin_counts_buffer): - ''' - Determine how many training values fell into a given bin during calibration. - This is calculated by finding the index of the first appearance of each bin - boundary in values (values may repeat, so that isn't trivially in indices.) - Subtracting each bin boundary index from the next tells you how many values fall in - that bin. - To get this to calculate the last bin correctly, len(values) is appended to the - list of bound indices. - - This assumes that ``bin_vals`` excludes np.inf bin boundaries when - PercentileDiscretizer was calibrated - with fewer values than bins. - - Arguments: - values: - 1D ndarray of the PercentileDiscretizerFeature's accumulated values, sorted ascending - indices: - 1D int32 ndarray of the indices (in values) of the bin boundaries - bin_vals: - 1D ndarray containing the bin boundaries - bin_counts_buffer: - ndarray buffer for returning the PercentileDiscretizer histogram - ''' - # np.flatnonzero(np.diff(x)) gives you the indices i in x s.t. x[i] != x[i+1] - # append index of the last bin since that cannot be empty with how - # PercentileDiscretizer is implemented - nonempty_bins = np.append(np.flatnonzero(np.diff(bin_vals)), len(bin_vals) - 1) - bin_start_indices = indices.take(nonempty_bins) - - # if multiples of a bin's lower bound value exist, find the first one - for (i, idx) in enumerate(bin_start_indices): - cur_idx = idx - while cur_idx > 0 and values[cur_idx] == values[cur_idx - 1]: - bin_start_indices[i] = cur_idx = cur_idx - 1 - - # the end of each bin is the start of the next bin, - # until the last, which is the end of the array - # broadcast the counts to the nonempty bins, 0 otherwise - bin_counts_buffer[:] = 0 - bin_counts_buffer[nonempty_bins] = np.diff(np.append(bin_start_indices, values.size)) - - def calibrate( - self, - bin_vals, percentiles, percentile_indices, - bin_counts_buffer=None): - '''Calibrates the PercentileDiscretizerFeature into bin values for - use in PercentileDiscretizerCalibrator. - Note that this method can only be called once. - - Arguments: - bin_vals: - Row in the PercentileDiscretizerCalibrator.bin_vals matrix corresponding to this feature. - Will be updated with the results of the calibration. - A 1D ndarray. - percentiles: - 1D array of size n_bin with values ranging from 0 to 1. - For example, ``percentiles = np.linspace(0, 1, num=self._n_bin+1, dtype=np.float32)`` - percentile_indices: - Empty 1D array of size n_bin used to store intermediate results when - calling twml.twml_optim_nearest_interpolation(). - For example, np.empty(self._n_bin + 1, dtype=np.float32). - bin_counts_buffer: - optional ndarray buffer used for retaining count of values per PercentileDiscretizer - bucket (for debug and feature exploration purposes) - - Returns: - calibrated bin_vals for use by ``PercentileDiscretizerCalibrator`` - ''' - if self._calibrated: - raise RuntimeError("Can only calibrate once") - if bin_vals.ndim != 1: - raise RuntimeError("Expecting bin_vals row") - - # # concatenate values and weights buffers - self._concat_arrays() - feature_values = self._features_dict['values'] - feature_weights = self._features_dict['weights'] - - # get features ready for the bins, order array indices by feature values. - indices = np.argsort(feature_values) - - # get ordered values and weights using array indices - values = feature_values.take(indices) - weights = feature_weights.take(indices) - - # Normalizes the sum of weights to be between 0 and 1 - weights = np.cumsum(weights, out=feature_weights) - weights -= weights[0] - if weights[-1] > 0: # prevent zero-division - weights /= weights[-1] - - # Check if we have less values than bin_vals - if values.size < bin_vals.size: - # Fills all the bins with a value that won't ever be reached - bin_vals.fill(np.inf) - # Forces the first to be -inf - bin_vals[0] = -np.inf - # Copies the values as boundaries - bin_vals[1:values.size + 1] = values - - if bin_counts_buffer is not None: - # slice out bins with +/-np.inf boundary -- their count will be zero anyway - # we can't just assume all other bins will have 1 value since there can be dups - short_indices = np.arange(values.size, dtype=np.int32) - bin_counts_buffer.fill(0) - self._gather_debug_info( - values, short_indices, bin_vals[1:values.size + 1], - bin_counts_buffer[1:values.size + 1]) - - else: - # Gets the indices for the values that define the boundary for the bins - indices_float = np.arange(0, weights.size, dtype=np.float32) - - # Gets things in the correct shape for the linear interpolation - weights = weights.reshape(1, weights.size) - indices_float = indices_float.reshape(1, weights.size) - - # wrap ndarrays into twml.Array - percentiles_tarray = twml.Array(percentiles.reshape(percentiles.size, 1)) - weights_tarray = twml.Array(weights) - indices_float_tarray = twml.Array(indices_float) - percentile_indices_tarray = twml.Array(percentile_indices.reshape(percentiles.size, 1)) - - # Performs the binary search to find the indices corresponding to the percentiles - err = twml.CLIB.twml_optim_nearest_interpolation( - percentile_indices_tarray.handle, percentiles_tarray.handle, # output, input - weights_tarray.handle, indices_float_tarray.handle # xs, ys - ) - if err != 1000: - raise ValueError("""twml.CLIB.twml_optim_nearest_interpolation - caught an error (see previous stdout). Error code: """ % err) - - indices = indices[:bin_vals.size] - indices[:] = percentile_indices - indices[0] = 0 - indices[-1] = weights.size - 1 - - # Gets the values at those indices and copies them into bin_vals - values.take(indices, out=bin_vals) - - # get # of values per bucket - if bin_counts_buffer is not None: - self._gather_debug_info(values, indices, bin_vals, bin_counts_buffer) - - self._calibrated = True - - -class PercentileDiscretizerCalibrator(Calibrator): - ''' Accumulates features and their respective values for PercentileDiscretizer calibration. - Internally, each feature's values is accumulated via its own - ``PercentileDiscretizerFeature`` object. - The steps for calibration are typically as follows: - - 1. accumulate feature values from batches by calling ``accumulate()``; - 2. calibrate all feature into PercentileDiscretizer bin_vals by calling ``calibrate()``; and - 3. convert to a twml.layers.PercentileDiscretizer layer by calling ``to_layer()``. - - ''' - - def __init__(self, n_bin, out_bits, bin_histogram=True, - allow_empty_calibration=False, **kwargs): - ''' Constructs an PercentileDiscretizerCalibrator instance. - - Arguments: - n_bin: - the number of bins per feature to use for PercentileDiscretizer. - Note that each feature actually maps to n_bin+1 output IDs. - out_bits: - The maximum number of bits to use for the output IDs. - 2**out_bits must be greater than bin_ids.size or an error is raised. - bin_histogram: - When True (the default), gathers information during calibration - to build a bin_histogram. - allow_empty_calibration: - allows operation where we might not calibrate any features. - Default False to error out if no features were calibrated. - Typically, values of uncalibrated features pass through discretizers - untouched (though the feature ids will be truncated to obey out_bits). - ''' - super(PercentileDiscretizerCalibrator, self).__init__(**kwargs) - self._n_bin = n_bin - self._out_bits = out_bits - - self._bin_ids = None - self._bin_vals = np.empty(0, dtype=np.float32) # Note changed from 64 (v1) to 32 (v2) - - self._bin_histogram = bin_histogram - self._bin_histogram_dict = None - - self._hash_map_counter = 0 - self._hash_map = {} - - self._discretizer_feature_dict = {} - self._allow_empty_calibration = allow_empty_calibration - - @property - def bin_ids(self): - ''' - Gets bin_ids - ''' - return self._bin_ids - - @property - def bin_vals(self): - ''' - Gets bin_vals - ''' - return self._bin_vals - - @property - def hash_map(self): - ''' - Gets hash_map - ''' - return self._hash_map - - @property - def discretizer_feature_dict(self): - ''' - Gets feature_dict - ''' - return self._discretizer_feature_dict - - def accumulate_features(self, inputs, name): - ''' - Wrapper around accumulate for PercentileDiscretizer. - Arguments: - inputs: - batch that will be accumulated - name: - name of the tensor that will be accumulated - - ''' - sparse_tf = inputs[name] - indices = sparse_tf.indices[:, 1] - ids = sparse_tf.indices[:, 0] - weights = np.take(inputs["weights"], ids) - return self.accumulate(indices, sparse_tf.values, weights) - - def accumulate_feature(self, output): - ''' - Wrapper around accumulate for trainer API. - Arguments: - output: - output of prediction of build_graph for calibrator - ''' - return self.accumulate(output['feature_ids'], output['feature_values'], output['weights']) - - def accumulate(self, feature_keys, feature_vals, weights=None): - '''Accumulate a single batch of feature keys, values and weights. - - These are accumulate until ``calibrate()`` is called. - - Arguments: - feature_keys: - 1D int64 array of feature keys. - feature_vals: - 1D float array of feature values. Each element of this array - maps to the commensurate element in ``feature_keys``. - weights: - Defaults to weights of 1. - 1D array containing the weights of each feature key, value pair. - Typically, this is the weight of each sample (but you still need - to provide one weight per key,value pair). - Each element of this array maps to the commensurate element in feature_keys. - ''' - if feature_keys.ndim != 1: - raise ValueError('Expecting 1D feature_keys, got %dD' % feature_keys.ndim) - if feature_vals.ndim != 1: - raise ValueError('Expecting 1D feature_values, got %dD' % feature_vals.ndim) - if feature_vals.size != feature_keys.size: - raise ValueError( - 'Expecting feature_keys.size == feature_values.size, got %d != %d' % - (feature_keys.size, feature_vals.size)) - if weights is not None: - weights = np.squeeze(weights) - if weights.ndim != 1: - raise ValueError('Expecting 1D weights, got %dD' % weights.ndim) - elif weights.size != feature_keys.size: - raise ValueError( - 'Expecting feature_keys.size == weights.size, got %d != %d' % - (feature_keys.size, weights.size)) - if weights is None: - weights = np.full(feature_vals.size, fill_value=DEFAULT_SAMPLE_WEIGHT) - unique_keys = np.unique(feature_keys) - for feature_id in unique_keys: - idx = np.where(feature_keys == feature_id) - if feature_id not in self._discretizer_feature_dict: - self._hash_map[feature_id] = self._hash_map_counter - # unlike v1, the hash_map_counter is incremented AFTER assignment. - # This makes the hash_map features zero-indexed: 0, 1, 2 instead of 1, 2, 3 - self._hash_map_counter += 1 - # creates a new cache if we never saw the feature before - discretizer_feature = PercentileDiscretizerFeature(feature_id) - self._discretizer_feature_dict[feature_id] = discretizer_feature - else: - discretizer_feature = self._discretizer_feature_dict[feature_id] - discretizer_feature.add_values({'values': feature_vals[idx], 'weights': weights[idx]}) - - def calibrate(self, debug=False): - ''' - Calibrates each PercentileDiscretizer feature after accumulation is complete. - - Arguments: - debug: - Boolean to request debug info be returned by the method. - (see Returns section below) - - The calibration results are stored in two matrices: - bin_ids: - 2D array of size number of accumulate ``features x n_bin+1``. - Contains the new IDs generated by PercentileDiscretizer. Each row maps to a feature. - Each row maps to different value bins. The IDs - are in the range ``1 -> bin_ids.size+1`` - bin_vals: - 2D array of the same size as bin_ids. - Each row maps to a feature. Each row contains the bin boundaries. - These boundaries represent feature values. - - Returns: - if debug is True, the method returns - - - 1D int64 array of feature_ids - - 2D float32 array copy of bin_vals (the bin boundaries) for each feature - - 2D int64 array of bin counts corresponding to the bin boundaries - - ''' - n_feature = len(self._discretizer_feature_dict) - if n_feature == 0 and not self._allow_empty_calibration: - raise RuntimeError("Need to accumulate some features for calibration\n" - "Likely, the calibration data is empty. This can\n" - "happen if the dataset is small, or if the following\n" - "cli args are set too low:\n" - " --discretizer_keep_rate (default=0.0008)\n" - " --discretizer_parts_downsampling_rate (default=0.2)\n" - "Consider increasing the values of these args.\n" - "To allow empty calibration data (and degenerate discretizer),\n" - "use the allow_empty_calibration input of the constructor.") - - self._bin_ids = np.arange(1, n_feature * (self._n_bin + 1) + 1) - self._bin_ids = self._bin_ids.reshape(n_feature, self._n_bin + 1) - - self._bin_vals.resize(n_feature, self._n_bin + 1) - - # buffers shared by PercentileDiscretizerFeature.calibrate() - percentile_indices = np.empty(self._n_bin + 1, dtype=np.float32) - - # Tensor from 0 to 1 in the number of steps provided - percentiles = np.linspace(0, 1, num=self._n_bin + 1, dtype=np.float32) - - if debug or self._bin_histogram: - debug_feature_ids = np.empty(n_feature, dtype=np.int64) - bin_counts = np.empty((n_feature, self._n_bin + 1), dtype=np.int64) - - # progress bar for calibration phase - progress_bar = tf.keras.utils.Progbar(n_feature) - - discretizer_features_dict = self._discretizer_feature_dict - for i, feature_id in enumerate(discretizer_features_dict): - if debug or self._bin_histogram: - debug_feature_ids[self._hash_map[feature_id]] = feature_id - bin_counts_buffer = bin_counts[self._hash_map[feature_id]] - else: - bin_counts_buffer = None - - # calibrate each PercentileDiscretizer feature (puts results in bin_vals) - discretizer_features_dict[feature_id].calibrate( - self._bin_vals[self._hash_map[feature_id]], # Gets feature-values - percentiles, percentile_indices, - bin_counts_buffer=bin_counts_buffer - ) - - # update progress bar 20 times - if (i % max(1.0, round(n_feature / 20)) == 0) or (i == n_feature - 1): - progress_bar.update(i + 1) - - super(PercentileDiscretizerCalibrator, self).calibrate() - - if self._bin_histogram: - # save bin histogram data for later - self._bin_histogram_dict = { - 'feature_ids': debug_feature_ids, - 'bin_counts': bin_counts, - 'bin_vals': self._bin_vals, - 'out_bits': self._out_bits, - } - - if debug: - return debug_feature_ids, self._bin_vals.copy(), bin_counts - - return None - - def _create_discretizer_layer(self, n_feature, hash_map_keys, hash_map_values, - feature_offsets, name): - return twml.layers.PercentileDiscretizer( - n_feature=n_feature, - n_bin=self._n_bin, - out_bits=self._out_bits, - bin_values=self._bin_vals.flatten(), - hash_keys=hash_map_keys, - hash_values=hash_map_values.astype(np.int64), - bin_ids=self._bin_ids.flatten().astype(np.int64), - feature_offsets=feature_offsets, - name=name, - **self._kwargs - ) - - def to_layer(self, name=None): - """ - Returns a twml.layers.PercentileDiscretizer Layer - that can be used for feature discretization. - - Arguments: - name: - name-scope of the PercentileDiscretizer layer - """ - n_feature = len(self._discretizer_feature_dict) - max_discretizer_feature = n_feature * (self._n_bin + 1) - - if not self._calibrated: - raise RuntimeError("Expecting prior call to calibrate()") - - if self._bin_ids.shape[0] != n_feature: - raise RuntimeError("Expecting self._bin_ids.shape[0] \ - != len(self._discretizer_feature_dict)") - if self._bin_vals.shape[0] != n_feature: - raise RuntimeError("Expecting self._bin_vals.shape[0] \ - != len(self._discretizer_feature_dict)") - - # can add at most #features * (n_bin+1) new feature ids - if 2**self._out_bits <= max_discretizer_feature: - raise ValueError("""Maximum number of features created by discretizer is - %d but requested that the output be limited to %d values (%d bits), - which is smaller than that. Please ensure the output has enough bits - to represent at least the new features""" - % (max_discretizer_feature, 2**self._out_bits, self._out_bits)) - - # build feature_offsets, hash_map_keys, hash_map_values - feature_offsets = np.arange(0, max_discretizer_feature, - self._n_bin + 1, dtype='int64') - hash_map_keys = np.array(list(self._hash_map.keys()), dtype=np.int64) - hash_map_values = np.array(list(self._hash_map.values()), dtype=np.float32) - - discretizer = self._create_discretizer_layer(n_feature, hash_map_keys, - hash_map_values, feature_offsets, name) - - return discretizer - - def get_layer_args(self): - ''' - Returns layer arguments required to implement multi-phase training. - See twml.calibrator.Calibrator.get_layer_args for more detailed documentation. - ''' - layer_args = { - 'n_feature': len(self._discretizer_feature_dict), - 'n_bin': self._n_bin, - 'out_bits': self._out_bits, - } - - return layer_args - - def add_hub_signatures(self, name): - """ - Add Hub Signatures for each calibrator - - Arguments: - name: - Calibrator name - """ - sparse_tf = tf.sparse_placeholder(tf.float32) - calibrator_layer = self.to_layer() - hub.add_signature( - inputs=sparse_tf, - outputs=calibrator_layer(sparse_tf, keep_inputs=False), - name=name) - - def write_summary(self, writer, sess=None): - """ - This method is called by save() to write a histogram of - PercentileDiscretizer feature bins to disk. A histogram is included for each - feature. - - Arguments: - writer: - tf.summary.FilteWriter instance. - used to add summaries to event files for inclusion in tensorboard. - sess: - tf.Session instance. Used to produces summaries for the writer. - """ - bin_counts_ph = tf.placeholder(tf.int64) - bin_counts = self._bin_histogram_dict['bin_counts'] - - # Record that distribution into a histogram summary - histo = tf.summary.histogram("discretizer_feature_bin_counts", bin_counts_ph) - for i in range(bin_counts.shape[0]): - bin_counts_summary = sess.run(histo, feed_dict={bin_counts_ph: bin_counts[i]}) - writer.add_summary(bin_counts_summary, global_step=i) - - def write_summary_json(self, save_dir, name="default"): - """ - Export bin information to HDFS. - - Arguments: - save_dir: - name of the saving directory. - name: - prefix of the saved hub signature. Default (string): "default". - """ - # Since the size is small: (# of bins) * (# of features), we always dump the file. - discretizer_export_bin_filename = os.path.join(save_dir, name + '_bin.json') - discretizer_export_bin_dict = { - 'feature_ids': self._bin_histogram_dict['feature_ids'].tolist(), - 'bin_boundaries': self._bin_histogram_dict['bin_vals'].tolist(), - 'output_bits': self._bin_histogram_dict['out_bits'] - } - twml.write_file(discretizer_export_bin_filename, discretizer_export_bin_dict, encode='json') - - def save(self, save_dir, name="default", verbose=False): - '''Save the calibrator into the given save_directory using TF Hub. - Arguments: - save_dir: - name of the saving directory. - name: - prefix of the saved hub signature. Default (string): "default". - ''' - if not self._calibrated: - raise RuntimeError("Expecting prior call to calibrate().Cannot save() prior to calibrate()") - - # This module allows for the calibrator to save be saved as part of - # Tensorflow Hub (this will allow it to be used in further steps) - def calibrator_module(): - # Note that this is usually expecting a sparse_placeholder - inputs = tf.sparse_placeholder(tf.float32) - calibrator_layer = self.to_layer() - # creates the signature to the calibrator module - hub.add_signature( - inputs=inputs, - outputs=calibrator_layer(inputs, keep_inputs=False), - name=name) - # and another signature for keep_inputs mode - hub.add_signature( - inputs=inputs, - outputs=calibrator_layer(inputs, keep_inputs=True), - name=name + '_keep_inputs') - - # exports the module to the save_dir - spec = hub.create_module_spec(calibrator_module) - with tf.Graph().as_default(): - module = hub.Module(spec) - with tf.Session() as session: - module.export(save_dir, session) - - self.write_summary_json(save_dir, name) diff --git a/twml/twml/contrib/eventbus/input_fn.docx b/twml/twml/contrib/eventbus/input_fn.docx new file mode 100644 index 0000000000000000000000000000000000000000..a36b666dd975c9fc8f335b3a8f68ee19e7314139 GIT binary patch literal 37424 zcmagEWmp}_wm*z(a1HM6?hb(jcZZ-sH|}gaxLa^{cX#&?++6~}-Tyl?bIzGL_ulvY z(mYhv`pH_|Rn@&q@e?EzCKwnP99VfOw`PTML2M#87}zKb7#IeqRYx3P>tt%{WT5J9 zXX>cO;)@{S%}0_90jX%+m6PLAr?=fD(!|xYmxax7UJPtgjPSEZ=r_gYEoYf>*M+zYg{Ji>m1D0>}ywg z3Xt6f5do+_c5S+uT*oxnk6>y`BCb`m*U>G5c259SfmGEqhme^XZ?^o|$1CdeU)r^` zqEx*tjsm3dJnqDi(~rCTX{qZ-^%7uG+1jHkyaMm~?(S#{qA7$P7DM#!W@qGV#?^d> zQND7j3D+pMiAE=lu=8@i*&m6MdEaCQ>MZd}$a}X-7zon%iS&EkUm!p2e}-Phy?^Id zc_;ncQMl*4;-70Q%aBB?^O8uIkJc6Y`N{JUv8e35giz1(Lebiu@aP>`?h~e*KA7S^ zs_0JjN#q_>y>$pMFhtN_0|!%UM`otq*NV7_kC3dWzGp&`!<0p~jcOA4OZpOra`{5t z-^Nc1ZGqB-%bguc5_+20Jwyj*JH}@7X?ggI^o7;|8b(@k{y7Uhnj5qi^=$^La7pm( zexz=y+kslvso^)|$RegxcU)%bBtrD-7y~-Ab*Iy!m0}VGbT-n+#epU9XxE5NG#bv{ zj57cjfRt<_XIN21%dWL+*u8M0leD3)$We?Pno5ei2`dgyKC+BG#tmbZ7oD;Tro#Yn1r>caiffpOcJzK8^Ll}z>E@je`-~Li6B-_qX3pyYN-_KOuml= zRr1bDa#l_~^a>SDQicxvDD0y&rr%=AEeEHZ^;jm?#Kum(jdnJ@3(*Gu(3PFg8h1kz zq;XJO5OHwqnV(4*q88TciV^neQ>G*xZ$)BY?^*Zb%q5jMpYdpSxDwtwgz8L4nKV{C z+4&GY^8Q**j@hr1q#4c1g*k^}Drj;`U)4q8Xj;jUNcJ#kfBN|mg~pS|)uEL%6%v7^ zqZQ|XhbHxZmYvjxnprG^4{+GBhH}BH)K=I&T-Ra6TWLgEajI^8G`?i@0TOB>1^)Ul zV5q#GZc0-P!$xr8@&Nq~1)N<(DMi_}S)FY&?8MQ*eq+i7Qm^b?Q}8?Fr1v?~C&lF= z{yA`~Ixg#g{(_pJ+1c$?Mn_6tVJDMj_G*lm#xWl16?R>kA9k zv;-NX_{c3u^llJ(QkPm<6n;5^kLTyy&#}8eVl=deiJE*~eI@ z7S?T`_d^I4?^ouVQ2sjpr~1*S1yM8DdigJESYr>l!;1E62n|(XL;EWe2V{;=rO+i< z>H}zc_6Ad<6>~6*@J=Zjij||DWOYX47eugjjtcZsPRqz5>-C<6ZSr+2%GnI07@|BF97wc9%2n?)wpTag6gfMS$OLr0mKvPH9%a zaKh@3>qt~;OEf|*BTr(wG)0H9c{w3p#AzZ%evl_xeg^bhqh)FOt=h*l-`17z#~^>Y zMTUCh7h8PBmY`b}ht(#GiEm87@TnOET>awac^6-C38@JlcDehspHYpGAYwtV)QU#o zJvl8TSu<8$_Hmo3oK&!KkeVWi@X3f6pWc}ERO8@4d_h}JUMCVOixUscg>owh*aE%> zpoUJc62w*f;G(@veD?+K1(oT-hV@|c!C4UT$Q6bM*jxuslzakj{W20UM&#FQy^)+K zG@-FU!5^HCqvmO?5S!e;A|qU&@S&qUjrp0G=o~)n;R^q4?&cTqKW_{;0tiC^Xwbt- z{O1Gf3UDxC20gXTHlW4n_non(^~rIC3$^o3!_X~OK#gY9B{9L6Z>C?4D%eFJ%5&6& zgQSH5EglROY=AH2`HrbO81n&b2;F!=2={DYdu0s;@#t``OHw|G1Pem|cS08+;roHi zOaMvhExpVA)<`0uP@u476E%WKG*X}F%|Z34CZrUinTp1bzKbcZd!(M}<)^CTdrZ|9 z=?4EjTw#-vc_Nn=gv}B41O`dWOadbsk8X;{m^j~Jx?gY=E8{eOq z>dr|gblbC_)n?;Tn-mfhO1(9{%@UH&rwM_=3!o^c37XxVq8uD9`fk@$M|^;Oa7?3@R=-g*;uiDHDsul zFC#{ZffuzuC`#N++!73Z<1u_MvEo^^PB9o+GpAQp*J!{xM9@{_rY9nBXvHXFbhDWU z`df+jI;I*bn=zmpVJ;7r1-}O7XX6-V!_haed}G8L$ELN5QAOlE4aU#EeI^t!)g0BJ zjEqtJ2#>Ifo^CAWvJ=KF(={*tv$ZVdc5zs4UdiQ{@{Vgx4)#&J&{EnFwf3`@4@T?< znBn(d#wB0|p}hO4sTX)B-niJf#($9oTS__Jz9002w8ak%OVdOghCSOMcP#iy_~544 zNuEE6TRYuSZn)?zeNf(mWt?WD$et#gq`SoZwfbYQ5NFToJJuZ8J9q`WMGScB4#zomi&P)4`X^Ii&Z*dU?}<5l43Q=IC=KZtZX~tJ-Wx zJ5n`U7n+1v9gYH+)gvD<8 zrcWU;R7uk!w6JE*@#(oKi))bhtLY=xuFj$EG0RRvh#jJKltxW&nUNo3>Ol-M8H1`_ z^FeMm)URGT8Ik40p79msv*6EY_~eLBf?x^)^1fsu)ge#{nwAy;*p`ySJsbYQSnF;f zRixZMZ{+c<>fga!48mfJ87M?_a7lw}{o>!i4=$(~oL*B#g)Y~+!NRnwRuH@S8FP>^j04T#Ftp~RfNVEMMS?;ub z@i?p-9umK_KC(XD3;%Pfwe`hEX9KOlW1uyd0JH}GG1dOLgZ%r1`{!;lK~y1t1^4UO zD?)EjJZ7P7`1@bERBd!pRRvx_Qp<6-;(Hr9YbFfh+kQKDT;5sKHZv2qD)a07xb*cO z{dpoFP%vkL6iv|u%u$k$yX&OYM6D`F;Q6Y1xH=XE#N?(=Y7)PcAAC%Zdq${fq3o|k zplHak6=}h$jLbijQi=Oo%dHKeB{3cM?Q?Kerjth-*~LU<^JPc5)u!-Ts$q6>m z(K%CpDw;UGY6AdYaJ~2+_D|ikPcxHNUTj}Z(}Wj>0Iv_xZx2rkXHiAMO~*TW_YZ3q zZOLYR1H+=xG#DJK*4*>9{dqig`bNfLWWXP%J0^;bP~8TC|+%~2)Q zJv(U!1JP0`@toS=JI>ef+LDEV?%}F!Ui>E*q*b9Y*VQP{1;MB2d{e=7D8W^g!Y|bZ z-de)mJVDIuZPBJdI6g102YqHfa4*+uFHWht&(*-C_6-5S3fHsK;AHO8Om2naH*ftj zpkQT|?ZO*Ie`iue^K#dT{J}~zVEcaetwy^`Digo6RY!{Jf%dVR%j1rflKS<2W#5JS z0Fk%kV&JVUgn;VSNXA{CIS;oBUmYQJ8?N@-&PSxrWhh(4D6GoFy=ufp?A1bx+qQ2!ZKVD2V)Virxa#2z&Qks_$6hhA8z8UXrlpW&t7^8K6M z{kZfZtdOnzinA#M9$jH8#mUA?y8weQaZ=Tk>-4I2j51qqaMMuyVg>S??M>g$>J9Ho zOk*ueqvzy>gFSo4a_s!#$7rUAabF=4t`&U;#Px~CxIp~902nsYJ-}?65N{Q01Xw(7_m%i`aQ~I0}FDRrn zC5Kx=eGjps534Sf<@c0T90AaXX3nr^k7)`E zTF~Tk!Ff7)J^yJ#pH4LR1I-JI^cL=is28CDjZ8!VIZwRMnOT|I@T$bKDrxjbX(j1m zbmav0vOtDCOnTB!j0+#(;^bSq%6&EnnD5m`+lMgc%iCGg^1zj>FS43mO7OmEhcUc9 ztyy&NSDy9fFNIaJvTw*NYT9haqvmr#euPs_L!gA}Igqd?J&Ml@WN6S*7K>SSq9uhh zU&rh=fV(R6#SC;;5kXjPrzJtOSufAXlZI0!r$_gFN#E7ukB&vn&ulLX+N1=4 zYw?Weh@i?}VxtDew?hvzid|yI_{X$E=V$-!`~vF4{#Pf|76kxY^sn)i4S1AHP|WU# z!@V-=5dXqH;fMo;l7Pn1{t>DTLJI=n{v-5HDyS0bGfPsp{~|b3A_uh~{GlSL9oi)4 ze@OffRE)=ECANPuXw=_@x!{BJD5HYBV%G06k{~kvmqbPqIBIu9xIa|S#=AD4w*MaW z@1}f5@%l-ZwoVNFOg;(iIg(Byb!YFh2XG%PA8q3Kw#4p_2$Fuu)Cn=g&5drI8$K-< zI*T@r1QMFF`}S>1Lu1yj3=x7%I!VuG18Yw=&MkVj1D>MKeGB6*IbRmtu5|7PXR@lc z+^T-g2`L=x?T_Sc-A8T+>owg-5J%Z=GcAcE>PDS$#^Sv_*}W5Ibe}RrWmqjCOy3w- zCAmEXx-6!JI}{ZTnS5qn22E(+KolJvcBN*}q>t-{7C0 zvEgoGPCh<}#hx15HReXtU1ybZAu{O*$idqnl;01vjO#Ei+S_4$c-!+<8bvr`eZF$` z@p3(Dj;BB=Sa%Gmp1)yKSs|ntZH>@ajK^-XtRddjf$))Ec3^OO&*u{t_6KGMZftWQ z_Z3Y7y-phjpun4}Jup`-keb=mqAkx5ug&av8rSOUD^bAs${w8j2X>(1w`r9EGCn?HPrLG2InPF02$1?l#BuZ$miN(3aqttv z5c1@P6x?Qxz3(PB(*i(Ow#&Y4i<{j0xsYOk<4n@H5+{5HpbdF{H9GCoyr#Is(77UG+3mx#d#; z;CtoV(=$d_mzR?71*i72n#4mr$paGL39A~L{w5Bl@gtHo>HEc_R6qQ(q)(|cOq@lL zCh~2r`+;J=u8uO>1t&FFtDOau-&YeMgE>weKmUyBfxghmE1VipF6bg7@N&(}&jn~1 zH)JJJ<&KWs2k}l4g^WAImg@zYZX~Uk?9ai(o3C2(AXEGMGv)F(HOF_WQ8uA#_v;~R z;IzmgFL1N+DMmA_K07#a6tb65C8J2`g&r+8aRSzl5pjPWv1wWi`e*OO zD5SsDEMa%KDd^9VixztwtJx)O75j1$z|5oSj?$zevZ?Prgj-4tKN4=pUCSci>7)?8 zp%rvGZ;#<~E)-YMVPRI7^8045_wPj)yP+`-5UVP@)S?J(2*12<5}yfN#tj9!i|Ss%)^U&eKRA7#*0iT*W?VV9VTx2(~iaTrpBTAUJoJZl@R+MyhI1GV?* zN41={KuuFEy=5Kc9?aTlW4KB}ZJc z1%lcsy<9m4;;jWjIxi?K(P!EOUPp-iPgnpMg|u6D)4nT*J6^uRBOxuFX#Pm4Db4W; z8N^$>thL5fLq3|IcaZ{~tnvL*`WX^Op0`_uKfd=(Z8WZMuAH64Eu^aTB_e!%yMKM0 zC%`HHgp$s})3xZvQLXlwGY>&tm7??uAJ1ZG^|AVZ!o^*>wH!s&&+K3&c8^Vop@#vF zyuQ@d+gS|7pp^(Zp6S@)-1$RP^?_zvHHO{`uC^wlY1a9Hn>jP*9>^6*L$xt44|hxX za$S8}0qy=-;sEsWZ=2n!cHt8qeBu#Hg_MM%z zrglgw4(ywIQY7SE7z;8DS_CuSR)+V*Way(lR`7_`ZWkk}m-|>H<)5r7ue3-vI<^_M z6>=}hXglayj(|ueFj`h{KG>`%CvV=_Kf=|*MTqVuHAWdmt%cofv_5lMWN&1q zOx`1l=&57?qm-jZeAHZs%71`u>&$-sqHJ~eo&p_DO6HTYOAD#zB!kovDPv{%qv1kB zQMc%tO85Grl^pKPQVHSRVdNce=36PUjUcXBk6D3jE?u>70wsk-qxzIRZmIcr2Bvr;3{y zhkZqZxN;{ykKK%}>sQxga$6BfT36-cd;J}D;0GRoH$q%Ap)DS(fu`nd{0&MNPF5D% z!p8@@m+wUrTW$!Eo>NW(h(9N9e?Z(*mT@GkE-pcF($tCjVm^J=(8{Acaa*!B~wQr7x zXi$~oomGW#YT2ewba_tod^KZ+kI`{>XL&=?`7MJo&+1?~oKV+PrsUw|^<3j@4l>AW zV=~S`o>rob;QOG^xrAdm%pt28l{Uux^1HZJ$x+|H#rm`r=yq@$7n~T$;z)*1!xOk) zwwLrbpLoB-WwAd+tSMsUhpcPrY~mh9c3{XmUUNBHFSxjEU^&Bez3dp~W4kYR_QVB5EnG*eDSSr?q`dCNos_Jdk$L4U zcE@KrX|xWksYSC~?pwc=)VwC8P1zxK7l_uxT|VD+D#(Qtt#(*w>hsah@Et#Sh7jE# zmkF3j!oTBdfv{OO`w`nig+KdaP&+nM9U`fTh8@~ad|j8K%H{Utu`hH4;rJaOXLFki z=`iT72l!*S?NtY^JEiY{as+TzZD0@sm}rRs_I)wNvY?lsbq9Fs77meAKrj?T72XF~Zx=Pmel2Td^m-{b|vx-Zud;xO5@R1)R2**hM1fsKnx ze7Y+~v#j4K%AdwR*c_53Ufm&E%>Q&_1EajW8H^Xff&A=1K^fw6 znF`dc?DP`)wb3g(l1-W7M4R61z$FJrOqSa+^DQlUS=pJG(?f8S{&t6(J{^%0L@%=? zS*ta}1u421mPvcT8$ODp0yk57EBL+50%7=|1nUz{jm>1~k~)O9R1@a87`OsW@;<7d zZmE9#r$+JG41}Y-n^c)ReYd>#R7ZN_u$9NxST`SU!@svJy&FC*36jH60)WD?-+4=Q z{1IOKSNQC|!w-Ll2M~#MlzMYr+x~#O^ss!Hk(^Ddvut#h%u-^8ZddHaI4a4V;phVR#&sZHgKcC%leYV$B{KKlur8S^~Q!vcA_ zui!|s!-St=r6gNlU!j=eD2O|dY_@E9LGr9nvD#U1*0MC9nA?2Lx-3B`PanZ8$CrBc zlVb=GliF3Qel20tiK-%VRkAwXO)tI$+L78xaGonWW6Xj|cqLQrdb(O2quFDG2kmAM zM5ZG11gS@}YDaOhb+8G)#q3j6-+pL-%T97O$z5%4iU<=Y4cdG5g)0>2*$u@Hlq5{B zG$=hlS3ao#0*$nZA?bp%Q-h?pHRAOtu`7wZa`6aOe%qvi7zT?Y#~>_9x$ZVzLO5wkp)eitBEu60eJwSc1e|fZrQl5pH3v91tZ1546xW;(e;pWb> z$Vzf^lqgw)xq3M1&S|>2nZ<)6dWg6wi)}||OmO#Lj6#sBKKK$i&1zmkd5ZtAeGdCC zHeTodPd1uiH$UzR>V??4gD*u@mfBDh8($KSEPgrOV1bVua9p(Th55GErOrr-+-psM zl4uKFREJmgA?OAQlTgEDMks?(P7);`FKq)uG5%cL+FyOArUOKH0$==DK#@lgO|kFk zY{(>E>)b*Iieg1(S-z0O_@RzuCG>>L?ywS_#Qap+N6vb<=v5tqJN3#A(xjejaWys3Ku9;% z5MT;;dguH*N&t-o=f!w$LN&6&*Z4RScQH=h76xUKB>!RM!K)?19>H>St8HItKUqRl zUf&T&GMIk#U1&6ep9lsy!`9Sn$Npd~#(s6MQgP#0r1Vj1 zzExJ^hK;+B)iI&Q@N1EI?o0noBY9b>wo>6jj?8c0OM<_B_XKOo+Iydvu$~jRa1s3J zTXF;h3A(UWd$a!V4;gR@8c;N8#7Jp42_I=3oaB-_`$Kk!A~08`3Z8^ul@}(#E;OJgfT=@Rzvfhq#1v#77pC-&F#30_sM?{ zS2)^Bpb9lsEGsl+_bP$+X27DZ{2)*5>AhROV8VjT%+Q_rcU z0W#{+UFhK7ov+_JA?L2VoX(@^D)U_wvY(5|+Z$Ac8Bc6Noh(x&=OR@z-oPyObA{TV zul&;f7^h`zs*ho`ou)ZR-D#0N@_i=}*POAGa#AL}ZiOU(rwG`pv7bI?U|rfoPYr5} z=P_SUj_WtEF&z7{oem0`{4e+DH^>@nW#U-t8cI-(!^rutTnWPL7|jxl!M&l}19 z-lHA;pj@)ycfSk13F^VD!rf?k-6aj!rxzNq?ess|87XCC=V2O+sV75Cy|&W_Q{D;c zhdR#ZYX9zULt+bYJSy@uoz!x-3n&2ELE6jz(Vi4%!o`}hAdtmFopcfEh-c1r?M6AN z6>j;560TvA$&#$oL|*efR{W$#R{Z}c%pu$-bQVd+nD|qn%l}k(nSK>K5xY^&<)M@# zdQ$w}VZ@p3-?$SS@R#XYuNdjHuWR!rv?O;lsvS z7sFedaC=se60VGHFsg;iD#Hx(<4D8d&B0;hxI$%A(d^#CzC~VynN=+_OHt91KBor( z%%sz=n$x~snbTIuNM6|58-38kKEVhx4M6^ydB);h(O9>?+^j^hUu>D+Ge~r#cL^W3 z=^vw8w6>e0T;cM$M~{~Q9IekUBqpd0Npd+NL#Pi8@+JyKMqmZeD@$u`7AYZny%djO z>sEQP7u}8A)St4snqnb>6(by5pr1aNQqzcs0j<`q>9b5)&5XIGQTF<@A!sXJC+MkS zaclWh4RxbFX9(Z4W`>>A?P-I~&=W-20@O>q^a$tlr{U7AhhBBKEQOO&t4u6sN8p=EJ=ym!5d#KV9 z%iLk0ztQ2>B6wfV-inYx_||$j`Z4$BeqsAtMHG zOrDQiM@Gfbg=^z}41;;;`V5%1(n*7?0->{O--<><2Z}*$>UYkY{8qsdJ96tHp`AVODZei&S#a3U0Jr%&`b-7 zDJX06(tUjDFF#b&KIpC6h0OyE&?jWHUl7PrVR9|748E1zeI-qu2T!H?zA6elwJI}) zg1f$MbBz+^keh!V6ffelNHtl-kedl9gkPLgo#2+A$uBC6YHi=*sCW^QOP#5I#FF4Z zl9(CwG}Suls0}G}_AP|xXp7ByT0Y8#gb;i=r8Gm8i|6dR_+BEPO7;FuVumBv0-}*! z?J9DH<7Y`}9ut61&Z+~DamrEQ0*xjIIbDCb?w90oCX#DGm~8C!)~h zNslKnV=@5{a4L;2lo=G9=7{`~>U$zP=e5Hj=TUl8JcchnvwXHw!Yfy1ASy8UKfw+)`jwadDOlu92xi<*p=su$sZW-}pC9u5{B ze^lCMQ!0A`&==*}(3QRIrIQ2j=2dD&$ZN^OdQ537O>JqW;5qvJCXWH!(OZ+N@{bz^ zpB*0DfR^8tcp=1lw5CyKbjEpg;2_};JQqz+Ul2SNn+F11Q3056(50zDS)_g*Gv>W8 zLB7OO<^j-6K@`}0pk2o%WC#J6m~RO9XQ*ZpnFJE%Vrm}IiW`&QScq|BIC_>2YpzV# z%;w~VP;5nj8WOWzTeR5)MEeuXR*(^MouL4+BiD$|cr~oEEadNH5^C6wV+Jw=d2P=w;_Lf=3$({S$mWYPC^f42pF+oYFyFoE5xKToAE z(xJxL-hDEZFo1XtlnulQle_mHv7XF?GY=yk z!Rsp?BTRp82fM=UMU-VugS{d(Z=e|akGM$D-{Nos&&4jRhDVGxd4E+Cv-T0y1Hnn4 ze_vp0K^K@tAUK1x%Zq<~cIPH^!N~~WAR1r=_pV}Js4dA)e&AyM=z_C=PfnRXr6jgw71x9!~si-?yYXJ{Mbokfvo zA!j*@18Gm>lVN0QxCT!)oU^=HbRWT^5nW;)8*KTm%I?J!I_%+DyO3GB1`Ijuc+f0G zQ?k0Vv!&?f`ota!RihEC;>q|btu+!#?LB*+wZHiPfVe`W>OAo5Rgf8<0<-%xUKK7y zvL9@WGnVG*cu~Jjc4gHi8pn5~B1yYxzg6J3{F{d!AZl9Dlufq30KU(iF?B#bsqcb6 z`V0jF-OyZ2g#BYW*F#kk5^>tz^hr%Mas_99!Hd6)>)Qs+F7Ouu^)YSeLkgH}=!5fj zxc+CwU+6ce=ZghQX4-(*hlY(K`HY8>T+H+4bII-ot2L*6jdj`Y$^a_q@hZr10GnOL ztnG|!AfMtsD0zVo@b3@}fe?BA-?Gk|hF(fA`myq48}t<_4kuR1{RTnWvCqg zd@Qwn^mkc37EK1yD~R=gT6n!W zg0X~~&6d@<4j4^Xz&|Jw%PI*Hx+W;D!ci9O;y zdd}Xk8Jr1ua|1zlpM#f%04$Uj9wq#C&DS62Rp!jK(cw>A8eN9E*KaZGfg z&Wq1O1^!us|0?GHnj4qA2ctnPn$c}!P=2!k&K;Yein2iq1KjT~K}TWeR3CD2PPa9D zgE}s+9eH8T z(?h^jKq=PAy}NEenHnqNgv&Ld0SJEXo~Ni3ZQvNvT_>reLb3< zmQ#Z$R_s!P7hN5>I~EtZ?DT2^!rS<7LiMmt4pXAaleCAEtUCPaHf3fb!Ci-W*R-a@ zVhXq-BUu;oWSLq>A7I)wO^$$+5RIvkn@$W|xvs-oZyoQb9E*RJEw%0YK>%Q3bi-YDt7LtwIbj#XoK7U|? z8iJ2YG6aD?IUoy&`lxH35zX9wOeghnZ{sCZj=jy)$HPi+- zbka=}wYcHNSDr3!*KQUN0b$OU8Hyjc*?e((h(ZAPn9||9(>$u`yED*-i(p6Kg$mho zA=G2PwO;<00-b>AenLkG-%U3}tD#^Fb3PnyxE}kRlWAg}^#nFg@FDxe60o80ia10& zf>o-NKj{xR{-Q53HW%202ASXAY6i50gSYJuaQt^TE#%P7{mV5r3IUZb1YTD=(A6Ch zGu$9X22oQ0Ryr;rQHp{w$FAV?tfeDvM5Tc1Q&NHJdNx)m-G_=z(NBdQ=idq@6qWFN z98+`XB3~5G!{r?~HzI*4n55n(tIf_loROU+{nl-3Lv=zPjfiCi%z@pkD--lMa$pgP z59c{B9z}9RKU&Q)&c8=^97F0J#rNzPNmVg&4?^N5+uH{GY_!RFr9dhWrBG-$!gzy| z4`4cf4n~KdthwZQ#A;U((X(iZvV&e|fd+4n$*cp{j$&JXZ^SlC`KHl7PV6ad?9p()1v3wj#oeH#GCXVDP z)+>c3T8xkShn_vOGc^y4%a=!JYQbtQxmhzZ+~VPyy-66EqW|P9TGchwV_Fy+#baTq zVaq7@8ytO}_F^*!aG1!2*wnHye~UE#CAnCxL#a+RH5&F}<6i!5eLqR_JsbVlP35Sp z2y#N=-s6lJOoLVlj*TW5JqB)~X3Au_HRdIoO9$hMVzpzrEQw2KqH{uG_6r?GbJL@Dg^TFl zh730|{6c$3*m1$1nWhY(vatethRL`Y977!I~#BVB=@ByREnkjB$kWIF4?kvO})<(mvYLEIdnTc5Z;#ZpQ z+eJBQ*i6)ujvtd!e06E)$DCaz-|-n0=+}QH^{g)aK&f8HN`KYSjkFlA*ob9*pqV1_ z3!VO$hQ4m_)Ox&fm<|6ss65hDynFkFfn$5AcZPESLnBjAAps~!$L>O&Dr{C_*3KyN z!}t%@wPUSnMy8kL<%=ZgL!+DCy`hPub!_1BWK*M1n`D2lD1@+`*KJ_R3rqzlvyC4` z%gg!8txuy?!SOvC_yEJ6>bppqiSr@HrF6SD7)mMaHBz9pkRnwt0KFp1TbZN>(smYqfK)*BGHjM zK~x|}?_i-#Nn%oWPh+T+DliZ_R!agcWH4L&=D<2_faDQtT$Ss!hl>sITQBi6e#4k8 zW*B@aK5o&JL!c`&Rm^vknD1U6wEf|sFyN?AWn&tP%{{@3$bD@^deWZq3~7L6&SF7v zm8llRV1N=C#T*>PoFJ}HC@eTSR8^8<5}$4>RDbAO4fJx|IVx2+2EggW0H8s>SnqtWg$= z5?C~b7m%?WxK%qt1F|7Rq4l!;v0|OKbmxw=gHq058}BRT;juotWEJH=cpdYK2I-3g zVK-vjA<->P_NUbx7mj07|62tj%AYENx~~Z3%aqhBEuAa;4-|NjbW@tbkg;B!7X>az z#h&Rf-!BHf8%_N&yCAqn%3PWjBVl@m3Kx?gXS+?0zC+y824gLjoVL9OAvr}|*+m+B zp0__c;yDY&HnB&Yx$LQOcvbu*l9(#sP~-a>SO@0!Zm{i0u^f>bv*AO%qcl=@d{nMt z4E$mn97`0!anSTMWve`+<)!$>ZWV}X?TRTYNl=G~o8uQODGpzEAwaRytG`Gk4|+$H z%vY?%VT;7v^dyC+MO7}wpe;VZwnU-5&wDTt!tOkiCkcAY(jw1i0sS^^)8{tF1}H;~T1foy&Q&H9XY0Ht$Y&FA50Bi2ex!v(ByV*Wr7 zCPWXd#4@F`LV=NU19m~gbSVVDWG2o1rQN5b;j!ufyrz?AZ1C#-YL zWAW6*jl{%r(`+Y)v=S!Nn+jOPiWM7?8s<>;1q4#$i%93l=Vv#n6$^sm(25>O|8!u8 zLOq%A(tzv89yTov%EW+9k>XQmhX)Z;c?jmmThYQ;2rps^QfM&*XENx946zeXT=d!u z$idq<9x3#O3l1A0Q-l-(k^sZDU$S!+S;>K4GIze+!@>pe8_GY=?HjuL&+u}BfjL&e zfZ_e~+`fi|(-%oIGgD)yKacQx>m}z&)t)>(U^N^KC}bvqk&cXcPohH%>W}SQq}<*M zm6grvrB=oreWYswo#GeC@gL}0z+B;2qdpLW0d_8t;d&!y_ zThqIIx;bsDszNzC%en;}?O*R$5forFz;5g6C?{%6Tic&`1)!uQyQV2*siTa!8gQ=+ zxlS7L@H}@doa}#YS)m-<55GAJUwbKONk%fTVh#_!dUJ*ekh#3G^tRZ!jpC{rb9T6# zF?*_Ar1r5DrtVqqEzw-E2t#S6ZjD2n z70>_CRJVNI`AK+u+`cduw*gH_ z=z>x$zG%zP(FWQvvz)X~>|lY=TQ`bz?)Js3?Fq ziMfneJvw^q=ILqcq4#Fy$o}CiGwImpEGc?n=MA5D|E**ocw)uF$1D32tl$|@o-k2T z)z92?-CF(pzGuhBvV&{twul;Wd_dVTBOwZ=EHU!yTix1LOWvrgAS2GtN^kD+1}@6_ zeHMHiz!0V75V@tf#B7wp?BuuN40t7el>wLAv|w`OI-6#d%&aw$s55hJxSgjZr0jd3 zO8{|a)>?NEsOfMM)PxIaV!yo+_S7VJ?R?mhe#hBWc{??>d}AYBlb(5-(q@3YGH`IR zee;uP51PC1DD~m|)_%%$M%+K`wR*!=`Bukx%pT5KlDSGDe9ck=5NX5%l+#*Y+h{5q z()P@Yd#M=gWu6KT-kaG69Tn_&a()=nFOALOb|sD?C9TdIj^#&8WGdxm4 z_L%M#&Dk0Na&~i?8SIcM4ItL=5Z^R~D%bTV1qXU!y^?#QQ~*ONHSx#@Q+*K$k#+*1 zRYnwqUYXSI>G8MR;zDcDn$|;B>9Cj@4es~1HEkQGxTn%iiki$%)l3<<513u!$avvdN_%urB5#YZ7c=jJrK6OL*b48zR4v00?+6cKSLG;5&CM;O=Mv|l@y zGvJ%pdaLrY1=E%iru1Q+M2&xrart07 z7>r&mwJ8g)NxllfQ;uc}K5?%FF(1+z{y2P{~$m(jNmZwtHobEF;O=J{wzBN(!Z zDyV~Y8Pq{?0_unXbyQ0=L)-luf?yu53G5{mzl(DF_n?18{~qKvVFON3So|BM{x|#| zD1RUDca;BK1ukb3wB5JdWe6VGXgz_X5C2hM|Lo{kDc|8TAyj zN4lp&^;{(r-wp=!n)P86W^5X}fgCz!#8jV}qBBg|M!GhvdvF-KlkwH@Ct&p~i=HZ* z*eWO%2E2=~+Aw@Ocs>o@+shd3y~BvWml1Xw1FpO9xICWnwRpW9Sp7J%y5+1G+Tlhl zavej#dA)agfID&U{Q0t)(TOFH(YF5dlc^H6vCSkbvy$lDc8jp{&M^{E#O%h>p1!;w zi^;~s4Sr+UOLVwN`D+VP$JWhdwD-@EgSp4Chux*?XN#H%T?fLDt00w@Q=armFSL~B z8`BoA7v7dG*C1oziup0U+s&K4k?1jnG@BpZ>$|>_Gp-5AoTqj-`!-oXiHDi9sbv0^ zRk2g@(ba{Djb!hY)_aA4riz~*(*bNE+jLVS*cIO2X_{Z-8u(h5f^pGhZ(<#^njhq6iRE=vSnHq@X}9AV}(_ zFJoa&a=eW6{|I{vpt!cJTNrnDcX#*TE{(gpJ0w_ecXxMpcXxtYaCd?y5ae~vx%a+% zzW=@VR~MV2su^>PvG!g)*WA7KTvxwFX5SU4484~o&zAZc)?_J|?ON|9z%3ZLNO0*v zun4wX2US^zTJF0Oz{f^hzG-V)MM9(*OfL2xrd!#;BrW)$ey^Q70#Tfrw-y#g(QvQZ=|D$XQh=+99xMuF|gVZ zF*YR3fDF~xim9@vFa*`7c|nB%wOfub428#r(yk%*<$J*A{VO5C zll-jLw*$T$Pea9l-h(88_l9vqcb9da=hxRb3Bjx*-+P_6#e>Pl*JdFDE&};Vrq}lM zAKc6Yj1I_-PfHvbvFf+IienzT9lqYr?VGtK2_?=$Vh*W^4FXgS1w@h=HHRlNyeAs# zHMz6*->_RCU#Z~FjhhvDm3pR#+jy1OFY5dE?`~Syprh z&9Hr$otDQ_0)IR{-)dw4Y9QEfsxi4QP?I6MQk_HyiRw+*dl+LucI=`tWaHz|jYDWLo%8=a%^a~GNK-odc;Nop_jWh3>T41U}iK%=La35IH znmd%x5<`?1L>}p8U6A(33X|v;mhq*e!a-@9a}~(99Ntl5!wQK z7wsqSY0cRkv2|WIhaN$k!Tay#z08(P#yqgk?u`XQUU4}VUnf6Vx+^X)Dy0=1T(8|B zsRaNg@XuGNu{@=69{mY^6mWy*Md7=@_!g2DaPAg@(rE1 zcOMV)l0q>>Y^~*-qSUS?n@Qq2E8j_e)t#JF^qfqhN8RiBN?O13`O&g&ow!)ti+Rt5 z2b(tyG)P{zvm>;o&gMyXvxUb{kHwCz%Hy|ZyaS6~r82JKZx;M5Hs^+X%gqzaOBK+Q zJHmDErnmK5$x++PXJ=@z`**5@fyxSo*Vx2gI@~#Uo!*_l2b{6@I((jJ75ZkUnxcsm zw(jKmSaM)D-g&1oM(EL<251yB@T|Cq@gSa(^HBBG?Rd(OR^y(bd}`GvglrINzVf1| zL)O;=`&##`3FG3a#wPN$J(vf?IY%ndYZGx-fe7JA$EEsy?DFn__Wd#aH)W*QPz!u~ zQKB`S5X$E5{=lBlQy5!kzu#5NopSz=kF%2POAr56_LS1#<=MS=2hp>4hruIQ67SRt z%5df?o8a*~3t3Y*37_QSDNaI>=@POVN9KXB)8^ZY^UsN~tsi6U_(?xSQP2;(!mf6dMk&9PXW9)gwB!on>=Fd9?ZTvxdxg&3ts(`OGS*jtI7wT?buNNMlnbz&{ z(9aFG3+@N3c2nG}-jmMT27RUBZZfxf87;)uw!U}JJu9jCGSyjTFLVMhJ*C;q^I)V# z?H$b~JGD4dri4yTyi})sr?HCZuB0W|n3esya~Lw)&X~&9eUH4j&k}EMzL%XPG+XJ* zq?MK-OI%HQb7WC9RPIQEiP*fnx`u@wF496}T^+dSdSIW&0~$tWaLqQeefG1+MFgpI z)og=Tk1DN?vrCn0QkMB}zaJrsU%i$te53tpW_;QE!`ydzqr$Je&6{pa`zhD5bgBLY zY#08QdnT6u>*(lP;MDW30$A>JtVU};0l}@GeJ>Pnr5UztnD&hjD=mE}Bx3zLygP$- zQX=fg?RVrcvf?GLJ_~0g#6COb8Xq0|FTWvxUnWEvmroqz;EghVzFhZlEoHHdye}1o zb(Gob+UMXG&_&8d4mo~8<~CY}Tg|HZ(&N?3TZcFY*`2&CY)sAAci5IFhtyB^`RaC; z+4C}IP6M+41o8&@wI!@?2rOM-?h`1(u+mQZd>kw|&U@?T^$!^(J?Q3CeMld|P|kzJV&{dhuRq~mpMuS*)zE@$Jhl>QB46yG(wk3o`CVhGHgqm6Z$ zf!d$O*Rg3DDF@e~?Bp4BJ@?lLmigLVADA#^LnQ%nVsP5_#VVIb3`HqUw*CXHtT3yk ztJQpNLp+gi)t%$ZyPH}92oTo_*1qVW-l_@5#rW4VORis6>Ag3K`mPaAbXgX;D!UUnYADvgz&SJ zY|n^$Gpj+!eUsOl+sXTKTRw;cM`7wkVykD*j`$jJ6W?XrrYP0qixF;1us1kDYm7)c z_uKKZFGdJCRo!P-sl9D2J|MRk>fLQK_PEarJ-8#=ZUUx1pjPt%ADdYd{XZ=L+I{6+ z+}T${JptZgNZR&Ge@RVsa{No`&(hUyzUUzt4&yr;<}Vo6F(pI7yW7zan^|^Ti-1n< zYo~n$@Fxc+cctGa+a3dUfz)i z7ILpD6#88&2;{yPOfYFPkkL26yS5_#gt|uLHEU6pYv8Ys)*0*ph1wV;*~~JyKj(?= zu1~M80*=Hsa3oZ&XB4ZpdMC?xvo(L3Hd?Pl%lvX^OB=|G>kw$_9_Yw*EaO0v`MJ#5 znL@NbzP7rPr#+ z7Jb1=3yMQ1se_~`?P$PPg*EEW9w0EfAf#7bw`SFVx*~Z^L_-E|?SqNp5$ashib`{8 zA~xe8YTE^B`d!An9&`h3bb}0^R4YQ>eEe^03O%QT{7nn|Lj){tNX=Izpg4@+V#~T! z^8GoFD>RLcY2LQ?M!@wh2I|eqsjF#}qL3Jy;}qZ%#Zze8N^zS;zpfxIZFdV*H|KNl zDxZoDcQ!|s*L+BuMM+yIuhA)i)rKxOiw;z1Wt&EZqQFIsG6i~ATWU}Bt=i81;%vP5 zexoX~=j2`u=UENrP3mk7oMR2Fqk>>qTP(sB;t5EZf!kh<_F0WF5)L2q_oo$*=+uCM z^BVP1saY>ujE?!e8gph_0oRUS59}1ootH~u-`zcI6})VLd#6-K26b%*b(0ijYRUIJ zhG=Ihu=PD`HN0%o!9%|VwDxd<6qy^9d)cO}Z#Qk@NmPFEuw9?RQygZxC2PdB-Zn2I zY8)TZwSDMn5!k-Va0F7^tC_IWT1^n@*+aNmiel>Kr0?OJ1{FII-q^uH%h zeAIS~A#?rI-EwIjbCQCc=NoEPla}Kp9f|B%BjZ@(-{wPR2&Cv?dk1^qUL54evnTLa z2=6!}>xk&uKgT=Q+6HCRjDSGvc=cmr*)%2XGf&-hwmEuIKd%_yd+OpXF&?wp$=u?r zBVJ~hoOP~TM-2DH8*iG`ub80ODsod_^YL^P3^y1!7!>h;m< z%PRG)!~3%vKkGn_ey(I96QA41kX$yHHVTG8Ap;?-cV;|O3kT_+LqK4CDf0l;R+c$jTYV9Q z5YETST%-wW06Vk~g#mH-EmF%bzIz)A)A;g96k;?O=2ukD)U;E=iurMy^l!8#-D1xQ zlz?{7fsvp^5K#yi)U^Uwr&*jWdX1}0bv!Z@_5#=S1v-|yI(ryYH#4~V5SYu1!Sn&f zKOQjnn$3ZFuOz0QwfKU0f?K-d)U#<<|n3vXM5gOIcl zA9jjCkZ+?5z>tEWi$NH$WX;OiXvD$!28z?M2CS5zMZh*QCrQfZdv@qR3_^)FCEwx- zhl7xU@pFJ);}&_3RO&ZP+M>c_%yrmVW8yroas|Wiv4!y3qH3{+um6w&EL5O?`WN8hn4DV^NE-08{~0jf|MP$W2+4kp-8nx# z-2v;q>6@>>tboVB^-JgJHCX^X1axBx0t!L?v#(M7JN>>*-z&MQ?^}B+r1OArd^pr3 zei9twWL8oH`lN2s?>_=tZPW{~4!qOqtak40a;MlaEhw~<9G;-{!F zcBFMYle~@T9XF0eV-Co#(dnFtiN=)VOw=3?=NUX5xE;^dy$)1yFH{jjHw|uQXg$i=>+>BfApe$82HL^^o}>zPjmFm;fQT_d$1wY#>FEh3@kd1 zE{<(p&TIyc?R1V2cN!B&P{JEL(fIh@d!ZWmeIJTVU(I`yMmFeUHTV!9f<8zzQ3D)7 zQMR1XXC$rPr69=K{gQnu?)KG=x_Q}qBqO!Sk@I+flZ( zxq0F3_MM*Do>uU9tMPtQ&i1GVOa!KVf~(u;7@cbqO&IiXm-l!Bx|W{R zlaY1vvhnk!rq0uTu+`X4**vP}J#nGO+(1YI)X?K?eaZ^%7a(Y$-7M&io|~pZ!Ehp5 z?JE*y5Ze)-+T{c$XlnESMbA0X5xl{`KlM2J;mVP>B3@ij=$t;@o8J~mZ>K%(?;XPP zJ`Xh_(kg1&d{O!Kc~@jGh~kl?bLe)+Q!8w#dEgnI@GeWJPFmNa{oqKg8wMnoF zwV&9+El_4iG9O(-uuc6xRSv_>PaC9*as*jfoZPK~O1p~=&hsyz%uJ)Ekz_7|Bbeb8 z;wl*>Ta9WOt`}6-AHJ0-LZ zw>S=$Lzy`TgaImV}c;Zo8}P)NxL zi{5mr&$M5FeE!6T;vmg54p}Xhj4taPd!l>=ny|3o zj0^)26)N`MIy(I4T11V!H`tXrdHs3xwmINEGdjAs-+5pBP1$H$ko0Ti)99JDHawcP ze=P7ecx%=8Ds(-(y-n>4WnCdRnK{ciT4%6)tUI)f=SBm@7VZ_#LZ%G`FP}1o2F{(A zBlF4;Er#(K#f(*48bTYm3B#%_o$$7UFum6+mDMl|?>5B5u6c!p5x``Kbx5i_U+Q+- z2#IOEFIShnKHj%uX1<8Ge2NFlJEDX1J8VgI-xYC!$Ig^=f_LXp{OY6{uIe?gZ%0gl zP0@y$A8<^^MsV%hYDXdB4jL?Z>TnwBjKKZ4~j=qN4B_kZ8;^0mW(ZI6?`Y@JczQsK71#2RnUz`ER%Dm zk!C!lY7mKMm){)%uTaz-f``*#K0=w_oqZK_7kI}7#-U^&Q986Wn;Jtw!|XqYaP(M2 zL%{l6U`v0r{8Rcoxveu?Hup|NO$qdfQO^qRh|#S68zVgt=+TiKaWZ!D9~F0WY=nQS z@B|IEFt7_Bl2Lnozk5~stnx1%s`)2C9q+FH*6}{E*~mur{~+OBsGaRM^7x{Zs$%f< zFDuZ~|5)*)@^6Tza-bFH{|_rhjSoXc4xvuM8k6p9d?-98r*7BrMpkWljS<>D`GS0| ziGO3rvYE@Aw&9hHZnn4YfavP`w)F$UaC-fXbEg5oC4H=(XvLR{C*TNbV*@aL^W4R) zl?}2}HtQcoF}24#`>gVT&o*l-6+@))hT|G4wLTty0r(MSZNPUpKJT}2(RwIOp)Ab` zQ?hjZ;AEmrF+qs%P{f={ zfFwgl0cLXJ1zOBnyhw3?bP=T18;*OEIbO4(C#G5_;|hn+ zf4C}Jjulilfj2;zAj-rLJJ*^@Ly~H{#DGZv#h~iYt%RqDHUw&X)~`mzXZxe58KjE1 z$e~rMNM#&Owa0CabcLn2uc7owvuq?2D-_fO5jt20&6bC5m^T@7pJYY2nzRByeLK;H z+w#L~f>ZWFq%JUmu0hxiu++=MOr->L8FnA1>(WB|o43@2$EQ?8H8WP_yUZ|{* z!t$g;6z2>w_%I$4Obf+|(-N0Ejct}F&@?d>P4(;x9F-RJRJ|e^hG9HFaB3u{$q{u; zeu_S}?Qkf93F0swWB>VBc^2bJIR^5m8Z)6=IA^p$Tj{pT|0auvVf)^z|4BnLK(>yA z_MO8)KkF>Ja1U|8&rbcs=Z5D?5Dzp?n#$D*;+e&bcVC5&| z=N2hf{gJ^+rW&rV3=f+=V;U*RZm`-#o#HX1&zFho9uhvU7NIrHMTvq)KMykz7W}f4 zY&Ub;=H9_+>xFAG^QE|?wb3z}S-f#!843O*d(CPXysT<$)MALh3@l!Z(p%*rzQ2$} zB)J79vb--BUD^an$c#eSI5vO^PX^ucfCTB8Ivr75`GCAab>uwK%(GHjIRQb9)f-oV zu+D=ZTF!--Z#gPoO&~wvex#(zh$l{H6Yo!mrT{wNOyFLr zl@s$x5tFvDA&Aa`xrmkr`%k9Ucd5=Cr~;{{HZ7A%_d-qf(o`PFUh0aZgEHS%S8JgDSzFjC zG5-aV@-MyzkbjW3x+3pf5!B|TD|zrkio)MQp=|@#g)un=6ZzDuzlo=nMPg)}3S%~< z%^x~uK?ONakezA*DFbW4(=z5BK*~vlQvZW88Q4E5^Q6yO*cpsu8gVH}#Kci3V)6=F z7W|4dU*KaGk2NvnWs)M!&cvc_ezl*f*L+{0ET{83Q0Z1{_7p*zTo%Bwgm$@-X0&mM zRz8HBKP0wvL@YZ$6p8u7y%w@xyrHZs?11G!p{&uLQ5a>6HHRm?xoKE@(;kA2g26p% zTl>CG>tFWuW*Yh9)&*3PP;T5^193_g>>B+tF9kzy9t4yGpIAsvg^vD|?KR_!U~<|G z#fD@lnR+RPdMKa6JGoMge4$g##XR82ypa~3gE>u5d(Gdf*Gv!`#hx$W?VI#ERdi1J zTLV-uJ`DGZ038gssPIL@55zsF-Gn*}Lh+(R?rHlJhsy~eS-NefBxld((7Yd2;7uXQ zmodRZ_mPO^qgv8D@lKQX=}3~`b!N)WaM2=U%QeCmDjD{W-_vBw=;yliwsnlb3$1OQ z5rhZN#5Hu#DYHG$LX^k14C9?h_VhxxoyG{zkmA8$%YN)S50W7KdiIAzi~Zy|AVW#u zz{bS9cXR(0%)a6Iub2rFTLsgHNU+do0MCVS;6j6v_F)suG=7|(Zmv@ePx+71P&lAc z3N@fofRZ41yc1snZJts9SXBzry;lY4l)$;>IsNOUg$P`_*ZZK1n zG$(PLv;-&d?`iQ);+biQPQ!>WvOL*PBzta!kx>a~vFIbL{5Zqs%zvC>5_4=f1=5!e z2wrr(5ieqiUCU)lLe?VLTT_*aQXAZ(I=Dka657#(wtz2M!-owky2}vLenvn;qR758 zqy1CJU5}b9@5iBV*@J0jN`aTk|C*u412!{tG>FPYk_jI+3qp|%P}5{r9*h`Vi!0lF zg9MuO&HNPc%QWd82yMKR7gDYh7Vu&7v(OCjPL~yqGFk9pY0*=1Jg+`^B-nuazr&JM zh-oKa{1uij$jr2=C^|dgW(2xCP-&i=axa_0 zV05VlO|%lT|F6&d9)nhRjba$`f<^(srixqEDzIT$|B4HeJ`-nhLP-!yz=KiYSemhT zMZ>kV$a{CnJ0n2lW7dKs0{bcFw>M}Mcvs?Wct$G?X{K&}a~{rBg}fptoRhEA!%HI>8B#b8$-aNMSQ{Bq0sbgu#Tu$B2*23$ zfUu2v`9@A&Q#c>V`J8?loGX@d7#5Y9-#*gI&(z#Oj09*omdG`5nvl;hv!fyecU@cI zf*`Bmg6XV%O9#lY!moQO!??H5!^9|l`5b}2fXppwz-$)6o$_4h3cP+z(n&oSc zgXa59fA1g(#Z@kZvsj|~^=G$Oej|JL{}qJDBk>A)3%$r1`3o53eRJ*BPQWznhgru~ zxDYUq(BFXsB2vHILYwJ{0^b|PKTO<-=XX;?Gp(u5!@TsoKpHOOpGW#`1ksTRCBkB2 z8A2%y67>swA3440^NjW%ZuOvL;X)+uMtqW}ejp`t#G>#+PNPhE!!BLGziUzbSWJB@ z#)t(1eu;7M`2YFOKkuF^`6Y%EmSi=kSN>^KH0BrhFWh}(#-u9XZ4lW=KhIZzN?G#3 zY#@Etm0aGx;&JU_{P9A5jAkD>ALBbI!SDbJffLZP|B^x;@M{R>Z^wjR3#x9RsWV5O zlRZvC_&(Gj{&oyUq_*3LE3Zk2iSYKmoGu2&73&syTHE`W;SaGjf7L&dSO|-NvQk8Cl`3aDv{NR2<1=i@ zK;XQhDouRwvMcXMfb6#-VGAawf+DabY>H%^CHj5S?4h?1uakOXKK@WgC}D5agbW7? zih=W81>Od6kLAflIbS$X5V9;l9dxMNu)d$g21io6@7IIMcKxW3U|;+fcg9_sA?4O# z<){4#79-8-&?*E?+}cJ4r|PXR!r7RwPu^)xskjGg)|Ts!Qn$%D5D?ccvztd;^&nv# za^SFO>$w4HZkdFDvh{#P;3dUX<|&ASDA2liX%>bKV9&PTnfbaF@pbH$pv_Fee{qw! z%=5gX_u@7P6yW+L=NJf6_6MfyZy0?**|W+N;h+E0%|5n9fheMN-R@Z53kE{t0$hnd zn=s#nA$1KlOnr~oP4ruJEa(3J4E707#(Ob8XdSv}7qU35s)YS7I_nWzYlN|D zKYTo^b8rBzVL8XjmkML-zAXLL*R_kAP*}ShU#v;?I5ybhBLS{51^4)68TsS9f21J# zElw*#BK-#_XTWMdPEG@YXXec%b8Bxn3+mMfC{n+y1CarUwjexc-D*jKnRA?Yp3Mzl z7cmF$%s6Fcxo3LHru74fA(VA6^WVB%#z33XgJmE4^3Eh&%tBvkL7^i!Wp-U~v;{!& z%;@7u^UORU6qhghXh9405Xw`+({5M_8oGVymEAJ^R=UIW&6MfpWYNG`HGW*pFar{B zo46FxtX&46Ih-+(-}JdRuW@x_bzM+xGZ=tf#;>a`mQsm*{M&2W2$I`T3e)L(jI|}JEt;^ zLC%8~sm55$5^6_tXKxl7wiEocQE%VRUBNyj8CYFyHANyAg42gvENfQa@;KqI&wZy@YPpUF-kG(E6 zs;3lWS8_CzWHVy)XBir3qkw4uHB?KmqlOq`fR0I?&i-`Ib9&A^wpWBT62lIXHqOGJ zpr7Dop~(W&ael_QNNtYdHyx00hh>WN=@Zmh_VuEyY2YL+xfus>G>mXmT->df;UcPR zjx;H=H<(LHO;$5SL;WWtH83RaS(*!)Vj&A%m8C})tSE1Q3)qo3f};f;^+5ysm$e^= z?6#yLydBwG>b$fF*2X={5*5Iy6fJ2hi$)^PQ1c)cw9%&9 z=r>QAi-i2_^n&cD`dqy89m{N z5_mW+$bOLL#T`isClnlC9SLwDtIl>}mVHvvrJ>eW21w3(9AfRX)zXAR9v!-TS34?Z zDGvGi?$a)DRE#(+!kZAJ#}5hp$BHA02XgM+3IVG)7dB+z9RDFrHVGResidOPAWxoO zUJVnI?^NK77Z8rmP>UK)gTjUv0K5qUJlxO0c$K2^C=)b=+`V=s&%p$9f?Z2Y5TQZG z#*psM0RYR!UwCc2Q}c<2fo;(jk|^d)>TaN|`4& zykc8@DF>#DlE}bxkl3`=2@rR~#XS-){t62`c+yb6sQ~tAp2)Z~C;B3Q zXNeZ?o|GMhqko!g3Bb4B%SEf+Y2jr^P;!Np&C81S>W!IU`Q-VsREpWS>LOo56gD0v7b;j|WaFi85g=1zI8iDPz4vasOxO znZ(6TwJvQJ*#t}M!)7PaackoH+`#O}4qVeOET*v(_fwXCk*d5$_RkK?ro)BgT^0f4 zs97CuE7_5h?J-1}r2TEkI>H}5DL{n33@J?o2lA0w%?f7!ED)11w69VU2yGZ%)B?c9NjJ!vEE1d;{>s-2Mb#28Q z8b9HFEQBdeTPMXcKqnt=@duA3tc0)1mbmf;c*UIfw_?CqNwQ2%KR!HmAoo)Uw=DHs zeGV^F(zAex*Ht3uMmyxvdBDToFdRXx?4Y@UFz zp4LwW#E^Ijk&w0Qtk02NC3+qU|8B|voup=w0F1x62P-L>Jl+3d4|xK zKPr3nBq&j{Pa7Et%UYURXNpV;SO#xWMPNy4ddiS!od+VBp+FBM&RS}@jzD2m+$O+i znd$ErFhmtg3qW9Lx1%sLGBc>~O$1#ru-y#RQ)ChRhfpzpwukCd7x}av$XAO5`-haL zpJY;dG$v^tM*pP_H}H=-F_izU&JF>njt8d4|Lq*}KVW8uFRlr0Wq$)XVBtdFuSY9% z{F@XT!`+=RkrSyF=~tJSchBGYdR>Rd6q&OT zKj$N+mvF5acvsw8;SVLZLc3 z@@a3;C`pQ-ZR?Ndh=+p+w5{N6_*KD;4tQ{_87(=C)Y4IsyfQ|E6k)sE9DlA~A-mFx z=4EW*aIw#kpM6H`?W=ie??wN%09naw;WG5cY6}Vtk~a(`!)C>KZmq7kz_s$g%NU_RBOPKXn3@ zSAGc9i&Hiv^I}&_d?p6MvDmbQM@;k!6(#ZIBB96$BuM+DRKmq38axa>WHhfA zk{lF7&edWJ6+y-kWsCx(tqS{Z@yJctqpfd+`5{w`^To~it`f2jt?`346Ws=sAE}=M z7?#(DR|ew=1#H%o*Mt@pR`7JB5L31)xZ>Y#g^?OtrKGoGVfnCvO&c7``w}tR!E6*} z`{D`|(Kem{BoV4L){u&|6CIye#_LD3eS`3ow^m109@Y^0nayqtz)18CXQiXcf&vl3 zFEXC<0y(i$St~WvY%6| zLQJ?h!@)8KY5RD?MbsvqE#G0V#Ux&yn?Z4N@7)c_WaU}*v?C@`2!@zN9ol5N_nh$! zs?blmD9Y|akU2YId;D(aDwy*nzRHg#b) zourf)D`)w)9)P=k1zV*1ED(sLhqffKhkw~#heHpq;fqc9{6fav5&G%Ko+O>@0i-5>_)GP0V zZ{UmvvE~2LXSKQm`p@l^r#eTfAix$>t-zl@y=nhyLG{JlMD@Qe_?Wo?n;{kikU8(( z!NWw=1G8vW(L^>J!mebIR%9mvO4b(OW~iB$pX}OPI9(4^q-UfR+kSX6OuI4#fA-t6 zL22ygUoM#u{|MVM9i@Tchl#<;yo5`>+9)=tgnU5~4UZWnGpS%}lsQ2GJ}P+vH#(ny za7~L~9v{`@oZ2B+C}#^$=uB2_V2xS(T1!K;5Odo`!xJkz$UfNwiofD{Eh2@=I5RmP z*ScBAcnW=@45r*YcIr3_WA2x6_fBk<{2l-?&9E|lnvAR61HkGz<>asq zUf?oj@Kv&kncBDwaeVfdLda?FM|XEdM1(FO#j<@r*|5KZ{HJ5TdGlROfz3>R!-0UH z{o64MVDDZvV-vf-I+|{!4mf;gAsGGfHIgPRTh=bA1p}3CG_-jN3Evw8ouD3TBjHN8 zW8wEVe!Do9t9qHP2m5%hEBa{)&_EbmH!*2&Qr?f*XOoYIH$t7ZFAR-T;&gQFKl<^U z7zV*vi+v9HiC=oALQQF7o>8O%(RVUXk2YJGbrvmX+BH%;a;m7{eY~sPH{J9xqhW_C zsZ0iAaNs8Dxzbz?*%*YVZp}%wqB#lY!p}3JK-wE!@jb(%V8rm^HOZuL_V{{sQYhGB z1FKkLmM87K!Z*~$jTt0_li74Fl#j<)j%@KyuW(rLqzlB$Z7tZJBUR{K`6152C0a)U zkF!v*(U8gZH%7-D47D`AeaqzHwJ3e}9fcy3Em4bR#f}s%Qgk}p$Uijgx>z5;k&}4v z;-a%6wcyCCp~$vUMlr1nx|Pi`l1Zy#IE{>r&MXIAs~-49H`liJ8S-kn!cjADsjNXi zAcXfUNY`Ps6hSqQt+2Yy%%%q&;r^{V{@Eaa&jVE8Ud-Z9{RXUT_woBBjJsD4VqI;8 z9=AaI&_!varWY)Go~frhD}K6!hO^Gy1P`NU!Mzh$`S^scMz{M>zn*!vL+;4g+1|$D z5c0+Cec2eZ;fFFd*VAI6wFfsHb|*9XLf(iO@=*MCg0Z{lAfoUb$f|h^><0wOr#99u zok@@jkfkChxASA1&>DhSPm{f)4Ts5wEj%RA@30 z)sy%vp8WA!)_18wtp>YlMoxzVsrQ1Zs$IEGPgHp{_Dv4SBEnl1;-689AMi{l+MGYmksyG zPKnF4tCdnjv^KH0W^r9R8fB6*ieAJk=YD_Vt@JW+mQ-4ujX7C~?06195#PN+9mtwP7G=f!$~s%1M%@&qUVb z@lJVG{WV?IEr+ufR%}1(CN{pIm-D$ClsGLr-H#-MKXN`0Y=dT*|^M1uYqrs{qWAX1g%EVts&D@f@m9yK{!`T<(^Ra z37Ep+&y}PWURmc~)`T?r?#;U7HtbT~0IdnDJA!Zhd|RQ-#>S0hzc)mMJFDDjU2nqX zm$>$ZcO=;YX1%|AD)RrZwk$7Wtd_0%Vdk|OdF^-KwKeZPtLwIbZ!G$GBsqUW&(U8m zbM$O#y=dM_;4q505ZD6O=6iCqRs;b%4icE;2(?yw7ZXCUJSKh1P`Yj7a1lwq-gX}2 zS31M;htAVCjMP*lY|e+DQhdZ1x=Rr&%ag|;1%>xtRrgbqyF2KXmR6`sB(LtQE0iN} z6s6;257NC3e_a`#p~e&s%ICZsW+}P_*Z+F+iGVmHZomAVW>{|2%sOTt#@vU$ky_8m_Tg1{z zuJcLCsup$YWt}CRl%MKRrxPf9Rve^2rgU9yWGEZ%Ip8c5=&j%-?&r#U zeCbo*+V1cDW&stmZ0gK6$6%?xKODC2N2*rqhCh zh`!wjiT$n^ zVzgJ>pUzV%_L6T?$A^@-?jt$|r_sw7JoJQP&my5O>gB6LK8>B`M=@0QucpG*ZCW5g zMkYxX}1%vEuT`>_ob8ZI0E}o_7T|Y)=@MT{F!zR@*J(sDjP{X@`Q@h#D$`Jl2ec z0)Z$;!h|`r)v!Y`t$7|SFIDq+k<#=g*oO`&?Z*0Y52mUs7cXe~L*Rr=`wsteO|LbF~Cb|J`kOc$er?13B z;zTK5IL4w13N>m0T&>K@cc{ef#A1_=?eM-`k1tMR$My>EV8k4JfHnykS0^~{D@g$H z&--KHdz6ri5E1C?S`;f)ODS#lb`MBWMR07oi3yAYJyxtG2#sJcOQ#CN)0%MDw{a(& z=0Nnyk-#WB%~Wry77jcq=3{HhzI8thLL4R37p7V$9^IXdcjDhe32D*l4d?Cw5J z4)SrnT0TK*NZyVh$}ut?x6eDyV>OFVOh^=WL`NAjx2K!kmeZ}|(hl5SP)9=s_!Buo zGyQHmQCM_aOlZlb&Nx)n`rUHAoiojqMK4?z=GfM+Pvz1zIPCZJ zweu8}TNwMCQAwHsFIPSx+qH)gHQOWMA4uJi7ZeXhzXY~fy*V1oCZT`br;`2pAFH(Z zxv&UZU`-|hnBDzn&Eeo~Z({BOtjhe!?q;;M9QJu|dUnc$6D0LoB9b^DIGPKEHS}X7 z$y@G0sBr4f^Tt_OHm~KbOlRn;bA-wx+2zqbPsO17?eM<)0A3+~z1{>RZX-otxN=6Yz?F&xWHuN=JpOgp8z{HX%Fj)wMauH8@A`eW}sZuU3o#sVZ7U0oTC7T2WQ7GOgNa)(Na zYcuvLqDMoo68#lPb8r4^W#RLPfTK|%5=xAeqU|W89*TN`N_SbF^o2nSb-Q$lf5U5M zNe}lI#i@oPGg^ibIm`_aw${Q+_H>=r*g3|8U+~{a?_8vnGK#RNXtKU7QYc8{W_$H# zD1PORi_bwa;!KXJprSL&K)7RA7A4nFU{a2zrNA73e^DM04A`)FuLJJDwW7Q~JIoq~ zQ~Av>$|hA~TyYUhKO%CHOoC;_9eA>b7x@}Rn ze1)k+lCKSo(a+&c>i;_ZdkxdjL(^x6@GIX*W$fpVUU&sb1bqBGBxq121HGRf`nPT^ zcY8v7`V8zzIqwc$2X-BG_4%fjMzy$DOZ@`um$gt&*JDqp$E*F<)Ab^V3@k(4cx(L# zuC_)6xKK7mV(inrA?ws11=}C+|D3T3$5$+SAVENaNkBlbfio7cara--6maDQygnU_ zt?ig>oXjn+G;E#F)iDISyt!%ZXHaMuF`x&#*!qhZMd`t~tiP8ga}_hzIfu$5DWGRk z8Gl(!1>_{WfINl?_&?F3a-HS%K5-}NLMyF>GaWkCQp_Yiq#?wxXIsdeJ1lD)*_asxSS>loYv zu?4e2m@I5sGSTU@>yX)jXNV5u7!T!0(}lz4CBXC#vf1l&K7(PwKvpE){HP z-%-LiiX2LBGV%8LPPg&OJgzm{5N zKeu-^&$_^H3+c-(9%6=*YxX>!z-2UDWP+2y#Gg;>jQT|uZ=G;Pa>i?qsQK$k%M{LO zbtHtWisqU2_2$GmN2=aF;@bcFz~txaX36f-OIMudU&QWki0{bM%adQ*KV8 zt>^8ov`#7sU;Bc0-Fd%?4E2_+Q>SY!tc^O9Wta8u=AGnwIrp;ueVnDoe@it_czg5j zhTA9KKC)vM-ah;FGrK3>fVKB~)xE2w-}g6`ufHO_ep(gV>#Yoo%|{Jx85|7Ak;tBr zvclttaf)OSZ)%(73rX7#_aQ^x9RR}4ey@ra7w={`nv1DlG&@YuRMKqO0)m@^4U%MoN8{ZyH)y5Iz&Nb<)qhh z*1fUX75?&#+EMjJ;624gwi#;|e#p8Q|9-M>W!mSQV8OaoER$_t%riXugp0+e%iE~4 zNu|TLDV^=Y`vp}l@g-XK&DB0T98%L~nem%@UL?Elwx@y(*Hs(V%;b#bo7brv$MRy< z)4mShjmGm6_c2V^^Rx2R`V#JWzRMR~?5>D=Y0eaLPoVeTUCG|KdrcqxncncZ{C3#3 z^~YWYZt+XO@<9y-HxFFCS#dtujsJs?8asc%smO+{bqa>nsX1>q-N+Zc$!E4MVcv@e zkLH9fxhR~l^uJtQ_63FQ(#@Uk*pj)rHH&%#Ba{zI&U_&!(Y^E2DusWEsS$l2tZGk9 zxMCvmMuJP{aG}n_ig^i{XP95GCp~HJJ*|6*H~z_`{`jdAx2GL`HidKA+q=qh+Ryo( zSucFMeMwqcugp~2%uiG1>|SYB&Pmd~qucJukX`h~@(uT77uOTE2%{obF~Zd>20+@Ae> zUBBJE&nNHI{K{H@zd!cZ-+uf5i%Ja- z@J_MIh`qtmrrM%h6(xSyEVyyvhsQ;whr7gH#;$JbKOa4LQsT`GmDS%TaQ-}3to-VT z^U9gR>EC><{Jn#wj=6bF1nrE54U9c^1m)Ek6sMdhwNP;9u6nCY7Q8-2n8C zF2VqrCS(J!b$ijxLhm~w%o1%zHVd^UiEavdR|{c^P75?tP&!`d`qA5i2>r*~k+K+S X>oCBZ6_|rSxk`{B5tu!8_JVi-ODX=5 literal 0 HcmV?d00001 diff --git a/twml/twml/contrib/eventbus/input_fn.py b/twml/twml/contrib/eventbus/input_fn.py deleted file mode 100644 index c184d9434..000000000 --- a/twml/twml/contrib/eventbus/input_fn.py +++ /dev/null @@ -1,59 +0,0 @@ -from reader import EventBusPipedBinaryRecordReader -import tensorflow.compat.v1 as tf -import twml - - -""" -This module provides input function for DeepBird v2 training. -The training data records are loaded from an EventBus reader. -""" - - -def get_eventbus_data_record_generator(eventbus_reader): - """ - This module provides a data record generater from EventBus reader. - - Args: - eventbus_reader: EventBus reader - - Returns: - gen: Data record generater - """ - eventbus_reader.initialize() - counter = [0] - - def gen(): - while True: - record = eventbus_reader.read() - if eventbus_reader.debug: - tf.logging.warn("counter: {}".format(counter[0])) - with open('tmp_record_{}.bin'.format(counter[0]), 'wb') as f: - f.write(record) - counter[0] = counter[0] + 1 - yield record - return gen - - -def get_eventbus_data_record_dataset(eventbus_reader, parse_fn, batch_size): - """ - This module generates batch data for training from a data record generator. - """ - dataset = tf.data.Dataset.from_generator( - get_eventbus_data_record_generator(eventbus_reader), tf.string, tf.TensorShape([])) - return dataset.batch(batch_size).map(parse_fn, num_parallel_calls=4).prefetch(buffer_size=10) - - -def get_train_input_fn(feature_config, params, parse_fn=None): - """ - This module provides input function for DeepBird v2 training. - It gets batched training data from data record generator. - """ - eventbus_reader = EventBusPipedBinaryRecordReader( - params.jar_file, params.num_eb_threads, params.subscriber_id, - filter_str=params.filter_str, debug=params.debug) - - train_parse_fn = parse_fn or twml.parsers.get_sparse_parse_fn( - feature_config, ["ids", "keys", "values", "batch_size", "weights"]) - - return lambda: get_eventbus_data_record_dataset( - eventbus_reader, train_parse_fn, params.train_batch_size) diff --git a/twml/twml/contrib/eventbus/reader.docx b/twml/twml/contrib/eventbus/reader.docx new file mode 100644 index 0000000000000000000000000000000000000000..f6567f2775af44c5dcca85452220d9a2da4a6eba GIT binary patch literal 37987 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 literal 0 HcmV?d00001 diff --git a/twml/twml/contrib/export/__init__.py b/twml/twml/contrib/export/__init__.py deleted file mode 100644 index 99892dcfa..000000000 --- a/twml/twml/contrib/export/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from . import export_fn # noqa: F401 -from . import exporters # noqa: F401 diff --git a/twml/twml/contrib/export/export_fn.docx b/twml/twml/contrib/export/export_fn.docx new file mode 100644 index 0000000000000000000000000000000000000000..12893ee051f609ebd5965e6afe29c75a457a057a GIT binary patch literal 39970 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 D8RF2h literal 0 HcmV?d00001 diff --git a/twml/twml/contrib/export/export_fn.py b/twml/twml/contrib/export/export_fn.py deleted file mode 100644 index 6e59fff07..000000000 --- a/twml/twml/contrib/export/export_fn.py +++ /dev/null @@ -1,264 +0,0 @@ -""" -Functions for exporting models for different modes. -""" -from collections import OrderedDict -import os - -import tensorflow.compat.v1 as tf -from tensorflow.python.estimator.export import export -import twml -import yaml - - -def get_sparse_batch_supervised_input_receiver_fn(feature_config, keep_fields=None): - """Gets supervised_input_receiver_fn that decodes a BatchPredictionRequest as sparse tensors - with labels and weights as defined in feature_config. - This input_receiver_fn is required for exporting models with 'train' mode to be trained with - Java API - - Args: - feature_config (FeatureConfig): deepbird v2 feature config object - keep_fields (list): list of fields to keep - - Returns: - supervised_input_receiver_fn: input_receiver_fn used for train mode - """ - def supervised_input_receiver_fn(): - serialized_request = tf.placeholder(dtype=tf.uint8, name='request') - receiver_tensors = {'request': serialized_request} - - bpr = twml.contrib.readers.HashedBatchPredictionRequest(serialized_request, feature_config) - features = bpr.get_sparse_features() if keep_fields is None else bpr.get_features(keep_fields) - features['weights'] = bpr.weights - labels = bpr.labels - features, labels = bpr.apply_filter(features, labels) - - return export.SupervisedInputReceiver(features, labels, receiver_tensors) - - return supervised_input_receiver_fn - - -def update_build_graph_fn_for_train(build_graph_fn): - """Updates a build_graph_fn by inserting in graph output a serialized BatchPredictionResponse - similar to the export_output_fns for serving. - The key difference here is that - 1. We insert serialized BatchPredictionResponse in graph output with key 'prediction' instead of - creating an export_output object. This is because of the way estimators export model in 'train' - mode doesn't take custom export_output - 2. We only do it when `mode == 'train'` to avoid altering the graph when exporting - for 'infer' mode - - Args: - build_graph_fn (Callable): deepbird v2 build graph function - - Returns: - new_build_graph_fn: An updated build_graph_fn that inserts serialized BatchPredictResponse - to graph output when in 'train' mode - """ - def new_build_graph_fn(features, label, mode, params, config=None): - output = build_graph_fn(features, label, mode, params, config) - if mode == tf.estimator.ModeKeys.TRAIN: - output.update( - twml.export_output_fns.batch_prediction_continuous_output_fn(output)[ - tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY].outputs - ) - return output - return new_build_graph_fn - - -def export_model_for_train_and_infer( - trainer, feature_config, keep_fields, export_dir, as_text=False): - """Function for exporting model with both 'train' and 'infer' mode. - - This means the exported saved_model.pb will contain two meta graphs, one with tag 'train' - and the other with tag 'serve', and it can be loaded in Java API with either tag depending on - the use case - - Args: - trainer (DataRecordTrainer): deepbird v2 DataRecordTrainer - feature_config (FeatureConfig): deepbird v2 feature config - keep_fields (list of string): list of field keys, e.g. - ('ids', 'keys', 'values', 'batch_size', 'total_size', 'codes') - export_dir (str): a directory (local or hdfs) to export model to - as_text (bool): if True, write 'saved_model.pb' as binary file, else write - 'saved_model.pbtxt' as human readable text file. Default False - """ - train_input_receiver_fn = get_sparse_batch_supervised_input_receiver_fn( - feature_config, keep_fields) - predict_input_receiver_fn = twml.parsers.get_sparse_serving_input_receiver_fn( - feature_config, keep_fields) - trainer._export_output_fn = twml.export_output_fns.batch_prediction_continuous_output_fn - trainer._build_graph_fn = update_build_graph_fn_for_train(trainer._build_graph_fn) - trainer._estimator._export_all_saved_models( - export_dir_base=export_dir, - input_receiver_fn_map={ - tf.estimator.ModeKeys.TRAIN: train_input_receiver_fn, - tf.estimator.ModeKeys.PREDICT: predict_input_receiver_fn - }, - as_text=as_text, - ) - - trainer.export_model_effects(export_dir) - - -def export_all_models_with_receivers(estimator, export_dir, - train_input_receiver_fn, - eval_input_receiver_fn, - predict_input_receiver_fn, - export_output_fn, - export_modes=('train', 'eval', 'predict'), - register_model_fn=None, - feature_spec=None, - checkpoint_path=None, - log_features=True): - """ - Function for exporting a model with train, eval, and infer modes. - - Args: - estimator: - Should be of type tf.estimator.Estimator. - You can get this from trainer using trainer.estimator - export_dir: - Directory to export the model. - train_input_receiver_fn: - Input receiver for train interface. - eval_input_receiver_fn: - Input receiver for eval interface. - predict_input_receiver_fn: - Input receiver for predict interface. - export_output_fn: - export_output_fn to be used for serving. - export_modes: - A list to Specify what modes to export. Can be "train", "eval", "predict". - Defaults to ["train", "eval", "predict"] - register_model_fn: - An optional function which is called with export_dir after models are exported. - Defaults to None. - Returns: - The timestamped directory the models are exported to. - """ - # TODO: Fix for hogwild / distributed training. - - if export_dir is None: - raise ValueError("export_dir can not be None") - export_dir = twml.util.sanitize_hdfs_path(export_dir) - input_receiver_fn_map = {} - - if "train" in export_modes: - input_receiver_fn_map[tf.estimator.ModeKeys.TRAIN] = train_input_receiver_fn - - if "eval" in export_modes: - input_receiver_fn_map[tf.estimator.ModeKeys.EVAL] = eval_input_receiver_fn - - if "predict" in export_modes: - input_receiver_fn_map[tf.estimator.ModeKeys.PREDICT] = predict_input_receiver_fn - - export_dir = estimator._export_all_saved_models( - export_dir_base=export_dir, - input_receiver_fn_map=input_receiver_fn_map, - checkpoint_path=checkpoint_path, - ) - - if register_model_fn is not None: - register_model_fn(export_dir, feature_spec, log_features) - - return export_dir - - -def export_all_models(trainer, - export_dir, - parse_fn, - serving_input_receiver_fn, - export_output_fn=None, - export_modes=('train', 'eval', 'predict'), - feature_spec=None, - checkpoint=None, - log_features=True): - """ - Function for exporting a model with train, eval, and infer modes. - - Args: - trainer: - An object of type twml.trainers.Trainer. - export_dir: - Directory to export the model. - parse_fn: - The parse function used parse the inputs for train and eval. - serving_input_receiver_fn: - The input receiver function used during serving. - export_output_fn: - export_output_fn to be used for serving. - export_modes: - A list to Specify what modes to export. Can be "train", "eval", "predict". - Defaults to ["train", "eval", "predict"] - feature_spec: - A dictionary obtained from FeatureConfig.get_feature_spec() to serialize - as feature_spec.yaml in export_dir. - Defaults to None - Returns: - The timestamped directory the models are exported to. - """ - # Only export from chief in hogwild or distributed modes. - if trainer.params.get('distributed', False) and not trainer.estimator.config.is_chief: - tf.logging.info("Trainer.export_model ignored due to instance not being chief.") - return - - if feature_spec is None: - if getattr(trainer, '_feature_config') is None: - raise ValueError("feature_spec is set to None." - "Please pass feature_spec=feature_config.get_feature_spec() to the export_all_model function") - else: - feature_spec = trainer._feature_config.get_feature_spec() - - export_dir = twml.util.sanitize_hdfs_path(export_dir) - old_export_output_fn = trainer._export_output_fn - trainer._export_output_fn = export_output_fn - supervised_input_receiver_fn = twml.parsers.convert_to_supervised_input_receiver_fn(parse_fn) - if not checkpoint: - checkpoint = trainer.best_or_latest_checkpoint - - export_dir = export_all_models_with_receivers(estimator=trainer.estimator, - export_dir=export_dir, - train_input_receiver_fn=supervised_input_receiver_fn, - eval_input_receiver_fn=supervised_input_receiver_fn, - predict_input_receiver_fn=serving_input_receiver_fn, - export_output_fn=export_output_fn, - export_modes=export_modes, - register_model_fn=trainer.export_model_effects, - feature_spec=feature_spec, - checkpoint_path=checkpoint, - log_features=log_features) - trainer._export_output_fn = old_export_output_fn - return export_dir - - -def export_feature_spec(dir_path, feature_spec_dict): - """ - Exports a FeatureConfig.get_feature_spec() dict to /feature_spec.yaml. - """ - def ordered_dict_representer(dumper, data): - return dumper.represent_mapping('tag:yaml.org,2002:map', data.items()) - - try: - # needed for Python 2 - yaml.add_representer(str, yaml.representer.SafeRepresenter.represent_str) - yaml.add_representer(unicode, yaml.representer.SafeRepresenter.represent_unicode) - except NameError: - # 'unicode' type doesn't exist on Python 3 - # PyYAML handles unicode correctly in Python 3 - pass - - yaml.add_representer(OrderedDict, ordered_dict_representer) - - fbase = "feature_spec.yaml" - fname = fbase.encode('utf-8') if type(dir_path) != str else fbase - file_path = os.path.join(dir_path, fname) - with tf.io.gfile.GFile(file_path, mode='w') as f: - yaml.dump(feature_spec_dict, f, default_flow_style=False, allow_unicode=True) - tf.logging.info("Exported feature spec to %s" % file_path) - - return file_path - - -# Keep the alias for compatibility. -get_supervised_input_receiver_fn = twml.parsers.convert_to_supervised_input_receiver_fn diff --git a/twml/twml/contrib/export/exporters.docx b/twml/twml/contrib/export/exporters.docx new file mode 100644 index 0000000000000000000000000000000000000000..0733f2881effd53b70fbc8a81aff02293869a97b GIT binary patch literal 38152 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 F0|0s9MV0^n literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/internal/error.h b/twml/libtwml/src/lib/internal/error.h deleted file mode 100644 index 3d1bc5441..000000000 --- a/twml/libtwml/src/lib/internal/error.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#include -#include - -#define HANDLE_EXCEPTIONS(fn) do { \ - try { \ - fn \ - } catch(const twml::Error &e) { \ - std::cerr << e.what() << std::endl; \ - return e.err(); \ - } catch(...) { \ - std::cerr << "Unknown error\n"; \ - return TWML_ERR_UNKNOWN; \ - } \ - } while(0) - -#define TWML_CHECK(fn, msg) do { \ - twml_err err = fn; \ - if (err == TWML_ERR_NONE) break; \ - throw twml::Error(err, msg); \ - } while(0) - - -#define CHECK_THRIFT_TYPE(real_type, expected_type, type) do { \ - int real_type_val = real_type; \ - if (real_type_val != expected_type) { \ - throw twml::ThriftInvalidType(real_type_val, __func__, type); \ - } \ - } while(0) diff --git a/twml/libtwml/src/lib/internal/interpolate.docx b/twml/libtwml/src/lib/internal/interpolate.docx new file mode 100644 index 0000000000000000000000000000000000000000..71b2458ea5d11286ff833a49b2234092b24704af GIT binary patch literal 37371 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∓nLG(8D17*)a*&$b-9fXwyh>RjetmCMp%j6o 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 Un-!RYK)FhgArY88T6#e|0BD=#YXATM literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/internal/interpolate.h b/twml/libtwml/src/lib/internal/interpolate.h deleted file mode 100644 index 3e1daf53e..000000000 --- a/twml/libtwml/src/lib/internal/interpolate.h +++ /dev/null @@ -1,74 +0,0 @@ -#pragma once - -#ifdef __cplusplus -#include -namespace twml { - - enum InterpolationMode {LINEAR, NEAREST}; - - template - static Tx interpolation(const Tx *xsData, const int64_t xsStride, - const Ty *ysData, const int64_t ysStride, - const Tx val, const int64_t mainSize, - const InterpolationMode mode, - const int64_t lowest, - const bool return_local_index = false) { - int64_t left = 0; - int64_t right = mainSize-1; - - if (val <= xsData[0]) { - right = 0; - } else if (val >= xsData[right*xsStride]) { - left = right; - } else { - while (left < right) { - int64_t middle = (left+right)/2; - - if (middle < mainSize - 1 && - val >= xsData[middle*xsStride] && - val <= xsData[(middle+1)*xsStride]) { - left = middle; - right = middle + 1; - break; - } else if (val > xsData[middle*xsStride]) { - left = middle; - } else { - right = middle; - } - } - if (lowest) { - while (left > 0 && - val >= xsData[(left - 1) * xsStride] && - val == xsData[left * xsStride]) { - left--; - right--; - } - } - } - - Ty out = 0; - if (return_local_index) { - out = left; - } else if (mode == NEAREST) { - out = ysData[left*ysStride]; - } else { - int64_t leftys = left*ysStride; - int64_t rightys = right*ysStride; - int64_t leftxs = left*xsStride; - int64_t rightxs = right*xsStride; - if (right != left+1 || - xsData[leftxs] == xsData[rightxs]) { - out = ysData[leftys]; - } else { - Tx xLeft = xsData[leftxs]; - Tx xRight = xsData[rightxs]; - Tx yLeft = ysData[leftys]; - Tx ratio = (val - xLeft) / (xRight - xLeft); - out = ratio*(ysData[rightys] - yLeft) + yLeft; - } - } - return out; - } - -} // namespace twml -#endif diff --git a/twml/libtwml/src/lib/internal/khash.docx b/twml/libtwml/src/lib/internal/khash.docx new file mode 100644 index 0000000000000000000000000000000000000000..20baeb8a56b0c5129069bbb346a8c19f33418feb GIT binary patch literal 43198 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 - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -*/ - -/* - An example: - -#include "khash.h" -KHASH_MAP_INIT_INT(32, char) -int main() { - int ret, is_missing; - khiter_t k; - khash_t(32) *h = kh_init(32); - k = kh_put(32, h, 5, &ret); - kh_value(h, k) = 10; - k = kh_get(32, h, 10); - is_missing = (k == kh_end(h)); - k = kh_get(32, h, 5); - kh_del(32, h, k); - for (k = kh_begin(h); k != kh_end(h); ++k) - if (kh_exist(h, k)) kh_value(h, k) = 1; - kh_destroy(32, h); - return 0; -} -*/ - -/* - 2013-05-02 (0.2.8): - - * Use quadratic probing. When the capacity is power of 2, stepping function - i*(i+1)/2 guarantees to traverse each bucket. It is better than double - hashing on cache performance and is more robust than linear probing. - - In theory, double hashing should be more robust than quadratic probing. - However, my implementation is probably not for large hash tables, because - the second hash function is closely tied to the first hash function, - which reduce the effectiveness of double hashing. - - Reference: http://research.cs.vt.edu/AVresearch/hashing/quadratic.php - - 2011-12-29 (0.2.7): - - * Minor code clean up; no actual effect. - - 2011-09-16 (0.2.6): - - * The capacity is a power of 2. This seems to dramatically improve the - speed for simple keys. Thank Zilong Tan for the suggestion. Reference: - - - http://code.google.com/p/ulib/ - - http://nothings.org/computer/judy/ - - * Allow to optionally use linear probing which usually has better - performance for random input. Double hashing is still the default as it - is more robust to certain non-random input. - - * Added Wang's integer hash function (not used by default). This hash - function is more robust to certain non-random input. - - 2011-02-14 (0.2.5): - - * Allow to declare global functions. - - 2009-09-26 (0.2.4): - - * Improve portability - - 2008-09-19 (0.2.3): - - * Corrected the example - * Improved interfaces - - 2008-09-11 (0.2.2): - - * Improved speed a little in kh_put() - - 2008-09-10 (0.2.1): - - * Added kh_clear() - * Fixed a compiling error - - 2008-09-02 (0.2.0): - - * Changed to token concatenation which increases flexibility. - - 2008-08-31 (0.1.2): - - * Fixed a bug in kh_get(), which has not been tested previously. - - 2008-08-31 (0.1.1): - - * Added destructor -*/ - - -#ifndef __AC_KHASH_H -#define __AC_KHASH_H - -/*! - @header - - Generic hash table library. - */ - -#define AC_VERSION_KHASH_H "0.2.8" - -#include -#include -#include - -/* compiler specific configuration */ - -#if UINT_MAX == 0xffffffffu -typedef unsigned int khint32_t; -#elif ULONG_MAX == 0xffffffffu -typedef unsigned long khint32_t; -#endif - -#if ULONG_MAX == ULLONG_MAX -typedef unsigned long khint64_t; -#else -typedef uint64_t khint64_t; -#endif - -#ifndef kh_inline -#ifdef _MSC_VER -#define kh_inline __inline -#else -#define kh_inline inline -#endif -#endif /* kh_inline */ - -#ifndef klib_unused -#if (defined __clang__ && __clang_major__ >= 3) || (defined __GNUC__ && __GNUC__ >= 3) -#define klib_unused __attribute__ ((__unused__)) -#else -#define klib_unused -#endif -#endif /* klib_unused */ - -typedef khint32_t khint_t; -typedef khint_t khiter_t; - -#define __ac_isempty(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&2) -#define __ac_isdel(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&1) -#define __ac_iseither(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&3) -#define __ac_set_isdel_false(flag, i) (flag[i>>4]&=~(1ul<<((i&0xfU)<<1))) -#define __ac_set_isempty_false(flag, i) (flag[i>>4]&=~(2ul<<((i&0xfU)<<1))) -#define __ac_set_isboth_false(flag, i) (flag[i>>4]&=~(3ul<<((i&0xfU)<<1))) -#define __ac_set_isdel_true(flag, i) (flag[i>>4]|=1ul<<((i&0xfU)<<1)) - -#define __ac_fsize(m) ((m) < 16? 1 : (m)>>4) - -#ifndef kroundup32 -#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x)) -#endif - -#ifndef kcalloc -#define kcalloc(N,Z) calloc(N,Z) -#endif -#ifndef kmalloc -#define kmalloc(Z) malloc(Z) -#endif -#ifndef krealloc -#define krealloc(P,Z) realloc(P,Z) -#endif -#ifndef kfree -#define kfree(P) free(P) -#endif - -static const double __ac_HASH_UPPER = 0.77; - -#define __KHASH_TYPE(name, khkey_t, khval_t) \ - typedef struct kh_##name##_s { \ - khint_t n_buckets, size, n_occupied, upper_bound; \ - khint32_t *flags; \ - khkey_t *keys; \ - khval_t *vals; \ - } kh_##name##_t; - -#define __KHASH_PROTOTYPES(name, khkey_t, khval_t) \ - extern kh_##name##_t *kh_init_##name(void); \ - extern void kh_destroy_##name(kh_##name##_t *h); \ - extern void kh_clear_##name(kh_##name##_t *h); \ - extern khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key); \ - extern int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets); \ - extern khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret); \ - extern void kh_del_##name(kh_##name##_t *h, khint_t x); - -#define __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ - SCOPE kh_##name##_t *kh_init_##name(void) { \ - return (kh_##name##_t*)kcalloc(1, sizeof(kh_##name##_t)); \ - } \ - SCOPE void kh_destroy_##name(kh_##name##_t *h) \ - { \ - if (h) { \ - kfree((void *)h->keys); kfree(h->flags); \ - kfree((void *)h->vals); \ - kfree(h); \ - } \ - } \ - SCOPE void kh_clear_##name(kh_##name##_t *h) \ - { \ - if (h && h->flags) { \ - memset(h->flags, 0xaa, __ac_fsize(h->n_buckets) * sizeof(khint32_t)); \ - h->size = h->n_occupied = 0; \ - } \ - } \ - SCOPE khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key) \ - { \ - if (h->n_buckets) { \ - khint_t k, i, last, mask, step = 0; \ - mask = h->n_buckets - 1; \ - k = __hash_func(key); i = k & mask; \ - last = i; \ - while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \ - i = (i + (++step)) & mask; \ - if (i == last) return h->n_buckets; \ - } \ - return __ac_iseither(h->flags, i)? h->n_buckets : i; \ - } else return 0; \ - } \ - SCOPE int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \ - { /* This function uses 0.25*n_buckets bytes of working space instead of [sizeof(key_t+val_t)+.25]*n_buckets. */ \ - khint32_t *new_flags = 0; \ - khint_t j = 1; \ - { \ - kroundup32(new_n_buckets); \ - if (new_n_buckets < 4) new_n_buckets = 4; \ - if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0; /* requested size is too small */ \ - else { /* hash table size to be changed (shrink or expand); rehash */ \ - new_flags = (khint32_t*)kmalloc(__ac_fsize(new_n_buckets) * sizeof(khint32_t)); \ - if (!new_flags) return -1; \ - memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(khint32_t)); \ - if (h->n_buckets < new_n_buckets) { /* expand */ \ - khkey_t *new_keys = (khkey_t*)krealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \ - if (!new_keys) { kfree(new_flags); return -1; } \ - h->keys = new_keys; \ - if (kh_is_map) { \ - khval_t *new_vals = (khval_t*)krealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \ - if (!new_vals) { kfree(new_flags); return -1; } \ - h->vals = new_vals; \ - } \ - } /* otherwise shrink */ \ - } \ - } \ - if (j) { /* rehashing is needed */ \ - for (j = 0; j != h->n_buckets; ++j) { \ - if (__ac_iseither(h->flags, j) == 0) { \ - khkey_t key = h->keys[j]; \ - khval_t val; \ - khint_t new_mask; \ - new_mask = new_n_buckets - 1; \ - if (kh_is_map) val = h->vals[j]; \ - __ac_set_isdel_true(h->flags, j); \ - while (1) { /* kick-out process; sort of like in Cuckoo hashing */ \ - khint_t k, i, step = 0; \ - k = __hash_func(key); \ - i = k & new_mask; \ - while (!__ac_isempty(new_flags, i)) i = (i + (++step)) & new_mask; \ - __ac_set_isempty_false(new_flags, i); \ - if (i < h->n_buckets && __ac_iseither(h->flags, i) == 0) { /* kick out the existing element */ \ - { khkey_t tmp = h->keys[i]; h->keys[i] = key; key = tmp; } \ - if (kh_is_map) { khval_t tmp = h->vals[i]; h->vals[i] = val; val = tmp; } \ - __ac_set_isdel_true(h->flags, i); /* mark it as deleted in the old hash table */ \ - } else { /* write the element and jump out of the loop */ \ - h->keys[i] = key; \ - if (kh_is_map) h->vals[i] = val; \ - break; \ - } \ - } \ - } \ - } \ - if (h->n_buckets > new_n_buckets) { /* shrink the hash table */ \ - h->keys = (khkey_t*)krealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \ - if (kh_is_map) h->vals = (khval_t*)krealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \ - } \ - kfree(h->flags); /* free the working space */ \ - h->flags = new_flags; \ - h->n_buckets = new_n_buckets; \ - h->n_occupied = h->size; \ - h->upper_bound = (khint_t)(h->n_buckets * __ac_HASH_UPPER + 0.5); \ - } \ - return 0; \ - } \ - SCOPE khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret) \ - { \ - khint_t x; \ - if (h->n_occupied >= h->upper_bound) { /* update the hash table */ \ - if (h->n_buckets > (h->size<<1)) { \ - if (kh_resize_##name(h, h->n_buckets - 1) < 0) { /* clear "deleted" elements */ \ - *ret = -1; return h->n_buckets; \ - } \ - } else if (kh_resize_##name(h, h->n_buckets + 1) < 0) { /* expand the hash table */ \ - *ret = -1; return h->n_buckets; \ - } \ - } /* TODO: to implement automatically shrinking; resize() already support shrinking */ \ - { \ - khint_t k, i, site, last, mask = h->n_buckets - 1, step = 0; \ - x = site = h->n_buckets; k = __hash_func(key); i = k & mask; \ - if (__ac_isempty(h->flags, i)) x = i; /* for speed up */ \ - else { \ - last = i; \ - while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \ - if (__ac_isdel(h->flags, i)) site = i; \ - i = (i + (++step)) & mask; \ - if (i == last) { x = site; break; } \ - } \ - if (x == h->n_buckets) { \ - if (__ac_isempty(h->flags, i) && site != h->n_buckets) x = site; \ - else x = i; \ - } \ - } \ - } \ - if (__ac_isempty(h->flags, x)) { /* not present at all */ \ - h->keys[x] = key; \ - __ac_set_isboth_false(h->flags, x); \ - ++h->size; ++h->n_occupied; \ - *ret = 1; \ - } else if (__ac_isdel(h->flags, x)) { /* deleted */ \ - h->keys[x] = key; \ - __ac_set_isboth_false(h->flags, x); \ - ++h->size; \ - *ret = 2; \ - } else *ret = 0; /* Don't touch h->keys[x] if present and not deleted */ \ - return x; \ - } \ - SCOPE void kh_del_##name(kh_##name##_t *h, khint_t x) \ - { \ - if (x != h->n_buckets && !__ac_iseither(h->flags, x)) { \ - __ac_set_isdel_true(h->flags, x); \ - --h->size; \ - } \ - } - -#define KHASH_DECLARE(name, khkey_t, khval_t) \ - __KHASH_TYPE(name, khkey_t, khval_t) \ - __KHASH_PROTOTYPES(name, khkey_t, khval_t) - -#define KHASH_INIT2(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ - __KHASH_TYPE(name, khkey_t, khval_t) \ - __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) - -#define KHASH_INIT(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ - KHASH_INIT2(name, static kh_inline klib_unused, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) - -/* --- BEGIN OF HASH FUNCTIONS --- */ - -/*! @function - @abstract Integer hash function - @param key The integer [khint32_t] - @return The hash value [khint_t] - */ -#define kh_int_hash_func(key) (khint32_t)(key) -/*! @function - @abstract Integer comparison function - */ -#define kh_int_hash_equal(a, b) ((a) == (b)) -/*! @function - @abstract 64-bit integer hash function - @param key The integer [khint64_t] - @return The hash value [khint_t] - */ -#define kh_int64_hash_func(key) (khint32_t)((key)>>33^(key)^(key)<<11) -/*! @function - @abstract 64-bit integer comparison function - */ -#define kh_int64_hash_equal(a, b) ((a) == (b)) -/*! @function - @abstract const char* hash function - @param s Pointer to a null terminated string - @return The hash value - */ -static kh_inline khint_t __ac_X31_hash_string(const char *s) -{ - khint_t h = (khint_t)*s; - if (h) for (++s ; *s; ++s) h = (h << 5) - h + (khint_t)*s; - return h; -} -/*! @function - @abstract Another interface to const char* hash function - @param key Pointer to a null terminated string [const char*] - @return The hash value [khint_t] - */ -#define kh_str_hash_func(key) __ac_X31_hash_string(key) -/*! @function - @abstract Const char* comparison function - */ -#define kh_str_hash_equal(a, b) (strcmp(a, b) == 0) - -static kh_inline khint_t __ac_Wang_hash(khint_t key) -{ - key += ~(key << 15); - key ^= (key >> 10); - key += (key << 3); - key ^= (key >> 6); - key += ~(key << 11); - key ^= (key >> 16); - return key; -} -#define kh_int_hash_func2(key) __ac_Wang_hash((khint_t)key) - -/* --- END OF HASH FUNCTIONS --- */ - -/* Other convenient macros... */ - -/*! - @abstract Type of the hash table. - @param name Name of the hash table [symbol] - */ -#define khash_t(name) kh_##name##_t - -/*! @function - @abstract Initiate a hash table. - @param name Name of the hash table [symbol] - @return Pointer to the hash table [khash_t(name)*] - */ -#define kh_init(name) kh_init_##name() - -/*! @function - @abstract Destroy a hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - */ -#define kh_destroy(name, h) kh_destroy_##name(h) - -/*! @function - @abstract Reset a hash table without deallocating memory. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - */ -#define kh_clear(name, h) kh_clear_##name(h) - -/*! @function - @abstract Resize a hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - @param s New size [khint_t] - */ -#define kh_resize(name, h, s) kh_resize_##name(h, s) - -/*! @function - @abstract Insert a key to the hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - @param k Key [type of keys] - @param r Extra return code: -1 if the operation failed; - 0 if the key is present in the hash table; - 1 if the bucket is empty (never used); 2 if the element in - the bucket has been deleted [int*] - @return Iterator to the inserted element [khint_t] - */ -#define kh_put(name, h, k, r) kh_put_##name(h, k, r) - -/*! @function - @abstract Retrieve a key from the hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - @param k Key [type of keys] - @return Iterator to the found element, or kh_end(h) if the element is absent [khint_t] - */ -#define kh_get(name, h, k) kh_get_##name(h, k) - -/*! @function - @abstract Remove a key from the hash table. - @param name Name of the hash table [symbol] - @param h Pointer to the hash table [khash_t(name)*] - @param k Iterator to the element to be deleted [khint_t] - */ -#define kh_del(name, h, k) kh_del_##name(h, k) - -/*! @function - @abstract Test whether a bucket contains data. - @param h Pointer to the hash table [khash_t(name)*] - @param x Iterator to the bucket [khint_t] - @return 1 if containing data; 0 otherwise [int] - */ -#define kh_exist(h, x) (!__ac_iseither((h)->flags, (x))) - -/*! @function - @abstract Get key given an iterator - @param h Pointer to the hash table [khash_t(name)*] - @param x Iterator to the bucket [khint_t] - @return Key [type of keys] - */ -#define kh_key(h, x) ((h)->keys[x]) - -/*! @function - @abstract Get value given an iterator - @param h Pointer to the hash table [khash_t(name)*] - @param x Iterator to the bucket [khint_t] - @return Value [type of values] - @discussion For hash sets, calling this results in segfault. - */ -#define kh_val(h, x) ((h)->vals[x]) - -/*! @function - @abstract Alias of kh_val() - */ -#define kh_value(h, x) ((h)->vals[x]) - -/*! @function - @abstract Get the start iterator - @param h Pointer to the hash table [khash_t(name)*] - @return The start iterator [khint_t] - */ -#define kh_begin(h) (khint_t)(0) - -/*! @function - @abstract Get the end iterator - @param h Pointer to the hash table [khash_t(name)*] - @return The end iterator [khint_t] - */ -#define kh_end(h) ((h)->n_buckets) - -/*! @function - @abstract Get the number of elements in the hash table - @param h Pointer to the hash table [khash_t(name)*] - @return Number of elements in the hash table [khint_t] - */ -#define kh_size(h) ((h)->size) - -/*! @function - @abstract Get the number of buckets in the hash table - @param h Pointer to the hash table [khash_t(name)*] - @return Number of buckets in the hash table [khint_t] - */ -#define kh_n_buckets(h) ((h)->n_buckets) - -/*! @function - @abstract Iterate over the entries in the hash table - @param h Pointer to the hash table [khash_t(name)*] - @param kvar Variable to which key will be assigned - @param vvar Variable to which value will be assigned - @param code Block of code to execute - */ -#define kh_foreach(h, kvar, vvar, code) { khint_t __i; \ - for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \ - if (!kh_exist(h,__i)) continue; \ - (kvar) = kh_key(h,__i); \ - (vvar) = kh_val(h,__i); \ - code; \ - } } - -/*! @function - @abstract Iterate over the values in the hash table - @param h Pointer to the hash table [khash_t(name)*] - @param vvar Variable to which value will be assigned - @param code Block of code to execute - */ -#define kh_foreach_value(h, vvar, code) { khint_t __i; \ - for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \ - if (!kh_exist(h,__i)) continue; \ - (vvar) = kh_val(h,__i); \ - code; \ - } } - -/* More conenient interfaces */ - -/*! @function - @abstract Instantiate a hash set containing integer keys - @param name Name of the hash table [symbol] - */ -#define KHASH_SET_INIT_INT(name) \ - KHASH_INIT(name, khint32_t, char, 0, kh_int_hash_func, kh_int_hash_equal) - -/*! @function - @abstract Instantiate a hash map containing integer keys - @param name Name of the hash table [symbol] - @param khval_t Type of values [type] - */ -#define KHASH_MAP_INIT_INT(name, khval_t) \ - KHASH_INIT(name, khint32_t, khval_t, 1, kh_int_hash_func, kh_int_hash_equal) - -/*! @function - @abstract Instantiate a hash map containing 64-bit integer keys - @param name Name of the hash table [symbol] - */ -#define KHASH_SET_INIT_INT64(name) \ - KHASH_INIT(name, khint64_t, char, 0, kh_int64_hash_func, kh_int64_hash_equal) - -/*! @function - @abstract Instantiate a hash map containing 64-bit integer keys - @param name Name of the hash table [symbol] - @param khval_t Type of values [type] - */ -#define KHASH_MAP_INIT_INT64(name, khval_t) \ - KHASH_INIT(name, khint64_t, khval_t, 1, kh_int64_hash_func, kh_int64_hash_equal) - -typedef const char *kh_cstr_t; -/*! @function - @abstract Instantiate a hash map containing const char* keys - @param name Name of the hash table [symbol] - */ -#define KHASH_SET_INIT_STR(name) \ - KHASH_INIT(name, kh_cstr_t, char, 0, kh_str_hash_func, kh_str_hash_equal) - -/*! @function - @abstract Instantiate a hash map containing const char* keys - @param name Name of the hash table [symbol] - @param khval_t Type of values [type] - */ -#define KHASH_MAP_INIT_STR(name, khval_t) \ - KHASH_INIT(name, kh_cstr_t, khval_t, 1, kh_str_hash_func, kh_str_hash_equal) - -#endif /* __AC_KHASH_H */ diff --git a/twml/libtwml/src/lib/internal/linear_search.docx b/twml/libtwml/src/lib/internal/linear_search.docx new file mode 100644 index 0000000000000000000000000000000000000000..bb9ab464883aa86c3d134e0932b2f1cce801e61f GIT binary patch literal 36876 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 OL54(N_L$lY;sF2;mE&dr literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/internal/linear_search.h b/twml/libtwml/src/lib/internal/linear_search.h deleted file mode 100644 index a3d294853..000000000 --- a/twml/libtwml/src/lib/internal/linear_search.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#ifdef __cplusplus -#include -namespace twml { - - template - static int64_t linear_search(const Tx *xsData, const Tx val, const int64_t mainSize) { - int64_t left = 0; - int64_t right = mainSize-1; - while(left <= right && val > xsData[left]) - left++; - return left; - } - -} // namespace twml -#endif diff --git a/twml/libtwml/src/lib/internal/murmur_hash3.docx b/twml/libtwml/src/lib/internal/murmur_hash3.docx new file mode 100644 index 0000000000000000000000000000000000000000..58ecc6e3a4304d40e511bfb4c846da2c1711148a GIT binary patch literal 37032 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/internal/murmur_hash3.h b/twml/libtwml/src/lib/internal/murmur_hash3.h deleted file mode 100644 index 3bdfbe486..000000000 --- a/twml/libtwml/src/lib/internal/murmur_hash3.h +++ /dev/null @@ -1,37 +0,0 @@ -//----------------------------------------------------------------------------- -// MurmurHash3 was written by Austin Appleby, and is placed in the public -// domain. The author hereby disclaims copyright to this source code. - -#ifndef _MURMURHASH3_H_ -#define _MURMURHASH3_H_ - -//----------------------------------------------------------------------------- -// Platform-specific functions and macros - -// Microsoft Visual Studio - -#if defined(_MSC_VER) && (_MSC_VER < 1600) - -typedef unsigned char uint8_t; -typedef unsigned int uint32_t; -typedef unsigned __int64 uint64_t; - -// Other compilers - -#else // defined(_MSC_VER) - -#include - -#endif // !defined(_MSC_VER) - -//----------------------------------------------------------------------------- - -void MurmurHash3_x86_32 ( const void * key, int len, uint32_t seed, void * out ); - -void MurmurHash3_x86_128 ( const void * key, int len, uint32_t seed, void * out ); - -void MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out ); - -//----------------------------------------------------------------------------- - -#endif // _MURMURHASH3_H_ diff --git a/twml/libtwml/src/lib/internal/thrift.docx b/twml/libtwml/src/lib/internal/thrift.docx new file mode 100644 index 0000000000000000000000000000000000000000..a46b5ef4b8b4e05a700bf7f949973fd0cabbe17d GIT binary patch literal 37269 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 PR|zsC0<(u)FNg;KGZnO< literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/internal/thrift.h b/twml/libtwml/src/lib/internal/thrift.h deleted file mode 100644 index 4e4786219..000000000 --- a/twml/libtwml/src/lib/internal/thrift.h +++ /dev/null @@ -1,69 +0,0 @@ -// For details of how to encode and decode thrift, check -// https://github.com/apache/thrift/blob/master/doc/specs/thrift-binary-protocol.md - -// Definitions of the thrift binary format -typedef enum { - TTYPE_STOP = 0, - TTYPE_VOID = 1, - TTYPE_BOOL = 2, - TTYPE_BYTE = 3, - TTYPE_DOUBLE = 4, - TTYPE_I16 = 6, - TTYPE_I32 = 8, - TTYPE_I64 = 10, - TTYPE_STRING = 11, - TTYPE_STRUCT = 12, - TTYPE_MAP = 13, - TTYPE_SET = 14, - TTYPE_LIST = 15, - TTYPE_ENUM = 16, -} TTYPES; - -// Fields of a batch prediction response -typedef enum { - BPR_DUMMY , - BPR_PREDICTIONS, -} BPR_FIELDS; - -// Fields of a datarecord -typedef enum { - DR_CROSS , // fake field for crosses - DR_BINARY , - DR_CONTINUOUS , - DR_DISCRETE , - DR_STRING , - DR_SPARSE_BINARY , - DR_SPARSE_CONTINUOUS , - DR_BLOB , - DR_GENERAL_TENSOR , - DR_SPARSE_TENSOR , -} DR_FIELDS; - -// Fields for General tensor -typedef enum { - GT_DUMMY , // dummy field - GT_RAW , - GT_STRING , - GT_INT32 , - GT_INT64 , - GT_FLOAT , - GT_DOUBLE , - GT_BOOL , -} GT_FIELDS; - -typedef enum { - SP_DUMMY , // dummy field - SP_COO , -} SP_FIELDS; - -// Enum values from tensor.thrift -typedef enum { - DATA_TYPE_FLOAT , - DATA_TYPE_DOUBLE , - DATA_TYPE_INT32 , - DATA_TYPE_INT64 , - DATA_TYPE_UINT8 , - DATA_TYPE_STRING , - DATA_TYPE_BYTE , - DATA_TYPE_BOOL , -} DATA_TYPES; diff --git a/twml/libtwml/src/lib/internal/utf_converter.docx b/twml/libtwml/src/lib/internal/utf_converter.docx new file mode 100644 index 0000000000000000000000000000000000000000..d3bb15cc723b2a339e1519a7c3a3eefd2e56e73d GIT binary patch literal 36758 zcmagFWmsIxwl$2qdvFQv?k<7g?h-U;<4)rNf_rdxcSz&zgy3#L0>Rzi&ffc+v-i38 ze&3(fPgl)3#+Y-~s;afRT16fj1_uHH0s*2tomZzyttdVj5&~ir4gvxj+^R1LaB#J7 za5dKOak_u$IqqV#&KJ9Zw;*AiF~{ zI{;VPn(6yyiU*Qyr?yYP7%TKtB3CacS?3-ihPEnJ3yW+p6hTdR6gIr3V463toyt)| z?QocOhw#bwig#I`N*oM&5&Ky8zYri@O<{qtR zF@9{<(~Z&avpx)#CG@_PM9Vzt4x*=RpfF5=OXp~ht?~`I?Yq6DFN%FDa=#dEbUQnv zXg{tQFpU0*TT`@74J00$GQ!Ev`|5NkN$Gc;8=}9&FQw$yE@doC7bw>6b9avRxc32e zncxm3u=-Z^siSz;Z6zq*Oo1tdUjI3nq!60#;;hh|Nw!X+cA z1I0p-?l0pf#STE(;^oc`RVhOqydKj1(;YL*`HTXhMaE*gU~N;~xuCp-9-R&P^G1;I zDnbfkdmx3U#&(FVU3%m-6`Gg@%`K0m7P$!HI`)7*eZ$GLc(sI-F@wDB8fs_loJ$LBlIW>;C00I|b3M@;oJC3ALszCtuPC+sUpx&5h_ z^0>B4ysr-+m5=%r=PU=olFI5vo^P+R<{NZ^J#E`Fu@5j2bifi0~}pg%>d38zXy3% z!kAJY8;10)uk@^UO+g0vh1% zB5S-&EzoA6387?R@uz|2pOJNOUsg=BU9|AWG$5zNeD1!A!CmK}^cVYQy}_QAS7JK;(*>WXXa*9Wr;c7Gs= z9%{(1cLOGBdzlt=wQwB7$L{yADCm%!VybCs9<5p&o1c$eoSinN+@TFCP+G!J&{E#y zO&^z5iUs8%tm?b31Nw{VhGu8CSD9U?14LcTTRCg7pPR?{Xj4A`GuQIahCGC=!Vt5P zZm-U**)x*la7x58VdTEberM{O$UkWCe|`7zW|5fjj`tjf;Lr-qhneO1kH<2ORf>tCSDiK<==<%- zLQMLXd);0CS+Yvg;`$d=Hs#M1(9bm=E4)glgt_1CTp#MDB%`9qKz(@Tgc6V}tDDdR=e+6EoM!ULRj*hDz*+l*#d82Ia0F=?A`9;ieey+qH~i zMb-)33IzV=#-j#u_4+dH@Qdip!F`GxgbzuAI5xd?L^+xP<-c1s}O5w1O>0q?#{H2%tB*od=zigo})}h zaARG`F2}c3rP%9`SR`#t1l_r@6U_2)n0Te_B9fLiIXa1$C0n!5?0isoENlmJKDUyi z1YxGW`ED{w!0^L`Wio(1t{6F8t%E`Lgs|ai!hoaZLuQp*5;rNrS&Hs5&82-?(>KeH zj6YZ?j}nfGcaw$W6L4T$im@1Y{8m!odJ04B)*P)GLLFtogs*HPkO+9X4S$5Wsiw@2 zwqTR^gwd)|&f|h)@7yM|fj%&Ui^ydTg23XB}Ee4<(^N806iz>1x%olx| z+WslaL zw$0UPOj*sgpg!v(-;n%KLE^R;{f<>ipl>MM>g=QmTm9HL%pTbgTgzd{RH?x`mpe%( znMp6$0;hal8reCal|}jpf$5OkxPbIa@z7Yl1rp9lHw&Jz57`W741sKAE)2ZB6l-#X zDR!R6RvKn1{I18v;%>a<)_(fB8L{Of%KseD4go}19N?L53_Q~jgJ-%w2K1ln^xuc| zpKErKxNHfFtJ9A?HXLutd%f>lk$>QC>Cq;v3EMpk0 z+f3*_&N~z9(H+ZqGYBbfc zqbu+PBUvFJj5J{((EpWd7gsMk3zy$h2Y5f4xGhuf*VUC@VEpvMJ}v}eXwm^9!JYVn zPe*p$DW@Xm%&%|X@IS^L8~amJh>>ZkX==SMPpB8{&Bjxq-__1a)UbGd&hc-zI|Uk( z#bi96tnv1Bp?0?EpK3jpOq^VT0KjJgU%~sm6HmR9?39&fhv$R#}JP`%wcjqcwLt(*p z#;hxkU{M|${_Dr+V?)OeYkqv+o<$`lgpak?!P^;o9|0MEQlQ9Ne;WURSL7Se%=yWY z$JmZd!#%-!RCv#&5VMY)r3ZqC#a=zEO~(4-yXE;*J+@C+WCAf`CzG*O4{eNvBrwN0sJCO<|~_hO!3-Z zbKhm!Q!_S4lhW|ysuu>tOs6Jv1tE5vtrLP$MS)(C8X#Z6V{D3=h`6g-bl9S>6D)zL zum<$7nrhMKT4O(5Q9r&=)^<>=MJT@i^UHppr9Z;+)!MUby1`Q|aH)MmNVv-5^du~m z_avKF`RLWp=oBbio#U|ZirwFt64kogb*!|%5)0VA`|(<**Cmrp)cI9khUcFCp_|A1 zmYtgRW2#Stx|M$HL_k! zGSfHqq)1EPtbnrW-FD}Im!gq0B5@R~Ks3I!9M3Ga=3eDkF zsV5DJ*!QxkvZYvRNt_iSOuIOY6!Odq?-3G|zIIjmZxFNIX^plI;mlXIvu6}Qs@k3B zv^@c&$1zucGTsv%G?(fcz;7+`Mb;4}D1we}b zWnbMyNX-Jn>V-VqE4L2yFYIHk1h6YP*pB`WS3NLVC>Zx2u76U&l+m8rPOa&e;4LX1lFU50ge@?@dqxVd6}m_^PP&6Sv5m3?r1a*xwL+4<24^1I%R*lbo2N1IBiXQi(a(u5?(uh&8)sc@^}JiYNG9>XDxnE^@c&C z&pCN@{qWdxxvM`W4MUbf=N^2hW3nNnEVZ;NM_%!q zpvsqNnpDQJ=uzxBU6$FFf$O)(Gl@))%BJR351EWhR))I$qgBV%{-@oOS-5&!^W=C9K32ve(>qo}2D_kQ_*#!%7tt59 zDuTA;vHg4z*-1X|>lGJ{-g}4XVo!j`ORzDA{63kU^mU!8&-#`8$lf^-D%y}=8vvA* zZ)pkM{dCH}nIUW0IHi1jNuLExc|2SVUA$Zj4tRr}oxFgzFUha-#}6|T|@ffcY;F{l~+EKh&JWLNH zsz{MfpJCxHi8faPdF+Kq{JK2MZWo@^X0LS^ot)o7YNuoQ8)+` zdB~w-Js6a`8>gK4TDOGP<*95mOC?_Fd!*@@vQ-+uO$;}WVK7RUj?AI;<37?xX83_* zL-9%hiBLa{pxE$+gLw2}bjj{OvHc>U``aj!fqLw(acsxre8OezChddp5{%Nc$fH?@ zSd9*~=xdl=`R}!ge$s;@<%0r8qD!<)(?ltpXYw%IUXo5_OUGs9_!)JidA^#u(SiP1 zM-H6*ajGr^lncc5Q-=A9Ok`UNBn-YVy5djtN&GHQd-AvdIpvHSFN?lQ=UaY(;zJQ# z{aC?hnJJy|DmmmE!ko3{RTBZaP?TsPANIulDWfc@L!X;1lkea9rZ$>axK~b36Bg1n z`;w79z23b%%oF2R%A;qp@pUbFa@A^n;4VN?(s*0`QGjo;y!J?IK>7SO(@ybi&ClF0 zRZj0ssiFG;?}EPcuQ#*UDxoV;41Ck^rTOy*7+M3Z4w_88=RBYm(`okkf$KR-w;t#f zX%o#cUvDoPrAh-M2O+)wSvC1Inkqb{RfDpAf_k(dgKW>{g_$HvQG4=Z%mtL)gy}4IP7fw!xD7KHVO71%a3tEJ1Y&R z5+yzm&Hee)EUq!DREPLFS_WsC5+S-l^;@Ycq;Iu&o5_y1m5e{0X@R&!^B$L~^oQ9u zRXlSeXziENEM7%fHCjbv@iimc@uQ}*3Cnz0bhSSOBfx8i5zFU8_ZC_+8|AqbHJVMv z2?S}28}dCjH{Gcn@~VBO)}AyeC3ohcY~wcJ?AMjyJqbC+nDDwkd_j zt7J~pjek&1D6BVM;&71aqxDhd5MI$Wm9%5M9cRh3k&J9~!&x&%nE-4tf%!x;7O zKbq}MT^Biy4*vm~zX6)X(u zQgyS$;{YtI!X%v5Ri?lDG^`04F-c&$ECoLcM=_k583^NgOES_Llrcl3x6M@fa}DJ< z0957@QKx6v$Dda)a@n~W2%_N7-f^a0r?rh&ooM;`;R-r4GAiH}mX^nMEWxXmsVY0& z6!&SgI9YHn58IfR!M5*SY(&cUU9=;8pBUE_7qnz4c`1y85O7${tPa<7M*%*Ut>d zhf2Ch3;&1jPS96d6D*DW4;{-x{=t4vdAY#El_VT!dJzjc{<@Gl9BQ|GEUwJe_fJvS zN?~K^EIl>6toWQO+GN!`g$10J3|+svCR0Hr=owwr4{wZiIDzl@gkDJqFh#cbYzJCe zw~02W;ken^9EuBl z{Bov!ItLwUxiOjGtVAybBK|fgawg?c33tG5Nu!5-w~UhTReCfaWU(=01-2d1-W@+q zx-^{=niZpmn$AOy9Ia84O};b4n$vi zIJwQ_J}mDUrx^S*xJG^>F}yt9dZs*Hv+fA8kh32=g2g>@H#Wx8MCCy^(?qr+yfVn0p|0DDGe0e;oBuafGTNPWhG*%q1RgcgSZ-Lm62CZbU zaVw+XXlhk`gV*taK^C(EcWTixpZ6wkCB2|UbyH!8(;ez-@(+Q4bsFe}G~IT1SlYAE z4~QK<`G$}^p_hqS$s@lJ>4LG@H~W#>BSb$0Vbi)a)f}K|ihn+^fBR`&h9;lahtH|l z1&kB8kCw}8C8Ez{upS(Q?YUbUvhJF>1I`h^O{0lP0${Ey0oV(`9?OAUf;AZ6Z&)}$ zRR_aN;7S6jBMv57)&>I9eL%ZKXt^yWLT)5V#co@O?an$90D;MKsPzDzA>?7oE14AP zD@znUM4^rI3nGR~7t5UADJq;M+TR?KC0pGglQz-YMO?V^b8~&CsV4Y%Z4almyctFq z#fA3d{FXZ0{~{e|P~GV(@@u14VI-G2&6Pg0)tN^TkesTxWf@Rj^1QM$F=vS6BKzf* zAagn@FO*SkOS)cnh6h@F@pCr)Ie+9Rsyf0<`Hk>5kTufqei^Pjex3bf`H~itpG*tR znFORVUFsf&utB*|qkOYueHPN;?sd9cfstpy8=6DIaro+^E8Oe%H<8~!ODMxfWuc1r zssOM%9*Un##~<#cf4R^8+x_6TdoZa)N4X!*mBV-F3vZj}8R^-K2AgI#=^Ry7*mjj} z?872{DfHBG{Og3{IJ=S{Z?BH%@1^+bi{UCYHvU*08AO5Y*?Kf?nAdxi>Gt>2RSITmYjFd~c4nuiEC}%5{7o<;%RchUYXKl)ZOL?v4>?)E( z3XG6E^8#pR}suV-pD zFk3!EdDCx(LS?J4PEdHaYIKyQ+J%`5TF*Y#^zB6iyYHmtlHb<%rirm|(_y~hT)0Gc zo83@(M@`NGPlw(E^bn8KbRy~?Z<1odc4x_5yWH|)a=faT-|Yhy4AWp~^ca+NInV9J zbHuxXIQ8AuS@nAR47pit{NRII0f(>H4i9>qB$Fdl3b_u;4{6fCc|}plsyWRo{pj`l zbwKiGk68dJ2SaH%tx&ajl$yT|!-p@#YpbT&EL&AtW2Ft(G|5+`OKhQ%?!a$Nd@=*V zNS!pnfqFK!7J?C!QC2>Ir^fFlNm1iE%dOjDeG4?pOX{ZPv>&K)X8QLJ>7Xu_r%ECN z&TcL>V3-y&m#2`TkQktlVj15Q&9dZtCZ&1D+k#Lk?^&TKeE3UBNm@+6C$N`7Q1n1g zs(_Ll);O_8j5g{cm?|iW%(HpuBs;C6+!{0P-#jpH|HY%UBZm*URdTL^S!?2QILOMz zP>MhY4k_vTPjQVaHvX?|(qe|a`c;Rj`#nq=Fd9ryhXm+2Xc{oHXD^TJZ>;frm+>G+ z+!LA;>4#f8Pot};tk7c=jOQ8=WILxB=4KZ64;i5nrmVMJ+;AYh!mx|MQS~8~A?Vcd zlPJCY58H>&|Ha1d_W#L7H|!b6drrF$-?0C&q{c=M=IzGEt>>&`^FXVYBrmywDW zr?!WS`&xhG53_z9$kcSCMA7ezoT%E+2DO9lXv1nIZ>f}N6btHW@@t7I=*`-;; z08ahZsu2@Srcxl!G7eNcRGI|2GlV*V6iWEOFft|H3@)Bz{F0LSJS>zmJf}tMuS3pA zig&!-(-8v)KHFyMOfof`@J;6I0|lp^OmIL5(z-7aJehEbOPT63PTz_#!g0O@CPMJX zVbejHiZRI;Vbp!8t|j<9?oQdjf)OXEOX;&G`!|hL73q4a#S3|IzvEsK{vCHun2v&z z-?2IS8L>ML@t<)^kANY;7xr2|_U}RA1FoS1D(21DX-&tGBh7=8Jc_4(Q@JPeTctW# zBUoi0{BM;okab^7huVJnvhA5m;@cwy%0jw5LJtQvzCwowl9-V*hwCV4>!3(m3dZZ= zBMe{PjJx|C{|9k}tGx`SSbN2$N=IS08hB?3Ea@r?_0gN&y$K8>Day|7u2(hD?WX$v zZ8IGwY4t6y_&x_}Q^N#EZjfE=v>Z{?eetTTR3M|1K*MvmvaGa|q0)s$GG@NnZlFFt9nEaGpo5Tqri0kd{G*+jT25geuGx%s zGQz@lJ997%Mc639WjL)g>N`_y)*_Sd(e8y=QZGU?M$B}Yd5lD z;x|Zsuh0kg8*5!muOQL(oKRH)IfF0^Yxh;A8PX?$*-TOW3f+$Pd zdRDfQk|iT7n5TV#sDtoI%Ojk36+1_YXaW{7jITeSzU|p&(T0<)|!?K1}HA7&tkh6=dHW z-MLxRq}=s#LZ+=7waH#APb!Nb>ekw~3sLOYk$6J=jA7I|rhH78^^Pqc+o5xz1YpppG#FjNnyp(Pqdn~4&Q0g|IVVX|k7KIT%Qx8_(hlt+t%k%Q%wG#b~hgbQw#F^N&TG~I}+{xpg!;HM{JMCF<$p=d)Hxt zcvw~5gXJ)j&BPSw@ryzysJ;0u=tvYhlFBn&8%@5p-%*Fse9NIPfyb<5sw{)!!0Rfp#u&3kc7R^{t65PGV|O$y2+ZXSIr+D#qk#`WpnxUUPp z3YR%j*_DW-tZ9Xg^m{VL1tMNc)Xw@)U{D`HP-8ESGl?EGHAxb}xIe5h_LAGs*aCMx zsAv69;5doMww9WLv9l`QBclEIU0w5?;kx7Jd7v@Ygq+?p5@kAEzBR7#m$KVW6zTJj z=``O~#epZb6=pC9S63j97;!Ge`KLk25&`RU^Hprcnebx7#Yv3`UZt7BlJc0Z?OR+` z&mxNHGmQ_pQe3D~GowBhx`!S0;l*wN#fV&>_?*Y(!(3=6;pY=-OAN(C?ymE1WlHHZ zZ*HY#xbm%`nmIKuqi48&mX#N<00b0mI{;ZHTvhI{n2ONTjTh^IDc+}I`PL-4)=(2& zKlVGD1wIFgDR=oW5=zaOPXL5m%M**`28E}&qCchw94pNE?rfIKP4Ezo3(r3o} zk05_?Rb6)uew}Gt{#TIl`iC7w5q}05mi#+NKIGp)cG&;_1<9vq+cgE+p-vv1^@>E zwme-Vha%8>#;O-CG=OZ%Dj2pU^evtMc-OHB9Zn1(5fBdf0j8B)E{UAAl$KAt>e@Uk z9%|eSfsw7ljwc&FyEU~b0#5~?iOT8-inTn4YJa5L3N>YIFcBhi;Th2%uZ4G0fd0Kq z!VCv;%|M4kZoz`l+JB>YidVtwg`NLKV|BcNn;7KOUL0HQM=otC|AgOae^&1axegb5 zCPDFQ|HhPk>(_i^+6VL=WDI(Yc8GZBZe$F0@^%RPw-NY1V6S0W>9}`(vKa+0aZPvG?$&C?i(b!c+8cOMTW4IrNZ6+-YoE8Yc-*iGgkqH+EbuX=${6SKF0bS5_> z2X8YxAz5UxScj1h5sg%ikfuMhLtGN{A}g?Fz+X~WHN74CkGN>@-{J^D&Lqxlheu2| z`G3`tvGx{$fG`M zN@~+rAmpXi+!>Tdm^U74w?`?q5#5PL#w5I%(jo|)yyJ3k@{SSUhXd_eVg8vs`y7M6 zl2_Yd*ZE~)F_G;rg-CtKyGO)ZV??wQ-Ox5B>a@9Ko^%M_WyDxenhfx;n+c=r;^b0} z8gl)r$G(06_|X86#(T)xH+>!j#ywWVN<}5jNGKt<{XyX)y~7H^4z)9%QRjTF2>>v7 zY@IewFQ(C}xb^ZBMMI+b^lK?R>Q+4FR8?_{W_wphessRxL^Z`wFi%DOMh$2n^~lkRS^U31;jURU_0 z2B480uYn#1a5!eoI?O192&n9VlNWN2h=ObagenO7l5^IYFka)ln$6aQM~L0r^TZ^I zu!yTPua0%e39*WGd6bVCe!s=m6_0;sXELR5#LUrklaW%+DXN(SMT-B6{Q6HSym>VM zGB^p)<5Ou zZqNzw+k@UuJkz%+Yo6?007GH)9!|t=dR$yV~F3G7qat zTNfyPC1>{$Ary<~O-io$V2Yv|rP*zWQj;TJFAe-Bp4~IqS-sCN{rzz*#FD1jVT70# zL4nd}z!EBmEcK(G59JP0GbC+5H|BiJjhYE*`6pTKNn0dxpcN>Np(#@(&40Nl?RAf^JWz}^ODpe?=dvCk31u4k~y7R z#UJ+Ig>mmOimz5ju$KsOIdVGJ0i#I^MEfNYIc1?DSHz_?_$p=SbBh|kINcsp-KZv% zIH@*lvL-xgR>KZ=Y+$=CB$w^3C6`M#-_Zvl0ZCZznw)XcSv)tMa!Z29dJD4!9qEXm zHO^)h9u?Crymy{7&N!Pk!?K~Tub~+3@(44KfW=Cpqa@h)I?*mx%E8$7W{-kbG^#%0u~(fAHhL6Ww4@u3hwzW`0Tgf zYN8`IclLX&BfCx?SWyi!ZN|G~vJtxqvJr*9fIWL^l7nOa1+4Pb)jS4&Vh{rN>FOG& zUfjOUCyM)|zXS^Nxi6nT?|&#uVW*LzJ_-a+^UWYJm6O`X3YghU01egb$C^< z+6VX%?d!hwWq_n~b3uIL&>I}j&>Rx5TBm2KD2NO!O%a?Dv-Wk99@aD8uuD|9qgEG& zyPvpM8fTJUW`oaX-4>sQih^LFd`moun=iM?-ZVf zo$<*a$TF^qO{_#p(-4V38NF0L|Msd0eQK;coWx=M9(?iq`D*cjekF?gyX8G&lP+OZ_&6>x08VdL-+Z1U;->3 znutQerf1G(>)AaA%n)LX2WE_5r(olv;*GtQ5-p!mgZS@v{n9Z`6nyKr{|(@z{2Smf z;tv4FTaTa}m?03t&~Z0u%;JWpKxL+qW4mQ=6qJ=fb_7w#X6yOQ0Xi|@eOgDrPV1;f zz|KG)0g@xJF9vkaxk!)G)_Ub%3iN}g`$=4&0yaI7ZHL0JtpxCS5qg|UM%+R_e#u0X*4HmLJuCRt%R*l?XH73Pt zyJ&qef#3@w3e!S72WKf1JT?JdcQ1?#HEA&?`Xv;j$ti%EMn<8sKw(^uFOnUk4)4US z$&#Y(;PAfHpgJ|0+r(tsOh6YpI(~vSGL+T1=Gdiv$&=Kx^Q;PsG11CmV6a$73+@!~ zzH%H!iw3-2CXeK+G^$1*WLX#+C1hi()6Zi?3o945yXFE%o7JJaE> znh!>D*~z$ql9xJf+Qqr*ILx(Djvi9d0u1OF$K2c}Q3Onjj2b^s_|%raqt+^BXT0p_ zMqNx)X~wnM*GUumg~fP8$Jj7FX*OkHyAIz1!-nYvbAb-Fe*Wh{S z;o(63(n~f?)HLRR^BJ+6h@fQ3ImCmNChi-0+&ABMdO?UV*a$Qj3USS)Rz8p=Q~?fR zJsFP$CUn3GH;K@M>U8T;2tb*fN*=ySUMNol3@!o#h6Z^lxqr7UMiA_cHddv<9E}D7 z6X0ZG0MMjVs`CAi85MWaZykZ*3Yvjy15^P}p@<^zr>r||a4(Gm<)LWM*(uVLim8a> zmu^0E@?uSD+DpLtn#HKyGfQIYLtI-(|oC_rmYnU5^8}GJdFn6dInsy4`d{;G(i2L3> zrz8)`_lRFS)JQB8uNnImm0@wRKcnubcpQ)R-zt#N|5Op$eMzEJp{iAF<5m^4ugs5X zkk;}U4fn-uQRtjP;)wz0&0+}3X!`fr1>s!^*7A%vDT`AKgt#O{hiyiz9kLz}oSj5! z#`Z3h^b~D%7e&}v!QSkM&nyhb#4c_2vXA<~W$DLgGMeB6?QgFT9XQ{*A-1C>^2Dw! zhYt)7Gbj*=FnCI_iAwG9ZO}=^!PC=}gW8O)ugWW@Z3u>)2abX?aRV|zUSOECBx1w4 z(A%9}qeU7e@H47(p-MeIM>Ni+4+SDUhFU2$ed#ft4Lbc@!M(W%UgxP2dFVrqE>$5L z__uM(KFYm$&4PFdX!J-AJ6ATMsYT>UT`-W^UqHCOf%N|kWd9pz)_=SMD4X|UHIG0a zwN_>kDP)Hq_XmPd1$b_8VztAj2fz2DRHIu$Op`%6%ZdxZL7<=gjFWVO)D(tuD5|6< zTKGpCI5L5pBn=(~Y(54A(Kv*jI_*@@wxT44Q^Bja@e(64!(3_sfRML^VzPNkg}Kd| zrNUr8%#sI+KO-EiKGk|2)F)XP8`h!7r^^sp_}z>D zi>FuTqhH%v70=P_2FfeX-JU}ma8amwK4-)K^3-?-K)bPed=q)Sv+dPj)cLwMwR@8B zdVl)*@N(nPiF_*-loREyLmegHu|JDwVm0cI-zKrV= z>uc|0-lh43MCE-M1~R_OT4Up|?B(3Bm4SsH{?(`#t1mm}?^vgX1Zy0e_%;dR8zaV8 zJsl_jm%g;RXMV{?>2~`-t)rDL0570sVP4Co>bdpB*_u%oPHI^oTJ>hy-G=va%lbTB zAvZPb6!_G>Zii2nlPLJ!`-w&R$Fu+I!kS^dkgx-3?{3M!$|W$Bl%IIzrCyjskW_$7 z=+*5>aJ}*t1ghC!c1N$6s~LHwuIj49k`x`E2hI68TedA8TY=^%eK-V2TlEduh`k|Ux0Pb zH+{dBdv8xU)*K(G7E~hwwY4@n@E#m)zk2GBIGCSXcPY#_o8PHdOjY1;O)iSQp4YUv zj^hCy6<=748a(28(@5!24!7EFM<{Q$TJfpznM9u(z3%FLpK6tr+Pg$`l+j)uhm4ym zCU|sLH#U?@N`lE!SS!f1Vq?dyA0M~wd#`5>o$g<=Q;z&kQ(_l(UWv%|Udsl;CRV)t zeRJjEg-=NfL`hR>e&%Ny)EgD{J-Iwo>|fD>qUt1x02N2fB|52dbJoOS zPOW$mb{>~dbMJue!DO8|Yu%yXrh`pz69Kr1^X6LAM~C>O^L|Sfg}bZzW@>Et+FrIU zGy5hDWQ?~muz$RL{gY)EmbdsY{r>F6Y06_pGAQGvcEdsKM&E4A3BgX9wMIE|%|;s# zZOR8!)LmcOXsH;|^C?Jpt{UuRor(cB`bXd=1^4Zc4k4?5g1)1Qj zP91FJ2=m&j-b?3l7Gld?>nTTj%MIRI0ve_%$LnMB(n6wnn8epRrw-$4k1;`!L>5?| ziQ_`3VCC8(Bps?neb`D&yLza391ne)HWd(cs8*r)Dlr`(C+>8i=EIu2H+A-|&B+{N3R1DF3?(0`3-A$1nNIP<#s04v@rf)-4cd!69HU?tf_gOVTpb zAu}cbY=#Inv;E7g8{mMv$tK%5|_A7TD}}XlS<1 z6><+~HA< z0R13hcAtvasfvlMqEb-+N|fz}$?N{pN!adg)@bi7b`+7EsOK1P-JQ?<;Y6U#_jTX) z`=RX(ch%4iFLH^;7&`vTo##Emv9r(5=hduET%jz``r}WQYWQZ5`RD9vQk3mBQMa8V zRMM!~jip^9C1E!6jfrcb=8EUoNb|~x)>wpCkKo4`cT~mad+x>n04GNy0Bf z)!R<^GADg8)1Iy^+I*k++qyhL%|xr_#|&>aulq(~$CNYdzx%EK2$-DlNJ`~CalGEM z&jCu^&zw%B3bw6EoKTIfE>vx#`mKDuQyyrk`Z@9)pzi{HeqBi?o%CNxk1;!m^*T8x z`~JN7#8fT%xda}DY+3LZ?&&FhnBulK-x|RT|C{|NbCH}Z93^v+>@0JiqghEL6Zi6- zUmsx_s9^S<9;_gSm2==-f_xV#;(X4{2|_H$Spyr5(X4auzB_Oi8b-&tKf+j-0OE=R zOSDmym8pb;DLjqjtgXn8mQj~9PtZ9xg~~r&%2H*%^9yUR63KL_brs?j`8-4X%aeEp zYOV&ZyauxrxDhD8K~}nIYg<81svYcEiP^u?8N7Ik5#AyGP=m1T_dQx0;q~kLODWiX zglr8e&wR|D#7-(tJCUHd&`;u9QZgS2zDaoLq3)K+&?!Hn?MB?I%zq`Ym423lsveN! zK*J48Q;#VdE4c|nQ6IloNr)~-YL|36(-NH)QS8w;=L*A7ysj$-^|{SmD!FeTi;C>$ zW;{Lb2xNH~EBAEnBnrLM4Wqg_FZtd-J;h3kWb6Vj^`2*TM(dv%MU8lf70OwjT9;0F zS&5k)&;d8ITxl_y=bg$!o||nzpZnI;Y}5E6r#?xCl!Q7V8izbmnY5}O`xE^8T1!>g zQiUuRXC4oySFdSn&lnc!ZGpRvEg5syHBF;haVY!;AQ&N zJYH1p>_g%VsN&ADopdmFLr}-yR1&r%b{^*w9#nY56c-O^y+&{v!Q6(Tm_tx?9gC?^ zXNSM`d><_8{;_rb4Uy%>rTR*)aqy7P3`nJ+?{tRvvczNb<$XsXXeTARGs%Tu(yZ%p za>2vPhY7fe=J}=<5$9;O&P!h?$20oe!2oTrK`-PPbhN@;E0^Ji;2CD1v(1)pjC zS7vGsUlH=&@N~0@5u}kw-GSEVwop~t`}xX55?D+hlFlE|mXv$WT75RY4j`a-@#PmR zK%Ginh>Cs|xTI7V``A1_;6G#s}hQN}YcP&{^>xm>21z9cSufKoNoMZK9*Z6K6k;9)``Ru>raaHofAYa z>@%)CwIR90@9NMY^8W~X3*b1mrAb)K%*@Qp7Bh^PWid0_B8!=snVFfHWieUIEQ@XN zj_-Z%?YrNO2G5PecYF3JAkF98Ms~|qK(52vl@}V2 z)yL@-Y#O8AucAJ1XY8tmj1VEL={&8|E5JWXJh|=G;O4k@uZlnYeZ6Yfo6?x%>|7u& zbJCw-Ms;;_*ikzC?4mRFaQzirp7Js|q54Qoyl9ung-|F5sjb8IqG{QT(&jjSQaok4 zq|=rst!de!fBo*R!Pt2#n~A0Jm%Ure!B}kSb}BsKw5!F^#wUHF4UC#o<Wm+y zM4WaZEB9sVI%*(vDR8AK1dS92A#zGrhI zrCmC)F}mk-9`pCsZyIQjysoE*XpJ3B6KTKTt(l_`J1iJ z4EUCs#+et(p(nP5Yu`<7>Nb-ix0p{)(O~y(RS5%>6%4MhiNChHaqv36JN@uKW$&^7 zGTtKe-BvYO6Df4f(dD6d-*&9yR%MjXy(<;aAg1q8eje>kJSpd{>Z9BKm@TcwJx%%8 z@|h5_UaaZTlcE;+vmV&D+9ypIXAdRd=HoxBIm3 z4{0xy5n_YQ@NtC+R&+ur8#jCXyF!nlY#n{Rm(jP%d4t|gN;c2k{F_;mN&^?CcV6v8 zPhRc%4`7MBlg}ta87pjpNAE0TjbS8wk`E_1@r5Rf$gUh2`@)VJZ_iG@#z!}Qj<(?^ z{t`t&-}jV{8fRsNqRNmXCxr=<`9wl>;Fop}juK*Kh9W-FM1-sAY%2fakKmO^P)B(6 zv={f35uFmcAVXG~dDHN-3<}$`;ftP`T0L?%u2z*ZTasqH(Ua7$*l=t_?Kap&Yi2|3 zjpDJXCTs|MZnR2SI1MFX?J9mM9LUsrTNdR7YBDor`#sVy(5GFnfWO4oc2J-JU4 zZmxfnp2jy>ewIlsDMgmJobckvq^hsjmIM>AetvZc4LMk#h046#ch+^sK8pj?k4)p5 zZe)4yWs-{sQt7JM1g#uaSRG}RC|4&h@!|eBL>9k%Et&sL`_0toqUWcX&(wOkZ&|As z-Kh3sjz!60-80w@{BO4mEWg*0k+*=!ryT{boT(U%mOcW48(+H~DBwynbjcv~J0VtT z+F)?_+7Ea)2JOTI*x{QW$fIOMi=MsaPDqHow#?PuI(A=QAb>w6L>iM%7~tTIGSshU;CA_EoHQ@7v?jr8|)wnUBwLgv3ZkYucU{G^CwQMx)7n>qaO(tF|8l zBqziWnA?ZzYcl;czl^S8QZ(P_pUAR72*cI^O$vEit$%N z+~y!JaDU*@}Uhqqh>OnySG_Kt2!FUMQ%{kDR?{{PtlI3n+Iziv2lwsB)2gZq2!!?$s- z!6|3EI*_g8BFh$VuP7AwUMUFVJnN4$X)}<~H^RHLApe58LgY1VR+g*huZz+d=mv#a zA0gSu)W199iR!9LtE&W##1?QQRIa8KD>r*4N_n$1f0;B`El0`xwr@@C&y8&tXzc25 z&v7W_K$H2k#MzNdv^VHGto+{Q{`=OW(?hN$+lwo7XCt63^$zSugB441>r4(mVr*t> z?8@m?Wi_SeipVB?{&F*leF&+&qzUba|2KtI>M!mfFuEY5m!3DKRe;(;c}+wE1~2XX z@uFes9MbX%Gio9>qd{t$d20F{#@udneQk98bng^PLf$<5?`#U)CjM!4GyVZHg|@=^)3eL_40{}Nu;8X7@NZ+;1k7TNb7P@t45!$ zATDiJGgTMoQ_%{aiVk-cN2cdoaI1N7YY4C534!IhE;x%0R7gduM!KTFd9^YHdT47( zch!yB_TIuwocLaYDzeAKZZ+p=HRg57Of{TCHLQbzU}$R$!Y1M|NU6T-ZngGlwGk2y zAM}sMWss;8|NOIR^%AKWPaBN(x!r0rW*Y&Q_TTsH6wDnLi()_A+-(#*ZGd~HREGz2 zZ3c7`6=iD3cijhRr^~TFyW41Z+N6PpeD`nZ<^(A;Gc5D8NnYD(+`^Nn`08%6Hi@S= z#B@W}fNQm7R!Y<`HmGZJ-`Om%b(`)0q_|r>ZlSdjFVww@aJd-C)Wu2P%{c`sb}YQU zh37ZN#-i5UJaO=#?GR1o@~Nx&!YukY89Ub}#I!m!+fzCM*`Zp-q1vz2o6G=6(cR`2 zcHgZi(1B-H;GqECVOrJ!(WP&ecebS!%CHFmf!5*j=lYUKa_SeJ+N&%x^u#`1F~0Yd zg&Sf#X0_wlg;xi>j8HkN9J%&r?(;V$JFj1LI&T?BTQ4uE!@gYW#OAOl^CPLSpR+DC zA}_{ITp2!nBWZ8^kYdE15|La54M^XKJpVMN)fHy&np!Q$>igWORw9yP z3|dDBg5O8AJy4wNopS~_bxT^xCb_g=7IUK(tKhHia`+4dk&3ifI>G22_hk3$;gXg` zh3+9!)kwV3b`=0h0Q1fWFv3t8LS zx&*L*z$}Wo;2pAP_;pS9fe70Rjk$%w(8)!Zi$P#eN}!UB>4zi~gd|~@J)L$Sz%UWf zL}cjxMj@;Fj9yn-@!2Y@FRS5;4&=y}3MMk~**y%&CH*PGAQ%)f5W+eq##6O0kiJ<2 z1l9+R2r+I`Y}aw(OF-CvheQGWcgXWq3t&jMi@!qhJ%%jSTl_0z78DAZa9AIbLSK%` zL@_Cti#4qcCeAwTLo|v=q-q+oxZw=O2!g#46uG$J4S68aYG;Zooj8c0B~(bB=b4l; z4^VAIsr{AZS5XMzJgkfbn$UW%1G^9y5a$<>8h-Jen-G|W=TD*#BSA2~BfBT39OIYG zj#{N(&>D4%Jjzl0+d%t=0~bIzBWJA<3+EFcPRHuMT#ObD+r*qGDWB)j zt^+XuCEl2HgDV^cLJG#u0eXd7=rvsNxpBe<6()VQ-PQ^d=V^s22!@X>nAZkXi#?b% zP&cg~236~IED!v#hB6xt6$B^4pR_E8Z;s(RwP|n01n_M5@1a@JfdFZLAXy)+ z5EO-=3W3?XS^OnCdx-rCaf8b=-!b)yWo2OeC6a>~lMIEMq|MzC?|<@<6@xIQa%Ixh zfs}l2MkEc0kvHl=@&BZX!`>E*8-?OO9E-qb_)}-T90k-b9~Z~?%!)u#pQr85fcgBN z2Mj<+_Ivc!>EZDfSoclacm-w!Jo+wQJ5H|1{OKW}86T{IbbQ515g(rvxK#qbz=>&cb`Vac$_M;NN(<8l%4iBcz ztWWC>gx;mBdo?OL^Ko=FarCrtbazQlga*sOl-=!I8~F1P|1?M^$HzotQBN9;x_FIR zq#bJ|3tzxbR%2{WZGR$p8`V2%7>&a0mtUpRITaI)F3ujWJ{ro^f82LHnyG#5ujHPu zB!+J6?<#UGhU(QH&zjPxHB~aM)NG(W+?>=2@%(aYpR>#=$*w8+v;*> zL#T<3LyYfVa2Qz_-MEZ;Qm(a^`@NVUIiErNc{v?yWOQ9w37Q+M}PES@#%~E z+lc#{KYy;G?3r9!GJeuxNv$csd{UE*rhb=xE%El*jB(&RbY(kig;|Ia&%jhi%RIxt zGAiF;fdocU^O#0%ThFZosy27<{BL0^+dV5kfmbk{_H~2Q?nCAZkm&-^<51Uol^jy- zHcqWCo}#%(IK!p7y^>01PXcc`qrrIIP)Mz*;>3AsGfXY9zAw3c?`x8!cf6HRx|L5p zYe)|!9p15=)!@0qz<;82tPqdvQe-4CxUUsnKTn@axWA3EiHhof6rZ7V`6PC|-l`v&CD?}+bSAA z;O!>w{swd{Ewej4^ZI%H*K>8PhuuJnk*~5@WcPc*e7BjtkOZiK``g;2CERa7V1Juw z;4M8jO}T=>c$V5XB+NjzLq4^OaZJ#ZrvHncGo(X!{r-RIaqz{JBX2=GKc~<+dAKvX zDU{wyec0PQfaiT0Y(S({)U^Jp^8L$>$Uq>)14;Xhmzbco91Z9IJV=FhwK8}$YS=M} z_sjmWH?3b%VCSJ`7P+(>b{5tKCOWpvvNWh>G?Nb@h#H}>r_lF=E#J}?{;Z-8y5;kW z^hJ2Rl3pu?7MAz+<;lhVJWw3VCjDKPw`LxVWcj9VIUpD`dBO^W=oOBqN*ZlJdMVuq z&bS9`V`gu9yTdq!v9hqDEREPDC{rY9YwfRYAS&5$j`uMf;_NO%lwsx%AmHgCmQWZt zlo?JvI+EHXSOwaTY+>do(h=TWAo zP*X`VmcS8A@d|L243jKJG!54Bt7;ME7`$-B+5ccXw+}?J_7Pz=1Y4Rj%adk^a5TC+ zor4tdk?x)lT7{V(g~_2zpMgTLAG7eVhEFWw3&0{%HfYJFo#na#^ z1Hp^O^uhi!r=^J8GDPzs;4=)3RGjNW>bVI+t1KMxwgNG|)+&_MFbrsxaBzaQdE9o?VvbHvK zD|MOQg-0xteXEgbG^wf|foGf76%4OX*cFV2({46Qnb(zd8F(9T%LT@vq%To2xH*#& zO+mx#H;ZuiP)I|-`jl@&f4KBZ`YfrnBTP2uRz*z-^pH`{67P`FwC+12JrU^Pp)GL| zcG4dew{&cTf2;5S4Kmla4I7kEdwsusRr;dxFCD6R$3PwLF8|i?KEBbwM)v<8;Z~rX z1|h{rOZ73lvDD@KeCf`<>Fjzb#~Z>_y4JSHY@*6@Z` ztb2?QT0i-Ke5sCmW5~3g&6u+0m5pk$vulUw?ESv^6T@I??TvH09>67iq@G~OmxCwZ z0BUUwFnaUY!L5-Ev{g3k8$vO$!#n+=@`2AbVjeR>fbEp*L*PCe%SHzWDvXl=#agCnw@hP4NrT=`3%ow0NF{)0 zg|!GNkfB{N9XgCN3x*NXW(aLUSA@QkX*moLcL*mMXOL{3{JJ%b(VCQrKh*PKDYjhZZr zaYZT;-wc`&KJYNHOpjpZdW4c(&Q&kV9$A_>Et1&fh zLoVKygSrJPJ|RCfOSya=9;jfd=K98Pzu`Tqk(}fTt6kV39!>gmk+9}2;r(hJQtecj zAc*wqAOm6EH!IO*Bd2xt9h|mKxF#b{ic4A>9ixfG3m2A=;7_vGq=v!Es>Vhwh6v2S z;>0MuRPN*Y3P?nfnqeZ!dUMdFjiH20DU^+3{HgF{&@J{!ke;a15XF`E$;(xT&mv4c zDx{U;5!6_{a1{t^-3g-PoQe6CBJLWm#x!FLpgWr}L##;aN5)lGOEbxfkW?A=zzJ#O z{RPqJPY0X{+$yxPqdzHP(l*ow(wQ?C((+*c$<%r;)R_ZRAobLyWRi%*NEY1BXngK&NrC6HOpxU@dq`#>^c^Ik79_-{oxEl zE+vWRSPDfeC*;e#wNT>Qp8yqSkz6gc9V6Q@5_{BbiVs4U207pB4`s! z0yq}X&X>}R*3MDN2at0I#1;;SrDq2s(Vw_igZGNom34*fvFs_7HTu#EB8{+S@uW94 z42rJXg0WFBxJPVi-uGzzO21uCA%EOBgK84Wjk#$cPRfE^pRj85Acc?j=`9GR9(86;trwVGX`dRjv3WB59 z@x{M=mtLca%1(Q$hYG@n;eHmNgW(nxKCl0YxC^xtUyDH~UYNi=WtVJ!F)k!ax8<1V z0#f32 zpJ#|ACku*X*R>!bG9E1keVCOWXXuRi zk5f!y4s9kt`qKVE3oh50;VX2xv$YS+}ONe+s#4krQQoI26viFilL!@KSl-()D=2rY8>vP`OAl;6rCXD6#-* zn(WF0;RCC&r5kUMK(oG^ogjXlBHaa{jdS!w%5lU3KGJ&znjy~dqTE3y6FxLGYEq8p z)jO928*uk`Sh8|4?Rbp8!t$l>m;X#=p!4x(l}=K@wESG*Tp|3z7OVo9ky;r^XDi%< zK$i*9IR&4tJ^_ky&z!I-P3`1Vf&_BpTanni#HZ=2JaY53iV~vj~ z31SF%Fv=ZD(ibjixHcDfZ%=rq1*p7Dn~_A|RXjuU5OJr)W`j0V=*`4k>kqlX-U{hC z+ceGeJceZoA(aa^52@2j6&S3VBQy5n)91QtWIVC?G_>5vv>Xu{*_R>8t6kVrP>$^s zwfX4N>O-cq;O6F+Y1fBbD?s>m2Mhyli@gj^X{8}e)$Oj&!ni8Y^ApHyW1oDF$00uX zQ3u`=mp0nvAt9^b$5?lpBb2WFFi#cr+r5uDi6ftN^pU!MZXhE=3gaQ!^9vJeB}2-` zAE7K?MRft;7n|xAwpK4&&(3WO<0Cnn{hSKtg5?y7MWyDuhxGg_C1(I59$JniVilYw z_zTR;hzP-L=Vq87$V!-C8f)+3K5~rk>#oWW?hW)1F^X>4v}ZtxuozneQ%ZwG{s!MePHX%!t^J2v9cXEo5XrkCpCqa;NbxMODEy$~2$SBB zb0_fs8dP5v6QA-?Vgdi(Vq83ae?Ix=-Lu8N#c)CsEeG_>=l2{2(P5>SrNv1bX&gQpo*(55oNI znDA?UsY-9S%idmS_xq6BOOG?78=l`#ATI&8L`w zfNiTjPgc$Aje$s~Yrw~pAMy;k$MJ3gvPczE4lFfeTye2F{oJ!M%>oB~gSA@>-s@)& zOU#qoC=&?gMq+FYg z-PaOI*jY9r!-0Zg;QUa5w?^D$d309J6AloBEcI6h9V|1b>tnITk<{+}eXp`rHzFk1 z8~4?XaffD5xn)TCac`W(P_rte5f>SE^$Q?*6Kk#oB|^O;R=l z#Fg{R#vxZ7NNBqpIBe=#j=!2~1|gty&3^%SNpY2W2;v|Lv@BehhN1)5v&?y>zpaLU z8@(ZDHI?vN*kCU8IBV}YzX=2dxO~k%0>YI3fhqkP<};x5NoA7o&*yZrj;v513Ta)o z+Shi2fY7)A7ve9*%(tOPodflgKf-r8zOGsky{L|6-~FG#J^@O3&*uiLLKbX;7p7E| zu>VD8Eqrs8FlP0qw?|br4!|We`$+jhVU*p6rO)cBW?=&gYlq{j70E8gI(u9Mz(pqi z4!<-#Z;bbk6hz;JDP>5c{{Ut8TkgfmX+ZEyzd2`Y?ha)_y&3{VelBfCWB{Vg3lCVe zSdd_5A0?b+aRb;z%m6&ojv1M586L8!eL!LerR~i8H?9}a&}Q^tSw}v+)A8ps&=*=z z=m?G(o#z~_{*XM=pYf!5rXLZC$`-t}poO{#PHg4hgtPSPX8`E(OpWOdHE@c;A^-ySTEt%&WHQ_rosX*H#rtsl+^dX(!`$ z)-i$03!od+S$(@FUikT)h<_Q506@Ap%Pjd==Qn^M5K!z5H80Ispx$s8WNPO=SvX9s zEz&$;hrq?1T@lM5=T3`MZ6sy^wXM0mI|Gedn9gn`e@O_}#o9#JH@z4=oFQuU`r~m| z2%vxXB92VK5$qx(3<^UWrpXz(QAP;ob==%Ioh8b|{YE zU`|K9U(fz^^(P{`4XFrkdlr{EFD-(VQ8zEKy)v&AxQi0tfMjLjaUM$8m7aQzCJo{O zLYyJQEYKNkr12)|&4cDVJ})aRKPzbwhd~uUBa0}?ORHy@<*Y)(9!HL-Z|{++41i1i zaIWqQUN%cYkAI{D9***}?&W!LhZDmH1;551fCf9Tu?^1%G?@Zj(4HLYxxejStl0hlKuP#UaH#IrmPvfMu*R8!~W?|Bxn| zfQ^<^Qc;OHg@~2^xcMUptd# zVS+fpt|Z2Z(4eF9=<)oyzk>Hxxz|$hAw}=J&gyUk48&nQKHcqNaRzX)Kt~HBIak{< z+kuF;O0wk6KpU}UO7RXhh>*kV8R9e)6D*VOUc#|&)zFkzYL{dwC9MQGtF+DX92P0* zkW1mcZrm~@&ygEkvaLLq0n-e^U|{CqU5zh`ZwA9*P%zg9RQuXsF** z0DCl#WL%o#z2U&KM2mM^hhH2AmYc2^oSZ3-%W00Z$4VYCBqLq3SO$cxe2JXnk^a2)E+Ulj%vY6~E&fg#=fMZjaH z@gRu|R^VR*s1BicF>%M8II_LKBoyT-N`o!N;ukXK#Yjp?N@XQQ0B%7K`;ICJGNH}+ zS|R``BfSK1zbEPGgoO^ZPHkt|cnj=S%!-eEs5&>kZSsrXD*^-p*GDH}s{%yz_!XG}#K!m>xDM1| zD(<1Dwbvf1@q82DpWx6%s<0j^V0)_z&<-#R_3NQ*<| z7Te3Gx@1{Hzy+=tJW zI`jHhIdoC#+KSmUzQTQ22$P&Pj*6#%4nEwX4;~9x2_KbBapiUJ@>%ikMS#=dB$@0! ze0b~t?#EzmS?bxkY+k6uCjn!NIjFB3ZRpizv44IkEWnQVTA$oAKTYyig`|;rt&fyb z5Dhf4YO*KEEFNPmwT}#lA@LY2A#2f5mn|V#XowcoPE5cs9|vekkpO&J`MMUBnOpUce6@pU`QZSK+`ha6|EcVsgpiU!f0t6n~mM@ zdo!j#@9!r=JQcUmK3L7=V^TEmmuQ*S?9e_CKp4dR(5v^C0G2_(u(VTWXeP;MZ*l!4 zfM;{$1!82?Vbm@d&W2ShSOfgVhl zvCwiEhQcbpiHFfL{k)gY5LqNG0D-05hQiRm%%H+I9(c*Xc0E`}kxB3$LPh*p?y8TS zNDfSDdVyTrSe z{taZ0g$sSR7NyYsZ&GXwx3|8D*{>h}qi`gbvbXqapH;KQ zrt=RTjGpaM!?s;>*cK=GecDrsx-A7NTi`hnQ?E2*(^S2O>^OPsepPw^C~RYQ({k5*EQiYbeO)hx@JL{c>NB z(~!|R9n=$r>hRFJty!ZuF`TxwFT6bt4kEy&oVWgWIX61s-lck^_#i?{M@jP12n|w% z?P6o>scxC4%ij3XnD`>@VUG8?uL+-wX1BCmH98n(|yEWba$z z2CT=s^eI15zW6gNtqv^@#1RTuuPUz!&Cf66=|~|aZG-ZKe3F}jb!-*;wx{ijHukNBJ?qvUh9LA z=pD>RN0tT#AcUQ#Kjj8+VyCcHXsFqg{}c~Se5&lH8eNH`Z(w`BmXJMH58UC(nJyu$ zC-_0$&jA=Xph$oicXfh;We(K#_JRwqNjP1)#bAq0xHvO~;^yAH9hAw;wdig`OrQ`9 zHjO;6&T#8K|#Gx2Y%TnoUB`u;&M4N#^G|lwZ4pwlVMEjGqq#?mNNb z0B|N9^**6A-A3Rw2f4YJ(-&}eZv(_~llH9Jd>_=w6oo&^&8l@=Ys0Ni_tgh@t{BSe zkdwUH%Of{*VK*G5lo%^!_&4u?yM6_mrF+d0h@}TNC9#Ko+gyb~53S;hjeGw_#@!bB z;%dS7wJI1>xx&o59`;yFl3N#_k3G@=v!`-esy>{L!Md(&I0IRw!&teK|Gr^tGUmQS zpX<`BK6SYJVt$gzOMA~OJkieSm9yr;B1_EI^|skm{wn{ua?}^aZE{25mx5if!T2T= z*QNOu8sy}cZE|8W`V%4$_SNER|VvT6IdW05+mP!&0i=aWu z{Dx~4x#C&tQ<>9u!h_iKd+xPd*#`aR_R15TLsbx93#u02-=7Ykf3=|cYG$nZUl)Az zY`^s&3j)ZjSI@vfg6h6$6su?g8xCP-l1K}(BLO9AGjKE1^z$!vZ7!V7dn(dX(()}| zylJK#nfyQd?b)C-_VO+kO^JVoZkmkH!0^LFV`W^xC0(u;=~qBLBZ-DZ50M#{vo**Z zqW~Y3JdPWcM?ko$MKFhtYJ5g*A0(8$2`F$PE7P~ata+`WA)1fAX{F(bksV;4XavPy z_P7#}LS>wun2T-MC}2E+K2`=(?ixLDn1M0#O}~97Hch&h<_QrXYP4%oaq41N9y>|G z)$Rshb)Rr@SOv{<88P@MSw>H;-vm26`AH#UxAmdBIUyoK7n5SyydSUI-9rA;u@~Mv z7ZYF?x)(SQ5VU_gW)AF-s%B(t`&Zw{&6IxoA1nkTKfguLq-M$5CN^WB(v5^PO(NlY zfuIxAVXens3b)U{eCM}~Wx1@A>Abg#^Sq>=q5utm!F3gr1}EkHn0Ye(xPK$mY5mI3 zKqXE`*Y>jy&yisOoVCdNfS>redosj?Hu?!gDgb>u9rbXdg;{68oTg19r9Hcn3f|kR z%5B5-GiDU*U$tiB=RR;cVDhdL&3&gA2Y#SR{-XUYsVG zG|nzx_jWP`TTDPDYxL5DooCp(+L#f8gm4m@uDSBjD9fP@{>dc{E1q<|c$tkk`%{Dp zy$e6YX_!RIaKKR}DmEH2+1~odn7x6P#`o_TT)gHb?>-|?WU|F-QLNYz!i9>C2kUtU zCY|SN{Wx+G_nusImZat!8Pyb7mdYq56@fRhnT9f{l?*2lF;N+1psQ8=-|1#scfUYh zPL(@o1}v7=fA$aNJq^^gA1Ogl&1Ea7YBja)Mn|}N>xz5Q_vdp56}S^KKTy90E8Thc zaRKAz*^O9RQ?AD?&^CBp5~1k{%bsiE;l_%eCZXY^b34w%=#hWt2v#;WuB*}IcG#z9 zmSvwae0sXOzA%VGS>w-s;XW-@>%JPWd7 z77hCWf%2)9wUeiS%1T}2yf`{+ek_~XvW~$r+g@fC$#Se0?uYTa3+qR7Td%=XZ?2%d zJVN;E%qANg`xzBfw_8opc}|nEyT{T`kS*%$WZ=vi{ZKOh>_CoeQVu zmnKTb!Q%6}TSSM%#p>m92_jmnSZtHHt}Tr+$tgt-;-yocpV4OBAlyaEU|qE^{KfoR zhCN{m(un~M?OFtlvh&ff!VgO5QL-li?_L9y>!tHhBG8vGC;7KWokJB5M3U_iq{q?A zX0O2a;bpuXuxBKSMXAeX+C7_<+RtrpwJ_KoFw$)^wS6szaHx8;$!(0Gq`l(c2b1ln zW<(gb@zHWffzS!dfD2%2Hn zn+LNKrRg(}HF>;}pHzQOm3GPDtcDiZjlU6kvIvI`fI&EuQvcB4eQlIwm69Qk#}H>I zke_`R6v}22L6Oy3I$d?gxl@0Bc$mzzvZ~17fV|ePUAa`B@1)+HZ7G(Zf5Le1shpRQ zi31zvfJ|_mjCS6XPE0OIQEc2gb;UcU%FqcZ$x&RO<37h%M_2eHwm?&-U{Sbkmtl#A zn_(`f@Nw(eXkTPSWvLhN*6odk*?cOzK!V0naA3|VC)d!VGFMx;D4q4ii7cj!8OyW) znpkBy^}J~l7Go9K7%vaCiLwSBmWa)pLZl6@e<)!wYx?duNy~2?0lL8M8-cL4am;eh zx2OH})S3QDDQ5jo&xcFm^_#w>`I_8cW>xQ+ldX&*NpEra{kEVpQ9eUy!N2<){SFM7y zCgI4eE4Pey9X{JsxR}*7$uqK$qWE)SGzs=?sISwi`)ry&Rh^n-~l4W4q z_l5iE*K5p@%Z%C4Y=}yHDV?C4p7hhf~me%JL z9Jd}fPhpyP<@Wgma@f;oTOmMj&x=i!WVNI~OR(a&&NC$@_EL3DG_WQ8Eg z+I#@c1yi{@M1CBmVCYK)skvw7+1FJejov%cPPuj4!SrHoawl|M~AS0b)_?>aZ<+-7uL*YS-+ zzYHhkt?N1X>1B+ZPOcTsSqdCPG8g#M_geo*iqZ-vV8=lMlN_ejYU^Y|D3ZsdZyrpu zX&5Rb$W!l-Qwah zb+P2-tyQ^lIF6!ptn7Z8=fUqwgHzP#q5=8r=Yw>`6lq$8Mm#I(Ml`g8G8P5MCxNUP z=O|6*EF#p7S&>og)H-Eaj=QznTiFyJ&t41UQs!Ml5qAxKEtNYe0>C#;`7s?%w<M39_WC%m5Ruk@~k zG_@oRkcKo`a1hbAYay|h@)6!t>b)6TxdV0iiyc-&EiR*7wxE{bsjUzD71<^CJQ(;@ z+eG=`sUM=+G%RTrVUMV|WyV`-_6>gg4uG|e%3T*QF3zfz<=wWA-fpzz?Za{<)qJ0X z&>hb?bvh>$T_Hw0#l5Lqr6N!HR&{(xiK||sBXAnMJi!AGIQC2u`obQ*TI7?MDSi|K zb-yYqY~99rB4niEXdUh9#VzZ|Uq8vLl}1hq8lO_gP;GdBZQE952a(Z-HHVNcB0PQT zl2$b-@j=xGbPr8RbH+WHrSX9x63fDJ&%pqs_l}JP;>5yph63$0WCf7R*_WhXVm-B; zqb!iDhPFk>{j$Zx$chS#9v8|l4o#1x8&+poZR~iLaYJ{7aoIIfO=7fN(+|t(%#pS! zm<_3+(#c~?X($kgvL%d}Ls|^l6;qq$z;aVGj}|CRu7kYkkW#O$E{3mPbI0|I_wx!Pq0rJa7Vmx8Igf9$ZK?Q{xH6N}<=J^LyLRUhO@yAwJ?~eOd$I&A@g?BJw4n9Du zgp7+LoY$o!fcV$lk?jWi?~YCS`DK z8(gNTbI{V-|Ij5kak$hC)I$x_Mf49{e|LxdkGj8F!$!~41M_nfsGV*_(k9CaGYgu0 ztw%JlHBm>>%D9=9uwwKMIq9vQ0#$Hawk^VsUoLjO$dzp(RIzhqB^AkjCyw_{TxS-m zzV^u^Ely4Jk}PMSMbB4-pZcxaO)YQ2#YM<)+gVB-s>c~o7}V29QYM3VwU|tD+#0To zEoL)2-shisNjs@k2_(tyjBJZ=h+wzsoie%t2|H~3#+d1vI?+scLLbuVIU@Rxa95>g zP~J5Z)aA=NHH6+)-oXAjpv|4~3cEnT#z5gX{}BF1@?Y)Q{~FcoxO)3Q77U56Jp;FU zs*0^3R@e>Fg2H6`{&C*fNQBlCC zRr2SDWOem&a*&Vl)$j>gLGrc-QjU`GxPIAo8m(S{VnU+0B|1!>zB$?GvY2Wim$v8j zggPA5#~;rYn(lMmj>MwdWI{_aal)ah`rIYwGX_ik6AQSj)cIAN+bP3LS@hgxewJO?M0gTrp`vv#hcax-JE6Dmm);Q7)!c&p|hyn1Um>;tJQ;+*2%@VCGgs~1N@=>+ue zyA-nD|6`RFHyavm1FXq}1GBsTtU2u6?2OHvfmNA5+1<3(ru`ldPWN`HaJ-~mb9f>L z1V>YWu*T=t! z30p|v7%p5_fx4yJVhl%eQ_K7Bzfw=AE`F)NuA!lQpKbFMw))t8kDYlzU7v?UqpK~Y z(c=3-eY5&QIz7skKbkvi;67zf>pH3Sz;3F1T9clD+-qid{tMxbsb=^NtE}oUd$29E zYGq#GD;pQw{_VV5meQt)hErE<7T0(%i+! zvPPY9zmw`xJ}bF;pQV&c`qa7eooHmfc$i$o6e&BA1FbO|{R~!ESpcsbHxKXGa*_fh zH>J#Fh$2^~qTlxS`*c4qP6AkFTHo|QnsNGC3yANKF_sZ8-Q0QhFga6;0;% z1quae+$_(&bj5Gnv2oc*hMY-}ua}b z?ghup!%$T97SY2wF904_y$`X-%a>;3bH`uComBP5(ZexB{`d&pGE&CWGq=JO$-O&j zsWm+^?ko2Lur}SZyI0-U^7`V@-PfYq(EXn^KaU&)dr2@u*=J+&{pd#T=?_QY_yUH| zXL_cf)08)yfNgEPAR8SBP74<5jFB5w6;4#r-dTaT$0 z0nB!ToxW1-Zya4tWhxe|dH;xZ`l&c;g7s;8n(wyxGxrNj4-}O__ffSI)R8jB`H66b z_or>#&YNa+i&vN$B>9?<=+D`_iGAOuURE&;+%>(o3BU0jSHyhz=z&*|M8L=2MS=!Z z(%1Xt{`tnW`F2-`?=u5?V)nbe=e})wZC##;g<%aY)?%Lk`$Y}Zd{Ky)l{7b zA_L1{7v5?gf{Tq|J}#8Cp&0uVZ}1xRNB-6a{6A-`g0W?bZb%T2AQBJ|Y~YLqY~20V zGzDCF0k2PcBP&}bYezGSOAQ-Gbaf2DPA_g+yJ-{}MhxhIPPV=xMp1e&E~_6UNnAyY zwN4>2i3;c$R7PJHQUKZU&ma$>0^T3>7;3IrPD*nDd@2&cQqU;y7&s$j);F927zW@s z8=FP2Ng`HeF_Ty^ie*MhgrEXK&HGU|A5r&D=%qn|dbgn`<0-DrGM) zxm-a`TH6P9L2SS*5he;67mal~Y};kF;TfU=IL1OaQgz|5c?mH60d@IN`=vS>IP*;mt{aJ?4`17CQIi$t`W7A11m0fAKe96q} z9Gn1p=ZwhyOBav0R?=LJRMT3;J!_el|m4#1leLS3Y+7maMRAEb#iOm zzL0#U3o}%!&_zgjSc}gZ^1R%G>wW1|nAW%~5oQ79KzvN?u4j-(Goq9}|xv zns@uyz5iyXiwhUhuamt8VN;t!g*HB1z(5e=>^p=wLh>= zG2180>ilc#IfI{x3LfTnwyLN;6%dJ^PI6eM58xo=Bjnh^11Q220xY0rf983L8@SSK zb5q?34^S~fq`koBXhWm79HRQIQ2JG+!|EdCgp=z-oMarvgelas=Nk2Z#C1J+oYlI* z=O~mG%tgBEpK^ogZJ|WJZ{kMlZw1^af?XhqzX-Q9|Lz8X$DUUuR`Fw5>swfJpD~d{ zzDA>hMs}Rg_G|VbVf8Yzy=+)@z+6M(sxizt+1bldFPcL)EdC&}x0xkr#SaX>f--@N zq;-x$)gm9nO+O*RiEO{EAbB@3(~7y~`!*4`$boTz1IIAv#IWn0V`w!6egbWL5E?zn zIFD#>Fdu7>9N%g_c$5U2a=A&K75ZIasuq1cw8-2%njra;)ooH%XUX?2ujPw?0k5jz zmV|jWFAul>HQ%?7RDV?6l{*;y{`2}NPdtK)Prtg>E?4*D;?~!4)isZoEuUBS?B?@% z^$UwnUz;9RmwJ2k`n^A|-L}40xjp;&x_-NRpHJSa{cZpE&FRDOUu7(-)_kwH|1$qv z&F{P4|EAYl)IWT*et+z*zy0?A7nK?w;GJTZ5qpEBO|?b2DoXsYS#aaT508sV4|j>Z zj9uN6Sozfv=an;s)4%yz`FjUz?cRFm*8kvC=2q2LR(vmI z@+_3oTYeTi_2Mhpz`v}CO)6tSBUa+SamTkq_5t3EOd`yn;c*UzRkO?^)&?z|I2G7J zJp~+d19dxKpaCexz!2>W91Kp)D~S)OEJ!Vm1+~u54X9M}cK88QdJi~`%nj2Gq#GEI z0gZsP@xe`dbd4Qt+`*YZB^QAj1yM9U2a3S!p5*)@@JKYe_Aj?@i@yeH&tYL;5J1sh z4-|oGPb?_F=IWaaA1xLEt(gg(8H5?oz&HaK5a5{upb@3HK)++tp4T8PWCXPQG|(y; zm|h^=z?ca%5Ud^Ib7VuXhC=UZG3#!928Os$RtA0)ldb{><-sNumsIAYf~PCd!vOt2 zNtpfy#$GEF&1lCl*q1w@=VbD!LpNK%1AXf@C z0cBbOT|fG$F+%^wa;SdvF=TWj(EHyABUaU6?Tw=wfZowX7|>LYYyh@yFS=RieMf{@ z)eXpIq4p%vO+oK!AxxRn2n`jKju*Oq^!6Y^zium17DH_v26(dqa}X#?3o;}Evxj^) Ghz9@)o~~g4 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/internal/utf_converter.h b/twml/libtwml/src/lib/internal/utf_converter.h deleted file mode 100644 index b0b38fb11..000000000 --- a/twml/libtwml/src/lib/internal/utf_converter.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _UTF_CONVERTER_H_ -#define _UTF_CONVERTER_H_ - -#include -#include -#include - -ssize_t utf8_to_utf16(const uint8_t *in, uint64_t in_len, uint16_t *out, uint64_t max_out); - -#endif diff --git a/twml/libtwml/src/lib/io/IOError.cpp b/twml/libtwml/src/lib/io/IOError.cpp deleted file mode 100644 index e0a661c13..000000000 --- a/twml/libtwml/src/lib/io/IOError.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include - - -namespace twml { -namespace io { - -namespace { - std::string messageFromStatus(IOError::Status status) { - switch (status) { - case IOError::OUT_OF_RANGE: - return "failed to read enough input"; - case IOError::WRONG_MAGIC: - return "wrong magic in stream"; - case IOError::WRONG_HEADER: - return "wrong header in stream"; - case IOError::ERROR_HEADER_CHECKSUM: - return "header checksum doesn't match"; - case IOError::INVALID_METHOD: - return "using invalid method"; - case IOError::USING_RESERVED: - return "using reserved flag"; - case IOError::ERROR_HEADER_EXTRA_FIELD_CHECKSUM: - return "extra header field checksum doesn't match"; - case IOError::CANT_FIT_OUTPUT: - return "can't fit output in the given space"; - case IOError::SPLIT_FILE: - return "split files aren't supported"; - case IOError::BLOCK_SIZE_TOO_LARGE: - return "block size is too large"; - case IOError::SOURCE_LARGER_THAN_DESTINATION: - return "source is larger than destination"; - case IOError::DESTINATION_LARGER_THAN_CAPACITY: - return "destination buffer is too small to fit uncompressed result"; - case IOError::HEADER_FLAG_MISMATCH: - return "failed to match flags for compressed and decompressed data"; - case IOError::NOT_ENOUGH_INPUT: - return "not enough input to proceed with decompression"; - case IOError::ERROR_SOURCE_BLOCK_CHECKSUM: - return "source block checksum doesn't match"; - case IOError::COMPRESSED_DATA_VIOLATION: - return "error occurred while decompressing the data"; - case IOError::ERROR_DESTINATION_BLOCK_CHECKSUM: - return "destination block checksum doesn't match"; - case IOError::EMPTY_RECORD: - return "can't write an empty record"; - case IOError::MALFORMED_MEMORY_RECORD: - return "can't write malformed record"; - case IOError::UNSUPPORTED_OUTPUT_TYPE: - return "output data type is not supported"; - case IOError::OTHER_ERROR: - default: - return "unknown error occurred"; - } - } -} // namespace - -IOError::IOError(Status status): twml::Error(TWML_ERR_IO, "Found error while processing stream: " + - messageFromStatus(status)), m_status(status) {} - -} // namespace io -} // namespace twml diff --git a/twml/libtwml/src/lib/io/IOError.docx b/twml/libtwml/src/lib/io/IOError.docx new file mode 100644 index 0000000000000000000000000000000000000000..dcf9a59b91b04acf56de9e09692f67dcc4faa327 GIT binary patch literal 37543 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 - -#define ROTL32(x,y) _rotl(x,y) -#define ROTL64(x,y) _rotl64(x,y) - -#define BIG_CONSTANT(x) (x) - -// Other compilers - -#else // defined(_MSC_VER) - -#define FORCE_INLINE inline __attribute__((always_inline)) - -FORCE_INLINE uint32_t rotl32 ( uint32_t x, int8_t r ) -{ - return (x << r) | (x >> (32 - r)); -} - -FORCE_INLINE uint64_t rotl64 ( uint64_t x, int8_t r ) -{ - return (x << r) | (x >> (64 - r)); -} - -#define ROTL32(x,y) rotl32(x,y) -#define ROTL64(x,y) rotl64(x,y) - -#define BIG_CONSTANT(x) (x##LLU) - -#endif // !defined(_MSC_VER) - -//----------------------------------------------------------------------------- -// Block read - if your platform needs to do endian-swapping or can only -// handle aligned reads, do the conversion here - -FORCE_INLINE uint32_t getblock32 ( const uint32_t * p, int i ) -{ - return p[i]; -} - -FORCE_INLINE uint64_t getblock64 ( const uint64_t * p, int i ) -{ - return p[i]; -} - -//----------------------------------------------------------------------------- -// Finalization mix - force all bits of a hash block to avalanche - -FORCE_INLINE uint32_t fmix32 ( uint32_t h ) -{ - h ^= h >> 16; - h *= 0x85ebca6b; - h ^= h >> 13; - h *= 0xc2b2ae35; - h ^= h >> 16; - - return h; -} - -//---------- - -FORCE_INLINE uint64_t fmix64 ( uint64_t k ) -{ - k ^= k >> 33; - k *= BIG_CONSTANT(0xff51afd7ed558ccd); - k ^= k >> 33; - k *= BIG_CONSTANT(0xc4ceb9fe1a85ec53); - k ^= k >> 33; - - return k; -} - -//----------------------------------------------------------------------------- - -void MurmurHash3_x86_32 ( const void * key, int len, - uint32_t seed, void * out ) -{ - const uint8_t * data = (const uint8_t*)key; - const int nblocks = len / 4; - - uint32_t h1 = seed; - - const uint32_t c1 = 0xcc9e2d51; - const uint32_t c2 = 0x1b873593; - - //---------- - // body - - const uint32_t * blocks = (const uint32_t *)(data + nblocks*4); - - for(int i = -nblocks; i; i++) - { - uint32_t k1 = getblock32(blocks,i); - - k1 *= c1; - k1 = ROTL32(k1,15); - k1 *= c2; - - h1 ^= k1; - h1 = ROTL32(h1,13); - h1 = h1*5+0xe6546b64; - } - - //---------- - // tail - - const uint8_t * tail = (const uint8_t*)(data + nblocks*4); - - uint32_t k1 = 0; - - switch(len & 3) - { - case 3: k1 ^= tail[2] << 16; - case 2: k1 ^= tail[1] << 8; - case 1: k1 ^= tail[0]; - k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1; - }; - - //---------- - // finalization - - h1 ^= len; - - h1 = fmix32(h1); - - *(uint32_t*)out = h1; -} - -//----------------------------------------------------------------------------- - -void MurmurHash3_x86_128 ( const void * key, const int len, - uint32_t seed, void * out ) -{ - const uint8_t * data = (const uint8_t*)key; - const int nblocks = len / 16; - - uint32_t h1 = seed; - uint32_t h2 = seed; - uint32_t h3 = seed; - uint32_t h4 = seed; - - const uint32_t c1 = 0x239b961b; - const uint32_t c2 = 0xab0e9789; - const uint32_t c3 = 0x38b34ae5; - const uint32_t c4 = 0xa1e38b93; - - //---------- - // body - - const uint32_t * blocks = (const uint32_t *)(data + nblocks*16); - - for(int i = -nblocks; i; i++) - { - uint32_t k1 = getblock32(blocks,i*4+0); - uint32_t k2 = getblock32(blocks,i*4+1); - uint32_t k3 = getblock32(blocks,i*4+2); - uint32_t k4 = getblock32(blocks,i*4+3); - - k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1; - - h1 = ROTL32(h1,19); h1 += h2; h1 = h1*5+0x561ccd1b; - - k2 *= c2; k2 = ROTL32(k2,16); k2 *= c3; h2 ^= k2; - - h2 = ROTL32(h2,17); h2 += h3; h2 = h2*5+0x0bcaa747; - - k3 *= c3; k3 = ROTL32(k3,17); k3 *= c4; h3 ^= k3; - - h3 = ROTL32(h3,15); h3 += h4; h3 = h3*5+0x96cd1c35; - - k4 *= c4; k4 = ROTL32(k4,18); k4 *= c1; h4 ^= k4; - - h4 = ROTL32(h4,13); h4 += h1; h4 = h4*5+0x32ac3b17; - } - - //---------- - // tail - - const uint8_t * tail = (const uint8_t*)(data + nblocks*16); - - uint32_t k1 = 0; - uint32_t k2 = 0; - uint32_t k3 = 0; - uint32_t k4 = 0; - - switch(len & 15) - { - case 15: k4 ^= tail[14] << 16; - case 14: k4 ^= tail[13] << 8; - case 13: k4 ^= tail[12] << 0; - k4 *= c4; k4 = ROTL32(k4,18); k4 *= c1; h4 ^= k4; - - case 12: k3 ^= tail[11] << 24; - case 11: k3 ^= tail[10] << 16; - case 10: k3 ^= tail[ 9] << 8; - case 9: k3 ^= tail[ 8] << 0; - k3 *= c3; k3 = ROTL32(k3,17); k3 *= c4; h3 ^= k3; - - case 8: k2 ^= tail[ 7] << 24; - case 7: k2 ^= tail[ 6] << 16; - case 6: k2 ^= tail[ 5] << 8; - case 5: k2 ^= tail[ 4] << 0; - k2 *= c2; k2 = ROTL32(k2,16); k2 *= c3; h2 ^= k2; - - case 4: k1 ^= tail[ 3] << 24; - case 3: k1 ^= tail[ 2] << 16; - case 2: k1 ^= tail[ 1] << 8; - case 1: k1 ^= tail[ 0] << 0; - k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1; - }; - - //---------- - // finalization - - h1 ^= len; h2 ^= len; h3 ^= len; h4 ^= len; - - h1 += h2; h1 += h3; h1 += h4; - h2 += h1; h3 += h1; h4 += h1; - - h1 = fmix32(h1); - h2 = fmix32(h2); - h3 = fmix32(h3); - h4 = fmix32(h4); - - h1 += h2; h1 += h3; h1 += h4; - h2 += h1; h3 += h1; h4 += h1; - - ((uint32_t*)out)[0] = h1; - ((uint32_t*)out)[1] = h2; - ((uint32_t*)out)[2] = h3; - ((uint32_t*)out)[3] = h4; -} - -//----------------------------------------------------------------------------- - -void MurmurHash3_x64_128 ( const void * key, const int len, - const uint32_t seed, void * out ) -{ - const uint8_t * data = (const uint8_t*)key; - const int nblocks = len / 16; - - uint64_t h1 = seed; - uint64_t h2 = seed; - - const uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5); - const uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f); - - //---------- - // body - - const uint64_t * blocks = (const uint64_t *)(data); - - for(int i = 0; i < nblocks; i++) - { - uint64_t k1 = getblock64(blocks,i*2+0); - uint64_t k2 = getblock64(blocks,i*2+1); - - k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; - - h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729; - - k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; - - h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5; - } - - //---------- - // tail - - const uint8_t * tail = (const uint8_t*)(data + nblocks*16); - - uint64_t k1 = 0; - uint64_t k2 = 0; - - switch(len & 15) - { - case 15: k2 ^= ((uint64_t)tail[14]) << 48; - case 14: k2 ^= ((uint64_t)tail[13]) << 40; - case 13: k2 ^= ((uint64_t)tail[12]) << 32; - case 12: k2 ^= ((uint64_t)tail[11]) << 24; - case 11: k2 ^= ((uint64_t)tail[10]) << 16; - case 10: k2 ^= ((uint64_t)tail[ 9]) << 8; - case 9: k2 ^= ((uint64_t)tail[ 8]) << 0; - k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; - - case 8: k1 ^= ((uint64_t)tail[ 7]) << 56; - case 7: k1 ^= ((uint64_t)tail[ 6]) << 48; - case 6: k1 ^= ((uint64_t)tail[ 5]) << 40; - case 5: k1 ^= ((uint64_t)tail[ 4]) << 32; - case 4: k1 ^= ((uint64_t)tail[ 3]) << 24; - case 3: k1 ^= ((uint64_t)tail[ 2]) << 16; - case 2: k1 ^= ((uint64_t)tail[ 1]) << 8; - case 1: k1 ^= ((uint64_t)tail[ 0]) << 0; - k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; - }; - - //---------- - // finalization - - h1 ^= len; h2 ^= len; - - h1 += h2; - h2 += h1; - - h1 = fmix64(h1); - h2 = fmix64(h2); - - h1 += h2; - h2 += h1; - - ((uint64_t*)out)[0] = h1; - ((uint64_t*)out)[1] = h2; -} - -//----------------------------------------------------------------------------- - diff --git a/twml/libtwml/src/lib/murmur_hash3.docx b/twml/libtwml/src/lib/murmur_hash3.docx new file mode 100644 index 0000000000000000000000000000000000000000..fef9c4ee2037b9843f7a6090550af46d6deb25be GIT binary patch literal 39068 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 b8)Ao}Lw#*(U<7?1RjeQzV0Z|nf8Y8aDK1N+ literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/optim.cpp b/twml/libtwml/src/lib/optim.cpp deleted file mode 100644 index 7db36c26d..000000000 --- a/twml/libtwml/src/lib/optim.cpp +++ /dev/null @@ -1,274 +0,0 @@ -#include "internal/interpolate.h" -#include "internal/error.h" -#include - -namespace twml { - template - void mdlInfer(Tensor &output_keys, Tensor &output_vals, - const Tensor &input_keys, const Tensor &input_vals, - const Tensor &bin_ids, - const Tensor &bin_vals, - const Tensor &feature_offsets, - bool return_bin_indices) { - auto okeysData = output_keys.getData(); - auto ovalsData = output_vals.getData(); - uint64_t okeysStride = output_keys.getStride(0); - uint64_t ovaluesStride = output_vals.getStride(0); - - auto ikeysData = input_keys.getData(); - auto ivalsData = input_vals.getData(); - uint64_t ikeysStride = input_keys.getStride(0); - uint64_t ivaluesStride = input_vals.getStride(0); - - auto xsData = bin_vals.getData(); - auto ysData = bin_ids.getData(); - uint64_t xsStride = bin_vals.getStride(0); - uint64_t ysStride = bin_ids.getStride(0); - - auto offsetData = feature_offsets.getData(); - - uint64_t size = input_keys.getDim(0); - uint64_t total_bins = bin_ids.getNumElements(); - uint64_t fsize = feature_offsets.getNumElements(); - - for (uint64_t i = 0; i < size; i++) { - int64_t ikey = ikeysData[i * ikeysStride] - TWML_INDEX_BASE; - T val = ivalsData[i * ivaluesStride]; - if (ikey == -1) { - ovalsData[i * ovaluesStride] = val; - continue; - } - - // Perform interpolation - uint64_t offset = offsetData[ikey]; - uint64_t next_offset = (ikey == (int64_t)(fsize - 1)) ? total_bins : offsetData[ikey + 1]; - uint64_t mainSize = next_offset - offset; - - const T *lxsData = xsData + offset; - const int64_t *lysData = ysData + offset; - int64_t okey = interpolation(lxsData, xsStride, - lysData, ysStride, - val, mainSize, NEAREST, 0, - return_bin_indices); - okeysData[i * okeysStride] = okey + TWML_INDEX_BASE; - ovalsData[i * ovaluesStride] = 1; - } - } - - void mdlInfer(Tensor &output_keys, Tensor &output_vals, - const Tensor &input_keys, const Tensor &input_vals, - const Tensor &bin_ids, - const Tensor &bin_vals, - const Tensor &feature_offsets, - bool return_bin_indices) { - if (input_keys.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "input_keys must be a Long Tensor"); - } - - if (output_keys.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "output_keys must be a Long Tensor"); - } - - if (bin_ids.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "bin_ids must be a Long Tensor"); - } - - if (feature_offsets.getType() != TWML_TYPE_INT64) { - throw twml::Error(TWML_ERR_TYPE, "bin_ids must be a Long Tensor"); - } - - if (input_vals.getType() != bin_vals.getType()) { - throw twml::Error(TWML_ERR_TYPE, - "Data type of input_vals does not match type of bin_vals"); - } - - if (bin_vals.getNumDims() != 1) { - throw twml::Error(TWML_ERR_SIZE, - "bin_vals must be 1 Dimensional"); - } - - if (bin_ids.getNumDims() != 1) { - throw twml::Error(TWML_ERR_SIZE, - "bin_ids must be 1 Dimensional"); - } - - if (bin_vals.getNumElements() != bin_ids.getNumElements()) { - throw twml::Error(TWML_ERR_SIZE, - "Dimensions of bin_vals and bin_ids do not match"); - } - - if (feature_offsets.getStride(0) != 1) { - throw twml::Error(TWML_ERR_SIZE, - "feature_offsets must be contiguous"); - } - - switch (input_vals.getType()) { - case TWML_TYPE_FLOAT: - twml::mdlInfer(output_keys, output_vals, - input_keys, input_vals, - bin_ids, bin_vals, feature_offsets, - return_bin_indices); - break; - case TWML_TYPE_DOUBLE: - twml::mdlInfer(output_keys, output_vals, - input_keys, input_vals, - bin_ids, bin_vals, feature_offsets, - return_bin_indices); - break; - default: - throw twml::Error(TWML_ERR_TYPE, - "Unsupported datatype for mdlInfer"); - } - } - - const int DEFAULT_INTERPOLATION_LOWEST = 0; - /** - * @param output tensor to hold linear or nearest interpolation output. - * This function does not allocate space. - * The output tensor must have space allcoated. - * @param input input tensor; size must match output. - * input is assumed to have size [batch_size, number_of_labels]. - * @param xs the bins. - * @param ys the values for the bins. - * @param mode: linear or nearest InterpolationMode. - * linear is used for isotonic calibration. - * nearest is used for MDL calibration and MDL inference. - * - * @return Returns nothing. Output is stored into the output tensor. - * - * This is used by IsotonicCalibration inference. - */ - template - void interpolation( - Tensor output, - const Tensor input, - const Tensor xs, - const Tensor ys, - const InterpolationMode mode) { - // Sanity check: input and output should have two dims. - if (input.getNumDims() != 2 || output.getNumDims() != 2) { - throw twml::Error(TWML_ERR_TYPE, - "input and output should have 2 dimensions."); - } - - // Sanity check: input and output size should match. - for (int i = 0; i < input.getNumDims(); i++) { - if (input.getDim(i) != output.getDim(i)) { - throw twml::Error(TWML_ERR_TYPE, - "input and output mismatch in size."); - } - } - - // Sanity check: number of labels in input should match - // number of labels in xs / ys. - if (input.getDim(1) != xs.getDim(0) - || input.getDim(1) != ys.getDim(0)) { - throw twml::Error(TWML_ERR_TYPE, - "input, xs, ys should have the same number of labels."); - } - - const uint64_t inputStride0 = input.getStride(0); - const uint64_t inputStride1 = input.getStride(1); - const uint64_t outputStride0 = output.getStride(0); - const uint64_t outputStride1 = output.getStride(1); - const uint64_t xsStride0 = xs.getStride(0); - const uint64_t xsStride1 = xs.getStride(1); - const uint64_t ysStride0 = ys.getStride(0); - const uint64_t ysStride1 = ys.getStride(1); - const uint64_t mainSize = xs.getDim(1); - - // for each value in the input matrix, compute output value by - // calling interpolation. - auto inputData = input.getData(); - auto outputData = output.getData(); - auto xsData = xs.getData(); - auto ysData = ys.getData(); - - for (uint64_t i = 0; i < input.getDim(0); i++) { - for (uint64_t j = 0; j < input.getDim(1); j++) { - const T val = inputData[i * inputStride0 + j * inputStride1]; - const T *lxsData = xsData + j * xsStride0; - const T *lysData = ysData + j * ysStride0; - const T res = interpolation( - lxsData, xsStride1, - lysData, ysStride1, - val, - mainSize, - mode, - DEFAULT_INTERPOLATION_LOWEST); - outputData[i * outputStride0 + j * outputStride1] = res; - } - } - } - - void linearInterpolation( - Tensor output, - const Tensor input, - const Tensor xs, - const Tensor ys) { - switch (input.getType()) { - case TWML_TYPE_FLOAT: - twml::interpolation(output, input, xs, ys, LINEAR); - break; - case TWML_TYPE_DOUBLE: - twml::interpolation(output, input, xs, ys, LINEAR); - break; - default: - throw twml::Error(TWML_ERR_TYPE, - "Unsupported datatype for linearInterpolation."); - } - } - - void nearestInterpolation( - Tensor output, - const Tensor input, - const Tensor xs, - const Tensor ys) { - switch (input.getType()) { - case TWML_TYPE_FLOAT: - twml::interpolation(output, input, xs, ys, NEAREST); - break; - case TWML_TYPE_DOUBLE: - twml::interpolation(output, input, xs, ys, NEAREST); - break; - default: - throw twml::Error(TWML_ERR_TYPE, - "Unsupported datatype for nearestInterpolation."); - } - } -} // namespace twml - -twml_err twml_optim_mdl_infer(twml_tensor output_keys, - twml_tensor output_vals, - const twml_tensor input_keys, - const twml_tensor input_vals, - const twml_tensor bin_ids, - const twml_tensor bin_vals, - const twml_tensor feature_offsets, - bool return_bin_indices) { - HANDLE_EXCEPTIONS( - using namespace twml; - mdlInfer(*getTensor(output_keys), - *getTensor(output_vals), - *getConstTensor(input_keys), - *getConstTensor(input_vals), - *getConstTensor(bin_ids), - *getConstTensor(bin_vals), - *getConstTensor(feature_offsets), - return_bin_indices);); - return TWML_ERR_NONE; -} - -twml_err twml_optim_nearest_interpolation( - twml_tensor output, - const twml_tensor input, - const twml_tensor xs, - const twml_tensor ys) { - HANDLE_EXCEPTIONS( - using namespace twml; - nearestInterpolation(*getTensor(output), - *getConstTensor(input), - *getConstTensor(xs), - *getConstTensor(ys));); - return TWML_ERR_NONE; -} diff --git a/twml/libtwml/src/lib/optim.docx b/twml/libtwml/src/lib/optim.docx new file mode 100644 index 0000000000000000000000000000000000000000..b9bc8fce935366f6bbc64aec13d13f2ce56d9f23 GIT binary patch literal 38969 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 literal 0 HcmV?d00001 diff --git a/twml/libtwml/src/lib/utf_converter.cpp b/twml/libtwml/src/lib/utf_converter.cpp deleted file mode 100644 index 5c943f3e3..000000000 --- a/twml/libtwml/src/lib/utf_converter.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "internal/utf_converter.h" - -ssize_t utf8_to_utf16(const uint8_t *in, uint64_t in_len, uint16_t *out, uint64_t max_out) { - uint64_t num_out = 0; - uint64_t num_in = 0; - while (num_in < in_len) { - uint32_t uni; - uint64_t todo; - uint8_t ch = in[num_in]; - num_in++; - if (ch <= 0x7F) { - uni = ch; - todo = 0; - } else if (ch <= 0xBF) { - return -1; - } else if (ch <= 0xDF) { - uni = ch & 0x1F; - todo = 1; - } else if (ch <= 0xEF) { - uni = ch & 0x0F; - todo = 2; - } else if (ch <= 0xF7) { - uni = ch & 0x07; - todo = 3; - } else { - return -1; - } - for (uint64_t j = 0; j < todo; ++j) { - if (num_in == in_len) return -1; - uint8_t ch = in[num_in]; - num_in++; - if (ch < 0x80 || ch > 0xBF) return -1; - uni <<= 6; - uni += ch & 0x3F; - } - if (uni >= 0xD800 && uni <= 0xDFFF) return -1; - if (uni > 0x10FFFF) return -1; - if (uni <= 0xFFFF) { - if (num_out == max_out) return -1; - out[num_out] = uni; - num_out++; - } else { - uni -= 0x10000; - if (num_out + 1 >= max_out) return -1; - out[num_out] = (uni >> 10) + 0xD800; - out[num_out + 1] = (uni & 0x3FF) + 0xDC00; - num_out += 2; - } - } - if (num_out == max_out) return -1; - out[num_out] = 0; - return num_out; -} diff --git a/twml/libtwml/src/lib/utf_converter.docx b/twml/libtwml/src/lib/utf_converter.docx new file mode 100644 index 0000000000000000000000000000000000000000..4e378830fd3ef8591299bd4f170483daab9c2949 GIT binary patch literal 37131 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