kevin-toolbox-dev 1.1.1__tar.gz → 1.1.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kevin-toolbox-dev-1.1.3/PKG-INFO +58 -0
- kevin-toolbox-dev-1.1.3/README.md +40 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/__init__.py +2 -2
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/copy_.py +2 -1
- kevin-toolbox-dev-1.1.3/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_value_by_name.py +48 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/set_value_by_name.py +1 -1
- kevin-toolbox-dev-1.1.3/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/traverse.py +148 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/eval_references.py +15 -6
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/registration/registry.py +29 -50
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/scheduler/strategy_manager.py +30 -14
- kevin-toolbox-dev-1.1.3/kevin_toolbox/computer_science/algorithm/scheduler/trigger.py +123 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_test/check_consistency.py +4 -2
- kevin-toolbox-dev-1.1.3/kevin_toolbox_dev.egg-info/PKG-INFO +58 -0
- kevin-toolbox-dev-1.1.1/PKG-INFO +0 -122
- kevin-toolbox-dev-1.1.1/README.md +0 -104
- kevin-toolbox-dev-1.1.1/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_value_by_name.py +0 -30
- kevin-toolbox-dev-1.1.1/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/traverse.py +0 -69
- kevin-toolbox-dev-1.1.1/kevin_toolbox/computer_science/algorithm/scheduler/trigger.py +0 -69
- kevin-toolbox-dev-1.1.1/kevin_toolbox_dev.egg-info/PKG-INFO +0 -122
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/get_subset_with_largest_product.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/test/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/test/test_get_subset_with_largest_product.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/test/test_zero_one_knapsack_problem.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/combinatorial_optimization/zero_one_knapsack_problem.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_dict/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_dict/deep_update.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/count_leaf_node_nums.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_hash.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_nodes.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/build_name.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/escape_node.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/parse_name.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/cal_relation_between_references.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/parse_references.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_seq/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_seq/flatten_list.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/for_seq/get_subsets.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/locks/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/locks/mutex_lock.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/pareto_front/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/pareto_front/get_pareto_points_idx.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/registration/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/scheduler/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/search/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/search/binary_search.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/statistician/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/statistician/_init_var.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/statistician/average_accumulator.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/statistician/exponential_moving_average.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/algorithm/utils/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/data_structure/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/computer_science/data_structure/executor.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/dangerous/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/dangerous/dump_into_pickle_with_executor_attached.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/cache/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/cache/cache_manager_for_iterator.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/reader/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/reader/file_iterative_reader.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/reader/unified_reader.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/core/reader/unified_reader_base.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/converter/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/converter/convert_dict_key_to_number.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/converter/convert_ndarray_to_list.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/converter/integrate.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/read_json.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/json_/write_json.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/converter.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/kevin_notation_reader.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/kevin_notation_writer.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/read.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/test_data/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/test_data/data_0.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/test_data/data_all.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/test/test_kevin_notation.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/data_flow/file/kevin_notation/write.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/decorator/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/decorator/restore_original_work_path.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/consumer.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/for_cvf.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/getter.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/graph.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/node.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/producer.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/producer_consumer/sender.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/singleton/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/design_pattern/singleton/singleton_for_uid.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/general_matrix_multiplication.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/numerical_characteristics/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/numerical_characteristics/iou.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/iterator_base.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/my_iterator.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/my_iterator_base.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/temperate/sequence_map_base.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/developing/test.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/check_validity_and_uninstall.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/check_version_and_update.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/test/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/test/test_version.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/version/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/version/compare_version.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/version/parse_version.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/env_info/version/sort_version_ls.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/__old_version/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/__old_version/cal_iou_between_box.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/boolean_algebra_for_boxes.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/cal_area_of_boxes.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/cal_iou_between_boxes.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/convert_boxes_from_coord_to_grid_index.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/detect_collision.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/detect_collision_among_boxes_ls.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/detect_collision_inside_boxes.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/detect_overlap.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/geometry/for_boxes/get_ticks_of_boxes.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/analysis/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/analysis/get_fail_case_from_iterator.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/dummy/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/dummy/dummy_data.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/build_generator.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/build_iterator.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/factory.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/along_axis.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/along_diagonal.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/of_all.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__by_block/of_triangle.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/by_block.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/get_executor_ls/by_samples.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/dataset/face/verification/merge.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/accumulator_for_cfm.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/cal_cfm.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/cal_cfm_iteratively_by_chunk.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/cal_tpr_and_fpr.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/convert.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/machine_learning/statistician/binary_classification/confusion_matrices/merge_cfm_ls.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/concat_and_split/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/concat_and_split/computational_tree.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/concat_and_split/concat_crops_into_whole.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/concat_and_split/split_whole_into_crops.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/convert/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/convert/convert_format.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/generate_integrated_api.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/generate_shuffled_index_ls.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/generate_z_pattern_indices_ls.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/coordinates/generate/normal_indices_generator.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/flatten_along_pattern.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/merge_blocks.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/split_blocks.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/reshape/unflatten_along_pattern.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/transpose/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/transpose/get_inverse_of_transpose_index_ls.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/dimension/transpose/transpose_inside_axis.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/cache.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/get_greatest_common_divisor.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/get_primes.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/prime_factorization.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/test/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/test/test_get_greatest_common_divisor.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/test/test_get_primes.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/number_theory/test/test_prime_factorization.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/dct/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/dct/dct_calculator.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/dct/generate_dct_trans_matrix.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/scaling_and_shift/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/transform/scaling_and_shift/scaling.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/convert_dtype.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/get_crop_by_box.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/get_function_table_for_array_and_tensor.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/set_crop_by_box.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/math/utils/spilt_integer_most_evenly.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_matplotlib/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_matplotlib/add_trajectory_2d.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_matplotlib/add_trajectory_3d.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_matplotlib/arrow3d.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/linalg/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/linalg/cos_similar.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/linalg/normalize.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_numpy/linalg/softmax.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_optuna/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_optuna/sample_from_feasible_domain.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_os/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_os/remove.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_test/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/concat.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/linalg/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/linalg/norm.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/linalg/svd.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/nn/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/nn/sequential.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/tile.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/compatible/where.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/math/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/math/get_y_at_x.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/math/my_around.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/nn/__init__.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox/patches/for_torch/nn/lambda_layer.py +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox_dev.egg-info/SOURCES.txt +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox_dev.egg-info/dependency_links.txt +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox_dev.egg-info/requires.txt +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/kevin_toolbox_dev.egg-info/top_level.txt +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/pyproject.toml +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/setup.cfg +0 -0
- {kevin-toolbox-dev-1.1.1 → kevin-toolbox-dev-1.1.3}/setup.py +0 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: kevin-toolbox-dev
|
3
|
+
Version: 1.1.3
|
4
|
+
Summary: 一个常用的工具代码包集合
|
5
|
+
Home-page: https://github.com/cantbeblank96/kevin_toolbox
|
6
|
+
Download-URL: https://github.com/username/your-package/archive/refs/tags/v1.0.0.tar.gz
|
7
|
+
Author: kevin hsu
|
8
|
+
Author-email: xukaiming1996@163.com
|
9
|
+
License: MIT
|
10
|
+
Keywords: mathematics,pytorch,numpy,machine-learning,algorithm
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
12
|
+
Classifier: Programming Language :: Python
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
14
|
+
Requires-Python: >=3.6
|
15
|
+
Description-Content-Type: text/markdown
|
16
|
+
Provides-Extra: plot
|
17
|
+
Provides-Extra: rest
|
18
|
+
|
19
|
+
# kevin_toolbox
|
20
|
+
|
21
|
+
一个通用的工具代码包集合
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
环境要求
|
26
|
+
|
27
|
+
```shell
|
28
|
+
numpy>=1.19
|
29
|
+
pytorch>=1.2
|
30
|
+
```
|
31
|
+
|
32
|
+
安装方法:
|
33
|
+
|
34
|
+
```shell
|
35
|
+
pip install kevin-toolbox --no-dependencies
|
36
|
+
```
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
[项目地址 Repo](https://github.com/cantbeblank96/kevin_toolbox)
|
41
|
+
|
42
|
+
[使用指南 User_Guide](./notes/User_Guide.md)
|
43
|
+
|
44
|
+
[免责声明 Disclaimer](./notes/Disclaimer.md)
|
45
|
+
|
46
|
+
[版本更新记录](./notes/Release_Record.md):
|
47
|
+
|
48
|
+
- v 1.1.3(2023-06-30)
|
49
|
+
- computer_science.algorithm.for_nested_dict_list
|
50
|
+
- 在 traverse() 中新增了traversal_mode 参数用于控制遍历的顺序,目前支持三种模式: "dfs_pre_order" 深度优先-先序遍历、"dfs_post_order" 深度优先-后序遍历、以及 "bfs" 宽度优先。
|
51
|
+
- 在单元测试中新增了对 traverse() 中 traversal_mode 参数的测试项目。
|
52
|
+
- value_parser
|
53
|
+
- 修改 eval_references() 中 converter_for_ref 参数的行为,从原来只是作为计算结果前对算式中引用节点值的预处理,变成直接改变被引用节点的值。亦即原来不会修改原被引用节点的值,现在变为会修改原节点的值了。
|
54
|
+
- computer_science.algorithm.scheduler
|
55
|
+
- 改进 Strategy_Manager
|
56
|
+
- 使用 `<eval>` 来标记需要使用 eval() 函数读取的字符串。相对于旧版通过 `<eval>` 来标记需要被读取为函数的字符串,使用 `<eval>` 不仅可以读取函数,也可以读取更多的数据结构。
|
57
|
+
- 在通过 add() 添加策略时即对 strategy 中被 `<eval>` 标记的键值进行解释,而非等到后续每次 cal() 时再进行解释,提高了效率。
|
58
|
+
- 修改了对应的单元测试。
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# kevin_toolbox
|
2
|
+
|
3
|
+
一个通用的工具代码包集合
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
环境要求
|
8
|
+
|
9
|
+
```shell
|
10
|
+
numpy>=1.19
|
11
|
+
pytorch>=1.2
|
12
|
+
```
|
13
|
+
|
14
|
+
安装方法:
|
15
|
+
|
16
|
+
```shell
|
17
|
+
pip install kevin-toolbox --no-dependencies
|
18
|
+
```
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
[项目地址 Repo](https://github.com/cantbeblank96/kevin_toolbox)
|
23
|
+
|
24
|
+
[使用指南 User_Guide](./notes/User_Guide.md)
|
25
|
+
|
26
|
+
[免责声明 Disclaimer](./notes/Disclaimer.md)
|
27
|
+
|
28
|
+
[版本更新记录](./notes/Release_Record.md):
|
29
|
+
|
30
|
+
- v 1.1.3(2023-06-30)
|
31
|
+
- computer_science.algorithm.for_nested_dict_list
|
32
|
+
- 在 traverse() 中新增了traversal_mode 参数用于控制遍历的顺序,目前支持三种模式: "dfs_pre_order" 深度优先-先序遍历、"dfs_post_order" 深度优先-后序遍历、以及 "bfs" 宽度优先。
|
33
|
+
- 在单元测试中新增了对 traverse() 中 traversal_mode 参数的测试项目。
|
34
|
+
- value_parser
|
35
|
+
- 修改 eval_references() 中 converter_for_ref 参数的行为,从原来只是作为计算结果前对算式中引用节点值的预处理,变成直接改变被引用节点的值。亦即原来不会修改原被引用节点的值,现在变为会修改原节点的值了。
|
36
|
+
- computer_science.algorithm.scheduler
|
37
|
+
- 改进 Strategy_Manager
|
38
|
+
- 使用 `<eval>` 来标记需要使用 eval() 函数读取的字符串。相对于旧版通过 `<eval>` 来标记需要被读取为函数的字符串,使用 `<eval>` 不仅可以读取函数,也可以读取更多的数据结构。
|
39
|
+
- 在通过 add() 添加策略时即对 strategy 中被 `<eval>` 标记的键值进行解释,而非等到后续每次 cal() 时再进行解释,提高了效率。
|
40
|
+
- 修改了对应的单元测试。
|
@@ -1,4 +1,4 @@
|
|
1
|
-
__version__ = "1.1.
|
1
|
+
__version__ = "1.1.3"
|
2
2
|
|
3
3
|
|
4
4
|
import os
|
@@ -12,5 +12,5 @@ os.system(
|
|
12
12
|
os.system(
|
13
13
|
f'python {os.path.split(__file__)[0]}/env_info/check_validity_and_uninstall.py '
|
14
14
|
f'--package_name kevin-toolbox-dev '
|
15
|
-
f'--expiration_timestamp
|
15
|
+
f'--expiration_timestamp 1703667553 --verbose 0'
|
16
16
|
)
|
@@ -16,7 +16,8 @@ def copy_(var, b_deepcopy=False):
|
|
16
16
|
return copy.deepcopy(var)
|
17
17
|
|
18
18
|
return traverse(var=[var], match_cond=lambda _, __, value: isinstance(value, (list, dict,)),
|
19
|
-
action_mode="replace", converter=lambda _, value: value.copy(),
|
19
|
+
action_mode="replace", converter=lambda _, value: value.copy(),
|
20
|
+
traversal_mode="dfs_pre_order", b_traverse_matched_element=True)[0]
|
20
21
|
|
21
22
|
|
22
23
|
if __name__ == '__main__':
|
@@ -0,0 +1,48 @@
|
|
1
|
+
from kevin_toolbox.computer_science.algorithm.for_nested_dict_list.name_handler import parse_name
|
2
|
+
|
3
|
+
|
4
|
+
def get_value_by_name(var, name, b_pop=False, **kwargs):
|
5
|
+
"""
|
6
|
+
通过解释名字得到取值方式,然后到 var 中获取对应部分的值。
|
7
|
+
|
8
|
+
参数:
|
9
|
+
var: 任意支持索引取值的变量
|
10
|
+
name: <str> 名字
|
11
|
+
名字 name 的具体介绍参见函数 name_handler.parse_name()
|
12
|
+
假设 var=dict(acc=[0.66,0.78,0.99]),如果你想读取 var["acc"][1] => 0.78,那么可以将 name 写成:
|
13
|
+
":acc@1" 或者 "|acc|1" 等。
|
14
|
+
注意,在 name 的开头也可以添加任意非解释方式的字符,本函数将直接忽略它们,比如下面的:
|
15
|
+
"var:acc@1" 和 "xxxx|acc|1" 也能正常读取。
|
16
|
+
b_pop: <boolean> 是否将值从 var 中移除
|
17
|
+
默认为 False
|
18
|
+
default: 默认值
|
19
|
+
- 不设置(默认)。当取值失败时将报错。
|
20
|
+
- 设置为任意值。取值失败时将返回该值。
|
21
|
+
"""
|
22
|
+
_, method_ls, node_ls = parse_name(name=name, b_de_escape_node=True)
|
23
|
+
|
24
|
+
try:
|
25
|
+
pre, cur = None, var
|
26
|
+
node = None
|
27
|
+
for method, node in zip(method_ls, node_ls):
|
28
|
+
pre, cur = cur, None
|
29
|
+
if method == "@":
|
30
|
+
node = eval(node)
|
31
|
+
elif method == "|":
|
32
|
+
try:
|
33
|
+
_ = pre[node]
|
34
|
+
except:
|
35
|
+
node = eval(node)
|
36
|
+
cur = pre[node]
|
37
|
+
|
38
|
+
if b_pop and len(node_ls) > 0:
|
39
|
+
assert isinstance(pre, (dict, list,)), \
|
40
|
+
f'pop is only supported when the parent node type is list or dict, but got a {type(pre)}'
|
41
|
+
pre.pop(node)
|
42
|
+
except:
|
43
|
+
if "default" in kwargs:
|
44
|
+
cur = kwargs["default"]
|
45
|
+
else:
|
46
|
+
raise IndexError(f'invalid name {name}')
|
47
|
+
|
48
|
+
return cur
|
@@ -16,7 +16,7 @@ def set_value_by_name(var, name, value, b_force=False):
|
|
16
16
|
"var:acc@1" 和 "xxxx|acc|1" 也能正常写入。
|
17
17
|
value: 待赋给的值
|
18
18
|
b_force: <boolean> 当无法设置时,是否尝试创建或者修改节点
|
19
|
-
默认为 False
|
19
|
+
默认为 False,此时若无法设置,则报错
|
20
20
|
当设置为 True,可能会对 var 的结构产生不可逆的改变,请谨慎使用。
|
21
21
|
- 根据取值方式的不同,新创建或者修改的节点的类型可能是 dict 或者 list,
|
22
22
|
对于 list,其中缺省值填充 None。
|
kevin-toolbox-dev-1.1.3/kevin_toolbox/computer_science/algorithm/for_nested_dict_list/traverse.py
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
from enum import Enum
|
2
|
+
from kevin_toolbox.computer_science.algorithm.for_nested_dict_list.name_handler import escape_node
|
3
|
+
|
4
|
+
|
5
|
+
class ACTION_MODE(Enum):
|
6
|
+
remove = 1
|
7
|
+
replace = 2
|
8
|
+
skip = 3
|
9
|
+
|
10
|
+
|
11
|
+
class TRAVERSAL_MODE(Enum):
|
12
|
+
dfs_pre_order = 1
|
13
|
+
dfs_post_order = 2
|
14
|
+
bfs = 3
|
15
|
+
|
16
|
+
|
17
|
+
def traverse(var, match_cond, action_mode="remove", converter=None,
|
18
|
+
b_use_name_as_idx=False, traversal_mode="dfs_pre_order", b_traverse_matched_element=False):
|
19
|
+
"""
|
20
|
+
遍历 var 找到符合 match_cond 的元素,将其按照 action_mode 指定的操作进行处理
|
21
|
+
|
22
|
+
参数:
|
23
|
+
var: 待处理数据
|
24
|
+
当 var 不是 dict 或者 list 时,将直接返回 var 而不做处理
|
25
|
+
match_cond: <func> 元素的匹配条件
|
26
|
+
函数类型为 def(parent_type, idx, value): ...
|
27
|
+
其中:
|
28
|
+
parent_type 该元素源自哪种结构体,有两个可能传入的值: list,dict
|
29
|
+
idx 该元素在结构体中的位置
|
30
|
+
当 b_use_name_as_idx=False 时,
|
31
|
+
对于列表是 index,对于字典是 key
|
32
|
+
当为 True 时,传入的是元素在整体结构中的 name 位置,name的格式和含义参考
|
33
|
+
name_handler.parse_name() 中的介绍
|
34
|
+
value 元素的值
|
35
|
+
action_mode: <str> 如何对匹配上的元素进行处理
|
36
|
+
目前支持:
|
37
|
+
"remove" 将该元素移除
|
38
|
+
"replace" 将该元素替换为 converter() 处理后的结果
|
39
|
+
"skip": 不进行任何操作
|
40
|
+
converter: <func> 参见 action_mode 中的 "replace" 模式
|
41
|
+
函数类型为 def(idx, value): ...
|
42
|
+
其中 idx 和 value 的含义参见参数 match_cond 介绍
|
43
|
+
traversal_mode: <str> 遍历的模式、顺序
|
44
|
+
目前支持:
|
45
|
+
"dfs_pre_order" 深度优先、先序遍历
|
46
|
+
"dfs_post_order" 深度优先、后序遍历
|
47
|
+
"bfs" 宽度优先
|
48
|
+
默认为 "dfs_pre_order"
|
49
|
+
b_use_name_as_idx: <boolean> 对于 match_cond/converter 中的 idx 参数,是传入整体的 name 还是父节点的 index 或 key。
|
50
|
+
默认为 False
|
51
|
+
b_traverse_matched_element <boolean> 对于匹配上的元素,经过处理后,是否继续遍历该元素的内容
|
52
|
+
默认为 False
|
53
|
+
"""
|
54
|
+
assert callable(match_cond)
|
55
|
+
assert action_mode in ACTION_MODE.__members__.keys()
|
56
|
+
action_mode = ACTION_MODE.__members__[action_mode]
|
57
|
+
if action_mode is ACTION_MODE.replace:
|
58
|
+
assert callable(converter)
|
59
|
+
#
|
60
|
+
assert traversal_mode in TRAVERSAL_MODE.__members__.keys()
|
61
|
+
traversal_mode = TRAVERSAL_MODE.__members__[traversal_mode]
|
62
|
+
|
63
|
+
if traversal_mode is TRAVERSAL_MODE.bfs:
|
64
|
+
return _bfs(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element)
|
65
|
+
else:
|
66
|
+
return _dfs(var, match_cond, action_mode, converter, b_use_name_as_idx, traversal_mode,
|
67
|
+
b_traverse_matched_element, "")
|
68
|
+
|
69
|
+
|
70
|
+
def _bfs(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element):
|
71
|
+
temp = [("", var)]
|
72
|
+
|
73
|
+
while len(temp):
|
74
|
+
pre_name, i = temp.pop(0)
|
75
|
+
if isinstance(i, (list, dict)):
|
76
|
+
keys = list(range(len(i)) if isinstance(i, list) else i.keys())
|
77
|
+
keys.reverse() # 反过来便于 列表 弹出元素
|
78
|
+
idx_ls = _gen_idx(i, keys, b_use_name_as_idx, pre_name)
|
79
|
+
|
80
|
+
# 匹配&处理
|
81
|
+
for k, idx in zip(keys, idx_ls):
|
82
|
+
b_matched, b_popped = _deal(i, k, idx, match_cond, converter, action_mode)
|
83
|
+
if b_popped or (b_matched and not b_traverse_matched_element):
|
84
|
+
continue
|
85
|
+
# 添加到队尾
|
86
|
+
temp.append((idx, i[k]))
|
87
|
+
|
88
|
+
return var
|
89
|
+
|
90
|
+
|
91
|
+
def _dfs(var, match_cond, action_mode, converter,
|
92
|
+
b_use_name_as_idx, traversal_mode, b_traverse_matched_element, pre_name):
|
93
|
+
if isinstance(var, (list, dict)):
|
94
|
+
keys = list(range(len(var)) if isinstance(var, list) else var.keys())
|
95
|
+
keys.reverse() # 反过来便于 列表 弹出元素
|
96
|
+
idx_ls = _gen_idx(var, keys, b_use_name_as_idx, pre_name)
|
97
|
+
|
98
|
+
#
|
99
|
+
if traversal_mode is TRAVERSAL_MODE.dfs_pre_order:
|
100
|
+
# 先序
|
101
|
+
# 匹配&处理
|
102
|
+
deal_res_ls = []
|
103
|
+
for k, idx in zip(keys, idx_ls):
|
104
|
+
deal_res_ls.append(_deal(var, k, idx, match_cond, converter, action_mode))
|
105
|
+
# 递归遍历
|
106
|
+
for (b_matched, b_popped), k, idx in zip(deal_res_ls, keys, idx_ls):
|
107
|
+
if b_popped or (b_matched and not b_traverse_matched_element):
|
108
|
+
continue
|
109
|
+
var[k] = _dfs(var[k], match_cond, action_mode, converter, b_use_name_as_idx, traversal_mode,
|
110
|
+
b_traverse_matched_element, idx)
|
111
|
+
else:
|
112
|
+
# 后序
|
113
|
+
# 递归遍历
|
114
|
+
for k, idx in zip(keys, idx_ls):
|
115
|
+
var[k] = _dfs(var[k], match_cond, action_mode, converter, b_use_name_as_idx, traversal_mode,
|
116
|
+
b_traverse_matched_element, idx)
|
117
|
+
# 匹配&处理
|
118
|
+
for k, idx in zip(keys, idx_ls):
|
119
|
+
_deal(var, k, idx, match_cond, converter, action_mode)
|
120
|
+
else:
|
121
|
+
pass
|
122
|
+
return var
|
123
|
+
|
124
|
+
|
125
|
+
def _deal(var, k, idx, match_cond, converter, action_mode):
|
126
|
+
"""处理节点"""
|
127
|
+
# 匹配
|
128
|
+
b_matched = match_cond(type(var), idx, var[k])
|
129
|
+
b_popped = False
|
130
|
+
# 处理
|
131
|
+
if b_matched:
|
132
|
+
if action_mode is ACTION_MODE.remove:
|
133
|
+
var.pop(k)
|
134
|
+
b_popped = True
|
135
|
+
elif action_mode is ACTION_MODE.replace:
|
136
|
+
var[k] = converter(idx, var[k])
|
137
|
+
else:
|
138
|
+
pass
|
139
|
+
return b_matched, b_popped
|
140
|
+
|
141
|
+
|
142
|
+
def _gen_idx(var, keys, b_use_name_as_idx, pre_name):
|
143
|
+
if b_use_name_as_idx:
|
144
|
+
method = "@" if isinstance(var, list) else ":"
|
145
|
+
idx_ls = [f'{pre_name}{method}{escape_node(node=k, b_reversed=False, times=1)}' for k in keys]
|
146
|
+
else:
|
147
|
+
idx_ls = keys
|
148
|
+
return idx_ls
|
@@ -9,8 +9,12 @@ def eval_references(var, node_s, order, converter_for_ref=None, converter_for_re
|
|
9
9
|
var:
|
10
10
|
node_s: <dict> 引用节点,parse_references() 返回的结果
|
11
11
|
order: <list of name> 计算顺序,cal_relation_between_references() 返回的结果
|
12
|
-
converter_for_ref: <callable>
|
13
|
-
形如 def(idx, v): ... 的函数,其中 idx 是被引用节点的名字,v
|
12
|
+
converter_for_ref: <callable> 对被引用节点施加何种处理
|
13
|
+
形如 def(idx, v): ... 的函数,其中 idx 是被引用节点的名字,v是其值,
|
14
|
+
返回的结果将替换掉被引用节点中原来的值。
|
15
|
+
注意:
|
16
|
+
- 处理后得到的结果将替换掉原引用节点的值。(重要所以说两次)
|
17
|
+
- 当同一节点被多次引用时,仅会被处理、替换一次。
|
14
18
|
converter_for_res: <callable> 对计算结果施加何种处理
|
15
19
|
形如 def(idx, v): ... 的函数,其中 idx 是节点的名字,v是计算结果
|
16
20
|
"""
|
@@ -18,13 +22,18 @@ def eval_references(var, node_s, order, converter_for_ref=None, converter_for_re
|
|
18
22
|
assert converter_for_ref is None or callable(converter_for_ref)
|
19
23
|
assert converter_for_res is None or callable(converter_for_res)
|
20
24
|
|
25
|
+
processed_ref_nodes = set()
|
26
|
+
|
21
27
|
for name in order:
|
22
28
|
details = node_s[name]
|
23
29
|
# 获取依赖值
|
24
|
-
for k,
|
25
|
-
v_new = get_value_by_name(var=var, name=
|
26
|
-
if converter_for_ref is not None:
|
27
|
-
v_new = converter_for_ref(
|
30
|
+
for k, idx in details["paras"].items():
|
31
|
+
v_new = get_value_by_name(var=var, name=idx)
|
32
|
+
if converter_for_ref is not None and idx not in processed_ref_nodes:
|
33
|
+
v_new = converter_for_ref(idx, v_new)
|
34
|
+
# 赋值
|
35
|
+
set_value_by_name(var=var, name=idx, value=v_new, b_force=False)
|
36
|
+
processed_ref_nodes.add(idx)
|
28
37
|
details["paras"][k] = v_new
|
29
38
|
# 计算
|
30
39
|
res = eval(details["expression"], details["paras"])
|
@@ -57,7 +57,12 @@ class Registry:
|
|
57
57
|
__new__函数返回的实例,将作为self参数被传入到__init__函数。
|
58
58
|
如果__new__函数返回一个已经存在的实例(不论是哪个类的),__init__还是会被调用的,所以要特别注意__init__中对变量的赋值。
|
59
59
|
"""
|
60
|
-
|
60
|
+
if "uid" in kwargs:
|
61
|
+
uid = kwargs["uid"]
|
62
|
+
else:
|
63
|
+
while cls.__counter in cls.__instances:
|
64
|
+
cls.__counter += 1
|
65
|
+
uid = cls.__counter
|
61
66
|
|
62
67
|
# 获取实例
|
63
68
|
if uid in cls.__instances:
|
@@ -72,8 +77,13 @@ class Registry:
|
|
72
77
|
"""
|
73
78
|
参数:
|
74
79
|
uid: <hashable> 实例的唯一标识符
|
75
|
-
|
76
|
-
|
80
|
+
- 不设置。新建一个实例,并自动分配一个整数作为 uid(一般是此时已有实例的数量-1),
|
81
|
+
并将该实例记录到类变量 instances_of_Registry 中。
|
82
|
+
- 设置为 None。新建一个实例,但不记录到类变量 instances_of_Registry 中。
|
83
|
+
- 设置为其他值。根据 uid 到类变量 instances_of_Registry 的已有实例中寻找相同的实例,
|
84
|
+
若命中则返回已有实例,若无则以该 uid 新建一个实例并添加到 instances_of_Registry 中。
|
85
|
+
(使用该特性可以构造单例模式)
|
86
|
+
默认为不设置。
|
77
87
|
"""
|
78
88
|
try:
|
79
89
|
getattr(self, "uid")
|
@@ -87,8 +97,8 @@ class Registry:
|
|
87
97
|
self._path_to_collect = []
|
88
98
|
self._item_to_add = []
|
89
99
|
# 记录到 __instances 中
|
90
|
-
|
91
|
-
|
100
|
+
if self.uid is not None:
|
101
|
+
Registry.__instances[self.uid] = self
|
92
102
|
|
93
103
|
def add(self, obj, name=None, b_force=False, b_execute_now=True):
|
94
104
|
"""
|
@@ -140,7 +150,7 @@ class Registry:
|
|
140
150
|
b_force=True)
|
141
151
|
# check
|
142
152
|
if not b_force:
|
143
|
-
inc_node_nums = fndl.count_leaf_node_nums(var=obj) if isinstance(obj, (list, dict)) else 1 #
|
153
|
+
inc_node_nums = fndl.count_leaf_node_nums(var=obj) if isinstance(obj, (list, dict)) else 1 # 应该增加的节点数量
|
144
154
|
if fndl.count_leaf_node_nums(var=temp) != fndl.count_leaf_node_nums(var=self.database) + inc_node_nums:
|
145
155
|
# print(f'registration failed, name {name} may be a conflict with an '
|
146
156
|
# f'existing member in {[i for i, j in fndl.get_nodes(var=self.database)]}')
|
@@ -149,13 +159,15 @@ class Registry:
|
|
149
159
|
self.database = temp
|
150
160
|
return True
|
151
161
|
|
152
|
-
def get(self, name, **kwargs):
|
162
|
+
def get(self, name, b_pop=False, **kwargs):
|
153
163
|
"""
|
154
164
|
获取
|
155
165
|
|
156
166
|
参数:
|
157
|
-
name
|
158
|
-
|
167
|
+
name: <str> 成员名称
|
168
|
+
b_pop: <boolean> 取值的同时移除该成员
|
169
|
+
默认为 False
|
170
|
+
default: 默认值
|
159
171
|
找不到时,若无默认值则报错,否则将返回默认值
|
160
172
|
"""
|
161
173
|
# 加载待注册成员
|
@@ -168,46 +180,7 @@ class Registry:
|
|
168
180
|
self.collect_from_paths(**i)
|
169
181
|
self._path_to_collect.clear()
|
170
182
|
|
171
|
-
|
172
|
-
return fndl.get_value_by_name(var=self.database, name=name)
|
173
|
-
except:
|
174
|
-
if "default" in kwargs:
|
175
|
-
return kwargs["default"]
|
176
|
-
else:
|
177
|
-
raise AssertionError(f'element {name} not exists')
|
178
|
-
|
179
|
-
def pop(self, name, **kwargs):
|
180
|
-
"""
|
181
|
-
弹出
|
182
|
-
|
183
|
-
参数:
|
184
|
-
name: <str> 成员名称
|
185
|
-
名称一定要准确,不能含有模糊的 | 字符
|
186
|
-
default: 默认值
|
187
|
-
找不到时,若无默认值则报错,否则将返回默认值
|
188
|
-
"""
|
189
|
-
assert "|" not in name, \
|
190
|
-
f'to pop up a specific member needs to give the exact name, ' \
|
191
|
-
f'does not support the "|" character with automatic deduction, invalid name: {name}, ' \
|
192
|
-
f'what you probably want to pop is {name.replace("|", ":")}'
|
193
|
-
res, b_found = None, False
|
194
|
-
|
195
|
-
def func(_, idx, value):
|
196
|
-
nonlocal res, b_found
|
197
|
-
if res is None and idx == name:
|
198
|
-
res, b_found = value, True
|
199
|
-
return True
|
200
|
-
else:
|
201
|
-
return False
|
202
|
-
|
203
|
-
fndl.traverse(var=self.database, match_cond=func, action_mode="remove", b_use_name_as_idx=True)
|
204
|
-
if b_found:
|
205
|
-
return res
|
206
|
-
else:
|
207
|
-
if "default" in kwargs:
|
208
|
-
return kwargs["default"]
|
209
|
-
else:
|
210
|
-
raise AssertionError(f'element {name} not exists')
|
183
|
+
return fndl.get_value_by_name(var=self.database, name=name, b_pop=b_pop, **kwargs)
|
211
184
|
|
212
185
|
def clear(self):
|
213
186
|
self.database.clear()
|
@@ -236,7 +209,7 @@ class Registry:
|
|
236
209
|
|
237
210
|
return wrapper
|
238
211
|
|
239
|
-
# --------------------
|
212
|
+
# -------------------- 通过路径添加 --------------------- #
|
240
213
|
|
241
214
|
def collect_from_paths(self, path_ls=None, path_ls_to_exclude=None, b_execute_now=False):
|
242
215
|
"""
|
@@ -298,5 +271,11 @@ class Registry:
|
|
298
271
|
if temp is not None:
|
299
272
|
self.database = temp.database
|
300
273
|
|
274
|
+
# -------------------- 其他 --------------------- #
|
275
|
+
|
276
|
+
@property
|
277
|
+
def instances_of_Registry(self):
|
278
|
+
return dict(Registry.__instances)
|
279
|
+
|
301
280
|
|
302
281
|
UNIFIED_REGISTRY = Registry(uid="UNIFIED_REGISTRY")
|
@@ -2,7 +2,7 @@ import random
|
|
2
2
|
import torch
|
3
3
|
import numpy as np
|
4
4
|
import copy
|
5
|
-
from kevin_toolbox.computer_science.algorithm.for_nested_dict_list import set_value_by_name, get_value_by_name
|
5
|
+
from kevin_toolbox.computer_science.algorithm.for_nested_dict_list import set_value_by_name, get_value_by_name, traverse
|
6
6
|
|
7
7
|
|
8
8
|
class Strategy_Manager:
|
@@ -20,9 +20,9 @@ class Strategy_Manager:
|
|
20
20
|
":lr": {
|
21
21
|
# 当 key 满足 trigger_value 时,将 ":lr" 指向的部分替换为 value
|
22
22
|
0: 0.1,
|
23
|
-
# 如果是以 <
|
23
|
+
# 如果是以 <eval> 为开头的字符串,则视为函数并将 value 解释为函数执行后的结果
|
24
24
|
# 函数中 t, p 参数将被分别传入 trigger_value 和 para_value
|
25
|
-
"<
|
25
|
+
"<eval>lambda t: t%100==0": "<eval>lambda p, t: p*0.1",
|
26
26
|
},
|
27
27
|
},
|
28
28
|
override=False,
|
@@ -93,10 +93,11 @@ class Strategy_Manager:
|
|
93
93
|
300: {
|
94
94
|
":ratio_ls@1": 1e-5,
|
95
95
|
}, # 在 epoch=300 时,将 ratio_ls[1] 设置为 1e-5
|
96
|
-
"<
|
97
|
-
":lr": "<
|
98
|
-
}, # 当键为 string 且 开头带有 <
|
99
|
-
#
|
96
|
+
"<eval>lambda t: t%100==0": {
|
97
|
+
":lr": "<eval>lambda p, t: p*0.1",
|
98
|
+
}, # 当键为 string 且 开头带有 <eval> 标记时候,将使用 eval() 函数读取该字符串,
|
99
|
+
# 当键为 callable 的函数时,在匹配过程中向该函数输入触发值 t 和当前元素的值 p,
|
100
|
+
# 当函数返回True视为匹配成功。
|
100
101
|
# 比如上式表示的是:每经过 100 epoch,也就是当 epoch%100==0 时,lr 在原来的基础上乘上0.1。
|
101
102
|
# 函数匹配的的优先级低于直接的值匹配。
|
102
103
|
...
|
@@ -109,7 +110,7 @@ class Strategy_Manager:
|
|
109
110
|
"__trigger_name": "epoch",
|
110
111
|
":lr": {
|
111
112
|
0: 0.1,
|
112
|
-
"<
|
113
|
+
"<eval>lambda t: t%100==0": "<eval>lambda p, t: p*0.1",
|
113
114
|
},
|
114
115
|
":ratio_ls": {
|
115
116
|
0: [1e-3, 1e-2],
|
@@ -146,6 +147,21 @@ class Strategy_Manager:
|
|
146
147
|
temp[t_key][p_key] = strategy[p_key][t_key]
|
147
148
|
strategy = temp
|
148
149
|
|
150
|
+
def deal_eval_str(x):
|
151
|
+
return eval(x[6:]) if isinstance(x, (str,)) and x.startswith("<eval>") else x
|
152
|
+
|
153
|
+
# 使用 eval() 读取带 "<eval>" 标签的键or值
|
154
|
+
def converter(_, value):
|
155
|
+
if isinstance(value, (dict,)):
|
156
|
+
res = {deal_eval_str(k): deal_eval_str(v) for k, v in value.items()}
|
157
|
+
else:
|
158
|
+
res = deal_eval_str(value)
|
159
|
+
return res
|
160
|
+
|
161
|
+
strategy = traverse(var=[strategy], match_cond=lambda _, __, value: isinstance(value, (dict, str,)),
|
162
|
+
action_mode="replace", converter=converter, traversal_mode="dfs_post_order",
|
163
|
+
b_use_name_as_idx=False, b_traverse_matched_element=True)[0]
|
164
|
+
|
149
165
|
# 将策略添加到 database
|
150
166
|
old_strategy = self.database.get(_trigger_name, dict())
|
151
167
|
for t_key, item in strategy.items():
|
@@ -187,7 +203,7 @@ class Strategy_Manager:
|
|
187
203
|
action_s = dict() # {p_name: p_value, ...}
|
188
204
|
# 使用匹配函数
|
189
205
|
for key, p_s in strategy.items():
|
190
|
-
if
|
206
|
+
if callable(key) and key(t_value):
|
191
207
|
action_s.update({i: j for i, j in p_s.items() if i not in action_s})
|
192
208
|
# 直接匹配
|
193
209
|
if t_value in strategy:
|
@@ -200,9 +216,9 @@ class Strategy_Manager:
|
|
200
216
|
for t_name, action_s in sorted(action_s_all.items(), key=lambda x: x[0]):
|
201
217
|
t_value = trigger_state[t_name]
|
202
218
|
for name, p_value in copy.deepcopy(action_s):
|
203
|
-
if
|
219
|
+
if callable(p_value):
|
204
220
|
raw_value = get_value_by_name(var=var, name=name)
|
205
|
-
p_value =
|
221
|
+
p_value = p_value(raw_value, t_value)
|
206
222
|
set_value_by_name(var=var, name=name, value=p_value)
|
207
223
|
|
208
224
|
return var, action_s_all
|
@@ -217,7 +233,7 @@ if __name__ == '__main__':
|
|
217
233
|
"__trigger_name": "epoch",
|
218
234
|
":lr": {
|
219
235
|
# 0: 0.1,
|
220
|
-
"<
|
236
|
+
"<eval>lambda t: t%100==0": "<eval>lambda p, t: p*0.1",
|
221
237
|
},
|
222
238
|
})
|
223
239
|
sm.add(strategy={
|
@@ -230,8 +246,8 @@ if __name__ == '__main__':
|
|
230
246
|
300: {
|
231
247
|
":ratio_ls@1": 1e-5,
|
232
248
|
},
|
233
|
-
# "<
|
234
|
-
# ":lr": "<
|
249
|
+
# "<eval>lambda t: t%100==0": {
|
250
|
+
# ":lr": "<eval>lambda p, t: p*0.1",
|
235
251
|
# },
|
236
252
|
}, override=False)
|
237
253
|
|