Repository: milvus-io/milvus-lite Branch: main Commit: 9ac839f1608d Files: 185 Total size: 2.9 MB Directory structure: gitextract_0fobvlb0/ ├── .clang-format ├── .gitignore ├── .gitmodules ├── .pylintrc ├── CMakeLists.txt ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── ci/ │ ├── e2e.groovy │ ├── entrypoint.sh │ ├── get_author_email.sh │ ├── nightly.groovy │ ├── rte-build.yaml │ ├── set_docker_mirror.sh │ └── test.sh ├── cmake/ │ ├── Findantlr4-runtime.cmake │ └── milvus-storage.cmake ├── conanfile.py ├── examples/ │ ├── bfloat16_example.py │ ├── binary_example.py │ ├── bm25.py │ ├── customize_schema.py │ ├── customize_schema_auto_id.py │ ├── dynamic_field.py │ ├── example_group_by.py │ ├── float16_example.py │ ├── fuzzy_match.py │ ├── hello_hybrid_bm25.py │ ├── hello_milvus.py │ ├── hello_milvus_array.py │ ├── hello_milvus_delete.py │ ├── index.py │ ├── non_ascii_encode.py │ ├── simple.py │ ├── simple_auto_id.py │ └── sparse.py ├── python/ │ ├── pyproject.toml │ ├── requirements.txt │ ├── setup.py │ └── src/ │ └── milvus_lite/ │ ├── __init__.py │ ├── cmdline.py │ ├── server.py │ └── server_manager.py ├── scripts/ │ ├── Dockerfile.manylinux.aarch64 │ ├── Dockerfile.manylinux.x86_64 │ ├── README.md │ ├── build.sh │ └── build_milvus_lite.sh ├── src/ │ ├── CMakeLists.txt │ ├── common.h │ ├── create_collection_task.cpp │ ├── create_collection_task.h │ ├── create_index_task.cpp │ ├── create_index_task.h │ ├── delete_task.cpp │ ├── delete_task.h │ ├── function/ │ │ ├── bm25_function.cpp │ │ ├── bm25_function.h │ │ ├── function.h │ │ ├── function_executor.cpp │ │ ├── function_executor.h │ │ └── function_util.h │ ├── hybrid_search_task.cpp │ ├── hybrid_search_task.h │ ├── index.cpp │ ├── index.h │ ├── insert_task.cpp │ ├── insert_task.h │ ├── milvus_id.hpp │ ├── milvus_local.cpp │ ├── milvus_local.h │ ├── milvus_proxy.cpp │ ├── milvus_proxy.h │ ├── milvus_service_impl.cpp │ ├── milvus_service_impl.h │ ├── parser/ │ │ ├── Plan.g4 │ │ ├── antlr/ │ │ │ ├── PlanBaseVisitor.cpp │ │ │ ├── PlanBaseVisitor.h │ │ │ ├── PlanLexer.cpp │ │ │ ├── PlanLexer.h │ │ │ ├── PlanParser.cpp │ │ │ ├── PlanParser.h │ │ │ ├── PlanVisitor.cpp │ │ │ └── PlanVisitor.h │ │ ├── parser.cc │ │ ├── parser.h │ │ └── utils.h │ ├── query_task.cpp │ ├── query_task.h │ ├── re_scorer.cpp │ ├── re_scorer.h │ ├── retrieve_result.h │ ├── schema_util.cpp │ ├── schema_util.h │ ├── search_result.h │ ├── search_task.cpp │ ├── search_task.h │ ├── segcore_wrapper.cpp │ ├── segcore_wrapper.h │ ├── server.cpp │ ├── status.h │ ├── storage/ │ │ ├── bm25_stats.cpp │ │ ├── bm25_stats.h │ │ ├── collection_data.cpp │ │ ├── collection_data.h │ │ ├── collection_meta.cpp │ │ ├── collection_meta.h │ │ ├── storage.cpp │ │ └── storage.h │ ├── string_util.hpp │ ├── timer.cpp │ ├── timer.h │ ├── type.h │ ├── unittest/ │ │ ├── CMakeLists.txt │ │ ├── bm25_function_test.cpp │ │ ├── grpc_server_test.cpp │ │ ├── milvus_local_test.cpp │ │ ├── milvus_proxy_test.cpp │ │ ├── run_examples.py │ │ ├── storage_test.cpp │ │ ├── test_util.cpp │ │ └── test_util.h │ ├── upsert_task.cpp │ └── upsert_task.h ├── tests/ │ ├── base/ │ │ ├── client_base.py │ │ ├── collection_wrapper.py │ │ ├── connections_wrapper.py │ │ ├── database_wrapper.py │ │ ├── high_level_api_wrapper.py │ │ ├── index_wrapper.py │ │ ├── partition_wrapper.py │ │ ├── schema_wrapper.py │ │ └── utility_wrapper.py │ ├── check/ │ │ ├── func_check.py │ │ └── param_check.py │ ├── common/ │ │ ├── bulk_insert_data.py │ │ ├── code_mapping.py │ │ ├── common_func.py │ │ ├── common_type.py │ │ ├── constants.py │ │ ├── cus_resource_opts.py │ │ ├── milvus_sys.py │ │ └── minio_comm.py │ ├── config/ │ │ └── log_config.py │ ├── conftest.py │ ├── customize/ │ │ ├── README.md │ │ ├── milvus_operator.py │ │ ├── template/ │ │ │ ├── default.yaml │ │ │ └── minimum.yaml │ │ ├── test_customize_segment_size.py │ │ └── test_simd_compat.py │ ├── data/ │ │ └── train_embeddings.csv │ ├── milvus_lite/ │ │ ├── test_milvus_lite_close.py │ │ ├── test_milvus_lite_collection.py │ │ ├── test_milvus_lite_delete.py │ │ ├── test_milvus_lite_index.py │ │ ├── test_milvus_lite_init.py │ │ ├── test_milvus_lite_insert.py │ │ ├── test_milvus_lite_migrate.py │ │ ├── test_milvus_lite_query.py │ │ ├── test_milvus_lite_search.py │ │ ├── test_milvus_lite_sparse.py │ │ └── test_milvus_lite_stability.py │ ├── pytest.ini │ ├── requirements.txt │ ├── run.sh │ ├── test_bm25.py │ ├── test_delete.py │ ├── test_dump_tool.py │ ├── test_hybrid_search.py │ ├── test_query.py │ ├── test_schema.py │ ├── test_search.py │ ├── test_sparse.py │ ├── testcases/ │ │ └── test_collection.py │ └── utils/ │ ├── api_request.py │ ├── thread_util.py │ ├── util_common.py │ ├── util_k8s.py │ ├── util_log.py │ ├── util_pymilvus.py │ └── wrapper.py └── thirdparty/ ├── knowhere-android.patch ├── knowhere.patch └── milvus.patch ================================================ FILE CONTENTS ================================================ ================================================ FILE: .clang-format ================================================ # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. --- BasedOnStyle: Google DerivePointerAlignment: false ColumnLimit: 80 IndentWidth: 4 AccessModifierOffset: -3 AlwaysBreakAfterReturnType: All AllowShortBlocksOnASingleLine: false AllowShortFunctionsOnASingleLine: false AllowShortIfStatementsOnASingleLine: false AlignTrailingComments: true # Appended Options SortIncludes: false Standard: Latest AlignAfterOpenBracket: Align BinPackParameters: false BinPackArguments: false ReflowComments: false ================================================ FILE: .gitignore ================================================ .DS_Store # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ *.db compile_commands.json # CLion .idea/ cmake-build-debug/ # Claude Code CLAUDE.md ================================================ FILE: .gitmodules ================================================ [submodule "thirdparty/milvus-proto"] path = thirdparty/milvus-proto url = https://github.com/milvus-io/milvus-proto.git [submodule "thirdparty/milvus"] path = thirdparty/milvus url = https://github.com/milvus-io/milvus.git ================================================ FILE: .pylintrc ================================================ # This Pylint rcfile contains a best-effort configuration to uphold the # best-practices and style described in the Google Python style guide: # https://google.github.io/styleguide/pyguide.html # # Its canonical open-source location is: # https://google.github.io/styleguide/pylintrc [MASTER] # Files or directories to be skipped. They should be base names, not paths. ignore=third_party # Files or directories matching the regex patterns are skipped. The regex # matches against base names, not paths. ignore-patterns= # Pickle collected data for later comparisons. persistent=no # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= # Use multiple processes to speed up Pylint. jobs=4 # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. #enable= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=abstract-method, apply-builtin, arguments-differ, attribute-defined-outside-init, backtick, bad-option-value, basestring-builtin, buffer-builtin, c-extension-no-member, consider-using-enumerate, cmp-builtin, cmp-method, coerce-builtin, coerce-method, delslice-method, div-method, duplicate-code, eq-without-hash, execfile-builtin, file-builtin, filter-builtin-not-iterating, fixme, getslice-method, global-statement, hex-method, idiv-method, implicit-str-concat, import-error, import-self, import-star-module-level, inconsistent-return-statements, input-builtin, intern-builtin, invalid-str-codec, locally-disabled, long-builtin, long-suffix, map-builtin-not-iterating, misplaced-comparison-constant, missing-function-docstring, metaclass-assignment, next-method-called, next-method-defined, no-absolute-import, no-else-break, no-else-continue, no-else-raise, no-else-return, no-init, # added no-member, no-name-in-module, no-self-use, nonzero-method, oct-method, old-division, old-ne-operator, old-octal-literal, old-raise-syntax, parameter-unpacking, print-statement, raising-string, range-builtin-not-iterating, raw_input-builtin, rdiv-method, reduce-builtin, relative-import, reload-builtin, round-builtin, setslice-method, signature-differs, standarderror-builtin, suppressed-message, sys-max-int, too-few-public-methods, too-many-ancestors, too-many-arguments, too-many-boolean-expressions, too-many-branches, too-many-instance-attributes, too-many-locals, too-many-nested-blocks, too-many-public-methods, too-many-return-statements, too-many-statements, trailing-newlines, unichr-builtin, unicode-builtin, unnecessary-pass, unpacking-in-except, useless-else-on-loop, useless-object-inheritance, useless-suppression, using-cmp-argument, wrong-import-order, xrange-builtin, zip-builtin-not-iterating, [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html. You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Tells whether to display a full report or only the messages reports=no # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= [BASIC] # Good variable names which should always be accepted, separated by a comma good-names=main,_ # Bad variable names which should always be refused, separated by a comma bad-names= # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Include a hint for the correct naming format with invalid-name include-naming-hint=no # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl # Regular expression matching correct function names function-rgx=^(?:(?PsetUp|tearDown|setUpModule|tearDownModule)|(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$ # Regular expression matching correct variable names variable-rgx=^[a-z][a-z0-9_]*$ # Regular expression matching correct constant names const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ # Regular expression matching correct attribute names attr-rgx=^_{0,2}[a-z][a-z0-9_]*$ # Regular expression matching correct argument names argument-rgx=^[a-z][a-z0-9_]*$ # Regular expression matching correct class attribute names class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ # Regular expression matching correct inline iteration names inlinevar-rgx=^[a-z][a-z0-9_]*$ # Regular expression matching correct class names class-rgx=^_?[A-Z][a-zA-Z0-9]*$ # Regular expression matching correct module names module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$ # Regular expression matching correct method names method-rgx=(?x)^(?:(?P_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P_{0,2}[a-z][a-z0-9_]*))$ # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$ # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=10 [TYPECHECK] # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= [FORMAT] # Maximum number of characters on a single line. max-line-length=120 # TODO(https://github.com/PyCQA/pylint/issues/3352): Direct pylint to exempt # lines made too long by directives to pytype. # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=(?x)( ^\s*(\#\ )??$| ^\s*(from\s+\S+\s+)?import\s+.+$) # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=yes # Maximum number of lines in a module max-module-lines=99999 # String used as indentation unit. The internal Google style guide mandates 2 # spaces. Google's externaly-published style guide says 4, consistent with # PEP 8. Here, we use 2 spaces, for conformity with many open-sourced Google # projects (like TensorFlow). # milvus use 4 spaces indent-string=' ' # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=TODO [STRING] # This flag controls whether inconsistent-quotes generates a warning when the # character used as a quote delimiter is used inconsistently within a module. check-quote-consistency=yes [VARIABLES] # Tells whether we should check for unused import in __init__ files. init-import=no # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_) # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_,_cb # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging,absl.logging,tensorflow.io.logging [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no [SPELLING] # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub, TERMIOS, Bastion, rexec, sets # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant, absl # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__, __new__, setUp # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict, _fields, _replace, _source, _make # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls, class_ # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions=builtins.StandardError, builtins.Exception, builtins.BaseException ================================================ FILE: CMakeLists.txt ================================================ # Copyright (C) 2019-2024 Zilliz. 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 cmake_minimum_required(VERSION 3.20) project(milvus-lite) option(ENABLE_UNIT_TESTS "Enable unit tests" ON) message(STATUS "Enable testing: ${ENABLE_UNIT_TESTS}") option(USE_SYSTEM_DEPS "Build with system dependencies rather than Conan" OFF) list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR}/ ${CMAKE_SOURCE_DIR}/cmake) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(COMPILER_SUPPORTS_CXX17 True) if(LINUX) # When building for Linux, tell the dynamic loader to load shared libraries # from executable's directory. This also prevents CMake from leaking build # paths into the distributed executable. set(CMAKE_BUILD_WITH_INSTALL_RPATH ON) set(CMAKE_INSTALL_RPATH "$ORIGIN") endif() if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0) endif() set(CMAKE_VERBOSE_MAKEFILE ON) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(CMAKE_CXX_FLAGS "-g -Wall -fPIC ${CMAKE_CXX_FLAGS}") else() set(CMAKE_CXX_FLAGS "-O3 -Wall -fPIC ${CMAKE_CXX_FLAGS}") endif() if(CMAKE_LITE_BUILD_TYPE STREQUAL "SHARED") set(LITE_BUILD_TYPE "SHARED") else() set(LITE_BUILD_TYPE "STATIC") endif() if(APPLE) if(DEFINED ENV{HOMEBREW_PREFIX}) message(STATUS "Homebrew prefix from environment: $ENV{HOMEBREW_PREFIX}") set(OMP_INCLUDE $ENV{HOMEBREW_PREFIX}/opt/libomp/include) include_directories($ENV{HOMEBREW_PREFIX}/opt/libomp/include) link_directories($ENV{HOMEBREW_PREFIX}/opt/libomp/lib) else() message(STATUS "Homebrew prefix from environment not found, use default") set(OMP_INCLUDE /opt/homebrew/opt/libomp/include) include_directories(/opt/homebrew/opt/libomp/include) link_directories(/opt/homebrew/opt/libomp/lib) endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lomp") set(OpenMP_C "${CMAKE_C_COMPILER}") set(OpenMP_C_FLAGS "-Xclang -fopenmp -I${OMP_INCLUDE}") set(OpenMP_C_LIB_NAMES "libomp") set(OpenMP_libomp_LIBRARY "omp") set(OpenMP_CXX "${CMAKE_CXX_COMPILER}") set(OpenMP_CXX_FLAGS "-Xclang -fopenmp -I${OMP_INCLUDE}") set(OpenMP_CXX_LIB_NAMES "libomp") set(OpenMP_libomp_LIBRARY "omp") endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(MILVUS_LITE True) include(FetchContent) set(CONAN_LIBS "${CONAN_LIBS};marisa::marisa;") find_package(SQLiteCpp REQUIRED) include_directories(${SQLiteCpp_INCLUDE_DIRS}) find_package(antlr4-runtime REQUIRED) include_directories(${antlr4-cppruntime_INCLUDES}) # note: gRPC needs to be included before protobuf when using system dependencies. find_package(gRPC REQUIRED) include_directories(${gRPC_INCLUDE_DIRS}) find_package(Protobuf REQUIRED) if(USE_SYSTEM_DEPS) set(PROTOBUF_LIBRARIES protobuf::libprotobuf) else() set(PROTOBUF_LIBRARIES protobuf::protobuf) include_directories(${protobuf_INCLUDE_DIRS}) endif() find_package(TBB REQUIRED) include_directories(${TBB_tbb_INCLUDE_DIRS}) find_package(nlohmann_json REQUIRED) include_directories(${nlohmann_json_INCLUDE_DIRS}) find_package(Boost REQUIRED) include_directories(${Boost_INCLUDE_DIRS}) find_package(Libevent REQUIRED) include_directories(${libevent_INCLUDE_DIRS}) find_package(folly REQUIRED) include_directories(${Folly_INCLUDE_DIRS}) find_package(fmt REQUIRED) include_directories(${fmt_INCLUDE_DIRS}) find_package(glog REQUIRED) include_directories(${glog_INCLUDE_DIRS}) find_package(gflags REQUIRED) include_directories(${gflags_INCLUDE_DIRS}) find_package(Arrow REQUIRED) if(USE_SYSTEM_DEPS) find_package(Parquet REQUIRED) set(ARROW_LIBRARIES Arrow::arrow_shared Parquet::parquet_shared) else() set(ARROW_LIBRARIES arrow::arrow) include_directories(${arrow_INCLUDE_DIRS}) endif() find_package(re2 REQUIRED) include_directories(${re2_INCLUDE_DIRS}) link_directories(${re2_LIB_DIRS}) find_package(double-conversion REQUIRED) include_directories(${double-conversion_INCLUDE_DIRS}) find_package(prometheus-cpp REQUIRED) if(USE_SYSTEM_DEPS) set(PROMETHEUS_CPP_TARGETS prometheus-cpp::pull) else() set(PROMETHEUS_CPP_TARGETS prometheus-cpp::prometheus-cpp) include_directories(${prometheus-cpp_INCLUDE_DIRS}) endif() if(USE_SYSTEM_DEPS) find_package(Marisa REQUIRED) set(MARISA_LIBRARIES Marisa::marisa) else() find_package(marisa REQUIRED) set(MARISA_LIBRARIES marisa::marisa) include_directories(${marisa_INCLUDE_DIRS}) endif() find_package(yaml-cpp REQUIRED) include_directories(${yaml-cpp_INCLUDE_DIRS}) find_package(RapidJSON REQUIRED) include_directories(${RapidJSON_INCLUDE_DIRS}) find_package(roaring REQUIRED) include_directories(${roaring_INCLUDE_DIRS}) find_package(prometheus-cpp REQUIRED) include_directories(${prometheus-cpp_INCLUDE_DIRS}) if(NOT USE_SYSTEM_DEPS) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) endif() FetchContent_Declare( simdjson GIT_REPOSITORY https://github.com/simdjson/simdjson.git GIT_TAG v3.1.7) FetchContent_MakeAvailable(simdjson) include_directories(${simdjson_SOURCE_DIR}/include) add_definitions(-DANTLR4CPP_STATIC) add_definitions(-DHAVE_CPP_STDLIB) add_definitions(-DMILVUS_LITE) add_definitions(-DFMT_HEADER_ONLY) if(APPLE) add_definitions("-D_GNU_SOURCE") endif() file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/pb) add_library( milvus_proto STATIC "${CMAKE_SOURCE_DIR}/src/proto/plan.proto" "${CMAKE_SOURCE_DIR}/src/proto/schema.proto" "${CMAKE_SOURCE_DIR}/src/proto/common.proto" "${CMAKE_SOURCE_DIR}/src/proto/segcore.proto" "${CMAKE_SOURCE_DIR}/src/proto/milvus.proto" "${CMAKE_SOURCE_DIR}/src/proto/msg.proto" "${CMAKE_SOURCE_DIR}/src/proto/feder.proto" "${CMAKE_SOURCE_DIR}/src/proto/cgo_msg.proto" "${CMAKE_SOURCE_DIR}/src/proto/index_cgo_msg.proto" "${CMAKE_SOURCE_DIR}/src/proto/rg.proto") set(PROTO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/pb") protobuf_generate( TARGET milvus_proto IMPORT_DIRS "${CMAKE_SOURCE_DIR}/src/proto" PROTOC_OUT_DIR "${PROTO_BINARY_DIR}") add_library(milvus_grpc_service STATIC "${CMAKE_SOURCE_DIR}/src/proto/milvus.proto") target_link_libraries(milvus_grpc_service gRPC::grpc++ milvus_proto) protobuf_generate( TARGET milvus_grpc_service # OUT_VAR PROTO_GENERATED_FILES LANGUAGE grpc GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc PLUGIN "protoc-gen-grpc=\$" IMPORT_DIRS "${CMAKE_SOURCE_DIR}/src/proto" PROTOC_OUT_DIR "${PROTO_BINARY_DIR}") include_directories("${CMAKE_SOURCE_DIR}/src/parser/") include_directories("${CMAKE_SOURCE_DIR}/src/parser/antlr/") include_directories("${CMAKE_BINARY_DIR}/pb") include_directories("${CMAKE_BINARY_DIR}") include_directories(${PROTO_BINARY_DIR}) add_library( parser STATIC "${CMAKE_SOURCE_DIR}/src/parser/parser.cc" "${CMAKE_SOURCE_DIR}/src/parser/antlr/PlanBaseVisitor.cpp" "${CMAKE_SOURCE_DIR}/src/parser/antlr/PlanLexer.cpp" "${CMAKE_SOURCE_DIR}/src/parser/antlr/PlanParser.cpp" "${CMAKE_SOURCE_DIR}/src/parser/antlr/PlanVisitor.cpp") target_link_libraries(parser milvus_proto ${antlr4-cppruntime_LIBRARIES}) include(thirdparty/milvus/internal/core/cmake/BuildUtils.cmake) include(thirdparty/milvus/internal/core/cmake/Utils.cmake) set(WITH_LIGHT ON CACHE BOOL "" FORCE) add_subdirectory(thirdparty/milvus/internal/core/thirdparty/knowhere) include_directories( "${CMAKE_SOURCE_DIR}/thirdparty/milvus/internal/core/thirdparty/") include_directories( "${CMAKE_SOURCE_DIR}/thirdparty/milvus/internal/core/thirdparty/tantivy/tantivy-binding/include/" ) include_directories( "${CMAKE_SOURCE_DIR}/thirdparty/milvus/internal/core/thirdparty/tantivy/") include_directories("${knowhere_SOURCE_DIR}/include") #include(cmake/milvus-storage.cmake) include_directories("${CMAKE_SOURCE_DIR}/thirdparty/milvus/internal/core/src/") add_library( boost_bitset_ext thirdparty/milvus/internal/core/thirdparty/boost_ext/dynamic_bitset_ext.cpp) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(CARGO_CMD cargo build) else() set(CARGO_CMD cargo build --release) endif() if(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(CARGO_CMD cargo build --target aarch64-linux-android) else() set(CARGO_CMD cargo build --target aarch64-linux-android --release) endif() endif() set(HOME_VAR $ENV{HOME}) add_custom_command( OUTPUT ls_cargo COMMENT "ls cargo" COMMAND ls ${HOME_VAR}/.cargo/bin/) add_custom_target(ls_cargo_target DEPENDS ls_cargo) add_custom_command( OUTPUT compile_tantivy COMMENT "Compiling tantivy binding" COMMAND CARGO_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} MACOSX_DEPLOYMENT_TARGET=11.0 ${CARGO_CMD} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/thirdparty/milvus/internal/core/thirdparty/tantivy/tantivy-binding DEPENDS ls_cargo_target) add_custom_target(tantivy_binding_target DEPENDS compile_tantivy) add_library(tantivy_binding STATIC IMPORTED) string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER) set(IMPORT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE_LOWER}/libtantivy_binding.a") if(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") set(IMPORT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/aarch64-linux-android/${CMAKE_BUILD_TYPE_LOWER}/libtantivy_binding.a" ) endif() set_target_properties( tantivy_binding PROPERTIES IMPORTED_GLOBAL TRUE IMPORTED_LOCATION "${IMPORT_LOCATION}" INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/thirdparty/milvus/internal/core/thirdparty/tantivy/tantivy-binding/include/" ) add_dependencies(tantivy_binding tantivy_binding_target) execute_process( COMMAND git diff --quiet WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/thirdparty/milvus RESULT_VARIABLE CHECK_RESULT) if(${CHECK_RESULT} EQUAL 0) message("Apply milvus patch...") execute_process( COMMAND git apply ${CMAKE_SOURCE_DIR}/thirdparty/milvus.patch WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/thirdparty/milvus OUTPUT_VARIABLE result) else() message("Milvus not need applying patch...") endif() set(MILVUS_ENGINE_SRC "${CMAKE_SOURCE_DIR}/thirdparty/milvus/internal/core/src") add_subdirectory(thirdparty/milvus/internal/core/src/log) add_subdirectory(thirdparty/milvus/internal/core/src/config) add_subdirectory(thirdparty/milvus/internal/core/src/common) add_subdirectory(thirdparty/milvus/internal/core/src/storage) add_subdirectory(thirdparty/milvus/internal/core/src/query) add_subdirectory(thirdparty/milvus/internal/core/src/exec) add_subdirectory(thirdparty/milvus/internal/core/src/index) add_subdirectory(thirdparty/milvus/internal/core/src/segcore) add_subdirectory(thirdparty/milvus/internal/core/src/bitset) add_subdirectory(thirdparty/milvus/internal/core/src/indexbuilder) add_subdirectory(thirdparty/milvus/internal/core/src/futures) add_subdirectory(thirdparty/milvus/internal/core/src/monitor) add_library(milvus_core STATIC $ $ $ $ $ $ $ $ $ $ $ $ ) target_link_libraries( milvus_core PUBLIC milvus_proto ${PROMETHEUS_CPP_TARGET} knowhere ) if(ENABLE_UNIT_TESTS) include(CTest) enable_testing() endif() add_subdirectory(src) find_program(MEMORYCHECK_COMMAND NAMES valgrind) set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --track-origins=yes --leak-check=full --show-leak-kinds=all" ) ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing Guide Welcome contributors! This guide will help you get started with contributing to Milvus-lite. Please always find the latest version of this guide at [CONTRIBUTING.md:main](https://github.com/milvus-io/milvus-lite/blob/main/CONTRIBUTING.md) ## How to set up the development environment The Milvus-lite project is written in Python. To set up the development environment, you need to install Python 3.8 or later. We recommend that you use a virtual environment to install the dependencies, although the Milvus-lite project requires a very small number of external packages. The main dependencies for build Milvus-lite is to install dependencies of milvis, so generally you could refer to Milvus's [install_deps.sh](https://github.com/milvus-io/milvus/blob/master/scripts/install_deps.sh) as a reference. Please note, you should follow the related branch of Milvus. For example, if you want to build Milvus-lite with Milvus 2.4.0, you should checkout the branch of Milvus 2.4.0. For python3 build wheel, we use the build module and requires newer version of setuptools. So you should install the latest version of setuptools and build. ## Build Milvus-lite ```bash python3 setup.py bdist_wheel ``` After build, you shoud have wheel package under dist folder. ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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. ================================================ FILE: README.md ================================================

A lightweight version of Milvus

# Introduction Milvus Lite is the lightweight version of [Milvus](https://github.com/milvus-io/milvus), a high-performance vector database that powers AI applications with vector similarity search. This repo contains the core components of Milvus Lite. With Milvus Lite, you can start building an AI application with vector similarity search within minutes! Milvus Lite is good for running in the following environment: - Jupyter Notebook / Google Colab - Laptops - Edge Devices Milvus Lite can be imported into your Python application, providing the core vector search functionality of Milvus. Milvus Lite is already included in the [Python SDK of Milvus](https://github.com/milvus-io/pymilvus). To use it, you just need `pip install pymilvus`. Milvus Lite uses the same API as Milvus Standalone and Distributed, providing a consistent experience across environments. Develop your GenAI applications once and run them anywhere: on a laptop or Jupyter Notebook with Milvus Lite, in a Docker container with Milvus Standalone, or on a K8s cluster with Milvus Distributed for large-scale production.
Milvus Lite is only suitable for small scale prototyping (usually less than a million vectors) or edge devices. For large scale production, we recommend using [Milvus Standalone](https://milvus.io/docs/install-overview.md#Milvus-Standalone) or [Milvus Distributed](https://milvus.io/docs/install-overview.md#Milvus-Distributed). You can also consider the fully-managed Milvus on [Zilliz Cloud](https://zilliz.com/cloud). # Requirements Milvus Lite currently supports the following environments: - Ubuntu >= 20.04 (x86_64 and arm64) - MacOS >= 11.0 (Apple Silicon M1/M2 and x86_64) ***Note:*** Windows is not yet supported. # Installation ```shell pip install -U pymilvus[milvus-lite] ``` We recommend using `pymilvus`. You can `pip install` with `-U` to force update to the latest version and `milvus-lite` will be automatically installed. If you want to explicitly install `milvus-lite` package, or you have installed an older version of `milvus-lite` and would like to update it, you can do `pip install -U milvus-lite`. # Usage In `pymilvus`, specify a local file name as uri parameter of MilvusClient will use Milvus Lite. ```python from pymilvus import MilvusClient client = MilvusClient("./milvus_demo.db") ``` > **_NOTE:_** Note that the same API also applies to Milvus Standalone, Milvus Distributed and Zilliz Cloud, the only difference is to replace local file name to remote server endpoint and credentials, e.g. `client = MilvusClient(uri="http://localhost:19530", token="username:password")` for self-hosted Milvus server. # Examples Following is a simple demo showing how to use Milvus Lite for text search. There are more comprehensive [examples](https://github.com/milvus-io/bootcamp/tree/master/bootcamp/tutorials) for using Milvus Lite to build applications such as [RAG](https://github.com/milvus-io/bootcamp/blob/master/bootcamp/tutorials/quickstart/build_RAG_with_milvus.ipynb), [image search](https://github.com/milvus-io/bootcamp/blob/master/bootcamp/tutorials/quickstart/image_search_with_milvus.ipynb), and using Milvus Lite in popular RAG framework such as [LangChain](https://github.com/milvus-io/bootcamp/blob/master/bootcamp/tutorials/integration/rag_with_milvus_and_langchain.ipynb) and [LlamaIndex](https://github.com/milvus-io/bootcamp/blob/master/bootcamp/tutorials/integration/rag_with_milvus_and_llamaindex.ipynb)! ```python from pymilvus import MilvusClient import numpy as np client = MilvusClient("./milvus_demo.db") client.create_collection( collection_name="demo_collection", dimension=384 # The vectors we will use in this demo has 384 dimensions ) # Text strings to search from. docs = [ "Artificial intelligence was founded as an academic discipline in 1956.", "Alan Turing was the first person to conduct substantial research in AI.", "Born in Maida Vale, London, Turing was raised in southern England.", ] # For illustration, here we use fake vectors with random numbers (384 dimension). vectors = [[ np.random.uniform(-1, 1) for _ in range(384) ] for _ in range(len(docs)) ] data = [ {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"} for i in range(len(vectors)) ] res = client.insert( collection_name="demo_collection", data=data ) # This will exclude any text in "history" subject despite close to the query vector. res = client.search( collection_name="demo_collection", data=[vectors[0]], filter="subject == 'history'", limit=2, output_fields=["text", "subject"], ) print(res) # a query that retrieves all entities matching filter expressions. res = client.query( collection_name="demo_collection", filter="subject == 'history'", output_fields=["text", "subject"], ) print(res) # delete res = client.delete( collection_name="demo_collection", filter="subject == 'history'", ) print(res) ``` # Supported Features ## Functionality Milvus Lite shares the same API as Milvus Standalone, Milvus Distributed and Zilliz Cloud, offering core features including: - Insert/upsert operations - Vector data persistence and collection management - Dense, sparse, and hybrid vector search - Metadata filtering - Multi-vector support ## Index Type Milvus Lite has limited index type support compared to other Milvus deployments: - Prior to version 2.4.11: - Only supports the [FLAT](https://milvus.io/docs/index.md?tab=floating#FLAT) index type - Uses FLAT index regardless of the specified index type in collection creation - Version 2.4.11 and later: - Supports both [FLAT](https://milvus.io/docs/index.md?tab=floating#FLAT) and [IVF_FLAT](https://milvus.io/docs/index.md?tab=floating#IVFFLAT) index types - For IVF_FLAT indexes: - Data size < 100,000: Automatically uses FLAT index internally for better performance - Data size ≥ 100,000: Constructs and uses IVF_FLAT index as specified # Known Limitations Milvus Lite does not support partitions, users/roles/RBAC, alias. To use those features, please choose other Milvus deployment types such as [Standalone](https://milvus.io/docs/install-overview.md#Milvus-Standalone), [Distributed](https://milvus.io/docs/install-overview.md#Milvus-Distributed) or [Zilliz Cloud](https://zilliz.com/cloud) (fully-managed Milvus). # Migrating data from Milvus Lite All data stored in Milvus Lite can be easily exported and loaded into other types of Milvus deployment, such as Milvus Standalone on Docker, Milvus Distributed on K8s, or fully-managed Milvus on [Zilliz Cloud](https://zilliz.com/cloud). Milvus Lite provides a command line tool that can dump data into a json file, which can be imported into self-hosted [Milvus](https://github.com/milvus-io/milvus) or fully-managed Milvus on [Zilliz Cloud](https://zilliz.com/cloud). ```shell pip install -U "pymilvus[bulk_writer]" # The `milvus-lite` command line tool is already included in `milvus-lite` package which is part of "pymilvus", but it also needs some dependencies from `pymilvus[bulk_writer]` for dumping data. milvus-lite dump -h usage: milvus-lite dump [-h] [-d DB_FILE] [-c COLLECTION] [-p PATH] optional arguments: -h, --help show this help message and exit -d DB_FILE, --db-file DB_FILE milvus lite db file -c COLLECTION, --collection COLLECTION collection that need to be dumped -p PATH, --path PATH dump file storage dir ``` The following example dumps all data from `demo_collection` collection that's stored in `./milvus_demo.db` (a user specified local file that persists data for Milvus Lite) To export data: ```shell milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir # ./milvus_demo.db: milvus lite db file # demo_collection: collection that need to be dumped #./data_dir : dump file storage dir ``` You can use the dump file as input to upload data to Zilliz Cloud via [Data Import](https://docs.zilliz.com/docs/data-import), or a self-hosted Milvus server via [Bulk Insert](https://milvus.io/docs/import-data.md). # Contributing If you want to contribute to Milvus Lite, please read the [Contributing Guide](https://github.com/milvus-io/milvus-lite/blob/main/CONTRIBUTING.md) first. # Report a bug For any bug or feature request, please report it by submitting an issue in [milvus-lite](https://github.com/milvus-io/milvus-lite/issues/new/choose) repo. # License Milvus Lite is under the Apache 2.0 license. See the [LICENSE](https://github.com/milvus-io/milvus-lite/blob/main/LICENSE) file for details. ================================================ FILE: ci/e2e.groovy ================================================ #!/usr/bin/env groovy int total_timeout_minutes = 60 * 5 pipeline { options { timestamps() timeout(time: total_timeout_minutes, unit: 'MINUTES') buildDiscarder logRotator(artifactDaysToKeepStr: '30') parallelsAlwaysFailFast() preserveStashes(buildCount: 5) disableConcurrentBuilds(abortPrevious: true) } agent { kubernetes { cloud '4am' inheritFrom 'milvus-e2e-4am' defaultContainer 'main' yamlFile 'ci/rte-build.yaml' customWorkspace '/home/jenkins/agent/workspace' } } environment { DOCKER_BUILDKIT = 1 } stages { stage('Build') { steps { container('main') { script { sh ''' MIRROR_URL="https://docker-nexus-ci.zilliz.cc" ./ci/set_docker_mirror.sh ''' sh ''' docker run --net=host \ -e CONAN_USER_HOME=/root/ -v \$PWD:/root/milvus-lite -v /root/.conan:/root/.conan -w /root/milvus-lite \ milvusdb/milvus-env:lite-main bash ci/entrypoint.sh ''' } } } } stage('arhive Artifacts ') { steps { container('main') { archiveArtifacts artifacts: 'python/dist/*.whl', allowEmptyArchive: true, fingerprint: true, onlyIfSuccessful: true } } } stage('install wheel') { steps { container('pytest') { sh ''' pip install ./python/dist/*.whl ''' } } } stage('Test') { steps { container('pytest') { sh ''' bash ci/test.sh -m e2e ''' } } } } post { unsuccessful { container('jnlp') { dir('ci') { script { def authorEmail = sh(returnStdout: true, script: './get_author_email.sh ') emailext subject: '$DEFAULT_SUBJECT', body: '$DEFAULT_CONTENT', recipientProviders: [developers(), culprits()], replyTo: '$DEFAULT_REPLYTO', to: "${authorEmail},devops@zilliz.com" } } } } } } ================================================ FILE: ci/entrypoint.sh ================================================ #!/bin/bash git config --global --add safe.directory /root/milvus-lite/thirdparty/milvus; cd python python3 -m build --wheel ================================================ FILE: ci/get_author_email.sh ================================================ #!/bin/bash # author emaill will be jenkins's email, when the pr branch is not fast forward compared with master branch # Exit immediately for non zero status set -e function get_author_email(){ email=$(git --no-pager show -s --format=\'%ae\' HEAD ) # Get last commit author when Jenkins submit a merge commit if [[ "${email}" == \'nobody@nowhere\' ]]; then email=$(git --no-pager show -s --format=\'%ae\' HEAD^ ) fi echo ${email} | sed $'s/\'//g' } get_author_email ================================================ FILE: ci/nightly.groovy ================================================ #!/usr/bin/env groovy int total_timeout_minutes = 60 * 5 // When scheduling a job that gets automatically triggered by changes, // you need to include a [cronjob] tag within the commit message. String cron_timezone = 'TZ=Asia/Shanghai' String cron_string = BRANCH_NAME == "2.4" ? "50 3 * * * " : "" pipeline { triggers { cron """${cron_timezone} ${cron_string}""" } options { timestamps() timeout(time: total_timeout_minutes, unit: 'MINUTES') buildDiscarder logRotator(artifactDaysToKeepStr: '30') parallelsAlwaysFailFast() preserveStashes(buildCount: 5) disableConcurrentBuilds(abortPrevious: true) } agent { kubernetes { cloud '4am' inheritFrom 'milvus-e2e-4am' defaultContainer 'main' yamlFile 'ci/rte-build.yaml' customWorkspace '/home/jenkins/agent/workspace' } } environment { DOCKER_BUILDKIT = 1 } stages { stage('Build') { steps { container('main') { script { sh ''' MIRROR_URL="https://docker-nexus-ci.zilliz.cc" ./ci/set_docker_mirror.sh ''' sh ''' docker run --net=host \ -e CONAN_USER_HOME=/root/ -v \$PWD:/root/milvus-lite -v /root/.conan:/root/.conan -w /root/milvus-lite \ milvusdb/milvus-env:lite-manylinux2014 bash ci/entrypoint.sh # the image milvusdb/milvus-env:lite-manylinux2014 is from scripts/Dockerfile ''' } } } } stage('arhive Artifacts ') { steps { container('main') { archiveArtifacts artifacts: 'python/dist/*.whl', allowEmptyArchive: true, fingerprint: true, onlyIfSuccessful: true } } } stage('install wheel') { steps { container('pytest') { sh ''' pip install ./python/dist/*.whl ''' } } } stage('Test') { steps { container('pytest') { sh ''' bash ci/test.sh -m nightly ''' } } } } post { unsuccessful { container('jnlp') { dir('ci') { script { def authorEmail = sh(returnStdout: true, script: './get_author_email.sh ') emailext subject: '$DEFAULT_SUBJECT', body: '$DEFAULT_CONTENT', recipientProviders: [developers(), culprits()], replyTo: '$DEFAULT_REPLYTO', to: "${authorEmail},devops@zilliz.com" } } } } } } ================================================ FILE: ci/rte-build.yaml ================================================ apiVersion: v1 kind: Pod metadata: labels: app: milvus-e2e task: milvus-e2e-build namespace: milvus-ci spec: enableServiceLinks: false nodeSelector: kubernetes.io/hostname: 4am-node16 containers: - name: main image: milvusdb/krte:20211213-dcc15e9 env: - name: DOCKER_IN_DOCKER_ENABLED value: "true" - name: DOCKER_VOLUME_DIRECTORY value: "/mnt/disk/.docker" - name: DOCKER_CLIENT_TIMEOUT value: 240 - name: COMPOSE_HTTP_TIMEOUT value: 240 - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName tty: true securityContext: privileged: true args: ["cat"] resources: limits: cpu: "6" memory: 12Gi requests: cpu: "0.5" memory: 2Gi volumeMounts: - mountPath: /docker-graph name: docker-graph - mountPath: /var/lib/docker name: docker-root - mountPath: /lib/modules name: modules readOnly: true - mountPath: /sys/fs/cgroup name: cgroup - mountPath: /root/.conan name: build-cache - mountPath: /tmp/ci_logs name: ci-logs - name: pytest image: harbor.milvus.io/dockerhub/milvusdb/pytest:20240516-9536e79 resources: limits: cpu: "6" memory: 12Gi requests: cpu: "0.5" memory: 5Gi volumeMounts: - mountPath: /tmp/ci_logs name: ci-logs volumes: - emptyDir: {} name: docker-graph - emptyDir: {} name: docker-root - hostPath: path: /root/.conan type: DirectoryOrCreate name: build-cache - hostPath: path: /lib/modules type: Directory name: modules - hostPath: path: /sys/fs/cgroup type: Directory name: cgroup - name: ci-logs nfs: path: /volume1/ci-logs # path: /volume1/4am-logs server: 172.16.70.249 ================================================ FILE: ci/set_docker_mirror.sh ================================================ #!/usr/bin/env bash # Licensed to the LF AI & Data foundation under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. # Use Internal docker mirror to solve https://www.docker.com/increase-rate-limits # Exit immediately for non zero status set -e # Use nexus as docker mirror registry MIRROR_URL="${MIRROR_URL:-http://nexus-nexus-repository-manager-docker-5000.nexus:5000}" #MIRROR_URL="http://nexus-nexus-repository-manager-docker-5000.nexus:5000" # Add registry mirror config into docker daemon set_daemon_json_file(){ DOCKER_DAEMON_JSON_FILE="/etc/docker/daemon.json" mkdir -p "/etc/docker" echo "{\"registry-mirrors\": [\"${MIRROR_URL}\"],\"insecure-registries\":[\"${MIRROR_URL}\"]}" | tee ${DOCKER_DAEMON_JSON_FILE} } restart_docker () { echo "set-mirror.sh] service docker start" docker ps -aq | xargs -r docker rm -f || true service docker stop || true service docker start while true; do # docker ps -q should only work if the daemon is ready docker info > /dev/null 2>&1 && break if [[ ${WAIT_N} -lt 5 ]]; then WAIT_N=$((WAIT_N+1)) echo " set-mirror.sh] Waiting for Docker to be ready, sleeping for ${WAIT_N} seconds ..." sleep ${WAIT_N} else echo "set-mirror.sh] [SETUP] Reached maximum attempts, not waiting any longer ..." break fi done echo "Show Docker Info With mirror url" docker info } set_mirror(){ set_daemon_json_file restart_docker echo "Success." exit 0 } set_mirror ================================================ FILE: ci/test.sh ================================================ #!/bin/bash # Function to display usage usage() { echo "Usage: $0 -m {nightly|e2e}" exit 1 } # Check if the correct number of arguments is provided if [ $# -ne 2 ]; then usage fi # Initialize variables MODE="" # Parse the command-line arguments while getopts ":m:" opt; do case ${opt} in m ) MODE=$OPTARG ;; \? ) usage ;; esac done # Validate the MODE value if [ "$MODE" != "nightly" ] && [ "$MODE" != "e2e" ]; then usage fi # Install dependencies export PIP_TRUSTED_HOST="nexus-ci.zilliz.cc" export PIP_INDEX_URL="https://nexus-ci.zilliz.cc/repository/pypi-all/simple" export PIP_INDEX="https://nexus-ci.zilliz.cc/repository/pypi-all/pypi" export PIP_FIND_LINKS="https://nexus-ci.zilliz.cc/repository/pypi-all/pypi" python3 -m pip install --no-cache-dir -r tests/requirements.txt --timeout 300 --retries 6 cd tests/milvus_lite # Main logic based on the MODE if [ "$MODE" == "nightly" ]; then echo "Running in nightly mode" pytest -v -m 'not L3' --enable_milvus_local_api ./lite-nighlty.db # nighlty elif [ "$MODE" == "e2e" ]; then echo "Running in e2e mode" pytest -s -v --tags L0 --enable_milvus_local_api lite-e2e.db # pr 合并时 fi ================================================ FILE: cmake/Findantlr4-runtime.cmake ================================================ FIND_PATH(antlr4-cppruntime_INCLUDES antlr4-runtime.h PATH_SUFFIXES antlr4-runtime REQUIRED) FIND_LIBRARY(antlr4-cppruntime_LIBRARIES antlr4-runtime REQUIRED) ================================================ FILE: cmake/milvus-storage.cmake ================================================ # Copyright (C) 2019-2024 Zilliz. 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 file(GLOB_RECURSE SRC_FILES thirdparty/milvus-storage/cpp/src/*.cpp thirdparty/milvus-storage/cpp/src/*.cc) add_library(milvus-storage ${SRC_FILES}) target_include_directories(milvus-storage PUBLIC BEFORE thirdparty/milvus-storage/cpp/include/milvus-storage thirdparty/milvus-storage/cpp/src) target_link_libraries(milvus-storage PUBLIC arrow::arrow Boost::boost protobuf::protobuf glog::glog ) ================================================ FILE: conanfile.py ================================================ from conans import ConanFile from conan.tools.cmake import CMake class MilvusLiteConan(ConanFile): settings = "os", "compiler", "build_type", "arch" requires = ( # gtest "gtest/1.13.0", # glog "xz_utils/5.4.0#a6d90890193dc851fa0d470163271c7a", "zlib/1.2.13#df233e6bed99052f285331b9f54d9070", "glog/0.6.0#d22ebf9111fed68de86b0fa6bf6f9c3f", # protobuf "protobuf/3.21.4#fd372371d994b8585742ca42c12337f9", # folly "fmt/9.1.0#95259249fb7ef8c6b5674a40b00abba3", "folly/2023.10.30.08@milvus/dev#81d7729cd4013a1b708af3340a3b04d9", # antlr "antlr4-cppruntime/4.13.1", # sqlite "sqlitecpp/3.3.1", "onetbb/2021.9.0#4a223ff1b4025d02f31b65aedf5e7f4a", "nlohmann_json/3.11.2#ffb9e9236619f1c883e36662f944345d", "boost/1.82.0#744a17160ebb5838e9115eab4d6d0c06", "openssl/3.1.2#02594c4c0a6e2b4feb3cd15119993597", "libcurl/7.86.0#bbc887fae3341b3cb776c601f814df05", "grpc/1.50.1@milvus/dev#75103960d1cac300cf425ccfccceac08", "prometheus-cpp/1.1.0#ea9b101cb785943adb40ad82eda7856c", "re2/20230301#f8efaf45f98d0193cd0b2ea08b6b4060", # "simdjson/3.7.0", "arrow/15.0.0#0456d916ff25d509e0724c5b219b4c45", "double-conversion/3.2.1#640e35791a4bac95b0545e2f54b7aceb", "marisa/0.2.6#68446854f5a420672d21f21191f8e5af", "zstd/1.5.4#308b8b048f9a3823ce248f9c150cc889", "yaml-cpp/0.7.0#9c87b3998de893cf2e5a08ad09a7a6e0", "libdwarf/20191104#7f56c6c7ccda5fadf5f28351d35d7c01", "rapidjson/cci.20230929#624c0094d741e6a3749d2e44d834b96c", "roaring/3.0.0#25a703f80eda0764a31ef939229e202d", "libevent/2.1.12#4fd19d10d3bed63b3a8952c923454bc0", ) generators = {"cmake", "cmake_find_package"} default_options = { "glog:with_gflags": True, "glog:shared": True, "gtest:build_gmock": False, "onetbb:tbbmalloc": False, "onetbb:tbbproxy": False, "boost:without_locale": True, "boost:without_test": True, "boost:without_stacktrace": True, "fmt:header_only": True, "prometheus-cpp:with_pull": False, "double-conversion:shared": True, "arrow:filesystem_layer": True, "arrow:parquet": True, "arrow:compute": True, "arrow:with_re2": True, "arrow:with_zstd": False, "arrow:with_boost": True, "arrow:with_thrift": True, "arrow:with_jemalloc": True, "arrow:shared": False, "arrow:with_s3": False, "libcurl:with_ssl": False, } def configure(self): if self.settings.os in ["Macos", "Android"]: self.options["arrow"].with_jemalloc = False if self.settings.compiler == "gcc": if self.settings.compiler.libcxx == "libstdc++": raise Exception("This package is only compatible with libstdc++11") def config_options(self): if self.settings.os != "Macos": self.options["onetbb"].tbbbind = False def requirements(self): if self.settings.os not in ["Macos", "Android"]: self.requires("libunwind/1.7.2") if self.settings.os == "Android": self.requires("openblas/0.3.27") def imports(self): self.copy("*.so*", "./lib", "lib") self.copy("*.dylib", "./lib", "lib") def build(self): target = "11.0" self.run("export MACOSX_DEPLOYMENT_TARGET={}".format(target)) ================================================ FILE: examples/bfloat16_example.py ================================================ import random import tensorflow as tf from pymilvus import ( connections, utility, FieldSchema, CollectionSchema, DataType, Collection, ) bf16_index_types = ["FLAT"] default_bf16_index_params = [{"nlist": 128}] def gen_bf16_vectors(num, dim): raw_vectors = [] bf16_vectors = [] for _ in range(num): raw_vector = [random.random() for _ in range(dim)] raw_vectors.append(raw_vector) bf16_vector = tf.cast(raw_vector, dtype=tf.bfloat16).numpy() bf16_vectors.append(bf16_vector) return raw_vectors, bf16_vectors def bf16_vector_search(): connections.connect(uri="./local_test.db") int64_field = FieldSchema(name="int64", dtype=DataType.INT64, is_primary=True, auto_id=True) dim = 128 nb = 3000 vector_field_name = "bfloat16_vector" bf16_vector = FieldSchema(name=vector_field_name, dtype=DataType.BFLOAT16_VECTOR, dim=dim) schema = CollectionSchema(fields=[int64_field, bf16_vector]) if utility.has_collection("hello_milvus_fp16"): utility.drop_collection("hello_milvus_fp16") hello_milvus = Collection("hello_milvus_fp16", schema, consistency_level="Strong") _, vectors = gen_bf16_vectors(nb, dim) hello_milvus.insert([vectors[:6]]) rows = [ {vector_field_name: vectors[6]}, {vector_field_name: vectors[7]}, {vector_field_name: vectors[8]}, {vector_field_name: vectors[9]}, {vector_field_name: vectors[10]}, {vector_field_name: vectors[11]}, ] hello_milvus.insert(rows) hello_milvus.flush() for i, index_type in enumerate(bf16_index_types): index_params = default_bf16_index_params[i] hello_milvus.create_index(vector_field_name, index_params={"index_type": index_type, "params": index_params, "metric_type": "L2"}) hello_milvus.load() print("index_type = ", index_type) res = hello_milvus.search(vectors[0:10], vector_field_name, {"metric_type": "L2"}, limit=1) print(res) hello_milvus.release() hello_milvus.drop_index() hello_milvus.drop() if __name__ == "__main__": bf16_vector_search() ================================================ FILE: examples/binary_example.py ================================================ import random import numpy as np from pymilvus import ( connections, utility, FieldSchema, CollectionSchema, DataType, Collection, ) bin_index_types = ["BIN_FLAT"] default_bin_index_params = [{"nlist": 128}, {"nlist": 128}] def gen_binary_vectors(num, dim): raw_vectors = [] binary_vectors = [] for _ in range(num): raw_vector = [random.randint(0, 1) for _ in range(dim)] raw_vectors.append(raw_vector) # packs a binary-valued array into bits in a unit8 array, and bytes array_of_ints binary_vectors.append(bytes(np.packbits(raw_vector, axis=-1).tolist())) return raw_vectors, binary_vectors def binary_vector_search(): connections.connect(uri='./local_test.db') int64_field = FieldSchema(name="int64", dtype=DataType.INT64, is_primary=True, auto_id=True) dim = 128 nb = 3000 vector_field_name = "binary_vector" binary_vector = FieldSchema(name=vector_field_name, dtype=DataType.BINARY_VECTOR, dim=dim) schema = CollectionSchema(fields=[int64_field, binary_vector], enable_dynamic_field=True) has = utility.has_collection("hello_milvus_bin") if has: hello_milvus = Collection("hello_milvus_bin") hello_milvus.drop() else: hello_milvus = Collection("hello_milvus_bin", schema) _, vectors = gen_binary_vectors(nb, dim) rows = [ {vector_field_name: vectors[0]}, {vector_field_name: vectors[1]}, {vector_field_name: vectors[2]}, {vector_field_name: vectors[3]}, {vector_field_name: vectors[4]}, {vector_field_name: vectors[5]}, ] hello_milvus.insert(rows) hello_milvus.flush() for i, index_type in enumerate(bin_index_types): index_params = default_bin_index_params[i] hello_milvus.create_index(vector_field_name, index_params={"index_type": index_type, "params": index_params, "metric_type": "HAMMING"}) hello_milvus.load() print("index_type = ", index_type) res = hello_milvus.search(vectors[:1], vector_field_name, {"metric_type": "HAMMING"}, limit=1) print("res = ", res) hello_milvus.release() hello_milvus.drop_index() hello_milvus.drop() if __name__ == "__main__": binary_vector_search() ================================================ FILE: examples/bm25.py ================================================ from pymilvus import ( MilvusClient, Function, FunctionType, DataType, ) fmt = "\n=== {:30} ===\n" collection_name = "doc_in_doc_out" milvus_client = MilvusClient(uri="./bm25.db") has_collection = milvus_client.has_collection(collection_name, timeout=5) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema() schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False) schema.add_field( "document_content", DataType.VARCHAR, max_length=9000, enable_analyzer=True ) schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR) bm25_function = Function( name="bm25_fn", input_field_names=["document_content"], output_field_names="sparse_vector", function_type=FunctionType.BM25, ) schema.add_function(bm25_function) index_params = milvus_client.prepare_index_params() index_params.add_index( field_name="sparse_vector", index_name="sparse_inverted_index", index_type="SPARSE_INVERTED_INDEX", metric_type="BM25", params={"bm25_k1": 1.2, "bm25_b": 0.75}, ) ret = milvus_client.create_collection( collection_name, schema=schema, index_params=index_params, consistency_level="Strong", ) print("----") print(ret) print(fmt.format(" all collections ")) print(milvus_client.list_collections()) print(fmt.format(f"schema of collection {collection_name}")) print(milvus_client.describe_collection(collection_name)) rows = [ {"id": 1, "document_content": "hello world"}, {"id": 2, "document_content": "hello milvus"}, {"id": 3, "document_content": "hello zilliz"}, ] print(fmt.format("Start inserting entities")) insert_result = milvus_client.insert(collection_name, rows, progress_bar=True) print(fmt.format("Inserting entities done")) print(insert_result) texts_to_search = ["hello"] # search_params = {"metric_type": "BM25", "params": {"bm25_avgdl": 10.0}} search_params = {"metric_type": "BM25"} print(fmt.format(f"Start search with retrieve several fields.")) result = milvus_client.search( collection_name, texts_to_search, limit=3, output_fields=["document_content"], search_params=search_params, ) print(result) for hits in result: for hit in hits: print(f"hit: {hit}") print(fmt.format("Start query by specifying primary keys")) query_results = milvus_client.query(collection_name, ids=[3]) print(query_results[0]) upsert_ret = milvus_client.upsert( collection_name, {"id": 2, "document_content": "hello milvus again"} ) print(upsert_ret) print(fmt.format("Start query by specifying filtering expression")) query_results = milvus_client.query( collection_name, filter="document_content == 'hello milvus again'" ) for ret in query_results: print(ret) print(f"start to delete by specifying filter in collection {collection_name}") delete_result = milvus_client.delete(collection_name, ids=[3]) print(delete_result) print(fmt.format("Start query by specifying filtering expression")) query_results = milvus_client.query( collection_name, filter="document_content == 'hello zilliz'" ) print(f"Query results after deletion: {query_results}") milvus_client.drop_collection(collection_name) ================================================ FILE: examples/customize_schema.py ================================================ import time import numpy as np from pymilvus import ( MilvusClient, DataType ) fmt = "\n=== {:30} ===\n" dim = 8 collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name, timeout=5) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema(enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=dim) schema.add_field("title", DataType.VARCHAR, max_length=64) index_params = milvus_client.prepare_index_params() index_params.add_index(field_name = "embeddings", metric_type="L2") milvus_client.create_collection(collection_name, schema=schema, index_params=index_params, consistency_level="Strong") print(fmt.format(" all collections ")) print(milvus_client.list_collections()) print(fmt.format(f"schema of collection {collection_name}")) print(milvus_client.describe_collection(collection_name)) rng = np.random.default_rng(seed=19530) rows = [ {"id": 1, "embeddings": rng.random((1, dim))[0], "a": 100, "title": "t1"}, {"id": 2, "embeddings": rng.random((1, dim))[0], "b": 200, "title": "t2"}, {"id": 3, "embeddings": rng.random((1, dim))[0], "c": 300, "title": "t3"}, {"id": 4, "embeddings": rng.random((1, dim))[0], "d": 400, "title": "t4"}, {"id": 5, "embeddings": rng.random((1, dim))[0], "e": 500, "title": "t5"}, {"id": 6, "embeddings": rng.random((1, dim))[0], "f": 600, "title": "t6"}, ] print(fmt.format("Start inserting entities")) insert_result = milvus_client.insert(collection_name, rows) print(fmt.format("Inserting entities done")) print(insert_result) print(fmt.format("Start load collection ")) milvus_client.load_collection(collection_name) print(fmt.format("Start query by specifying primary keys")) query_results = milvus_client.query(collection_name, ids=[2]) print(query_results[0]) print(fmt.format("Start get by specifying primary keys")) get_results = milvus_client.get(collection_name, ids=[2]) print(get_results[0]) print(fmt.format("Start query by specifying filtering expression")) query_results = milvus_client.query(collection_name, filter= "f == 600 or title == 't2'") for ret in query_results: print(ret) rng = np.random.default_rng(seed=19530) vectors_to_search = rng.random((1, dim)) print(fmt.format(f"Start search with retrieve serveral fields.")) result = milvus_client.search(collection_name, vectors_to_search, limit=3, output_fields=["pk", "a", "b"]) for hits in result: for hit in hits: print(f"hit: {hit}") milvus_client.drop_collection(collection_name) ================================================ FILE: examples/customize_schema_auto_id.py ================================================ import numpy as np from pymilvus import ( MilvusClient, DataType ) fmt = "\n=== {:30} ===\n" dim = 8 collection_name = "hello_milvus" milvus_client = MilvusClient(uri='./local_test.db') has_collection = milvus_client.has_collection(collection_name, timeout=5) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema(enable_dynamic_field=True, auto_id=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=dim) schema.add_field("title", DataType.VARCHAR, max_length=64) index_params = milvus_client.prepare_index_params() index_params.add_index(field_name = "embeddings", metric_type="L2") milvus_client.create_collection(collection_name, schema=schema, index_params=index_params, consistency_level="Strong") print(fmt.format(" all collections ")) print(milvus_client.list_collections()) print(fmt.format(f"schema of collection {collection_name}")) print(milvus_client.describe_collection(collection_name)) rng = np.random.default_rng(seed=19530) rows = [ {"embeddings": rng.random((1, dim))[0], "a": 100, "title": "t1"}, {"embeddings": rng.random((1, dim))[0], "b": 200, "title": "t2"}, {"embeddings": rng.random((1, dim))[0], "c": 300, "title": "t3"}, {"embeddings": rng.random((1, dim))[0], "d": 400, "title": "t4"}, {"embeddings": rng.random((1, dim))[0], "e": 500, "title": "t5"}, {"embeddings": rng.random((1, dim))[0], "f": 600, "title": "t6"}, ] print(fmt.format("Start inserting entities")) insert_result = milvus_client.insert(collection_name, rows) print(fmt.format("Inserting entities done")) print(insert_result) print(fmt.format("Start load collection ")) milvus_client.load_collection(collection_name) print(fmt.format("Start query by specifying primary keys")) query_results = milvus_client.query(collection_name, ids=insert_result['ids'][0]) print(query_results[0]) print(fmt.format("Start query by specifying filtering expression")) query_results = milvus_client.query(collection_name, filter= "f == 600 or title == 't2'") for ret in query_results: print(ret) rng = np.random.default_rng(seed=19530) vectors_to_search = rng.random((1, dim)) print(fmt.format(f"Start search with retrieve serveral fields.")) result = milvus_client.search(collection_name, vectors_to_search, limit=3, output_fields=["pk", "a", "b"]) for hits in result: for hit in hits: print(f"hit: {hit}") milvus_client.drop_collection(collection_name) ================================================ FILE: examples/dynamic_field.py ================================================ import time import numpy as np from pymilvus import ( connections, utility, FieldSchema, CollectionSchema, DataType, Collection, ) fmt = "\n=== {:30} ===\n" dim = 8 print(fmt.format("start connecting to Milvus")) connections.connect("default", uri='./local_test.db') has = utility.has_collection("hello_milvus") print(f"Does collection hello_milvus exist in Milvus: {has}") if has: utility.drop_collection("hello_milvus") fields = [ FieldSchema(name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=False, max_length=100), FieldSchema(name="random", dtype=DataType.DOUBLE), FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim) ] schema = CollectionSchema(fields, "hello_milvus is the simplest demo to introduce the APIs", enable_dynamic_field=True) print(fmt.format("Create collection `hello_milvus`")) hello_milvus = Collection("hello_milvus", schema, consistency_level="Strong") ################################################################################ # 3. insert data hello_milvus2 = Collection("hello_milvus") print(fmt.format("Start inserting entities")) rng = np.random.default_rng(seed=19530) rows = [ {"pk": "1", "random": 1.0, "embeddings": rng.random((1, dim))[0], "a": 1}, {"pk": "2", "random": 1.0, "embeddings": rng.random((1, dim))[0], "b": 1}, {"pk": "3", "random": 1.0, "embeddings": rng.random((1, dim))[0], "c": 1}, {"pk": "4", "random": 1.0, "embeddings": rng.random((1, dim))[0], "d": 1}, {"pk": "5", "random": 1.0, "embeddings": rng.random((1, dim))[0], "e": 1}, {"pk": "6", "random": 1.0, "embeddings": rng.random((1, dim))[0], "f": 1}, ] insert_result = hello_milvus.insert(rows) hello_milvus.insert({"pk": "7", "random": 1.0, "embeddings": rng.random((1, dim))[0], "g": 1}) hello_milvus.flush() print(f"Number of entities in Milvus: {hello_milvus.num_entities}") # check the num_entites # 4. create index print(fmt.format("Start Creating index IVF_FLAT")) index = { "index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 128}, } hello_milvus.create_index("embeddings", index) print(fmt.format("Start loading")) hello_milvus.load() # ----------------------------------------------------------------------------- # search based on vector similarity print(fmt.format("Start searching based on vector similarity")) rng = np.random.default_rng(seed=19530) vectors_to_search = rng.random((1, dim)) search_params = { "metric_type": "L2", "params": {"nprobe": 10}, } start_time = time.time() result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3, output_fields=["pk", "embeddings"]) end_time = time.time() for hits in result: for hit in hits: print(f"hit: {hit}") result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3, output_fields=["pk", "embeddings", "$meta"]) for hits in result: for hit in hits: print(f"hit: {hit}") expr = f'pk in ["1" , "2"] || g == 1' print(fmt.format(f"Start query with expr `{expr}`")) result = hello_milvus.query(expr=expr, output_fields=["random", "a", "g"]) for hit in result: print("hit:", hit) ############################################################################### # 7. drop collection print(fmt.format("Drop collection `hello_milvus`")) utility.drop_collection("hello_milvus") ================================================ FILE: examples/example_group_by.py ================================================ from pymilvus import CollectionSchema, FieldSchema, Collection, connections, DataType, Partition, utility import random import numpy as np import secrets def generate_random_hex_string(length): return secrets.token_hex(length // 2) connections.connect("default", uri="milvus.db") dim = 128 clean_exist = False prepare_data = True fields = [ FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True), FieldSchema(name="int64", dtype=DataType.INT64), FieldSchema(name="float", dtype=DataType.FLOAT), FieldSchema(name="float_vector", dtype=DataType.FLOAT_VECTOR, dim=dim), FieldSchema(name="bool", dtype=DataType.BOOL), FieldSchema(name="string", dtype=DataType.VARCHAR, max_length=512) ] schema = CollectionSchema(fields=fields) collection_name = 'test_group_by_' + generate_random_hex_string(24) if clean_exist and utility.has_collection(collection_name): utility.drop_collection(collection_name) collection = Collection(collection_name, schema=schema) nb = 1500 batch_num = 3 vectors = [[random.random() for _ in range(dim)] for _ in range(nb)] if prepare_data: for i in range(batch_num): data = [ [i for i in range(nb * i, nb * (i + 1))], [i % 33 for i in range(nb)], [np.float32(i) for i in range(nb)], vectors, [bool(random.randrange(2)) for i in range(nb)], [str(i % 44) for i in range(nb * i, nb * (i + 1))], ] collection.insert(data) print("insert data done") collection.flush() collection.create_index("float_vector", {"metric_type": "COSINE"}) # create collection and load collection.load() batch_size = 100 search_params = {"metric_type": "COSINE"} result = collection.search(vectors[:3], "float_vector", search_params, limit=batch_size, timeout=600, output_fields=["int64", "string"], group_by_field="string") #set up group_by_field for i in range(len(result)): resultI = result[i] print(f"---result{i}_size:{len(result[i])}-------------------------") for j in range(len(resultI)): print(resultI[j]) print("----------------------------") ================================================ FILE: examples/float16_example.py ================================================ import random import numpy as np from pymilvus import ( connections, utility, FieldSchema, CollectionSchema, DataType, Collection, ) from milvus_lite.server_manager import server_manager_instance fp16_index_types = ["FLAT"] default_fp16_index_params = [{"nlist": 128}] def gen_fp16_vectors(num, dim): raw_vectors = [] fp16_vectors = [] for _ in range(num): raw_vector = [random.random() for _ in range(dim)] raw_vectors.append(raw_vector) fp16_vector = np.array(raw_vector, dtype=np.float16) fp16_vectors.append(fp16_vector) return raw_vectors, fp16_vectors def fp16_vector_search(): connections.connect(uri='./local_test.db') int64_field = FieldSchema(name="int64", dtype=DataType.INT64, is_primary=True, auto_id=True) dim = 128 nb = 3000 vector_field_name = "float16_vector" fp16_vector = FieldSchema(name=vector_field_name, dtype=DataType.FLOAT16_VECTOR, dim=dim) schema = CollectionSchema(fields=[int64_field, fp16_vector]) if utility.has_collection("hello_milvus_fp16"): utility.drop_collection("hello_milvus_fp16") hello_milvus = Collection("hello_milvus_fp16", schema) _, vectors = gen_fp16_vectors(nb, dim) hello_milvus.insert([vectors[:6]]) rows = [ {vector_field_name: vectors[6]}, {vector_field_name: vectors[7]}, {vector_field_name: vectors[8]}, {vector_field_name: vectors[9]}, {vector_field_name: vectors[10]}, {vector_field_name: vectors[11]}, ] hello_milvus.insert(rows) hello_milvus.flush() for i, index_type in enumerate(fp16_index_types): index_params = default_fp16_index_params[i] hello_milvus.create_index(vector_field_name, index_params={"index_type": index_type, "params": index_params, "metric_type": "L2"}) hello_milvus.load() print("index_type = ", index_type) res = hello_milvus.search(vectors[0:10], vector_field_name, {"metric_type": "L2"}, limit=1) print(res) hello_milvus.release() hello_milvus.drop_index() hello_milvus.drop() if __name__ == "__main__": fp16_vector_search() ================================================ FILE: examples/fuzzy_match.py ================================================ from pymilvus import ( connections, FieldSchema, CollectionSchema, DataType, Collection, ) DIMENSION = 8 COLLECTION_NAME = "books2" connections.connect(uri="./local_test.db") fields = [ FieldSchema(name='id', dtype=DataType.INT64, is_primary=True), FieldSchema(name='title', dtype=DataType.VARCHAR, max_length=200), FieldSchema(name='release_year', dtype=DataType.INT64), FieldSchema(name='embeddings', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION), ] schema = CollectionSchema(fields=fields, enable_dynamic_field=True) collection = Collection(name=COLLECTION_NAME, schema=schema) data_rows = [ { "id": 1, "title": "Lord of the Flies", "release_year": 1954, "embeddings": [0.64, 0.44, 0.13, 0.47, 0.74, 0.03, 0.32, 0.6], }, { "id": 2, "title": "The Great Gatsby", "release_year": 1925, "embeddings": [0.9, 0.45, 0.18, 0.43, 0.4, 0.4, 0.7, 0.24], }, { "id": 3, "title": "The Catcher in the Rye", "release_year": 1951, "embeddings": [0.43, 0.57, 0.43, 0.88, 0.84, 0.69, 0.27, 0.98], }, { "id": 4, "title": "Flipped", "release_year": 2010, "embeddings": [0.84, 0.69, 0.27, 0.43, 0.57, 0.43, 0.88, 0.98], }, ] collection.insert(data_rows) collection.create_index( "embeddings", {"index_type": "FLAT", "metric_type": "L2"}) collection.load() # prefix match. res = collection.query(expr='title like "The%"', output_fields=["id", "title"]) print(res) # infix match. res = collection.query(expr='title like "%the%"', output_fields=["id", "title"]) print(res) # postfix match. res = collection.query(expr='title like "%Rye"', output_fields=["id", "title"]) print(res) # _ match any one and only one character. res = collection.query(expr='title like "Flip_ed"', output_fields=["id", "title"]) print(res) # you can create inverted index to accelerate the fuzzy match. collection.release() collection.create_index( "title", {"index_type": "INVERTED"}) collection.load() # _ match any one and only one character. res = collection.query(expr='title like "Flip_ed"', output_fields=["id", "title"]) print(res) ================================================ FILE: examples/hello_hybrid_bm25.py ================================================ # A demo showing hybrid semantic search with dense and full text search with BM25 # using Milvus. # # You can optionally choose to use the BGE-M3 model to embed the text as dense # vectors, or simply use random generated vectors as an example. # # You can also use the BGE CrossEncoder model to rerank the search results. # # Note that the full text search feature is only available in Milvus 2.4.0 or # higher version. Make sure you follow https://milvus.io/docs/install_standalone-docker.md # to set up the latest version of Milvus in your local environment. # To connect to Milvus server, you need the python client library called pymilvus. # To use BGE-M3 model, you need to install the optional `model` module in pymilvus. # You can get them by simply running the following commands: # # pip install pymilvus # pip install pymilvus[model] # If true, use BGE-M3 model to generate dense vectors. # If false, use random numbers to compose dense vectors. use_bge_m3 = False # If true, the search result will be reranked using BGE CrossEncoder model. use_reranker = False # The overall steps are as follows: # 1. embed the text as dense and sparse vectors # 2. setup a Milvus collection to store the dense and sparse vectors # 3. insert the data to Milvus # 4. search and inspect the result! import random import string import numpy as np from pymilvus import ( utility, FieldSchema, CollectionSchema, DataType, Collection, AnnSearchRequest, RRFRanker, connections, Function, FunctionType, ) # 1. prepare a small corpus to search docs = [ "Artificial intelligence was founded as an academic discipline in 1956.", "Alan Turing was the first person to conduct substantial research in AI.", "Born in Maida Vale, London, Turing was raised in southern England.", ] # add some randomly generated texts docs.extend( [ " ".join( "".join(random.choice(string.ascii_lowercase) for _ in range(random.randint(1, 8))) for _ in range(10) ) for _ in range(1000) ] ) query = "Who started AI research?" def random_embedding(texts): rng = np.random.default_rng() return { "dense": np.random.rand(len(texts), 768), } dense_dim = 768 ef = random_embedding if use_bge_m3: # BGE-M3 model is included in the optional `model` module in pymilvus, to # install it, simply run "pip install pymilvus[model]". from pymilvus.model.hybrid import BGEM3EmbeddingFunction ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu") dense_dim = ef.dim["dense"] docs_embeddings = ef(docs) query_embeddings = ef([query]) # 2. setup Milvus collection and index connections.connect("default", uri="milvus.db") # Specify the data schema for the new Collection. fields = [ # Use auto generated id as primary key FieldSchema(name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100), # Store the original text to retrieve based on semantically distance FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512, enable_analyzer=True), # We need a sparse vector field to perform full text search with BM25, # but you don't need to provide data for it when inserting data. FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR), FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim), ] functions = [ Function( name="bm25", function_type=FunctionType.BM25, input_field_names=["text"], output_field_names="sparse_vector", ) ] schema = CollectionSchema(fields, "", functions=functions) col_name = "hybrid_bm25_demo" # Now we can create the new collection with above name and schema. col = Collection(col_name, schema, consistency_level="Strong") # We need to create indices for the vector fields. The indices will be loaded # into memory for efficient search. sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "BM25"} col.create_index("sparse_vector", sparse_index) dense_index = {"index_type": "FLAT", "metric_type": "IP"} col.create_index("dense_vector", dense_index) col.load() # 3. insert text and sparse/dense vector representations into the collection entities = [docs, docs_embeddings["dense"]] col.insert(entities) col.flush() # 4. search and inspect the result! k = 2 # we want to get the top 2 docs closest to the query # Prepare the search requests for both full text search and dense vector search full_text_search_params = {"metric_type": "BM25"} # provide raw text query for full text search, while use the sparse vector as # ANNS field full_text_search_req = AnnSearchRequest([query], "sparse_vector", full_text_search_params, limit=k) dense_search_params = {"metric_type": "IP"} dense_req = AnnSearchRequest( query_embeddings["dense"], "dense_vector", dense_search_params, limit=k ) # Search topK docs based on dense and sparse vectors and rerank with RRF. res = col.hybrid_search( [full_text_search_req, dense_req], rerank=RRFRanker(), limit=k, output_fields=["text"] ) # Currently Milvus only support 1 query in the same hybrid search request, so # we inspect res[0] directly. In future release Milvus will accept batch # hybrid search queries in the same call. res = res[0] if use_reranker: result_texts = [hit.fields["text"] for hit in res] from pymilvus.model.reranker import BGERerankFunction bge_rf = BGERerankFunction(device="cpu") # rerank the results using BGE CrossEncoder model results = bge_rf(query, result_texts, top_k=2) for hit in results: print(f"text: {hit.text} distance {hit.score}") else: for hit in res: print(f'text: {hit.fields["text"]} distance {hit.distance}') # If you used both BGE-M3 and the reranker, you should see the following: # text: Alan Turing was the first person to conduct substantial research in AI. distance 0.9306981017573297 # text: Artificial intelligence was founded as an academic discipline in 1956. distance 0.03217001154515051 # # If you used only BGE-M3, you should see the following: # text: Alan Turing was the first person to conduct substantial research in AI. distance 0.032786883413791656 # text: Artificial intelligence was founded as an academic discipline in 1956. distance 0.016129031777381897 # In this simple example the reranker yields the same result as the embedding based hybrid search, but in more complex # scenarios the reranker can provide more accurate results. # If you used random vectors, the result will be different each time you run the script. # Drop the collection to clean up the data. utility.drop_collection(col_name) ================================================ FILE: examples/hello_milvus.py ================================================ # hello_milvus.py demonstrates the basic operations of PyMilvus, a Python SDK of Milvus. # 1. connect to Milvus # 2. create collection # 3. insert data # 4. create index # 5. search, query, and hybrid search on entities # 6. delete entities by PK # 7. drop collection import time import numpy as np from pymilvus import ( connections, utility, FieldSchema, CollectionSchema, DataType, Collection, ) from pymilvus.client.types import LoadState fmt = "\n=== {:30} ===\n" search_latency_fmt = "search latency = {:.4f}s" num_entities, dim = 3000, 8 ################################################################################# # 1. connect to Milvus # Add a new connection alias `default` for Milvus server in `localhost:19530` # Actually the "default" alias is a buildin in PyMilvus. # If the address of Milvus is the same as `localhost:19530`, you can omit all # parameters and call the method as: `connections.connect()`. # # Note: the `using` parameter of the following methods is default to "default". print(fmt.format("start connecting to Milvus")) connections.connect("default", uri="./local_test.db") # connections.connect("default", host="localhost", port="19530") has = utility.has_collection("hello_milvus") print(f"Does collection hello_milvus exist in Milvus: {has}") ################################################################################# # 2. create collection # We're going to create a collection with 3 fields. # +-+------------+------------+------------------+------------------------------+ # | | field name | field type | other attributes | field description | # +-+------------+------------+------------------+------------------------------+ # |1| "pk" | VarChar | is_primary=True | "primary field" | # | | | | auto_id=False | | # +-+------------+------------+------------------+------------------------------+ # |2| "random" | Double | | "a double field" | # +-+------------+------------+------------------+------------------------------+ # |3|"embeddings"| FloatVector| dim=8 | "float vector with dim 8" | # +-+------------+------------+------------------+------------------------------+ fields = [ FieldSchema(name="random", dtype=DataType.DOUBLE), FieldSchema(name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=False, max_length=100), FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim) ] schema = CollectionSchema(fields, "hello_milvus is the simplest demo to introduce the APIs") print(fmt.format("Create collection `hello_milvus`")) hello_milvus = Collection("hello_milvus", schema, consistency_level="Strong") # works ok hello_milvus = Collection("hello_milvus", schema, consistency_level="Strong") ################################################################################ # 3. insert data # We are going to insert 3000 rows of data into `hello_milvus` # Data to be inserted must be organized in fields. # # The insert() method returns: # - either automatically generated primary keys by Milvus if auto_id=True in the schema; # - or the existing primary key field from the entities if auto_id=False in the schema. print(fmt.format("Start inserting entities")) rng = np.random.default_rng(seed=19530) entities = [ # provide the pk field because `auto_id` is set to False rng.random(num_entities).tolist(), # field random, only supports list [str(i) for i in range(num_entities)], rng.random((num_entities, dim)), # field embeddings, supports numpy.ndarray and list ] insert_result = hello_milvus.insert(entities) # hello_milvus.flush() # print(f"Number of entities in Milvus: {hello_milvus.num_entities}") # check the num_entities ################################################################################ # 4. create index # We are going to create an IVF_FLAT index for hello_milvus collection. # create_index() can only be applied to `FloatVector` and `BinaryVector` fields. print(fmt.format("Start Creating index FLAT")) index = { "index_type": "FLAT", "metric_type": "L2", "params": {"nlist": 128}, } hello_milvus.create_index("embeddings", index) ################################################################################ # 5. search, query, and hybrid search # After data were inserted into Milvus and indexed, you can perform: # - search based on vector similarity # - query based on scalar filtering(boolean, int, etc.) # - hybrid search based on vector similarity and scalar filtering. # # Before conducting a search or a query, you need to load the data in `hello_milvus` into memory. print(fmt.format("Start loading")) hello_milvus.load() assert utility.load_state("hello_milvus") == LoadState.Loaded # ----------------------------------------------------------------------------- # search based on vector similarity print(fmt.format("Start searching based on vector similarity")) vectors_to_search = entities[-1][-2:] search_params = { "metric_type": "L2", "params": {"nprobe": 10}, } start_time = time.time() result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3, output_fields=["random"]) end_time = time.time() for hits in result: for hit in hits: print(f"hit: {hit}, random field: {hit.entity.get('random')}") print(search_latency_fmt.format(end_time - start_time)) # ----------------------------------------------------------------------------- # query based on scalar filtering(boolean, int, etc.) print(fmt.format("Start querying with `random > 0.5`")) start_time = time.time() result = hello_milvus.query(expr="random > 0.5", output_fields=["random", "embeddings"]) end_time = time.time() print(f"query result:\n-{result[0]}") print(search_latency_fmt.format(end_time - start_time)) # ----------------------------------------------------------------------------- # pagination r1 = hello_milvus.query(expr="random > 0.5", limit=4, output_fields=["random"]) r2 = hello_milvus.query(expr="random > 0.5", offset=1, limit=3, output_fields=["random"]) print(f"query pagination(limit=4):\n\t{r1}") print(f"query pagination(offset=1, limit=3):\n\t{r2}") # ----------------------------------------------------------------------------- # hybrid search print(fmt.format("Start hybrid searching with `random > 0.5`")) start_time = time.time() result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3, expr="random > 0.5", output_fields=["random"]) end_time = time.time() for hits in result: for hit in hits: print(f"hit: {hit}, random field: {hit.entity.get('random')}") print(search_latency_fmt.format(end_time - start_time)) ############################################################################### # 6. delete entities by PK # You can delete entities by their PK values using boolean expressions. ids = insert_result.primary_keys expr = f'pk in ["{ids[0]}" , "{ids[1]}"]' print(fmt.format(f"Start deleting with expr `{expr}`")) result = hello_milvus.query(expr=expr, output_fields=["random", "embeddings"]) print(f"query before delete by expr=`{expr}` -> result: \n-{result[0]}\n-{result[1]}\n") hello_milvus.delete(expr) result = hello_milvus.query(expr=expr, output_fields=["random", "embeddings"]) print(f"query after delete by expr=`{expr}` -> result: {result}\n") ############################################################################### # 7. drop collection # Finally, drop the hello_milvus collection print(fmt.format("Drop collection `hello_milvus`")) utility.drop_collection("hello_milvus") ================================================ FILE: examples/hello_milvus_array.py ================================================ from pymilvus import CollectionSchema, FieldSchema, Collection, connections, DataType, Partition, utility import numpy as np import random import pandas as pd # connections.connect() from milvus_lite.server_manager import server_manager_instance connections.connect(uri="./local_test.db") dim = 128 collection_name = "test_array" arr_len = 100 nb = 10 if utility.has_collection(collection_name): utility.drop_collection(collection_name) # create collection pk_field = FieldSchema(name="int64", dtype=DataType.INT64, is_primary=True, description='pk') vector_field = FieldSchema(name="float_vector", dtype=DataType.FLOAT_VECTOR, dim=dim) int8_array = FieldSchema(name="int8_array", dtype=DataType.ARRAY, element_type=DataType.INT8, max_capacity=arr_len) int16_array = FieldSchema(name="int16_array", dtype=DataType.ARRAY, element_type=DataType.INT16, max_capacity=arr_len) int32_array = FieldSchema(name="int32_array", dtype=DataType.ARRAY, element_type=DataType.INT32, max_capacity=arr_len) int64_array = FieldSchema(name="int64_array", dtype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=arr_len) bool_array = FieldSchema(name="bool_array", dtype=DataType.ARRAY, element_type=DataType.BOOL, max_capacity=arr_len) float_array = FieldSchema(name="float_array", dtype=DataType.ARRAY, element_type=DataType.FLOAT, max_capacity=arr_len) double_array = FieldSchema(name="double_array", dtype=DataType.ARRAY, element_type=DataType.DOUBLE, max_capacity=arr_len) string_array = FieldSchema(name="string_array", dtype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=arr_len, max_length=100) fields = [pk_field, vector_field, int8_array, int16_array, int32_array, int64_array, bool_array, float_array, double_array, string_array] schema = CollectionSchema(fields=fields) collection = Collection(collection_name, schema=schema) # insert data pk_value = [i for i in range(nb)] vector_value = [[random.random() for _ in range(dim)] for i in range(nb)] int8_value = [[np.int8(j) for j in range(arr_len)] for i in range(nb)] int16_value = [[np.int16(j) for j in range(arr_len)] for i in range(nb)] int32_value = [[np.int32(j) for j in range(arr_len)] for i in range(nb)] int64_value = [[np.int64(j) for j in range(arr_len)] for i in range(nb)] bool_value = [[np.bool_(j) for j in range(arr_len)] for i in range(nb)] float_value = [[np.float32(j) for j in range(arr_len)] for i in range(nb)] double_value = [[np.double(j) for j in range(arr_len)] for i in range(nb)] string_value = [[str(j) for j in range(arr_len)] for i in range(nb)] data = [pk_value, vector_value, int8_value,int16_value, int32_value, int64_value, bool_value, float_value, double_value, string_value ] #collection.insert(data) data = pd.DataFrame({ 'int64': pk_value, 'float_vector': vector_value, "int8_array": int8_value, "int16_array": int16_value, "int32_array": int32_value, "int64_array": int64_value, "bool_array": bool_value, "float_array": float_value, "double_array": double_value, "string_array": string_value }) collection.insert(data) index = { "index_type": "FLAT", "metric_type": "L2", "params": {"nlist": 128}, } collection.create_index("float_vector", index) collection.load() res = collection.query("int64 >= 0", output_fields=["int8_array"]) for hits in res: print(hits) ================================================ FILE: examples/hello_milvus_delete.py ================================================ import time import numpy as np from pymilvus import ( MilvusClient, exceptions ) fmt = "\n=== {:30} ===\n" dim = 8 collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") milvus_client.drop_collection(collection_name) milvus_client.create_collection(collection_name, dim, consistency_level="Strong", metric_type="L2") print("collections:", milvus_client.list_collections()) print(f"{collection_name} :", milvus_client.describe_collection(collection_name)) rng = np.random.default_rng(seed=19530) rows = [ {"id": 1, "vector": rng.random((1, dim))[0], "a": 1}, {"id": 2, "vector": rng.random((1, dim))[0], "b": 2}, {"id": 3, "vector": rng.random((1, dim))[0], "c": 3}, {"id": 4, "vector": rng.random((1, dim))[0], "d": 4}, {"id": 5, "vector": rng.random((1, dim))[0], "e": 5}, {"id": 6, "vector": rng.random((1, dim))[0], "f": 6}, ] print(fmt.format("Start inserting entities")) pks = milvus_client.insert(collection_name, rows, progress_bar=True)['ids'] pks2 = milvus_client.insert(collection_name, {"id": 7, "vector": rng.random((1, dim))[0], "g": 1})['ids'] pks.extend(pks2) def fetch_data_by_pk(pk): print(f"get primary key {pk} from {collection_name}") pk_data = milvus_client.get(collection_name, pk) if pk_data: print(f"data of primary key {pk} is", pk_data[0]) else: print(f"data of primary key {pk} is empty") fetch_data_by_pk(pks[2]) print(f"start to delete primary key {pks[2]} in collection {collection_name}") milvus_client.delete(collection_name, pks = pks[2]) fetch_data_by_pk(pks[2]) fetch_data_by_pk(pks[4]) filter = "e == 5 or f == 6" print(f"start to delete by expr {filter} in collection {collection_name}") milvus_client.delete(collection_name, filter=filter) fetch_data_by_pk(pks[4]) print(f"start to delete by expr '{filter}' or by primary 4 in collection {collection_name}, expect get exception") try: milvus_client.delete(collection_name, pks = 4, filter=filter) except Exception as e: assert isinstance(e, exceptions.ParamError) print("catch exception", e) print(f"start to delete without specify any expr '{filter}' or any primary key in collection {collection_name}, expect get exception") try: milvus_client.delete(collection_name) except Exception as e: print("catch exception", e) result = milvus_client.query(collection_name, "", output_fields = ["count(*)"]) print(f"final entities in {collection_name} is {result[0]['count(*)']}") milvus_client.drop_collection(collection_name) ================================================ FILE: examples/index.py ================================================ from milvus_lite.server_manager import server_manager_instance import time import numpy as np from pymilvus import ( MilvusClient, DataType ) fmt = "\n=== {:30} ===\n" dim = 8 collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name, timeout=5) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema(enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=dim) schema.add_field("title", DataType.VARCHAR, max_length=64) # collection is not loaded after creation milvus_client.create_collection(collection_name, schema=schema, consistency_level="Strong") rng = np.random.default_rng(seed=19530) rows = [ {"id": 1, "embeddings": rng.random((1, dim))[0], "a": 100, "title": "t1"}, {"id": 2, "embeddings": rng.random((1, dim))[0], "b": 200, "title": "t2"}, {"id": 3, "embeddings": rng.random((1, dim))[0], "c": 300, "title": "t3"}, {"id": 4, "embeddings": rng.random((1, dim))[0], "d": 400, "title": "t4"}, {"id": 5, "embeddings": rng.random((1, dim))[0], "e": 500, "title": "t5"}, {"id": 6, "embeddings": rng.random((1, dim))[0], "f": 600, "title": "t6"}, ] print(fmt.format("Start inserting entities")) insert_result = milvus_client.insert(collection_name, rows) print(fmt.format("Inserting entities done")) print(insert_result) index_params = milvus_client.prepare_index_params() index_params.add_index(field_name = "embeddings", metric_type="L2") index_params.add_index(field_name = "title", index_type = "Trie", index_name="my_trie") print(fmt.format("Start create index")) milvus_client.create_index(collection_name, index_params) index_names = milvus_client.list_indexes(collection_name) print(f"index names for {collection_name}:", index_names) for index_name in index_names: index_info = milvus_client.describe_index(collection_name, index_name=index_name) print(f"index info for index {index_name} is:", index_info) print(fmt.format("Start load collection")) milvus_client.load_collection(collection_name) print(fmt.format("Start query by specifying primary keys")) query_results = milvus_client.query(collection_name, ids=[2]) print(query_results[0]) print(fmt.format("Start query by specifying filtering expression")) query_results = milvus_client.query(collection_name, filter= "f == 600 or title == 't2'") for ret in query_results: print(ret) vectors_to_search = rng.random((1, dim)) print(fmt.format(f"Start search with retrieve serveral fields.")) result = milvus_client.search(collection_name, vectors_to_search, limit=3, output_fields=["title"]) for hits in result: for hit in hits: print(f"hit: {hit}") field_index_names = milvus_client.list_indexes(collection_name, field_name = "embeddings") print(f"index names for {collection_name}`s field embeddings:", field_index_names) try: milvus_client.drop_index(collection_name, "my_trie") except Exception as e: print(f"cacthed {e}") milvus_client.release_collection(collection_name) milvus_client.drop_index(collection_name, "my_trie") milvus_client.drop_collection(collection_name) ================================================ FILE: examples/non_ascii_encode.py ================================================ import numpy as np from pymilvus import MilvusClient, DataType dimension = 128 collection_name = "books" client = MilvusClient(uri="./local_test.db") client.drop_collection(collection_name) schema = client.create_schema(auto_id=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=dimension) schema.add_field("info", DataType.JSON) index_params = client.prepare_index_params("embeddings", metric_type="L2") client.create_collection(collection_name, schema=schema, index_params=index_params) rng = np.random.default_rng(seed=19530) rows = [ {"embeddings": rng.random((1, dimension))[0], "info": {"title": "Lord of the Flies", "author": "William Golding"}}, {"embeddings": rng.random((1, dimension))[0], "info": {"作者": "J.D.塞林格", "title": "麦田里的守望者", }}, {"embeddings": rng.random((1, dimension))[0], "info": {"Título": "Cien años de soledad", "autor": "Gabriel García Márquez"}}, ] client.insert(collection_name, rows) result = client.query(collection_name, filter="info['作者'] == 'J.D.塞林格' or info['Título'] == 'Cien años de soledad'", output_fields=["info"], consistency_level="Strong") for hit in result: print(f"hit: {hit}") ================================================ FILE: examples/simple.py ================================================ import numpy as np from pymilvus import ( MilvusClient, ) fmt = "\n=== {:30} ===\n" dim = 8 collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name, timeout=5) if has_collection: milvus_client.drop_collection(collection_name) milvus_client.create_collection(collection_name, dim, consistency_level="Strong", metric_type="L2") print(fmt.format(" all collections ")) print(milvus_client.list_collections()) print(fmt.format(f"schema of collection {collection_name}")) print(milvus_client.describe_collection(collection_name)) rng = np.random.default_rng(seed=19530) rows = [ {"id": 1, "vector": rng.random((1, dim))[0], "a": 100}, {"id": 2, "vector": rng.random((1, dim))[0], "b": 200}, {"id": 3, "vector": rng.random((1, dim))[0], "c": 300}, {"id": 4, "vector": rng.random((1, dim))[0], "d": 400}, {"id": 5, "vector": rng.random((1, dim))[0], "e": 500}, {"id": 6, "vector": rng.random((1, dim))[0], "f": 600}, ] print(fmt.format("Start inserting entities")) insert_result = milvus_client.insert(collection_name, rows, progress_bar=True) print(fmt.format("Inserting entities done")) print(insert_result) print(fmt.format("Start query by specifying primary keys")) query_results = milvus_client.query(collection_name, ids=[2]) print(query_results[0]) upsert_ret = milvus_client.upsert(collection_name, {"id": 2 , "vector": rng.random((1, dim))[0], "g": 100}) print(upsert_ret) print(fmt.format("Start query by specifying primary keys")) query_results = milvus_client.query(collection_name, ids=[2]) print(query_results[0]) print(fmt.format("Start query by specifying filtering expression")) query_results = milvus_client.query(collection_name, filter= "f == 600") for ret in query_results: print(ret) print(f"start to delete by specifying filter in collection {collection_name}") delete_result = milvus_client.delete(collection_name, ids=[6]) print(delete_result) print(fmt.format("Start query by specifying filtering expression")) query_results = milvus_client.query(collection_name, filter= "f == 600") assert len(query_results) == 0 rng = np.random.default_rng(seed=19530) vectors_to_search = rng.random((1, dim)) print(fmt.format(f"Start search with retrieve serveral fields.")) result = milvus_client.search(collection_name, vectors_to_search, limit=3, output_fields=["pk", "a", "b"]) for hits in result: for hit in hits: print(f"hit: {hit}") milvus_client.drop_collection(collection_name) ================================================ FILE: examples/simple_auto_id.py ================================================ import numpy as np from pymilvus import ( MilvusClient, ) fmt = "\n=== {:30} ===\n" dim = 8 collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name, timeout=5) if has_collection: milvus_client.drop_collection(collection_name) milvus_client.create_collection(collection_name, dim, consistency_level="Strong", metric_type="L2", auto_id=True) print(fmt.format(" all collections ")) print(milvus_client.list_collections()) print(fmt.format(f"schema of collection {collection_name}")) print(milvus_client.describe_collection(collection_name)) rng = np.random.default_rng(seed=19530) rows = [ {"vector": rng.random((1, dim))[0], "a": 100}, {"vector": rng.random((1, dim))[0], "b": 200}, {"vector": rng.random((1, dim))[0], "c": 300}, {"vector": rng.random((1, dim))[0], "d": 400}, {"vector": rng.random((1, dim))[0], "e": 500}, {"vector": rng.random((1, dim))[0], "f": 600}, ] print(fmt.format("Start inserting entities")) insert_result = milvus_client.insert(collection_name, rows, progress_bar=True) print("insert done:", insert_result) print(fmt.format("Start query by specifying filter")) query_results = milvus_client.query(collection_name, filter= "f == 600") for ret in query_results: print(ret) print(f"start to delete by specifying filter in collection {collection_name}") delete_result = milvus_client.delete(collection_name, filter = "f == 600") print(delete_result) print(fmt.format("Start query by specifying filtering expression")) query_results = milvus_client.query(collection_name, filter= "f == 600") assert len(query_results) == 0 rng = np.random.default_rng(seed=19530) vectors_to_search = rng.random((1, dim)) print(fmt.format(f"Start search with retrieve serveral fields.")) result = milvus_client.search(collection_name, vectors_to_search, limit=3, output_fields=["pk", "a", "b"]) for hits in result: for hit in hits: print(f"hit: {hit}") milvus_client.drop_collection(collection_name) ================================================ FILE: examples/sparse.py ================================================ from pymilvus import ( MilvusClient, FieldSchema, CollectionSchema, DataType, ) import random def generate_sparse_vector(dimension: int, non_zero_count: int) -> dict: indices = random.sample(range(dimension), non_zero_count) values = [random.random() for _ in range(non_zero_count)] sparse_vector = {index: value for index, value in zip(indices, values)} return sparse_vector fmt = "\n=== {:30} ===\n" dim = 100 non_zero_count = 20 collection_name = "hello_sparse" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name, timeout=5) if has_collection: milvus_client.drop_collection(collection_name) fields = [ FieldSchema(name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100), # FieldSchema(name="pk", dtype=DataType.INT64, # is_primary=True, auto_id=True), FieldSchema(name="random", dtype=DataType.DOUBLE), FieldSchema(name="embeddings", dtype=DataType.SPARSE_FLOAT_VECTOR), ] schema = CollectionSchema( fields, "demo for using sparse float vector with milvus client") index_params = milvus_client.prepare_index_params() index_params.add_index(field_name="embeddings", index_name="sparse_inverted_index", index_type="SPARSE_INVERTED_INDEX", metric_type="IP", params={"drop_ratio_build": 0.2}) milvus_client.create_collection(collection_name, schema=schema, index_params=index_params, timeout=5, consistency_level="Strong") print(fmt.format(" all collections ")) print(milvus_client.list_collections()) print(fmt.format(f"schema of collection {collection_name}")) print(milvus_client.describe_collection(collection_name)) N = 6 rows = [{"random": i, "embeddings": generate_sparse_vector( dim, non_zero_count)} for i in range(N)] print(fmt.format("Start inserting entities")) insert_result = milvus_client.insert(collection_name, rows, progress_bar=True) print(fmt.format("Inserting entities done")) print(insert_result) print(fmt.format(f"Start vector anns search.")) vectors_to_search = [generate_sparse_vector(dim, non_zero_count)] search_params = { "metric_type": "IP", "params": { "drop_ratio_search": 0.2, } } # no need to specify anns_field for collections with only 1 vector field result = milvus_client.search(collection_name, vectors_to_search, limit=3, output_fields=[ "pk", "random", "embeddings"], search_params=search_params) for hits in result: for hit in hits: print(f"hit: {hit}") print(fmt.format("Start query by specifying filtering expression")) query_results = milvus_client.query(collection_name, filter="random < 3") pks = [ret['pk'] for ret in query_results] for ret in query_results: print(ret) # print(fmt.format("Start query by specifying primary keys")) # query_results = milvus_client.query( # collection_name, filter=f"pk == '{pks[0]}'") # print(query_results[0]) print(f"start to delete by specifying filter in collection {collection_name}") print(pks[:1], 'xxxxxxxxxxxxxxxxxxxxxxxx') print(milvus_client.query(collection_name, ids=pks[:1])) delete_result = milvus_client.delete(collection_name, ids=pks[:1]) print(delete_result) print(milvus_client.query(collection_name, ids=pks[:1])) # print(fmt.format("Start query by specifying primary keys")) # query_results = milvus_client.query( # collection_name, filter=f"pk == '{pks[0]}'") # print(f'query result should be empty: {query_results}') milvus_client.drop_collection(collection_name) ================================================ FILE: python/pyproject.toml ================================================ [build-system] requires = [ "setuptools>=64.0", "wheel" ] # Use legacy backend to import local packages in setup.py build-backend = "setuptools.build_meta:__legacy__" ================================================ FILE: python/requirements.txt ================================================ tqdm ================================================ FILE: python/setup.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import shlex import sys import os import pathlib import unittest from typing import List import subprocess import platform from setuptools import setup, find_namespace_packages from wheel.bdist_wheel import bdist_wheel as _bdist_wheel import shutil MILVUS_BIN = 'milvus' KNOWHERE_BIN = 'libknowhere.dylib' MILVUS_PATCH = str(pathlib.Path(__file__).absolute().parent.parent / 'thirdparty' / 'milvus.patch') MILVUS_ROOT = str(pathlib.Path(__file__).absolute().parent.parent / 'thirdparty' / 'milvus') class CMakeBuild(_bdist_wheel): def finalize_options(self): if sys.platform.lower() == 'linux': self.plat_name = f"manylinux2014_{platform.machine().lower()}" elif sys.platform.lower() == 'darwin': if platform.machine().lower() == 'arm64': self.plat_name = f"macosx_11_0_{platform.machine().lower()}" else: self.plat_name = f"macosx_10_9_{platform.machine().lower()}" return super().finalize_options() def copy_lib(self, lib_path, dst_dir, pick_libs): name = pathlib.Path(lib_path).name new_file = os.path.join(dst_dir, name) for lib_prefix in pick_libs: if name.startswith(lib_prefix): shutil.copy(lib_path, new_file) continue def _pack_macos(self, src_dir: str, dst_dir: str): mac_pkg = ['libknowhere', 'libmilvus', 'libgflags_nothreads', 'libglog', 'libtbb', 'libomp', 'libdouble-conversion'] milvus_bin = pathlib.Path(src_dir) / MILVUS_BIN knowhere = pathlib.Path(src_dir) / KNOWHERE_BIN out_str = subprocess.check_output(['otool', '-L', str(milvus_bin)]) subprocess.check_output(['install_name_tool', '-add_rpath', '@executable_path/.', str(milvus_bin)]) subprocess.check_output(['install_name_tool', '-add_rpath', '@executable_path/.', str(knowhere)]) lines = out_str.decode('utf-8').split('\n') for line in lines[1:]: r = line.split(' ') if not r[0].endswith('dylib'): continue if r[0].strip().startswith("@rpath"): real_path = pathlib.Path(src_dir) / r[0].strip()[len("@rpath/"):] else: real_path = r[0].strip() self.copy_lib(real_path, dst_dir, mac_pkg) def _pack_linux(self, src_dir: str, dst_dir: str): linux_pkg = ['libknowhere', 'libmilvus', 'libgflags_nothreads', 'libglog', 'libtbb', 'libm', 'libgcc_s', 'libgomp', 'libopenblas', 'libdouble-conversion', 'libz', 'libgfortran', 'libquadmath'] milvus_bin = pathlib.Path(src_dir) / MILVUS_BIN out_str = subprocess.check_output(['ldd', str(milvus_bin)]) lines = out_str.decode('utf-8').split('\n') for line in lines: r = line.split("=>") if len(r) != 2: continue self.copy_lib(r[1].strip().split(' ')[0].strip(), dst_dir, linux_pkg) def run(self): build_lib = self.bdist_dir build_temp = os.path.abspath(os.path.join(os.path.dirname(build_lib), 'build_milvus')) if not os.path.exists(build_temp): os.makedirs(build_temp) #clean build temp shutil.rmtree(os.path.join(build_temp, 'lib'), ignore_errors=True) extdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) env = os.environ env['LD_LIBRARY_PATH'] = os.path.join(build_temp, 'lib') if env.get('USE_SYSTEM_DEPS'): system_deps = '-DUSE_SYSTEM_DEPS=ON' else: system_deps = '-DUSE_SYSTEM_DEPS=OFF' subprocess.call(['conan', 'remote', 'add', 'default-conan-local', 'https://milvus01.jfrog.io/artifactory/api/conan/default-conan-local'], cwd=build_temp, env=env) if sys.platform.lower() == 'linux': subprocess.check_call(['conan', 'install', extdir, '--build=missing', '-s', 'build_type=Release', '-s', 'compiler.libcxx=libstdc++11'], cwd=build_temp, env=env) else: # macos subprocess.check_call(['conan', 'install', extdir, '--build=missing', '-s', 'build_type=Release'], cwd=build_temp, env=env) # build extra_cmake_args = shlex.split(env.get('CMAKE_ARGS', '')) extra_build_args = shlex.split(env.get('BUILD_ARGS', '')) subprocess.check_call(['cmake', extdir, '-DENABLE_UNIT_TESTS=OFF', system_deps, *extra_cmake_args], cwd=build_temp, env=env) subprocess.check_call(['cmake', '--build', '.', '--', '-j4', *extra_build_args], cwd=build_temp, env=env, ) dst_lib_path = os.path.join(build_lib, 'milvus_lite/lib') shutil.rmtree(dst_lib_path, ignore_errors=True) os.makedirs(dst_lib_path) if sys.platform.lower() == 'linux': self._pack_linux(os.path.join(build_temp, 'lib'), dst_lib_path) elif sys.platform.lower() == 'darwin': self._pack_macos(os.path.join(build_temp, 'lib'), dst_lib_path) else: raise RuntimeError('Unsupport platform: %s', sys.platform) shutil.copy(os.path.join(build_temp, 'lib', MILVUS_BIN), os.path.join(dst_lib_path, MILVUS_BIN)) super().run() def test_suite(): test_loader = unittest.TestLoader() tests = test_loader.discover('tests', pattern='test_*.py') return tests def parse_requirements(file_name: str) -> List[str]: with open(file_name, encoding='utf-8') as f: return [ require.strip() for require in f if require.strip() and not require.startswith('#') ] setup(name='milvus-lite', version='2.5.2', description='A lightweight version of Milvus wrapped with Python.', author='Milvus Team', author_email='milvus-team@zilliz.com', url='https://github.com/milvus-io/milvus-lite.git', test_suite='setup.test_suite', install_requires=parse_requirements('requirements.txt'), package_dir={'': 'src'}, packages=find_namespace_packages('src'), package_data={}, include_package_data=True, python_requires='>=3.7', entry_points={ 'console_scripts': ['milvus-lite=milvus_lite.cmdline:main'] }, cmdclass={"bdist_wheel": CMakeBuild}, long_description=open("../README.md", "r", encoding="utf-8").read(), long_description_content_type='text/markdown' ) ================================================ FILE: python/src/milvus_lite/__init__.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. from contextlib import suppress try: # Python 3.8+ from importlib.metadata import version, PackageNotFoundError except ImportError: # fallback for older Python (<3.8) from importlib_metadata import version, PackageNotFoundError # needs backport __version__ = "0.0.0.dev" with suppress(DistributionNotFound): __version__ = version("milvus_lite") ================================================ FILE: python/src/milvus_lite/cmdline.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import argparse import pathlib import json from tqdm import tqdm import numpy as np from pymilvus import Collection, connections, utility, DataType from pymilvus.bulk_writer import LocalBulkWriter, BulkFileType class MilvusEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, np.ndarray): return o.tolist() if isinstance(o, np.float32) or isinstance(o, np.float16): return float(o) return json.JSONEncoder.default(self, o) def dump_func(args): return dump_collection(args.db_file, args.collection, args.path) def bfloat16_to_float32(byte_data): bfloat16_array = np.frombuffer(byte_data, dtype=np.uint16) bfloat16_as_uint16 = bfloat16_array.view(np.uint16) float32_as_uint32 = (bfloat16_as_uint16.astype(np.uint32)) << 16 float32_array = float32_as_uint32.view(np.float32) return float32_array def binary_to_int_list(packed_bytes): byte_array = np.frombuffer(packed_bytes, dtype=np.uint8) return np.unpackbits(byte_array) def dump_collection(db_file, collection_name, path): if not pathlib.Path(db_file).is_file(): raise RuntimeError('db_file: %s not exists' % db_file) if not pathlib.Path(path).parent.is_dir(): raise RuntimeError('dump path(%s)\'s parent dir not exists: %s not exists' % path) connections.connect("default", uri=db_file) if not utility.has_collection(collection_name): raise RuntimeError("Collection: %s not exists" % collection_name) collection = Collection(collection_name) total_rows = collection.query("", output_fields=["count(*)"])[0]["count(*)"] is_auto = collection.primary_field.auto_id pk_name = collection.primary_field.name bfloat16_fields = [field.name for field in collection.schema.fields if field.dtype == DataType.BFLOAT16_VECTOR] bin_fields = [field.name for field in collection.schema.fields if field.dtype == DataType.BINARY_VECTOR] writer = LocalBulkWriter( schema=collection.schema, local_path=path, segment_size=512*1024*1024, file_type=BulkFileType.JSON ) it = collection.query_iterator(output_fields=['*']) progress_bar = tqdm(total=total_rows, desc=f"Dump collection {collection_name}'s data") while True: rows = it.next() if not rows: it.close() break if is_auto: for row in rows: del row[pk_name] if bfloat16_fields: for row in rows: for name in bfloat16_fields: if name in row: row[name] = bfloat16_to_float32(row[name]) if bin_fields: for row in rows: for name in bin_fields: if name in row: row[name] = binary_to_int_list(row[name][0]) rows = json.loads(json.dumps(rows, cls=MilvusEncoder)) for row in rows: writer.append_row(row) progress_bar.update(len(rows)) writer.commit() print("Dump collection %s success" % collection_name) def main(): parser = argparse.ArgumentParser(prog='milvus-lite') subparsers = parser.add_subparsers(description='milvus-lite command line tool.') dump_cmd = subparsers.add_parser('dump', help='milvus-lite dump cmd') dump_cmd.add_argument('-d', '--db-file', type=str, help='milvus lite db file') dump_cmd.add_argument('-c', '--collection', type=str, help='collection that need to be dumped') dump_cmd.add_argument('-p', '--path', type=str, help='dump file storage path') dump_cmd.set_defaults(func=dump_func) args = parser.parse_args() if hasattr(args, 'func'): args.func(args) else: parser.print_help() if __name__ == '__main__': main() ================================================ FILE: python/src/milvus_lite/server.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. from typing import Optional import tempfile import os import subprocess import pathlib import signal import logging import fcntl import re BIN_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'lib') logger = logging.getLogger() class Server: """ The milvus-lite server """ MILVUS_BIN = 'milvus' def __init__(self, db_file: str, address: Optional[str] = None): """ Args: db_file (str): The local file to store data. address (address, optional): grpc server address, example: localhost:19530, if not set, the MilvusLite service will use UDS. """ if os.environ.get('BIN_PATH') is not None: self._bin_path = pathlib.Path(os.environ['BIN_PATH']).absolute() else: self._bin_path = pathlib.Path(BIN_PATH).absolute() self._db_file = pathlib.Path(db_file).absolute() if not re.match(r'^[a-zA-Z0-9.\-_]+$', self._db_file.name): raise RuntimeError(f"Unsupport db name {self._db_file.name}, the name must match ^[a-zA-Z0-9.\\-_]+$") if len(self._db_file.name) > 36: raise RuntimeError(f"Db name {self._db_file.name} is too long, should be less than 36") self._work_dir = self._db_file.parent self._address= address self._p = None self._uds_path = f"{tempfile.mktemp()}_{self._db_file.name}.sock" self._lock_path = str(self._db_file.parent / f'.{self._db_file.name}.lock') self._lock_fd = None def init(self) -> bool: if not self._bin_path.exists(): logger.error("Bin path not exists") return False if not self._work_dir.exists(): logger.error("Dir %s not exist", self._work_dir) return True @property def milvus_bin(self): return str(self._bin_path / 'milvus') @property def log_level(self): return os.environ.get("LOG_LEVEL", "ERROR") @property def uds_path(self): return f'unix:{self._uds_path}' @property def args(self): if self._address is not None: return [self.milvus_bin, self._db_file, self._address, self.log_level] return [self.milvus_bin, self._db_file, self.uds_path, self.log_level, self._lock_path] def start(self) -> bool: assert self._p is None, "Server already started" self._lock_fd = open(self._lock_path, 'a') try: fcntl.lockf(self._lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB) start_env = { "LD_LIBRARY_PATH": str(self._bin_path) + ':' + os.environ.get('LD_LIBRARY_PATH', ''), "DYLD_LIBRARY_PATH": str(self._bin_path) + ':' + os.environ.get('DYLD_LIBRARY_PATH', '') } src_env = os.environ.copy() if "LD_LIBRARY_PATH" in src_env: del src_env["LD_LIBRARY_PATH"] if "DYLD_LIBRARY_PATH" in src_env: del src_env["DYLD_LIBRARY_PATH"] start_env.update(src_env) self._p = subprocess.Popen( args=self.args, env=start_env, cwd=str(self._work_dir), ) try: # Wait for 0.5 second to ensure successful startup self._p.wait(0.5) logger.error("Start milvus-lite failed") return False except subprocess.TimeoutExpired: return True except BlockingIOError: logger.error("Open %s failed, the file has been opened by another program", self._db_file) return False def stop(self): if self._lock_fd: # When the file lock is released, the milvus-lite service will automatically stop. fcntl.flock(self._lock_fd, fcntl.LOCK_UN) self._lock_fd.close() self._lock_fd = None if self._p is not None: try: self._p.wait(timeout=2) except subprocess.TimeoutExpired: self._p.send_signal(signal.SIGKILL) self._p.wait(timeout=3) self._p = None try: os.unlink(self._uds_path) except FileNotFoundError: pass try: os.unlink(self._lock_path) except FileNotFoundError: pass def __del__(self): self.stop() ================================================ FILE: python/src/milvus_lite/server_manager.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. from typing import Optional import threading import logging import pathlib from milvus_lite.server import Server logger = logging.getLogger() class ServerManager: def __init__(self): self._lock = threading.Lock() self._servers = {} def start_and_get_uri(self, path: str, args=None) -> Optional[str]: path = pathlib.Path(path).absolute().resolve() with self._lock: if str(path) not in self._servers: s = Server(str(path), args) if not s.init(): return None if not s.start(): return None self._servers[str(path)] = s return self._servers[str(path)].uds_path def release_server(self, path: str): path = pathlib.Path(path).absolute().resolve() with self._lock: if str(path) not in self._servers: logger.warning("No local milvus in path %s", str(path)) return self._servers[str(path)].stop() del self._servers[str(path)] def release_all(self): for s in self._servers.values(): s.stop() self._servers = {} def __del__(self): with self._lock: self.release_all() server_manager_instance = ServerManager() ================================================ FILE: scripts/Dockerfile.manylinux.aarch64 ================================================ # Copyright (C) 2019-2020 Zilliz. 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. FROM quay.io/pypa/manylinux_2_28_aarch64:2024.07.07-1 RUN yum install -y openblas-devel libatomic-static git && cp /usr/lib/gcc/aarch64-redhat-linux/8/libatomic.a /usr/lib64/ ENV PATH="/opt/_internal/cpython-3.8.19/bin:${PATH}" RUN pip3 install conan==1.63.0 RUN curl https://sh.rustup.rs -sSf | bash -s -- --default-toolchain=1.89 -y ENV PATH="/root/.cargo/bin:${PATH}" ENV CCFLAGS="-Wno-error=address" ENV CXXFLAGS="-Wno-error=address" RUN mkdir -p /workspace WORKDIR /workspace RUN conan remote add default-conan-local https://milvus01.jfrog.io/artifactory/api/conan/default-conan-local COPY build_milvus_lite.sh /workspace/build_milvus_lite.sh RUN chmod +x /workspace/build_milvus_lite.sh ================================================ FILE: scripts/Dockerfile.manylinux.x86_64 ================================================ # Copyright (C) 2019-2020 Zilliz. 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. FROM quay.io/pypa/manylinux_2_28_x86_64:2024.07.07-1 RUN yum install -y openblas-devel libatomic-static git && cp /usr/lib/gcc/x86_64-redhat-linux/8/libatomic.a /usr/lib64/ ENV PATH="/opt/_internal/cpython-3.8.19/bin:${PATH}" RUN pip3 install conan==1.63.0 RUN curl https://sh.rustup.rs -sSf | bash -s -- --default-toolchain=1.89 -y ENV PATH="/root/.cargo/bin:${PATH}" RUN mkdir -p /workspace WORKDIR /workspace RUN conan remote add default-conan-local https://milvus01.jfrog.io/artifactory/api/conan/default-conan-local COPY build_milvus_lite.sh /workspace/build_milvus_lite.sh RUN chmod +x /workspace/build_milvus_lite.sh ================================================ FILE: scripts/README.md ================================================ # Build Milvus-Lite In Docker ## build commond ```shell build.sh ${Dockerfile} ${TAG} {$CONAN_CACHE} ``` ================================================ FILE: scripts/build.sh ================================================ #!/bin/bash # Licensed to the LF AI & Data foundation under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. TAG="main" IMAGE_TAG="latest" if [ "$#" -eq 0 ]; then echo "Please set dockerfile path" elif [ "$#" -eq 1 ]; then DOCKERFILE=$1 docker build -t build_milvus_lite:$IMAGE_TAG -f $DOCKERFILE . \ && docker run --rm -v $PWD:/workspace/dist build_milvus_lite:$IMAGE_TAG /workspace/build_milvus_lite.sh $TAG elif [ "$#" -eq 2 ]; then DOCKERFILE=$1 TAG=$2 docker build -t build_milvus_lite:$IMAGE_TAG -f $DOCKERFILE . \ && docker run --rm -v $PWD:/workspace/dist build_milvus_lite:$IMAGE_TAG /workspace/build_milvus_lite.sh $TAG elif [ "$#" -eq 3 ]; then DOCKERFILE=$1 TAG=$2 CACAN_CACHE=$3 docker build -t build_milvus_lite:$IMAGE_TAG -f $DOCKERFILE . \ && docker run --rm -e CONAN_USER_HOME=/workspace/conan -v $CACAN_CACHE:/workspace/conan -v $PWD:/workspace/dist build_milvus_lite:$IMAGE_TAG /workspace/build_milvus_lite.sh $TAG fi ================================================ FILE: scripts/build_milvus_lite.sh ================================================ #!/bin/bash # Licensed to the LF AI & Data foundation under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. tag="main" if [ "$#" -eq 1 ]; then tag=$1 fi echo "Build milvus-lite:$tag" echo $CONAN_USER_HOME git clone --recurse-submodules https://github.com/milvus-io/milvus-lite.git \ && cd milvus-lite \ && git checkout $tag \ && cd python \ && python3 -m build --wheel \ && cp -r dist /workspace/ \ && cd /workspace && rm -rf milvus-lite ================================================ FILE: src/CMakeLists.txt ================================================ # Copyright (C) 2019-2024 Zilliz. 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 include_directories(${CMAKE_CURRENT_LIST_DIR}) add_library(milite ${LITE_BUILD_TYPE} ${CMAKE_CURRENT_LIST_DIR}/storage/collection_meta.cpp ${CMAKE_CURRENT_LIST_DIR}/storage/collection_data.cpp ${CMAKE_CURRENT_LIST_DIR}/storage/bm25_stats.cpp ${CMAKE_CURRENT_LIST_DIR}/storage/storage.cpp ${CMAKE_CURRENT_LIST_DIR}/timer.cpp ${CMAKE_CURRENT_LIST_DIR}/index.cpp ${CMAKE_CURRENT_LIST_DIR}/milvus_local.cpp ${CMAKE_CURRENT_LIST_DIR}/segcore_wrapper.cpp ${CMAKE_CURRENT_LIST_DIR}/milvus_proxy.cpp ${CMAKE_CURRENT_LIST_DIR}/create_collection_task.cpp ${CMAKE_CURRENT_LIST_DIR}/create_index_task.cpp ${CMAKE_CURRENT_LIST_DIR}/search_task.cpp ${CMAKE_CURRENT_LIST_DIR}/insert_task.cpp ${CMAKE_CURRENT_LIST_DIR}/query_task.cpp ${CMAKE_CURRENT_LIST_DIR}/delete_task.cpp ${CMAKE_CURRENT_LIST_DIR}/upsert_task.cpp ${CMAKE_CURRENT_LIST_DIR}/schema_util.cpp ${CMAKE_CURRENT_LIST_DIR}/re_scorer.cpp ${CMAKE_CURRENT_LIST_DIR}/hybrid_search_task.cpp ${CMAKE_CURRENT_LIST_DIR}/function/function_executor.cpp ${CMAKE_CURRENT_LIST_DIR}/function/bm25_function.cpp ) target_link_libraries( milite PUBLIC parser milvus_core milvus_log yaml-cpp roaring::roaring SQLiteCpp ${antlr4-cppruntime_LIBRARIES} ${MARISA_LIBRARIES} TBB::tbb ${PROTOBUF_LIBRARIES} ${ARROW_LIBRARIES} simdjson tantivy_binding ) add_library( milvus_service STATIC "${CMAKE_SOURCE_DIR}/src/milvus_service_impl.cpp" ) target_link_libraries( milvus_service PUBLIC milvus_grpc_service ) add_executable(milvus server.cpp) target_link_libraries( milvus milvus_service milite ) if(ENABLE_UNIT_TESTS) add_subdirectory(unittest) endif() ================================================ FILE: src/common.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include namespace milvus::local { #define CHECK_STATUS(status, err) \ do { \ Status _s = status; \ if (!_s.IsOk()) { \ return _s; \ } \ } while (0) #define DELETE_AND_SET_NULL(ptr, deleter) \ do { \ if ((ptr) != nullptr) { \ deleter(ptr); \ (ptr) = nullptr; \ } \ } while (0) using KVMap = std::map; using SparseVector = std::map; // system field id: // 0: unique row id // 1: timestamp // 100: first user field id // 101: second user field id // 102: ... const int64_t kStartOfUserFieldId = 100; const int64_t kRowIdField = 0; const int64_t kTimeStampField = 1; const std::string kRowIdFieldName("RowID"); const std::string kTimeStampFieldName("Timestamp"); const std::string kMetaFieldName("$meta"); const std::string kPlaceholderTag("$0"); const int64_t kTopkLimit = 16384; const int64_t kSchemaFieldLimit = 64; const int64_t kMaxLengthLimit = 65535; // scalar index type const std::string kDefaultStringIndexType("Trie"); const std::string kInvertedIndexType("INVERTED"); const std::string kDefaultArithmeticIndexType = ("STL_SORT"); const int64_t kMaxIndexRow = 1000000; // Search, Index parameter keys const std::string kTopkKey("topk"); // const std::string kSearchParamKey("search_param"); const std::string kSearchParamKey("params"); const std::string kOffsetKey("offset"); const std::string kRoundDecimalKey("round_decimal"); const std::string kGroupByFieldKey("group_by_field"); const std::string kAnnFieldKey("anns_field"); const std::string kSegmentNumKey("segment_num"); const std::string kWithFilterKey("with_filter"); const std::string kWithOptimizeKey("with_optimize"); const std::string kCollectionKey("collection"); const std::string kIndexParamsKey("params"); const std::string kIndexTypeKey("index_type"); const std::string kMetricTypeKey("metric_type"); const std::string kDimKey("dim"); const std::string kMaxLengthKey("max_length"); const std::string kMaxCapacityKey("max_capacity"); const std::string kReduceStopForBestKey("reduce_stop_for_best"); const std::string kLimitKey("limit"); const std::string KMetricsIPName("IP"); const std::string kMetricsCosineName("COSINE"); const std::string kMetricsBM25Name("BM25"); const std::string kMetricsL2Name("L2"); const std::string kBM25AvgName("bm25_avgdl"); const std::string kCountStr("count(*)"); inline int64_t GetCollectionId(const std::string& collection_name) { std::hash hasher; size_t hash_value = hasher(collection_name); return static_cast(hash_value); } inline int64_t GetIndexId(const std::string& index_name) { std::hash hasher; size_t hash_value = hasher(index_name); return static_cast(hash_value); } struct NonCopyableNonMovable { constexpr NonCopyableNonMovable() noexcept = default; virtual ~NonCopyableNonMovable() noexcept = default; NonCopyableNonMovable(NonCopyableNonMovable&&) = delete; NonCopyableNonMovable& operator=(NonCopyableNonMovable&&) = delete; NonCopyableNonMovable(const NonCopyableNonMovable&) = delete; NonCopyableNonMovable& operator=(const NonCopyableNonMovable&) = delete; }; } // namespace milvus::local ================================================ FILE: src/create_collection_task.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "create_collection_task.h" #include #include #include #include #include #include "common.h" #include "log/Log.h" #include "pb/schema.pb.h" #include "status.h" #include "string_util.hpp" namespace milvus::local { using DType = ::milvus::proto::schema::DataType; using DCase = ::milvus::proto::schema::ValueField::DataCase; bool CreateCollectionTask::HasSystemFields( const ::milvus::proto::schema::CollectionSchema& schema) { for (const auto& f : schema.fields()) { if (f.name() == kRowIdFieldName || f.name() == kTimeStampFieldName || f.name() == kMetaFieldName) { return true; } } return false; } Status CheckFieldParams(const ::milvus::proto::schema::FieldSchema& field) { if (field.nullable()) { return Status::ParameterInvalid("MilvusLite doesn't support nullable"); } // Treat the partition key as a normal field if (field.is_partition_key()) { auto f = const_cast<::milvus::proto::schema::FieldSchema*>(&field); f->set_is_partition_key(false); } return Status::Ok(); } Status CreateCollectionTask::GetVarcharFieldMaxLength( const ::milvus::proto::schema::FieldSchema& field, uint64_t* max_len) { if (field.data_type() != DType::VarChar && field.element_type() != DType::VarChar) { return Status::ParameterInvalid("{} is not varchar field", field.name()); } for (const auto& kv_pair : field.type_params()) { if (kv_pair.key() == kMaxLengthKey) { try { auto length = std::stoll(kv_pair.value()); if (length <= 0 || length > kMaxLengthLimit) { return Status::ParameterInvalid( "the maximum length specified for a VarChar should " "be " "in (0, 65535])"); } else { *max_len = static_cast(length); return Status::Ok(); } } catch (std::exception& e) { return Status::ParameterInvalid("Invalid max length {}", kv_pair.value()); } } } for (const auto& kv_pair : field.index_params()) { if (kv_pair.key() == kMaxLengthKey) { try { auto length = std::stoll(kv_pair.value()); if (length <= 0 || length > kMaxLengthLimit) { return Status::ParameterInvalid( "the maximum length specified for a VarChar should " "be " "in (0, 65535])"); } else { *max_len = static_cast(length); return Status::Ok(); } } catch (std::exception& e) { return Status::ParameterInvalid("Invalid max length {}", kv_pair.value()); } } } return Status::ParameterInvalid( "type param(max_length) should be specified for varChar field of " "collection"); } bool CreateCollectionTask::CheckDefaultValue( const ::milvus::proto::schema::CollectionSchema& schema) { for (const auto& f : schema.fields()) { if (!f.has_default_value()) continue; switch (f.default_value().data_case()) { case DCase::kBoolData: if (f.data_type() != DType::Bool) { LOG_ERROR( "{} field's default value is Bool type, mismatches " "field type", f.name()); return false; } break; case DCase::kIntData: { if (f.data_type() != DType::Int16 && f.data_type() != DType::Int32 && f.data_type() != DType::Int8) { LOG_ERROR( "{} field's default value is Int type, mismatches " "field type", f.name()); return false; } auto default_value = f.default_value().int_data(); if (f.data_type() == DType::Int16) { if (default_value < std::numeric_limits::min() || default_value > std::numeric_limits::max()) { LOG_ERROR("{} field's default value out of range.", f.name()); return false; } } if (f.data_type() == DType::Int8) { if (default_value < std::numeric_limits::min() || default_value > std::numeric_limits::max()) { LOG_ERROR("{} field's default value out of range.", f.name()); return false; } } } break; case DCase::kLongData: if (f.data_type() != DType::Int64) { LOG_ERROR( "{} field's default value is Long type, mismatches " "field type", f.name()); return false; } break; case DCase::kFloatData: if (f.data_type() != DType::Float) { LOG_ERROR( "{} field's default value is Float type, " "mismatches " "field type", f.name()); return false; } break; case DCase::kDoubleData: if (f.data_type() != DType::Double) { LOG_ERROR( "{} field's default value is Double type, " "mismatches " "field type", f.name()); return false; } break; case DCase::kStringData: { if (f.data_type() != DType::VarChar) { LOG_ERROR( "{} field's default value is VarChar type, " "mismatches field type", f.name()); return false; } auto string_len = f.default_value().string_data().size(); uint64_t max_length = 0; auto s = GetVarcharFieldMaxLength(f, &max_length); if (s.IsErr()) { LOG_ERROR(s.Detail()); return false; } if (string_len > max_length) { return false; } } break; // case DCase::kBytesData: // not used // break; default: return false; break; } } return true; } void CreateCollectionTask::AssignFieldId( ::milvus::proto::schema::CollectionSchema* schema) { for (int i = 0; i < schema->fields_size(); i++) { schema->mutable_fields(i)->set_fieldid(kStartOfUserFieldId + i); } } void CreateCollectionTask::AppendDynamicField( ::milvus::proto::schema::CollectionSchema* schema) { if (schema->enable_dynamic_field()) { auto dynamice_field = schema->add_fields(); dynamice_field->set_name(kMetaFieldName); dynamice_field->set_description("dynamic schema"); dynamice_field->set_data_type(DType::JSON); dynamice_field->set_is_dynamic(true); } } void CreateCollectionTask::AppendSysFields( ::milvus::proto::schema::CollectionSchema* schema) { auto row_id_field = schema->add_fields(); row_id_field->set_fieldid(kRowIdField); row_id_field->set_name(kRowIdFieldName); row_id_field->set_is_primary_key(false); row_id_field->set_description("row id"); row_id_field->set_data_type(DType::Int64); auto ts_field = schema->add_fields(); ts_field->set_fieldid(kTimeStampField); ts_field->set_name(kTimeStampFieldName); ts_field->set_is_primary_key(false); ts_field->set_description("time stamp"); ts_field->set_data_type(DType::Int64); } Status VaildBM25Functions(const ::milvus::proto::schema::CollectionSchema& schema, const milvus::proto::schema::FunctionSchema& fs) { if (fs.type() != milvus::proto::schema::FunctionType::BM25) { return Status::ParameterInvalid( "MilvusLite only supports BM25 function"); } if (fs.input_field_names_size() != 1 || fs.output_field_names_size() != 1) { return Status::ParameterInvalid( "The input and output of the BM25 function must be 1"); } bool found_input = false; bool found_output = false; for (const auto& field : schema.fields()) { if (field.name() == fs.input_field_names(0)) { found_input = true; if (field.is_dynamic()) { return Status::ParameterInvalid( "Function's input cannot be dynamic field"); } if (field.data_type() != milvus::proto::schema::DataType::VarChar) { return Status::ParameterInvalid( "BM25 funciton's input must be of VARCHAR type"); } if (field.nullable()) { return Status::ParameterInvalid( "Function's input cannot be nullable field"); } } if (field.name() == fs.output_field_names(0)) { found_output = true; if (field.is_dynamic()) { return Status::ParameterInvalid( "Function's output cannot be dynamic field"); } if (field.data_type() != milvus::proto::schema::DataType::SparseFloatVector) { return Status::ParameterInvalid( "BM25 funciton's output must be of SparseFloatVector " "type"); } if (field.nullable()) { return Status::ParameterInvalid( "Function's output cannot be nullable field"); } } } if (!found_input) { return Status::ParameterInvalid("function's input {} not found", fs.input_field_names(0)); } if (!found_output) { return Status::ParameterInvalid("function's output {} not found", fs.output_field_names(0)); } return Status::Ok(); } Status CreateCollectionTask::ValidateSchema( const ::milvus::proto::schema::CollectionSchema& schema) { if (schema.fields_size() > kSchemaFieldLimit) return Status::ParameterInvalid( "maximum field's number should be limited to {}", kSchemaFieldLimit); std::set field_names; std::string pk_name; for (const auto& field_schema : schema.fields()) { if (field_names.find(field_schema.name()) != field_names.end()) { return Status::ParameterInvalid("Duplicated field name: {}", field_schema.name()); } if (field_schema.is_primary_key()) { if (!pk_name.empty()) { return Status::ParameterInvalid( "there are more than one primary key, field_name = {}, " "{}", pk_name, field_schema.name()); } else { pk_name = field_schema.name(); } } if (field_schema.is_dynamic()) { return Status::ParameterInvalid( "cannot explicitly set a field as a dynamic field"); } CHECK_STATUS(CheckFieldParams(field_schema), ""); CHECK_STATUS(CheckFieldName(field_schema.name()), ""); if (field_schema.data_type() == DType::VarChar) { uint64_t max_length = 0; CHECK_STATUS(GetVarcharFieldMaxLength(field_schema, &max_length), ""); } } // valid functions for (const auto& f : schema.functions()) { CHECK_STATUS(VaildBM25Functions(schema, f), ""); } return Status::Ok(); } Status CreateCollectionTask::Process( ::milvus::proto::schema::CollectionSchema* schema) { if (!schema->ParseFromString(create_collection_request_->schema())) { LOG_ERROR("Failed parse schema"); return Status::ParameterInvalid("Failed parse schema"); } if (create_collection_request_->collection_name() != schema->name()) { auto err = string_util::SFormat( "collection name [{}] not matches schema name [{}]", create_collection_request_->collection_name(), schema->name()); LOG_ERROR(err); return Status::ParameterInvalid(err); } CHECK_STATUS(ValidateSchema(*schema), ""); if (HasSystemFields(*schema)) { auto err_msg = string_util::SFormat("Schema contains system field {}, {}, {}", kRowIdFieldName, kTimeStampFieldName, kMetaFieldName); LOG_ERROR(err_msg); return Status::ParameterInvalid(err_msg); } if (!CheckDefaultValue(*schema)) { return Status::ParameterInvalid(); } AppendDynamicField(schema); AssignFieldId(schema); AppendSysFields(schema); return Status::Ok(); } Status CreateCollectionTask::CheckFieldName(const std::string& field_name) { std::string name = string_util::Trim(field_name); if (name.empty()) { return Status::ParameterInvalid("field {} should not be empty", name); } std::string invalid_msg = string_util::SFormat("Invalid field name {}. ", name); if (name.size() > 255) { return Status::ParameterInvalid( "{}, the length of a field name must " "be less than 255 characters", invalid_msg); } char first = name[0]; if (first != '_' && !string_util::IsAlpha(first)) { return Status::ParameterInvalid( "{} the first character of a field {} must be an underscore " "or letter", invalid_msg, name); } std::regex pattern("^[a-zA-Z_][a-zA-Z0-9_]*$"); if (!std::regex_match(name, pattern)) { auto err = string_util::SFormat( "{}, field name can only contain " "numbers, letters and underscores", invalid_msg); LOG_ERROR(err); return Status::ParameterInvalid(err); } return Status::Ok(); } } // namespace milvus::local ================================================ FILE: src/create_collection_task.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include "pb/milvus.pb.h" #include "pb/schema.pb.h" #include "pb/segcore.pb.h" #include "common.h" #include "status.h" namespace milvus::local { class CreateCollectionTask final : NonCopyableNonMovable { public: explicit CreateCollectionTask( const ::milvus::proto::milvus::CreateCollectionRequest* create_collection_request) : create_collection_request_(create_collection_request) { } virtual ~CreateCollectionTask() = default; public: Status Process(::milvus::proto::schema::CollectionSchema* schema); private: bool CheckDefaultValue(const ::milvus::proto::schema::CollectionSchema& schema); bool HasSystemFields(const ::milvus::proto::schema::CollectionSchema& schema); void AssignFieldId(::milvus::proto::schema::CollectionSchema* schema); void AppendDynamicField(::milvus::proto::schema::CollectionSchema* schema); void AppendSysFields(::milvus::proto::schema::CollectionSchema* schema); Status GetVarcharFieldMaxLength(const ::milvus::proto::schema::FieldSchema& field, uint64_t* max_len); Status ValidateSchema(const ::milvus::proto::schema::CollectionSchema& schema); Status CheckFieldName(const std::string& field_name); private: const ::milvus::proto::milvus::CreateCollectionRequest* create_collection_request_; }; } // namespace milvus::local ================================================ FILE: src/create_index_task.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "create_index_task.h" #include #include #include #include #include #include #include "common.h" #include "nlohmann/json.hpp" #include "pb/common.pb.h" #include "pb/schema.pb.h" #include "pb/segcore.pb.h" #include "schema_util.h" #include "log/Log.h" #include "status.h" #include "string_util.hpp" namespace milvus::local { /* dtype index_type metric_type * FloatVector: FLAT, HNWS L2, IP, COSINE, AUTOINDEX * BinaryVector: BIN_FLAT HAMMING, JACCARD, SUBSTRUCTURE, SUPERSTRUCTURE * Float16Vector: FLAT L2, IP, COSINE * BFloat16Vector: FLAT L2, IP, COSINE * SparseFloatVector: SPARSE_INVERTED_INDEX, SPARSE_WAND IP, BM25 */ // metrics type const char* kL2 = "L2"; const char* kIP = "IP"; const char* kCosine = "COSINE"; const char* kHamming = "HAMMING"; const char* kJaccard = "JACCARD"; const char* kSubStructure = "SUBSTRUCTURE"; const char* kSuperStructure = "SUPERSTRUCTURE"; // index_type const char* kAutoIndex = "AUTOINDEX"; const char* kFlat = "FLAT"; const char* kBin_Flat = "BIN_FLAT"; // const char* kHNSW = "HNSW"; const char* kIvf_Flat = "IVF_FLAT"; const char* kSparseInvertedIndex = "SPARSE_INVERTED_INDEX"; const char* kSparseWand = "SPARSE_WAND"; // default metric const char* kFloatVectorDefaultMetricType = kIP; const char* kSparseFloatVectorDefaultMetricType = kIP; const char* kBinaryVectorDefaultMetricType = kJaccard; //bm25 params const char* kBm25K1 = "bm25_k1"; const char* kBm25B = "bm25_b"; class AutoIndexConfig final : NonCopyableNonMovable { public: AutoIndexConfig() : index_param({{"M", "18"}, {"efConstruction", "240"}, {"index_type", kAutoIndex}, {"metric_type", kIP}}) { } ~AutoIndexConfig() = default; public: const KVMap index_param; }; using DType = ::milvus::proto::schema::DataType; static const AutoIndexConfig kAutoIndexConfig; class IndexChecker : NonCopyableNonMovable { public: IndexChecker(const std::string& index_type, const std::string& metric, int64_t dim) : index_type_(index_type), metric_(metric), dim_(dim), need_check_dim_(true) { } virtual ~IndexChecker() = default; Status Check(); protected: std::string index_type_; std::string metric_; int64_t dim_; bool need_check_dim_; int64_t min_dim_; int64_t max_dim_; std::vector supported_index_; std::vector supported_metric_; }; Status IndexChecker::Check() { if (need_check_dim_ && (dim_ < min_dim_ || dim_ > max_dim_)) { auto err = string_util::SFormat( "invalid dimension: {}. should be in range {} ~ {}", dim_, min_dim_, max_dim_); return Status::Undefined(err); } if (std::find(supported_index_.begin(), supported_index_.end(), index_type_) == supported_index_.end()) { auto err = string_util::SFormat( "invalid index type: {}, local mode only support {}", index_type_, string_util::Join(" ", supported_index_)); return Status::Undefined(err); } if (std::find(supported_metric_.begin(), supported_metric_.end(), metric_) == supported_metric_.end()) { auto err = string_util::SFormat( "metric type {} not found or not supported, supported: {}", metric_, string_util::Join(" ", supported_metric_)); return Status::Undefined(err); } return Status::Ok(); } class FloatVectorIndexChecker : public virtual IndexChecker { public: FloatVectorIndexChecker(const std::string& index_type, const std::string& metric, int64_t dim) : IndexChecker(index_type, metric, dim) { min_dim_ = 2; max_dim_ = 32768; supported_index_ = {kFlat, kIvf_Flat, kAutoIndex}; supported_metric_ = {kL2, kIP, kCosine}; } virtual ~FloatVectorIndexChecker() = default; }; class BinaryVectorChecker : public virtual IndexChecker { public: BinaryVectorChecker(const std::string& index_type, const std::string& metric, int64_t dim) : IndexChecker(index_type, metric, dim) { min_dim_ = 2; max_dim_ = 32768; supported_index_ = {kBin_Flat}; supported_metric_ = { kHamming, kJaccard, kSubStructure, kSuperStructure}; } virtual ~BinaryVectorChecker() = default; }; class Float16VectorChecker : public virtual IndexChecker { public: Float16VectorChecker(const std::string& index_type, const std::string& metric, int64_t dim) : IndexChecker(index_type, metric, dim) { min_dim_ = 2; max_dim_ = 32768; supported_index_ = {kFlat}; supported_metric_ = {kL2, kIP, kCosine}; } virtual ~Float16VectorChecker() = default; }; class BFloat16VectorChecker : public virtual IndexChecker { public: BFloat16VectorChecker(const std::string& index_type, const std::string& metric, int64_t dim) : IndexChecker(index_type, metric, dim) { min_dim_ = 2; max_dim_ = 32768; supported_index_ = {kFlat}; supported_metric_ = {kL2, kIP, kCosine}; } virtual ~BFloat16VectorChecker() = default; }; class SparseFloatVectorChecker : public virtual IndexChecker { public: SparseFloatVectorChecker(const std::string& index_type, const std::string& metric, int64_t dim) : IndexChecker(index_type, metric, dim) { min_dim_ = -1; max_dim_ = -1; need_check_dim_ = false; supported_index_ = {kSparseInvertedIndex, kSparseWand}; supported_metric_ = {kIP, kMetricsBM25Name}; } virtual ~SparseFloatVectorChecker() = default; }; Status Check(DType field_type, const std::string& index_type, const std::string& metric, int64_t dim) { if (field_type == DType::FloatVector) { return FloatVectorIndexChecker(index_type, metric, dim).Check(); } else if (field_type == DType::Float16Vector) { return Float16VectorChecker(index_type, metric, dim).Check(); } else if (field_type == DType::BFloat16Vector) { return BFloat16VectorChecker(index_type, metric, dim).Check(); } else if (field_type == DType::BinaryVector) { return BinaryVectorChecker(index_type, metric, dim).Check(); } else if (field_type == DType::SparseFloatVector) { return SparseFloatVectorChecker(index_type, metric, dim).Check(); } else { return Status::ParameterInvalid("Unknow data type"); } } void CreateIndexTask::WrapUserIndexParams(const std::string& metrics_type) { ::milvus::proto::common::KeyValuePair p1; p1.set_key(kIndexTypeKey); p1.set_value(kAutoIndex); new_extra_params_.push_back(p1); ::milvus::proto::common::KeyValuePair p2; p2.set_key(kMetricTypeKey); p2.set_value(metrics_type); new_extra_params_.push_back(p2); } bool CreateIndexTask::AddAutoIndexParams(KVMap* index_params) { is_auto_index_ = true; if (index_params->find(kMetricTypeKey) != index_params->end()) { const auto metrics_type = index_params->at(kMetricTypeKey); WrapUserIndexParams(metrics_type); index_params->insert(kAutoIndexConfig.index_param.begin(), kAutoIndexConfig.index_param.end()); (*index_params)[kMetricTypeKey] = metrics_type; return true; } else { auto it = kAutoIndexConfig.index_param.find(kMetricTypeKey); WrapUserIndexParams(it->second); index_params->insert(kAutoIndexConfig.index_param.begin(), kAutoIndexConfig.index_param.end()); (*index_params)[kMetricTypeKey] = it->second; return true; } return true; } Status CreateIndexTask::CheckTrain(const ::milvus::proto::schema::FieldSchema& field, KVMap& index_params) { auto index_type = index_params.at(kIndexTypeKey); if (!IsVectorIndex(field.data_type())) { return Status::Ok(); } if (schema_util::IsSparseVectorType(field.data_type())) { if (index_params[kMetricTypeKey] == kMetricsBM25Name) { { auto [succ, num] = string_util::ToNumber(index_params[kBM25AvgName]); if (!succ) { return Status::ParameterInvalid("{}: {} is not a number", kBM25AvgName, index_params[kBM25AvgName]); } } { auto [succ, num] = string_util::ToNumber(index_params[kBm25K1]); if (!succ) { return Status::ParameterInvalid("{}: {} is not a number", kBm25K1, index_params[kBm25K1]); } if (num < 0 || num > 3.0) { return Status::ParameterInvalid( "{}: {} should be in range [0.0, 3.0]", kBm25K1, index_params[kBm25K1]); } } { auto [succ, num] = string_util::ToNumber(index_params[kBm25B]); if (!succ) { return Status::ParameterInvalid( "{}: {} is not a number", kBm25B, index_params[kBm25B]); } if (num < 0.0 || num > 1.0) { return Status::ParameterInvalid( "{}: {} should be in range [0.0, 1.0]", kBm25B, index_params[kBm25B]); } } } } if (!schema_util::IsSparseVectorType(field.data_type())) { if (!FillDimension(field, &index_params)) { return Status::ParameterInvalid(); } } int64_t dim = -1; if (!schema_util::IsSparseVectorType(field.data_type())) { dim = std::stoll(index_params.at(kDimKey)); } std::string metric = index_params.at(kMetricTypeKey); return Check(field.data_type(), index_type, metric, dim); } Status CreateIndexTask::ParseIndexParams() { const milvus::proto::schema::FieldSchema* field_ptr = nullptr; for (const auto& field : schema_->fields()) { if (field.name() == create_index_request_->field_name()) { field_ptr = &field; } } if (field_ptr == nullptr) { auto err = string_util::SFormat("Can not found field {}", create_index_request_->field_name()); LOG_ERROR(err); return Status::ParameterInvalid(err); } if (!create_index_request_->index_name().empty()) { index_name_ = create_index_request_->index_name(); } else { index_name_ = field_ptr->name(); } field_id_ = field_ptr->fieldid(); collectionid_ = GetCollectionId(schema_->name()); KVMap index_params; for (const auto& param : create_index_request_->extra_params()) { if (param.key() == kIndexParamsKey) { try { nlohmann::json data = nlohmann::json::parse(param.value()); for (auto& [key, value] : data.items()) { if (!value.is_string()) { index_params[key] = value.dump(); } } } catch (nlohmann::json::parse_error& e) { auto err = string_util::SFormat("Index params err: {}", e.what()); LOG_ERROR(err); return Status::ParameterInvalid(err); } } else { index_params[param.key()] = param.value(); } } if (IsVectorIndex(field_ptr->data_type())) { auto it = index_params.find(kIndexTypeKey); if (it == index_params.end() || it->second == kAutoIndex) { // default index and auto index only support floatvector type if (!AddAutoIndexParams(&index_params)) return Status::SegcoreErr(); } auto metric_it = index_params.find(kMetricTypeKey); if (metric_it == index_params.end()) { if (field_ptr->data_type() == DType::FloatVector || field_ptr->data_type() == DType::BFloat16Vector || field_ptr->data_type() == DType::Float16Vector) { index_params[kMetricTypeKey] = kFloatVectorDefaultMetricType; } else if (field_ptr->data_type() == DType::BinaryVector) { index_params[kMetricTypeKey] = kBinaryVectorDefaultMetricType; } else if (field_ptr->data_type() == DType::SparseFloatVector) { index_params[kMetricTypeKey] = kSparseFloatVectorDefaultMetricType; } else { LOG_ERROR("Unkwon index data type: {}", field_ptr->data_type()); return Status::ParameterInvalid(); } } if (index_params[kMetricTypeKey] == kMetricsBM25Name) { if (index_params.find(kBm25K1) == index_params.end()) { index_params[kBm25K1] = "1.2"; } if (index_params.find(kBm25B) == index_params.end()) { index_params[kBm25B] = "0.75"; } if (index_params.find(kBM25AvgName) == index_params.end()) { index_params[kBM25AvgName] = "1000"; } } } else { // scalar index auto it = index_params.find(kIndexTypeKey); if (field_ptr->data_type() == DType::VarChar) { if (it == index_params.end()) { index_params[kIndexTypeKey] = kDefaultStringIndexType; } else if (!ValidateStringIndexType(it->second)) { auto err = string_util::SFormat("Unkown index type {}", it->second); LOG_ERROR(err); return Status::ParameterInvalid(err); } } else if (field_ptr->data_type() == DType::Float || field_ptr->data_type() == DType::Double || field_ptr->data_type() == DType::Int16 || field_ptr->data_type() == DType::Int8 || field_ptr->data_type() == DType::Int32 || field_ptr->data_type() == DType::Int64) { if (it == index_params.end()) { index_params[kIndexTypeKey] = kDefaultArithmeticIndexType; } else if (!ValidateArithmeticIndexType(it->second)) { auto err = string_util::SFormat("Unkown index type {}", it->second); LOG_ERROR(err); return Status::ParameterInvalid(err); } } else if (field_ptr->data_type() == DType::Bool) { if (it == index_params.end()) { LOG_ERROR("no index type specified"); return Status::ParameterInvalid("no index type specified"); } if (it->second != kInvertedIndexType) { auto err = string_util::SFormat( "index type {} not supported for boolean, supported: {}", it->second, kInvertedIndexType); LOG_ERROR(err); return Status::ParameterInvalid(err); } } else { LOG_ERROR( "Only int, varchar, float, double and bool fields support " "scalar index."); return Status::ParameterInvalid(); } } auto it = index_params.find(kIndexTypeKey); if (it == index_params.end()) { LOG_ERROR("IndexType not specified"); return Status::ParameterInvalid(); } CHECK_STATUS(CheckTrain(*field_ptr, index_params), ""); index_params.erase(kDimKey); index_params.erase(kMaxLengthKey); for (const auto& param : index_params) { ::milvus::proto::common::KeyValuePair p; p.set_key(param.first); p.set_value(param.second); new_index_params_.push_back(p); } auto type_params = field_ptr->type_params(); KVMap type_params_map; for (const auto& param : type_params) { ::milvus::proto::common::KeyValuePair p; p.set_key(param.key()); p.set_value(param.value()); new_type_params_.push_back(p); } return Status::Ok(); } bool CreateIndexTask::IsVectorIndex(::milvus::proto::schema::DataType dtype) { return schema_util::IsVectorField(dtype); } bool CreateIndexTask::FillDimension( const ::milvus::proto::schema::FieldSchema& field, KVMap* index_params) { if (!IsVectorIndex(field.data_type())) { return true; } std::string dim; if (!schema_util::FindDimFromFieldParams(field, &dim)) { LOG_ERROR("Dimension not found in schema"); return false; } auto it = index_params->find(kDimKey); if (it != index_params->end() && it->second != dim) { LOG_ERROR("dimension mismatch, dimension in schema: {}, dimension: {}", dim, it->second); return false; } else { (*index_params)[kDimKey] = dim; } return true; } Status CreateIndexTask::Process(milvus::proto::segcore::FieldIndexMeta* field_meta) { CHECK_STATUS(ParseIndexParams(), ""); field_meta->set_index_name(index_name_); field_meta->set_fieldid(field_id_); field_meta->set_collectionid(collectionid_); field_meta->set_is_auto_index(is_auto_index_); std::set kset; for (const auto& param : new_index_params_) { if (kset.find(param.key()) == kset.end()) { auto pair = field_meta->add_index_params(); pair->set_key(param.key()); pair->set_value(param.value()); kset.insert(param.key()); } } for (const auto& param : new_type_params_) { if (kset.find(param.key()) == kset.end()) { auto pair = field_meta->add_index_params(); pair->set_key(param.key()); pair->set_value(param.value()); kset.insert(param.key()); } } for (const auto& param : new_extra_params_) { if (kset.find(param.key()) == kset.end()) { auto pair = field_meta->add_index_params(); pair->set_key(param.key()); pair->set_value(param.value()); kset.insert(param.key()); } } return Status::Ok(); } } // namespace milvus::local ================================================ FILE: src/create_index_task.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include "common.h" #include "pb/common.pb.h" #include "pb/milvus.pb.h" #include "pb/schema.pb.h" #include "pb/segcore.pb.h" #include "status.h" namespace milvus::local { class CreateIndexTask final : NonCopyableNonMovable { public: CreateIndexTask( const ::milvus::proto::milvus::CreateIndexRequest* create_index_request, const ::milvus::proto::schema::CollectionSchema* schema) : create_index_request_(create_index_request), schema_(schema) { field_id_ = 0; collectionid_ = 0; is_auto_index_ = false; } virtual ~CreateIndexTask() = default; public: Status Process(milvus::proto::segcore::FieldIndexMeta* field_meta); private: Status ParseIndexParams(); void WrapUserIndexParams(const std::string& metrics_type); bool AddAutoIndexParams(KVMap* index_params); Status CheckTrain(const ::milvus::proto::schema::FieldSchema& field, KVMap& index_params); bool ValidateStringIndexType(const std::string& index_type) { return index_type == kDefaultStringIndexType || index_type == "marisa-trie" || index_type == kInvertedIndexType; } bool ValidateArithmeticIndexType(const std::string& index_type) { return index_type == kDefaultStringIndexType || index_type == "Asceneding" || index_type == kInvertedIndexType; } bool FillDimension(const ::milvus::proto::schema::FieldSchema& field, KVMap* index_params); bool IsVectorIndex(::milvus::proto::schema::DataType dtype); private: // string of ::milvus::proto::milvus::CreateIndexRequest; const ::milvus::proto::milvus::CreateIndexRequest* create_index_request_; const ::milvus::proto::schema::CollectionSchema* schema_; std::vector<::milvus::proto::common::KeyValuePair> new_index_params_; std::vector<::milvus::proto::common::KeyValuePair> new_type_params_; std::vector<::milvus::proto::common::KeyValuePair> new_extra_params_; std::string index_name_; int64_t field_id_; int64_t collectionid_; bool is_auto_index_; }; } // namespace milvus::local ================================================ FILE: src/delete_task.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "delete_task.h" #include "antlr4-runtime.h" #include "log/Log.h" #include "parser/parser.h" #include "parser/utils.h" #include "schema_util.h" #include "status.h" #include "string_util.hpp" namespace milvus::local { Status DeleteTask::Process(::milvus::proto::plan::PlanNode* plan) { if (string_util::Trim(delete_request_->expr()) == "") { return Status::ParameterInvalid("expr cannot be empty"); } CHECK_STATUS( schema_util::ParseExpr(delete_request_->expr(), *schema_, plan->mutable_query()->mutable_predicates()), ""); auto pk_id = schema_util::GetPkId(*schema_); if (!pk_id.has_value()) { LOG_ERROR("Can not found {}'s primary key", schema_->name()); return Status::CollectionIllegalSchema(); } plan->add_output_field_ids(*pk_id); return Status::Ok(); } } // namespace milvus::local ================================================ FILE: src/delete_task.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include "pb/milvus.pb.h" #include "pb/schema.pb.h" #include "pb/plan.pb.h" #include "common.h" #include "status.h" namespace milvus::local { class DeleteTask : NonCopyableNonMovable { public: DeleteTask(const ::milvus::proto::milvus::DeleteRequest* delete_request, const ::milvus::proto::schema::CollectionSchema* schema) : delete_request_(delete_request), schema_(schema) { } virtual ~DeleteTask() = default; Status Process(::milvus::proto::plan::PlanNode* plan); private: const ::milvus::proto::milvus::DeleteRequest* delete_request_; const ::milvus::proto::schema::CollectionSchema* schema_; }; } // namespace milvus::local ================================================ FILE: src/function/bm25_function.cpp ================================================ // Copyright (C) 2019-2025 Zilliz. 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 #include "function/bm25_function.h" #include "common.h" #include "log/Log.h" #include "schema_util.h" #include "common.pb.h" #include "schema.pb.h" #include "status.h" #include #include #include namespace milvus::local::function { using milvus::local::schema_util::SparseVectorToByte; constexpr int substringLengthForCRC = 100; Status BM25Function::ProcessInsert( const std::vector& inputs, std::vector* outputs) { if (inputs.size() != 1) { return Status::ParameterInvalid( "BM25Function inputs size must be 1, but got {}", inputs.size()); } if (inputs[0]->type() != milvus::proto::schema::DataType::VarChar) { std::cout << inputs[0]->field_name() << inputs[0]->type() << std::endl; return Status::ParameterInvalid( "BM25Function input type must be VarChar"); } if (!inputs[0]->scalars().has_string_data()) { return Status::ParameterInvalid( "BM25Function input data is not string"); } auto docs = inputs[0]->scalars().string_data(); auto tk = this->tokenizer_.Clone(); milvus::proto::schema::FieldData sparse_field; sparse_field.set_type(::milvus::proto::schema::DataType::SparseFloatVector); sparse_field.set_field_name(meta_->output_fields_[0]->name()); auto sparse_array = sparse_field.mutable_vectors()->mutable_sparse_float_vector(); sparse_array->set_dim(0); for (int i = 0; i < docs.data_size(); i++) { auto&& doc = docs.data(i); SparseVector embd; Embedding(doc, &embd); //default little-endian macOS\Linux auto buf = sparse_array->add_contents(); int dim = embd.size(); SparseVectorToByte(embd, buf); if (sparse_array->dim() < dim) sparse_array->set_dim(dim); } outputs->push_back(sparse_field); return Status::Ok(); } Status BM25Function::ProcessSearch( const milvus::proto::common::PlaceholderGroup& input_plg, milvus::proto::common::PlaceholderGroup* output_plg) { auto& ph = input_plg.placeholders(0); if (ph.type() != milvus::proto::common::PlaceholderType::VarChar) { return Status::ParameterInvalid( "BM25 function error, the input is not varch"); } std::vector embds; for (const auto& doc : ph.values()) { SparseVector embd; Embedding(doc, &embd); embds.emplace_back(std::move(embd)); } auto plg_value = output_plg->add_placeholders(); plg_value->set_tag(kPlaceholderTag); plg_value->set_type( ::milvus::proto::common::PlaceholderType::SparseFloatVector); for (auto&& embd : embds) { std::string buf; SparseVectorToByte(embd, &buf); plg_value->add_values(buf); } return Status::Ok(); } Status BM25Function::Embedding(const std::string& doc, SparseVector* embd) { auto tk = this->tokenizer_.Clone(); auto tokenstream = tk->CreateTokenStream(std::string(doc)); while (tokenstream->advance()) { auto token = tokenstream->get_token(); if (token.size() > substringLengthForCRC) { token = token.substr(0, substringLengthForCRC); }; uint32_t crc = crc32(0, reinterpret_cast(token.c_str()), token.length()); (*embd)[crc % UINT32_MAX] += 1; } return Status::Ok(); } } // namespace milvus::local::function ================================================ FILE: src/function/bm25_function.h ================================================ // Copyright (C) 2019-2025 Zilliz. 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. #pragma once #include #include #include "common.h" #include "function/function.h" #include "schema.pb.h" #include "status.h" #include "tantivy/tokenizer.h" namespace milvus::local::function { class BM25Function : public TransformFunctionBase { public: BM25Function(std::unique_ptr meta, std::string& params) : TransformFunctionBase(std::move(meta)), tokenizer_(std::move(params)) { } public: static std::pair> NewBM25Function(const milvus::proto::schema::CollectionSchema* schema, const milvus::proto::schema::FunctionSchema* func_schema) { auto [s, meta] = FunctionMeta::Create(schema, func_schema); if (!s.IsOk()) { return std::make_pair(s, nullptr); } if (meta->func_schema_->output_field_names_size() != 1) { return std::make_pair( Status::ParameterInvalid( "BM25 function only supports one onput, but got {}", meta->output_fields_.size()), nullptr); } if (meta->func_schema_->input_field_names_size() != 1) { return std::make_pair( Status::ParameterInvalid( "BM25 function only supports one input, but got {}", meta->output_fields_.size()), nullptr); } if (meta->input_fields_[0]->data_type() != milvus::proto::schema::DataType::VarChar) { return std::make_pair( Status::ParameterInvalid( "BM25 function only supports varchar input, but got {}", milvus::proto::schema::DataType_Name( meta->input_fields_[0]->data_type())), nullptr); } if (meta->output_fields_[0]->data_type() != milvus::proto::schema::DataType::SparseFloatVector) { return std::make_pair( Status::ParameterInvalid( "BM25 function only supports sparse " "vector output, but got {}", milvus::proto::schema::DataType_Name( meta->output_fields_[0]->data_type())), nullptr); } std::string token_params; for (const auto& param : meta->input_fields_[0]->type_params()) { if (param.key() == "analyzer_params") { token_params = param.value(); break; } } return std::make_pair( Status::Ok(), std::unique_ptr( new BM25Function(std::move(meta), token_params))); } public: Status ProcessInsert( const std::vector& inputs, std::vector* outputs) override; Status ProcessSearch(const milvus::proto::common::PlaceholderGroup& input_plg, milvus::proto::common::PlaceholderGroup* output_plg) override; private: Status Embedding(const std::string& doc, SparseVector* embd); private: milvus::tantivy::Tokenizer tokenizer_; }; } // namespace milvus::local::function ================================================ FILE: src/function/function.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include #include "common.h" #include "log/Log.h" #include "pb/schema.pb.h" #include "pb/common.pb.h" #include "pb/milvus.pb.h" #include "status.h" #include "string_util.hpp" namespace milvus::local::function { using milvus::local::Status; class FunctionMeta : public NonCopyableNonMovable { private: FunctionMeta(const milvus::proto::schema::CollectionSchema* schema, const milvus::proto::schema::FunctionSchema* func_schema, const std::vector input_fields, const std::vector output_fields) : func_schema_(func_schema), input_fields_(input_fields), output_fields_(output_fields), collection_name_(schema->name()), function_type_name_(func_schema->GetTypeName()), function_name_(func_schema->name()) { } public: virtual ~FunctionMeta() = default; public: static std::pair> Create(const milvus::proto::schema::CollectionSchema* schema, const milvus::proto::schema::FunctionSchema* func_schema) { std::map name_field_map; for (const auto& field : schema->fields()) { name_field_map[field.name()] = &field; } std::vector output_fields; for (const auto& name : func_schema->output_field_names()) { auto it = name_field_map.find(name); if (it == name_field_map.end()) { auto err = string_util::SFormat( "Can not find function output {} in schema", name); LOG_ERROR(err); return std::make_pair(Status::ParameterInvalid(err), nullptr); } output_fields.push_back(it->second); } std::vector input_fields; for (const auto& name : func_schema->input_field_names()) { auto it = name_field_map.find(name); if (it == name_field_map.end()) { auto err = string_util::SFormat( "Can not find function input {} in schema", name); LOG_ERROR(err); return std::make_pair(Status::ParameterInvalid(err), nullptr); } input_fields.push_back(it->second); } return std::make_pair( Status::Ok(), std::unique_ptr(new FunctionMeta( schema, func_schema, input_fields, output_fields))); } public: const milvus::proto::schema::FunctionSchema* func_schema_; const std::vector input_fields_; const std::vector output_fields_; const std::string collection_name_; const std::string function_type_name_; const std::string function_name_; }; class TransformFunctionBase { public: TransformFunctionBase(std::unique_ptr meta) : meta_(std::move(meta)) { } virtual ~TransformFunctionBase() = default; public: virtual Status ProcessInsert( const std::vector& inputs, std::vector* outputs) = 0; virtual Status ProcessSearch(const milvus::proto::common::PlaceholderGroup& input_plg, milvus::proto::common::PlaceholderGroup* output_plg) = 0; const milvus::proto::schema::FieldSchema* GetFunctionOutputFieldSchema(uint i) { return meta_->output_fields_[i]; } const milvus::proto::schema::FieldSchema* GetFunctioninputFieldSchema(uint i) { return meta_->input_fields_[i]; } const std::set GetInputFieldNames() { std::set field_names; for (const auto& f : meta_->input_fields_) { field_names.insert(f->name()); } return field_names; } protected: std::unique_ptr meta_; }; } // namespace milvus::local::function ================================================ FILE: src/function/function_executor.cpp ================================================ // Copyright (C) 2019-2025 Zilliz. 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. #include "function/function_executor.h" #include #include #include #include #include "common.h" #include "function/bm25_function.h" #include "function/function_util.h" #include "log/Log.h" #include "schema.pb.h" #include "status.h" namespace milvus::local::function { std::pair> FunctionExecutor::Create(const milvus::proto::schema::CollectionSchema* schema, std::string field_name) { for (const auto& f_schema : schema->functions()) { if (f_schema.output_field_names(0) == field_name) { auto [s, f] = CreateFunction(schema, &f_schema); if (!s.IsOk()) { return std::make_pair(s, nullptr); } std::vector> functions_; functions_.emplace_back(std::move(f)); std::unique_ptr executor( new FunctionExecutor(std::move(functions_))); return std::make_pair(Status::Ok(), std::move(executor)); } } return std::make_pair( Status::ParameterInvalid("No function's output is {}", field_name), nullptr); } std::pair> FunctionExecutor::Create( const milvus::proto::schema::CollectionSchema* schema) { std::vector> functions_; for (const auto& f_schemn : schema->functions()) { auto [s, f] = CreateFunction(schema, &f_schemn); if (!s.IsOk()) { return std::make_pair(s, nullptr); } functions_.emplace_back(std::move(f)); } std::unique_ptr executor( new FunctionExecutor(std::move(functions_))); return std::make_pair(Status::Ok(), std::move(executor)); } std::pair> FunctionExecutor::CreateFunction( const milvus::proto::schema::CollectionSchema* schema, const milvus::proto::schema::FunctionSchema* function_schema) { if (function_schema->type() == milvus::proto::schema::FunctionType::BM25) { auto [s, f] = BM25Function::NewBM25Function(schema, function_schema); if (!s.IsOk()) { return std::make_pair(s, nullptr); } return std::make_pair(Status::Ok(), std::move(f)); } else { return std::make_pair( Status::ParameterInvalid("Unsupported function: {}", milvus::proto::schema::FunctionType_Name( function_schema->type())), nullptr); } } Status FunctionExecutor::ProcessInsert(milvus::proto::milvus::InsertRequest* insert) { for (const auto& f : functions_) { CHECK_STATUS(ProcessSingeFunction(insert, f), ""); } return Status::Ok(); } Status FunctionExecutor::ProcessSingeFunction( milvus::proto::milvus::InsertRequest* insert, const std::unique_ptr& f) { auto field_names = f->GetInputFieldNames(); std::vector inputs; for (int i = 0; i < insert->fields_data_size(); i++) { if (field_names.find(insert->fields_data(i).field_name()) != field_names.end()) { inputs.emplace_back(&insert->fields_data(i)); } } std::vector outputs; CHECK_STATUS(f->ProcessInsert(inputs, &outputs), ""); for (auto& field : outputs) { insert->mutable_fields_data()->Add(std::move(field)); } return Status::Ok(); } Status FunctionExecutor::ProcessSearch(milvus::proto::milvus::SearchRequest* search) { milvus::proto::common::PlaceholderGroup ph_group; if (!ph_group.ParseFromString(search->placeholder_group())) { return Status::ParameterInvalid("Parse placehoder string failed"); } if (ph_group.placeholders_size() != 1) { return Status::ParameterInvalid("placeholders size is not equal 1"); } milvus::proto::common::PlaceholderGroup output; CHECK_STATUS(functions_[0]->ProcessSearch(ph_group, &output), ""); search->mutable_placeholder_group()->assign(output.SerializeAsString()); return Status::Ok(); } } // namespace milvus::local::function ================================================ FILE: src/function/function_executor.h ================================================ // Copyright (C) 2019-2025 Zilliz. 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. #pragma once #include #include #include #include #include #include "common.h" #include "function/function.h" #include "status.h" namespace milvus::local::function { using milvus::local::Status; class FunctionExecutor : NonCopyableNonMovable { public: virtual ~FunctionExecutor() = default; private: explicit FunctionExecutor( std::vector> functions) : functions_(std::move(functions)) { } public: Status ProcessInsert(milvus::proto::milvus::InsertRequest* insert); Status ProcessSearch(milvus::proto::milvus::SearchRequest* search); private: Status ProcessSingeFunction(milvus::proto::milvus::InsertRequest* insert, const std::unique_ptr& f); public: static std::pair> Create(const milvus::proto::schema::CollectionSchema* schema, std::string function_name); static std::pair> Create(const milvus::proto::schema::CollectionSchema* schema); private: static std::pair> CreateFunction( const milvus::proto::schema::CollectionSchema* schema, const milvus::proto::schema::FunctionSchema* function_schema); private: const std::vector> functions_; //std::unique_ptr function_; }; } // namespace milvus::local::function ================================================ FILE: src/function/function_util.h ================================================ // Copyright (C) 2019-2025 Zilliz. 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 #pragma once #include #include "pb/common.pb.h" #include "pb/milvus.pb.h" #include "status.h" namespace milvus::local::function { template class FunctionUtil { public: static Status ParseFieldData(milvus::proto::schema::FieldData* field_data, const std::string& field_name, std::vector* values); }; template Status FunctionUtil::ParseFieldData(milvus::proto::schema::FieldData* field_data, const std::string& field_name, std::vector* values) { return Status::Ok(); } } // namespace milvus::local::function ================================================ FILE: src/hybrid_search_task.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "hybrid_search_task.h" #include #include #include #include #include #include "common.h" #include "common.pb.h" #include "log/Log.h" #include "parser/utils.h" #include "re_scorer.h" #include "schema_util.h" #include "status.h" #include "string_util.hpp" #include "milvus_id.hpp" namespace milvus::local { Status HyBridSearchTask::ParseRankParams( const ::google::protobuf::RepeatedPtrField< ::milvus::proto::common::KeyValuePair>& params) { for (const auto& param : params) { if (param.key() == kLimitKey) { try { limit_ = std::stoll(param.value()); } catch (std::exception& e) { LOG_ERROR("Parse limit failed, limit: {}, err: {}", param.value(), e.what()); return Status::ParameterInvalid(); } } else if (param.key() == kOffsetKey) { try { offset_ = std::stoll(param.value()); } catch (std::exception& e) { LOG_ERROR("Parse offset failed, offset: {}, err: {}", param.value(), e.what()); return Status::ParameterInvalid(); } } else if (param.key() == kRoundDecimalKey) { try { round_decimal_ = std::stoll(param.value()); } catch (std::exception& e) { LOG_ERROR( "Parse round_decimal failed, round_decimal: {}, err: {}", param.value(), e.what()); return Status::ParameterInvalid(); } } } if (offset_ < 0) { return Status::ParameterInvalid( "{} {} is invalid, should be gte than 0", kOffsetKey, offset_); } if (limit_ <= 0) { return Status::ParameterInvalid( "{} {} is invalid, should be greater than 0", kLimitKey, limit_); } int64_t depth = offset_ + limit_; if (depth <= 0 || depth > kTopkLimit) { return Status::ParameterInvalid( "(offset+limit) should be in range [1, {}], but got {}", kTopkLimit, depth); } return Status::Ok(); } Status HyBridSearchTask::GetMetricType( const ::milvus::proto::milvus::SearchRequest& req, std::string* metric) { std::string ann_field; for (const auto& param : req.search_params()) { if (param.key() == kMetricTypeKey) { *metric = param.value(); } else if (param.key() == kAnnFieldKey) { ann_field = param.value(); } } if (ann_field.empty()) { return Status::ParameterInvalid("Ann field not found"); } const ::milvus::proto::schema::FieldSchema* field; auto s = schema_util::FindVectorField(*schema_, ann_field, &field); CHECK_STATUS(s, ""); std::string index_metric; for (const auto& index_str : *all_index_) { milvus::proto::segcore::FieldIndexMeta field_index; if (!field_index.ParseFromString(index_str)) { return Status::ServiceInternal("Error index info in db"); } if (field_index.fieldid() == field->fieldid()) { index_metric = schema_util::GetIndexMetricType(field_index); } } if (metric->empty()) *metric = index_metric; if (metric->empty() || *metric != index_metric) { return Status::ParameterInvalid( "fail to search: metric type not match: invalid " "[expected={}][actual={}]", index_metric, *metric); } return Status::Ok(); } Status HyBridSearchTask::ProcessSearch( const ::milvus::proto::milvus::HybridSearchRequest* request, std::vector<::milvus::proto::milvus::SearchRequest>* search_requests) { if (request->requests_size() <= 0) { return Status::ParameterInvalid("No subrequest found"); } if (!schema_util::TranslateOutputFields(request->output_fields(), *schema_, false, &output_fields_, &user_output_fields_)) { return Status::ParameterInvalid(); } CHECK_STATUS(ParseRankParams(request->rank_params()), ""); CHECK_STATUS( NewReScorers( request->requests_size(), request->rank_params(), &re_scorers_), ""); nq_ = request->requests(0).nq(); for (int64_t i = 0; i < request->requests_size(); i++) { auto req = request->requests(i); if (nq_ != req.nq()) { return Status::ParameterInvalid( "sub search request nq should be the same: invalid " "parameter[expected={}][actual={}]", nq_, req.nq()); } // search without output_fields ::milvus::proto::milvus::SearchRequest search_request; search_request.set_collection_name(request->collection_name()); search_request.mutable_partition_names()->CopyFrom( request->partition_names()); search_request.set_not_return_all_meta(request->not_return_all_meta()); search_request.set_consistency_level(request->consistency_level()); search_request.set_use_default_consistency( request->use_default_consistency()); search_request.set_search_by_primary_keys(false); search_request.set_dsl(req.dsl()); search_request.set_placeholder_group(req.placeholder_group()); search_request.set_dsl_type(req.dsl_type()); // need remove offset in subrequest for (const auto& pair : req.search_params()) { if (pair.key() != kOffsetKey) { auto new_pair = search_request.add_search_params(); new_pair->set_key(pair.key()); new_pair->set_value(pair.value()); } } search_request.set_nq(req.nq()); std::string metric; CHECK_STATUS(GetMetricType(search_request, &metric), ""); re_scorers_[i]->SetMetricType(metric); search_requests->push_back(search_request); } return Status::Ok(); } Status HyBridSearchTask::PostProcessSearch( std::vector<::milvus::proto::milvus::SearchResults>& search_results, ::milvus::proto::milvus::SearchResults* search_result) { search_result->mutable_results()->set_num_queries(nq_); search_result->mutable_results()->set_top_k(limit_); for (size_t i = 0; i < search_results.size(); i++) { re_scorers_[i]->ReScore(&search_results[i]); } std::vector> accumulated_scores(nq_); for (const auto& req : search_results) { int64_t start = 0; for (int64_t i = 0; i < nq_; i++) { int64_t topk = req.results().topks(i); for (int64_t j = start; j < start + topk; j++) { MilvusID id(req.results().ids(), j); if (accumulated_scores[i].find(id) == accumulated_scores[i].end()) { accumulated_scores[i][id] = req.results().scores(j); } else { accumulated_scores[i][id] += req.results().scores(j); } } start += topk; } } for (int64_t i = 0; i < nq_; i++) { auto id_scores = accumulated_scores[i]; if (id_scores.size() < offset_) { search_result->mutable_results()->add_topks(0); continue; } std::vector> sorted_id_scores( id_scores.begin(), id_scores.end()); std::sort(sorted_id_scores.begin(), sorted_id_scores.end(), [](const std::pair& a, const std::pair& b) { return a.second > b.second; }); auto begin = sorted_id_scores.begin() + offset_; auto end = offset_ + limit_ < sorted_id_scores.size() ? sorted_id_scores.begin() + offset_ + limit_ : sorted_id_scores.end(); auto topk_id_scores = std::vector>(begin, end); search_result->mutable_results()->add_topks(topk_id_scores.size()); for (const auto& id_score_pair : topk_id_scores) { search_result->mutable_results()->add_scores(id_score_pair.second); id_score_pair.first.AppendToIDs( search_result->mutable_results()->mutable_ids()); } } return Status::Ok(); } void HyBridSearchTask::ProcessQuery( const ::milvus::proto::milvus::HybridSearchRequest* r, const ::milvus::proto::milvus::SearchResults* search_result, ::milvus::proto::milvus::QueryRequest* query_req) { query_req->set_collection_name(r->collection_name()); query_req->mutable_output_fields()->CopyFrom(r->output_fields()); query_req->mutable_partition_names()->CopyFrom(r->partition_names()); query_req->set_not_return_all_meta(true); query_req->set_consistency_level( ::milvus::proto::common::ConsistencyLevel::Strong); query_req->set_use_default_consistency(false); std::string pk_name = schema_util::GetPkName(*schema_).value(); if (search_result->results().ids().has_int_id()) { auto ids_str = string_util::Join( ",", search_result->results().ids().int_id().data()); auto expr = string_util::SFormat("{} in [{}]", pk_name, ids_str); query_req->set_expr(expr); } else { std::vector ids; for (int i = 0; i < search_result->results().ids().str_id().data_size(); i++) { ids.emplace_back( "'" + search_result->results().ids().str_id().data(i) + "'"); } auto ids_str = string_util::Join(",", ids); auto expr = string_util::SFormat("{} in [{}]", pk_name, ids_str); query_req->set_expr(expr); } } Status HyBridSearchTask::PostProcess( const RetrieveResult& query_result, ::milvus::proto::milvus::SearchResults* search_result) { milvus::proto::segcore::RetrieveResults seg_ret; seg_ret.ParseFromArray(query_result.retrieve_result_.proto_blob, query_result.retrieve_result_.proto_size); // Copy field data from query result // Reorganize Results. The order of query result ids will be altered and differ from queried ids. // We should reorganize query results to keep the order of original queried ids. For example: // query expr pk in [3, 5, 1, 3, 5, 2] // query result: [3, 5, 1, 2] // need reorganize std::map offsets; int query_size = schema_util::IDsSize(seg_ret.ids()); for (int i = 0; i < query_size; i++) { offsets[MilvusID(seg_ret.ids(), i)] = i; } int search_size = schema_util::IDsSize(search_result->results().ids()); std::vector indexes; for (int i = 0; i < search_size; i++) { indexes.push_back(offsets[MilvusID(search_result->results().ids(), i)]); } std::vector field_ids; schema_util::GetOutputFieldsIds(output_fields_, *schema_, &field_ids); for (const auto& field_data : seg_ret.fields_data()) { if (std::find(field_ids.begin(), field_ids.end(), field_data.field_id()) == field_ids.end()) { continue; } auto new_data = search_result->mutable_results()->add_fields_data(); new_data->set_type(field_data.type()); new_data->set_field_name(field_data.field_name()); new_data->set_field_id(field_data.field_id()); new_data->set_is_dynamic(field_data.is_dynamic()); schema_util::PickFieldDataByIndex(field_data, indexes, new_data); } for (const auto& name : user_output_fields_) { search_result->mutable_results() ->mutable_output_fields() ->Add() ->append(name); } FillInFieldInfo(search_result->mutable_results()); return Status::Ok(); } void HyBridSearchTask::FillInFieldInfo( ::milvus::proto::schema::SearchResultData* result_data) { std::variant<::milvus::proto::schema::SearchResultData*, ::milvus::proto::milvus::QueryResults*> result_var; result_var = result_data; schema_util::FillInFieldInfo(output_fields_, *schema_, result_var); } } // namespace milvus::local ================================================ FILE: src/hybrid_search_task.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include "pb/milvus.pb.h" #include "pb/schema.pb.h" #include "pb/plan.pb.h" #include "pb/segcore.pb.h" #include "retrieve_result.h" #include "common.h" #include "status.h" #include "re_scorer.h" namespace milvus::local { class HyBridSearchTask : NonCopyableNonMovable { public: HyBridSearchTask(const ::milvus::proto::schema::CollectionSchema* schema, const std::vector* all_index) : schema_(schema), all_index_(all_index), offset_(0), limit_(-1), round_decimal_(-1), nq_(-1) { } virtual ~HyBridSearchTask() = default; Status ProcessSearch( const ::milvus::proto::milvus::HybridSearchRequest* request, std::vector<::milvus::proto::milvus::SearchRequest>* search_requests); Status PostProcessSearch( std::vector<::milvus::proto::milvus::SearchResults>& search_results, ::milvus::proto::milvus::SearchResults* search_result); void ProcessQuery(const ::milvus::proto::milvus::HybridSearchRequest* r, const ::milvus::proto::milvus::SearchResults* search_result, ::milvus::proto::milvus::QueryRequest* query_req); Status PostProcess(const RetrieveResult& query_result, ::milvus::proto::milvus::SearchResults* search_result); const ::milvus::proto::schema::CollectionSchema* GetSchema() { return schema_; } void FillInFieldInfo(::milvus::proto::schema::SearchResultData* result_data); private: Status ParseRankParams(const ::google::protobuf::RepeatedPtrField< ::milvus::proto::common::KeyValuePair>& params); Status GetMetricType(const ::milvus::proto::milvus::SearchRequest& req, std::string* metric); private: const ::milvus::proto::schema::CollectionSchema* schema_; const std::vector* all_index_; std::vector output_fields_; std::vector user_output_fields_; uint64_t offset_; int64_t limit_; int64_t round_decimal_; int64_t nq_; std::vector> re_scorers_; }; } // namespace milvus::local ================================================ FILE: src/index.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "index.h" #include "common.h" #include "log/Log.h" #include "status.h" #include namespace milvus::local { Status Index::CreateCollection(const std::string& collection_name, const std::string& schema_proto, const std::string& index_proto) { if (HasLoaded(collection_name)) { LOG_INFO("Collection {} alread load", collection_name); return Status::Ok(); } auto c = std::make_unique(); CHECK_STATUS( c->SetCollectionInfo(collection_name, schema_proto, index_proto), "Create collection failed: "); collections_[collection_name] = std::move(c); return Status::Ok(); } bool Index::DropCollection(const std::string& collection_name) { if (collections_.find(collection_name) != collections_.end()) { collections_.erase(collection_name); } return true; } Status Index::CreateIndex(const std::string& collection_name, const std::string& index_proto) { if (collections_.find(collection_name) == collections_.end()) { LOG_ERROR("Collecton {} not existed", collection_name); return Status::CollectionNotFound(); } CHECK_STATUS(collections_[collection_name]->SetIndexMeta(index_proto), "Create index failed:"); return Status::Ok(); } Status Index::Insert(const std::string& collection_name, int64_t size, const std::string& insert_record_prot) { if (collections_.find(collection_name) == collections_.end()) { LOG_ERROR("Collecton {} not existed", collection_name); return Status::CollectionNotFound(); } return collections_[collection_name]->Insert(size, insert_record_prot); } Status Index::Retrieve(const std::string& collection_name, const std::string& plan, RetrieveResult* result) { if (collections_.find(collection_name) == collections_.end()) { LOG_ERROR("Collecton {} not existed", collection_name); return Status::CollectionNotFound(); } return collections_[collection_name]->Retrieve(plan, result); } Status Index::Search(const std::string& collection_name, const std::string& plan, const std::string& placeholder_group, SearchResult* result) { if (collections_.find(collection_name) == collections_.end()) { LOG_ERROR("Collecton {} not existed", collection_name); return Status::CollectionNotFound(); } return collections_[collection_name]->Search( plan, placeholder_group, result); } Status Index::DeleteByIds(const std::string& collection_name, const std::string& ids, int64_t size) { if (collections_.find(collection_name) == collections_.end()) { LOG_ERROR("Collecton {} not existed", collection_name); return Status::CollectionNotFound(); } return collections_[collection_name]->DeleteByIds(ids, size); } } // namespace milvus::local ================================================ FILE: src/index.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include "segcore_wrapper.h" #include "common.h" #include "status.h" namespace milvus::local { class Index final : NonCopyableNonMovable { public: Index() = default; virtual ~Index() = default; public: // meta interface Status CreateCollection(const std::string& collection_name, const std::string& schema_proto, const std::string& index_proto); bool DropCollection(const std::string& collection_name); bool HasLoaded(const std::string& collection_name) { return collections_.find(collection_name) != collections_.end(); } Status CreateIndex(const std::string& collection_name, const std::string& index_proto); Status Insert(const std::string& collection_name, int64_t size, const std::string& insert_record_proto); Status Retrieve(const std::string& collection_name, const std::string& expr, RetrieveResult* result); Status Search(const std::string& collection_name, const std::string& plan, const std::string& placeholder_group, SearchResult* result); Status DeleteByIds(const std::string& collection_name, const std::string& ids, int64_t size); private: std::map> collections_; }; } // namespace milvus::local ================================================ FILE: src/insert_task.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "insert_task.h" #include #include #include #include #include #include #include #include #include "common.h" #include "function/function_executor.h" #include "log/Log.h" #include "pb/schema.pb.h" #include "pb/segcore.pb.h" #include "schema_util.h" #include "status.h" #include "string_util.hpp" namespace milvus::local { using milvus::local::function::FunctionExecutor; using DType = ::milvus::proto::schema::DataType; int64_t InsertTask::cur_id_ = 0; InsertTask::InsertTask(::milvus::proto::milvus::InsertRequest* r, const ::milvus::proto::schema::CollectionSchema* schema) : insert_request_(r), schema_(schema), num_rows_(0) { } bool InsertTask::AddSystemField() { num_rows_ = insert_request_->num_rows(); if (num_rows_ <= 0) { LOG_ERROR("Error rows nums {}", num_rows_); return false; } auto timestamps = GetTimestamps(num_rows_); auto row_ids = GetRowIds(timestamps); auto row_field = insert_request_->add_fields_data(); row_field->set_type(DType::Int64); row_field->set_field_name(kRowIdFieldName); row_field->set_field_id(kRowIdField); for (auto id : row_ids) { row_field->mutable_scalars()->mutable_long_data()->add_data(id); } auto time_field = insert_request_->add_fields_data(); time_field->set_type(DType::Int64); time_field->set_field_name(kTimeStampFieldName); time_field->set_field_id(kTimeStampField); for (auto t : timestamps) { time_field->mutable_scalars()->mutable_long_data()->add_data(t); } return true; } bool InsertTask::GenFieldMap() { for (const auto& field : insert_request_->fields_data()) { field_data_map_.emplace(field.field_name(), &field); } for (const auto& field : schema_->fields()) { if (field_data_map_.find(field.name()) == field_data_map_.end()) { if (field.is_primary_key() && field.autoid()) { auto row_id_field = field_data_map_.at(kRowIdFieldName); auto pk_field = insert_request_->add_fields_data(); pk_field->set_field_name(field.name()); pk_field->set_field_id(field.fieldid()); pk_field->set_type(field.data_type()); if (field.data_type() == DType::VarChar) { for (uint32_t i = 0; i < num_rows_; i++) { pk_field->mutable_scalars() ->mutable_string_data() ->add_data(std::to_string(std::any_cast( schema_util::GetField(*row_id_field, i)))); } } else { for (uint32_t i = 0; i < num_rows_; i++) { pk_field->mutable_scalars() ->mutable_long_data() ->add_data(std::any_cast( schema_util::GetField(*row_id_field, i))); } } field_data_map_.emplace(field.name(), pk_field); } else { LOG_ERROR("Lost field {}", field.name()); return false; } } } return true; } bool InsertTask::CheckDynamicFieldData() { if (!schema_->enable_dynamic_field()) { return true; } for (int i = 0; i < insert_request_->fields_data_size(); i++) { auto field = insert_request_->mutable_fields_data(i); if (field->is_dynamic()) { field->set_field_name(kMetaFieldName); //TODO check json return true; } } // no dynamic field found, and default value auto dy_field = insert_request_->add_fields_data(); dy_field->set_field_name(kMetaFieldName); dy_field->set_is_dynamic(true); for (const auto& schema_field : schema_->fields()) { if (schema_field.is_dynamic()) { dy_field->set_field_id(schema_field.fieldid()); break; } } dy_field->set_type(::milvus::proto::schema::DataType::JSON); for (uint32_t i = 0; i < insert_request_->num_rows(); i++) { dy_field->mutable_scalars()->mutable_json_data()->add_data()->assign( "{}"); } return true; } Status InsertTask::Process(Rows* rows) { if (!(AddSystemField() && CheckDynamicFieldData())) { return Status::ParameterInvalid(); } if (schema_util::HasFunction(*schema_)) { auto [s, executor] = FunctionExecutor::Create(schema_); CHECK_STATUS(s, ""); CHECK_STATUS(executor->ProcessInsert(insert_request_), ""); } if (!GenFieldMap()) { return Status::ParameterInvalid(); } CHECK_STATUS(CheckOrSetVectorDim(), ""); auto pk_field_name = schema_util::GetPkName(*schema_); if (!pk_field_name.has_value()) { auto err = string_util::SFormat("Collection {} has no pk", schema_->name()); LOG_ERROR(err); return Status::ParameterInvalid(err); } pk_type_ = field_data_map_.at(pk_field_name.value())->type(); for (uint32_t i = 0; i < num_rows_; i++) { ::milvus::proto::segcore::InsertRecord record; std::string pk; record.set_num_rows(1); for (const auto& field : schema_->fields()) { auto field_data = record.add_fields_data(); field_data->set_field_id(field.fieldid()); field_data->set_field_name(field.name()); field_data->set_type(field.data_type()); if (!schema_util::SliceFieldData( *field_data_map_.at(field.name()), std::vector>{{i, 1}}, field_data)) { LOG_ERROR("Parse field data failed"); return Status::FieldNotFound(); } if (field.name() == pk_field_name.value()) { if (field.data_type() == DType::Int64) { pk = std::to_string( field_data->scalars().long_data().data(0)); } else { pk = field_data->scalars().string_data().data(0); } } } rows->push_back(std::make_tuple(pk, record.SerializeAsString())); } return Status::Ok(); } Status InsertTask::CheckOrSetVectorDim() { int64_t num_rows = insert_request_->num_rows(); if (num_rows <= 0) { return Status::ParameterInvalid("Err num_rows: {}", num_rows); } for (const auto& field_schema : schema_->fields()) { if (field_schema.data_type() == DType::FloatVector) { // int64_t dim = field_data.vectors().dim(); auto field_data = field_data_map_.at(field_schema.name()); int64_t dim = schema_util::GetDim(field_schema); if (dim <= 0) { return Status::ParameterInvalid("Can not found dim info"); } int vect_size = field_data->vectors().float_vector().data_size(); if (vect_size % dim != 0) { return Status::ParameterInvalid( "the length({}) of float data should divide the dim({})", vect_size, dim); } int64_t vec_rows = vect_size / dim; if (vec_rows != num_rows) { return Status::ParameterInvalid( "the num_rows ({}) of field ({}) is not equal to passed " "num_rows ({}): [expected={}][actual={}]", vec_rows, field_data->field_name(), num_rows, num_rows, vec_rows); } } else if (field_schema.data_type() == DType::SparseFloatVector && !field_schema.is_function_output()) { // set dim, if bm25 function output not need to set dim. auto field_data = field_data_map_.at(field_schema.name()); for (int i = 0; i < field_data->vectors().sparse_float_vector().contents_size(); i++) { uint32_t dim = 0; const char* pos = field_data->vectors() .sparse_float_vector() .contents(i) .c_str(); size_t size = field_data->vectors() .sparse_float_vector() .contents(i) .size(); const char* end = pos + size; for (; pos < end; pos += 8) { dim = std::max(dim, *(reinterpret_cast(pos))) + 1; } const_cast<::milvus::proto::schema::FieldData*>(field_data) ->mutable_vectors() ->mutable_sparse_float_vector() ->set_dim(dim); } } } return Status::Ok(); } std::vector InsertTask::GetTimestamps(int64_t size) { auto ts = GetTimestamp(); return std::vector(size, ts); } uint64_t InsertTask::GetTimestamp() { // https://github.com/milvus-io/milvus/blob/master/docs/design_docs/20211214-milvus_hybrid_ts.md auto now = std::chrono::system_clock::now(); auto duration = now.time_since_epoch(); auto ms = std::chrono::duration_cast(duration).count(); return (ms << 18) + cur_id_; } std::vector InsertTask::GetRowIds(std::vector& timestamps) { size_t size = timestamps.size(); std::vector row_ids; for (size_t i = 0; i < size; i++) { row_ids.push_back(i + cur_id_ + timestamps[i]); } cur_id_ += size; return row_ids; } } // namespace milvus::local ================================================ FILE: src/insert_task.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include "pb/milvus.pb.h" #include "pb/schema.pb.h" #include "pb/segcore.pb.h" #include "status.h" #include "type.h" #include "common.h" namespace milvus::local { class InsertTask : NonCopyableNonMovable { public: InsertTask(::milvus::proto::milvus::InsertRequest* r, const ::milvus::proto::schema::CollectionSchema* schema); virtual ~InsertTask() = default; public: Status Process(Rows* insert_records); ::milvus::proto::schema::DataType PkType() { return pk_type_; } private: bool GenFieldMap(); Status CheckOrSetVectorDim(); std::vector GetTimestamps(int64_t size); uint64_t GetTimestamp(); std::vector GetRowIds(std::vector& timestamps); bool AddSystemField(); bool CheckDynamicFieldData(); private: static int64_t cur_id_; ::milvus::proto::milvus::InsertRequest* insert_request_; const ::milvus::proto::schema::CollectionSchema* schema_; std::map field_data_map_; uint32_t num_rows_; ::milvus::proto::schema::DataType pk_type_; }; } // namespace milvus::local ================================================ FILE: src/milvus_id.hpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include // #include "common.h" #include "schema.pb.h" namespace milvus::local { class MilvusID { enum IDType { INT, STR }; public: explicit MilvusID(int64_t id) { int_id_ = id; type_ = INT; } explicit MilvusID(const std::string& id) { str_id_ = id; type_ = STR; } explicit MilvusID(const ::milvus::proto::schema::IDs& ids, int64_t idx) { if (ids.has_int_id()) { int_id_ = ids.int_id().data(idx); type_ = INT; } else { str_id_ = ids.str_id().data(idx); type_ = STR; } } virtual ~MilvusID() = default; public: bool operator==(const MilvusID& right) const { if (type_ == INT) { return int_id_ == right.int_id_; } else { return str_id_ == right.str_id_; } } bool operator<(const MilvusID& right) const { if (type_ == INT) { return int_id_ < right.int_id_; } else { return str_id_ < right.str_id_; } } void AppendToIDs(::milvus::proto::schema::IDs* ids) const { if (type_ == INT) { ids->mutable_int_id()->add_data(int_id_); } else { ids->mutable_str_id()->add_data(str_id_); } } private: int64_t int_id_; std::string str_id_; IDType type_; }; } // namespace milvus::local ================================================ FILE: src/milvus_local.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "milvus_local.h" #include #include #include #include #include #include "common.h" #include "pb/schema.pb.h" #include "pb/segcore.pb.h" #include "schema_util.h" #include "status.h" #include "log/Log.h" #include "string_util.hpp" namespace milvus::local { #define CHECK_COLLECTION_EXIST(collection_name) \ do { \ CHECK_STATUS(CheckCollectionName(string_util::Trim(collection_name)), \ ""); \ if (!storage_.CollectionExist(collection_name)) { \ return Status::CollectionNotFound(); \ } \ } while (0) #define CHECK_COLLECTION_NOT_EXIST(collection_name) \ do { \ CHECK_STATUS(CheckCollectionName(string_util::Trim(collection_name)), \ ""); \ if (storage_.CollectionExist(collection_name)) { \ return Status::CollectionAlreadExist(); \ } \ } while (0) MilvusLocal::MilvusLocal(const char* db_file) : db_file_(db_file), storage_(db_file), initialized(false) { } MilvusLocal::~MilvusLocal() { } Status MilvusLocal::CheckCollectionName(const std::string& collection_name) { if (collection_name.empty()) { return Status::ParameterInvalid("collection name should not be empty"); } std::string invalid_msg = string_util::SFormat("Invalid collection {}. ", collection_name); if (collection_name.size() > 255) { return Status::ParameterInvalid( "{}, the length of a collection name must " "be less than 255 characters", invalid_msg); } char first = collection_name[0]; if (first != '_' && !string_util::IsAlpha(first)) { return Status::ParameterInvalid( "{} the first character of a collection {} must be an underscore " "or letter", invalid_msg, collection_name); } std::regex pattern("^[a-zA-Z_][a-zA-Z0-9_]*$"); if (!std::regex_match(collection_name, pattern)) { auto err = string_util::SFormat( "{}, collection name can only contain " "numbers, letters and underscores", invalid_msg); LOG_ERROR(err); return Status::ParameterInvalid(err); } return Status::Ok(); } bool MilvusLocal::Init() { std::lock_guard lock(mutex_); if (initialized) { LOG_WARN("Milvus has already initialized"); return false; } if (!storage_.Open()) { return false; } initialized = true; return true; } Status MilvusLocal::LoadCollection(const std::string& collection_name) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); if (index_.HasLoaded(collection_name)) { return Status::Ok(); } return DoLoadCollection(collection_name); } Status MilvusLocal::ReleaseCollection(const std::string& collection_name) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); if (index_.DropCollection(collection_name)) { return Status::Ok(); } return Status::SegcoreErr(); } Status MilvusLocal::GetLoadState(const std::string& collection_name) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); if (!index_.HasLoaded(collection_name)) { return Status::CollectionNotLoaded(); } return Status::CollectionLoaded(); } Status MilvusLocal::CreateCollection(const std::string& collection_name, const std::string& pk_name, const std::string& schema_proto) { std::lock_guard lock(mutex_); CHECK_STATUS(CheckCollectionName(string_util::Trim(collection_name)), ""); if (storage_.CollectionExist(collection_name)) { std::string db_schema_proto; if (!storage_.GetCollectionSchema(collection_name, &db_schema_proto)) { return Status::ServiceInternal(); } if (!schema_util::SchemaEquals(schema_proto, db_schema_proto)) { return Status::ParameterInvalid( "create duplicate collection with different parameters, " "collection {}", collection_name); } return Status::Ok(); } // CHECK_COLLECTION_NOT_EXIST(collection_name); CHECK_STATUS(index_.CreateCollection(collection_name, schema_proto, ""), ""); if (!storage_.CreateCollection(collection_name, pk_name, schema_proto)) { return Status::ServiceInternal(); } return Status::Ok(); } Status MilvusLocal::GetCollection(const std::string& collection_name, std::string* schema_proto) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); if (!storage_.GetCollectionSchema(collection_name, schema_proto)) { return Status::ServiceInternal(); } return Status::Ok(); } bool MilvusLocal::DropCollection(const std::string& collection_name) { std::lock_guard lock(mutex_); if (!storage_.CollectionExist(collection_name)) { LOG_WARN("Collection {} not existed", collection_name); return true; } return index_.DropCollection(collection_name) && storage_.DropCollection(collection_name); } void MilvusLocal::GetAllCollections(std::vector* collection_names) { std::lock_guard lock(mutex_); storage_.ListCollections(collection_names); } Status MilvusLocal::CreateIndex(const std::string& collection_name, const std::string& index_name, const std::string& index_proto) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); if (storage_.HasIndex(collection_name, index_name)) { // TODO add index info check LOG_WARN("Collection {}'s index {} alread existed", collection_name, index_name); return Status::Ok(); } // get existed index // std::vector all_index_proto; // storage_.GetAllIndex(collection_name, "", &all_index_proto); // all_index_proto.push_back(index_proto); // auto index_meta_proto = schema_util::MergeIndexs(all_index_proto); // // make sure the index info is legal // CHECK_STATUS(index_.CreateIndex(collection_name, index_meta_proto), ""); if (!storage_.CreateIndex(collection_name, index_name, index_proto)) { return Status::ServiceInternal(); } // reload collection if (!index_.DropCollection(collection_name)) { return Status::ServiceInternal(); } return DoLoadCollection(collection_name); } Status MilvusLocal::DropIndex(const std::string& collection_name, const std::string& index_name) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); if (!storage_.HasIndex(collection_name, index_name)) { return Status::Ok(); } std::vector all_index_proto; storage_.GetAllIndex(collection_name, index_name, &all_index_proto); auto index_meta_proto = schema_util::MergeIndexs(all_index_proto); CHECK_STATUS(index_.CreateIndex(collection_name, index_meta_proto), ""); if (!storage_.DropIndex(collection_name, index_name)) { return Status::ServiceInternal(); } return Status::Ok(); } Status MilvusLocal::Insert(const std::string& collection_name, const Rows& rows, std::vector* ids, const std::vector& bm25_fields) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); int64_t count = 0; for (const auto& row : rows) { if (index_.Insert(collection_name, 1, std::get<1>(row)).IsErr()) { break; } ids->push_back(std::get<0>(row)); count += 1; } auto start = rows.begin(); auto end = rows.begin() + count; std::vector rows_need_insert(start, end); storage_.Insert(collection_name, rows_need_insert, bm25_fields); return Status::Ok(); } Status MilvusLocal::Retrieve(const std::string& collection_name, const std::string& plan, RetrieveResult* result) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); return index_.Retrieve(collection_name, plan, result); } Status MilvusLocal::Search(const std::string& collection_name, const std::string& plan, const std::string& placeholder_group, SearchResult* result) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); return index_.Search(collection_name, plan, placeholder_group, result); } Status MilvusLocal::DeleteByIds(const std::string& collection_name, const std::string& ids, int64_t size, const std::vector& storage_ids, const std::vector& bm25_fields) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); if (storage_.Delete(collection_name, storage_ids, bm25_fields) == -1) { return Status::ServiceInternal(); } CHECK_STATUS(index_.DeleteByIds(collection_name, ids, size), ""); return Status::Ok(); } Status MilvusLocal::GetIndex(const std::string& collection_name, const std::string& index_name, std::string* index_proto) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); if (!storage_.GetIndex(collection_name, index_name, index_proto)) { return Status::IndexNotFound(); } return Status::Ok(); } Status MilvusLocal::GetAllIndexs(const std::string& collection_name, std::vector* all_index_proto) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); storage_.GetAllIndex(collection_name, "", all_index_proto); return Status::Ok(); } std::pair MilvusLocal::GetBM25TokenAndDocCount(const std::string& collection_name, const std::string& field_name) { return storage_.GetBM25TokenAndDocCount(collection_name, field_name); } int32_t MilvusLocal::GetTokenNQ(const std::string& collection_name, const std::string& field_name, uint32_t token) { return storage_.GetTokenNQ(collection_name, field_name, token); } Status MilvusLocal::GetNumRowsOfCollection(const std::string& collection_name, int64_t* num) { std::lock_guard lock(mutex_); CHECK_COLLECTION_EXIST(collection_name); *num = storage_.Count(collection_name); if (*num < 0) { return Status::ServiceInternal(); } return Status::Ok(); } Status MilvusLocal::DoLoadCollection(const std::string& collection_name) { std::string schema_proto, index_proto; if (!storage_.GetCollectionSchema(collection_name, &schema_proto)) { LOG_ERROR("Can not find {}'s schema", collection_name); return Status::ServiceInternal("Schema not found"); } // load index info std::vector all_index_proto; storage_.GetAllIndex(collection_name, "", &all_index_proto); auto index_meta_proto = schema_util::MergeIndexs(all_index_proto); CHECK_STATUS(index_.CreateCollection( collection_name, schema_proto, index_meta_proto), ""); std::vector rows; int64_t start = 0; while (true) { storage_.LoadCollecton(collection_name, start, 200000, &rows); if (rows.size() == 0) { LOG_INFO("Success load {} rows", start); return Status::Ok(); } for (const auto& row : rows) { CHECK_STATUS(index_.Insert(collection_name, 1, row), "Load data failed: "); } start += rows.size(); rows.clear(); } return Status::Ok(); } } // namespace milvus::local ================================================ FILE: src/milvus_local.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include #include "status.h" #include "common.h" #include "index.h" #include "retrieve_result.h" #include "search_result.h" #include "storage/bm25_stats.h" #include "storage/storage.h" #include "type.h" namespace milvus::local { class MilvusLocal final : NonCopyableNonMovable { public: explicit MilvusLocal(const char* db_file); ~MilvusLocal(); public: // load all meta info bool Init(); Status LoadCollection(const std::string& collection_name); Status ReleaseCollection(const std::string& collection_name); Status CreateCollection(const std::string& collection_name, const std::string& pk_name, const std::string& schema_proto); Status GetLoadState(const std::string& collection_name); Status GetCollection(const std::string& collection_name, std::string* schema_proto); bool DropCollection(const std::string& collection_name); void GetAllCollections(std::vector* collection_names); Status CreateIndex(const std::string& collection_name, const std::string& index_name, const std::string& index_proto); Status GetIndex(const std::string& collection_name, const std::string& index_name, std::string* index_proto); Status GetAllIndexs(const std::string& collection_name, std::vector* all_index_proto); Status DropIndex(const std::string& collection_name, const std::string& index_name); /* * Row 为InsertRecord proto数据. */ Status Insert(const std::string& collection_name, const Rows& rows, std::vector* ids, const std::vector& bm25_fields); Status Retrieve(const std::string& collection_name, const std::string& expr, RetrieveResult* result); Status Search(const std::string& collection_name, const std::string& plan, const std::string& placeholder_group, SearchResult* result); Status DeleteByIds(const std::string& collection_name, const std::string& ids, int64_t size, const std::vector& storage_id, const std::vector& bm25_fields); Status GetNumRowsOfCollection(const std::string& collection_name, int64_t* num); std::pair GetBM25TokenAndDocCount(const std::string& collection_name, const std::string& field_name); int32_t GetTokenNQ(const std::string& collection_name, const std::string& field_name, uint32_t token); private: Status CheckCollectionName(const std::string& collection_name); Status DoLoadCollection(const std::string& collection_name); private: std::mutex mutex_; std::string db_file_; Storage storage_; Index index_; bool initialized; }; } // namespace milvus::local ================================================ FILE: src/milvus_proxy.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "milvus_proxy.h" #include #include #include #include #include "common.h" #include "common/Types.h" #include "log/Log.h" #include "create_collection_task.h" #include "create_index_task.h" #include "delete_task.h" #include "insert_task.h" #include "milvus_id.hpp" #include "milvus_local.h" #include "pb/common.pb.h" #include "pb/milvus.pb.h" #include "pb/plan.pb.h" #include "pb/schema.pb.h" #include "pb/segcore.pb.h" #include "query_task.h" #include "retrieve_result.h" #include "hybrid_search_task.h" #include "schema_util.h" #include "search_result.h" #include "search_task.h" #include "status.h" #include "string_util.hpp" #include "timer.h" #include "type.h" #include "upsert_task.h" #include #include "nlohmann/json.hpp" namespace milvus::local { MilvusProxy::MilvusProxy(const char* work_dir) : milvus_local_(work_dir) { } MilvusProxy::~MilvusProxy() { } bool MilvusProxy::Init() { return milvus_local_.Init(); } Status MilvusProxy::LoadCollection(const std::string& collection_name) { return milvus_local_.LoadCollection(collection_name); } Status MilvusProxy::GetLoadState( const std::string& collection_name, ::milvus::proto::milvus::GetLoadStateResponse* response) { auto s = milvus_local_.GetLoadState(collection_name); if (s.Code() == ErrCollectionNotFound) { response->set_state( ::milvus::proto::common::LoadState::LoadStateNotExist); return Status::Ok(); } if (s.Code() == ErrCollectionNotLoaded) { response->set_state( ::milvus::proto::common::LoadState::LoadStateNotLoad); return Status::Ok(); } if (s.Code() == ErrCollectionLoaded) { response->set_state( ::milvus::proto::common::LoadState::LoadStateLoaded); return Status::Ok(); } return s; } Status MilvusProxy::ReleaseCollection(const std::string& collection_name) { // Alignment error code with milvus auto s = milvus_local_.ReleaseCollection(collection_name); if (s.Code() == ErrCollectionNotFound) { return Status::ParameterInvalid("collection not found[collection={}]", collection_name); } return s; } Status MilvusProxy::HasCollection(const std::string& collection_name, ::milvus::proto::milvus::BoolResponse* response) { std::string tmp; Status status = milvus_local_.GetCollection(collection_name, &tmp); response->set_value(status.IsOk()); // If the collection does not exist, change Status code to ok, and the response bool value determines if it noexists. if (status.Code() == ErrCode::ErrCollectionNotFound) { LOG_INFO("HasCollection change error code from collection-not-found to ok."); status = Status::Ok(); } return status; } Status MilvusProxy::CreateCollection( const ::milvus::proto::milvus::CreateCollectionRequest* r) { ::milvus::proto::schema::CollectionSchema schema; CHECK_STATUS(CreateCollectionTask(r).Process(&schema), ""); for (const auto& field : schema.fields()) { if (field.is_primary_key()) { return milvus_local_.CreateCollection( schema.name(), field.name(), schema.SerializeAsString()); } } return Status::FieldNotFound("Lost primary key field"); } Status MilvusProxy::CreateIndex(const ::milvus::proto::milvus::CreateIndexRequest* r) { ::milvus::proto::schema::CollectionSchema schema; if (!GetSchemaInfo(r->collection_name(), &schema).IsOk()) { auto err = string_util::SFormat("Can not find collection {}", r->collection_name()); LOG_ERROR(err); return Status::CollectionNotFound(err); } // get all index milvus::proto::segcore::FieldIndexMeta field_meta; CHECK_STATUS(CreateIndexTask(r, &schema).Process(&field_meta), ""); return milvus_local_.CreateIndex(r->collection_name(), field_meta.index_name(), field_meta.SerializeAsString()); } Status MilvusProxy::Insert(const ::milvus::proto::milvus::InsertRequest* r, ::milvus::proto::schema::IDs* ids) { ::milvus::proto::schema::CollectionSchema schema; if (!GetSchemaInfo(r->collection_name(), &schema).IsOk()) { auto err = string_util::SFormat("Collection {} not found", r->collection_name()); return Status::CollectionNotFound(); } CHECK_STATUS(milvus_local_.LoadCollection(r->collection_name()), ""); Rows rows; auto insert_task = InsertTask( const_cast<::milvus::proto::milvus::InsertRequest*>(r), &schema); CHECK_STATUS(insert_task.Process(&rows), ""); auto bm25_fields = schema_util::GetBM25SparseField(schema); std::vector insert_ids; milvus_local_.Insert(r->collection_name(), rows, &insert_ids, bm25_fields); if (insert_task.PkType() == ::milvus::proto::schema::DataType::Int64) { for (const auto& id : insert_ids) { ids->mutable_int_id()->add_data(std::stoll(id)); } } else { for (const auto& id : insert_ids) { ids->mutable_str_id()->add_data(id); } } return Status::Ok(); } Status MilvusProxy::Upsert(const ::milvus::proto::milvus::UpsertRequest* r, ::milvus::proto::schema::IDs* ids) { ::milvus::proto::schema::CollectionSchema schema; if (!GetSchemaInfo(r->collection_name(), &schema).IsOk()) { auto err = string_util::SFormat("Collection {} not found", r->collection_name()); return Status::CollectionNotFound(); } CHECK_STATUS(milvus_local_.LoadCollection(r->collection_name()), ""); auto task = UpsertTask(r, &schema); ::milvus::proto::milvus::InsertRequest insert_q; ::milvus::proto::schema::IDs delete_ids; CHECK_STATUS(task.Process(&insert_q, &delete_ids), ""); std::vector storage_ids; if (delete_ids.has_int_id()) { for (const auto& id : delete_ids.int_id().data()) { storage_ids.push_back(std::to_string(id)); } } else { for (const auto& id : delete_ids.str_id().data()) { storage_ids.push_back(id); } } auto bm25_fields = schema_util::GetBM25SparseField(schema); CHECK_STATUS(milvus_local_.DeleteByIds(r->collection_name(), delete_ids.SerializeAsString(), storage_ids.size(), storage_ids, bm25_fields), ""); return Insert(&insert_q, ids); } Status MilvusProxy::Search(const ::milvus::proto::milvus::SearchRequest* r, ::milvus::proto::milvus::SearchResults* search_result) { ::milvus::proto::schema::CollectionSchema schema; if (!GetSchemaInfo(r->collection_name(), &schema).IsOk()) { auto err = string_util::SFormat("Can not find {}'s schema", r->collection_name()); LOG_ERROR(err); return Status::CollectionNotFound(err); } CHECK_STATUS(milvus_local_.LoadCollection(r->collection_name()), ""); // get index std::vector all_index; CHECK_STATUS(milvus_local_.GetAllIndexs(r->collection_name(), &all_index), ""); return DoSearch(r, schema, all_index, search_result); } Status MilvusProxy::DoSearch(const ::milvus::proto::milvus::SearchRequest* r, const ::milvus::proto::schema::CollectionSchema& schema, const std::vector& all_index, ::milvus::proto::milvus::SearchResults* search_result) { std::string placeholder_group; ::milvus::proto::plan::PlanNode plan; std::vector nqs, topks; SearchTask task(const_cast<::milvus::proto::milvus::SearchRequest*>(r), &schema, &all_index); CHECK_STATUS(task.Process(&plan, &placeholder_group, &nqs, &topks), ""); if (task.GetMetric() == kMetricsBM25Name) { auto [token_count, doc_count] = milvus_local_.GetBM25TokenAndDocCount( schema.name(), task.GetAnnFieldName()); milvus::proto::common::PlaceholderGroup ph_group; if (!ph_group.ParseFromString(placeholder_group)) { return Status::ServiceInternal("Parse placeholder failed"); } for (int i = 0; i < ph_group.placeholders(0).values_size(); i++) { auto vec = ph_group.mutable_placeholders(0)->mutable_values(i); auto pos = vec->data(); auto end = vec->data() + vec->size(); for (; pos < end; pos += 8) { const uint32_t token = *(reinterpret_cast(pos)); const float freq = *(reinterpret_cast(pos + 4)); auto nq = milvus_local_.GetTokenNQ( schema.name(), task.GetAnnFieldName(), token); *(reinterpret_cast(pos + 4)) = freq * log(1 + (float(doc_count) - float(nq) + 0.5) / (float(nq) + 0.5)); } } placeholder_group = ph_group.SerializeAsString(); auto params_str = plan.mutable_vector_anns() ->mutable_query_info() ->mutable_search_params(); auto params = nlohmann::json::parse(params_str->c_str()); if (token_count == 0 || doc_count == 0) { params[kBM25AvgName] = 0; } else { params[kBM25AvgName] = float(token_count) / float(doc_count); } params_str->assign(params.dump()); } RecordEvent("ParseProto"); SearchResult result(nqs, topks); CHECK_STATUS(milvus_local_.Search(r->collection_name(), plan.SerializeAsString(), placeholder_group, &result), ""); search_result->set_collection_name(r->collection_name()); RecordEvent("DoSearch"); task.PostProcess(result, search_result); RecordEvent("PostProcess"); // search_result->PrintDebugString(); if (search_result->results().has_ids()) { return Status::Ok(); } else { return Status::Ok("search result is empty"); } } Status MilvusProxy::HybridSearch( const ::milvus::proto::milvus::HybridSearchRequest* r, ::milvus::proto::milvus::SearchResults* search_result) { ::milvus::proto::schema::CollectionSchema schema; if (!GetSchemaInfo(r->collection_name(), &schema).IsOk()) { auto err = string_util::SFormat("Can not find {}'s schema", r->collection_name()); LOG_ERROR(err); return Status::CollectionNotFound(err); } CHECK_STATUS(milvus_local_.LoadCollection(r->collection_name()), ""); // get index std::vector all_index; CHECK_STATUS(milvus_local_.GetAllIndexs(r->collection_name(), &all_index), ""); HyBridSearchTask task(&schema, &all_index); std::vector<::milvus::proto::milvus::SearchRequest> search_requests; CHECK_STATUS(task.ProcessSearch(r, &search_requests), ""); std::vector<::milvus::proto::milvus::SearchResults> search_results; for (const auto& req : search_requests) { ::milvus::proto::milvus::SearchResults ret; CHECK_STATUS(DoSearch(&req, schema, all_index, &ret), ""); search_results.push_back(ret); } CHECK_STATUS(task.PostProcessSearch(search_results, search_result), ""); if (schema_util::IDsSize(search_result->results().ids()) == 0) { return Status::Ok(); } // requery, get output field data ::milvus::proto::milvus::QueryRequest query_req; task.ProcessQuery(r, search_result, &query_req); ::milvus::proto::plan::PlanNode plan; QueryTask qtask(&query_req, &schema); CHECK_STATUS(qtask.Process(&plan), ""); RetrieveResult query_result; CHECK_STATUS( milvus_local_.Retrieve( r->collection_name(), plan.SerializeAsString(), &query_result), ""); return task.PostProcess(query_result, search_result); } Status MilvusProxy::Query(const ::milvus::proto::milvus::QueryRequest* r, ::milvus::proto::milvus::QueryResults* query_result) { ::milvus::proto::schema::CollectionSchema schema; if (!GetSchemaInfo(r->collection_name(), &schema).IsOk()) { return Status::CollectionNotFound(); } CHECK_STATUS(milvus_local_.LoadCollection(r->collection_name()), ""); ::milvus::proto::plan::PlanNode plan; QueryTask task(r, &schema); CHECK_STATUS(task.Process(&plan), ""); RecordEvent("ParseProto"); RetrieveResult result; CHECK_STATUS(milvus_local_.Retrieve( r->collection_name(), plan.SerializeAsString(), &result), ""); query_result->set_collection_name(r->collection_name()); RecordEvent("DoQuery"); task.PostProcess(result, query_result); RecordEvent("PostProcess"); return Status::Ok(); } Status MilvusProxy::Delete(const ::milvus::proto::milvus::DeleteRequest* r, ::milvus::proto::milvus::MutationResult* response) { ::milvus::proto::schema::CollectionSchema schema; if (!GetSchemaInfo(r->collection_name(), &schema).IsOk()) { return Status::CollectionNotFound(); } CHECK_STATUS(milvus_local_.LoadCollection(r->collection_name()), ""); ::milvus::proto::plan::PlanNode plan; CHECK_STATUS(DeleteTask(r, &schema).Process(&plan), ""); RetrieveResult result; CHECK_STATUS(milvus_local_.Retrieve( r->collection_name(), plan.SerializeAsString(), &result), ""); ::milvus::proto::segcore::RetrieveResults seg_result; seg_result.ParseFromArray(result.retrieve_result_.proto_blob, result.retrieve_result_.proto_size); auto ids_str = seg_result.ids().SerializeAsString(); std::vector storage_ids; if (seg_result.ids().has_int_id()) { for (const auto& id : seg_result.ids().int_id().data()) { storage_ids.push_back(std::to_string(id)); response->mutable_ids()->mutable_int_id()->add_data(id); } } else { for (const auto& id : seg_result.ids().str_id().data()) { storage_ids.push_back(id); response->mutable_ids()->mutable_str_id()->add_data(id); } } if (storage_ids.size() != 0) { auto bm25_fields = schema_util::GetBM25SparseField(schema); CHECK_STATUS(milvus_local_.DeleteByIds(r->collection_name(), ids_str, storage_ids.size(), storage_ids, bm25_fields), ""); } response->set_delete_cnt(storage_ids.size()); return Status::Ok(); } Status MilvusProxy::GetSchemaInfo(const std::string& collection_name, ::milvus::proto::schema::CollectionSchema* schema) { std::string schema_proto; CHECK_STATUS(milvus_local_.GetCollection(collection_name, &schema_proto), ""); if (!schema->ParseFromString(schema_proto)) { LOG_ERROR("Failed to parse schema info: {}", schema_proto); return Status::ServiceInternal(); ; } return Status::Ok(); } Status MilvusProxy::DescribeCollection( const ::milvus::proto::milvus::DescribeCollectionRequest* request, ::milvus::proto::milvus::DescribeCollectionResponse* response) { ::milvus::proto::schema::CollectionSchema schema; CHECK_STATUS(GetSchemaInfo(request->collection_name(), &schema), ""); auto mutable_schema = response->mutable_schema(); mutable_schema->set_name(schema.name()); mutable_schema->set_description(schema.description()); mutable_schema->set_enable_dynamic_field(schema.enable_dynamic_field()); mutable_schema->mutable_properties()->CopyFrom(schema.properties()); for (const auto& field : schema.fields()) { if (field.name() == kTimeStampFieldName || field.name() == kRowIdFieldName || field.is_dynamic()) continue; mutable_schema->add_fields()->CopyFrom(field); } return Status::Ok(); } Status MilvusProxy::GetIndex( const std::string& collection_name, const std::string& index_name, ::milvus::proto::milvus::DescribeIndexResponse* response) { ::milvus::proto::schema::CollectionSchema schema; if (!GetSchemaInfo(collection_name, &schema).IsOk()) { auto err = string_util::SFormat("Can not find collection {}", collection_name); LOG_ERROR(err); return Status::CollectionNotFound(err); } if (index_name.empty()) { std::vector all_index; CHECK_STATUS(milvus_local_.GetAllIndexs(collection_name, &all_index), ""); for (const auto& index : all_index) { CHECK_STATUS( ParseIndex(index, schema, response->add_index_descriptions()), ""); } return Status::Ok(); } else { std::string index_proto; CHECK_STATUS( milvus_local_.GetIndex(collection_name, index_name, &index_proto), ""); return ParseIndex( index_proto, schema, response->add_index_descriptions()); } } Status MilvusProxy::DropIndex(const std::string& collection_name, const std::string& index_name) { CHECK_STATUS(milvus_local_.LoadCollection(collection_name), ""); return milvus_local_.DropIndex(collection_name, index_name); } Status MilvusProxy::ParseIndex(const std::string& index_proto, const ::milvus::proto::schema::CollectionSchema& schema, ::milvus::proto::milvus::IndexDescription* index) { milvus::proto::segcore::FieldIndexMeta field_index; if (!field_index.ParseFromString(index_proto)) { return Status::ServiceInternal("Error index info in db"); } auto field_id = field_index.fieldid(); for (const auto& field : schema.fields()) { if (field.fieldid() == field_id) { index->set_field_name(field.name()); } } index->set_index_name(field_index.index_name()); index->set_indexid(GetIndexId(field_index.index_name())); index->set_state(::milvus::proto::common::IndexState::Finished); for (const auto& param : field_index.type_params()) { auto new_param = index->add_params(); new_param->set_key(param.key()); new_param->set_value(param.value()); } for (const auto& param : field_index.index_params()) { auto new_param = index->add_params(); new_param->set_key(param.key()); new_param->set_value(param.value()); } for (const auto& param : field_index.user_index_params()) { auto new_param = index->add_params(); new_param->set_key(param.key()); new_param->set_value(param.value()); } return Status::Ok(); } bool MilvusProxy::DropCollection(const std::string& collection_name) { return milvus_local_.DropCollection(collection_name); } Status MilvusProxy::GetCollectionStatistics( const std::string& collection_name, ::milvus::proto::milvus::GetCollectionStatisticsResponse* r) { int64_t num = -1; CHECK_STATUS(milvus_local_.GetNumRowsOfCollection(collection_name, &num), ""); auto s = r->add_stats(); s->set_key("row_count"); s->set_value(std::to_string(num)); return Status::Ok(); } } // namespace milvus::local ================================================ FILE: src/milvus_proxy.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include "common.h" #include "milvus_local.h" #include "pb/schema.pb.h" #include "pb/milvus.pb.h" #include "status.h" namespace milvus::local { class MilvusProxy : NonCopyableNonMovable { public: explicit MilvusProxy(const char* work_dir); virtual ~MilvusProxy(); public: bool Init(); Status LoadCollection(const std::string& collection_name); Status ReleaseCollection(const std::string& collection_name); Status CreateCollection( const ::milvus::proto::milvus::CreateCollectionRequest* request); Status HasCollection(const std::string& collection_name, ::milvus::proto::milvus::BoolResponse* response); Status GetLoadState(const std::string& collection_name, ::milvus::proto::milvus::GetLoadStateResponse* response); bool DropCollection(const std::string& collection_name); void ListCollection(std::vector* collections) { milvus_local_.GetAllCollections(collections); } Status CreateIndex(const ::milvus::proto::milvus::CreateIndexRequest* request); Status GetIndex(const std::string& collection_name, const std::string& index_name, ::milvus::proto::milvus::DescribeIndexResponse* response); Status DropIndex(const std::string& collection_name, const std::string& index_name); Status Insert(const ::milvus::proto::milvus::InsertRequest* request, ::milvus::proto::schema::IDs* ids); Status Upsert(const ::milvus::proto::milvus::UpsertRequest* request, ::milvus::proto::schema::IDs* ids); Status Search(const ::milvus::proto::milvus::SearchRequest* request, ::milvus::proto::milvus::SearchResults* search_result); Status HybridSearch(const ::milvus::proto::milvus::HybridSearchRequest* request, ::milvus::proto::milvus::SearchResults* search_result); Status Query(const ::milvus::proto::milvus::QueryRequest* request, ::milvus::proto::milvus::QueryResults* response); Status Delete(const ::milvus::proto::milvus::DeleteRequest* request, ::milvus::proto::milvus::MutationResult* response); Status DescribeCollection( const ::milvus::proto::milvus::DescribeCollectionRequest* request, ::milvus::proto::milvus::DescribeCollectionResponse* response); Status GetCollectionStatistics( const std::string& collection_name, ::milvus::proto::milvus::GetCollectionStatisticsResponse* r); private: Status GetSchemaInfo(const std::string& collection_name, ::milvus::proto::schema::CollectionSchema* schema); Status ParseIndex(const std::string& index_proto, const ::milvus::proto::schema::CollectionSchema& schema, ::milvus::proto::milvus::IndexDescription* index); Status DoSearch(const ::milvus::proto::milvus::SearchRequest* r, const ::milvus::proto::schema::CollectionSchema& schema, const std::vector& all_index, ::milvus::proto::milvus::SearchResults* search_result); private: MilvusLocal milvus_local_; }; } // namespace milvus::local ================================================ FILE: src/milvus_service_impl.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "milvus_service_impl.h" #include #include #include #include "log/Log.h" #include "status.h" #include "timer.h" namespace milvus::local { void Status2Response(Status& s, ::milvus::proto::common::Status* response) { response->set_code(s.Code()); response->set_retriable(false); response->set_detail(s.Detail()); std::string reason = s.Detail().empty() ? s.Msg() : s.Detail() + ": " + s.Msg(); response->set_reason(reason); } ::grpc::Status MilvusServiceImpl::CreateCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::CreateCollectionRequest* request, ::milvus::proto::common::Status* response) { Status s = proxy_.CreateCollection(request); Status2Response(s, response); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::LoadCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::LoadCollectionRequest* request, ::milvus::proto::common::Status* response) { Status s = proxy_.LoadCollection(request->collection_name()); Status2Response(s, response); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::HasCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::HasCollectionRequest* request, ::milvus::proto::milvus::BoolResponse* response) { Status s = proxy_.HasCollection(request->collection_name(), response); Status2Response(s, response->mutable_status()); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::CreateIndex( ::grpc::ServerContext* context, const ::milvus::proto::milvus::CreateIndexRequest* request, ::milvus::proto::common::Status* response) { Status s = proxy_.CreateIndex(request); Status2Response(s, response); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::Insert(::grpc::ServerContext* context, const ::milvus::proto::milvus::InsertRequest* request, ::milvus::proto::milvus::MutationResult* response) { Status s = proxy_.Insert(request, response->mutable_ids()); Status2Response(s, response->mutable_status()); auto num_rows = request->num_rows(); auto succ_size = std::max(response->ids().int_id().data_size(), response->ids().str_id().data_size()); response->set_insert_cnt(succ_size); for (int64_t i = 0; i < succ_size; ++i) { response->mutable_succ_index()->Add(i); } for (int64_t i = succ_size; i < num_rows; ++i) { response->mutable_err_index()->Add(i); } return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::Upsert(::grpc::ServerContext* context, const ::milvus::proto::milvus::UpsertRequest* request, ::milvus::proto::milvus::MutationResult* response) { Status s = proxy_.Upsert(request, response->mutable_ids()); Status2Response(s, response->mutable_status()); auto num_rows = request->num_rows(); auto succ_size = std::max(response->ids().int_id().data_size(), response->ids().str_id().data_size()); response->set_insert_cnt(succ_size); response->set_upsert_cnt(succ_size); response->set_delete_cnt(num_rows); for (int64_t i = 0; i < succ_size; ++i) { response->mutable_succ_index()->Add(i); } for (int64_t i = succ_size; i < num_rows; ++i) { response->mutable_err_index()->Add(i); } return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::Search(::grpc::ServerContext* context, const ::milvus::proto::milvus::SearchRequest* request, ::milvus::proto::milvus::SearchResults* response) { InitializeTimer(string_util::GenRandomString("Search")); Status s = proxy_.Search(request, response); Status2Response(s, response->mutable_status()); RecordEvent("SerializationResponse"); PrintTimerRecords(); StopTimer(); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::HybridSearch( ::grpc::ServerContext* context, const ::milvus::proto::milvus::HybridSearchRequest* request, ::milvus::proto::milvus::SearchResults* response) { try { Status s = proxy_.HybridSearch(request, response); Status2Response(s, response->mutable_status()); return ::grpc::Status::OK; } catch (std::exception& e) { LOG_ERROR("{}", e.what()); return ::grpc::Status::OK; } } ::grpc::Status MilvusServiceImpl::Query(::grpc::ServerContext* context, const ::milvus::proto::milvus::QueryRequest* request, ::milvus::proto::milvus::QueryResults* response) { InitializeTimer(string_util::GenRandomString("Query")); Status s = proxy_.Query(request, response); Status2Response(s, response->mutable_status()); RecordEvent("SerializationResponse"); PrintTimerRecords(); StopTimer(); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::Delete(::grpc::ServerContext* context, const ::milvus::proto::milvus::DeleteRequest* request, ::milvus::proto::milvus::MutationResult* response) { Status s = proxy_.Delete(request, response); Status2Response(s, response->mutable_status()); if (s.IsErr()) { response->clear_delete_cnt(); response->clear_ids(); } return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::DescribeCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::DescribeCollectionRequest* request, ::milvus::proto::milvus::DescribeCollectionResponse* response) { Status s = proxy_.DescribeCollection(request, response); Status2Response(s, response->mutable_status()); return ::grpc::Status::OK; } /* * Useless interface, just to make the process run. */ ::grpc::Status MilvusServiceImpl::Connect( ::grpc::ServerContext* context, const ::milvus::proto::milvus::ConnectRequest* request, ::milvus::proto::milvus::ConnectResponse* response) { Status s = Status::Ok(); Status2Response(s, response->mutable_status()); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::DescribeIndex( ::grpc::ServerContext* context, const ::milvus::proto::milvus::DescribeIndexRequest* request, ::milvus::proto::milvus::DescribeIndexResponse* response) { auto s = proxy_.GetIndex( request->collection_name(), request->index_name(), response); Status2Response(s, response->mutable_status()); return ::grpc::Status::OK; } /* * Useless interface, just to make the process run. */ ::grpc::Status MilvusServiceImpl::AllocTimestamp( ::grpc::ServerContext* context, const ::milvus::proto::milvus::AllocTimestampRequest* request, ::milvus::proto::milvus::AllocTimestampResponse* response) { Status s = Status::Ok(); Status2Response(s, response->mutable_status()); response->set_timestamp(0); return ::grpc::Status::OK; } /* * Useless interface, just to make the process run. */ ::grpc::Status MilvusServiceImpl::GetLoadingProgress( ::grpc::ServerContext* context, const ::milvus::proto::milvus::GetLoadingProgressRequest* request, ::milvus::proto::milvus::GetLoadingProgressResponse* response) { Status s = Status::Ok(); Status2Response(s, response->mutable_status()); response->set_progress(100); response->set_refresh_progress(100); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::DropCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::DropCollectionRequest* request, ::milvus::proto::common::Status* response) { if (proxy_.DropCollection(request->collection_name())) { Status s = Status::Ok(); Status2Response(s, response); } else { Status s = Status::ServiceInternal(); Status2Response(s, response); } return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::ReleaseCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::ReleaseCollectionRequest* request, ::milvus::proto::common::Status* response) { auto s = proxy_.ReleaseCollection(request->collection_name()); Status2Response(s, response); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::ShowCollections( ::grpc::ServerContext* context, const ::milvus::proto::milvus::ShowCollectionsRequest* request, ::milvus::proto::milvus::ShowCollectionsResponse* response) { std::vector collections; proxy_.ListCollection(&collections); for (const auto& name : collections) { response->add_collection_names(name); } Status s = Status::Ok(); Status2Response(s, response->mutable_status()); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::DropIndex( ::grpc::ServerContext* context, const ::milvus::proto::milvus::DropIndexRequest* request, ::milvus::proto::common::Status* response) { auto s = proxy_.DropIndex(request->collection_name(), request->index_name()); Status2Response(s, response); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::Flush(::grpc::ServerContext* context, const ::milvus::proto::milvus::FlushRequest* request, ::milvus::proto::milvus::FlushResponse* response) { // do nothing Status s = Status::Ok(); Status2Response(s, response->mutable_status()); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::GetFlushState( ::grpc::ServerContext* context, const ::milvus::proto::milvus::GetFlushStateRequest* request, ::milvus::proto::milvus::GetFlushStateResponse* response) { Status s = Status::Ok(); Status2Response(s, response->mutable_status()); response->set_flushed(true); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::GetCollectionStatistics( ::grpc::ServerContext* context, const ::milvus::proto::milvus::GetCollectionStatisticsRequest* request, ::milvus::proto::milvus::GetCollectionStatisticsResponse* response) { Status s = proxy_.GetCollectionStatistics(request->collection_name(), response); Status2Response(s, response->mutable_status()); return ::grpc::Status::OK; } ::grpc::Status MilvusServiceImpl::GetLoadState( ::grpc::ServerContext* context, const ::milvus::proto::milvus::GetLoadStateRequest* request, ::milvus::proto::milvus::GetLoadStateResponse* response) { auto s = proxy_.GetLoadState(request->collection_name(), response); Status2Response(s, response->mutable_status()); return ::grpc::Status::OK; } } // namespace milvus::local ================================================ FILE: src/milvus_service_impl.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include "pb/milvus.grpc.pb.h" #include "milvus_proxy.h" namespace milvus::local { class MilvusServiceImpl final : public milvus::proto::milvus::MilvusService::Service { public: MilvusServiceImpl(const std::string& work_dir) : proxy_(work_dir.c_str()) { } virtual ~MilvusServiceImpl() = default; public: bool Init() { return proxy_.Init(); } public: ::grpc::Status CreateCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::CreateCollectionRequest* request, ::milvus::proto::common::Status* response) override; ::grpc::Status CreateIndex(::grpc::ServerContext* context, const ::milvus::proto::milvus::CreateIndexRequest* request, ::milvus::proto::common::Status* response) override; ::grpc::Status LoadCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::LoadCollectionRequest* request, ::milvus::proto::common::Status* response) override; ::grpc::Status Insert(::grpc::ServerContext* context, const ::milvus::proto::milvus::InsertRequest* request, ::milvus::proto::milvus::MutationResult* response) override; ::grpc::Status Upsert(::grpc::ServerContext* context, const ::milvus::proto::milvus::UpsertRequest* request, ::milvus::proto::milvus::MutationResult* response) override; ::grpc::Status Search(::grpc::ServerContext* context, const ::milvus::proto::milvus::SearchRequest* request, ::milvus::proto::milvus::SearchResults* response) override; ::grpc::Status HybridSearch(::grpc::ServerContext* context, const ::milvus::proto::milvus::HybridSearchRequest* request, ::milvus::proto::milvus::SearchResults* response) override; ::grpc::Status Query(::grpc::ServerContext* context, const ::milvus::proto::milvus::QueryRequest* request, ::milvus::proto::milvus::QueryResults* response) override; ::grpc::Status Delete(::grpc::ServerContext* context, const ::milvus::proto::milvus::DeleteRequest* request, ::milvus::proto::milvus::MutationResult* response) override; ::grpc::Status DescribeCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::DescribeCollectionRequest* request, ::milvus::proto::milvus::DescribeCollectionResponse* response) override; ::grpc::Status Connect(::grpc::ServerContext* context, const ::milvus::proto::milvus::ConnectRequest* request, ::milvus::proto::milvus::ConnectResponse* response) override; ::grpc::Status DescribeIndex( ::grpc::ServerContext* context, const ::milvus::proto::milvus::DescribeIndexRequest* request, ::milvus::proto::milvus::DescribeIndexResponse* response) override; ::grpc::Status AllocTimestamp( ::grpc::ServerContext* context, const ::milvus::proto::milvus::AllocTimestampRequest* request, ::milvus::proto::milvus::AllocTimestampResponse* response) override; ::grpc::Status GetLoadingProgress( ::grpc::ServerContext* context, const ::milvus::proto::milvus::GetLoadingProgressRequest* request, ::milvus::proto::milvus::GetLoadingProgressResponse* response) override; ::grpc::Status DropCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::DropCollectionRequest* request, ::milvus::proto::common::Status* response) override; ::grpc::Status ReleaseCollection( ::grpc::ServerContext* context, const ::milvus::proto::milvus::ReleaseCollectionRequest* request, ::milvus::proto::common::Status* response) override; ::grpc::Status ShowCollections( ::grpc::ServerContext* context, const ::milvus::proto::milvus::ShowCollectionsRequest* request, ::milvus::proto::milvus::ShowCollectionsResponse* response) override; ::grpc::Status HasCollection(::grpc::ServerContext* context, const ::milvus::proto::milvus::HasCollectionRequest* request, ::milvus::proto::milvus::BoolResponse* response) override; ::grpc::Status DropIndex(::grpc::ServerContext* context, const ::milvus::proto::milvus::DropIndexRequest* request, ::milvus::proto::common::Status* response) override; ::grpc::Status Flush(::grpc::ServerContext* context, const ::milvus::proto::milvus::FlushRequest* request, ::milvus::proto::milvus::FlushResponse* response) override; ::grpc::Status GetFlushState( ::grpc::ServerContext* context, const ::milvus::proto::milvus::GetFlushStateRequest* request, ::milvus::proto::milvus::GetFlushStateResponse* response) override; // for now only row count is returned ::grpc::Status GetCollectionStatistics( ::grpc::ServerContext* context, const ::milvus::proto::milvus::GetCollectionStatisticsRequest* request, ::milvus::proto::milvus::GetCollectionStatisticsResponse* response) override; ::grpc::Status GetLoadState( ::grpc::ServerContext* context, const ::milvus::proto::milvus::GetLoadStateRequest* request, ::milvus::proto::milvus::GetLoadStateResponse* response) override; private: ::milvus::local::MilvusProxy proxy_; }; } // namespace milvus::local ================================================ FILE: src/parser/Plan.g4 ================================================ grammar Plan; expr: IntegerConstant # Integer | FloatingConstant # Floating | BooleanConstant # Boolean | StringLiteral # String | Identifier # Identifier | JSONIdentifier # JSONIdentifier | '(' expr ')' # Parens | '[' expr (',' expr)* ','? ']' # Array | expr LIKE StringLiteral # Like | expr POW expr # Power | op = (ADD | SUB | BNOT | NOT) expr # Unary // | '(' typeName ')' expr # Cast | expr op = (MUL | DIV | MOD) expr # MulDivMod | expr op = (ADD | SUB) expr # AddSub | expr op = (SHL | SHR) expr # Shift | expr op = (IN | NIN) ('[' expr (',' expr)* ','? ']') # Term | expr op = (IN | NIN) EmptyTerm # EmptyTerm | (JSONContains | ArrayContains)'('expr',' expr')' # JSONContains | (JSONContainsAll | ArrayContainsAll)'('expr',' expr')' # JSONContainsAll | (JSONContainsAny | ArrayContainsAny)'('expr',' expr')' # JSONContainsAny | ArrayLength'('(Identifier | JSONIdentifier)')' # ArrayLength | expr op1 = (LT | LE) (Identifier | JSONIdentifier) op2 = (LT | LE) expr # Range | expr op1 = (GT | GE) (Identifier | JSONIdentifier) op2 = (GT | GE) expr # ReverseRange | expr op = (LT | LE | GT | GE) expr # Relational | expr op = (EQ | NE) expr # Equality | expr BAND expr # BitAnd | expr BXOR expr # BitXor | expr BOR expr # BitOr | expr AND expr # LogicalAnd | expr OR expr # LogicalOr | EXISTS expr # Exists; // typeName: ty = (BOOL | INT8 | INT16 | INT32 | INT64 | FLOAT | DOUBLE); // BOOL: 'bool'; // INT8: 'int8'; // INT16: 'int16'; // INT32: 'int32'; // INT64: 'int64'; // FLOAT: 'float'; // DOUBLE: 'double'; LT: '<'; LE: '<='; GT: '>'; GE: '>='; EQ: '=='; NE: '!='; LIKE: 'like' | 'LIKE'; EXISTS: 'exists' | 'EXISTS'; ADD: '+'; SUB: '-'; MUL: '*'; DIV: '/'; MOD: '%'; POW: '**'; SHL: '<<'; SHR: '>>'; BAND: '&'; BOR: '|'; BXOR: '^'; AND: '&&' | 'and'; OR: '||' | 'or'; BNOT: '~'; NOT: '!' | 'not'; IN: 'in'; NIN: 'not in'; EmptyTerm: '[' (Whitespace | Newline)* ']'; JSONContains: 'json_contains' | 'JSON_CONTAINS'; JSONContainsAll: 'json_contains_all' | 'JSON_CONTAINS_ALL'; JSONContainsAny: 'json_contains_any' | 'JSON_CONTAINS_ANY'; ArrayContains: 'array_contains' | 'ARRAY_CONTAINS'; ArrayContainsAll: 'array_contains_all' | 'ARRAY_CONTAINS_ALL'; ArrayContainsAny: 'array_contains_any' | 'ARRAY_CONTAINS_ANY'; ArrayLength: 'array_length' | 'ARRAY_LENGTH'; BooleanConstant: 'true' | 'True' | 'TRUE' | 'false' | 'False' | 'FALSE'; IntegerConstant: DecimalConstant | OctalConstant | HexadecimalConstant | BinaryConstant; FloatingConstant: DecimalFloatingConstant | HexadecimalFloatingConstant; Identifier: Nondigit (Nondigit | Digit)* | '$meta'; StringLiteral: EncodingPrefix? ('"' DoubleSCharSequence? '"' | '\'' SingleSCharSequence? '\''); JSONIdentifier: Identifier('[' (StringLiteral | DecimalConstant) ']')+; fragment EncodingPrefix: 'u8' | 'u' | 'U' | 'L'; fragment DoubleSCharSequence: DoubleSChar+; fragment SingleSCharSequence: SingleSChar+; fragment DoubleSChar: ~["\\\r\n] | EscapeSequence | '\\\n' | '\\\r\n'; fragment SingleSChar: ~['\\\r\n] | EscapeSequence | '\\\n' | '\\\r\n'; fragment Nondigit: [a-zA-Z_]; fragment Digit: [0-9]; fragment BinaryConstant: '0' [bB] [0-1]+; fragment DecimalConstant: NonzeroDigit Digit* | '0'; fragment OctalConstant: '0' OctalDigit*; fragment HexadecimalConstant: '0' [xX] HexadecimalDigitSequence; fragment NonzeroDigit: [1-9]; fragment OctalDigit: [0-7]; fragment HexadecimalDigit: [0-9a-fA-F]; fragment HexQuad: HexadecimalDigit HexadecimalDigit HexadecimalDigit HexadecimalDigit; fragment UniversalCharacterName: '\\u' HexQuad | '\\U' HexQuad HexQuad; fragment DecimalFloatingConstant: FractionalConstant ExponentPart? | DigitSequence ExponentPart; fragment HexadecimalFloatingConstant: '0' [xX] ( HexadecimalFractionalConstant | HexadecimalDigitSequence ) BinaryExponentPart; fragment FractionalConstant: DigitSequence? '.' DigitSequence | DigitSequence '.'; fragment ExponentPart: [eE] [+-]? DigitSequence; fragment DigitSequence: Digit+; fragment HexadecimalFractionalConstant: HexadecimalDigitSequence? '.' HexadecimalDigitSequence | HexadecimalDigitSequence '.'; fragment HexadecimalDigitSequence: HexadecimalDigit+; fragment BinaryExponentPart: [pP] [+-]? DigitSequence; fragment EscapeSequence: '\\' ['"?abfnrtv\\] | '\\' OctalDigit OctalDigit? OctalDigit? | '\\x' HexadecimalDigitSequence | UniversalCharacterName; Whitespace: [ \t]+ -> skip; Newline: ( '\r' '\n'? | '\n') -> skip; ================================================ FILE: src/parser/antlr/PlanBaseVisitor.cpp ================================================ // Generated from Plan.g4 by ANTLR 4.13.1 #include "PlanBaseVisitor.h" ================================================ FILE: src/parser/antlr/PlanBaseVisitor.h ================================================ // Generated from Plan.g4 by ANTLR 4.13.1 #pragma once #include "antlr4-runtime.h" #include "PlanVisitor.h" /** * This class provides an empty implementation of PlanVisitor, which can be * extended to create a visitor which only needs to handle a subset of the available methods. */ class PlanBaseVisitor : public PlanVisitor { public: virtual std::any visitJSONIdentifier(PlanParser::JSONIdentifierContext *ctx) override { return visitChildren(ctx); } virtual std::any visitParens(PlanParser::ParensContext *ctx) override { return visitChildren(ctx); } virtual std::any visitString(PlanParser::StringContext *ctx) override { return visitChildren(ctx); } virtual std::any visitFloating(PlanParser::FloatingContext *ctx) override { return visitChildren(ctx); } virtual std::any visitJSONContainsAll(PlanParser::JSONContainsAllContext *ctx) override { return visitChildren(ctx); } virtual std::any visitLogicalOr(PlanParser::LogicalOrContext *ctx) override { return visitChildren(ctx); } virtual std::any visitMulDivMod(PlanParser::MulDivModContext *ctx) override { return visitChildren(ctx); } virtual std::any visitIdentifier(PlanParser::IdentifierContext *ctx) override { return visitChildren(ctx); } virtual std::any visitLike(PlanParser::LikeContext *ctx) override { return visitChildren(ctx); } virtual std::any visitLogicalAnd(PlanParser::LogicalAndContext *ctx) override { return visitChildren(ctx); } virtual std::any visitEquality(PlanParser::EqualityContext *ctx) override { return visitChildren(ctx); } virtual std::any visitBoolean(PlanParser::BooleanContext *ctx) override { return visitChildren(ctx); } virtual std::any visitShift(PlanParser::ShiftContext *ctx) override { return visitChildren(ctx); } virtual std::any visitReverseRange(PlanParser::ReverseRangeContext *ctx) override { return visitChildren(ctx); } virtual std::any visitBitOr(PlanParser::BitOrContext *ctx) override { return visitChildren(ctx); } virtual std::any visitAddSub(PlanParser::AddSubContext *ctx) override { return visitChildren(ctx); } virtual std::any visitRelational(PlanParser::RelationalContext *ctx) override { return visitChildren(ctx); } virtual std::any visitArrayLength(PlanParser::ArrayLengthContext *ctx) override { return visitChildren(ctx); } virtual std::any visitTerm(PlanParser::TermContext *ctx) override { return visitChildren(ctx); } virtual std::any visitJSONContains(PlanParser::JSONContainsContext *ctx) override { return visitChildren(ctx); } virtual std::any visitRange(PlanParser::RangeContext *ctx) override { return visitChildren(ctx); } virtual std::any visitUnary(PlanParser::UnaryContext *ctx) override { return visitChildren(ctx); } virtual std::any visitInteger(PlanParser::IntegerContext *ctx) override { return visitChildren(ctx); } virtual std::any visitArray(PlanParser::ArrayContext *ctx) override { return visitChildren(ctx); } virtual std::any visitJSONContainsAny(PlanParser::JSONContainsAnyContext *ctx) override { return visitChildren(ctx); } virtual std::any visitBitXor(PlanParser::BitXorContext *ctx) override { return visitChildren(ctx); } virtual std::any visitExists(PlanParser::ExistsContext *ctx) override { return visitChildren(ctx); } virtual std::any visitBitAnd(PlanParser::BitAndContext *ctx) override { return visitChildren(ctx); } virtual std::any visitEmptyTerm(PlanParser::EmptyTermContext *ctx) override { return visitChildren(ctx); } virtual std::any visitPower(PlanParser::PowerContext *ctx) override { return visitChildren(ctx); } }; ================================================ FILE: src/parser/antlr/PlanLexer.cpp ================================================ // Generated from Plan.g4 by ANTLR 4.13.1 #include "PlanLexer.h" using namespace antlr4; using namespace antlr4; namespace { struct PlanLexerStaticData final { PlanLexerStaticData(std::vector ruleNames, std::vector channelNames, std::vector modeNames, std::vector literalNames, std::vector symbolicNames) : ruleNames(std::move(ruleNames)), channelNames(std::move(channelNames)), modeNames(std::move(modeNames)), literalNames(std::move(literalNames)), symbolicNames(std::move(symbolicNames)), vocabulary(this->literalNames, this->symbolicNames) {} PlanLexerStaticData(const PlanLexerStaticData&) = delete; PlanLexerStaticData(PlanLexerStaticData&&) = delete; PlanLexerStaticData& operator=(const PlanLexerStaticData&) = delete; PlanLexerStaticData& operator=(PlanLexerStaticData&&) = delete; std::vector decisionToDFA; antlr4::atn::PredictionContextCache sharedContextCache; const std::vector ruleNames; const std::vector channelNames; const std::vector modeNames; const std::vector literalNames; const std::vector symbolicNames; const antlr4::dfa::Vocabulary vocabulary; antlr4::atn::SerializedATNView serializedATN; std::unique_ptr atn; }; ::antlr4::internal::OnceFlag planlexerLexerOnceFlag; #if ANTLR4_USE_THREAD_LOCAL_CACHE static thread_local #endif PlanLexerStaticData *planlexerLexerStaticData = nullptr; void planlexerLexerInitialize() { #if ANTLR4_USE_THREAD_LOCAL_CACHE if (planlexerLexerStaticData != nullptr) { return; } #else assert(planlexerLexerStaticData == nullptr); #endif auto staticData = std::make_unique( std::vector{ "T__0", "T__1", "T__2", "T__3", "T__4", "LT", "LE", "GT", "GE", "EQ", "NE", "LIKE", "EXISTS", "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "SHL", "SHR", "BAND", "BOR", "BXOR", "AND", "OR", "BNOT", "NOT", "IN", "NIN", "EmptyTerm", "JSONContains", "JSONContainsAll", "JSONContainsAny", "ArrayContains", "ArrayContainsAll", "ArrayContainsAny", "ArrayLength", "BooleanConstant", "IntegerConstant", "FloatingConstant", "Identifier", "StringLiteral", "JSONIdentifier", "EncodingPrefix", "DoubleSCharSequence", "SingleSCharSequence", "DoubleSChar", "SingleSChar", "Nondigit", "Digit", "BinaryConstant", "DecimalConstant", "OctalConstant", "HexadecimalConstant", "NonzeroDigit", "OctalDigit", "HexadecimalDigit", "HexQuad", "UniversalCharacterName", "DecimalFloatingConstant", "HexadecimalFloatingConstant", "FractionalConstant", "ExponentPart", "DigitSequence", "HexadecimalFractionalConstant", "HexadecimalDigitSequence", "BinaryExponentPart", "EscapeSequence", "Whitespace", "Newline" }, std::vector{ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }, std::vector{ "DEFAULT_MODE" }, std::vector{ "", "'('", "')'", "'['", "','", "']'", "'<'", "'<='", "'>'", "'>='", "'=='", "'!='", "", "", "'+'", "'-'", "'*'", "'/'", "'%'", "'**'", "'<<'", "'>>'", "'&'", "'|'", "'^'", "", "", "'~'", "", "'in'", "'not in'" }, std::vector{ "", "", "", "", "", "", "LT", "LE", "GT", "GE", "EQ", "NE", "LIKE", "EXISTS", "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "SHL", "SHR", "BAND", "BOR", "BXOR", "AND", "OR", "BNOT", "NOT", "IN", "NIN", "EmptyTerm", "JSONContains", "JSONContainsAll", "JSONContainsAny", "ArrayContains", "ArrayContainsAll", "ArrayContainsAny", "ArrayLength", "BooleanConstant", "IntegerConstant", "FloatingConstant", "Identifier", "StringLiteral", "JSONIdentifier", "Whitespace", "Newline" } ); static const int32_t serializedATNSegment[] = { 4,0,46,752,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, 6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14, 7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21, 7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28, 7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2,33,7,33,2,34,7,34,2,35, 7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7,39,2,40,7,40,2,41,7,41,2,42, 7,42,2,43,7,43,2,44,7,44,2,45,7,45,2,46,7,46,2,47,7,47,2,48,7,48,2,49, 7,49,2,50,7,50,2,51,7,51,2,52,7,52,2,53,7,53,2,54,7,54,2,55,7,55,2,56, 7,56,2,57,7,57,2,58,7,58,2,59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63, 7,63,2,64,7,64,2,65,7,65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70, 7,70,1,0,1,0,1,1,1,1,1,2,1,2,1,3,1,3,1,4,1,4,1,5,1,5,1,6,1,6,1,6,1,7, 1,7,1,8,1,8,1,8,1,9,1,9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1, 11,1,11,1,11,3,11,178,8,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1, 12,1,12,1,12,1,12,3,12,192,8,12,1,13,1,13,1,14,1,14,1,15,1,15,1,16,1, 16,1,17,1,17,1,18,1,18,1,18,1,19,1,19,1,19,1,20,1,20,1,20,1,21,1,21,1, 22,1,22,1,23,1,23,1,24,1,24,1,24,1,24,1,24,3,24,224,8,24,1,25,1,25,1, 25,1,25,3,25,230,8,25,1,26,1,26,1,27,1,27,1,27,1,27,3,27,238,8,27,1,28, 1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,5,30,253, 8,30,10,30,12,30,256,9,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31, 1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31, 1,31,1,31,1,31,1,31,1,31,3,31,286,8,31,1,32,1,32,1,32,1,32,1,32,1,32, 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, 3,32,322,8,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33, 1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33, 1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,358,8,33,1,34,1,34, 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34,388, 8,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35, 1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35, 1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,3,35,426,8,35,1,36,1,36, 1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36, 1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36, 1,36,1,36,1,36,1,36,1,36,1,36,3,36,464,8,36,1,37,1,37,1,37,1,37,1,37, 1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37, 1,37,1,37,1,37,1,37,1,37,3,37,490,8,37,1,38,1,38,1,38,1,38,1,38,1,38, 1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38, 1,38,1,38,1,38,1,38,1,38,1,38,1,38,3,38,519,8,38,1,39,1,39,1,39,1,39, 3,39,525,8,39,1,40,1,40,3,40,529,8,40,1,41,1,41,1,41,5,41,534,8,41,10, 41,12,41,537,9,41,1,41,1,41,1,41,1,41,1,41,3,41,544,8,41,1,42,3,42,547, 8,42,1,42,1,42,3,42,551,8,42,1,42,1,42,1,42,3,42,556,8,42,1,42,3,42,559, 8,42,1,43,1,43,1,43,1,43,3,43,565,8,43,1,43,1,43,4,43,569,8,43,11,43, 12,43,570,1,44,1,44,1,44,3,44,576,8,44,1,45,4,45,579,8,45,11,45,12,45, 580,1,46,4,46,584,8,46,11,46,12,46,585,1,47,1,47,1,47,1,47,1,47,1,47, 1,47,3,47,595,8,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,3,48,604,8,48,1, 49,1,49,1,50,1,50,1,51,1,51,1,51,4,51,613,8,51,11,51,12,51,614,1,52,1, 52,5,52,619,8,52,10,52,12,52,622,9,52,1,52,3,52,625,8,52,1,53,1,53,5, 53,629,8,53,10,53,12,53,632,9,53,1,54,1,54,1,54,1,54,1,55,1,55,1,56,1, 56,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59,1, 59,1,59,1,59,1,59,3,59,659,8,59,1,60,1,60,3,60,663,8,60,1,60,1,60,1,60, 3,60,668,8,60,1,61,1,61,1,61,1,61,3,61,674,8,61,1,61,1,61,1,62,3,62,679, 8,62,1,62,1,62,1,62,1,62,1,62,3,62,686,8,62,1,63,1,63,3,63,690,8,63,1, 63,1,63,1,64,4,64,695,8,64,11,64,12,64,696,1,65,3,65,700,8,65,1,65,1, 65,1,65,1,65,1,65,3,65,707,8,65,1,66,4,66,710,8,66,11,66,12,66,711,1, 67,1,67,3,67,716,8,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,3,68,725,8,68, 1,68,3,68,728,8,68,1,68,1,68,1,68,1,68,1,68,3,68,735,8,68,1,69,4,69,738, 8,69,11,69,12,69,739,1,69,1,69,1,70,1,70,3,70,746,8,70,1,70,3,70,749, 8,70,1,70,1,70,0,0,71,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21, 11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22, 45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67, 34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,0,91, 0,93,0,95,0,97,0,99,0,101,0,103,0,105,0,107,0,109,0,111,0,113,0,115,0, 117,0,119,0,121,0,123,0,125,0,127,0,129,0,131,0,133,0,135,0,137,0,139, 45,141,46,1,0,16,3,0,76,76,85,85,117,117,4,0,10,10,13,13,34,34,92,92, 4,0,10,10,13,13,39,39,92,92,3,0,65,90,95,95,97,122,1,0,48,57,2,0,66,66, 98,98,1,0,48,49,2,0,88,88,120,120,1,0,49,57,1,0,48,55,3,0,48,57,65,70, 97,102,2,0,69,69,101,101,2,0,43,43,45,45,2,0,80,80,112,112,10,0,34,34, 39,39,63,63,92,92,97,98,102,102,110,110,114,114,116,116,118,118,2,0,9, 9,32,32,791,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0, 0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0, 21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1, 0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0, 0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0, 53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1, 0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0, 0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0, 85,1,0,0,0,0,87,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,1,143,1,0,0,0,3,145, 1,0,0,0,5,147,1,0,0,0,7,149,1,0,0,0,9,151,1,0,0,0,11,153,1,0,0,0,13,155, 1,0,0,0,15,158,1,0,0,0,17,160,1,0,0,0,19,163,1,0,0,0,21,166,1,0,0,0,23, 177,1,0,0,0,25,191,1,0,0,0,27,193,1,0,0,0,29,195,1,0,0,0,31,197,1,0,0, 0,33,199,1,0,0,0,35,201,1,0,0,0,37,203,1,0,0,0,39,206,1,0,0,0,41,209, 1,0,0,0,43,212,1,0,0,0,45,214,1,0,0,0,47,216,1,0,0,0,49,223,1,0,0,0,51, 229,1,0,0,0,53,231,1,0,0,0,55,237,1,0,0,0,57,239,1,0,0,0,59,242,1,0,0, 0,61,249,1,0,0,0,63,285,1,0,0,0,65,321,1,0,0,0,67,357,1,0,0,0,69,387, 1,0,0,0,71,425,1,0,0,0,73,463,1,0,0,0,75,489,1,0,0,0,77,518,1,0,0,0,79, 524,1,0,0,0,81,528,1,0,0,0,83,543,1,0,0,0,85,546,1,0,0,0,87,560,1,0,0, 0,89,575,1,0,0,0,91,578,1,0,0,0,93,583,1,0,0,0,95,594,1,0,0,0,97,603, 1,0,0,0,99,605,1,0,0,0,101,607,1,0,0,0,103,609,1,0,0,0,105,624,1,0,0, 0,107,626,1,0,0,0,109,633,1,0,0,0,111,637,1,0,0,0,113,639,1,0,0,0,115, 641,1,0,0,0,117,643,1,0,0,0,119,658,1,0,0,0,121,667,1,0,0,0,123,669,1, 0,0,0,125,685,1,0,0,0,127,687,1,0,0,0,129,694,1,0,0,0,131,706,1,0,0,0, 133,709,1,0,0,0,135,713,1,0,0,0,137,734,1,0,0,0,139,737,1,0,0,0,141,748, 1,0,0,0,143,144,5,40,0,0,144,2,1,0,0,0,145,146,5,41,0,0,146,4,1,0,0,0, 147,148,5,91,0,0,148,6,1,0,0,0,149,150,5,44,0,0,150,8,1,0,0,0,151,152, 5,93,0,0,152,10,1,0,0,0,153,154,5,60,0,0,154,12,1,0,0,0,155,156,5,60, 0,0,156,157,5,61,0,0,157,14,1,0,0,0,158,159,5,62,0,0,159,16,1,0,0,0,160, 161,5,62,0,0,161,162,5,61,0,0,162,18,1,0,0,0,163,164,5,61,0,0,164,165, 5,61,0,0,165,20,1,0,0,0,166,167,5,33,0,0,167,168,5,61,0,0,168,22,1,0, 0,0,169,170,5,108,0,0,170,171,5,105,0,0,171,172,5,107,0,0,172,178,5,101, 0,0,173,174,5,76,0,0,174,175,5,73,0,0,175,176,5,75,0,0,176,178,5,69,0, 0,177,169,1,0,0,0,177,173,1,0,0,0,178,24,1,0,0,0,179,180,5,101,0,0,180, 181,5,120,0,0,181,182,5,105,0,0,182,183,5,115,0,0,183,184,5,116,0,0,184, 192,5,115,0,0,185,186,5,69,0,0,186,187,5,88,0,0,187,188,5,73,0,0,188, 189,5,83,0,0,189,190,5,84,0,0,190,192,5,83,0,0,191,179,1,0,0,0,191,185, 1,0,0,0,192,26,1,0,0,0,193,194,5,43,0,0,194,28,1,0,0,0,195,196,5,45,0, 0,196,30,1,0,0,0,197,198,5,42,0,0,198,32,1,0,0,0,199,200,5,47,0,0,200, 34,1,0,0,0,201,202,5,37,0,0,202,36,1,0,0,0,203,204,5,42,0,0,204,205,5, 42,0,0,205,38,1,0,0,0,206,207,5,60,0,0,207,208,5,60,0,0,208,40,1,0,0, 0,209,210,5,62,0,0,210,211,5,62,0,0,211,42,1,0,0,0,212,213,5,38,0,0,213, 44,1,0,0,0,214,215,5,124,0,0,215,46,1,0,0,0,216,217,5,94,0,0,217,48,1, 0,0,0,218,219,5,38,0,0,219,224,5,38,0,0,220,221,5,97,0,0,221,222,5,110, 0,0,222,224,5,100,0,0,223,218,1,0,0,0,223,220,1,0,0,0,224,50,1,0,0,0, 225,226,5,124,0,0,226,230,5,124,0,0,227,228,5,111,0,0,228,230,5,114,0, 0,229,225,1,0,0,0,229,227,1,0,0,0,230,52,1,0,0,0,231,232,5,126,0,0,232, 54,1,0,0,0,233,238,5,33,0,0,234,235,5,110,0,0,235,236,5,111,0,0,236,238, 5,116,0,0,237,233,1,0,0,0,237,234,1,0,0,0,238,56,1,0,0,0,239,240,5,105, 0,0,240,241,5,110,0,0,241,58,1,0,0,0,242,243,5,110,0,0,243,244,5,111, 0,0,244,245,5,116,0,0,245,246,5,32,0,0,246,247,5,105,0,0,247,248,5,110, 0,0,248,60,1,0,0,0,249,254,5,91,0,0,250,253,3,139,69,0,251,253,3,141, 70,0,252,250,1,0,0,0,252,251,1,0,0,0,253,256,1,0,0,0,254,252,1,0,0,0, 254,255,1,0,0,0,255,257,1,0,0,0,256,254,1,0,0,0,257,258,5,93,0,0,258, 62,1,0,0,0,259,260,5,106,0,0,260,261,5,115,0,0,261,262,5,111,0,0,262, 263,5,110,0,0,263,264,5,95,0,0,264,265,5,99,0,0,265,266,5,111,0,0,266, 267,5,110,0,0,267,268,5,116,0,0,268,269,5,97,0,0,269,270,5,105,0,0,270, 271,5,110,0,0,271,286,5,115,0,0,272,273,5,74,0,0,273,274,5,83,0,0,274, 275,5,79,0,0,275,276,5,78,0,0,276,277,5,95,0,0,277,278,5,67,0,0,278,279, 5,79,0,0,279,280,5,78,0,0,280,281,5,84,0,0,281,282,5,65,0,0,282,283,5, 73,0,0,283,284,5,78,0,0,284,286,5,83,0,0,285,259,1,0,0,0,285,272,1,0, 0,0,286,64,1,0,0,0,287,288,5,106,0,0,288,289,5,115,0,0,289,290,5,111, 0,0,290,291,5,110,0,0,291,292,5,95,0,0,292,293,5,99,0,0,293,294,5,111, 0,0,294,295,5,110,0,0,295,296,5,116,0,0,296,297,5,97,0,0,297,298,5,105, 0,0,298,299,5,110,0,0,299,300,5,115,0,0,300,301,5,95,0,0,301,302,5,97, 0,0,302,303,5,108,0,0,303,322,5,108,0,0,304,305,5,74,0,0,305,306,5,83, 0,0,306,307,5,79,0,0,307,308,5,78,0,0,308,309,5,95,0,0,309,310,5,67,0, 0,310,311,5,79,0,0,311,312,5,78,0,0,312,313,5,84,0,0,313,314,5,65,0,0, 314,315,5,73,0,0,315,316,5,78,0,0,316,317,5,83,0,0,317,318,5,95,0,0,318, 319,5,65,0,0,319,320,5,76,0,0,320,322,5,76,0,0,321,287,1,0,0,0,321,304, 1,0,0,0,322,66,1,0,0,0,323,324,5,106,0,0,324,325,5,115,0,0,325,326,5, 111,0,0,326,327,5,110,0,0,327,328,5,95,0,0,328,329,5,99,0,0,329,330,5, 111,0,0,330,331,5,110,0,0,331,332,5,116,0,0,332,333,5,97,0,0,333,334, 5,105,0,0,334,335,5,110,0,0,335,336,5,115,0,0,336,337,5,95,0,0,337,338, 5,97,0,0,338,339,5,110,0,0,339,358,5,121,0,0,340,341,5,74,0,0,341,342, 5,83,0,0,342,343,5,79,0,0,343,344,5,78,0,0,344,345,5,95,0,0,345,346,5, 67,0,0,346,347,5,79,0,0,347,348,5,78,0,0,348,349,5,84,0,0,349,350,5,65, 0,0,350,351,5,73,0,0,351,352,5,78,0,0,352,353,5,83,0,0,353,354,5,95,0, 0,354,355,5,65,0,0,355,356,5,78,0,0,356,358,5,89,0,0,357,323,1,0,0,0, 357,340,1,0,0,0,358,68,1,0,0,0,359,360,5,97,0,0,360,361,5,114,0,0,361, 362,5,114,0,0,362,363,5,97,0,0,363,364,5,121,0,0,364,365,5,95,0,0,365, 366,5,99,0,0,366,367,5,111,0,0,367,368,5,110,0,0,368,369,5,116,0,0,369, 370,5,97,0,0,370,371,5,105,0,0,371,372,5,110,0,0,372,388,5,115,0,0,373, 374,5,65,0,0,374,375,5,82,0,0,375,376,5,82,0,0,376,377,5,65,0,0,377,378, 5,89,0,0,378,379,5,95,0,0,379,380,5,67,0,0,380,381,5,79,0,0,381,382,5, 78,0,0,382,383,5,84,0,0,383,384,5,65,0,0,384,385,5,73,0,0,385,386,5,78, 0,0,386,388,5,83,0,0,387,359,1,0,0,0,387,373,1,0,0,0,388,70,1,0,0,0,389, 390,5,97,0,0,390,391,5,114,0,0,391,392,5,114,0,0,392,393,5,97,0,0,393, 394,5,121,0,0,394,395,5,95,0,0,395,396,5,99,0,0,396,397,5,111,0,0,397, 398,5,110,0,0,398,399,5,116,0,0,399,400,5,97,0,0,400,401,5,105,0,0,401, 402,5,110,0,0,402,403,5,115,0,0,403,404,5,95,0,0,404,405,5,97,0,0,405, 406,5,108,0,0,406,426,5,108,0,0,407,408,5,65,0,0,408,409,5,82,0,0,409, 410,5,82,0,0,410,411,5,65,0,0,411,412,5,89,0,0,412,413,5,95,0,0,413,414, 5,67,0,0,414,415,5,79,0,0,415,416,5,78,0,0,416,417,5,84,0,0,417,418,5, 65,0,0,418,419,5,73,0,0,419,420,5,78,0,0,420,421,5,83,0,0,421,422,5,95, 0,0,422,423,5,65,0,0,423,424,5,76,0,0,424,426,5,76,0,0,425,389,1,0,0, 0,425,407,1,0,0,0,426,72,1,0,0,0,427,428,5,97,0,0,428,429,5,114,0,0,429, 430,5,114,0,0,430,431,5,97,0,0,431,432,5,121,0,0,432,433,5,95,0,0,433, 434,5,99,0,0,434,435,5,111,0,0,435,436,5,110,0,0,436,437,5,116,0,0,437, 438,5,97,0,0,438,439,5,105,0,0,439,440,5,110,0,0,440,441,5,115,0,0,441, 442,5,95,0,0,442,443,5,97,0,0,443,444,5,110,0,0,444,464,5,121,0,0,445, 446,5,65,0,0,446,447,5,82,0,0,447,448,5,82,0,0,448,449,5,65,0,0,449,450, 5,89,0,0,450,451,5,95,0,0,451,452,5,67,0,0,452,453,5,79,0,0,453,454,5, 78,0,0,454,455,5,84,0,0,455,456,5,65,0,0,456,457,5,73,0,0,457,458,5,78, 0,0,458,459,5,83,0,0,459,460,5,95,0,0,460,461,5,65,0,0,461,462,5,78,0, 0,462,464,5,89,0,0,463,427,1,0,0,0,463,445,1,0,0,0,464,74,1,0,0,0,465, 466,5,97,0,0,466,467,5,114,0,0,467,468,5,114,0,0,468,469,5,97,0,0,469, 470,5,121,0,0,470,471,5,95,0,0,471,472,5,108,0,0,472,473,5,101,0,0,473, 474,5,110,0,0,474,475,5,103,0,0,475,476,5,116,0,0,476,490,5,104,0,0,477, 478,5,65,0,0,478,479,5,82,0,0,479,480,5,82,0,0,480,481,5,65,0,0,481,482, 5,89,0,0,482,483,5,95,0,0,483,484,5,76,0,0,484,485,5,69,0,0,485,486,5, 78,0,0,486,487,5,71,0,0,487,488,5,84,0,0,488,490,5,72,0,0,489,465,1,0, 0,0,489,477,1,0,0,0,490,76,1,0,0,0,491,492,5,116,0,0,492,493,5,114,0, 0,493,494,5,117,0,0,494,519,5,101,0,0,495,496,5,84,0,0,496,497,5,114, 0,0,497,498,5,117,0,0,498,519,5,101,0,0,499,500,5,84,0,0,500,501,5,82, 0,0,501,502,5,85,0,0,502,519,5,69,0,0,503,504,5,102,0,0,504,505,5,97, 0,0,505,506,5,108,0,0,506,507,5,115,0,0,507,519,5,101,0,0,508,509,5,70, 0,0,509,510,5,97,0,0,510,511,5,108,0,0,511,512,5,115,0,0,512,519,5,101, 0,0,513,514,5,70,0,0,514,515,5,65,0,0,515,516,5,76,0,0,516,517,5,83,0, 0,517,519,5,69,0,0,518,491,1,0,0,0,518,495,1,0,0,0,518,499,1,0,0,0,518, 503,1,0,0,0,518,508,1,0,0,0,518,513,1,0,0,0,519,78,1,0,0,0,520,525,3, 105,52,0,521,525,3,107,53,0,522,525,3,109,54,0,523,525,3,103,51,0,524, 520,1,0,0,0,524,521,1,0,0,0,524,522,1,0,0,0,524,523,1,0,0,0,525,80,1, 0,0,0,526,529,3,121,60,0,527,529,3,123,61,0,528,526,1,0,0,0,528,527,1, 0,0,0,529,82,1,0,0,0,530,535,3,99,49,0,531,534,3,99,49,0,532,534,3,101, 50,0,533,531,1,0,0,0,533,532,1,0,0,0,534,537,1,0,0,0,535,533,1,0,0,0, 535,536,1,0,0,0,536,544,1,0,0,0,537,535,1,0,0,0,538,539,5,36,0,0,539, 540,5,109,0,0,540,541,5,101,0,0,541,542,5,116,0,0,542,544,5,97,0,0,543, 530,1,0,0,0,543,538,1,0,0,0,544,84,1,0,0,0,545,547,3,89,44,0,546,545, 1,0,0,0,546,547,1,0,0,0,547,558,1,0,0,0,548,550,5,34,0,0,549,551,3,91, 45,0,550,549,1,0,0,0,550,551,1,0,0,0,551,552,1,0,0,0,552,559,5,34,0,0, 553,555,5,39,0,0,554,556,3,93,46,0,555,554,1,0,0,0,555,556,1,0,0,0,556, 557,1,0,0,0,557,559,5,39,0,0,558,548,1,0,0,0,558,553,1,0,0,0,559,86,1, 0,0,0,560,568,3,83,41,0,561,564,5,91,0,0,562,565,3,85,42,0,563,565,3, 105,52,0,564,562,1,0,0,0,564,563,1,0,0,0,565,566,1,0,0,0,566,567,5,93, 0,0,567,569,1,0,0,0,568,561,1,0,0,0,569,570,1,0,0,0,570,568,1,0,0,0,570, 571,1,0,0,0,571,88,1,0,0,0,572,573,5,117,0,0,573,576,5,56,0,0,574,576, 7,0,0,0,575,572,1,0,0,0,575,574,1,0,0,0,576,90,1,0,0,0,577,579,3,95,47, 0,578,577,1,0,0,0,579,580,1,0,0,0,580,578,1,0,0,0,580,581,1,0,0,0,581, 92,1,0,0,0,582,584,3,97,48,0,583,582,1,0,0,0,584,585,1,0,0,0,585,583, 1,0,0,0,585,586,1,0,0,0,586,94,1,0,0,0,587,595,8,1,0,0,588,595,3,137, 68,0,589,590,5,92,0,0,590,595,5,10,0,0,591,592,5,92,0,0,592,593,5,13, 0,0,593,595,5,10,0,0,594,587,1,0,0,0,594,588,1,0,0,0,594,589,1,0,0,0, 594,591,1,0,0,0,595,96,1,0,0,0,596,604,8,2,0,0,597,604,3,137,68,0,598, 599,5,92,0,0,599,604,5,10,0,0,600,601,5,92,0,0,601,602,5,13,0,0,602,604, 5,10,0,0,603,596,1,0,0,0,603,597,1,0,0,0,603,598,1,0,0,0,603,600,1,0, 0,0,604,98,1,0,0,0,605,606,7,3,0,0,606,100,1,0,0,0,607,608,7,4,0,0,608, 102,1,0,0,0,609,610,5,48,0,0,610,612,7,5,0,0,611,613,7,6,0,0,612,611, 1,0,0,0,613,614,1,0,0,0,614,612,1,0,0,0,614,615,1,0,0,0,615,104,1,0,0, 0,616,620,3,111,55,0,617,619,3,101,50,0,618,617,1,0,0,0,619,622,1,0,0, 0,620,618,1,0,0,0,620,621,1,0,0,0,621,625,1,0,0,0,622,620,1,0,0,0,623, 625,5,48,0,0,624,616,1,0,0,0,624,623,1,0,0,0,625,106,1,0,0,0,626,630, 5,48,0,0,627,629,3,113,56,0,628,627,1,0,0,0,629,632,1,0,0,0,630,628,1, 0,0,0,630,631,1,0,0,0,631,108,1,0,0,0,632,630,1,0,0,0,633,634,5,48,0, 0,634,635,7,7,0,0,635,636,3,133,66,0,636,110,1,0,0,0,637,638,7,8,0,0, 638,112,1,0,0,0,639,640,7,9,0,0,640,114,1,0,0,0,641,642,7,10,0,0,642, 116,1,0,0,0,643,644,3,115,57,0,644,645,3,115,57,0,645,646,3,115,57,0, 646,647,3,115,57,0,647,118,1,0,0,0,648,649,5,92,0,0,649,650,5,117,0,0, 650,651,1,0,0,0,651,659,3,117,58,0,652,653,5,92,0,0,653,654,5,85,0,0, 654,655,1,0,0,0,655,656,3,117,58,0,656,657,3,117,58,0,657,659,1,0,0,0, 658,648,1,0,0,0,658,652,1,0,0,0,659,120,1,0,0,0,660,662,3,125,62,0,661, 663,3,127,63,0,662,661,1,0,0,0,662,663,1,0,0,0,663,668,1,0,0,0,664,665, 3,129,64,0,665,666,3,127,63,0,666,668,1,0,0,0,667,660,1,0,0,0,667,664, 1,0,0,0,668,122,1,0,0,0,669,670,5,48,0,0,670,673,7,7,0,0,671,674,3,131, 65,0,672,674,3,133,66,0,673,671,1,0,0,0,673,672,1,0,0,0,674,675,1,0,0, 0,675,676,3,135,67,0,676,124,1,0,0,0,677,679,3,129,64,0,678,677,1,0,0, 0,678,679,1,0,0,0,679,680,1,0,0,0,680,681,5,46,0,0,681,686,3,129,64,0, 682,683,3,129,64,0,683,684,5,46,0,0,684,686,1,0,0,0,685,678,1,0,0,0,685, 682,1,0,0,0,686,126,1,0,0,0,687,689,7,11,0,0,688,690,7,12,0,0,689,688, 1,0,0,0,689,690,1,0,0,0,690,691,1,0,0,0,691,692,3,129,64,0,692,128,1, 0,0,0,693,695,3,101,50,0,694,693,1,0,0,0,695,696,1,0,0,0,696,694,1,0, 0,0,696,697,1,0,0,0,697,130,1,0,0,0,698,700,3,133,66,0,699,698,1,0,0, 0,699,700,1,0,0,0,700,701,1,0,0,0,701,702,5,46,0,0,702,707,3,133,66,0, 703,704,3,133,66,0,704,705,5,46,0,0,705,707,1,0,0,0,706,699,1,0,0,0,706, 703,1,0,0,0,707,132,1,0,0,0,708,710,3,115,57,0,709,708,1,0,0,0,710,711, 1,0,0,0,711,709,1,0,0,0,711,712,1,0,0,0,712,134,1,0,0,0,713,715,7,13, 0,0,714,716,7,12,0,0,715,714,1,0,0,0,715,716,1,0,0,0,716,717,1,0,0,0, 717,718,3,129,64,0,718,136,1,0,0,0,719,720,5,92,0,0,720,735,7,14,0,0, 721,722,5,92,0,0,722,724,3,113,56,0,723,725,3,113,56,0,724,723,1,0,0, 0,724,725,1,0,0,0,725,727,1,0,0,0,726,728,3,113,56,0,727,726,1,0,0,0, 727,728,1,0,0,0,728,735,1,0,0,0,729,730,5,92,0,0,730,731,5,120,0,0,731, 732,1,0,0,0,732,735,3,133,66,0,733,735,3,119,59,0,734,719,1,0,0,0,734, 721,1,0,0,0,734,729,1,0,0,0,734,733,1,0,0,0,735,138,1,0,0,0,736,738,7, 15,0,0,737,736,1,0,0,0,738,739,1,0,0,0,739,737,1,0,0,0,739,740,1,0,0, 0,740,741,1,0,0,0,741,742,6,69,0,0,742,140,1,0,0,0,743,745,5,13,0,0,744, 746,5,10,0,0,745,744,1,0,0,0,745,746,1,0,0,0,746,749,1,0,0,0,747,749, 5,10,0,0,748,743,1,0,0,0,748,747,1,0,0,0,749,750,1,0,0,0,750,751,6,70, 0,0,751,142,1,0,0,0,54,0,177,191,223,229,237,252,254,285,321,357,387, 425,463,489,518,524,528,533,535,543,546,550,555,558,564,570,575,580,585, 594,603,614,620,624,630,658,662,667,673,678,685,689,696,699,706,711,715, 724,727,734,739,745,748,1,6,0,0 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); antlr4::atn::ATNDeserializer deserializer; staticData->atn = deserializer.deserialize(staticData->serializedATN); const size_t count = staticData->atn->getNumberOfDecisions(); staticData->decisionToDFA.reserve(count); for (size_t i = 0; i < count; i++) { staticData->decisionToDFA.emplace_back(staticData->atn->getDecisionState(i), i); } planlexerLexerStaticData = staticData.release(); } } PlanLexer::PlanLexer(CharStream *input) : Lexer(input) { PlanLexer::initialize(); _interpreter = new atn::LexerATNSimulator(this, *planlexerLexerStaticData->atn, planlexerLexerStaticData->decisionToDFA, planlexerLexerStaticData->sharedContextCache); } PlanLexer::~PlanLexer() { delete _interpreter; } std::string PlanLexer::getGrammarFileName() const { return "Plan.g4"; } const std::vector& PlanLexer::getRuleNames() const { return planlexerLexerStaticData->ruleNames; } const std::vector& PlanLexer::getChannelNames() const { return planlexerLexerStaticData->channelNames; } const std::vector& PlanLexer::getModeNames() const { return planlexerLexerStaticData->modeNames; } const dfa::Vocabulary& PlanLexer::getVocabulary() const { return planlexerLexerStaticData->vocabulary; } antlr4::atn::SerializedATNView PlanLexer::getSerializedATN() const { return planlexerLexerStaticData->serializedATN; } const atn::ATN& PlanLexer::getATN() const { return *planlexerLexerStaticData->atn; } void PlanLexer::initialize() { #if ANTLR4_USE_THREAD_LOCAL_CACHE planlexerLexerInitialize(); #else ::antlr4::internal::call_once(planlexerLexerOnceFlag, planlexerLexerInitialize); #endif } ================================================ FILE: src/parser/antlr/PlanLexer.h ================================================ // Generated from Plan.g4 by ANTLR 4.13.1 #pragma once #include "antlr4-runtime.h" class PlanLexer : public antlr4::Lexer { public: enum { T__0 = 1, T__1 = 2, T__2 = 3, T__3 = 4, T__4 = 5, LT = 6, LE = 7, GT = 8, GE = 9, EQ = 10, NE = 11, LIKE = 12, EXISTS = 13, ADD = 14, SUB = 15, MUL = 16, DIV = 17, MOD = 18, POW = 19, SHL = 20, SHR = 21, BAND = 22, BOR = 23, BXOR = 24, AND = 25, OR = 26, BNOT = 27, NOT = 28, IN = 29, NIN = 30, EmptyTerm = 31, JSONContains = 32, JSONContainsAll = 33, JSONContainsAny = 34, ArrayContains = 35, ArrayContainsAll = 36, ArrayContainsAny = 37, ArrayLength = 38, BooleanConstant = 39, IntegerConstant = 40, FloatingConstant = 41, Identifier = 42, StringLiteral = 43, JSONIdentifier = 44, Whitespace = 45, Newline = 46 }; explicit PlanLexer(antlr4::CharStream *input); ~PlanLexer() override; std::string getGrammarFileName() const override; const std::vector& getRuleNames() const override; const std::vector& getChannelNames() const override; const std::vector& getModeNames() const override; const antlr4::dfa::Vocabulary& getVocabulary() const override; antlr4::atn::SerializedATNView getSerializedATN() const override; const antlr4::atn::ATN& getATN() const override; // By default the static state used to implement the lexer is lazily initialized during the first // call to the constructor. You can call this function if you wish to initialize the static state // ahead of time. static void initialize(); private: // Individual action functions triggered by action() above. // Individual semantic predicate functions triggered by sempred() above. }; ================================================ FILE: src/parser/antlr/PlanParser.cpp ================================================ // Generated from Plan.g4 by ANTLR 4.13.1 #include "PlanVisitor.h" #include "PlanParser.h" using namespace antlrcpp; using namespace antlr4; namespace { struct PlanParserStaticData final { PlanParserStaticData(std::vector ruleNames, std::vector literalNames, std::vector symbolicNames) : ruleNames(std::move(ruleNames)), literalNames(std::move(literalNames)), symbolicNames(std::move(symbolicNames)), vocabulary(this->literalNames, this->symbolicNames) {} PlanParserStaticData(const PlanParserStaticData&) = delete; PlanParserStaticData(PlanParserStaticData&&) = delete; PlanParserStaticData& operator=(const PlanParserStaticData&) = delete; PlanParserStaticData& operator=(PlanParserStaticData&&) = delete; std::vector decisionToDFA; antlr4::atn::PredictionContextCache sharedContextCache; const std::vector ruleNames; const std::vector literalNames; const std::vector symbolicNames; const antlr4::dfa::Vocabulary vocabulary; antlr4::atn::SerializedATNView serializedATN; std::unique_ptr atn; }; ::antlr4::internal::OnceFlag planParserOnceFlag; #if ANTLR4_USE_THREAD_LOCAL_CACHE static thread_local #endif PlanParserStaticData *planParserStaticData = nullptr; void planParserInitialize() { #if ANTLR4_USE_THREAD_LOCAL_CACHE if (planParserStaticData != nullptr) { return; } #else assert(planParserStaticData == nullptr); #endif auto staticData = std::make_unique( std::vector{ "expr" }, std::vector{ "", "'('", "')'", "'['", "','", "']'", "'<'", "'<='", "'>'", "'>='", "'=='", "'!='", "", "", "'+'", "'-'", "'*'", "'/'", "'%'", "'**'", "'<<'", "'>>'", "'&'", "'|'", "'^'", "", "", "'~'", "", "'in'", "'not in'" }, std::vector{ "", "", "", "", "", "", "LT", "LE", "GT", "GE", "EQ", "NE", "LIKE", "EXISTS", "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "SHL", "SHR", "BAND", "BOR", "BXOR", "AND", "OR", "BNOT", "NOT", "IN", "NIN", "EmptyTerm", "JSONContains", "JSONContainsAll", "JSONContainsAny", "ArrayContains", "ArrayContainsAll", "ArrayContainsAny", "ArrayLength", "BooleanConstant", "IntegerConstant", "FloatingConstant", "Identifier", "StringLiteral", "JSONIdentifier", "Whitespace", "Newline" } ); static const int32_t serializedATNSegment[] = { 4,1,46,129,2,0,7,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, 0,1,0,1,0,5,0,18,8,0,10,0,12,0,21,9,0,1,0,3,0,24,8,0,1,0,1,0,1,0,1,0, 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,57,8,0,1,0,1,0,1,0,1,0,1,0, 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,0,111,8,0,10,0,12,0, 114,9,0,1,0,3,0,117,8,0,1,0,1,0,1,0,1,0,1,0,5,0,124,8,0,10,0,12,0,127, 9,0,1,0,0,1,0,1,0,0,13,2,0,14,15,27,28,2,0,32,32,35,35,2,0,33,33,36,36, 2,0,34,34,37,37,2,0,42,42,44,44,1,0,16,18,1,0,14,15,1,0,20,21,1,0,6,7, 1,0,8,9,1,0,6,9,1,0,10,11,1,0,29,30,160,0,56,1,0,0,0,2,3,6,0,-1,0,3,57, 5,40,0,0,4,57,5,41,0,0,5,57,5,39,0,0,6,57,5,43,0,0,7,57,5,42,0,0,8,57, 5,44,0,0,9,10,5,1,0,0,10,11,3,0,0,0,11,12,5,2,0,0,12,57,1,0,0,0,13,14, 5,3,0,0,14,19,3,0,0,0,15,16,5,4,0,0,16,18,3,0,0,0,17,15,1,0,0,0,18,21, 1,0,0,0,19,17,1,0,0,0,19,20,1,0,0,0,20,23,1,0,0,0,21,19,1,0,0,0,22,24, 5,4,0,0,23,22,1,0,0,0,23,24,1,0,0,0,24,25,1,0,0,0,25,26,5,5,0,0,26,57, 1,0,0,0,27,28,7,0,0,0,28,57,3,0,0,20,29,30,7,1,0,0,30,31,5,1,0,0,31,32, 3,0,0,0,32,33,5,4,0,0,33,34,3,0,0,0,34,35,5,2,0,0,35,57,1,0,0,0,36,37, 7,2,0,0,37,38,5,1,0,0,38,39,3,0,0,0,39,40,5,4,0,0,40,41,3,0,0,0,41,42, 5,2,0,0,42,57,1,0,0,0,43,44,7,3,0,0,44,45,5,1,0,0,45,46,3,0,0,0,46,47, 5,4,0,0,47,48,3,0,0,0,48,49,5,2,0,0,49,57,1,0,0,0,50,51,5,38,0,0,51,52, 5,1,0,0,52,53,7,4,0,0,53,57,5,2,0,0,54,55,5,13,0,0,55,57,3,0,0,1,56,2, 1,0,0,0,56,4,1,0,0,0,56,5,1,0,0,0,56,6,1,0,0,0,56,7,1,0,0,0,56,8,1,0, 0,0,56,9,1,0,0,0,56,13,1,0,0,0,56,27,1,0,0,0,56,29,1,0,0,0,56,36,1,0, 0,0,56,43,1,0,0,0,56,50,1,0,0,0,56,54,1,0,0,0,57,125,1,0,0,0,58,59,10, 21,0,0,59,60,5,19,0,0,60,124,3,0,0,22,61,62,10,19,0,0,62,63,7,5,0,0,63, 124,3,0,0,20,64,65,10,18,0,0,65,66,7,6,0,0,66,124,3,0,0,19,67,68,10,17, 0,0,68,69,7,7,0,0,69,124,3,0,0,18,70,71,10,10,0,0,71,72,7,8,0,0,72,73, 7,4,0,0,73,74,7,8,0,0,74,124,3,0,0,11,75,76,10,9,0,0,76,77,7,9,0,0,77, 78,7,4,0,0,78,79,7,9,0,0,79,124,3,0,0,10,80,81,10,8,0,0,81,82,7,10,0, 0,82,124,3,0,0,9,83,84,10,7,0,0,84,85,7,11,0,0,85,124,3,0,0,8,86,87,10, 6,0,0,87,88,5,22,0,0,88,124,3,0,0,7,89,90,10,5,0,0,90,91,5,24,0,0,91, 124,3,0,0,6,92,93,10,4,0,0,93,94,5,23,0,0,94,124,3,0,0,5,95,96,10,3,0, 0,96,97,5,25,0,0,97,124,3,0,0,4,98,99,10,2,0,0,99,100,5,26,0,0,100,124, 3,0,0,3,101,102,10,22,0,0,102,103,5,12,0,0,103,124,5,43,0,0,104,105,10, 16,0,0,105,106,7,12,0,0,106,107,5,3,0,0,107,112,3,0,0,0,108,109,5,4,0, 0,109,111,3,0,0,0,110,108,1,0,0,0,111,114,1,0,0,0,112,110,1,0,0,0,112, 113,1,0,0,0,113,116,1,0,0,0,114,112,1,0,0,0,115,117,5,4,0,0,116,115,1, 0,0,0,116,117,1,0,0,0,117,118,1,0,0,0,118,119,5,5,0,0,119,124,1,0,0,0, 120,121,10,15,0,0,121,122,7,12,0,0,122,124,5,31,0,0,123,58,1,0,0,0,123, 61,1,0,0,0,123,64,1,0,0,0,123,67,1,0,0,0,123,70,1,0,0,0,123,75,1,0,0, 0,123,80,1,0,0,0,123,83,1,0,0,0,123,86,1,0,0,0,123,89,1,0,0,0,123,92, 1,0,0,0,123,95,1,0,0,0,123,98,1,0,0,0,123,101,1,0,0,0,123,104,1,0,0,0, 123,120,1,0,0,0,124,127,1,0,0,0,125,123,1,0,0,0,125,126,1,0,0,0,126,1, 1,0,0,0,127,125,1,0,0,0,7,19,23,56,112,116,123,125 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); antlr4::atn::ATNDeserializer deserializer; staticData->atn = deserializer.deserialize(staticData->serializedATN); const size_t count = staticData->atn->getNumberOfDecisions(); staticData->decisionToDFA.reserve(count); for (size_t i = 0; i < count; i++) { staticData->decisionToDFA.emplace_back(staticData->atn->getDecisionState(i), i); } planParserStaticData = staticData.release(); } } PlanParser::PlanParser(TokenStream *input) : PlanParser(input, antlr4::atn::ParserATNSimulatorOptions()) {} PlanParser::PlanParser(TokenStream *input, const antlr4::atn::ParserATNSimulatorOptions &options) : Parser(input) { PlanParser::initialize(); _interpreter = new atn::ParserATNSimulator(this, *planParserStaticData->atn, planParserStaticData->decisionToDFA, planParserStaticData->sharedContextCache, options); } PlanParser::~PlanParser() { delete _interpreter; } const atn::ATN& PlanParser::getATN() const { return *planParserStaticData->atn; } std::string PlanParser::getGrammarFileName() const { return "Plan.g4"; } const std::vector& PlanParser::getRuleNames() const { return planParserStaticData->ruleNames; } const dfa::Vocabulary& PlanParser::getVocabulary() const { return planParserStaticData->vocabulary; } antlr4::atn::SerializedATNView PlanParser::getSerializedATN() const { return planParserStaticData->serializedATN; } //----------------- ExprContext ------------------------------------------------------------------ PlanParser::ExprContext::ExprContext(ParserRuleContext *parent, size_t invokingState) : ParserRuleContext(parent, invokingState) { } size_t PlanParser::ExprContext::getRuleIndex() const { return PlanParser::RuleExpr; } void PlanParser::ExprContext::copyFrom(ExprContext *ctx) { ParserRuleContext::copyFrom(ctx); } //----------------- JSONIdentifierContext ------------------------------------------------------------------ tree::TerminalNode* PlanParser::JSONIdentifierContext::JSONIdentifier() { return getToken(PlanParser::JSONIdentifier, 0); } PlanParser::JSONIdentifierContext::JSONIdentifierContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::JSONIdentifierContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitJSONIdentifier(this); else return visitor->visitChildren(this); } //----------------- ParensContext ------------------------------------------------------------------ PlanParser::ExprContext* PlanParser::ParensContext::expr() { return getRuleContext(0); } PlanParser::ParensContext::ParensContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::ParensContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitParens(this); else return visitor->visitChildren(this); } //----------------- StringContext ------------------------------------------------------------------ tree::TerminalNode* PlanParser::StringContext::StringLiteral() { return getToken(PlanParser::StringLiteral, 0); } PlanParser::StringContext::StringContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::StringContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitString(this); else return visitor->visitChildren(this); } //----------------- FloatingContext ------------------------------------------------------------------ tree::TerminalNode* PlanParser::FloatingContext::FloatingConstant() { return getToken(PlanParser::FloatingConstant, 0); } PlanParser::FloatingContext::FloatingContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::FloatingContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitFloating(this); else return visitor->visitChildren(this); } //----------------- JSONContainsAllContext ------------------------------------------------------------------ std::vector PlanParser::JSONContainsAllContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::JSONContainsAllContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::JSONContainsAllContext::JSONContainsAll() { return getToken(PlanParser::JSONContainsAll, 0); } tree::TerminalNode* PlanParser::JSONContainsAllContext::ArrayContainsAll() { return getToken(PlanParser::ArrayContainsAll, 0); } PlanParser::JSONContainsAllContext::JSONContainsAllContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::JSONContainsAllContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitJSONContainsAll(this); else return visitor->visitChildren(this); } //----------------- LogicalOrContext ------------------------------------------------------------------ std::vector PlanParser::LogicalOrContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::LogicalOrContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::LogicalOrContext::OR() { return getToken(PlanParser::OR, 0); } PlanParser::LogicalOrContext::LogicalOrContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::LogicalOrContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitLogicalOr(this); else return visitor->visitChildren(this); } //----------------- MulDivModContext ------------------------------------------------------------------ std::vector PlanParser::MulDivModContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::MulDivModContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::MulDivModContext::MUL() { return getToken(PlanParser::MUL, 0); } tree::TerminalNode* PlanParser::MulDivModContext::DIV() { return getToken(PlanParser::DIV, 0); } tree::TerminalNode* PlanParser::MulDivModContext::MOD() { return getToken(PlanParser::MOD, 0); } PlanParser::MulDivModContext::MulDivModContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::MulDivModContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitMulDivMod(this); else return visitor->visitChildren(this); } //----------------- IdentifierContext ------------------------------------------------------------------ tree::TerminalNode* PlanParser::IdentifierContext::Identifier() { return getToken(PlanParser::Identifier, 0); } PlanParser::IdentifierContext::IdentifierContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::IdentifierContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitIdentifier(this); else return visitor->visitChildren(this); } //----------------- LikeContext ------------------------------------------------------------------ PlanParser::ExprContext* PlanParser::LikeContext::expr() { return getRuleContext(0); } tree::TerminalNode* PlanParser::LikeContext::LIKE() { return getToken(PlanParser::LIKE, 0); } tree::TerminalNode* PlanParser::LikeContext::StringLiteral() { return getToken(PlanParser::StringLiteral, 0); } PlanParser::LikeContext::LikeContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::LikeContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitLike(this); else return visitor->visitChildren(this); } //----------------- LogicalAndContext ------------------------------------------------------------------ std::vector PlanParser::LogicalAndContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::LogicalAndContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::LogicalAndContext::AND() { return getToken(PlanParser::AND, 0); } PlanParser::LogicalAndContext::LogicalAndContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::LogicalAndContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitLogicalAnd(this); else return visitor->visitChildren(this); } //----------------- EqualityContext ------------------------------------------------------------------ std::vector PlanParser::EqualityContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::EqualityContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::EqualityContext::EQ() { return getToken(PlanParser::EQ, 0); } tree::TerminalNode* PlanParser::EqualityContext::NE() { return getToken(PlanParser::NE, 0); } PlanParser::EqualityContext::EqualityContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::EqualityContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitEquality(this); else return visitor->visitChildren(this); } //----------------- BooleanContext ------------------------------------------------------------------ tree::TerminalNode* PlanParser::BooleanContext::BooleanConstant() { return getToken(PlanParser::BooleanConstant, 0); } PlanParser::BooleanContext::BooleanContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::BooleanContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitBoolean(this); else return visitor->visitChildren(this); } //----------------- ShiftContext ------------------------------------------------------------------ std::vector PlanParser::ShiftContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::ShiftContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::ShiftContext::SHL() { return getToken(PlanParser::SHL, 0); } tree::TerminalNode* PlanParser::ShiftContext::SHR() { return getToken(PlanParser::SHR, 0); } PlanParser::ShiftContext::ShiftContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::ShiftContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitShift(this); else return visitor->visitChildren(this); } //----------------- ReverseRangeContext ------------------------------------------------------------------ std::vector PlanParser::ReverseRangeContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::ReverseRangeContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::ReverseRangeContext::Identifier() { return getToken(PlanParser::Identifier, 0); } tree::TerminalNode* PlanParser::ReverseRangeContext::JSONIdentifier() { return getToken(PlanParser::JSONIdentifier, 0); } std::vector PlanParser::ReverseRangeContext::GT() { return getTokens(PlanParser::GT); } tree::TerminalNode* PlanParser::ReverseRangeContext::GT(size_t i) { return getToken(PlanParser::GT, i); } std::vector PlanParser::ReverseRangeContext::GE() { return getTokens(PlanParser::GE); } tree::TerminalNode* PlanParser::ReverseRangeContext::GE(size_t i) { return getToken(PlanParser::GE, i); } PlanParser::ReverseRangeContext::ReverseRangeContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::ReverseRangeContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitReverseRange(this); else return visitor->visitChildren(this); } //----------------- BitOrContext ------------------------------------------------------------------ std::vector PlanParser::BitOrContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::BitOrContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::BitOrContext::BOR() { return getToken(PlanParser::BOR, 0); } PlanParser::BitOrContext::BitOrContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::BitOrContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitBitOr(this); else return visitor->visitChildren(this); } //----------------- AddSubContext ------------------------------------------------------------------ std::vector PlanParser::AddSubContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::AddSubContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::AddSubContext::ADD() { return getToken(PlanParser::ADD, 0); } tree::TerminalNode* PlanParser::AddSubContext::SUB() { return getToken(PlanParser::SUB, 0); } PlanParser::AddSubContext::AddSubContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::AddSubContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitAddSub(this); else return visitor->visitChildren(this); } //----------------- RelationalContext ------------------------------------------------------------------ std::vector PlanParser::RelationalContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::RelationalContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::RelationalContext::LT() { return getToken(PlanParser::LT, 0); } tree::TerminalNode* PlanParser::RelationalContext::LE() { return getToken(PlanParser::LE, 0); } tree::TerminalNode* PlanParser::RelationalContext::GT() { return getToken(PlanParser::GT, 0); } tree::TerminalNode* PlanParser::RelationalContext::GE() { return getToken(PlanParser::GE, 0); } PlanParser::RelationalContext::RelationalContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::RelationalContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitRelational(this); else return visitor->visitChildren(this); } //----------------- ArrayLengthContext ------------------------------------------------------------------ tree::TerminalNode* PlanParser::ArrayLengthContext::ArrayLength() { return getToken(PlanParser::ArrayLength, 0); } tree::TerminalNode* PlanParser::ArrayLengthContext::Identifier() { return getToken(PlanParser::Identifier, 0); } tree::TerminalNode* PlanParser::ArrayLengthContext::JSONIdentifier() { return getToken(PlanParser::JSONIdentifier, 0); } PlanParser::ArrayLengthContext::ArrayLengthContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::ArrayLengthContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitArrayLength(this); else return visitor->visitChildren(this); } //----------------- TermContext ------------------------------------------------------------------ std::vector PlanParser::TermContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::TermContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::TermContext::IN() { return getToken(PlanParser::IN, 0); } tree::TerminalNode* PlanParser::TermContext::NIN() { return getToken(PlanParser::NIN, 0); } PlanParser::TermContext::TermContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::TermContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitTerm(this); else return visitor->visitChildren(this); } //----------------- JSONContainsContext ------------------------------------------------------------------ std::vector PlanParser::JSONContainsContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::JSONContainsContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::JSONContainsContext::JSONContains() { return getToken(PlanParser::JSONContains, 0); } tree::TerminalNode* PlanParser::JSONContainsContext::ArrayContains() { return getToken(PlanParser::ArrayContains, 0); } PlanParser::JSONContainsContext::JSONContainsContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::JSONContainsContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitJSONContains(this); else return visitor->visitChildren(this); } //----------------- RangeContext ------------------------------------------------------------------ std::vector PlanParser::RangeContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::RangeContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::RangeContext::Identifier() { return getToken(PlanParser::Identifier, 0); } tree::TerminalNode* PlanParser::RangeContext::JSONIdentifier() { return getToken(PlanParser::JSONIdentifier, 0); } std::vector PlanParser::RangeContext::LT() { return getTokens(PlanParser::LT); } tree::TerminalNode* PlanParser::RangeContext::LT(size_t i) { return getToken(PlanParser::LT, i); } std::vector PlanParser::RangeContext::LE() { return getTokens(PlanParser::LE); } tree::TerminalNode* PlanParser::RangeContext::LE(size_t i) { return getToken(PlanParser::LE, i); } PlanParser::RangeContext::RangeContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::RangeContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitRange(this); else return visitor->visitChildren(this); } //----------------- UnaryContext ------------------------------------------------------------------ PlanParser::ExprContext* PlanParser::UnaryContext::expr() { return getRuleContext(0); } tree::TerminalNode* PlanParser::UnaryContext::ADD() { return getToken(PlanParser::ADD, 0); } tree::TerminalNode* PlanParser::UnaryContext::SUB() { return getToken(PlanParser::SUB, 0); } tree::TerminalNode* PlanParser::UnaryContext::BNOT() { return getToken(PlanParser::BNOT, 0); } tree::TerminalNode* PlanParser::UnaryContext::NOT() { return getToken(PlanParser::NOT, 0); } PlanParser::UnaryContext::UnaryContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::UnaryContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitUnary(this); else return visitor->visitChildren(this); } //----------------- IntegerContext ------------------------------------------------------------------ tree::TerminalNode* PlanParser::IntegerContext::IntegerConstant() { return getToken(PlanParser::IntegerConstant, 0); } PlanParser::IntegerContext::IntegerContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::IntegerContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitInteger(this); else return visitor->visitChildren(this); } //----------------- ArrayContext ------------------------------------------------------------------ std::vector PlanParser::ArrayContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::ArrayContext::expr(size_t i) { return getRuleContext(i); } PlanParser::ArrayContext::ArrayContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::ArrayContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitArray(this); else return visitor->visitChildren(this); } //----------------- JSONContainsAnyContext ------------------------------------------------------------------ std::vector PlanParser::JSONContainsAnyContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::JSONContainsAnyContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::JSONContainsAnyContext::JSONContainsAny() { return getToken(PlanParser::JSONContainsAny, 0); } tree::TerminalNode* PlanParser::JSONContainsAnyContext::ArrayContainsAny() { return getToken(PlanParser::ArrayContainsAny, 0); } PlanParser::JSONContainsAnyContext::JSONContainsAnyContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::JSONContainsAnyContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitJSONContainsAny(this); else return visitor->visitChildren(this); } //----------------- BitXorContext ------------------------------------------------------------------ std::vector PlanParser::BitXorContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::BitXorContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::BitXorContext::BXOR() { return getToken(PlanParser::BXOR, 0); } PlanParser::BitXorContext::BitXorContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::BitXorContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitBitXor(this); else return visitor->visitChildren(this); } //----------------- ExistsContext ------------------------------------------------------------------ tree::TerminalNode* PlanParser::ExistsContext::EXISTS() { return getToken(PlanParser::EXISTS, 0); } PlanParser::ExprContext* PlanParser::ExistsContext::expr() { return getRuleContext(0); } PlanParser::ExistsContext::ExistsContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::ExistsContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitExists(this); else return visitor->visitChildren(this); } //----------------- BitAndContext ------------------------------------------------------------------ std::vector PlanParser::BitAndContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::BitAndContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::BitAndContext::BAND() { return getToken(PlanParser::BAND, 0); } PlanParser::BitAndContext::BitAndContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::BitAndContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitBitAnd(this); else return visitor->visitChildren(this); } //----------------- EmptyTermContext ------------------------------------------------------------------ PlanParser::ExprContext* PlanParser::EmptyTermContext::expr() { return getRuleContext(0); } tree::TerminalNode* PlanParser::EmptyTermContext::EmptyTerm() { return getToken(PlanParser::EmptyTerm, 0); } tree::TerminalNode* PlanParser::EmptyTermContext::IN() { return getToken(PlanParser::IN, 0); } tree::TerminalNode* PlanParser::EmptyTermContext::NIN() { return getToken(PlanParser::NIN, 0); } PlanParser::EmptyTermContext::EmptyTermContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::EmptyTermContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitEmptyTerm(this); else return visitor->visitChildren(this); } //----------------- PowerContext ------------------------------------------------------------------ std::vector PlanParser::PowerContext::expr() { return getRuleContexts(); } PlanParser::ExprContext* PlanParser::PowerContext::expr(size_t i) { return getRuleContext(i); } tree::TerminalNode* PlanParser::PowerContext::POW() { return getToken(PlanParser::POW, 0); } PlanParser::PowerContext::PowerContext(ExprContext *ctx) { copyFrom(ctx); } std::any PlanParser::PowerContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) return parserVisitor->visitPower(this); else return visitor->visitChildren(this); } PlanParser::ExprContext* PlanParser::expr() { return expr(0); } PlanParser::ExprContext* PlanParser::expr(int precedence) { ParserRuleContext *parentContext = _ctx; size_t parentState = getState(); PlanParser::ExprContext *_localctx = _tracker.createInstance(_ctx, parentState); PlanParser::ExprContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. size_t startState = 0; enterRecursionRule(_localctx, 0, PlanParser::RuleExpr, precedence); size_t _la = 0; #if __cplusplus > 201703L auto onExit = finally([=, this] { #else auto onExit = finally([=] { #endif unrollRecursionContexts(parentContext); }); try { size_t alt; enterOuterAlt(_localctx, 1); setState(56); _errHandler->sync(this); switch (_input->LA(1)) { case PlanParser::IntegerConstant: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(3); match(PlanParser::IntegerConstant); break; } case PlanParser::FloatingConstant: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(4); match(PlanParser::FloatingConstant); break; } case PlanParser::BooleanConstant: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(5); match(PlanParser::BooleanConstant); break; } case PlanParser::StringLiteral: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(6); match(PlanParser::StringLiteral); break; } case PlanParser::Identifier: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(7); match(PlanParser::Identifier); break; } case PlanParser::JSONIdentifier: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(8); match(PlanParser::JSONIdentifier); break; } case PlanParser::T__0: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(9); match(PlanParser::T__0); setState(10); expr(0); setState(11); match(PlanParser::T__1); break; } case PlanParser::T__2: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(13); match(PlanParser::T__2); setState(14); expr(0); setState(19); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 0, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { setState(15); match(PlanParser::T__3); setState(16); expr(0); } setState(21); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 0, _ctx); } setState(23); _errHandler->sync(this); _la = _input->LA(1); if (_la == PlanParser::T__3) { setState(22); match(PlanParser::T__3); } setState(25); match(PlanParser::T__4); break; } case PlanParser::ADD: case PlanParser::SUB: case PlanParser::BNOT: case PlanParser::NOT: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(27); antlrcpp::downCast(_localctx)->op = _input->LT(1); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 402702336) != 0))) { antlrcpp::downCast(_localctx)->op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(28); expr(20); break; } case PlanParser::JSONContains: case PlanParser::ArrayContains: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(29); _la = _input->LA(1); if (!(_la == PlanParser::JSONContains || _la == PlanParser::ArrayContains)) { _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(30); match(PlanParser::T__0); setState(31); expr(0); setState(32); match(PlanParser::T__3); setState(33); expr(0); setState(34); match(PlanParser::T__1); break; } case PlanParser::JSONContainsAll: case PlanParser::ArrayContainsAll: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(36); _la = _input->LA(1); if (!(_la == PlanParser::JSONContainsAll || _la == PlanParser::ArrayContainsAll)) { _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(37); match(PlanParser::T__0); setState(38); expr(0); setState(39); match(PlanParser::T__3); setState(40); expr(0); setState(41); match(PlanParser::T__1); break; } case PlanParser::JSONContainsAny: case PlanParser::ArrayContainsAny: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(43); _la = _input->LA(1); if (!(_la == PlanParser::JSONContainsAny || _la == PlanParser::ArrayContainsAny)) { _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(44); match(PlanParser::T__0); setState(45); expr(0); setState(46); match(PlanParser::T__3); setState(47); expr(0); setState(48); match(PlanParser::T__1); break; } case PlanParser::ArrayLength: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(50); match(PlanParser::ArrayLength); setState(51); match(PlanParser::T__0); setState(52); _la = _input->LA(1); if (!(_la == PlanParser::Identifier || _la == PlanParser::JSONIdentifier)) { _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(53); match(PlanParser::T__1); break; } case PlanParser::EXISTS: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; setState(54); match(PlanParser::EXISTS); setState(55); expr(1); break; } default: throw NoViableAltException(this); } _ctx->stop = _input->LT(-1); setState(125); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 6, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) triggerExitRuleEvent(); previousContext = _localctx; setState(123); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 5, _ctx)) { case 1: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(58); if (!(precpred(_ctx, 21))) throw FailedPredicateException(this, "precpred(_ctx, 21)"); setState(59); match(PlanParser::POW); setState(60); expr(22); break; } case 2: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(61); if (!(precpred(_ctx, 19))) throw FailedPredicateException(this, "precpred(_ctx, 19)"); setState(62); antlrcpp::downCast(_localctx)->op = _input->LT(1); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 458752) != 0))) { antlrcpp::downCast(_localctx)->op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(63); expr(20); break; } case 3: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(64); if (!(precpred(_ctx, 18))) throw FailedPredicateException(this, "precpred(_ctx, 18)"); setState(65); antlrcpp::downCast(_localctx)->op = _input->LT(1); _la = _input->LA(1); if (!(_la == PlanParser::ADD || _la == PlanParser::SUB)) { antlrcpp::downCast(_localctx)->op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(66); expr(19); break; } case 4: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(67); if (!(precpred(_ctx, 17))) throw FailedPredicateException(this, "precpred(_ctx, 17)"); setState(68); antlrcpp::downCast(_localctx)->op = _input->LT(1); _la = _input->LA(1); if (!(_la == PlanParser::SHL || _la == PlanParser::SHR)) { antlrcpp::downCast(_localctx)->op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(69); expr(18); break; } case 5: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(70); if (!(precpred(_ctx, 10))) throw FailedPredicateException(this, "precpred(_ctx, 10)"); setState(71); antlrcpp::downCast(_localctx)->op1 = _input->LT(1); _la = _input->LA(1); if (!(_la == PlanParser::LT || _la == PlanParser::LE)) { antlrcpp::downCast(_localctx)->op1 = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(72); _la = _input->LA(1); if (!(_la == PlanParser::Identifier || _la == PlanParser::JSONIdentifier)) { _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(73); antlrcpp::downCast(_localctx)->op2 = _input->LT(1); _la = _input->LA(1); if (!(_la == PlanParser::LT || _la == PlanParser::LE)) { antlrcpp::downCast(_localctx)->op2 = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(74); expr(11); break; } case 6: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(75); if (!(precpred(_ctx, 9))) throw FailedPredicateException(this, "precpred(_ctx, 9)"); setState(76); antlrcpp::downCast(_localctx)->op1 = _input->LT(1); _la = _input->LA(1); if (!(_la == PlanParser::GT || _la == PlanParser::GE)) { antlrcpp::downCast(_localctx)->op1 = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(77); _la = _input->LA(1); if (!(_la == PlanParser::Identifier || _la == PlanParser::JSONIdentifier)) { _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(78); antlrcpp::downCast(_localctx)->op2 = _input->LT(1); _la = _input->LA(1); if (!(_la == PlanParser::GT || _la == PlanParser::GE)) { antlrcpp::downCast(_localctx)->op2 = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(79); expr(10); break; } case 7: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(80); if (!(precpred(_ctx, 8))) throw FailedPredicateException(this, "precpred(_ctx, 8)"); setState(81); antlrcpp::downCast(_localctx)->op = _input->LT(1); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 960) != 0))) { antlrcpp::downCast(_localctx)->op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(82); expr(9); break; } case 8: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(83); if (!(precpred(_ctx, 7))) throw FailedPredicateException(this, "precpred(_ctx, 7)"); setState(84); antlrcpp::downCast(_localctx)->op = _input->LT(1); _la = _input->LA(1); if (!(_la == PlanParser::EQ || _la == PlanParser::NE)) { antlrcpp::downCast(_localctx)->op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(85); expr(8); break; } case 9: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(86); if (!(precpred(_ctx, 6))) throw FailedPredicateException(this, "precpred(_ctx, 6)"); setState(87); match(PlanParser::BAND); setState(88); expr(7); break; } case 10: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(89); if (!(precpred(_ctx, 5))) throw FailedPredicateException(this, "precpred(_ctx, 5)"); setState(90); match(PlanParser::BXOR); setState(91); expr(6); break; } case 11: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(92); if (!(precpred(_ctx, 4))) throw FailedPredicateException(this, "precpred(_ctx, 4)"); setState(93); match(PlanParser::BOR); setState(94); expr(5); break; } case 12: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(95); if (!(precpred(_ctx, 3))) throw FailedPredicateException(this, "precpred(_ctx, 3)"); setState(96); match(PlanParser::AND); setState(97); expr(4); break; } case 13: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(98); if (!(precpred(_ctx, 2))) throw FailedPredicateException(this, "precpred(_ctx, 2)"); setState(99); match(PlanParser::OR); setState(100); expr(3); break; } case 14: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(101); if (!(precpred(_ctx, 22))) throw FailedPredicateException(this, "precpred(_ctx, 22)"); setState(102); match(PlanParser::LIKE); setState(103); match(PlanParser::StringLiteral); break; } case 15: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(104); if (!(precpred(_ctx, 16))) throw FailedPredicateException(this, "precpred(_ctx, 16)"); setState(105); antlrcpp::downCast(_localctx)->op = _input->LT(1); _la = _input->LA(1); if (!(_la == PlanParser::IN || _la == PlanParser::NIN)) { antlrcpp::downCast(_localctx)->op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(106); match(PlanParser::T__2); setState(107); expr(0); setState(112); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 3, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { setState(108); match(PlanParser::T__3); setState(109); expr(0); } setState(114); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 3, _ctx); } setState(116); _errHandler->sync(this); _la = _input->LA(1); if (_la == PlanParser::T__3) { setState(115); match(PlanParser::T__3); } setState(118); match(PlanParser::T__4); break; } case 16: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); setState(120); if (!(precpred(_ctx, 15))) throw FailedPredicateException(this, "precpred(_ctx, 15)"); setState(121); antlrcpp::downCast(_localctx)->op = _input->LT(1); _la = _input->LA(1); if (!(_la == PlanParser::IN || _la == PlanParser::NIN)) { antlrcpp::downCast(_localctx)->op = _errHandler->recoverInline(this); } else { _errHandler->reportMatch(this); consume(); } setState(122); match(PlanParser::EmptyTerm); break; } default: break; } } setState(127); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 6, _ctx); } } catch (RecognitionException &e) { _errHandler->reportError(this, e); _localctx->exception = std::current_exception(); _errHandler->recover(this, _localctx->exception); } return _localctx; } bool PlanParser::sempred(RuleContext *context, size_t ruleIndex, size_t predicateIndex) { switch (ruleIndex) { case 0: return exprSempred(antlrcpp::downCast(context), predicateIndex); default: break; } return true; } bool PlanParser::exprSempred(ExprContext *_localctx, size_t predicateIndex) { switch (predicateIndex) { case 0: return precpred(_ctx, 21); case 1: return precpred(_ctx, 19); case 2: return precpred(_ctx, 18); case 3: return precpred(_ctx, 17); case 4: return precpred(_ctx, 10); case 5: return precpred(_ctx, 9); case 6: return precpred(_ctx, 8); case 7: return precpred(_ctx, 7); case 8: return precpred(_ctx, 6); case 9: return precpred(_ctx, 5); case 10: return precpred(_ctx, 4); case 11: return precpred(_ctx, 3); case 12: return precpred(_ctx, 2); case 13: return precpred(_ctx, 22); case 14: return precpred(_ctx, 16); case 15: return precpred(_ctx, 15); default: break; } return true; } void PlanParser::initialize() { #if ANTLR4_USE_THREAD_LOCAL_CACHE planParserInitialize(); #else ::antlr4::internal::call_once(planParserOnceFlag, planParserInitialize); #endif } ================================================ FILE: src/parser/antlr/PlanParser.h ================================================ // Generated from Plan.g4 by ANTLR 4.13.1 #pragma once #include "antlr4-runtime.h" class PlanParser : public antlr4::Parser { public: enum { T__0 = 1, T__1 = 2, T__2 = 3, T__3 = 4, T__4 = 5, LT = 6, LE = 7, GT = 8, GE = 9, EQ = 10, NE = 11, LIKE = 12, EXISTS = 13, ADD = 14, SUB = 15, MUL = 16, DIV = 17, MOD = 18, POW = 19, SHL = 20, SHR = 21, BAND = 22, BOR = 23, BXOR = 24, AND = 25, OR = 26, BNOT = 27, NOT = 28, IN = 29, NIN = 30, EmptyTerm = 31, JSONContains = 32, JSONContainsAll = 33, JSONContainsAny = 34, ArrayContains = 35, ArrayContainsAll = 36, ArrayContainsAny = 37, ArrayLength = 38, BooleanConstant = 39, IntegerConstant = 40, FloatingConstant = 41, Identifier = 42, StringLiteral = 43, JSONIdentifier = 44, Whitespace = 45, Newline = 46 }; enum { RuleExpr = 0 }; explicit PlanParser(antlr4::TokenStream *input); PlanParser(antlr4::TokenStream *input, const antlr4::atn::ParserATNSimulatorOptions &options); ~PlanParser() override; std::string getGrammarFileName() const override; const antlr4::atn::ATN& getATN() const override; const std::vector& getRuleNames() const override; const antlr4::dfa::Vocabulary& getVocabulary() const override; antlr4::atn::SerializedATNView getSerializedATN() const override; class ExprContext; class ExprContext : public antlr4::ParserRuleContext { public: ExprContext(antlr4::ParserRuleContext *parent, size_t invokingState); ExprContext() = default; void copyFrom(ExprContext *context); using antlr4::ParserRuleContext::copyFrom; virtual size_t getRuleIndex() const override; }; class JSONIdentifierContext : public ExprContext { public: JSONIdentifierContext(ExprContext *ctx); antlr4::tree::TerminalNode *JSONIdentifier(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class ParensContext : public ExprContext { public: ParensContext(ExprContext *ctx); ExprContext *expr(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class StringContext : public ExprContext { public: StringContext(ExprContext *ctx); antlr4::tree::TerminalNode *StringLiteral(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class FloatingContext : public ExprContext { public: FloatingContext(ExprContext *ctx); antlr4::tree::TerminalNode *FloatingConstant(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class JSONContainsAllContext : public ExprContext { public: JSONContainsAllContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *JSONContainsAll(); antlr4::tree::TerminalNode *ArrayContainsAll(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class LogicalOrContext : public ExprContext { public: LogicalOrContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *OR(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class MulDivModContext : public ExprContext { public: MulDivModContext(ExprContext *ctx); antlr4::Token *op = nullptr; std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *MUL(); antlr4::tree::TerminalNode *DIV(); antlr4::tree::TerminalNode *MOD(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class IdentifierContext : public ExprContext { public: IdentifierContext(ExprContext *ctx); antlr4::tree::TerminalNode *Identifier(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class LikeContext : public ExprContext { public: LikeContext(ExprContext *ctx); ExprContext *expr(); antlr4::tree::TerminalNode *LIKE(); antlr4::tree::TerminalNode *StringLiteral(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class LogicalAndContext : public ExprContext { public: LogicalAndContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *AND(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class EqualityContext : public ExprContext { public: EqualityContext(ExprContext *ctx); antlr4::Token *op = nullptr; std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *EQ(); antlr4::tree::TerminalNode *NE(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class BooleanContext : public ExprContext { public: BooleanContext(ExprContext *ctx); antlr4::tree::TerminalNode *BooleanConstant(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class ShiftContext : public ExprContext { public: ShiftContext(ExprContext *ctx); antlr4::Token *op = nullptr; std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *SHL(); antlr4::tree::TerminalNode *SHR(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class ReverseRangeContext : public ExprContext { public: ReverseRangeContext(ExprContext *ctx); antlr4::Token *op1 = nullptr; antlr4::Token *op2 = nullptr; std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *Identifier(); antlr4::tree::TerminalNode *JSONIdentifier(); std::vector GT(); antlr4::tree::TerminalNode* GT(size_t i); std::vector GE(); antlr4::tree::TerminalNode* GE(size_t i); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class BitOrContext : public ExprContext { public: BitOrContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *BOR(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class AddSubContext : public ExprContext { public: AddSubContext(ExprContext *ctx); antlr4::Token *op = nullptr; std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *ADD(); antlr4::tree::TerminalNode *SUB(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class RelationalContext : public ExprContext { public: RelationalContext(ExprContext *ctx); antlr4::Token *op = nullptr; std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *LT(); antlr4::tree::TerminalNode *LE(); antlr4::tree::TerminalNode *GT(); antlr4::tree::TerminalNode *GE(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class ArrayLengthContext : public ExprContext { public: ArrayLengthContext(ExprContext *ctx); antlr4::tree::TerminalNode *ArrayLength(); antlr4::tree::TerminalNode *Identifier(); antlr4::tree::TerminalNode *JSONIdentifier(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class TermContext : public ExprContext { public: TermContext(ExprContext *ctx); antlr4::Token *op = nullptr; std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *IN(); antlr4::tree::TerminalNode *NIN(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class JSONContainsContext : public ExprContext { public: JSONContainsContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *JSONContains(); antlr4::tree::TerminalNode *ArrayContains(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class RangeContext : public ExprContext { public: RangeContext(ExprContext *ctx); antlr4::Token *op1 = nullptr; antlr4::Token *op2 = nullptr; std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *Identifier(); antlr4::tree::TerminalNode *JSONIdentifier(); std::vector LT(); antlr4::tree::TerminalNode* LT(size_t i); std::vector LE(); antlr4::tree::TerminalNode* LE(size_t i); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class UnaryContext : public ExprContext { public: UnaryContext(ExprContext *ctx); antlr4::Token *op = nullptr; ExprContext *expr(); antlr4::tree::TerminalNode *ADD(); antlr4::tree::TerminalNode *SUB(); antlr4::tree::TerminalNode *BNOT(); antlr4::tree::TerminalNode *NOT(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class IntegerContext : public ExprContext { public: IntegerContext(ExprContext *ctx); antlr4::tree::TerminalNode *IntegerConstant(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class ArrayContext : public ExprContext { public: ArrayContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class JSONContainsAnyContext : public ExprContext { public: JSONContainsAnyContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *JSONContainsAny(); antlr4::tree::TerminalNode *ArrayContainsAny(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class BitXorContext : public ExprContext { public: BitXorContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *BXOR(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class ExistsContext : public ExprContext { public: ExistsContext(ExprContext *ctx); antlr4::tree::TerminalNode *EXISTS(); ExprContext *expr(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class BitAndContext : public ExprContext { public: BitAndContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *BAND(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class EmptyTermContext : public ExprContext { public: EmptyTermContext(ExprContext *ctx); antlr4::Token *op = nullptr; ExprContext *expr(); antlr4::tree::TerminalNode *EmptyTerm(); antlr4::tree::TerminalNode *IN(); antlr4::tree::TerminalNode *NIN(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; class PowerContext : public ExprContext { public: PowerContext(ExprContext *ctx); std::vector expr(); ExprContext* expr(size_t i); antlr4::tree::TerminalNode *POW(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; ExprContext* expr(); ExprContext* expr(int precedence); bool sempred(antlr4::RuleContext *_localctx, size_t ruleIndex, size_t predicateIndex) override; bool exprSempred(ExprContext *_localctx, size_t predicateIndex); // By default the static state used to implement the parser is lazily initialized during the first // call to the constructor. You can call this function if you wish to initialize the static state // ahead of time. static void initialize(); private: }; ================================================ FILE: src/parser/antlr/PlanVisitor.cpp ================================================ // Generated from Plan.g4 by ANTLR 4.13.1 #include "PlanVisitor.h" ================================================ FILE: src/parser/antlr/PlanVisitor.h ================================================ // Generated from Plan.g4 by ANTLR 4.13.1 #pragma once #include "antlr4-runtime.h" #include "PlanParser.h" /** * This class defines an abstract visitor for a parse tree * produced by PlanParser. */ class PlanVisitor : public antlr4::tree::AbstractParseTreeVisitor { public: /** * Visit parse trees produced by PlanParser. */ virtual std::any visitJSONIdentifier(PlanParser::JSONIdentifierContext *context) = 0; virtual std::any visitParens(PlanParser::ParensContext *context) = 0; virtual std::any visitString(PlanParser::StringContext *context) = 0; virtual std::any visitFloating(PlanParser::FloatingContext *context) = 0; virtual std::any visitJSONContainsAll(PlanParser::JSONContainsAllContext *context) = 0; virtual std::any visitLogicalOr(PlanParser::LogicalOrContext *context) = 0; virtual std::any visitMulDivMod(PlanParser::MulDivModContext *context) = 0; virtual std::any visitIdentifier(PlanParser::IdentifierContext *context) = 0; virtual std::any visitLike(PlanParser::LikeContext *context) = 0; virtual std::any visitLogicalAnd(PlanParser::LogicalAndContext *context) = 0; virtual std::any visitEquality(PlanParser::EqualityContext *context) = 0; virtual std::any visitBoolean(PlanParser::BooleanContext *context) = 0; virtual std::any visitShift(PlanParser::ShiftContext *context) = 0; virtual std::any visitReverseRange(PlanParser::ReverseRangeContext *context) = 0; virtual std::any visitBitOr(PlanParser::BitOrContext *context) = 0; virtual std::any visitAddSub(PlanParser::AddSubContext *context) = 0; virtual std::any visitRelational(PlanParser::RelationalContext *context) = 0; virtual std::any visitArrayLength(PlanParser::ArrayLengthContext *context) = 0; virtual std::any visitTerm(PlanParser::TermContext *context) = 0; virtual std::any visitJSONContains(PlanParser::JSONContainsContext *context) = 0; virtual std::any visitRange(PlanParser::RangeContext *context) = 0; virtual std::any visitUnary(PlanParser::UnaryContext *context) = 0; virtual std::any visitInteger(PlanParser::IntegerContext *context) = 0; virtual std::any visitArray(PlanParser::ArrayContext *context) = 0; virtual std::any visitJSONContainsAny(PlanParser::JSONContainsAnyContext *context) = 0; virtual std::any visitBitXor(PlanParser::BitXorContext *context) = 0; virtual std::any visitExists(PlanParser::ExistsContext *context) = 0; virtual std::any visitBitAnd(PlanParser::BitAndContext *context) = 0; virtual std::any visitEmptyTerm(PlanParser::EmptyTermContext *context) = 0; virtual std::any visitPower(PlanParser::PowerContext *context) = 0; }; ================================================ FILE: src/parser/parser.cc ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "parser.h" namespace milvus::local { std::string ParserToMessage(milvus::proto::schema::CollectionSchema& schema, const std::string& exprstr) { if (exprstr.empty()) { google::protobuf::Arena arena; auto alway_true_expr = google::protobuf::Arena::CreateMessage( &arena); auto expr = google::protobuf::Arena::CreateMessage(&arena); expr->unsafe_arena_set_allocated_always_true_expr(alway_true_expr); return expr->SerializeAsString(); } antlr4::ANTLRInputStream input(exprstr); PlanLexer lexer(&input); antlr4::CommonTokenStream tokens(&lexer); PlanParser parser(&tokens); PlanParser::ExprContext* tree = parser.expr(); auto helper = milvus::local::CreateSchemaHelper(&schema); milvus::local::PlanCCVisitor visitor(&helper); auto res = std::any_cast(visitor.visit(tree)); return res.expr->SerializeAsString(); } std::shared_ptr ParseIdentifier(milvus::local::SchemaHelper helper, const std::string& identifier) { auto expr = google::protobuf::Arena::CreateMessage(NULL); expr->ParseFromString(ParserToMessage(*(helper.schema), identifier)); auto ret = std::make_shared(); ret.reset(expr); return ret; }; } // namespace milvus::local ================================================ FILE: src/parser/parser.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include "antlr/PlanBaseVisitor.h" #include "antlr/PlanLexer.h" #include "antlr/PlanParser.h" #include "pb/plan.pb.h" #include "utils.h" namespace milvus::local { class PlanCCVisitor : public PlanVisitor { public: // ok virtual std::any visitShift(PlanParser::ShiftContext*) override { assert(false); return nullptr; } // ok virtual std::any visitBitOr(PlanParser::BitOrContext*) override { assert(false); return nullptr; } // ok virtual std::any visitBitXor(PlanParser::BitXorContext*) override { assert(false); return nullptr; } // ok virtual std::any visitBitAnd(PlanParser::BitAndContext*) override { assert(false); return nullptr; } // ok virtual std::any visitParens(PlanParser::ParensContext* ctx) override { return ctx->expr()->accept(this); } // ok virtual std::any visitString(PlanParser::StringContext* ctx) override { auto val = ctx->getText(); return ExprWithDtype(createValueExpr( convertEscapeSingle(val), this->arena.get()), proto::schema::DataType::VarChar, true); } // ok virtual std::any visitFloating(PlanParser::FloatingContext* ctx) override { auto text = ctx->getText(); auto val = std::strtod(text.c_str(), NULL); return ExprWithDtype(createValueExpr(val, this->arena.get()), proto::schema::DataType::Float, true); } // ok virtual std::any visitInteger(PlanParser::IntegerContext* ctx) override { auto text = ctx->getText(); int64_t val = std::strtoll(text.c_str(), NULL, 10); return ExprWithDtype(createValueExpr(val, this->arena.get()), proto::schema::DataType::Int64, true); } // ok virtual std::any visitBoolean(PlanParser::BooleanContext* ctx) override { auto text = ctx->getText(); bool val; std::transform( text.begin(), text.end(), text.begin(), [](unsigned char c) { return std::tolower(c); }); std::istringstream(text) >> std::boolalpha >> val; return ExprWithDtype(createValueExpr(val, this->arena.get()), proto::schema::DataType::Bool, true); } virtual std::any visitPower(PlanParser::PowerContext* ctx) override { auto expr = ctx->expr(); auto left_expr = std::any_cast(expr[0]->accept(this)).expr; auto right_expr = std::any_cast(expr[1]->accept(this)).expr; auto left = extractValue(left_expr); auto right = extractValue(right_expr); TRY_WITH_EXCEPTION(left.has_value() && right.has_value()); TRY_WITH_EXCEPTION(left.type() == typeid(double) || left.type() == typeid(int64_t)); TRY_WITH_EXCEPTION(right.type() == typeid(double) || right.type() == typeid(int64_t)); float left_value, right_value; if (left.type() == typeid(int64_t)) left_value = float(std::any_cast(left)); if (left.type() == typeid(double)) left_value = float(std::any_cast(left)); if (right.type() == typeid(int64_t)) right_value = float(std::any_cast(right)); if (right.type() == typeid(double)) right_value = float(std::any_cast(right)); return ExprWithDtype( createValueExpr(powf(left_value, right_value), this->arena.get()), proto::schema::DataType::Double, false); } virtual std::any visitLogicalOr(PlanParser::LogicalOrContext* ctx) override { auto expr = ctx->expr(); auto left_expr_with_type = std::any_cast(expr[0]->accept(this)); auto right_expr_with_type = std::any_cast(expr[1]->accept(this)); auto left_expr = left_expr_with_type.expr; auto right_expr = right_expr_with_type.expr; auto left_value = extractValue(left_expr); auto right_value = extractValue(right_expr); if (left_value.has_value() && right_value.has_value() && left_value.type() == typeid(bool) && right_value.type() == typeid(bool)) { return ExprWithDtype( createValueExpr(std::any_cast(left_value) || std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Bool, false ); } TRY_WITH_EXCEPTION(!left_expr_with_type.dependent); TRY_WITH_EXCEPTION(!right_expr_with_type.dependent); TRY_WITH_EXCEPTION(left_expr_with_type.dtype == proto::schema::DataType::Bool); TRY_WITH_EXCEPTION(right_expr_with_type.dtype == proto::schema::DataType::Bool); return ExprWithDtype( createBinExpr( left_expr, right_expr, this->arena.get()), proto::schema::DataType::Bool, false); } virtual std::any visitLogicalAnd(PlanParser::LogicalAndContext* ctx) override { auto expr = ctx->expr(); auto left_expr_with_type = std::any_cast(expr[0]->accept(this)); auto right_expr_with_type = std::any_cast(expr[1]->accept(this)); auto left_expr = left_expr_with_type.expr; auto right_expr = right_expr_with_type.expr; auto left_value = extractValue(left_expr); auto right_value = extractValue(right_expr); if (left_value.has_value() && right_value.has_value() && left_value.type() == typeid(bool) && right_value.type() == typeid(bool)) { return ExprWithDtype( createValueExpr(std::any_cast(left_value) && std::any_cast(right_value), this->arena.get() ), proto::schema::DataType::Bool, false ); } TRY_WITH_EXCEPTION(!left_expr_with_type.dependent); TRY_WITH_EXCEPTION(!right_expr_with_type.dependent); TRY_WITH_EXCEPTION(left_expr_with_type.dtype == proto::schema::DataType::Bool); TRY_WITH_EXCEPTION(right_expr_with_type.dtype == proto::schema::DataType::Bool); return ExprWithDtype( createBinExpr( left_expr, right_expr, this->arena.get()), proto::schema::DataType::Bool, false); } virtual std::any visitJSONIdentifier(PlanParser::JSONIdentifierContext* ctx) override { auto info = getChildColumnInfo(nullptr, ctx->JSONIdentifier()); TRY_WITH_EXCEPTION(info); auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto col_expr = google::protobuf::Arena::CreateMessage( this->arena.get()); col_expr->unsafe_arena_set_allocated_info(info); expr->unsafe_arena_set_allocated_column_expr(col_expr); return ExprWithDtype(expr, info->data_type(), true); } virtual std::any visitJSONContainsAll(PlanParser::JSONContainsAllContext* ctx) override { auto expr_ret = ctx->expr(); auto field = std::any_cast(expr_ret[0]->accept(this)); auto info = field.expr->column_expr().info(); TRY_WITH_EXCEPTION(info.data_type() == proto::schema::DataType::Array || info.data_type() == proto::schema::DataType::JSON); auto elem = std::any_cast(expr_ret[1]->accept(this)); TRY_WITH_EXCEPTION(elem.expr->value_expr().has_value() && elem.expr->value_expr().value().has_array_val()); if (info.data_type() == proto::schema::DataType::Array) { auto arr = elem.expr->value_expr().value().array_val(); for (int idx = 0; idx < arr.array_size(); idx++) { proto::plan::GenericValue expr = arr.array(idx); TRY_WITH_EXCEPTION(canBeCompared( field, toValueExpr(&expr, this->arena.get()))); } } auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto json_contain_expr = google::protobuf::Arena::CreateMessage< proto::plan::JSONContainsExpr>(this->arena.get()); auto arr = elem.expr->value_expr().value().array_val(); for (int idx = 0; idx < arr.array_size(); idx++) { proto::plan::GenericValue expr = arr.array(idx); auto val = json_contain_expr->add_elements(); if (expr.has_bool_val()) val->set_bool_val(expr.bool_val()); if (expr.has_string_val()) val->set_string_val(expr.string_val()); if (expr.has_float_val()) val->set_float_val(expr.float_val()); if (expr.has_int64_val()) val->set_int64_val(expr.int64_val()); } json_contain_expr->set_elements_same_type( elem.expr->value_expr().value().array_val().same_type()); json_contain_expr->unsafe_arena_set_allocated_column_info( CreateMessageWithCopy(this->arena.get(), info)); json_contain_expr->set_op( proto::plan::JSONContainsExpr_JSONOp_ContainsAll); expr->unsafe_arena_set_allocated_json_contains_expr(json_contain_expr); return ExprWithDtype(expr, proto::schema::Bool, false); } virtual std::any visitMulDivMod(PlanParser::MulDivModContext* ctx) override { auto expr = ctx->expr(); auto left_expr_with_type = std::any_cast(expr[0]->accept(this)); auto right_expr_with_type = std::any_cast(expr[1]->accept(this)); auto left_expr = left_expr_with_type.expr; auto right_expr = right_expr_with_type.expr; auto left_value = extractValue(left_expr); auto right_value = extractValue(right_expr); if (left_value.has_value() && right_value.has_value()) { if (left_value.type() == typeid(double) && right_value.type() == typeid(double)) { switch (ctx->op->getType()) { case PlanParser::MUL: return ExprWithDtype( createValueExpr( std::any_cast(left_value) * std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Double, false); case PlanParser::DIV: return ExprWithDtype( createValueExpr( std::any_cast(left_value) / std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Double, false); default: TRY_WITH_EXCEPTION(false); } } if (left_value.type() == typeid(int64_t) && right_value.type() == typeid(int64_t)) { switch (ctx->op->getType()) { case PlanParser::MUL: return ExprWithDtype( createValueExpr( std::any_cast(left_value) * std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Int64, false); case PlanParser::DIV: return ExprWithDtype( createValueExpr( std::any_cast(left_value) / std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Int64, false); case PlanParser::MOD: return ExprWithDtype( createValueExpr( std::any_cast(left_value) % std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Int64, false); default: TRY_WITH_EXCEPTION(false); } } if (left_value.type() == typeid(double) && right_value.type() == typeid(int64_t)) { switch (ctx->op->getType()) { case PlanParser::MUL: return ExprWithDtype( createValueExpr( std::any_cast(left_value) * std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Double, false); case PlanParser::DIV: return ExprWithDtype( createValueExpr( std::any_cast(left_value) / std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Double, false); default: TRY_WITH_EXCEPTION(false); } } if (left_value.type() == typeid(int64_t) && right_value.type() == typeid(double)) { switch (ctx->op->getType()) { case PlanParser::MUL: return ExprWithDtype( createValueExpr( double(std::any_cast(left_value)) * std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Double, false); case PlanParser::DIV: return ExprWithDtype( createValueExpr( double(std::any_cast(left_value)) * std::any_cast(right_value), this->arena.get()), proto::schema::DataType::Double, false); default: TRY_WITH_EXCEPTION(false); } } if (left_expr->has_column_expr()) { TRY_WITH_EXCEPTION( left_expr->column_expr().info().data_type() != proto::schema::DataType::Array); TRY_WITH_EXCEPTION( left_expr->column_expr().info().nested_path_size() == 0); } if (right_expr->has_column_expr()) { TRY_WITH_EXCEPTION( right_expr->column_expr().info().data_type() != proto::schema::DataType::Array); TRY_WITH_EXCEPTION( right_expr->column_expr().info().nested_path_size() == 0); } if (left_expr_with_type.dtype == proto::schema::DataType::Array) { if (right_expr_with_type.dtype == proto::schema::DataType::Array) TRY_WITH_EXCEPTION( canArithmeticDtype(getArrayElementType(left_expr), getArrayElementType(right_expr))); else if (arithmeticDtype(left_expr_with_type.dtype)) TRY_WITH_EXCEPTION( canArithmeticDtype(getArrayElementType(left_expr), right_expr_with_type.dtype)); else TRY_WITH_EXCEPTION(false); } if (right_expr_with_type.dtype == proto::schema::DataType::Array) { if (arithmeticDtype(left_expr_with_type.dtype)) TRY_WITH_EXCEPTION( canArithmeticDtype(left_expr_with_type.dtype, getArrayElementType(right_expr))); else TRY_WITH_EXCEPTION(false); } if (arithmeticDtype(left_expr_with_type.dtype) && arithmeticDtype(right_expr_with_type.dtype)) { TRY_WITH_EXCEPTION(canArithmeticDtype( left_expr_with_type.dtype, right_expr_with_type.dtype)); } else { TRY_WITH_EXCEPTION(false); } switch (ctx->op->getType()) { case PlanParser::MUL: return ExprWithDtype( createBinArithExpr( left_expr, right_expr, this->arena.get()), calDataType(&left_expr_with_type, &right_expr_with_type), false); case PlanParser::DIV: return ExprWithDtype( createBinArithExpr( left_expr, right_expr, this->arena.get()), calDataType(&left_expr_with_type, &right_expr_with_type), false); case PlanParser::MOD: return ExprWithDtype( createBinArithExpr( left_expr, right_expr, this->arena.get()), calDataType(&left_expr_with_type, &right_expr_with_type), false); default: TRY_WITH_EXCEPTION(false); } } return nullptr; } virtual std::any visitIdentifier(PlanParser::IdentifierContext* ctx) override { auto identifier = ctx->getText(); auto& field = helper->GetFieldFromNameDefaultJSON(identifier); std::vector nested_path; if (field.name() != identifier) { nested_path.push_back(identifier); } TRY_WITH_EXCEPTION( !(field.data_type() == proto::schema::DataType::JSON && nested_path.empty())); auto expr = google::protobuf::Arena::CreateMessage( arena.get()); auto col_expr = google::protobuf::Arena::CreateMessage( arena.get()); auto info = google::protobuf::Arena::CreateMessage( arena.get()); info->set_field_id(field.fieldid()); info->set_data_type(field.data_type()); info->set_is_primary_key(field.is_primary_key()); info->set_is_autoid(field.autoid()); for (int i = 0; i < (int)nested_path.size(); ++i) { auto path_added = info->add_nested_path(); *path_added = nested_path[i]; } info->set_is_primary_key(field.is_primary_key()); info->set_element_type(field.element_type()); col_expr->set_allocated_info(info); expr->set_allocated_column_expr(col_expr); return ExprWithDtype(expr, field.data_type(), false); } virtual std::any visitLike(PlanParser::LikeContext* ctx) override { auto child_expr_with_type = std::any_cast(ctx->expr()->accept(this)); auto child_expr = child_expr_with_type.expr; TRY_WITH_EXCEPTION(child_expr); auto info = child_expr->column_expr().info(); TRY_WITH_EXCEPTION( !(info.data_type() == proto::schema::DataType::JSON && info.nested_path_size() == 0)); TRY_WITH_EXCEPTION( (child_expr_with_type.dtype == proto::schema::DataType::VarChar || child_expr_with_type.dtype == proto::schema::DataType::JSON) || (child_expr_with_type.dtype == proto::schema::DataType::Array && info.element_type() == proto::schema::DataType::VarChar)); auto str = ctx->StringLiteral()->getText(); auto pattern = convertEscapeSingle(str); auto res = translatePatternMatch(pattern); auto expr = google::protobuf::Arena::CreateMessage( arena.get()); auto unaryrange_expr = google::protobuf::Arena::CreateMessage( arena.get()); unaryrange_expr->set_op(res.first); auto value = google::protobuf::Arena::CreateMessage( this->arena.get()); value->set_string_val(res.second); unaryrange_expr->unsafe_arena_set_allocated_value(value); unaryrange_expr->unsafe_arena_set_allocated_column_info( CreateMessageWithCopy(this->arena.get(), info)); expr->set_allocated_unary_range_expr(unaryrange_expr); return ExprWithDtype(expr, proto::schema::DataType::Bool, false); } virtual std::any visitEquality(PlanParser::EqualityContext* ctx) override { auto expr = ctx->expr(); auto left_expr_with_type = std::any_cast(expr[0]->accept(this)); auto right_expr_with_type = std::any_cast(expr[1]->accept(this)); auto left_value = extractValue(left_expr_with_type.expr); auto right_value = extractValue(right_expr_with_type.expr); if (left_value.has_value() && right_value.has_value()) { #define PROCESS_EQALITY(left_type, right_type) \ if (left_value.type() == typeid(left_type) && \ right_value.type() == typeid(right_type)) { \ switch (ctx->op->getType()) { \ case PlanParser::EQ: \ return ExprWithDtype( \ createValueExpr( \ std::any_cast(left_value) == \ std::any_cast(right_value), \ this->arena.get()), \ proto::schema::DataType::Bool, \ false); \ case PlanParser::NE: \ return ExprWithDtype( \ createValueExpr( \ std::any_cast(left_value) != \ std::any_cast(right_value), \ this->arena.get()), \ proto::schema::DataType::Bool, \ false); \ } \ } PROCESS_EQALITY(bool, bool); PROCESS_EQALITY(std::string, std::string); PROCESS_EQALITY(double, double); PROCESS_EQALITY(double, int64_t); PROCESS_EQALITY(int64_t, double); PROCESS_EQALITY(int32_t, int32_t); PROCESS_EQALITY(int64_t, int64_t); PROCESS_EQALITY(double, int32_t); PROCESS_EQALITY(int32_t, double); PROCESS_EQALITY(float, float); PROCESS_EQALITY(int32_t, float); PROCESS_EQALITY(float, int32_t); PROCESS_EQALITY(float, double); PROCESS_EQALITY(double, float); } if (left_expr_with_type.expr->has_value_expr() && !right_expr_with_type.expr->has_value_expr()) { ExprWithDtype left = toValueExpr(CreateMessageWithCopy( this->arena.get(), left_expr_with_type.expr->value_expr().value()), this->arena.get()); ExprWithDtype right = right_expr_with_type; return ExprWithDtype( HandleCompare( ctx->op->getType(), left, right, this->arena.get()), proto::schema::DataType::Bool, false); } if (!left_expr_with_type.expr->has_value_expr() && right_expr_with_type.expr->has_value_expr()) { ExprWithDtype left = left_expr_with_type; ExprWithDtype right = toValueExpr( CreateMessageWithCopy( this->arena.get(), right_expr_with_type.expr->value_expr().value()), this->arena.get()); return ExprWithDtype( HandleCompare( ctx->op->getType(), left, right, this->arena.get()), proto::schema::DataType::Bool, false); } if (!left_expr_with_type.expr->has_value_expr() && !right_expr_with_type.expr->has_value_expr()) { return ExprWithDtype(HandleCompare(ctx->op->getType(), left_expr_with_type, right_expr_with_type, this->arena.get()), proto::schema::DataType::Bool, false); } return nullptr; } proto::plan::ColumnInfo* getChildColumnInfo(antlr4::tree::TerminalNode* identifier, antlr4::tree::TerminalNode* child) { if (identifier) { auto text = identifier->getText(); auto field = helper->GetFieldFromNameDefaultJSON(text); std::vector nested_path; if (field.name() != text) { nested_path.push_back(text); } TRY_WITH_EXCEPTION( !(field.data_type() == proto::schema::DataType::JSON && nested_path.empty())); auto info = google::protobuf::Arena::CreateMessage( this->arena.get()); info->set_field_id(field.fieldid()); info->set_data_type(field.data_type()); info->set_is_primary_key(field.is_primary_key()); info->set_is_autoid(field.autoid()); for (int i = 0; i < (int)nested_path.size(); ++i) { auto path_added = info->add_nested_path(); *path_added = nested_path[i]; } info->set_is_primary_key(field.is_primary_key()); info->set_element_type(field.element_type()); return info; } auto childtext = child->getText(); std::string fieldname = childtext.substr(0, childtext.find("[", 0)); std::vector nested_path; auto field = helper->GetFieldFromNameDefaultJSON(fieldname); TRY_WITH_EXCEPTION(field.data_type() == proto::schema::DataType::JSON || field.data_type() == proto::schema::DataType::Array); if (fieldname != field.name()) nested_path.push_back(fieldname); auto jsonkey = childtext.substr( fieldname.length(), childtext.length() - fieldname.length()); auto ss = tokenize(jsonkey, "]["); for (size_t i = 0; i < ss.size(); ++i) { std::string path_ = ss[i]; if (path_[0] == '[') path_ = path_.substr(1, path_.length() - 1); if (path_[path_.length() - 1] == ']') path_ = path_.substr(0, path_.length() - 1); TRY_WITH_EXCEPTION(path_ != ""); if ((path_[0] == '\"' && path_[path_.length() - 1] == '\"') || (path_[0] == '\'' && path_[path_.length() - 1] == '\'')) { path_ = path_.substr(1, path_.length() - 2); TRY_WITH_EXCEPTION(path_ != ""); } nested_path.push_back(path_); } auto info = google::protobuf::Arena::CreateMessage( this->arena.get()); info->set_field_id(field.fieldid()); info->set_data_type(field.data_type()); info->set_is_primary_key(field.is_primary_key()); info->set_is_autoid(field.autoid()); for (int i = 0; i < (int)nested_path.size(); ++i) { auto path_added = info->add_nested_path(); *path_added = nested_path[i]; } info->set_is_primary_key(field.is_primary_key()); info->set_element_type(field.element_type()); return info; } virtual std::any visitReverseRange(PlanParser::ReverseRangeContext* ctx) override { auto expr = ctx->expr(); auto info = getChildColumnInfo(ctx->Identifier(), ctx->JSONIdentifier()); TRY_WITH_EXCEPTION(info != nullptr); TRY_WITH_EXCEPTION(checkDirectComparisonBinaryField(info)); auto lower = std::any_cast(expr[1]->accept(this)); auto upper = std::any_cast(expr[0]->accept(this)); if (info->data_type() == proto::schema::DataType::Int8 || info->data_type() == proto::schema::DataType::Int16 || info->data_type() == proto::schema::DataType::Int32 || info->data_type() == proto::schema::DataType::Int64 || info->data_type() == proto::schema::DataType::Float || info->data_type() == proto::schema::DataType::Double || info->data_type() == proto::schema::DataType::Bool || info->data_type() == proto::schema::DataType::String || info->data_type() == proto::schema::DataType::VarChar) { auto a = extractValue(lower.expr); auto b = extractValue(upper.expr); if (a.has_value() && b.has_value()) { bool lowerinclusive = ctx->op1->getType() == PlanParser::GE; bool upperinclusive = ctx->op2->getType() == PlanParser::GE; auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto binary_range_expr = google::protobuf::Arena::CreateMessage< proto::plan::BinaryRangeExpr>(this->arena.get()); auto lower_value = google::protobuf::Arena::CreateMessage< proto::plan::GenericValue>(this->arena.get()); auto upper_value = google::protobuf::Arena::CreateMessage< proto::plan::GenericValue>(this->arena.get()); if (a.type() == typeid(int8_t)) lower_value->set_int64_val( int64_t(std::any_cast(a))); if (a.type() == typeid(int16_t)) lower_value->set_int64_val( int64_t(std::any_cast(a))); if (a.type() == typeid(int32_t)) lower_value->set_int64_val( int64_t(std::any_cast(a))); if (a.type() == typeid(int64_t)) lower_value->set_int64_val(std::any_cast(a)); if (a.type() == typeid(double)) lower_value->set_float_val(std::any_cast(a)); if (a.type() == typeid(float)) lower_value->set_float_val(double(std::any_cast(a))); if (a.type() == typeid(std::string)) lower_value->set_string_val(std::any_cast(a)); if (a.type() == typeid(bool)) lower_value->set_bool_val(std::any_cast(a)); if (b.type() == typeid(int8_t)) upper_value->set_int64_val( int64_t(std::any_cast(b))); if (b.type() == typeid(int16_t)) upper_value->set_int64_val( int64_t(std::any_cast(b))); if (b.type() == typeid(int32_t)) upper_value->set_int64_val( int64_t(std::any_cast(b))); if (b.type() == typeid(int64_t)) upper_value->set_int64_val( int64_t(std::any_cast(b))); if (b.type() == typeid(double)) upper_value->set_float_val(std::any_cast(b)); if (b.type() == typeid(float)) upper_value->set_float_val(double(std::any_cast(b))); if (b.type() == typeid(std::string)) upper_value->set_string_val(std::any_cast(b)); if (b.type() == typeid(bool)) upper_value->set_bool_val(std::any_cast(b)); binary_range_expr->set_lower_inclusive(lowerinclusive); binary_range_expr->set_upper_inclusive(upperinclusive); binary_range_expr->unsafe_arena_set_allocated_column_info(info); binary_range_expr->unsafe_arena_set_allocated_lower_value( lower_value); binary_range_expr->unsafe_arena_set_allocated_upper_value( upper_value); expr->set_allocated_binary_range_expr(binary_range_expr); return ExprWithDtype( expr, proto::schema::DataType::Bool, false); } } return nullptr; } virtual std::any visitAddSub(PlanParser::AddSubContext* ctx) override { auto expr = ctx->expr(); auto left_expr_with_type = std::any_cast(expr[0]->accept(this)); auto right_expr_with_type = std::any_cast(expr[1]->accept(this)); auto left_value = extractValue(left_expr_with_type.expr); auto right_value = extractValue(right_expr_with_type.expr); if (left_value.has_value() && right_value.has_value()) { #define PROCESS_ADDSUB(left_type, right_type, target_type, datatype) \ if (left_value.type() == typeid(left_type) && \ right_value.type() == typeid(right_type)) { \ switch (ctx->op->getType()) { \ case PlanParser::ADD: \ return ExprWithDtype( \ createValueExpr( \ std::any_cast(left_value) + \ std::any_cast(right_value), \ this->arena.get()), \ datatype, \ false); \ case PlanParser::SUB: \ return ExprWithDtype( \ createValueExpr( \ std::any_cast(left_value) - \ std::any_cast(right_value), \ this->arena.get()), \ datatype, \ false); \ default: \ TRY_WITH_EXCEPTION(false); \ } \ } PROCESS_ADDSUB( double, double, double, proto::schema::DataType::Double) PROCESS_ADDSUB( double, int64_t, double, proto::schema::DataType::Double) PROCESS_ADDSUB( int64_t, double, double, proto::schema::DataType::Double) PROCESS_ADDSUB( int64_t, int64_t, int64_t, proto::schema::DataType::Int64) PROCESS_ADDSUB( int32_t, int32_t, int32_t, proto::schema::DataType::Int32) PROCESS_ADDSUB( float, float, double, proto::schema::DataType::Double) } auto left_expr = left_expr_with_type.expr; auto right_expr = right_expr_with_type.expr; if (left_expr->has_column_expr()) { TRY_WITH_EXCEPTION(left_expr->column_expr().info().data_type() != proto::schema::DataType::Array); TRY_WITH_EXCEPTION( left_expr->column_expr().info().nested_path_size() == 0); } if (right_expr->has_column_expr()) { TRY_WITH_EXCEPTION(right_expr->column_expr().info().data_type() != proto::schema::DataType::Array); TRY_WITH_EXCEPTION( right_expr->column_expr().info().nested_path_size() == 0); } if (left_expr_with_type.dtype == proto::schema::DataType::Array) { if (right_expr_with_type.dtype == proto::schema::DataType::Array) TRY_WITH_EXCEPTION( canArithmeticDtype(getArrayElementType(left_expr), getArrayElementType(right_expr))); else if (arithmeticDtype(right_expr_with_type.dtype)) TRY_WITH_EXCEPTION( canArithmeticDtype(getArrayElementType(left_expr), right_expr_with_type.dtype)); else TRY_WITH_EXCEPTION(false); } if (right_expr_with_type.dtype == proto::schema::DataType::Array) { if (arithmeticDtype(left_expr_with_type.dtype)) TRY_WITH_EXCEPTION( canArithmeticDtype(left_expr_with_type.dtype, getArrayElementType(right_expr))); else TRY_WITH_EXCEPTION(false); } if (arithmeticDtype(left_expr_with_type.dtype) && arithmeticDtype(right_expr_with_type.dtype)) { TRY_WITH_EXCEPTION(canArithmeticDtype(left_expr_with_type.dtype, right_expr_with_type.dtype)); } else { TRY_WITH_EXCEPTION(false); } switch (ctx->op->getType()) { case PlanParser::ADD: return ExprWithDtype( createBinArithExpr( left_expr, right_expr, this->arena.get()), calDataType(&left_expr_with_type, &right_expr_with_type), false); case PlanParser::SUB: return ExprWithDtype( createBinArithExpr( left_expr, right_expr, this->arena.get()), calDataType(&left_expr_with_type, &right_expr_with_type), false); default: TRY_WITH_EXCEPTION(false); } } virtual std::any visitRelational(PlanParser::RelationalContext* ctx) override { auto expr = ctx->expr(); auto left_expr_with_type = std::any_cast(expr[0]->accept(this)); auto right_expr_with_type = std::any_cast(expr[1]->accept(this)); auto left_value = extractValue(left_expr_with_type.expr); auto right_value = extractValue(right_expr_with_type.expr); if (left_value.has_value() && right_value.has_value()) { #define PROCESS_RELATIONAL(left_type, right_type) \ if (left_value.type() == typeid(left_type) && \ right_value.type() == typeid(right_type)) { \ switch (ctx->op->getType()) { \ case PlanParser::LT: \ return ExprWithDtype( \ createValueExpr( \ std::any_cast(left_value) < \ std::any_cast(right_value), \ this->arena.get()), \ proto::schema::DataType::Bool, \ false); \ case PlanParser::LE: \ return ExprWithDtype( \ createValueExpr( \ std::any_cast(left_value) <= \ std::any_cast(right_value), \ this->arena.get()), \ proto::schema::DataType::Bool, \ false); \ case PlanParser::GT: \ return ExprWithDtype( \ createValueExpr( \ std::any_cast(left_value) > \ std::any_cast(right_value), \ this->arena.get()), \ proto::schema::DataType::Bool, \ false); \ case PlanParser::GE: \ return ExprWithDtype( \ createValueExpr( \ std::any_cast(left_value) >= \ std::any_cast(right_value), \ this->arena.get()), \ proto::schema::DataType::Bool, \ false); \ default: \ TRY_WITH_EXCEPTION(false); \ } \ } PROCESS_RELATIONAL(double, double) PROCESS_RELATIONAL(double, int64_t) PROCESS_RELATIONAL(int64_t, double) PROCESS_RELATIONAL(std::string, std::string) PROCESS_RELATIONAL(int64_t, int64_t) PROCESS_RELATIONAL(int32_t, int32_t) } if (left_expr_with_type.expr->has_value_expr() && !right_expr_with_type.expr->has_value_expr()) { ExprWithDtype left = toValueExpr(CreateMessageWithCopy( this->arena.get(), left_expr_with_type.expr->value_expr().value()), this->arena.get()); ExprWithDtype right = right_expr_with_type; return ExprWithDtype( HandleCompare( ctx->op->getType(), left, right, this->arena.get()), proto::schema::DataType::Bool, false); } if (!left_expr_with_type.expr->has_value_expr() && right_expr_with_type.expr->has_value_expr()) { ExprWithDtype left = left_expr_with_type; ExprWithDtype right = toValueExpr( CreateMessageWithCopy( this->arena.get(), right_expr_with_type.expr->value_expr().value()), this->arena.get()); return ExprWithDtype( HandleCompare( ctx->op->getType(), left, right, this->arena.get()), proto::schema::DataType::Bool, false); } if (!left_expr_with_type.expr->has_value_expr() && !right_expr_with_type.expr->has_value_expr()) { return ExprWithDtype(HandleCompare(ctx->op->getType(), left_expr_with_type, right_expr_with_type, this->arena.get()), proto::schema::DataType::Bool, false); } return nullptr; } virtual std::any visitArrayLength(PlanParser::ArrayLengthContext* ctx) override { auto info = getChildColumnInfo(ctx->Identifier(), ctx->JSONIdentifier()); TRY_WITH_EXCEPTION(info); TRY_WITH_EXCEPTION(info->data_type() == proto::schema::Array || info->data_type() == proto::schema::JSON); auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto bin_arith_expr = google::protobuf::Arena::CreateMessage< proto::plan::BinaryArithExpr>(this->arena.get()); auto column_expr = google::protobuf::Arena::CreateMessage( this->arena.get()); column_expr->unsafe_arena_set_allocated_info(info); auto left_expr = google::protobuf::Arena::CreateMessage( this->arena.get()); left_expr->unsafe_arena_set_allocated_column_expr(column_expr); bin_arith_expr->unsafe_arena_set_allocated_left(left_expr); bin_arith_expr->set_op(proto::plan::ArithOpType::ArrayLength); expr->unsafe_arena_set_allocated_binary_arith_expr(bin_arith_expr); return ExprWithDtype(expr, proto::schema::DataType::Int64, false); } virtual std::any visitTerm(PlanParser::TermContext* ctx) override { auto expr_ret = ctx->expr(); auto first_expr_with_type = std::any_cast(expr_ret[0]->accept(this)); auto info = first_expr_with_type.expr->unsafe_arena_release_column_expr() ->unsafe_arena_release_info(); auto term_expr = google::protobuf::Arena::CreateMessage( arena.get()); for (size_t i = 1; i < expr_ret.size(); ++i) { auto elem = expr_ret[i]; auto expr_ = std::any_cast(elem->accept(this)).expr; auto v = google::protobuf::Arena::CreateMessage< proto::plan::GenericValue>(arena.get()); auto value = extractValue(expr_); if (value.type() == typeid(int8_t)) { v->set_int64_val(int64_t(std::any_cast(value))); term_expr->mutable_values()->UnsafeArenaAddAllocated(v); continue; } if (value.type() == typeid(int64_t)) { v->set_int64_val(int64_t(std::any_cast(value))); term_expr->mutable_values()->UnsafeArenaAddAllocated(v); continue; } if (value.type() == typeid(int32_t)) { v->set_int64_val(int64_t(std::any_cast(value))); term_expr->mutable_values()->UnsafeArenaAddAllocated(v); continue; } if (value.type() == typeid(double)) { v->set_float_val(double(std::any_cast(value))); term_expr->mutable_values()->UnsafeArenaAddAllocated(v); continue; } if (value.type() == typeid(float)) { v->set_float_val(double(std::any_cast(value))); term_expr->mutable_values()->UnsafeArenaAddAllocated(v); continue; } if (value.type() == typeid(bool)) { v->set_bool_val(std::any_cast(value)); term_expr->mutable_values()->UnsafeArenaAddAllocated(v); continue; } if (value.type() == typeid(std::string)) { v->set_string_val(std::any_cast(value)); term_expr->mutable_values()->UnsafeArenaAddAllocated(v); continue; } TRY_WITH_EXCEPTION(false); } auto expr = google::protobuf::Arena::CreateMessage( arena.get()); term_expr->unsafe_arena_set_allocated_column_info(info); expr->unsafe_arena_set_allocated_term_expr(term_expr); if (ctx->op->getType() == PlanParser::NIN) { auto root_expr = google::protobuf::Arena::CreateMessage( arena.get()); auto unary_expr = google::protobuf::Arena::CreateMessage( arena.get()); unary_expr->set_op(proto::plan::UnaryExpr_UnaryOp_Not); unary_expr->unsafe_arena_set_allocated_child(expr); root_expr->unsafe_arena_set_allocated_unary_expr(unary_expr); return ExprWithDtype( root_expr, proto::schema::DataType::Bool, false); } return ExprWithDtype(expr, proto::schema::DataType::Bool, false); } virtual std::any visitJSONContains(PlanParser::JSONContainsContext* ctx) override { auto expr_ret = ctx->expr(); auto field = std::any_cast(expr_ret[0]->accept(this)); auto info = field.expr->column_expr().info(); TRY_WITH_EXCEPTION(info.data_type() == proto::schema::DataType::Array || info.data_type() == proto::schema::DataType::JSON); auto elem = std::any_cast(expr_ret[1]->accept(this)); auto elem_value = elem.expr->value_expr().value(); if (info.data_type() == proto::schema::DataType::Array) { proto::plan::GenericValue expr = proto::plan::GenericValue(elem_value); TRY_WITH_EXCEPTION( canBeCompared(field, toValueExpr(&expr, this->arena.get()))); } auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto json_contain_expr = google::protobuf::Arena::CreateMessage< proto::plan::JSONContainsExpr>(this->arena.get()); auto value = json_contain_expr->add_elements(); value->CopyFrom(elem_value); json_contain_expr->set_elements_same_type(true); json_contain_expr->set_allocated_column_info( CreateMessageWithCopy(this->arena.get(), info)); json_contain_expr->unsafe_arena_set_allocated_column_info( CreateMessageWithCopy(this->arena.get(), info)); json_contain_expr->set_op( proto::plan::JSONContainsExpr_JSONOp_Contains); expr->set_allocated_json_contains_expr(json_contain_expr); return ExprWithDtype(expr, proto::schema::Bool, false); } virtual std::any visitRange(PlanParser::RangeContext* ctx) override { auto expr = ctx->expr(); auto info = getChildColumnInfo(ctx->Identifier(), ctx->JSONIdentifier()); TRY_WITH_EXCEPTION(info != nullptr); TRY_WITH_EXCEPTION(checkDirectComparisonBinaryField(info)); auto lower = std::any_cast(expr[0]->accept(this)); auto upper = std::any_cast(expr[1]->accept(this)); if (info->data_type() == proto::schema::DataType::Int8 || info->data_type() == proto::schema::DataType::Int16 || info->data_type() == proto::schema::DataType::Int32 || info->data_type() == proto::schema::DataType::Int64 || info->data_type() == proto::schema::DataType::Float || info->data_type() == proto::schema::DataType::Double || info->data_type() == proto::schema::DataType::Bool || info->data_type() == proto::schema::DataType::String || info->data_type() == proto::schema::DataType::VarChar) { auto a = extractValue(lower.expr); auto b = extractValue(upper.expr); if (a.has_value() && b.has_value()) { bool lowerinclusive = ctx->op1->getType() == PlanParser::LE; bool upperinclusive = ctx->op2->getType() == PlanParser::LE; auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto binary_range_expr = google::protobuf::Arena::CreateMessage< proto::plan::BinaryRangeExpr>(this->arena.get()); auto lower_value = google::protobuf::Arena::CreateMessage< proto::plan::GenericValue>(this->arena.get()); auto upper_value = google::protobuf::Arena::CreateMessage< proto::plan::GenericValue>(this->arena.get()); if (a.type() == typeid(int8_t)) lower_value->set_int64_val( int64_t(std::any_cast(a))); if (a.type() == typeid(int16_t)) lower_value->set_int64_val( int64_t(std::any_cast(a))); if (a.type() == typeid(int32_t)) lower_value->set_int64_val( int64_t(std::any_cast(a))); if (a.type() == typeid(int64_t)) lower_value->set_int64_val(std::any_cast(a)); if (a.type() == typeid(double)) lower_value->set_float_val(std::any_cast(a)); if (a.type() == typeid(float)) lower_value->set_float_val(double(std::any_cast(a))); if (a.type() == typeid(std::string)) lower_value->set_string_val(std::any_cast(a)); if (a.type() == typeid(bool)) lower_value->set_bool_val(std::any_cast(a)); if (b.type() == typeid(int8_t)) upper_value->set_int64_val( int64_t(std::any_cast(b))); if (b.type() == typeid(int16_t)) upper_value->set_int64_val( int64_t(std::any_cast(b))); if (b.type() == typeid(int32_t)) upper_value->set_int64_val( int64_t(std::any_cast(b))); if (b.type() == typeid(int64_t)) upper_value->set_int64_val( int64_t(std::any_cast(b))); if (b.type() == typeid(double)) upper_value->set_float_val(std::any_cast(b)); if (b.type() == typeid(float)) upper_value->set_float_val(double(std::any_cast(b))); if (b.type() == typeid(std::string)) upper_value->set_string_val(std::any_cast(b)); if (b.type() == typeid(bool)) upper_value->set_bool_val(std::any_cast(b)); binary_range_expr->set_lower_inclusive(lowerinclusive); binary_range_expr->set_upper_inclusive(upperinclusive); binary_range_expr->unsafe_arena_set_allocated_column_info(info); binary_range_expr->unsafe_arena_set_allocated_lower_value( lower_value); binary_range_expr->unsafe_arena_set_allocated_upper_value( upper_value); expr->set_allocated_binary_range_expr(binary_range_expr); return ExprWithDtype( expr, proto::schema::DataType::Bool, false); } } return nullptr; } virtual std::any visitUnary(PlanParser::UnaryContext* ctx) override { auto expr_with_dtype = std::any_cast(ctx->expr()->accept(this)); auto value = extractValue(expr_with_dtype.expr); if (value.has_value()) { #define PROCESS_UNARY(dtype, schema_dtype) \ if (value.type() == typeid(dtype)) { \ switch (ctx->op->getType()) { \ case PlanParser::ADD: \ return expr_with_dtype; \ case PlanParser::SUB: \ return ExprWithDtype( \ createValueExpr(-std::any_cast(value), \ this->arena.get()), \ schema_dtype, \ false); \ case PlanParser::NOT: \ return ExprWithDtype( \ createValueExpr(!std::any_cast(value), \ this->arena.get()), \ proto::schema::DataType::Bool, \ false); \ default: \ TRY_WITH_EXCEPTION(false); \ } \ } PROCESS_UNARY(double, proto::schema::DataType::Float); PROCESS_UNARY(float, proto::schema::DataType::Float); PROCESS_UNARY(int8_t, proto::schema::DataType::Int64); PROCESS_UNARY(int32_t, proto::schema::DataType::Int64); PROCESS_UNARY(int64_t, proto::schema::DataType::Int64); PROCESS_UNARY(bool, proto::schema::DataType::Bool); } TRY_WITH_EXCEPTION(checkDirectComparisonBinaryField( CreateMessageWithCopy( this->arena.get(), expr_with_dtype.expr->column_expr().info()))); switch (ctx->op->getType()) { case PlanParser::ADD: return expr_with_dtype.expr; case PlanParser::NOT: TRY_WITH_EXCEPTION(!expr_with_dtype.dependent && expr_with_dtype.dtype == proto::schema::DataType::Bool); auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto unary_expr = google::protobuf::Arena::CreateMessage< proto::plan::UnaryExpr>(this->arena.get()); unary_expr->unsafe_arena_set_allocated_child( expr_with_dtype.expr); unary_expr->set_op(proto::plan::UnaryExpr_UnaryOp_Not); return ExprWithDtype(expr, proto::schema::Bool, false); } return nullptr; } virtual std::any visitArray(PlanParser::ArrayContext* ctx) override { auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto array_expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto dtype = proto::schema::DataType::None; auto is_same = true; auto expr_ret = ctx->expr(); for (auto&& elem : expr_ret) { auto expr_ = std::any_cast(elem->accept(this)).expr; auto v = array_expr->add_array(); auto value = extractValue(expr_); if (value.has_value()) { if (value.type() == typeid(int8_t)) { v->set_int64_val(int64_t(std::any_cast(value))); if (dtype != proto::schema::DataType::None && dtype != proto::schema::DataType::Int8) { is_same = false; } if (dtype == proto::schema::DataType::None) { dtype = proto::schema::DataType::Int8; } continue; } if (value.type() == typeid(int16_t)) { v->set_int64_val(int64_t(std::any_cast(value))); if (dtype != proto::schema::DataType::None && dtype != proto::schema::DataType::Int16) { is_same = false; } if (dtype == proto::schema::DataType::None) { dtype = proto::schema::DataType::Int16; } continue; } if (value.type() == typeid(int32_t)) { v->set_int64_val(int64_t(std::any_cast(value))); if (dtype != proto::schema::DataType::None && dtype != proto::schema::DataType::Int32) { is_same = false; } if (dtype == proto::schema::DataType::None) { dtype = proto::schema::DataType::Int32; } continue; } if (value.type() == typeid(int64_t)) { v->set_int64_val(std::any_cast(value)); if (dtype != proto::schema::DataType::None && dtype != proto::schema::DataType::Int64) { is_same = false; } if (dtype == proto::schema::DataType::None) { dtype = proto::schema::DataType::Int64; } continue; } if (value.type() == typeid(double)) { v->set_float_val(std::any_cast(value)); if (dtype != proto::schema::DataType::None && dtype != proto::schema::DataType::Double) { is_same = false; } if (dtype == proto::schema::DataType::None) { dtype = proto::schema::DataType::Double; } continue; } if (value.type() == typeid(float)) { v->set_float_val(std::any_cast(value)); if (dtype != proto::schema::DataType::None && dtype != proto::schema::DataType::Float) { is_same = false; } if (dtype == proto::schema::DataType::None) { dtype = proto::schema::DataType::Float; } continue; } if (value.type() == typeid(std::string)) { v->set_string_val(std::any_cast(value)); if (dtype != proto::schema::DataType::None && dtype != proto::schema::DataType::VarChar) { is_same = false; } if (dtype == proto::schema::DataType::None) { dtype = proto::schema::DataType::VarChar; } continue; } } } auto generic_value = google::protobuf::Arena::CreateMessage( this->arena.get()); generic_value->unsafe_arena_set_allocated_array_val(array_expr); auto value_expr = google::protobuf::Arena::CreateMessage( this->arena.get()); value_expr->unsafe_arena_set_allocated_value(generic_value); expr->unsafe_arena_set_allocated_value_expr(value_expr); return ExprWithDtype( expr, is_same ? dtype : proto::schema::DataType::None, true); } virtual std::any visitJSONContainsAny(PlanParser::JSONContainsAnyContext* ctx) override { auto expr_ret = ctx->expr(); auto field = std::any_cast(expr_ret[0]->accept(this)); auto info = field.expr->column_expr().info(); TRY_WITH_EXCEPTION(info.data_type() == proto::schema::DataType::Array || info.data_type() == proto::schema::DataType::JSON); auto elem = std::any_cast(expr_ret[1]->accept(this)); TRY_WITH_EXCEPTION(elem.expr->value_expr().has_value() && elem.expr->value_expr().value().has_array_val()); if (info.data_type() == proto::schema::DataType::Array) { auto arr = elem.expr->value_expr().value().array_val(); for (int idx = 0; idx < arr.array_size(); idx++) { proto::plan::GenericValue expr = arr.array(idx); TRY_WITH_EXCEPTION(canBeCompared( field, toValueExpr(&expr, this->arena.get()))); } } auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto json_contain_expr = google::protobuf::Arena::CreateMessage< proto::plan::JSONContainsExpr>(this->arena.get()); auto arr = elem.expr->value_expr().value().array_val(); for (int idx = 0; idx < arr.array_size(); idx++) { proto::plan::GenericValue expr = arr.array(idx); auto val = json_contain_expr->add_elements(); if (expr.has_bool_val()) val->set_bool_val(expr.bool_val()); if (expr.has_string_val()) val->set_string_val(expr.string_val()); if (expr.has_float_val()) val->set_float_val(expr.float_val()); if (expr.has_int64_val()) val->set_int64_val(expr.int64_val()); } json_contain_expr->set_elements_same_type( elem.expr->value_expr().value().array_val().same_type()); json_contain_expr->unsafe_arena_set_allocated_column_info( CreateMessageWithCopy(this->arena.get(), info)); json_contain_expr->set_op( proto::plan::JSONContainsExpr_JSONOp_ContainsAny); expr->unsafe_arena_set_allocated_json_contains_expr(json_contain_expr); return ExprWithDtype(expr, proto::schema::Bool, false); } virtual std::any visitExists(PlanParser::ExistsContext* ctx) override { auto a = std::any_cast(ctx->expr()); auto info = a.expr->column_expr().info(); TRY_WITH_EXCEPTION(info.data_type() == proto::schema::DataType::Array); auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto col_expr = google::protobuf::Arena::CreateMessage( this->arena.get()); col_expr->unsafe_arena_set_allocated_info( CreateMessageWithCopy(this->arena.get(), info)); expr->unsafe_arena_set_allocated_column_expr(col_expr); return ExprWithDtype(expr, proto::schema::DataType::Bool, false); } virtual std::any visitEmptyTerm(PlanParser::EmptyTermContext* ctx) override { auto first = std::any_cast(ctx->expr()->accept(this)); auto info = first.expr->column_expr().info(); auto expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto col_expr = google::protobuf::Arena::CreateMessage( this->arena.get()); auto term_expr = google::protobuf::Arena::CreateMessage( this->arena.get()); expr->unsafe_arena_set_allocated_term_expr(term_expr); col_expr->unsafe_arena_set_allocated_info( CreateMessageWithCopy(this->arena.get(), info)); expr->unsafe_arena_set_allocated_column_expr(col_expr); expr->unsafe_arena_set_allocated_term_expr(term_expr); return ExprWithDtype(expr, proto::schema::DataType::Bool, false); } PlanCCVisitor(SchemaHelper* const helper) : helper(helper), arena(std::make_shared()) { } private: SchemaHelper* helper; std::shared_ptr arena; }; std::string ParserToMessage(milvus::proto::schema::CollectionSchema& schema, const std::string& exprstr); std::shared_ptr ParseIdentifier(milvus::local::SchemaHelper helper, const std::string& identifier); } // namespace milvus::local ================================================ FILE: src/parser/utils.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include #include "antlr/PlanBaseVisitor.h" #include "antlr/PlanLexer.h" #include "antlr/PlanParser.h" #include "pb/plan.pb.h" namespace milvus::local { class Exception : public std::exception { public: explicit Exception(const std::string& msg) : msg_(msg) { } const char* what() const noexcept override { return msg_.c_str(); } private: std::string msg_; }; #define TRY_WITH_EXCEPTION(call) \ do { \ if (!(call)) { \ throw Exception(#call); \ } \ } while (0) template inline T* CreateMessageWithCopy(google::protobuf::Arena* arena, const T& val) { T* ret = google::protobuf::Arena::CreateMessage(arena); ret->CopyFrom(val); return ret; } struct ExprWithDtype { proto::plan::Expr* expr; proto::schema::DataType dtype; bool dependent; ExprWithDtype(proto::plan::Expr* const expr, proto::schema::DataType dtype, bool dependent) : expr(expr), dtype(dtype), dependent(dependent) { } }; inline std::any extractValue(proto::plan::Expr* expr) { if (!expr->has_value_expr()) return nullptr; if (!expr->value_expr().has_value()) return nullptr; if (expr->value_expr().value().has_bool_val()) return expr->value_expr().value().bool_val(); if (expr->value_expr().value().has_float_val()) return expr->value_expr().value().float_val(); if (expr->value_expr().value().has_string_val()) return expr->value_expr().value().string_val(); if (expr->value_expr().value().has_int64_val()) return expr->value_expr().value().int64_val(); return nullptr; } template inline proto::plan::Expr* createValueExpr(const T val, google::protobuf::Arena* arena = nullptr) { auto expr = google::protobuf::Arena::CreateMessage(arena); auto val_expr = google::protobuf::Arena::CreateMessage(arena); auto value = google::protobuf::Arena::CreateMessage( arena); if constexpr (std::is_same_v) value->set_int64_val(val); else if constexpr (std::is_same_v) value->set_int64_val(int64_t(val)); else if constexpr (std::is_same_v) value->set_int64_val(int64_t(val)); else if constexpr (std::is_same_v) value->set_int64_val(int16_t(val)); else if constexpr (std::is_same_v) value->set_string_val(val); else if constexpr (std::is_same_v || std::is_same_v) value->set_float_val(val); else if constexpr (std::is_same_v) value->set_bool_val(val); else TRY_WITH_EXCEPTION(false); val_expr->unsafe_arena_set_allocated_value(value); expr->unsafe_arena_set_allocated_value_expr(val_expr); return expr; } inline std::vector tokenize(std::string s, std::string del = " ") { std::vector results; int start, end = -1 * del.size(); do { start = end + del.size(); end = s.find(del, start); results.push_back(s.substr(start, end - start)); } while (end != -1); return results; } template inline proto::plan::Expr* createBinExpr(proto::plan::Expr* left, proto::plan::Expr* right, google::protobuf::Arena* arena = nullptr) { auto expr = google::protobuf::Arena::CreateMessage(arena); auto bin_expr = google::protobuf::Arena::CreateMessage(arena); bin_expr->set_op(T); bin_expr->unsafe_arena_set_allocated_left(left); bin_expr->unsafe_arena_set_allocated_right(right); expr->unsafe_arena_set_allocated_binary_expr(bin_expr); return expr; } template inline proto::plan::Expr* createBinArithExpr(proto::plan::Expr* left, proto::plan::Expr* right, google::protobuf::Arena* arena = nullptr) { auto expr = google::protobuf::Arena::CreateMessage(arena); auto bin_expr = google::protobuf::Arena::CreateMessage( arena); bin_expr->set_op(T); bin_expr->unsafe_arena_set_allocated_left(left); bin_expr->unsafe_arena_set_allocated_right(right); expr->unsafe_arena_set_allocated_binary_arith_expr(bin_expr); return expr; } inline bool arithmeticDtype(proto::schema::DataType type) { switch (type) { case proto::schema::DataType::Float: return true; case proto::schema::DataType::Double: return true; case proto::schema::DataType::Int8: return true; case proto::schema::DataType::Int16: return true; case proto::schema::DataType::Int32: return true; case proto::schema::DataType::Int64: return true; default: return false; } } inline proto::schema::DataType getArrayElementType(proto::plan::Expr* expr) { if (expr->has_column_expr()) { return expr->column_expr().info().element_type(); } if (expr->has_value_expr() && expr->value_expr().has_value() && expr->value_expr().value().has_array_val()) { return expr->value_expr().value().array_val().element_type(); } return proto::schema::DataType::None; } inline bool canArithmeticDtype(proto::schema::DataType left_type, proto::schema::DataType right_type) { if (left_type == proto::schema::DataType::JSON && right_type == proto::schema::DataType::JSON) return false; if (left_type == proto::schema::DataType::JSON && arithmeticDtype(right_type)) return true; if (arithmeticDtype(left_type) && right_type == proto::schema::DataType::JSON) return true; if (arithmeticDtype(left_type) && arithmeticDtype(right_type)) return true; return false; } inline proto::schema::DataType calDataType(ExprWithDtype* a, ExprWithDtype* b) { auto a_dtype = a->dtype; auto b_dtype = b->dtype; if (a->dtype == proto::schema::DataType::Array) { a_dtype = getArrayElementType(a->expr); } if (b->dtype == proto::schema::DataType::Array) { b_dtype = getArrayElementType(b->expr); } if (a_dtype == proto::schema::DataType::JSON) { if (b_dtype == proto::schema::DataType::Float || b_dtype == proto::schema::DataType::Double) return proto::schema::DataType::Float; if (b_dtype == proto::schema::DataType::Int8 || b_dtype == proto::schema::DataType::Int16 || b_dtype == proto::schema::DataType::Int32 || b_dtype == proto::schema::DataType::Int64) return proto::schema::DataType::Int64; if (b_dtype == proto::schema::DataType::JSON) return proto::schema::DataType::JSON; } if (a_dtype == proto::schema::DataType::Float || a_dtype == proto::schema::DataType::Double) { if (b_dtype == proto::schema::DataType::JSON) return proto::schema::DataType::Double; if (arithmeticDtype(b_dtype)) return proto::schema::DataType::Double; } if (a_dtype == proto::schema::DataType::Int8 || a_dtype == proto::schema::DataType::Int16 || a_dtype == proto::schema::DataType::Int32 || a_dtype == proto::schema::DataType::Int64) { if (b_dtype == proto::schema::DataType::Float || b_dtype == proto::schema::DataType::Double) return proto::schema::DataType::Double; if (b_dtype == proto::schema::DataType::Int8 || b_dtype == proto::schema::DataType::Int16 || b_dtype == proto::schema::DataType::Int32 || b_dtype == proto::schema::DataType::Int64 || b_dtype == proto::schema::DataType::JSON) return proto::schema::DataType::Int64; } TRY_WITH_EXCEPTION(false); } struct SchemaHelper { SchemaHelper() = default; proto::schema::CollectionSchema* schema = nullptr; std::map name_offset; std::map id_offset; int primary_key_offset = -1; int partition_key_offset = -1; const proto::schema::FieldSchema& GetPrimaryKeyField() { TRY_WITH_EXCEPTION(primary_key_offset != -1); return schema->fields(primary_key_offset); } const proto::schema::FieldSchema& GetPartitionKeyField() { TRY_WITH_EXCEPTION(partition_key_offset != -1); return schema->fields(partition_key_offset); } const proto::schema::FieldSchema& GetFieldFromName(const std::string& name) { auto it = name_offset.find(name); TRY_WITH_EXCEPTION(it != name_offset.end()); return schema->fields(it->second); } const proto::schema::FieldSchema& GetFieldFromNameDefaultJSON(const std::string& name) { auto it = name_offset.find(name); if (it == name_offset.end()) { return GetDefaultJSONField(); } return schema->fields(it->second); } const proto::schema::FieldSchema& GetDefaultJSONField() { for (int i = 0; i < schema->fields_size(); ++i) { auto& field = schema->fields(i); if (field.data_type() == proto::schema::DataType::JSON && field.is_dynamic()) return field; } TRY_WITH_EXCEPTION(false); } const proto::schema::FieldSchema& GetFieldFromID(int64_t id) { auto it = id_offset.find(id); TRY_WITH_EXCEPTION(it != id_offset.end()); return schema->fields(it->second); } int GetVectorDimFromID(int64_t id) { auto& field = GetFieldFromID(id); if (field.data_type() != proto::schema::DataType::FloatVector && field.data_type() != proto::schema::DataType::Float16Vector && field.data_type() != proto::schema::DataType::BinaryVector && field.data_type() != proto::schema::DataType::BFloat16Vector) { TRY_WITH_EXCEPTION(false); } for (int i = 0; i < field.type_params_size(); ++i) { if (field.type_params(i).key() == "dim") return std::stoi( field.type_params(i).value().c_str(), NULL, 10); } TRY_WITH_EXCEPTION(false); } }; inline SchemaHelper CreateSchemaHelper(proto::schema::CollectionSchema* schema) { TRY_WITH_EXCEPTION(schema); SchemaHelper schema_helper; schema_helper.schema = schema; for (int i = 0; i < schema->fields_size(); ++i) { auto field = schema->fields(i); auto it = schema_helper.name_offset.find(field.name()); if (it != schema_helper.name_offset.end()) TRY_WITH_EXCEPTION(false); schema_helper.name_offset[field.name()] = i; schema_helper.id_offset[field.fieldid()] = i; if (field.is_primary_key()) { TRY_WITH_EXCEPTION(schema_helper.primary_key_offset == -1); schema_helper.primary_key_offset = i; } if (field.is_partition_key()) { TRY_WITH_EXCEPTION(schema_helper.primary_key_offset == -1); schema_helper.partition_key_offset = i; } } return schema_helper; } inline std::string convertEscapeSingle(const std::string& in) { std::vector need_replace_index; size_t escape_ch_count = 0; size_t in_string_lenth = in.length(); for (size_t i = 1; i < in_string_lenth - 1; ++i) { if (in[i] == '\\') { escape_ch_count++; continue; } if (in[i] == '"' && escape_ch_count % 2 == 0) { need_replace_index.push_back(i); } if (in[i] == '\'' && escape_ch_count % 2 != 0) { need_replace_index.push_back(i); } escape_ch_count = 0; } std::string in_; in_ += '"'; size_t start = 1; for (auto end : need_replace_index) { if (in[end] == '"') { in_ += in.substr(start, end - start); in_ += "\\\""; } else { in_ += in.substr(start, end - start - 1); in_ += '\''; } start = end + 1; } in_ += in.substr(start, in.length() - start - 1); in_ += '"'; std::stringstream ss; ss << in_; std::string out; ss >> std::quoted(out); return out; } inline bool hasWildcards(std::string pattern) { int64_t l = pattern.length(); int64_t i = l - 1; for (; i >= 0; i--) { if (pattern[i] == '%' || pattern[i] == '_') { if (i > 0 && pattern[i - 1] == '\\') { i--; continue; } return true; } } return false; } inline int findLastNotOfWildcards(std::string pattern) { int loc = pattern.length() - 1; for (; loc >= 0; loc--) { if (pattern[loc] == '%' || pattern[loc] == '_') { if (loc > 0 && pattern[loc - 1] == '\\') { break; } } else { break; } } return loc; } inline std::pair translatePatternMatch(const std::string& pattern) { size_t l = pattern.length(); size_t loc = findLastNotOfWildcards(pattern); if (loc < 0) { return std::make_pair(proto::plan::OpType::PrefixMatch, ""); } bool exist = hasWildcards(pattern.substr(0, loc + 1)); if (loc >= l - 1 && !exist) { return std::make_pair(proto::plan::OpType::Equal, pattern); } if (!exist) { return std::make_pair(proto::plan::OpType::PrefixMatch, pattern.substr(0, loc + 1)); } return std::make_pair(proto::plan::OpType::Match, pattern); } inline bool canBeComparedDataType(proto::schema::DataType a, proto::schema::DataType b) { switch (a) { case proto::schema::DataType::Bool: return (b == proto::schema::DataType::Bool) || (b == proto::schema::DataType::JSON); case proto::schema::DataType::Int8: return arithmeticDtype(b) || (b == proto::schema::DataType::JSON); case proto::schema::DataType::Int16: return arithmeticDtype(b) || (b == proto::schema::DataType::JSON); case proto::schema::DataType::Int32: return arithmeticDtype(b) || (b == proto::schema::DataType::JSON); case proto::schema::DataType::Int64: return arithmeticDtype(b) || (b == proto::schema::DataType::JSON); case proto::schema::DataType::Float: return arithmeticDtype(b) || (b == proto::schema::DataType::JSON); case proto::schema::DataType::Double: return arithmeticDtype(b) || (b == proto::schema::DataType::JSON); case proto::schema::DataType::VarChar: return b == proto::schema::DataType::String || b == proto::schema::DataType::VarChar || b == proto::schema::DataType::JSON; case proto::schema::DataType::String: return b == proto::schema::DataType::String || b == proto::schema::DataType::VarChar || b == proto::schema::DataType::JSON; case proto::schema::DataType::JSON: return true; default: return false; } } inline bool canBeCompared(ExprWithDtype a, ExprWithDtype b) { if (a.dtype != proto::schema::DataType::Array && b.dtype != proto::schema::DataType::Array) { return canBeComparedDataType(a.dtype, b.dtype); } if (a.dtype == proto::schema::DataType::Array && b.dtype == proto::schema::DataType::Array) { return canBeComparedDataType(getArrayElementType(a.expr), getArrayElementType(b.expr)); } if (a.dtype == proto::schema::DataType::Array) { return canBeComparedDataType(getArrayElementType(a.expr), b.dtype); } return canBeComparedDataType(b.dtype, getArrayElementType(b.expr)); } inline ExprWithDtype toValueExpr(proto::plan::GenericValue* value, google::protobuf::Arena* arena = nullptr) { auto expr = google::protobuf::Arena::CreateMessage(arena); auto value_expr = google::protobuf::Arena::CreateMessage(arena); value_expr->unsafe_arena_set_allocated_value(value); expr->unsafe_arena_set_allocated_value_expr(value_expr); if (value->has_bool_val()) { return ExprWithDtype(expr, proto::schema::DataType::Bool, false); } if (value->has_int64_val()) { return ExprWithDtype(expr, proto::schema::DataType::Int64, false); } if (value->has_float_val()) { return ExprWithDtype(expr, proto::schema::DataType::Float, false); } if (value->has_string_val()) { return ExprWithDtype(expr, proto::schema::DataType::VarChar, false); } if (value->has_array_val()) { return ExprWithDtype(expr, proto::schema::DataType::Array, false); } TRY_WITH_EXCEPTION(false); } inline proto::plan::GenericValue* castValue(proto::schema::DataType dtype, proto::plan::GenericValue* value, google::protobuf::Arena* arena = nullptr) { if (dtype == proto::schema::DataType::JSON) return CreateMessageWithCopy(arena, *value); if (dtype == proto::schema::DataType::Array && value->has_array_val()) return CreateMessageWithCopy(arena, *value); if ((dtype == proto::schema::DataType::VarChar || dtype == proto::schema::DataType::String) && value->has_string_val()) return CreateMessageWithCopy(arena, *value); if (dtype == proto::schema::DataType::Bool && value->has_bool_val()) return CreateMessageWithCopy(arena, *value); if (dtype == proto::schema::DataType::Float || dtype == proto::schema::DataType::Double) { if (value->has_float_val()) return CreateMessageWithCopy(arena, *value); ; if (value->has_int64_val()) { auto value_tmp = google::protobuf::Arena::CreateMessage< proto::plan::GenericValue>(arena); value_tmp->set_float_val(double(value->int64_val())); return value_tmp; } } if (dtype == proto::schema::DataType::Int8 || dtype == proto::schema::DataType::Int16 || dtype == proto::schema::DataType::Int32 || dtype == proto::schema::DataType::Int64) { if (value->has_int64_val()) return CreateMessageWithCopy(arena, *value); } TRY_WITH_EXCEPTION(false); } inline proto::plan::Expr* combineArrayLengthExpr(proto::plan::OpType op, proto::plan::ArithOpType arith_op, const proto::plan::ColumnInfo& info, const proto::plan::GenericValue& value, google::protobuf::Arena* arena = nullptr) { auto expr = google::protobuf::Arena::CreateMessage(arena); auto range_expr = google::protobuf::Arena::CreateMessage< proto::plan::BinaryArithOpEvalRangeExpr>(arena); expr->unsafe_arena_set_allocated_binary_arith_op_eval_range_expr( range_expr); range_expr->set_op(op); range_expr->set_arith_op(arith_op); range_expr->unsafe_arena_set_allocated_value( CreateMessageWithCopy(arena, value)); range_expr->unsafe_arena_set_allocated_column_info( CreateMessageWithCopy(arena, info)); return expr; } inline proto::plan::Expr* combineBinaryArithExpr(proto::plan::OpType op, proto::plan::ArithOpType arith_op, const proto::plan::ColumnInfo& info, const proto::plan::GenericValue& operand, const proto::plan::GenericValue& value, google::protobuf::Arena* arena = nullptr) { auto data_type = info.data_type(); if (data_type != proto::schema::DataType::Array && info.nested_path_size() != 0) { data_type = info.element_type(); } auto casted_value = castValue( data_type, CreateMessageWithCopy(arena, operand)); auto expr = google::protobuf::Arena::CreateMessage(arena); auto range_expr = google::protobuf::Arena::CreateMessage< proto::plan::BinaryArithOpEvalRangeExpr>(arena); expr->unsafe_arena_set_allocated_binary_arith_op_eval_range_expr( range_expr); range_expr->unsafe_arena_set_allocated_column_info( CreateMessageWithCopy(arena, info) ); range_expr->set_arith_op(arith_op); range_expr->unsafe_arena_set_allocated_right_operand(casted_value); range_expr->unsafe_arena_set_allocated_value( CreateMessageWithCopy(arena, value)); range_expr->set_op(op); return expr; } inline proto::plan::Expr* handleBinaryArithExpr(proto::plan::OpType op, proto::plan::BinaryArithExpr* arith_expr, proto::plan::ValueExpr* value_expr, google::protobuf::Arena* arena = nullptr) { switch (op) { case proto::plan::OpType::Equal: break; case proto::plan::OpType::NotEqual: break; default: TRY_WITH_EXCEPTION(false); } auto left_expr = arith_expr->left().column_expr(); auto left_value = arith_expr->left().value_expr(); auto right_expr = arith_expr->right().column_expr(); auto right_value = arith_expr->right().value_expr(); auto arith_op = arith_expr->op(); if (arith_op == proto::plan::ArithOpType::ArrayLength) { return combineArrayLengthExpr( op, arith_op, left_expr.info(), value_expr->value(), arena); } if (arith_expr->left().has_column_expr() && arith_expr->right().has_column_expr()) { TRY_WITH_EXCEPTION(false); } if (arith_expr->left().has_value_expr() && arith_expr->right().has_value_expr()) { TRY_WITH_EXCEPTION(false); } if (arith_expr->left().has_column_expr() && arith_expr->right().has_value_expr()) { return combineBinaryArithExpr(op, arith_op, left_expr.info(), right_value.value(), value_expr->value(), arena); } if (arith_expr->right().has_column_expr() && arith_expr->left().has_value_expr()) { switch (arith_expr->op()) { case proto::plan::ArithOpType::Add: return combineBinaryArithExpr(op, arith_op, right_expr.info(), left_value.value(), value_expr->value(), arena); case proto::plan::ArithOpType::Mul: return combineBinaryArithExpr(op, arith_op, right_expr.info(), left_value.value(), value_expr->value(), arena); default: TRY_WITH_EXCEPTION(false); } } TRY_WITH_EXCEPTION(false); } inline proto::plan::Expr* handleCompareRightValue(proto::plan::OpType op, ExprWithDtype a, ExprWithDtype b, google::protobuf::Arena* arena = nullptr) { auto data_type = a.dtype; if (data_type == proto::schema::DataType::Array && a.expr->column_expr().info().nested_path_size() != 0) { data_type = a.expr->column_expr().info().element_type(); } auto value = b.expr->value_expr().value(); auto castedvalue = castValue(data_type, &value, arena); if (a.expr->has_binary_arith_expr()) { auto value_expr = google::protobuf::Arena::CreateMessage( arena); value_expr->unsafe_arena_set_allocated_value(castedvalue); return handleBinaryArithExpr( op, CreateMessageWithCopy( arena, a.expr->binary_arith_expr()), value_expr, arena); } TRY_WITH_EXCEPTION(a.expr->has_column_expr()); auto info = a.expr->column_expr().info(); auto expr = google::protobuf::Arena::CreateMessage(arena); auto unary_range_expr = google::protobuf::Arena::CreateMessage( arena); unary_range_expr->set_op(op); unary_range_expr->unsafe_arena_set_allocated_column_info( CreateMessageWithCopy(arena, info)); unary_range_expr->unsafe_arena_set_allocated_value(castedvalue); expr->unsafe_arena_set_allocated_unary_range_expr(unary_range_expr); return expr; } inline proto::plan::Expr* HandleCompare(proto::plan::OpType op, ExprWithDtype a, ExprWithDtype b, google::protobuf::Arena* arena = nullptr) { TRY_WITH_EXCEPTION(a.expr->has_column_expr() && b.expr->has_column_expr()); auto a_info = a.expr->column_expr().info(); auto b_info = b.expr->column_expr().info(); auto expr = google::protobuf::Arena::CreateMessage(arena); auto compare_expr = google::protobuf::Arena::CreateMessage(arena); compare_expr->unsafe_arena_set_allocated_left_column_info( CreateMessageWithCopy(arena, a_info)); compare_expr->unsafe_arena_set_allocated_right_column_info( CreateMessageWithCopy(arena, b_info)); compare_expr->set_op(op); expr->unsafe_arena_set_allocated_compare_expr(compare_expr); return expr; } inline proto::plan::OpType reverseOrder(proto::plan::OpType op) { switch (op) { case proto::plan::OpType::LessThan: return proto::plan::OpType::GreaterThan; case proto::plan::OpType::LessEqual: return proto::plan::OpType::GreaterEqual; case proto::plan::OpType::GreaterThan: return proto::plan::OpType::LessThan; case proto::plan::OpType::GreaterEqual: return proto::plan::OpType::LessEqual; case proto::plan::OpType::Equal: return proto::plan::OpType::NotEqual; case proto::plan::OpType::NotEqual: return proto::plan::OpType::Equal; default: return proto::plan::OpType::Invalid; } } inline proto::plan::Expr* HandleCompare(int op, ExprWithDtype a, ExprWithDtype b, google::protobuf::Arena* arena = nullptr) { TRY_WITH_EXCEPTION(canBeCompared(a, b)); std::map cmpOpMap{ {PlanParser::LT, proto::plan::OpType::LessThan}, {PlanParser::LE, proto::plan::OpType::LessEqual}, {PlanParser::GT, proto::plan::OpType::GreaterThan}, {PlanParser::GE, proto::plan::OpType::GreaterEqual}, {PlanParser::EQ, proto::plan::OpType::Equal}, {PlanParser::NE, proto::plan::OpType::NotEqual}}; auto cmpop = cmpOpMap[op]; if (a.expr->has_value_expr()) { auto op = reverseOrder(cmpop); return handleCompareRightValue(op, b, a, arena); } else if (b.expr->has_value_expr()) { return handleCompareRightValue(cmpop, a, b, arena); } return HandleCompare(cmpop, a, b, arena); } inline bool checkDirectComparisonBinaryField(proto::plan::ColumnInfo* info) { if (info->data_type() == proto::schema::DataType::Array && info->nested_path_size() == 0) { return false; } return true; } } // namespace milvus::local ================================================ FILE: src/query_task.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "query_task.h" #include #include #include #include "antlr4-runtime.h" #include "parser/parser.h" #include "parser/utils.h" #include "common.h" #include "pb/plan.pb.h" #include "schema.pb.h" #include "schema_util.h" #include "status.h" #include "string_util.hpp" #include "pb/segcore.pb.h" #include "log/Log.h" namespace milvus::local { QueryTask::QueryTask(const ::milvus::proto::milvus::QueryRequest* query_request, const ::milvus::proto::schema::CollectionSchema* schema) : query_request_(query_request), schema_(schema), limit_(-1), offset_(0), is_count_(false) { } QueryTask::~QueryTask() { } bool QueryTask::GetOutputFieldIds(std::vector* ids) { if (output_fields_.size() == 0) { for (const auto& field : schema_->fields()) { if (field.fieldid() >= kStartOfUserFieldId && !schema_util::IsVectorField(field.data_type())) { ids->push_back(field.fieldid()); } } } else { std::string pk; std::map name_ids; for (const auto& field : schema_->fields()) { name_ids[field.name()] = field.fieldid(); if (field.is_primary_key()) { pk = field.name(); ids->push_back(field.fieldid()); } } for (const auto& output_field : output_fields_) { if (output_field == pk) continue; auto it = name_ids.find(output_field); if (it == name_ids.end()) { LOG_ERROR("Can not find output field {} in schema", output_field); return false; } if (it->second >= kStartOfUserFieldId) { ids->push_back(it->second); } } } return true; } Status QueryTask::ParseQueryParams(::milvus::proto::plan::PlanNode* plan, bool expr_empty) { for (const auto& param : query_request_->query_params()) { if (param.key() == kLimitKey) { try { limit_ = std::stoll(param.value()); } catch (std::exception& e) { auto err = string_util::SFormat("Parse limit failed, limit: {}", param.value()); return Status::ParameterInvalid(err); } } else if (param.key() == kOffsetKey) { try { offset_ = std::stoll(param.value()); } catch (std::exception& e) { auto err = string_util::SFormat( "Parse offset failed, offset: {}", param.value()); return Status::ParameterInvalid(err); } } else if (param.key() == kReduceStopForBestKey) { // not used in local } } if (offset_ < 0 || offset_ > kTopkLimit) { return Status::ParameterInvalid( "Offset should be in range [0, {}], but got {}", kTopkLimit, offset_); } if (limit_ <= 0) { if (is_count_) { limit_ = -1; } else if (expr_empty) { return Status::ParameterInvalid( "empty expression should be used with limit"); } else { limit_ = kTopkLimit - offset_ - 1; } } // get and validate topk if (limit_ > kTopkLimit) { return Status::ParameterInvalid( "limit should be in range [1, {}], but got {}", kTopkLimit, limit_); } if ((limit_ + offset_) > kTopkLimit) { return Status::ParameterInvalid( "topk + offset should be in range [1, {}], but got {}", kTopkLimit, limit_ + offset_); } plan->mutable_query()->set_limit(limit_ + offset_); return Status::Ok(); } Status QueryTask::Process(::milvus::proto::plan::PlanNode* plan) { if (query_request_->output_fields_size() == 1 && string_util::Trim(string_util::ToLower( query_request_->output_fields().Get(0))) == kCountStr) { plan->mutable_query()->set_is_count(true); is_count_ = true; } CHECK_STATUS( ParseQueryParams(plan, string_util::Trim(query_request_->expr()) == ""), ""); CHECK_STATUS( schema_util::ParseExpr(string_util::Trim(query_request_->expr()), *schema_, plan->mutable_query()->mutable_predicates()), ""); if (is_count_) { user_output_fields_.push_back(kCountStr); } else { if (!schema_util::TranslateOutputFields(query_request_->output_fields(), *schema_, true, &output_fields_, &user_output_fields_)) { return Status::ParameterInvalid("Error output fields"); } std::vector output_ids; if (!GetOutputFieldIds(&output_ids)) { return Status::ParameterInvalid("Error output fields"); } for (auto id : output_ids) { plan->add_output_field_ids(id); } } return Status::Ok(); } bool QueryTask::PostProcess(const RetrieveResult& rt, ::milvus::proto::milvus::QueryResults* ret) { milvus::proto::segcore::RetrieveResults seg_ret; seg_ret.ParseFromArray(rt.retrieve_result_.proto_blob, rt.retrieve_result_.proto_size); if (is_count_) { auto count_data = ret->add_fields_data(); count_data->CopyFrom(seg_ret.fields_data(0)); count_data->set_field_name(kCountStr); ret->add_output_fields(kCountStr); return true; } // reduce data by id std::vector<::milvus::proto::schema::FieldData> reduced_fields; int64_t ret_size = 0; for (const auto& field_data : seg_ret.fields_data()) { ::milvus::proto::schema::FieldData data; if (!schema_util::ReduceFieldByIDs( seg_ret.ids(), field_data, &data, &ret_size)) { return false; } reduced_fields.push_back(data); } if (ret_size > offset_) { for (const auto& field_data : reduced_fields) { auto new_data = ret->add_fields_data(); new_data->set_field_id(field_data.field_id()); new_data->set_type(field_data.type()); new_data->set_field_name(field_data.field_name()); new_data->set_is_dynamic(field_data.is_dynamic()); auto limit = std::min(limit_, ret_size - offset_); schema_util::SliceFieldData( field_data, std::vector>{{offset_, limit}}, new_data); } } else { for (const auto& field_schema : schema_->fields()) { if (field_schema.fieldid() >= kStartOfUserFieldId) { schema_util::FillEmptyField(field_schema, ret->add_fields_data()); } } } FillInFieldInfo(ret); for (const auto& name : user_output_fields_) { ret->add_output_fields(name); } return true; } void QueryTask::FillInFieldInfo(::milvus::proto::milvus::QueryResults* result_data) { std::variant<::milvus::proto::schema::SearchResultData*, ::milvus::proto::milvus::QueryResults*> result_var; result_var = result_data; schema_util::FillInFieldInfo(output_fields_, *schema_, result_var); } } // namespace milvus::local ================================================ FILE: src/query_task.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include "pb/milvus.pb.h" #include "pb/plan.pb.h" #include #include #include "retrieve_result.h" #include "status.h" namespace milvus::local { class QueryTask : NonCopyableNonMovable { public: QueryTask(const ::milvus::proto::milvus::QueryRequest* query_request, const ::milvus::proto::schema::CollectionSchema*); virtual ~QueryTask(); Status Process(::milvus::proto::plan::PlanNode* plan); bool PostProcess(const RetrieveResult& rt, ::milvus::proto::milvus::QueryResults* ret); private: bool GetOutputFieldIds(std::vector* ids); void FilterSystemField(); void FillInFieldInfo(::milvus::proto::milvus::QueryResults* result_data); Status ParseQueryParams(::milvus::proto::plan::PlanNode* plan, bool expr_empty); private: const ::milvus::proto::milvus::QueryRequest* query_request_; const ::milvus::proto::schema::CollectionSchema* schema_; std::vector output_fields_; std::vector user_output_fields_; int64_t limit_; int64_t offset_; bool is_count_; }; } // namespace milvus::local ================================================ FILE: src/re_scorer.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "re_scorer.h" #include #include #include "nlohmann/json.hpp" #include "common.h" #include "log/Log.h" #include "status.h" #include "string_util.hpp" namespace milvus::local { const int kDefaultRRFParamsValue = 60; void RRFScorer::ReScore(::milvus::proto::milvus::SearchResults* search_results) { for (int i = 0; i < search_results->results().scores_size(); i++) { search_results->mutable_results()->set_scores(i, 1.0 / (k_ + (i + 1))); } } std::function WeightedScorer::GetActivateFunc() { auto metric_type = string_util::ToUpper(GetMetricType()); if (metric_type == kMetricsCosineName) { return [](float distance) -> float { return (1 + distance) * 0.5; }; } else if (metric_type == KMetricsIPName) { return [](float distance) -> float { return 0.5 + static_cast( std::atan(static_cast(distance))) / M_PI; }; } else { return [](float distance) -> float { return 1.0 - 2 * static_cast( std::atan(static_cast(distance))) / M_PI; }; } } void WeightedScorer::ReScore( ::milvus::proto::milvus::SearchResults* search_results) { auto activate_func = GetActivateFunc(); for (int i = 0; i < search_results->results().scores_size(); i++) { float distance = search_results->results().scores(i); search_results->mutable_results()->set_scores( i, weight_ * activate_func(distance)); } } Status NewReScorers(int req_cnt, const ::google::protobuf::RepeatedPtrField< ::milvus::proto::common::KeyValuePair>& rank_params, std::vector>* re_scorers) { if (req_cnt == 0) { return Status::Ok(); } std::string rank_type, param_str; for (const auto& pair : rank_params) { if (pair.key() == kRankTypeKey) { rank_type = string_util::Trim(pair.value()); } else if (pair.key() == kRankParamsKey) { param_str = pair.value(); } } if (rank_type.empty()) { LOG_INFO("rank strategy not specified, use rrf instead"); for (int i = 0; i < req_cnt; i++) { re_scorers->emplace_back( std::make_unique("rrf", kDefaultRRFParamsValue)); } } if (rank_type != kRRFRankTypeName && rank_type != kWeightedRankTypeName) { return Status::ParameterInvalid("unsupported rank type {}", rank_type); } if (param_str.empty()) { return Status::ParameterInvalid("{} not found in rank_params", kRankParamsKey); } try { nlohmann::json data = nlohmann::json::parse(param_str); if (rank_type == kRRFRankTypeName) { if (!data.contains(kRRFParamsKey)) { return Status::ParameterInvalid("{} not found in rank_params", kRRFParamsKey); } if (!data[kRRFParamsKey].is_number()) { return Status::ParameterInvalid( "The type of rank param k should be float"); } double k = data[kRRFParamsKey]; if (k <= 0 || k >= 16384) { return Status::ParameterInvalid( "The rank params k should be in range (0, 16384)"); } for (int i = 0; i < req_cnt; i++) { re_scorers->emplace_back( std::make_unique("rrf", float(k))); } } else if (rank_type == kWeightedRankTypeName) { if (!data.contains(kWeightsParamsKey)) { return Status::ParameterInvalid("{} not found in rank_params", kWeightsParamsKey); } std::vector weights; if (data[kWeightsParamsKey].is_array()) { for (const auto& weight : data[kWeightsParamsKey]) { if (weight.is_number()) { float w = weight; if (w < 0 || w > 1) { return Status::ParameterInvalid( "rank param weight should be in range[0, 1]"); } weights.push_back(w); } else { return Status::ParameterInvalid( "The type of rank param weight should be float"); } } } else { return Status::ParameterInvalid( "The weights param should be an array"); } if (req_cnt != weights.size()) { return Status::ParameterInvalid( "the length of weights param mismatch with ann search " "requests: invalid parameter[expected={}][actual={}]", req_cnt, weights.size()); } for (int i = 0; i < req_cnt; i++) { re_scorers->emplace_back( std::make_unique("rrf", weights[i])); } } else { return Status::ParameterInvalid("unsupported rank type {}", rank_type); } } catch (nlohmann::json::parse_error& e) { auto err = string_util::SFormat("Index params err: {}", e.what()); LOG_ERROR(err); return Status::ParameterInvalid(err); } return Status::Ok(); } } // namespace milvus::local ================================================ FILE: src/re_scorer.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include "common.h" #include "common.pb.h" #include "milvus.pb.h" #include "status.h" #include #include #include namespace milvus::local { using RankType = int; const RankType invalidRankType = 0; const RankType rrfRankType = 1; const RankType weightedRankType = 2; const RankType udfExprRankType = 3; const std::string kRRFRankTypeName("rrf"); const std::string kWeightedRankTypeName("weighted"); const std::string kRankTypeKey("strategy"); const std::string kRankParamsKey("params"); const std::string kRRFParamsKey("k"); const std::string kWeightsParamsKey("weights"); class ReScorer : NonCopyableNonMovable { public: ReScorer(const std::string& name) : name_(name) { } virtual ~ReScorer() = default; public: inline const std::string Name() { return name_; } virtual void ReScore(::milvus::proto::milvus::SearchResults*) = 0; virtual RankType ScorerType() = 0; inline void SetMetricType(const std::string& metric_type) { metric_type_ = metric_type; } inline const std::string GetMetricType() { return metric_type_; } private: std::string name_; std::string metric_type_; }; class RRFScorer : public ReScorer { public: RRFScorer(const std::string& name, float k) : ReScorer(name), k_(k) { } virtual ~RRFScorer() = default; public: RankType ScorerType() override { return rrfRankType; } void ReScore(::milvus::proto::milvus::SearchResults*) override; private: float k_; }; class WeightedScorer : public ReScorer { public: WeightedScorer(const std::string& name, float weight) : ReScorer(name), weight_(weight) { } virtual ~WeightedScorer() = default; public: RankType ScorerType() override { return weightedRankType; } void ReScore(::milvus::proto::milvus::SearchResults*) override; private: std::function GetActivateFunc(); private: float weight_; }; Status NewReScorers(int req_cnt, const ::google::protobuf::RepeatedPtrField< ::milvus::proto::common::KeyValuePair>& rank_params, std::vector>* re_scorers); } // namespace milvus::local ================================================ FILE: src/retrieve_result.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include "common.h" #include "segcore/segment_c.h" namespace milvus::local { class RetrieveResult final : NonCopyableNonMovable { public: RetrieveResult() { retrieve_result_.proto_blob = nullptr; retrieve_result_.proto_size = 0; } ~RetrieveResult() { if (retrieve_result_.proto_blob != nullptr) { delete[] static_cast( const_cast(retrieve_result_.proto_blob)); retrieve_result_.proto_blob = nullptr; retrieve_result_.proto_size = 0; } }; public: // milvus::proto::segcore::RetrieveResults CRetrieveResult retrieve_result_; }; } // namespace milvus::local ================================================ FILE: src/schema_util.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "schema_util.h" #include #include #include #include #include #include "common.h" #include "log/Log.h" #include "parser/utils.h" #include "parser/parser.h" namespace milvus::local { namespace schema_util { using DType = ::milvus::proto::schema::DataType; std::any GetField(const ::milvus::proto::schema::FieldData& field_data, uint32_t field_index) { if (field_data.type() == DType::FloatVector) { std::vector vec; int64_t dim = field_data.vectors().dim(); auto vd = field_data.vectors().float_vector(); for (int index = field_index * dim; index < (field_index + 1) * dim; index++) { vec.push_back(vd.data(index)); } return vec; } else if (field_data.type() == DType::BinaryVector) { int64_t dim = field_data.vectors().dim(); int64_t size = dim / 8; std::string v = field_data.vectors().binary_vector().substr( field_index * size, size); return v; } else if (field_data.type() == DType::Float16Vector) { int64_t dim = field_data.vectors().dim(); int64_t size = dim * 2; std::string v = field_data.vectors().float16_vector().substr( field_index * size, size); return v; } else if (field_data.type() == DType::BFloat16Vector) { int64_t dim = field_data.vectors().dim(); int64_t size = dim * 2; std::string v = field_data.vectors().bfloat16_vector().substr( field_index * size, size); return v; } else if (field_data.type() == DType::Bool) { return field_data.scalars().bool_data().data(field_index); } else if (field_data.type() == DType::Int8 || field_data.type() == DType::Int16 || field_data.type() == DType::Int32) { return field_data.scalars().int_data().data(field_index); } else if (field_data.type() == DType::Int64) { return field_data.scalars().long_data().data(field_index); } else if (field_data.type() == DType::Float) { return field_data.scalars().float_data().data(field_index); } else if (field_data.type() == DType::Double) { return field_data.scalars().double_data().data(field_index); } else if (field_data.type() == DType::String) { return field_data.scalars().string_data().data(field_index); } else if (field_data.type() == DType::VarChar) { return field_data.scalars().string_data().data(field_index); } else if (field_data.type() == DType::Array) { auto array_data = field_data.scalars().array_data(); ::milvus::proto::schema::ArrayArray new_array; new_array.set_element_type(array_data.element_type()); new_array.add_data()->CopyFrom(array_data.data(field_index)); return new_array; } else if (field_data.type() == DType::JSON) { return field_data.scalars().json_data().data(field_index); } else if (field_data.type() == DType::SparseFloatVector) { ::milvus::proto::schema::SparseFloatArray sp; sp.set_dim(field_data.vectors().sparse_float_vector().dim()); auto content = field_data.vectors().sparse_float_vector().contents(field_index); sp.add_contents(content); return sp; } else { LOG_ERROR("Unkown data type: {}", field_data.type()); return nullptr; } return nullptr; } bool IsVectorField(::milvus::proto::schema::DataType dtype) { return dtype == ::milvus::proto::schema::DataType::FloatVector || dtype == ::milvus::proto::schema::DataType::BinaryVector || dtype == ::milvus::proto::schema::DataType::Float16Vector || dtype == ::milvus::proto::schema::DataType::BFloat16Vector || dtype == ::milvus::proto::schema::DataType::SparseFloatVector; } bool IsSparseVectorType(::milvus::proto::schema::DataType dtype) { return dtype == ::milvus::proto::schema::DataType::SparseFloatVector; } bool FindDimFromFieldParams(const ::milvus::proto::schema::FieldSchema& field, std::string* dim) { for (const auto& param : field.type_params()) { if (param.key() == kDimKey) { dim->assign(param.value()); return true; } } for (const auto& param : field.index_params()) { if (param.key() == kDimKey) { dim->assign(param.value()); return true; } } return false; } int64_t GetDim(const ::milvus::proto::schema::FieldSchema& field) { if (!IsVectorField(field.data_type())) { LOG_ERROR("{} is not vector type", field.data_type()); return -1; } if (IsSparseVectorType(field.data_type())) { LOG_ERROR("GetDim should not invoke on sparse vector type"); return -1; } std::string dim_str; bool succ = FindDimFromFieldParams(field, &dim_str); if (!succ) { LOG_ERROR("Dim not found"); return -1; } try { return std::stoll(dim_str); } catch (const std::invalid_argument& e) { LOG_ERROR("invalid dimension: {}, {}", dim_str, e.what()); } return -1; } bool FillEmptyField(const ::milvus::proto::schema::FieldSchema& field_schema, ::milvus::proto::schema::FieldData* field_data) { field_data->set_field_name(field_schema.name()); field_data->set_type(field_schema.data_type()); field_data->set_field_id(field_schema.fieldid()); field_data->set_is_dynamic(field_schema.is_dynamic()); if (field_schema.data_type() == DType::FloatVector) { int64_t dim = GetDim(field_schema); if (dim < 0) { return false; } auto vec_field = field_data->mutable_vectors(); vec_field->set_dim(dim); vec_field->mutable_float_vector(); } else if (field_schema.data_type() == DType::BinaryVector) { int64_t dim = GetDim(field_schema); if (dim < 0) { return false; } auto vec_field = field_data->mutable_vectors(); vec_field->set_dim(dim); vec_field->mutable_binary_vector(); } else if (field_schema.data_type() == DType::Float16Vector) { int64_t dim = GetDim(field_schema); if (dim < 0) { return false; } auto vec_field = field_data->mutable_vectors(); vec_field->set_dim(dim); vec_field->mutable_float16_vector(); } else if (field_schema.data_type() == DType::BFloat16Vector) { int64_t dim = GetDim(field_schema); if (dim < 0) { return false; } auto vec_field = field_data->mutable_vectors(); vec_field->set_dim(dim); vec_field->mutable_bfloat16_vector(); } else if (field_schema.data_type() == DType::Bool) { field_data->mutable_scalars()->mutable_bool_data(); } else if (field_schema.data_type() == DType::Int8 || field_schema.data_type() == DType::Int16 || field_schema.data_type() == DType::Int32) { field_data->mutable_scalars()->mutable_int_data(); } else if (field_schema.data_type() == DType::Int64) { field_data->mutable_scalars()->mutable_long_data(); } else if (field_schema.data_type() == DType::Float) { field_data->mutable_scalars()->mutable_float_data(); } else if (field_schema.data_type() == DType::Double) { field_data->mutable_scalars()->mutable_double_data(); } else if (field_schema.data_type() == DType::String) { field_data->mutable_scalars()->mutable_string_data(); } else if (field_schema.data_type() == DType::VarChar) { field_data->mutable_scalars()->mutable_string_data(); } else if (field_schema.data_type() == DType::Array) { field_data->mutable_scalars()->mutable_array_data(); } else if (field_schema.data_type() == DType::JSON) { field_data->mutable_scalars()->mutable_json_data(); } else if (field_schema.data_type() == DType::SparseFloatVector) { field_data->mutable_vectors()->mutable_sparse_float_vector(); } else { LOG_ERROR("Unkown data type: {}", field_schema.data_type()); return false; } return true; } bool FindDimFromSchema(const ::milvus::proto::schema::CollectionSchema& schema, std::string* dim) { for (const auto& field : schema.fields()) { if (IsVectorField(field.data_type())) { return FindDimFromFieldParams(field, dim); } } return false; } std::optional<::milvus::proto::plan::VectorType> DataTypeToVectorType(::milvus::proto::schema::DataType dtype) { if (dtype == ::milvus::proto::schema::DataType::FloatVector) { return ::milvus::proto::plan::VectorType::FloatVector; } else if (dtype == ::milvus::proto::schema::DataType::BinaryVector) { return ::milvus::proto::plan::VectorType::BinaryVector; } else if (dtype == ::milvus::proto::schema::DataType::Float16Vector) { return ::milvus::proto::plan::VectorType::Float16Vector; } else if (dtype == ::milvus::proto::schema::DataType::BFloat16Vector) { return ::milvus::proto::plan::VectorType::BFloat16Vector; } else if (dtype == ::milvus::proto::schema::DataType::SparseFloatVector) { return ::milvus::proto::plan::VectorType::SparseFloatVector; } else { return std::nullopt; } } Status FindVectorField(const ::milvus::proto::schema::CollectionSchema& schema, const std::string& ann_field, const ::milvus::proto::schema::FieldSchema** field) { std::map vec_fields; for (const auto& field : schema.fields()) { if (IsVectorField(field.data_type())) { vec_fields[field.name()] = &field; } } if (vec_fields.size() == 0) { auto err = string_util::SFormat( "Can not found vector field in collection {}", schema.name()); LOG_ERROR(err); return Status::ParameterInvalid(err); } if (ann_field.empty()) { if (vec_fields.size() > 1) { auto err = string_util::SFormat( "multiple anns_fields exist, please specify a anns_field " "insearch_params"); return Status::ParameterInvalid(err); } else { *field = vec_fields.begin()->second; return Status::Ok(); } } else { if (vec_fields.find(ann_field) == vec_fields.end()) { auto err = string_util::SFormat("fieldName({}) not found", ann_field); LOG_ERROR(err); return Status::ParameterInvalid(err); } *field = vec_fields.at(ann_field); return Status::Ok(); } } std::string MergeIndexs(std::vector& indexs) { ::milvus::proto::segcore::CollectionIndexMeta index_meta; index_meta.set_maxindexrowcount(kMaxIndexRow); for (size_t i = 0; i < indexs.size(); i++) { index_meta.add_index_metas()->ParseFromString(indexs[i]); } return index_meta.SerializeAsString(); } std::string GetIndexMetricType(const milvus::proto::segcore::FieldIndexMeta& field_index) { for (int i = 0; i < field_index.type_params_size(); i++) { if (field_index.type_params(i).key() == kMetricTypeKey) { return field_index.type_params(i).value(); } } for (int i = 0; i < field_index.index_params_size(); i++) { if (field_index.index_params(i).key() == kMetricTypeKey) { return field_index.index_params(i).value(); } } for (int i = 0; i < field_index.user_index_params_size(); i++) { if (field_index.user_index_params(i).key() == kMetricTypeKey) { return field_index.user_index_params(i).value(); } } return ""; } std::optional GetPkId(const ::milvus::proto::schema::CollectionSchema& schema) { for (const auto& field : schema.fields()) { if (field.is_primary_key()) { return field.fieldid(); } } return std::nullopt; } std::optional GetPkName(const ::milvus::proto::schema::CollectionSchema& schema) { for (const auto& field : schema.fields()) { if (field.is_primary_key()) { return field.name(); } } return std::nullopt; } bool PickFieldDataByIndex(const ::milvus::proto::schema::FieldData& src_data, const std::vector& indexes, ::milvus::proto::schema::FieldData* dst) { for (int64_t i : indexes) { switch (src_data.type()) { case DType::FloatVector: { dst->mutable_vectors()->set_dim(src_data.vectors().dim()); auto vec = std::any_cast>(GetField(src_data, i)); for (const auto& item : vec) { dst->mutable_vectors()->mutable_float_vector()->add_data( item); } } break; case DType::BinaryVector: { dst->mutable_vectors()->set_dim(src_data.vectors().dim()); auto vec = std::any_cast(GetField(src_data, i)); dst->mutable_vectors()->mutable_binary_vector()->assign( dst->mutable_vectors()->binary_vector() + vec); } break; case DType::Float16Vector: { dst->mutable_vectors()->set_dim(src_data.vectors().dim()); auto vec = std::any_cast(GetField(src_data, i)); dst->mutable_vectors()->mutable_float16_vector()->assign( dst->mutable_vectors()->float16_vector() + vec); } break; case DType::BFloat16Vector: { dst->mutable_vectors()->set_dim(src_data.vectors().dim()); auto vec = std::any_cast(GetField(src_data, i)); dst->mutable_vectors()->mutable_bfloat16_vector()->assign( dst->mutable_vectors()->bfloat16_vector() + vec); } break; case DType::Bool: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_bool_data()->add_data(data); } break; case DType::Int8: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_int_data()->add_data(data); } break; case DType::Int16: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_int_data()->add_data(data); } break; case DType::Int32: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_int_data()->add_data(data); } break; case DType::Int64: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_long_data()->add_data(data); } break; case DType::Float: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_float_data()->add_data(data); } break; case DType::Double: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_double_data()->add_data(data); } break; case DType::String: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_string_data()->add_data(data); } break; case DType::VarChar: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_string_data()->add_data(data); } break; case DType::Array: { auto data = std::any_cast<::milvus::proto::schema::ArrayArray>( GetField(src_data, i)); auto arr = dst->mutable_scalars()->mutable_array_data(); arr->set_element_type(data.element_type()); arr->add_data()->CopyFrom(data.data(0)); } break; case DType::JSON: { auto data = std::any_cast(GetField(src_data, i)); dst->mutable_scalars()->mutable_json_data()->add_data(data); } break; case DType::SparseFloatVector: { auto data = std::any_cast<::milvus::proto::schema::SparseFloatArray>( GetField(src_data, i)); auto mutable_sp = dst->mutable_vectors()->mutable_sparse_float_vector(); mutable_sp->set_dim(data.dim()); mutable_sp->add_contents(data.contents(0)); } break; default: LOG_ERROR("Field: [{}-{}] unkown data type: {}", src_data.field_name(), src_data.field_id(), src_data.type()); return false; } } return true; } bool SliceFieldData(const ::milvus::proto::schema::FieldData& src_data, const std::vector>& ranges, ::milvus::proto::schema::FieldData* dst) { std::vector indexes; for (const auto& range : ranges) { int64_t offset = std::get<0>(range); int64_t limit = std::get<1>(range); for (int64_t i = offset; i < offset + limit; i++) { indexes.push_back(i); } } return PickFieldDataByIndex(src_data, indexes, dst); } // Support wildcard in output fields: // //"*" - all fields // // For example, A and B are scalar fields, C and D are vector fields, duplicated fields will automatically be removed. // //output_fields=["*"] ==> [A,B,C,D] //output_fields=["*",A] ==> [A,B,C,D] //output_fields=["*",C] ==> [A,B,C,D] bool TranslateOutputFields( const ::google::protobuf::RepeatedPtrField& raw_fields, const ::milvus::proto::schema::CollectionSchema& schema, bool add_primary, std::vector* result_outputs, std::vector* user_output_fields) { std::string pk_name; std::set all_fields; // when enable dynamic field, result_field store the real field of collection, // user_output_field store user-specified name; std::set result_field; std::set user_output_field; for (const auto& field : schema.fields()) { if (field.is_primary_key()) { pk_name = field.name(); } if (field.fieldid() >= kStartOfUserFieldId) { all_fields.insert(field.name()); } } for (const auto& name : raw_fields) { auto output_name = string_util::Trim(name); if (output_name == "*") { for (const std::string& name : all_fields) { result_field.insert(name); user_output_field.insert(name); } } else { if (all_fields.find(output_name) != all_fields.end()) { result_field.insert(output_name); user_output_field.insert(output_name); } else { if (schema.enable_dynamic_field()) { milvus::proto::schema::CollectionSchema schema_; schema_.CopyFrom(schema); auto helper = milvus::local::CreateSchemaHelper(&schema_); auto expr = ParseIdentifier(helper, name); if (expr->column_expr().info().nested_path_size() == 1 && expr->column_expr().info().nested_path(0) == name) { result_field.insert(kMetaFieldName); user_output_field.insert(name); } } else { LOG_ERROR("Field {} not exist", output_name); return false; } } } } std::set bm25_fields_outputs; for (const auto& func : schema.functions()) { if (func.type() == ::milvus::proto::schema::FunctionType::BM25) { for (const auto& output_field : func.output_field_names()) { bm25_fields_outputs.insert(output_field); } } } if (add_primary) { result_field.insert(pk_name); user_output_field.insert(pk_name); } // remove bm25 fields outputs for (const auto& fname : bm25_fields_outputs) { result_field.erase(fname); user_output_field.erase(fname); } for (const std::string& fname : result_field) { result_outputs->push_back(fname); } for (const std::string& fname : user_output_field) { user_output_fields->push_back(fname); } return true; } bool ReduceFieldByIDs(const ::milvus::proto::schema::IDs& ids, const ::milvus::proto::schema::FieldData& src, ::milvus::proto::schema::FieldData* dst, int64_t* real_size) { std::set unique_ids; std::vector indexes; dst->set_type(src.type()); dst->set_field_id(src.field_id()); dst->set_field_name(src.field_name()); dst->set_is_dynamic(src.is_dynamic()); if (ids.has_int_id()) { for (int64_t i = 0; i < ids.int_id().data_size(); ++i) { auto cur_id = std::to_string(ids.int_id().data(i)); if (unique_ids.find(cur_id) != unique_ids.end()) continue; unique_ids.insert(cur_id); indexes.push_back(i); } } else if (ids.has_str_id()) { for (int64_t i = 0; i < ids.str_id().data_size(); ++i) { auto cur_id = ids.str_id().data(i); if (unique_ids.find(cur_id) != unique_ids.end()) continue; unique_ids.insert(cur_id); indexes.push_back(i); } } else { // empty data return true; } *real_size = unique_ids.size(); return PickFieldDataByIndex(src, indexes, dst); } Status ParseExpr(const std::string& expr_str, ::milvus::proto::schema::CollectionSchema schema, ::milvus::proto::plan::Expr* expr_out) { try { auto buf = milvus::local::ParserToMessage(schema, expr_str); expr_out->ParseFromString(buf); return Status::Ok(); } catch (std::exception& e) { LOG_ERROR(e.what()); return Status::ParameterInvalid( string_util::SFormat("Invalid expr: {}", expr_str)); } } bool SchemaEquals(const std::string& schema_str_l, const std::string& schema_str_r) { ::milvus::proto::schema::CollectionSchema schema_l, schema_r; if (!schema_l.ParseFromString(schema_str_l) || !schema_r.ParseFromString(schema_str_r)) { LOG_ERROR("Parse schema failed"); return false; } if (schema_l.name() != schema_r.name() || schema_l.description() != schema_r.description() || schema_l.enable_dynamic_field() != schema_r.enable_dynamic_field() || schema_l.fields_size() != schema_r.fields_size() || !CheckParamsEqual(schema_l.properties(), schema_r.properties())) { return false; } // check field for (int i = 0; i < schema_l.fields_size(); i++) { if (schema_l.fields(i).fieldid() != schema_r.fields(i).fieldid() || schema_l.fields(i).name() != schema_r.fields(i).name() || schema_l.fields(i).is_primary_key() != schema_r.fields(i).is_primary_key() || schema_l.fields(i).description() != schema_r.fields(i).description() || schema_l.fields(i).data_type() != schema_r.fields(i).data_type() || schema_l.fields(i).autoid() != schema_r.fields(i).autoid() || schema_l.fields(i).is_dynamic() != schema_r.fields(i).is_dynamic() || schema_l.fields(i).element_type() != schema_r.fields(i).element_type() || !CheckValueFieldEqual(schema_l.fields(i).default_value(), schema_r.fields(i).default_value()) || !CheckParamsEqual(schema_l.fields(i).type_params(), schema_r.fields(i).type_params()) || !CheckParamsEqual(schema_l.fields(i).index_params(), schema_r.fields(i).index_params()) ) { return false; } } return true; } bool CheckParamsEqual(const ::google::protobuf::RepeatedPtrField< ::milvus::proto::common::KeyValuePair>& left, const ::google::protobuf::RepeatedPtrField< ::milvus::proto::common::KeyValuePair>& right) { if (left.size() != right.size()) return false; KVMap right_map; for (int i = 0; i < right.size(); i++) { right_map[right[i].key()] = right[i].value(); } for (int i = 0; i < left.size(); i++) { auto it = right_map.find(left[i].key()); if (it == right_map.end()) return false; if (it->second != left[i].value()) return false; } return true; } bool CheckValueFieldEqual(const ::milvus::proto::schema::ValueField& left, const ::milvus::proto::schema::ValueField& right) { if (!left.IsInitialized() && !right.IsInitialized()) return true; if (left.data_case() != right.data_case()) return false; if (left.data_case() == 0) { return true; } if (left.has_bool_data() && right.has_bool_data() && left.bool_data() == right.bool_data()) return true; if (left.has_int_data() && right.has_int_data() && left.int_data() == right.int_data()) return true; if (left.has_long_data() && right.has_long_data() && left.long_data() == right.long_data()) return true; if (left.has_float_data() && right.has_float_data() && std::fabs(left.float_data() - right.float_data()) < 0.00001f) return true; if (left.has_double_data() && right.has_double_data() && std::fabs(left.double_data() - right.double_data()) < 0.0000001) return true; if (left.has_string_data() && right.has_string_data() && left.string_data() == right.string_data()) return true; if (left.has_bytes_data() && right.has_bytes_data() && left.bytes_data() == right.bytes_data()) return true; return false; } void FillInFieldInfo( const std::vector& output_fields, const ::milvus::proto::schema::CollectionSchema& schema, std::variant<::milvus::proto::schema::SearchResultData*, ::milvus::proto::milvus::QueryResults*> result_var) { auto process = [](const auto& output_fields, const auto& schema, auto&&... args) { return [&output_fields, &schema, args...](auto&& result_data) { if (output_fields.size() == 0 || result_data->fields_data_size() == 0) { return; } for (size_t i = 0; i < output_fields.size(); i++) { const std::string& name = output_fields[i]; for (const auto& field : schema.fields()) { if (name == field.name()) { auto field_id = field.fieldid(); for (int j = 0; j < result_data->fields_data().size(); j++) { if (field_id == result_data->fields_data(j).field_id()) { result_data->mutable_fields_data(j) ->set_field_name(field.name()); result_data->mutable_fields_data(j) ->set_field_id(field.fieldid()); result_data->mutable_fields_data(j)->set_type( field.data_type()); result_data->mutable_fields_data(j) ->set_is_dynamic(field.is_dynamic()); } } } } } }; }; std::visit(process(output_fields, schema), result_var); } bool GetOutputFieldsIds(const std::vector& output_fields, const ::milvus::proto::schema::CollectionSchema& schema, std::vector* ids) { std::map name_ids; for (const auto& field : schema.fields()) { name_ids[field.name()] = field.fieldid(); } for (const auto& output_field : output_fields) { auto it = name_ids.find(output_field); if (it == name_ids.end()) { LOG_ERROR("Can not find output field {} in schema", output_field); return false; } ids->push_back(it->second); } return true; } } // namespace schema_util } // namespace milvus::local ================================================ FILE: src/schema_util.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include #include "common.h" #include "common.pb.h" #include "pb/plan.pb.h" #include "pb/segcore.pb.h" #include "pb/milvus.pb.h" #include "pb/schema.pb.h" #include "status.h" #include "string_util.hpp" #include namespace milvus::local { namespace schema_util { std::any GetField(const ::milvus::proto::schema::FieldData& field_data, uint32_t field_index); bool IsVectorField(::milvus::proto::schema::DataType dtype); bool IsSparseVectorType(::milvus::proto::schema::DataType dtype); bool FindDimFromFieldParams(const ::milvus::proto::schema::FieldSchema& field, std::string* dim); int64_t GetDim(const ::milvus::proto::schema::FieldSchema& field); bool FindDimFromSchema(const ::milvus::proto::schema::CollectionSchema& schema, std::string* dim); std::optional<::milvus::proto::plan::VectorType> DataTypeToVectorType(::milvus::proto::schema::DataType dtype); Status FindVectorField(const ::milvus::proto::schema::CollectionSchema& schema, const std::string& ann_field, const ::milvus::proto::schema::FieldSchema** field); std::optional GetPkId(const ::milvus::proto::schema::CollectionSchema& schema); std::optional GetPkName(const ::milvus::proto::schema::CollectionSchema& schema); bool SliceFieldData(const ::milvus::proto::schema::FieldData& src_data, const std::vector>& ranges, ::milvus::proto::schema::FieldData* dst); bool PickFieldDataByIndex(const ::milvus::proto::schema::FieldData& src_data, const std::vector& indexes, ::milvus::proto::schema::FieldData* dst); bool FillEmptyField(const ::milvus::proto::schema::FieldSchema& field_schema, ::milvus::proto::schema::FieldData* field_data); std::string MergeIndexs(std::vector& indexs); bool SchemaEquals(const std::string& schema_str_l, const std::string& schema_str_r); // Support wildcard in output fields: // //"*" - all fields // // For example, A and B are scalar fields, C and D are vector fields, duplicated fields will automatically be removed. // //output_fields=["*"] ==> [A,B,C,D] //output_fields=["*",A] ==> [A,B,C,D] //output_fields=["*",C] ==> [A,B,C,D] bool TranslateOutputFields( const ::google::protobuf::RepeatedPtrField& raw_fields, const ::milvus::proto::schema::CollectionSchema& schema, bool add_primary, std::vector* result_outputs, std::vector* user_output_fields); bool ReduceFieldByIDs(const ::milvus::proto::schema::IDs& ids, const ::milvus::proto::schema::FieldData& src, ::milvus::proto::schema::FieldData* dst, int64_t* real_size); // PositivelyRelated return if metricType are "ip" or "IP" inline bool PositivelyRelated(const std::string& metrics_type) { auto upper_str = string_util::ToUpper(metrics_type); return upper_str == KMetricsIPName || upper_str == kMetricsCosineName || upper_str == kMetricsBM25Name; } std::string GetIndexMetricType(const milvus::proto::segcore::FieldIndexMeta& field_index); Status ParseExpr(const std::string& expr_str, ::milvus::proto::schema::CollectionSchema schema, ::milvus::proto::plan::Expr* expr_out); bool CheckParamsEqual(const ::google::protobuf::RepeatedPtrField< ::milvus::proto::common::KeyValuePair>& left, const ::google::protobuf::RepeatedPtrField< ::milvus::proto::common::KeyValuePair>& right); bool CheckValueFieldEqual(const ::milvus::proto::schema::ValueField& left, const ::milvus::proto::schema::ValueField& right); inline int IDsSize(const ::milvus::proto::schema::IDs& ids) { if (ids.has_int_id()) { return ids.int_id().data_size(); } else { return ids.str_id().data_size(); } } void FillInFieldInfo( const std::vector& output_fields, const ::milvus::proto::schema::CollectionSchema& schema, std::variant<::milvus::proto::schema::SearchResultData*, ::milvus::proto::milvus::QueryResults*> result_var); bool GetOutputFieldsIds(const std::vector& output_fields, const ::milvus::proto::schema::CollectionSchema& schema, std::vector* ids); inline void SparseVectorToByte(const SparseVector& vec, std::string* buf) { for (const auto& it : vec) { uint32_t k = it.first; float v = it.second; buf->append(reinterpret_cast(&k), sizeof(k)); buf->append(reinterpret_cast(&v), sizeof(v)); } } inline bool HasFunction(const ::milvus::proto::schema::CollectionSchema& schema) { return !schema.functions().empty(); } inline bool HasFunction(const ::milvus::proto::schema::CollectionSchema& schema, const std::string& ann_field) { for (const auto& f : schema.functions()) { if (f.output_field_names(0) == ann_field) { return true; } } return false; } inline std::vector GetBM25SparseField(const ::milvus::proto::schema::CollectionSchema& schema) { std::vector fields; for (const auto& f : schema.functions()) { if (f.type() == milvus::proto::schema::FunctionType::BM25) { fields.push_back(f.output_field_names(0)); } } return fields; } // inline bool // HasBM25Function(const ::milvus::proto::schema::CollectionSchema& schema) { // return true; // } } // namespace schema_util } // namespace milvus::local ================================================ FILE: src/search_result.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include "common.h" #include "common/type_c.h" #include "segcore/reduce_c.h" namespace milvus::local { class SearchResult final : NonCopyableNonMovable { public: SearchResult(const std::vector& slice_nqs, const std::vector& slice_topKs) : slice_nqs_(slice_nqs), slice_topKs_(slice_topKs) { blob_ = nullptr; } ~SearchResult() { if (blob_ != nullptr) { DELETE_AND_SET_NULL(blob_, DeleteSearchResultDataBlobs); result_.clear(); } } public: // std::vector> CSearchResultDataBlobs blob_; // milvus::proto::schema::SearchResultData // ptr to blob_ std::vector result_; public: std::vector slice_nqs_; std::vector slice_topKs_; }; } // namespace milvus::local ================================================ FILE: src/search_task.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "search_task.h" #include #include #include #include #include #include "common.h" #include "function/function_executor.h" #include "pb/plan.pb.h" #include "antlr4-runtime.h" #include "parser/parser.h" #include "parser/utils.h" #include "log/Log.h" #include "schema.pb.h" #include "schema_util.h" #include "status.h" namespace milvus::local { using milvus::local::function::FunctionExecutor; SearchTask::SearchTask(::milvus::proto::milvus::SearchRequest* search_reques, const ::milvus::proto::schema::CollectionSchema* schema, const std::vector* all_index) : search_request_(search_reques), schema_(schema), all_index_(all_index), topk_(-1), offset_(0), ann_field_(""), metric_(""), groupby_field_name_("") { } SearchTask::~SearchTask() { } bool SearchTask::ParseSearchInfo(::milvus::proto::plan::QueryInfo* info) { int64_t round_decimal = -1; std::string search_param_str(""); for (const auto& param : search_request_->search_params()) { if (param.key() == kTopkKey) { try { topk_ = std::stoll(param.value()); } catch (std::exception& e) { LOG_ERROR("Parse topk failed, topk: {}, err: {}", param.value(), e.what()); return false; } } else if (param.key() == kOffsetKey) { try { offset_ = std::stoll(param.value()); } catch (std::exception& e) { LOG_ERROR("Parse offset failed, offset: {}, err: {}", param.value(), e.what()); return false; } } else if (param.key() == kMetricTypeKey) { metric_ = param.value(); } else if (param.key() == kRoundDecimalKey) { try { round_decimal = std::stoll(param.value()); } catch (std::exception& e) { LOG_ERROR( "Parse round_decimal failed, round_decimal: {}, err: {}", param.value(), e.what()); return false; } } else if (param.key() == kSearchParamKey) { search_param_str = param.value(); } else if (param.key() == kGroupByFieldKey) { groupby_field_name_ = param.value(); } else if (param.key() == kAnnFieldKey) { ann_field_ = param.value(); } } // get and validate topk if (topk_ <= 0 || topk_ > kTopkLimit) { LOG_ERROR( "Topk should be in range [1, {}], but got {}", kTopkLimit, topk_); return false; } if (offset_ > kTopkLimit) { LOG_ERROR("Offset should be in range [0, {}], but got {}", kTopkLimit, offset_); return false; } if ((topk_ + offset_) > kTopkLimit) { LOG_ERROR("topk + offset should be in range [1, {}], but got {}", kTopkLimit, topk_ + offset_); return false; } if (round_decimal != -1 && (round_decimal > 6 || round_decimal < 0)) { LOG_ERROR( "round_decimal {} is invalid, should be -1 or an integer in " "range [0, 6]", round_decimal); return false; } int64_t groupby_field_id = kRowIdField; if (groupby_field_name_ != "") { groupby_field_id = -1; for (const auto& field : schema_->fields()) { if (groupby_field_name_ == field.name()) { groupby_field_id = field.fieldid(); break; } } if (groupby_field_id == -1) { LOG_ERROR("groupBy field {} not found in schema", groupby_field_name_); return false; } } info->set_topk(topk_ + offset_); info->set_search_params(search_param_str); info->set_round_decimal(round_decimal); info->set_group_by_field_id(groupby_field_id); return true; } std::optional> SearchTask::GetVectorField() { for (const auto& field : schema_->fields()) { if (schema_util::IsVectorField(field.data_type())) { return std::make_tuple(field.name(), field.data_type()); } } LOG_ERROR("Can not found vector field"); return std::nullopt; } Status SearchTask::Process(::milvus::proto::plan::PlanNode* plan, std::string* placeholder_group, std::vector* nqs, std::vector* topks) { if (!schema_util::TranslateOutputFields(search_request_->output_fields(), *schema_, false, &output_fields_, &user_output_fields_)) { return Status::ParameterInvalid(); } std::vector ids; if (!schema_util::GetOutputFieldsIds(output_fields_, *schema_, &ids)) { return Status::ParameterInvalid(); } for (int64_t id : ids) { plan->add_output_field_ids(id); } auto vector_anns = plan->mutable_vector_anns(); vector_anns->set_placeholder_tag(kPlaceholderTag); if (!ParseSearchInfo(vector_anns->mutable_query_info())) { return Status::ParameterInvalid(); } const ::milvus::proto::schema::FieldSchema* field; auto s = schema_util::FindVectorField(*schema_, ann_field_, &field); CHECK_STATUS(s, ""); ann_field_ = field->name(); if (schema_util::HasFunction(*schema_, ann_field_)) { auto [s, executor] = FunctionExecutor::Create(schema_, ann_field_); CHECK_STATUS(s, ""); CHECK_STATUS(executor->ProcessSearch(search_request_), ""); } placeholder_group->assign(search_request_->placeholder_group()); nqs->push_back(search_request_->nq()); topks->push_back(vector_anns->query_info().topk()); vector_anns->set_field_id(field->fieldid()); auto vtype = schema_util::DataTypeToVectorType(field->data_type()); vector_anns->set_vector_type(*vtype); // check metrics std::string index_metric; for (const auto& index_str : *all_index_) { milvus::proto::segcore::FieldIndexMeta field_index; if (!field_index.ParseFromString(index_str)) { return Status::ServiceInternal("Error index info in db"); } if (field_index.fieldid() == field->fieldid()) { index_metric = schema_util::GetIndexMetricType(field_index); } } if (index_metric.empty()) { return Status::IndexNotFound("No index found in field [{}]", field->name()); } if (metric_.empty()) metric_ = index_metric; if (metric_.empty() || metric_ != index_metric) { return Status::ParameterInvalid( "fail to search: metric type not match: invalid " "[expected={}][actual={}]", index_metric, metric_); } plan->mutable_vector_anns()->mutable_query_info()->set_metric_type(metric_); if (!search_request_->dsl().empty()) { CHECK_STATUS(schema_util::ParseExpr( search_request_->dsl(), *schema_, plan->mutable_vector_anns()->mutable_predicates()), ""); } return Status::Ok(); } bool SearchTask::PostProcess( const SearchResult& segcore_reault, ::milvus::proto::milvus::SearchResults* search_results) { ::milvus::proto::schema::SearchResultData tmp_ret; tmp_ret.ParseFromArray(segcore_reault.result_[0].proto_blob, segcore_reault.result_[0].proto_size); search_results->mutable_results()->set_num_queries(tmp_ret.num_queries()); auto ret_size = tmp_ret.scores_size(); auto nq = tmp_ret.num_queries(); int score_coefficient = schema_util::PositivelyRelated(metric_) ? 1 : -1; search_results->mutable_results()->set_top_k(0); int64_t cur_index = 0; if (nq * offset_ < ret_size) { for (const auto& name : user_output_fields_) { search_results->mutable_results()->add_output_fields(name); } std::vector> ranges; for (int i = 0; i < nq; i++) { int64_t limit = 0; if (tmp_ret.topks(i) - offset_ > 0) limit = tmp_ret.topks(i) - offset_; if (search_results->results().top_k() < limit) search_results->mutable_results()->set_top_k(limit); search_results->mutable_results()->mutable_topks()->Add(limit); ranges.push_back(std::make_tuple(cur_index + offset_, limit)); // copy topks and scores for (int j = cur_index + offset_; j < cur_index + tmp_ret.topks(i); j++) { search_results->mutable_results()->mutable_scores()->Add( tmp_ret.scores(j) * score_coefficient); // copy ids if (tmp_ret.ids().has_int_id()) { search_results->mutable_results() ->mutable_ids() ->mutable_int_id() ->add_data(tmp_ret.ids().int_id().data(j)); } else { search_results->mutable_results() ->mutable_ids() ->mutable_str_id() ->add_data(tmp_ret.ids().str_id().data(j)); } } cur_index += tmp_ret.topks(i); } // copy fields_data for (const auto& field_data : tmp_ret.fields_data()) { auto new_data = search_results->mutable_results()->add_fields_data(); new_data->set_field_id(field_data.field_id()); new_data->set_type(field_data.type()); new_data->set_field_name(field_data.field_name()); new_data->set_is_dynamic(field_data.is_dynamic()); schema_util::SliceFieldData(field_data, ranges, new_data); } FillInFieldInfo(search_results->mutable_results()); } else { for (int i = 0; i < nq; i++) { search_results->mutable_results()->mutable_topks()->Add(0); } } return true; } void SearchTask::FillInFieldInfo( ::milvus::proto::schema::SearchResultData* result_data) { std::variant<::milvus::proto::schema::SearchResultData*, ::milvus::proto::milvus::QueryResults*> result_var; result_var = result_data; schema_util::FillInFieldInfo(output_fields_, *schema_, result_var); } } // namespace milvus::local ================================================ FILE: src/search_task.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include "pb/milvus.pb.h" #include "pb/plan.pb.h" #include "pb/segcore.pb.h" #include "schema.pb.h" #include "search_result.h" #include "status.h" namespace milvus::local { class SearchTask final : NonCopyableNonMovable { public: SearchTask(::milvus::proto::milvus::SearchRequest* search_reques, const ::milvus::proto::schema::CollectionSchema* schema, const std::vector*); virtual ~SearchTask(); public: Status Process(::milvus::proto::plan::PlanNode* plan, std::string* placeholder_group, std::vector* nqs, std::vector* topks); bool PostProcess(const SearchResult& segcore_reaul, ::milvus::proto::milvus::SearchResults* search_results); const std::string GetMetric() { return metric_; } const std::string GetAnnFieldName() { return ann_field_; } private: bool ParseSearchInfo(::milvus::proto::plan::QueryInfo* info); std::optional> GetVectorField(); void FillInFieldInfo(::milvus::proto::schema::SearchResultData* result_data); private: ::milvus::proto::milvus::SearchRequest* search_request_; const ::milvus::proto::schema::CollectionSchema* schema_; const std::vector* all_index_; std::vector output_fields_; std::vector user_output_fields_; int64_t topk_, offset_; std::string ann_field_; std::string metric_; std::string groupby_field_name_; }; } // namespace milvus::local ================================================ FILE: src/segcore_wrapper.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "segcore_wrapper.h" #include #include #include #include #include #include #include #include #include "common.h" #include "common/type_c.h" #include "log/Log.h" #include "pb/segcore.pb.h" #include "retrieve_result.h" #include "segcore/collection_c.h" #include "segcore/reduce_c.h" #include "segcore/segment_c.h" #include "pb/schema.pb.h" #include "status.h" namespace milvus::local { const int64_t DEFAULT_MAX_OUTPUT_SIZE = 67108864; class RetrievePlanWrapper final : private NonCopyableNonMovable { public: RetrievePlanWrapper() : plan_(nullptr) { } virtual ~RetrievePlanWrapper() { DELETE_AND_SET_NULL(plan_, DeleteRetrievePlan); } public: CRetrievePlan plan_; }; class SearchPlanWrapper final : private NonCopyableNonMovable { public: SearchPlanWrapper() : plan_(nullptr) { } virtual ~SearchPlanWrapper() { DELETE_AND_SET_NULL(plan_, DeleteSearchPlan); } public: CSearchPlan plan_; }; class PlaceholderGroupWrapper final : private NonCopyableNonMovable { public: PlaceholderGroupWrapper() : group_(nullptr) { } virtual ~PlaceholderGroupWrapper() { DELETE_AND_SET_NULL(group_, DeletePlaceholderGroup); } public: CPlaceholderGroup group_; }; class SearchResultWrapper final : private NonCopyableNonMovable { public: SearchResultWrapper() : ret_(nullptr) { } virtual ~SearchResultWrapper() { DELETE_AND_SET_NULL(ret_, DeleteSearchResult); } public: CSearchResult ret_; }; SegcoreWrapper::~SegcoreWrapper() { if (collection_ != nullptr) { try { DELETE_AND_SET_NULL(collection_, DeleteCollection); } catch (std::exception& e) { LOG_ERROR("Release collection {} failed", collection_name_); } } if (segment_ != nullptr) { try { DELETE_AND_SET_NULL(segment_, DeleteSegment); } catch (std::exception& e) { LOG_ERROR("Release segment {} failed", collection_name_); } } } Status SegcoreWrapper::SetCollectionInfo(const std::string& collection_name, const std::string& collection_info, const std::string& index_meta) { assert(collection_ == nullptr); auto new_collection_info = NewCollectionInfo(collection_info); try { CHECK_STATUS(Status(::NewCollection(new_collection_info.c_str(), new_collection_info.size(), &collection_)), "New collection failed"); // set index info if has if (!index_meta.empty()) { ::SetIndexMeta(collection_, index_meta.c_str(), index_meta.size()); } CHECK_STATUS( Status(::NewSegment(collection_, Growing, 0, &segment_, false)), "Init segcore failed"); collection_name_ = collection_name; return Status::Ok(); } catch (std::exception& e) { return Status::SegcoreErr(e.what()); } } std::string SegcoreWrapper::NewCollectionInfo(const std::string& info) { ::milvus::proto::schema::CollectionSchema schema; schema.ParseFromString(info); for (auto it = schema.fields().begin(); it != schema.fields().end();) { if (it->fieldid() < kStartOfUserFieldId) { schema.mutable_fields()->erase(it); } else { ++it; } } return schema.SerializeAsString(); } Status SegcoreWrapper::SetIndexMeta(const std::string& meta_info) { try { ::SetIndexMeta(collection_, meta_info.c_str(), meta_info.size()); return Status::Ok(); } catch (std::exception& e) { LOG_ERROR("Set Index meta failed, err: {}", e.what()); return Status::SegcoreErr(e.what()); } } Status SegcoreWrapper::Insert(int64_t size, const std::string& insert_record_proto) { try { int64_t offset = 0; CHECK_STATUS(Status(::PreInsert(segment_, size, &offset)), "Pre insert failed, err:"); ::milvus::proto::segcore::InsertRecord r; r.ParseFromString(insert_record_proto); std::vector row_ids; std::vector timestamps; for (const auto& field_data : r.fields_data()) { if (field_data.field_id() == kRowIdField) { for (int64_t rowid : field_data.scalars().long_data().data()) { row_ids.push_back(rowid); } } if (field_data.field_id() == kTimeStampField) { for (int64_t ts : field_data.scalars().long_data().data()) { timestamps.push_back(ts); } } } CHECK_STATUS(Status(::Insert(segment_, offset, size, row_ids.data(), timestamps.data(), reinterpret_cast( insert_record_proto.data()), insert_record_proto.size())), "Insert failed:"); return Status::Ok(); } catch (std::exception& e) { LOG_ERROR("Insert failed, err: {}", e.what()); return Status::SegcoreErr(e.what()); } } Status SegcoreWrapper::Retrieve(const std::string& plan, RetrieveResult* result) { try { RetrievePlanWrapper retrieve_plan; auto status = Status(::CreateRetrievePlanByExpr( collection_, plan.c_str(), plan.size(), &retrieve_plan.plan_)); CHECK_STATUS(status, "Create retrieve plan failed, invalid expr"); if (::GetRowCount(segment_) == 0) { milvus::proto::segcore::RetrieveResults empty_ret; auto serialized_results = empty_ret.SerializeAsString(); result->retrieve_result_.proto_blob = new uint8_t[serialized_results.size()]; std::memcpy(const_cast(result->retrieve_result_.proto_blob), serialized_results.data(), serialized_results.size()); result->retrieve_result_.proto_size = serialized_results.size(); return Status::Ok(); } auto job = ::AsyncRetrieve({}, segment_, retrieve_plan.plan_, GetTimestamp(), DEFAULT_MAX_OUTPUT_SIZE, false, 2); std::mutex mu; mu.lock(); future_register_ready_callback( job, [](CLockedGoMutex* mutex) { ((std::mutex*)(mutex))->unlock(); }, (CLockedGoMutex*)(&mu)); mu.lock(); CRetrieveResult* tmp_result; auto rs = Status(future_leak_and_get(job, (void**)&(tmp_result))); future_destroy(job); CHECK_STATUS(rs, "Retrieve failed, errs:"); result->retrieve_result_.proto_blob = tmp_result->proto_blob; result->retrieve_result_.proto_size = tmp_result->proto_size; return Status::Ok(); } catch (std::exception& e) { LOG_ERROR("Retrieve failed, err: {}", e.what()); return Status::SegcoreErr(e.what()); } } Status SegcoreWrapper::Search(const std::string& plan, const std::string& placeholder_group, SearchResult* result) { try { SearchPlanWrapper search_plan; CHECK_STATUS( Status(::CreateSearchPlanByExpr( collection_, plan.c_str(), plan.size(), &search_plan.plan_)), "Create search plan failed, err:"); PlaceholderGroupWrapper group; CHECK_STATUS( Status(::ParsePlaceholderGroup(search_plan.plan_, (void*)placeholder_group.c_str(), placeholder_group.size(), &group.group_)), "Parse placeholder group failed"); SearchResultWrapper search_result; auto job = ::AsyncSearch( {}, segment_, search_plan.plan_, group.group_, GetTimestamp(), 2); std::mutex mu; mu.lock(); future_register_ready_callback( job, [](CLockedGoMutex* mutex) { ((std::mutex*)(mutex))->unlock(); }, (CLockedGoMutex*)(&mu)); mu.lock(); auto rs = Status(future_leak_and_get(job, (void**)&(search_result.ret_))); future_destroy(job); CHECK_STATUS(rs, "Search failed"); CHECK_STATUS( Status(::ReduceSearchResultsAndFillData({}, &(result->blob_), search_plan.plan_, &(search_result.ret_), 1, result->slice_nqs_.data(), result->slice_topKs_.data(), result->slice_nqs_.size())), "Reduce search result failed"); result->result_.resize(result->slice_nqs_.size()); for (size_t i = 0; i < result->slice_nqs_.size(); i++) { CHECK_STATUS(Status(::GetSearchResultDataBlob( &(result->result_[i]), result->blob_, i)), "Get search reault blob failed"); } return Status::Ok(); } catch (std::exception& e) { LOG_ERROR("Search failed, err: {}", e.what()); return Status::SegcoreErr(e.what()); } } Status SegcoreWrapper::DeleteByIds(const std::string& ids, int64_t size) { CHECK_STATUS(Status(::Delete(segment_, 0, size, reinterpret_cast(ids.data()), ids.size(), GetTimestamps(size).data())), "Detete failed"); return Status::Ok(); } std::vector SegcoreWrapper::GetTimestamps(int64_t size) { auto ts = GetTimestamp(); return std::vector(size, ts); } uint64_t SegcoreWrapper::GetTimestamp() { auto now = std::chrono::system_clock::now(); auto duration = now.time_since_epoch(); auto ms = std::chrono::duration_cast(duration).count(); return (ms << 18) + cur_id_; } } // namespace milvus::local ================================================ FILE: src/segcore_wrapper.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include #include #include #include #include #include "status.h" #include "retrieve_result.h" #include "search_result.h" #include "segcore/collection_c.h" #include "segcore/segcore_init_c.h" #include "segcore/segment_c.h" #include "storage/storage_c.h" namespace milvus::local { inline std::string GetDataPath() { const char* home = std::getenv("HOME"); if (home == nullptr) { throw std::runtime_error("HOME environment variable is not set. Please set HOME environment variable."); } std::string data_path = std::string(home) + "/.cache/milvus"; try { std::filesystem::create_directories(data_path); } catch (const std::exception& e) { throw std::runtime_error("Cannot create cache directory '" + data_path + "': " + e.what()); } if (!std::filesystem::is_directory(data_path)) { throw std::runtime_error("Cache path '" + data_path + "' is not a directory."); } std::string test_pattern = data_path + "/.perm-probeXXXXXX"; char test_file[test_pattern.length() + 1]; strcpy(test_file, test_pattern.c_str()); int fd = mkstemp(test_file); if (fd == -1) { throw std::runtime_error("Cache directory '" + data_path + "' is not writable by current user. Please check permissions."); } close(fd); unlink(test_file); return data_path; } const std::string data_path = GetDataPath(); class SegcoreWrapper final : NonCopyableNonMovable { public: SegcoreWrapper() : collection_(nullptr), cur_id_(0), segment_(nullptr) { SegcoreSetEnableInterminSegmentIndex(true); auto status = InitLocalChunkManagerSingleton(data_path.c_str()); if (status.error_code != 0) { throw std::runtime_error("Failed to initialize LocalChunkManager: " + std::string(status.error_msg)); } CMmapConfig conf; conf.growing_enable_mmap = false; conf.scalar_index_enable_mmap = false; conf.cache_read_ahead_policy = "willneed"; conf.mmap_path = data_path.c_str(); conf.disk_limit = 1024; conf.scalar_field_enable_mmap = false; conf.vector_field_enable_mmap = false; conf.vector_index_enable_mmap = false; conf.fix_file_size = 1024; status = InitMmapManager(conf); if (status.error_code != 0) { throw std::runtime_error("Failed to initialize MmapManager: " + std::string(status.error_msg)); } } virtual ~SegcoreWrapper(); public: Status SetCollectionInfo(const std::string& collection_name_, const std::string& collection_info, const std::string& index_meta); Status SetIndexMeta(const std::string& meta_info); Status CreateIndex(const std::string& meta_info); Status Insert(int64_t size, const std::string& insert_record_proto); Status Retrieve(const std::string& plan, RetrieveResult* result); Status Search(const std::string& plan, const std::string& placeholder_group, SearchResult* result); Status DeleteByIds(const std::string& ids, int64_t size); private: std::vector GetTimestamps(int64_t size); uint64_t GetTimestamp(); std::string NewCollectionInfo(const std::string& info); private: CCollection collection_; int64_t cur_id_; CSegmentInterface segment_; std::string collection_name_; }; } // namespace milvus::local ================================================ FILE: src/server.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "milvus_service_impl.h" #include #include "log/Log.h" #include "string_util.hpp" #include #include #include #include #include int BlockLock(const char* filename) { int fd = open(filename, O_RDWR | O_CREAT, 0666); if (fd == -1) { LOG_ERROR("Open lock file {} failed", filename); return -1; } struct flock fl; fl.l_type = F_WRLCK; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; // block lock if (fcntl(fd, F_SETLKW, &fl) == -1) { close(fd); return -1; } // unlock file fl.l_type = F_UNLCK; if (fcntl(fd, F_SETLK, &fl) == -1) { return -1; } LOG_INFO("Process exit"); close(fd); return 0; } int main(int argc, char** argv) { google::InitGoogleLogging(argv[0]); if (!(argc == 3 || argc == 4 || argc == 5)) { return -1; } std::string work_dir = argv[1]; std::string address = argv[2]; std::string log_level = "ERROR"; if (argc >= 4) { log_level = argv[3]; } if (log_level == "INFO") { google::SetStderrLogging(google::INFO); } else { google::SetStderrLogging(google::ERROR); } ::milvus::local::MilvusServiceImpl service(work_dir); if (!service.Init()) { LOG_ERROR("Init milvus failed"); return -1; } ::grpc::ServerBuilder builder; builder.SetMaxReceiveMessageSize(268435456); builder.SetMaxSendMessageSize(536870912); builder.AddListeningPort(address, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr<::grpc::Server> server(builder.BuildAndStart()); LOG_INFO("Start milvus-local success..."); if (argc == 5) { auto filename = argv[4]; /* Blocked while attempting to acquire a file lock held by the parent process. When the lock is successfully acquired, it indicates that the parent process has exited, and the child process should exit as well. */ BlockLock(filename); } else { server->Wait(); } return 0; } ================================================ FILE: src/status.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include "common/type_c.h" #include "string_util.hpp" namespace milvus::local { // errors are the subset of milvus/pkg/merr/errors.go enum ErrCode { Succ = 0, ErrServiceInternal = 5, ErrCollectionNotFound = 100, ErrCollectionNotLoaded = 101, ErrCollectionNumLimitExceeded = 102, ErrCollectionNotFullyLoaded = 103, ErrCollectionLoaded = 104, ErrCollectionIllegalSchema = 105, // not in milvus ErrCollectionAlreadExist = 199, ErrIndexNotFound = 700, ErrIndexNotSupported = 701, ErrIndexDuplicate = 702, ErrParameterInvalid = 1100, ErrParameterMissing = 1101, ErrMetricNotFound = 1200, ErrFieldNotFound = 1700, ErrFieldInvalidName = 1701, ErrMissingRequiredParameters = 1802, ErrMarshalCollectionSchema = 1803, ErrInvalidInsertData = 1804, ErrInvalidSearchResult = 1805, ErrCheckPrimaryKey = 1806, ErrSegcore = 2000, ErrUndefined = 65535 }; class Status { public: explicit Status(CStatus cstatus) { if (cstatus.error_code != 0) { msg_ = "segcore error"; code_ = ErrSegcore; detail_ = cstatus.error_msg; free((void*)cstatus.error_msg); cstatus.error_msg = NULL; } else { code_ = 0; msg_ = ""; detail_ = ""; } } private: Status(int code, const std::string& msg, const std::string& detail = "") : code_(code), msg_(msg), detail_(detail) { } public: virtual ~Status() = default; Status(const Status& rhs) = default; Status& operator=(const Status& rhs) = default; Status(Status&& rhs) : code_(rhs.code_) { msg_ = std::move(rhs.msg_); detail_ = std::move(rhs.detail_); } Status& operator=(Status&& rhs); public: template static Status ServiceInternal(const std::string& detail = "", Args&&... args) { return Status(ErrServiceInternal, "internal error", string_util::SFormat(detail, args...)); } template static Status SegcoreErr(const std::string& detail = "", Args&&... args) { return Status( ErrSegcore, "segcore error", string_util::SFormat(detail, args...)); } template static Status CollectionNotFound(const std::string& detail = "", Args&&... args) { return Status(ErrCollectionNotFound, "collection not found", string_util::SFormat(detail, args...)); } template static Status CollectionAlreadExist(const std::string& detail = "", Args&&... args) { return Status(ErrCollectionAlreadExist, "collection alread exists", string_util::SFormat(detail, args...)); } template static Status CollectionNotLoaded(const std::string& detail = "", Args&&... args) { return Status(ErrCollectionNotLoaded, "collection not loaded", string_util::SFormat(detail, args...)); } template static Status CollectionLoaded(const std::string& detail = "", Args&&... args) { return Status(ErrCollectionLoaded, "collection already loaded", string_util::SFormat(detail, args...)); } template static Status CollectionIllegalSchema(const std::string& detail = "", Args&&... args) { return Status(ErrCollectionIllegalSchema, "illegal collection schema", string_util::SFormat(detail, args...)); } template static Status IndexNotFound(const std::string& detail = "", Args&&... args) { return Status(ErrIndexNotFound, "index not found", string_util::SFormat(detail, args...)); } template static Status IndexNotSupported(const std::string& detail = "", Args&&... args) { return Status(ErrIndexNotSupported, "index type not supported", string_util::SFormat(detail, args...)); } template static Status IndexDuplicate(const std::string& detail = "", Args&&... args) { return Status(ErrIndexDuplicate, "index duplicates", string_util::SFormat(detail, args...)); } template static Status ParameterInvalid(const std::string& detail = "", Args&&... args) { return Status(ErrParameterInvalid, "invalid parameter", string_util::SFormat(detail, args...)); } template static Status ParameterMissing(const std::string& detail = "", Args&&... args) { return Status(ErrParameterMissing, "missing parameter", string_util::SFormat(detail, args...)); } template static Status MetricNotFound(const std::string& detail = "", Args&&... args) { return Status(ErrMetricNotFound, "metric not found", string_util::SFormat(detail, args...)); } template static Status FieldNotFound(const std::string& detail = "", Args&&... args) { return Status(ErrFieldNotFound, "field not found", string_util::SFormat(detail, args...)); } template static Status FieldInvalidName(const std::string& detail = "", Args&&... args) { return Status(ErrFieldInvalidName, "field name invalid", string_util::SFormat(detail, args...)); } template static Status Undefined(const std::string& detail = "", Args&&... args) { return Status(ErrUndefined, "", string_util::SFormat(detail, args...)); } template static Status Ok(const std::string& detail = "", Args&&... args) { return Status(0, "", string_util::SFormat(detail, args...)); } public: bool IsOk() { return code_ == 0; } bool IsErr() { return code_ != 0; } int Code() { return code_; } const std::string& Msg() { return msg_; } const std::string& Detail() { return detail_; } private: int code_; std::string msg_; std::string detail_; }; inline Status& Status::operator=(Status&& rhs) { code_ = rhs.code_; msg_ = std::move(rhs.msg_); detail_ = std::move(rhs.detail_); return *this; } } // namespace milvus::local ================================================ FILE: src/storage/bm25_stats.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "bm25_stats.h" #include "log/Log.h" #include "string_util.hpp" namespace milvus::local { bool BM25Stats::AddTokenDoc(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, const std::map& token_infos) { SQLite::Statement query( *db, "INSERT INTO token_doc_count (collection_name, " "output_field_name, token, doc_count) " "VALUES (?, ?, ?, ?) " "ON CONFLICT(collection_name, output_field_name, token) " "DO UPDATE SET doc_count = doc_count + excluded.doc_count"); try { for (const auto& [token, count] : token_infos) { query.bind(1, collection_name); query.bind(2, output_field_name); query.bind(3, token); query.bind(4, count); query.exec(); query.reset(); } } catch (std::exception& e) { LOG_ERROR("Update bm25 stats failed, err: {}", e.what()); return false; } return true; } bool BM25Stats::DeleteTokenDoc(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, const std::map& token_infos) { SQLite::Statement query( *db, "UPDATE token_doc_count " "SET doc_count = doc_count - ? " "WHERE collection_name = ? AND output_field_name = ? AND token = ?"); try { for (const auto& [token, count] : token_infos) { query.bind(1, count); query.bind(2, collection_name); query.bind(3, output_field_name); query.bind(4, token); query.exec(); query.reset(); } } catch (std::exception& e) { LOG_ERROR("Update bm25 stats failed, err: {}", e.what()); return false; } return true; } int32_t BM25Stats::GetTokenDocCount(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, uint32_t token) { try { SQLite::Statement query( *db, "SELECT doc_count FROM token_doc_count WHERE collection_name = ? " "AND output_field_name = ? AND token = ?"); query.bind(1, collection_name); query.bind(2, output_field_name); query.bind(3, token); if (query.executeStep()) { return query.getColumn(0).getInt(); } return 0; } catch (const SQLite::Exception& e) { LOG_ERROR("Failed to get token doc count, err: {} ", e.what()); return -1; } return -1; } std::pair BM25Stats::GetTokenNumAndDocNum(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name) { try { SQLite::Statement query( *db, "SELECT token_num, doc_num FROM bm25_stats " "WHERE collection_name = ? AND output_field_name = ?"); query.bind(1, collection_name); query.bind(2, output_field_name); if (query.executeStep()) { return std::make_pair(query.getColumn(0).getInt(), query.getColumn(1).getInt()); } return std::make_pair(0, -1); } catch (const SQLite::Exception& e) { LOG_ERROR("Failed to get token num and doc num, err: {} ", e.what()); return std::make_pair(0, -1); } } bool BM25Stats::DeleteBM25Stats(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, uint32_t token_num, int32_t doc_num) { try { SQLite::Statement query( *db, "UPDATE bm25_stats " "SET token_num = token_num - ?, " "doc_num = doc_num - ?" "WHERE collection_name = ? AND output_field_name = ?"); query.bind(1, token_num); query.bind(2, doc_num); query.bind(3, collection_name); query.bind(4, output_field_name); query.exec(); return true; } catch (const SQLite::Exception& e) { LOG_ERROR("Failed to updata bm25 stats: {}", e.what()); return false; } } bool BM25Stats::AddBM25Stats(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, uint32_t token_num, int32_t doc_num) { try { SQLite::Statement query( *db, "INSERT INTO bm25_stats (collection_name, " "output_field_name, token_num, doc_num) " "VALUES (?, ?, ?, ?) " "ON CONFLICT(collection_name, output_field_name) " "DO UPDATE SET " "token_num = token_num + excluded.token_num, " "doc_num = doc_num + excluded.doc_num"); query.bind(1, collection_name); query.bind(2, output_field_name); query.bind(3, static_cast(token_num)); query.bind(4, doc_num); query.exec(); return true; } catch (const SQLite::Exception& e) { LOG_ERROR("Failed to updata bm25 stats: {}", e.what()); return false; } } bool BM25Stats::CreateTables(SQLite::Database* db) { auto table_create_cmd = R"( CREATE TABLE IF NOT EXISTS bm25_stats ( id INTEGER PRIMARY KEY AUTOINCREMENT, collection_name VARCHAR(1000), output_field_name VARCHAR(1000), token_num INTEGER, doc_num INTEGER, UNIQUE (collection_name, output_field_name) ); CREATE TABLE IF NOT EXISTS token_doc_count ( id INTEGER PRIMARY KEY AUTOINCREMENT, collection_name VARCHAR, output_field_name VARCHAR, token INTEGER, doc_count INTEGER, UNIQUE (collection_name, output_field_name, token) ); )"; if (db->tryExec(table_create_cmd) != 0) { const char* err = db->getErrorMsg(); LOG_ERROR("Create table failed, errs: {}", err); return false; } return true; } bool BM25Stats::DropCollectionStats(SQLite::Database* db, const std::string& collection_name) { try { { SQLite::Statement query(*db, "DELETE FROM bm25_stats " "WHERE collection_name=?"); query.bind(1, collection_name); query.exec(); } { SQLite::Statement query(*db, "DELETE FROM token_doc_count " "WHERE collection_name=?"); query.bind(1, collection_name); query.exec(); } return true; } catch (const SQLite::Exception& e) { LOG_ERROR("Clear collection {}'s bm25 stats failed, {}", collection_name, e.what()); return false; } } } // namespace milvus::local ================================================ FILE: src/storage/bm25_stats.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. /* * * Table: bm25_stats * +---------+----------------+------------------+-----------+---------+ * | id | collection_name| output_field_name| token_num | rows_num| * +---------+----------------+------------------+-----------+---------+ * | INTEGER | VARCHAR (PK) | VARCHAR (PK) | INTEGER | INTEGER | * +----------------+------------------+-----------+---------+---------+ * * Table: token_doc_count * +---------+----------------+------------------+-----------+---------+ * | id | collection_name| output_field_name| token |doc_count| * +---------+----------------+------------------+-----------+---------+ * | INTEGER | VARCHAR (PK) | VARCHAR (PK) | INTEGER | INTEGER | * +----------------+------------------+-----------+---------+---------+ */ #pragma once #include #include "common.h" #include "SQLiteCpp/Database.h" namespace milvus::local { class BM25Stats { public: bool AddTokenDoc(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, const std::map& token_infos); bool DeleteTokenDoc(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, const std::map& token_infos); int32_t GetTokenDocCount(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, uint32_t token); std::pair GetTokenNumAndDocNum(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name); bool AddBM25Stats(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, uint32_t token_num, int32_t doc_num); bool DeleteBM25Stats(SQLite::Database* db, const std::string& collection_name, const std::string& output_field_name, uint32_t token_num, int32_t doc_num); bool DropCollectionStats(SQLite::Database* db, const std::string& collection_name); bool CreateTables(SQLite::Database* db); }; } // namespace milvus::local ================================================ FILE: src/storage/collection_data.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "collection_data.h" #include // #include #include #include #include #include #include "string_util.hpp" #include "log/Log.h" namespace milvus::local { CollectionData::CollectionData(const char* collection_name) : collection_name_(collection_name), col_id_("id"), col_milvus_id_("milvus_id"), col_data_("data") { } CollectionData::~CollectionData() { } std::string CollectionData::GetTableCreateSql() { return string_util::SFormat( "CREATE TABLE IF NOT EXISTS \"{}\" ({} INTEGER PRIMARY KEY, {} " "VARCHAR(1024), {} BLOB);", collection_name_, col_id_, col_milvus_id_, col_data_); } bool CollectionData::CreateCollection(SQLite::Database* db) { const std::string table_create_sql = GetTableCreateSql(); if (db->tryExec(table_create_sql) != 0) { const char* err = db->getErrorMsg(); LOG_ERROR("Create table {} failed, errs: {}", collection_name_, err); return false; } return true; } bool CollectionData::DropCollection(SQLite::Database* db) { // DROP TABLE {collection_name_} std::string drop_sql = string_util::SFormat("DROP TABLE '{}'", collection_name_); if (db->tryExec(drop_sql) != 0) { const char* err = db->getErrorMsg(); LOG_ERROR("Drop collection {} failed, errs: {}", collection_name_, err); return false; } return true; } int CollectionData::Insert(SQLite::Database* db, const std::string& milvus_id, const std::string& data) { std::string insert_sql = string_util::SFormat( "INSERT INTO \"{}\" VALUES (NULL, ?, ?)", collection_name_); try { SQLite::Statement query(*db, insert_sql); SQLite::bind(query, milvus_id, data); return query.exec(); } catch (std::exception& e) { LOG_ERROR("Insert data failed, errs: {}", e.what()); return -1; } } bool CollectionData::GetByIDs(SQLite::Database* db, const std::vector& milvus_ids, std::vector* rows) { std::stringstream ss; for (size_t i = 0; i < milvus_ids.size(); i++) { ss << "'" << milvus_ids[i] << "'"; if (i < milvus_ids.size() - 1) ss << ","; } std::string select_sql = string_util::SFormat("SELECT {},{} FROM '{}' WHERE {} IN ({})", col_milvus_id_, col_data_, collection_name_, col_milvus_id_, ss.str()); try { SQLite::Statement query(*db, select_sql); while (query.executeStep()) { rows->push_back(std::make_tuple(query.getColumn(0).getString(), query.getColumn(1).getString())); } return true; } catch (std::exception& e) { LOG_ERROR("Get by ids failed, errs: {}", e.what()); return false; } } void CollectionData::Load(SQLite::Database* db, int64_t start, int64_t limit, std::vector* output_rows) { // SELECT {col_data_} from {collection_name_} LIMIT {limit} OFFSET {start} std::string select_sql = string_util::SFormat("SELECT {} from '{}' LIMIT {} OFFSET {}", col_data_, collection_name_, limit, start); try { SQLite::Statement query(*db, select_sql); while (query.executeStep()) { output_rows->push_back(query.getColumn(0).getString()); } } catch (std::exception& e) { LOG_ERROR("Load data failed, errs: {}", e.what()); } } int CollectionData::Delete(SQLite::Database* db, const std::vector& milvus_ids) { // DELETE FROM {collection_name_} WHERE {col_milvus_id} in ({}) std::stringstream ss; for (size_t i = 0; i < milvus_ids.size(); i++) { ss << "'" << milvus_ids[i] << "'"; if (i < milvus_ids.size() - 1) ss << ","; } std::string delete_sql = string_util::SFormat("DELETE FROM '{}' WHERE {} IN ({})", collection_name_, col_milvus_id_, ss.str()); try { SQLite::Statement query(*db, delete_sql); return query.exec(); } catch (std::exception& e) { LOG_ERROR("Delete data failed, errs: {}", e.what()); return -1; } } int64_t CollectionData::Count(SQLite::Database* db) { // SELECT count(*) FROM {}; std::string count_sql = string_util::SFormat("SELECT count(*) FROM '{}'", collection_name_); try { SQLite::Statement query(*db, count_sql); query.executeStep(); return query.getColumn(0).getInt64(); } catch (std::exception& e) { LOG_ERROR("count data failed, errs: {}", e.what()); return -1; } } } // namespace milvus::local ================================================ FILE: src/storage/collection_data.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. /* collection data table ──────┬─────────────┬──────────── id │ milvus_id │ data │ │ │ │ ──────┼─────────────┼──────────── 1 │ 1234 │ xxxx │ │ ──────┼─────────────┼──────────── │ │ 2 │ 1235 │ xxxx │ │ ──────┼─────────────┼──────────── │ │ 3 │ 1236 │ xxxx │ │ ───────┼─────────────┼──────────── │ │ 4 │ 1237 │ xxxx │ │ ───────┼─────────────┼──────────── │ │ 5 │ 1238 │ xxxx │ │ │ │ ──────┴─────────────┴──────────── */ #pragma once #include #include #include #include #include "type.h" #include "common.h" namespace milvus::local { class CollectionData final : NonCopyableNonMovable { public: explicit CollectionData(const char*); virtual ~CollectionData(); public: int Insert(SQLite::Database* db, const std::string& milvus_id, const std::string& data); int Delete(SQLite::Database* db, const std::vector& milvus_ids); // int // upsert(SQLite::Database* db, std::string& milvus_id, const std::string& data); // const char* // get(SQLite::Database* db, const std::string& milvus_id); bool GetByIDs(SQLite::Database* db, const std::vector& milvus_ids, std::vector* rows); void Load(SQLite::Database* db, int64_t start, int64_t limit, std::vector* output_rows); bool CreateCollection(SQLite::Database* db); bool DropCollection(SQLite::Database* db); const std::string& GetTableName() { return collection_name_; } int64_t Count(SQLite::Database* db); private: std::string GetTableCreateSql(); private: const std::string collection_name_; // table column name const std::string col_id_; const std::string col_milvus_id_; const std::string col_data_; }; } // namespace milvus::local ================================================ FILE: src/storage/collection_meta.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "collection_meta.h" #include // #include #include #include #include #include "log/Log.h" #include "string_util.hpp" namespace milvus::local { const std::string kSchemaStr = "schema"; const std::string kIndexStr = "index"; const std::string kPartitionStr = "PARTITION"; CollectionMeta::CollectionMeta() : table_meta_name_("collection_meta"), col_id_("id"), col_collection_name_("collection_name"), col_meta_type_("meta_type"), col_blob_field_("blob_field"), col_string_field_("string_field") { } CollectionMeta::~CollectionMeta() { } bool CollectionMeta::LoadMeta(SQLite::Database* db) { // SELECT * FROM {table_meta_name_} std::string load_cmd = string_util::SFormat("SELECT * FROM {}", table_meta_name_); try { SQLite::Statement query(*db, load_cmd); while (query.executeStep()) { auto collection_name = query.getColumn(1).getString(); LOG_INFO("Load {}'s meta", collection_name); if (collections_.find(collection_name) == collections_.end()) { collections_.emplace(collection_name, std::make_unique()); } auto meta_type = query.getColumn(2).getString(); if (meta_type == kSchemaStr) { auto info = static_cast(query.getColumn(3).getBlob()); auto pk_name = query.getColumn(4).getString(); collections_[collection_name]->AddSchema(info, pk_name); } else if (meta_type == kIndexStr) { auto info = static_cast(query.getColumn(3).getBlob()); auto index_name = query.getColumn(4).getString(); collections_[collection_name]->AddIndex(index_name, info); } else { LOG_ERROR("Unkown meta data"); return false; } } return true; } catch (std::exception& e) { LOG_ERROR("Load meta data failed, err: {}", e.what()); return false; } } bool CollectionMeta::CreateTable(SQLite::Database* db) { const std::string table_create_cmd = string_util::SFormat( "CREATE TABLE IF NOT EXISTS {} ({} INTEGER PRIMARY KEY, {} " "VARCHAR(1024), {} VARCHAR(1024), {} BLOB, {} " "VARCHAR(1024))", table_meta_name_, col_id_, col_collection_name_, col_meta_type_, col_blob_field_, col_string_field_); if (db->tryExec(table_create_cmd) != 0) { const char* err = db->getErrorMsg(); LOG_ERROR("Create table failed, errs: {}", err); return false; } return true; } bool CollectionMeta::Init(SQLite::Database* db) { return CreateTable(db) && LoadMeta(db); } bool CollectionMeta::CreateCollection(SQLite::Database* db, const std::string& collection_name, const std::string& pk_name, const std::string& schema_proto) { collections_.emplace(collection_name, std::make_unique()); collections_[collection_name]->AddSchema(schema_proto.c_str(), pk_name); // INSERT INTO {table_name} VALUES (NULL, {collection_name}, "schema", {data}, NULL) std::string insert_cmd = string_util::SFormat( "INSERT INTO {} VALUES (NULL, ?, ?, ?, ?)", table_meta_name_); try { SQLite::Statement query(*db, insert_cmd); SQLite::bind(query, collection_name, kSchemaStr, schema_proto, pk_name); return query.exec() == 1; } catch (std::exception& e) { LOG_ERROR("Insert data failed, errs: {}", e.what()); return false; } } const std::string& CollectionMeta::GetCollectionSchema(const std::string& collection_name) { return collections_[collection_name]->Schema(); } bool CollectionMeta::CreateIndex(SQLite::Database* db, const std::string& collection_name, const std::string& index_name, const std::string& index_proto) { // INSERT INTO {table_name} VALUES (NULL, {collection_name}, "schema", {data}, NULL) collections_[collection_name]->AddIndex(index_name, index_proto.c_str()); std::string insert_cmd = string_util::SFormat( "INSERT INTO {} VALUES (NULL, ?, 'index', ?, ?)", table_meta_name_); try { SQLite::Statement query(*db, insert_cmd); SQLite::bind(query, collection_name, index_proto, index_name); return query.exec() == 1; } catch (std::exception& e) { LOG_ERROR("Add index failed, err: {}", e.what()); return false; } } bool CollectionMeta::GetCollectionIndex(const std::string& collection_name, const std::string& index_name, std::string* output_index_info) { return collections_[collection_name]->GetIndex(index_name, output_index_info); } void CollectionMeta::GetAllIndex(const std::string& collection_name, const std::string& exclude, std::vector* all_index) { collections_[collection_name]->GetAllIndexs(all_index, exclude); } bool CollectionMeta::DropCollection(SQLite::Database* db, const std::string& collection_name) { // DELETE FROM {table_name} WHERE {col_collection_name_}={collection_name}; std::string delete_cmd = string_util::SFormat( "DELETE FROM {} WHERE " "{}='{}'", table_meta_name_, col_collection_name_, collection_name); try { collections_.erase(collection_name); db->exec(delete_cmd); return true; } catch (std::exception& e) { LOG_ERROR( "Drop collection: {} failed, err: {}", collection_name, e.what()); return false; } } bool CollectionMeta::DropIndex(SQLite::Database* db, const std::string& collection_name, const std::string& index_name) { // DELETE FROM {table_name} WHERE {col_collection_name_}={collection_name} and {col_meta_type_}={kIndexStr} and {col_string_field_}={index_name}; std::string drop_index_cmd = string_util::SFormat( "DELETE FROM {} WHERE " "{}='{}' and {}='{}' and {}='{}'", table_meta_name_, col_collection_name_, collection_name, col_meta_type_, kIndexStr, col_string_field_, index_name); try { collections_[collection_name]->DropIndex(index_name); db->exec(drop_index_cmd); return true; } catch (std::exception& e) { LOG_ERROR("Drop collection {}'s index:{} failed, err: {}", collection_name, index_name, e.what()); return false; } } } // namespace milvus::local ================================================ FILE: src/storage/collection_meta.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. /* meta table ──────┬───────────────────┬─────────────┬─────────────┬──────────────── id │ collection_name │ meta_type │ blob_field │ string_field │ │ │ │ │ │ │ │ ──────┼───────────────────┼─────────────┼─────────────┼──────────────── 1 │ collection1 │ schema │ xxx │ pk_name │ │ │ │ ──────┼───────────────────┼─────────────┼─────────────┼──────────────── │ │ │ │ 2 │ collection1 │ index │ xxx │ index1 │ │ │ │ ──────┼───────────────────┼─────────────┼─────────────┼──────────────── │ │ │ │ 3 │ collection1 │ index │ xxx │ index2 │ │ │ │ ──────┼───────────────────┼─────────────┼─────────────┼──────────────── │ │ │ │ 4 │ collection1 │ partition │ null │ p1 │ │ │ │ ──────┼───────────────────┼─────────────┼─────────────┼──────────────── │ │ │ │ 5 │ collction2 │ schema │ xxx │ pk_name │ │ │ │ ──────┴───────────────────┴─────────────┴─────────────┴──────────────── */ #pragma once #include #include #include #include #include #include #include "SQLiteCpp/Database.h" #include "log/Log.h" namespace milvus::local { using SchemaInfo = std::string; using IndexInfo = std::map; /* * CollectionMeta stores metadata about all collections. The data is written to sqlite3 and a copy is saved in memory. * Checks such as whether a collection exists are all in storage, and CollectionMeta no longer performs related checks. */ class CollectionMeta final { public: class CollectionInfo { public: CollectionInfo() = default; ~CollectionInfo() = default; CollectionInfo(const CollectionInfo&) = delete; CollectionInfo& operator=(const CollectionInfo&) = delete; CollectionInfo(const CollectionInfo&&) = delete; CollectionInfo& operator=(const CollectionInfo&&) = delete; public: void AddSchema(const char* info, const std::string& pk_name) { schema_info_.assign(info); pk_name_ = pk_name; } const std::string& Schema() { return schema_info_; } bool AddIndex(const std::string& index_name, const char* index) { if (index_info_.find(index_name) != index_info_.end()) { LOG_ERROR("Index: {} already exist", index_name); return false; } index_info_.emplace(index_name, index); return true; } bool GetIndex(const std::string& index_name, std::string* index) { if (index_info_.find(index_name) == index_info_.end()) { return false; } index->assign(index_info_[index_name].c_str()); return true; } void GetAllIndexs(std::vector* all_index, const std::string& exclude) { for (const auto& pair : index_info_) { if (pair.first != exclude) all_index->push_back(pair.second); } } bool HasIndex(const std::string& index_name) { return index_info_.find(index_name) != index_info_.end(); } bool DropIndex(const std::string& index_name) { if (!HasIndex(index_name)) { return true; } index_info_.erase(index_name); return true; } const std::string& GetPkName() { return pk_name_; } private: IndexInfo index_info_; SchemaInfo schema_info_; std::string pk_name_; }; public: CollectionMeta(); ~CollectionMeta(); public: CollectionMeta(const CollectionMeta&) = delete; CollectionMeta& operator=(const CollectionMeta&) = delete; CollectionMeta(const CollectionMeta&&) = delete; CollectionMeta& operator=(const CollectionMeta&&) = delete; public: bool Init(SQLite::Database* db); bool CreateCollection(SQLite::Database* db, const std::string& collection_name, const std::string& pk_name, const std::string& schema_proto); const std::string& GetCollectionSchema(const std::string& collection_name); bool CreateIndex(SQLite::Database* db, const std::string& collection_name, const std::string& index_name, const std::string& index_proto); void GetAllIndex(const std::string& collection_name, const std::string& exclude, std::vector* all_index); bool HasIndex(const std::string& collection_name, const std::string& index_name) { return collections_[collection_name]->HasIndex(index_name); } bool DropIndex(SQLite::Database* db, const std::string& collection_name, const std::string& index_name); bool GetCollectionIndex(const std::string& collection_name, const std::string& index_name, std::string* ouput_index_info); std::string GetPkName(const std::string& collection_name) { return collections_[collection_name]->GetPkName(); } void CollectionNames(std::vector* collection_names) { for (const auto& pair : collections_) { collection_names->push_back(pair.first); } } bool DropCollection(SQLite::Database* db, const std::string& collection_name); private: bool CreateTable(SQLite::Database* db); bool LoadMeta(SQLite::Database* db); // std::string // schema_info(const std::string& collection_name); private: // collection meta std::map> collections_; private: // sqlite3 table info const std::string table_meta_name_; // table column name const std::string col_id_; const std::string col_collection_name_; const std::string col_meta_type_; const std::string col_blob_field_; const std::string col_string_field_; }; } // namespace milvus::local ================================================ FILE: src/storage/storage.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "storage.h" #include #include #include #include #include #include #include #include #include "collection_data.h" #include "log/Log.h" #include "pb/schema.pb.h" #include "segcore.pb.h" #include "storage/bm25_stats.h" #include "storage/collection_meta.h" #include "type.h" namespace milvus::local { Storage::Storage(const char* db_file) : db_file_(db_file) { } Storage::~Storage() { } bool Storage::Open() { try { db_ptr_ = std::make_unique( db_file_, SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE | SQLite::OPEN_FULLMUTEX); SQLite::Transaction transaction(*db_ptr_.get()); if (!cm_.Init(db_ptr_.get())) { return false; } std::vector names; cm_.CollectionNames(&names); for (const auto& name : names) { collections_.emplace( name, std::make_unique(name.c_str())); } bm25_stats_ = std::unique_ptr(new BM25Stats()); if (!bm25_stats_->CreateTables(db_ptr_.get())) { return false; } transaction.commit(); return true; } catch (std::exception& e) { LOG_ERROR("Open storage failed, err: {}", e.what()); return false; } } bool Storage::CreateCollection(const std::string& collection_name, const std::string& pk_name, const std::string& schema_proto) { SQLite::Transaction transaction(*db_ptr_.get()); if (!cm_.CreateCollection( db_ptr_.get(), collection_name, pk_name, schema_proto)) { return false; } auto data_ptr = std::make_unique(collection_name.c_str()); if (!data_ptr->CreateCollection(db_ptr_.get())) { return false; } collections_[collection_name] = std::move(data_ptr); transaction.commit(); return true; } bool Storage::DropCollection(const std::string& collection_name) { SQLite::Transaction transaction(*db_ptr_.get()); if (!cm_.DropCollection(db_ptr_.get(), collection_name)) { LOG_ERROR("Delete collection: {}'s meta failed", collection_name); return false; } if (!collections_[collection_name]->DropCollection(db_ptr_.get())) { LOG_ERROR("Delete collection: {}'s data failed", collection_name); return false; } collections_.erase(collection_name); if (!bm25_stats_->DropCollectionStats(db_ptr_.get(), collection_name)) { return false; } transaction.commit(); return true; } bool Storage::LoadCollecton(const std::string& collection_name, int64_t start, int64_t size, std::vector* out_rows) { collections_[collection_name]->Load(db_ptr_.get(), start, size, out_rows); return static_cast(out_rows->size()) == size; } bool Storage::GetCollectionSchema(const std::string& collection_name, std::string* output_info_str) { output_info_str->assign(cm_.GetCollectionSchema(collection_name).c_str()); return true; } bool Storage::CreateIndex(const std::string& collection_name, const std::string& index_name, const std::string& index_proto) { SQLite::Transaction transaction(*db_ptr_.get()); if (!cm_.CreateIndex( db_ptr_.get(), collection_name, index_name, index_proto)) { return false; } transaction.commit(); return true; } bool Storage::GetIndex(const std::string& collection_name, const std::string& index_name, std::string* output_index_proto) { return cm_.GetCollectionIndex( collection_name, index_name, output_index_proto); } void Storage::GetAllIndex(const std::string& collection_name, const std::string& exclude, std::vector* index_protos) { cm_.GetAllIndex(collection_name, exclude, index_protos); } bool Storage::DropIndex(const std::string& collection_name, const std::string& index_name) { SQLite::Transaction transaction(*db_ptr_.get()); if (!cm_.DropIndex(db_ptr_.get(), collection_name, index_name)) { return false; } transaction.commit(); return true; } bool Storage::CollectBM25Stats(const std::vector& rows, const std::vector& bm25_field_names, std::map* stats) { for (const auto& field_name : bm25_field_names) { (*stats)[field_name] = Stats(); (*stats)[field_name].rows_num = rows.size(); } for (const auto& row : rows) { milvus::proto::segcore::InsertRecord r; if (!r.ParseFromString(std::get<1>(row))) { LOG_ERROR("Parse insert record failed"); return false; } std::map field_map; for (const auto& field : r.fields_data()) { if (field.type() == milvus::proto::schema::DataType::SparseFloatVector) { field_map[field.field_name()] = &field; } } for (const auto& field_name : bm25_field_names) { if (field_map.find(field_name) == field_map.end()) { LOG_ERROR("Field {} not found or not sparse vector field", field_name); return false; } // The data has been split by row, so there will only be one sparse vector auto vec = field_map[field_name]->vectors().sparse_float_vector().contents( 0); auto pos = vec.c_str(); auto end = vec.c_str() + vec.size(); for (; pos < end; pos += 8) { const uint32_t token = *(reinterpret_cast(pos)); const float count = *(reinterpret_cast(pos + 4)); (*stats)[field_name].token_doc_count[token] += 1; (*stats)[field_name].token_num += int(count); } } } return true; } int Storage::Insert(const std::string collection_name, const std::vector& rows, const std::vector& bm25_field_names) { SQLite::Transaction transaction(*db_ptr_.get()); if (!bm25_field_names.empty()) { std::map stats; if (!CollectBM25Stats(rows, bm25_field_names, &stats)) { return -1; } for (const auto& [field_name, stats] : stats) { if (!bm25_stats_->AddBM25Stats(db_ptr_.get(), collection_name, field_name, stats.token_num, stats.rows_num)) { return -1; } if (!bm25_stats_->AddTokenDoc(db_ptr_.get(), collection_name, field_name, stats.token_doc_count)) { return -1; } } } for (const auto& row : rows) { if (collections_[collection_name]->Insert(db_ptr_.get(), std::get<0>(row).c_str(), std::get<1>(row)) < 0) { return -1; } } transaction.commit(); return rows.size(); } int Storage::Delete(const std::string collection_name, const std::vector& ids, const std::vector& bm25_field_names) { SQLite::Transaction transaction(*db_ptr_.get()); if (!bm25_field_names.empty()) { std::vector rows; if (!collections_[collection_name]->GetByIDs( db_ptr_.get(), ids, &rows)) { return -1; } std::map stats; if (!CollectBM25Stats(rows, bm25_field_names, &stats)) { return -1; } for (const auto& [field_name, stats] : stats) { if (!bm25_stats_->DeleteBM25Stats(db_ptr_.get(), collection_name, field_name, stats.token_num, stats.rows_num)) { return -1; } if (!bm25_stats_->DeleteTokenDoc(db_ptr_.get(), collection_name, field_name, stats.token_doc_count)) { return -1; } } } int n = collections_[collection_name]->Delete(db_ptr_.get(), ids); transaction.commit(); return n; } int64_t Storage::Count(const std::string& collection_name) { SQLite::Transaction transaction(*db_ptr_.get()); int64_t n = collections_[collection_name]->Count(db_ptr_.get()); transaction.commit(); return n; } } // namespace milvus::local ================================================ FILE: src/storage/storage.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include #include "collection_data.h" #include "collection_meta.h" #include "bm25_stats.h" namespace milvus::local { class CollectionMeta; class CollectionData; struct Stats { Stats() = default; ~Stats() = default; std::map token_doc_count; int32_t token_num = 0; int32_t rows_num = 0; }; class Storage final { public: explicit Storage(const char* db_file); ~Storage(); Storage(const Storage&) = delete; Storage& operator=(const Storage&) = delete; Storage(const Storage&&) = delete; Storage& operator=(const Storage&&) = delete; public: bool Open(); bool CreateCollection(const std::string& collection_name, const std::string& pk_name, const std::string& schema_proto); bool DropCollection(const std::string& collection_name); void ListCollections(std::vector* collection_names) { cm_.CollectionNames(collection_names); } /* * * @brief Read collection data * * @collection collection name * @size The number of rows to read at a time * @out_rows Output, if the size of out_rows is less than the size of the parameter, it means that the data has been read */ bool LoadCollecton(const std::string& collection_name, int64_t start, int64_t size, std::vector* out_rows); bool CreateIndex(const std::string& collection_name, const std::string& index_name, const std::string& index_proto); bool GetIndex(const std::string& collection_name, const std::string& index_name, std::string* output_index_proto); bool DropIndex(const std::string& collection_name, const std::string& index_name); void GetAllIndex(const std::string& collection_name, const std::string& exclude, std::vector* index_protos); bool HasIndex(const std::string& collection_name, const std::string& index_name) { return cm_.HasIndex(collection_name, index_name); } std::string GetPrimaryKey(const std::string& collection_name) { return cm_.GetPkName(collection_name); } bool GetCollectionSchema(const std::string& collection_name, std::string* output_info_str); // data interface int Insert(const std::string collection_name, const std::vector& rows, const std::vector& bm25_field_names); int Delete(const std::string collection_name, const std::vector& ids, const std::vector& bm25_field_names); bool CollectionExist(const std::string& collection_name) { return collections_.find(collection_name) != collections_.end(); } int64_t Count(const std::string& collection_name); std::pair GetBM25TokenAndDocCount(const std::string& collection_name, const std::string& field_name) { return bm25_stats_->GetTokenNumAndDocNum( db_ptr_.get(), collection_name, field_name); } int32_t GetTokenNQ(const std::string& collection_name, const std::string& field_name, uint32_t token) { return bm25_stats_->GetTokenDocCount( db_ptr_.get(), collection_name, field_name, token); } private: bool CollectBM25Stats(const std::vector& rows, const std::vector& bm25_field_names, std::map* stats); private: CollectionMeta cm_; std::map> collections_; std::unique_ptr bm25_stats_; private: std::unique_ptr db_ptr_; const char* db_file_; }; } // namespace milvus::local ================================================ FILE: src/string_util.hpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include #include #include #include #include namespace milvus::local { namespace string_util { inline std::string ToLower(const std::string& str) { std::string lower_str; std::transform(str.begin(), str.end(), std::back_inserter(lower_str), [](unsigned char c) { return std::tolower(c); }); return lower_str; } inline std::string ToUpper(const std::string& str) { std::string upper_str; std::transform(str.begin(), str.end(), std::back_inserter(upper_str), [](unsigned char c) { return std::toupper(c); }); return upper_str; } inline std::string Trim(const std::string& str) { size_t first = str.find_first_not_of(" \t\n\r\f\v"); if (std::string::npos == first) return ""; size_t last = str.find_last_not_of(" \t\n\r\f\v"); return str.substr(first, (last - first + 1)); } template inline std::string SFormat(const std::string& str, Args&&... args) { return folly::sformat(str, args...); } template inline std::string Join(const Delim& delimiter, const Container& container) { return folly::join(delimiter, container); } inline bool IsAlpha(char c) { if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z')) { return false; } return true; } inline std::string GenRandomString(const char* prefix) { const std::string CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); std::mt19937 generator(seed); std::uniform_int_distribution distribution(0, CHARACTERS.size() - 1); std::ostringstream oss; oss << prefix << '-'; for (size_t i = 0; i < 8; ++i) { int random_number = distribution(generator); oss << CHARACTERS[random_number]; } return oss.str(); } inline std::pair ToNumber(const std::string& s) { try { size_t pos; auto n = std::stof(s, &pos); return std::make_pair(pos == s.length(), n); } catch (std::exception& e) { return std::make_pair(false, 0.0); } } } // namespace string_util } // namespace milvus::local ================================================ FILE: src/timer.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include #include "timer.h" namespace milvus::local { thread_local Timer g_timer; void InitializeTimer(const std::string& uid) { g_timer.Start(uid); } void RecordEvent(const std::string& label) { g_timer.DoRecord(label); } void PrintTimerRecords() { g_timer.Print(); } void StopTimer() { g_timer.Stop(); } } // namespace milvus::local ================================================ FILE: src/timer.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include #include #include #include "log/Log.h" namespace milvus::local { using Record = std::tuple; class Timer { public: Timer() : start_(false) { } void Start(const std::string& uid) { if (start_) { return; } start_ = true; start_time_ = std::chrono::high_resolution_clock::now(); uid_ = uid; } void DoRecord(const std::string& label) { if (!start_) { return; } auto now = std::chrono::high_resolution_clock::now(); time_record_.emplace_back(label, now); } void Print() const { if (!start_) { return; } auto pre_time = start_time_; const auto& [_, time_point] = time_record_.back(); LOG_INFO("uid: {} TOTAL duration:{} microseconds ", uid_, std::chrono::duration_cast( time_point - start_time_) .count()); for (const auto& record : time_record_) { const auto& [label, time_point] = record; auto duration = std::chrono::duration_cast( time_point - pre_time) .count(); LOG_INFO( "uid: {} {} Duration:{} microseconds ", uid_, label, duration); pre_time = time_point; } } void Stop() { if (!start_) { return; } time_record_.clear(); uid_ = ""; start_ = false; } private: bool start_; std::chrono::high_resolution_clock::time_point start_time_; std::vector time_record_; std::string uid_; }; void InitializeTimer(const std::string& uid); void RecordEvent(const std::string& label); void PrintTimerRecords(); void StopTimer(); } // namespace milvus::local ================================================ FILE: src/type.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include namespace milvus::local { using Row = std::tuple; using Rows = std::vector; } // namespace milvus::local ================================================ FILE: src/unittest/CMakeLists.txt ================================================ # Copyright (C) 2019-2024 Zilliz. 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 find_package(GTest REQUIRED) include_directories(${GTest_INCLUDES}) find_program(PYTHON_EXECUTABLE NAMES python python3) include_directories(${CMAKE_CURRENT_LIST_DIR}) set(MILVUS_LOCAL_TEST_DEPS milite GTest::gtest GTest::gtest_main ) add_executable( milvus_proxy_test milvus_proxy_test.cpp test_util.cpp ) target_link_libraries(milvus_proxy_test PRIVATE ${MILVUS_LOCAL_TEST_DEPS} ) add_test( NAME milvus_proxy_test COMMAND $ ) add_executable( server_test grpc_server_test.cpp test_util.cpp ) target_link_libraries( server_test PRIVATE milvus_service ${MILVUS_LOCAL_TEST_DEPS} ) add_test( NAME storage_test COMMAND $ ) add_executable( storage_test storage_test.cpp ) target_link_libraries( storage_test PRIVATE ${MILVUS_LOCAL_TEST_DEPS} ) add_executable( bm25_function_test bm25_function_test.cpp test_util.cpp ) target_link_libraries(bm25_function_test PRIVATE ${MILVUS_LOCAL_TEST_DEPS} ) add_test( NAME bm25_function_test COMMAND $ ) add_test( NAME server_test COMMAND $ ) add_test( NAME run_examples COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/run_examples.py ) set_tests_properties(run_examples PROPERTIES ENVIRONMENT "BIN_PATH=${CMAKE_BINARY_DIR}/lib;PYTHONPATH=${CMAKE_SOURCE_DIR}/python/src" ) ================================================ FILE: src/unittest/bm25_function_test.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include #include "function/bm25_function.h" #include "test_util.h" namespace milvus::local::function { namespace test { using namespace milvus::local::test; using function = milvus::local::function::BM25Function; TEST(BM25FunctionTest, normal) { auto coll_str = CreateCollection("test", "sparse_vector"); milvus::proto::schema::CollectionSchema schema; schema.ParseFromString(coll_str); ::milvus::proto::schema::FunctionSchema fschema; fschema.ParseFromString( CreateBM25Function("bm25", VARCHAR_SCALAR_NAME, SPARSE_VEC)); auto [s, f] = BM25Function::NewBM25Function(&schema, &fschema); EXPECT_TRUE(s.IsOk()); { milvus::proto::common::PlaceholderGroup input_plg; auto plg = input_plg.add_placeholders(); plg->set_type(::milvus::proto::common::PlaceholderType::VarChar); for (int i = 0; i < 10; i++) { auto v = plg->add_values(); v->assign("doc"); } milvus::proto::common::PlaceholderGroup output_plg; f->ProcessSearch(input_plg, &output_plg); EXPECT_EQ(output_plg.placeholders(0).values_size(), 10); EXPECT_EQ(output_plg.placeholders(0).type(), ::milvus::proto::common::PlaceholderType::SparseFloatVector); } { std::vector inputs; milvus::proto::schema::FieldData text_field; text_field.set_field_name(VARCHAR_SCALAR_NAME); text_field.set_is_dynamic(false); text_field.set_type(::milvus::proto::schema::DataType::VarChar); for (int i = 0; i < 10; i++) { text_field.mutable_scalars()->mutable_string_data()->add_data( "doc"); } inputs.push_back(&text_field); std::vector outputs; f->ProcessInsert(inputs, &outputs); EXPECT_EQ(outputs.size(), 1); EXPECT_EQ(outputs[0].type(), ::milvus::proto::common::PlaceholderType::SparseFloatVector); EXPECT_EQ(outputs[0].vectors().sparse_float_vector().dim(), 1); } } } // namespace test } // namespace milvus::local::function ================================================ FILE: src/unittest/grpc_server_test.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "log/Log.h" #include "milvus_service_impl.h" #include "pb/milvus.pb.h" #include "test_util.h" #include #include #include #include "status.h" namespace milvus::local { namespace test { const char* tmp_db_name = "server_test.db"; TEST(MilvusServiceImplTest, create_collection) { const char* collection_name = "test_collection"; { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; // drop auto drop_r = GetDropCollectionRequest(collection_name); service.DropCollection(&server_context, &drop_r, &response); auto r = GetCreateCollectionRequestProto(collection_name); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); } { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; // collection alread exists auto r = GetCreateCollectionRequestProto(collection_name); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); auto lr = GetLoadCollectionRequestProto(collection_name); service.LoadCollection(&server_context, &lr, &response); EXPECT_EQ(response.code(), 0); auto new_lr = GetLoadCollectionRequestProto("not_exist"); service.LoadCollection(&server_context, &new_lr, &response); EXPECT_EQ(response.code(), ErrCollectionNotFound); } } TEST(MilvusServiceImplTest, CreateIndex) { const char* collection_name = "test_collection"; ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; auto drop_r = GetDropCollectionRequest(collection_name); service.DropCollection(&server_context, &drop_r, &response); auto r = GetCreateCollectionRequestProto(collection_name); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); { auto r = GetCreateIndexRequestProto(collection_name, "test_index", VEC_NAME); service.CreateIndex(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); service.CreateIndex(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); } { auto r = GetCreateIndexRequestProto("not_exist", "test_index", VEC_NAME); service.CreateIndex(&server_context, &r, &response); EXPECT_EQ(response.code(), ErrCollectionNotFound); } } TEST(MilvusServiceImplTest, Insert) { const char* collection_name = "test_collection"; ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; auto drop_r = GetDropCollectionRequest(collection_name); service.DropCollection(&server_context, &drop_r, &response); auto r = GetCreateCollectionRequestProto(collection_name); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); { auto insert_requst = GetInsertRequestProto(collection_name, 3); ::milvus::proto::milvus::MutationResult insert_response; service.Insert(&server_context, &insert_requst, &insert_response); EXPECT_EQ(insert_response.insert_cnt(), 3); EXPECT_EQ(insert_response.status().code(), 0); } } TEST(MilvusServiceImplTest, Upsert) { const char* collection_name = "test_collection"; ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; auto drop_r = GetDropCollectionRequest(collection_name); service.DropCollection(&server_context, &drop_r, &response); auto r = GetCreateCollectionRequestProto(collection_name); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); { auto upsert_requst = GetUpsertRequestProto(collection_name, 3); ::milvus::proto::milvus::MutationResult upsert_response; service.Upsert(&server_context, &upsert_requst, &upsert_response); EXPECT_EQ(upsert_response.upsert_cnt(), 3); EXPECT_EQ(upsert_response.status().code(), 0); } { auto upsert_requst = GetUpsertRequestProto(collection_name, 5); ::milvus::proto::milvus::MutationResult upsert_response; service.Upsert(&server_context, &upsert_requst, &upsert_response); EXPECT_EQ(upsert_response.upsert_cnt(), 5); EXPECT_EQ(upsert_response.status().code(), 0); } { auto query_req = GetQueryRequestProto(collection_name, "id in [1, 2, 3, 4, 5, 6, 7]", "10", "0", std::vector{"id"}); ::milvus::proto::milvus::QueryResults query_result; service.Query(&server_context, &query_req, &query_result); EXPECT_EQ( query_result.fields_data()[0].scalars().long_data().data_size(), 4); } } TEST(MilvusServiceImplTest, Search) { const char* collection_name = "test_collection"; { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; auto drop_r = GetDropCollectionRequest(collection_name); service.DropCollection(&server_context, &drop_r, &response); auto r = GetCreateCollectionRequestProto(collection_name); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); auto insert_requst = GetInsertRequestProto(collection_name, 3); ::milvus::proto::milvus::MutationResult insert_response; service.Insert(&server_context, &insert_requst, &insert_response); EXPECT_EQ(insert_response.insert_cnt(), 3); EXPECT_EQ(insert_response.status().code(), 0); auto index_req = GetCreateIndexRequestProto(collection_name, "test_index", VEC_NAME); service.CreateIndex(&server_context, &index_req, &response); EXPECT_EQ(response.code(), 0); auto search_req = GetSearchRequestProto( collection_name, "id in [1, 2, 3]", std::vector>{{0.1, 0.3, 0.6}, {0.3, 0.3, 0.4}}, "2", "COSINE", "1"); ::milvus::proto::milvus::SearchResults search_result; service.Search(&server_context, &search_req, &search_result); } { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; auto lr = GetLoadCollectionRequestProto(collection_name); service.LoadCollection(&server_context, &lr, &response); EXPECT_EQ(response.code(), 0); auto search_req = GetSearchRequestProto( collection_name, "id in [1, 2, 3]", std::vector>{{0.1, 0.3, 0.6}, {0.3, 0.3, 0.4}}, "2", "COSINE", "1"); ::milvus::proto::milvus::SearchResults search_result; service.Search(&server_context, &search_req, &search_result); } } TEST(MilvusServiceImplTest, Query) { const char* collection_name = "test_collection"; { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; auto drop_r = GetDropCollectionRequest(collection_name); service.DropCollection(&server_context, &drop_r, &response); auto r = GetCreateCollectionRequestProto(collection_name); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); auto insert_requst = GetInsertRequestProto(collection_name, 3); ::milvus::proto::milvus::MutationResult insert_response; service.Insert(&server_context, &insert_requst, &insert_response); EXPECT_EQ(insert_response.insert_cnt(), 3); EXPECT_EQ(insert_response.status().code(), 0); auto query_req = GetQueryRequestProto(collection_name, "id in [1, 2, 3]", "2", "0", std::vector{"id"}); ::milvus::proto::milvus::QueryResults query_result; service.Query(&server_context, &query_req, &query_result); EXPECT_EQ( query_result.fields_data()[0].scalars().long_data().data_size(), 2); } } TEST(MilvusServiceImplTest, Delete) { const char* collection_name = "test_collection"; { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; auto drop_r = GetDropCollectionRequest(collection_name); service.DropCollection(&server_context, &drop_r, &response); auto r = GetCreateCollectionRequestProto(collection_name); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); auto insert_requst = GetInsertRequestProto(collection_name, 10); ::milvus::proto::milvus::MutationResult insert_response; service.Insert(&server_context, &insert_requst, &insert_response); EXPECT_EQ(insert_response.insert_cnt(), 10); EXPECT_EQ(insert_response.status().code(), 0); auto delete_req = GetDeleteRequestProto(collection_name, "id in [1, 2]"); ::milvus::proto::milvus::MutationResult delete_result; service.Delete(&server_context, &delete_req, &delete_result); EXPECT_EQ(delete_result.delete_cnt(), 2); auto query_req = GetQueryRequestProto(collection_name, "id in [1, 2, 3]", "3", "0", std::vector{"id"}); ::milvus::proto::milvus::QueryResults query_result; service.Query(&server_context, &query_req, &query_result); EXPECT_EQ( query_result.fields_data()[0].scalars().long_data().data_size(), 1); } { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; auto lr = GetLoadCollectionRequestProto(collection_name); service.LoadCollection(&server_context, &lr, &response); EXPECT_EQ(response.code(), 0); auto query_req = GetQueryRequestProto(collection_name, "id in [1, 2, 3]", "3", "0", std::vector{"id"}); ::milvus::proto::milvus::QueryResults query_result; service.Query(&server_context, &query_req, &query_result); EXPECT_EQ( query_result.fields_data()[0].scalars().long_data().data_size(), 1); } } TEST(MilvusServiceImplTest, describe_collection) { const char* collection_name = "test_collection"; { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status drop_res; auto drop_r = GetDropCollectionRequest(collection_name); service.DropCollection(&server_context, &drop_r, &drop_res); ::milvus::proto::milvus::DescribeCollectionResponse res; auto r = GetDescribeCollectionRequest(collection_name); service.DescribeCollection(&server_context, &r, &res); EXPECT_EQ(res.status().code(), ErrCollectionNotFound); } { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::common::Status response; auto r = GetCreateCollectionRequestProto(collection_name); service.CreateCollection(&server_context, &r, &response); EXPECT_EQ(response.code(), 0); ::milvus::proto::milvus::DescribeCollectionResponse res; auto dr = GetDescribeCollectionRequest(collection_name); service.DescribeCollection(&server_context, &dr, &res); EXPECT_EQ(res.status().code(), 0); } { ::milvus::local::MilvusServiceImpl service(tmp_db_name); EXPECT_TRUE(service.Init()); ::grpc::ServerContext server_context; ::milvus::proto::milvus::DescribeCollectionResponse res; auto dr = GetDescribeCollectionRequest(collection_name); service.DescribeCollection(&server_context, &dr, &res); EXPECT_EQ(res.status().code(), 0); } } } // namespace test } // namespace milvus::local ================================================ FILE: src/unittest/milvus_local_test.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "milvus_local.h" #include #include #include #include #include #include "antlr4-runtime.h" #include "parser/parser.h" #include "parser/utils.h" #include "pb/plan.pb.h" #include "pb/schema.pb.h" #include "pb/segcore.pb.h" #include "test_util.h" #include "type.h" namespace milvus::local { namespace test { TEST(MilvusLocal, h) { std::string collection_name("test_schema"); milvus::local::Rows data = CreateData(10); auto schema_str = CreateCollection(); auto index_str = CreateVectorIndex(); std::remove("milvus_data.db"); { MilvusLocal ms("./"); ms.Init(); ms.CreateCollection(collection_name, PK_NAME, schema_str); ms.CreateIndex(collection_name, "test_index", index_str); auto rows = CreateData(20); std::vector ids; ms.Insert(collection_name, rows, &ids); milvus::proto::schema::CollectionSchema schema; schema.ParseFromString(schema_str); // std::cout << schema.DebugString() << std::endl; std::string exprstr("id in [1, 2, 6, 5, 8, 9]"); antlr4::ANTLRInputStream input(exprstr); PlanLexer lexer(&input); antlr4::CommonTokenStream tokens(&lexer); PlanParser parser(&tokens); PlanParser::ExprContext* tree = parser.expr(); auto helper = milvus::CreateSchemaHelper(&schema); milvus::PlanCCVisitor visitor(&helper); auto res = std::any_cast(visitor.visit(tree)); { ::milvus::proto::plan::PlanNode plan; plan.mutable_query()->set_is_count(false); plan.mutable_query()->set_limit(5); plan.mutable_query()->set_allocated_predicates(res.expr); plan.add_output_field_ids(200); plan.add_output_field_ids(202); std::cout << plan.DebugString() << std::endl; RetrieveResult result; ms.Retrieve(collection_name, plan.SerializeAsString(), &result); milvus::proto::segcore::RetrieveResults rs; rs.ParseFromArray(result.retrieve_result_.proto_blob, result.retrieve_result_.proto_size); std::cout << rs.DebugString() << std::endl; } { std::cout << "===============================" << std::endl; ::milvus::proto::plan::PlanNode plan; plan.mutable_vector_anns()->set_field_id(201); plan.mutable_vector_anns()->set_allocated_predicates(res.expr); plan.mutable_vector_anns()->set_placeholder_tag("$0"); plan.mutable_vector_anns()->set_vector_type( ::milvus::proto::plan::VectorType::FloatVector); plan.mutable_vector_anns()->mutable_query_info()->set_topk(3); plan.mutable_vector_anns()->mutable_query_info()->set_metric_type( "IP"); plan.mutable_vector_anns()->mutable_query_info()->set_search_params( "{\"nprobe\": 10}"); plan.mutable_vector_anns()->mutable_query_info()->set_round_decimal( -1); plan.add_output_field_ids(200); plan.add_output_field_ids(202); std::cout << plan.DebugString() << std::endl; milvus::proto::common::PlaceholderGroup raw_group; auto value = raw_group.add_placeholders(); value->set_tag("$0"); value->set_type( milvus::proto::common::PlaceholderType::FloatVector); std::vector vec{0.3, 0.5, 0.2}; value->add_values(vec.data(), vec.size() * sizeof(float)); auto slice_nqs = std::vector{1}; auto slice_topKs = std::vector{3}; SearchResult result(slice_nqs, slice_topKs); ms.Search(collection_name, plan.SerializeAsString(), raw_group.SerializeAsString(), &result); milvus::proto::schema::SearchResultData rz; rz.ParseFromArray(result.result_[0].proto_blob, result.result_[0].proto_size); // std::cout << rz.DebugString() << std::endl; milvus::proto::schema::IDs ids; ids.mutable_int_id()->add_data(0); ids.mutable_int_id()->add_data(1); ids.mutable_int_id()->add_data(2); ms.DeleteByIds(collection_name, ids.SerializeAsString(), 3, std::vector{"0", "1", "2"}); ms.Search(collection_name, plan.SerializeAsString(), raw_group.SerializeAsString(), &result); rz.ParseFromArray(result.result_[0].proto_blob, result.result_[0].proto_size); // std::cout << rz.DebugString() << std::endl; ms.ReleaseCollection(collection_name); } } { MilvusLocal ms("./"); ms.Init(); ms.LoadCollection(collection_name); ms.ReleaseCollection(collection_name); } std::remove("milvus_data.db"); } TEST(MilvusLocal, parser) { auto schema_str = CreateCollection(); milvus::proto::schema::CollectionSchema schema; schema.ParseFromString(schema_str); // std::string exprstr("sc in [1, 2, 3, 4]"); // antlr4::ANTLRInputStream input(exprstr); // PlanLexer lexer(&input); // antlr4::CommonTokenStream tokens(&lexer); // PlanParser parser(&tokens); // PlanParser::ExprContext* tree = parser.expr(); // auto helper = milvus::CreateSchemaHelper(&schema); // milvus::PlanCCVisitor visitor(&helper); // auto res = std::any_cast(visitor.visit(tree)); // std::cout << res.expr->DebugString() << std::endl; // std::cout << "---------------" << std::endl; // std::cout << res.expr->term_expr().DebugString() << std::endl; } } // namespace test } // namespace milvus::local ================================================ FILE: src/unittest/milvus_proxy_test.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "milvus_proxy.h" #include #include #include #include "log/Log.h" #include "pb/milvus.pb.h" #include "pb/schema.pb.h" #include "test_util.h" #include namespace milvus::local { namespace test { const char* tmp_db_name = "test.db"; TEST(MilvusProxyTest, CreateCollection) { const char* collection_name = "test_collection"; { // create new collection ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); EXPECT_FALSE(proxy.Init()); proxy.DropCollection(collection_name); auto cr = GetCreateCollectionRequestProto(collection_name); EXPECT_TRUE(proxy.CreateCollection(&cr).IsOk()); } { // load collection ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); EXPECT_TRUE(proxy.LoadCollection(collection_name).IsOk()); // reload is ok EXPECT_TRUE(proxy.LoadCollection(collection_name).IsOk()); EXPECT_TRUE(proxy.ReleaseCollection(collection_name).IsOk()); EXPECT_TRUE(proxy.ReleaseCollection(collection_name).IsOk()); EXPECT_FALSE(proxy.LoadCollection("not_existed").IsOk()); } } TEST(MilvusProxyTest, CreateIndex) { const char* collection_name = "test_collection"; const char* index_name = "test_index"; ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); proxy.DropCollection(collection_name); auto cr = GetCreateCollectionRequestProto(collection_name); EXPECT_TRUE(proxy.CreateCollection(&cr).IsOk()); { // create new index auto index_req = GetCreateIndexRequestProto(collection_name, index_name, VEC_NAME); EXPECT_TRUE(proxy.CreateIndex(&index_req).IsOk()); EXPECT_TRUE(proxy.CreateIndex(&index_req).IsOk()); } } TEST(MilvusProxyTest, Insert) { const char* collection_name = "test_collection"; ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); proxy.DropCollection(collection_name); auto cr = GetCreateCollectionRequestProto(collection_name); EXPECT_TRUE(proxy.CreateCollection(&cr).IsOk()); { auto data = GetInsertRequestProto(collection_name, 3); ::milvus::proto::schema::IDs ids; proxy.Insert(&data, &ids); EXPECT_EQ(3, ids.int_id().data_size()); } } TEST(MilvusProxyTest, search) { const char* collection_name = "test_collection"; { ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); proxy.DropCollection(collection_name); auto cr = GetCreateCollectionRequestProto(collection_name); EXPECT_TRUE(proxy.CreateCollection(&cr).IsOk()); auto data = GetInsertRequestProto(collection_name, 10); ::milvus::proto::schema::IDs ids; proxy.Insert(&data, &ids); EXPECT_EQ(10, ids.int_id().data_size()); auto index_req = GetCreateIndexRequestProto(collection_name, "vindex", VEC_NAME); EXPECT_TRUE(proxy.CreateIndex(&index_req).IsOk()); auto search_req = GetSearchRequestProto( collection_name, "id in [1, 2, 3]", std::vector>{{-1.0, 0.0, 0.0}, {0.0, 0.0, 1.0}}, "2", "IP", "1"); ::milvus::proto::milvus::SearchResults search_result; EXPECT_TRUE(proxy.Search(&search_req, &search_result).IsOk()); // return ids: 2, 3, 2, 1 EXPECT_EQ(search_result.results().ids().int_id().data(0), 2); EXPECT_EQ(search_result.results().ids().int_id().data(1), 3); EXPECT_EQ(search_result.results().ids().int_id().data(2), 2); EXPECT_EQ(search_result.results().ids().int_id().data(3), 1); } { ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); EXPECT_TRUE(proxy.LoadCollection(collection_name).IsOk()); auto search_req = GetSearchRequestProto( collection_name, "id in [1, 2, 3, 4]", std::vector>{{-1.0, 0.0, 0.0}, {0.0, 0.0, 1.0}}, "2", "IP", "0"); ::milvus::proto::milvus::SearchResults search_result; EXPECT_TRUE(proxy.Search(&search_req, &search_result).IsOk()); // return ids: 1,2,4,3 EXPECT_EQ(search_result.results().ids().int_id().data(0), 1); EXPECT_EQ(search_result.results().ids().int_id().data(1), 2); EXPECT_EQ(search_result.results().ids().int_id().data(2), 4); EXPECT_EQ(search_result.results().ids().int_id().data(3), 3); } { ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); EXPECT_TRUE(proxy.LoadCollection(collection_name).IsOk()); auto search_req = GetSearchRequestProto( collection_name, "id in [1, 2, 3, 4]", std::vector>{{-1.0, 0.0, 0.0}, {0.0, 0.0, 1.0}}, "2", "IP", "20"); ::milvus::proto::milvus::SearchResults search_result; EXPECT_TRUE(proxy.Search(&search_req, &search_result).IsOk()); EXPECT_FALSE(search_result.results().has_ids()); } } TEST(MilvusProxyTest, query) { const char* collection_name = "test_collection"; { ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); proxy.DropCollection(collection_name); auto cr = GetCreateCollectionRequestProto(collection_name); EXPECT_TRUE(proxy.CreateCollection(&cr).IsOk()); auto data = GetInsertRequestProto(collection_name, 10); ::milvus::proto::schema::IDs ids; proxy.Insert(&data, &ids); EXPECT_EQ(10, ids.int_id().data_size()); auto query_req = GetQueryRequestProto(collection_name, "id in [1, 2, 3]", "2", "0", std::vector{"id"}); ::milvus::proto::milvus::QueryResults query_result; EXPECT_TRUE(proxy.Query(&query_req, &query_result).IsOk()); EXPECT_EQ( query_result.fields_data()[0].scalars().long_data().data_size(), 2); } { ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); EXPECT_TRUE(proxy.LoadCollection(collection_name).IsOk()); auto query_req = GetQueryRequestProto( collection_name, "id==1", "2", "0", std::vector{"id"}); ::milvus::proto::milvus::QueryResults query_result; EXPECT_TRUE(proxy.Query(&query_req, &query_result).IsOk()); query_result.PrintDebugString(); } } TEST(MilvusProxyTest, delete) { const char* collection_name = "test_collection"; { ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); proxy.DropCollection(collection_name); auto cr = GetCreateCollectionRequestProto(collection_name); EXPECT_TRUE(proxy.CreateCollection(&cr).IsOk()); auto data = GetInsertRequestProto(collection_name, 10); ::milvus::proto::schema::IDs ids; proxy.Insert(&data, &ids); EXPECT_EQ(10, ids.int_id().data_size()); auto delete_req = GetDeleteRequestProto(collection_name, "id in [1, 2]"); ::milvus::proto::milvus::MutationResult response; EXPECT_TRUE(proxy.Delete(&delete_req, &response).IsOk()); auto query_req = GetQueryRequestProto(collection_name, "id in [1, 2, 3]", "3", "0", std::vector{"id"}); ::milvus::proto::milvus::QueryResults query_result; EXPECT_TRUE(proxy.Query(&query_req, &query_result).IsOk()); EXPECT_EQ( query_result.fields_data()[0].scalars().long_data().data_size(), 1); } { ::milvus::local::MilvusProxy proxy(tmp_db_name); EXPECT_TRUE(proxy.Init()); proxy.LoadCollection(collection_name); auto query_req = GetQueryRequestProto(collection_name, "id in [1, 2, 3]", "3", "0", std::vector{"id"}); ::milvus::proto::milvus::QueryResults query_result; EXPECT_TRUE(proxy.Query(&query_req, &query_result).IsOk()); EXPECT_EQ( query_result.fields_data()[0].scalars().long_data().data_size(), 1); } } } // namespace test } // namespace milvus::local ================================================ FILE: src/unittest/run_examples.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import sys import pathlib import subprocess def run_all(py_path): for f in py_path.glob('*.py'): if str(f).endswith('bfloat16_example.py') or str(f).endswith('dynamic_field.py') or str(f).endswith('conftest.py'): continue print(str(f)) p = subprocess.Popen(args=[sys.executable, str(f)]) p.wait() if p.returncode != 0: return False return True if __name__ == '__main__': examples_dir = pathlib.Path(__file__).absolute().parent.parent.parent / 'examples' if not run_all(examples_dir): exit(-1) pytest = pathlib.Path(__file__).absolute().parent.parent.parent / 'tests' if not run_all(pytest): exit(-1) exit(0) ================================================ FILE: src/unittest/storage_test.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "storage/storage.h" #include "storage/bm25_stats.h" #include #include namespace milvus::local { TEST(Storage, h) { const char* db_path = "test.db"; auto db_ptr = std::make_unique( db_path, SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE | SQLite::OPEN_FULLMUTEX); BM25Stats bm25_stats; EXPECT_TRUE(bm25_stats.CreateTables(db_ptr.get())); std::map tokens{}; EXPECT_TRUE(bm25_stats.AddTokenDoc(db_ptr.get(), "test", "sparse", tokens)); tokens[1] = 1; tokens[2] = 2; tokens[3] = 3; EXPECT_TRUE(bm25_stats.AddTokenDoc(db_ptr.get(), "test", "sparse", tokens)); EXPECT_EQ(bm25_stats.GetTokenDocCount(db_ptr.get(), "test", "sparse", 1), 1); EXPECT_EQ(bm25_stats.GetTokenDocCount(db_ptr.get(), "test", "sparse", 2), 2); EXPECT_EQ(bm25_stats.GetTokenDocCount(db_ptr.get(), "test", "sparse", 3), 3); tokens.clear(); tokens[1] = 1; tokens[2] = 2; EXPECT_TRUE(bm25_stats.AddTokenDoc(db_ptr.get(), "test", "sparse", tokens)); EXPECT_EQ(bm25_stats.GetTokenDocCount(db_ptr.get(), "test", "sparse", 1), 2); EXPECT_EQ(bm25_stats.GetTokenDocCount(db_ptr.get(), "test", "sparse", 2), 4); EXPECT_EQ(bm25_stats.GetTokenDocCount(db_ptr.get(), "test", "sparse", 3), 3); EXPECT_TRUE( bm25_stats.DeleteTokenDoc(db_ptr.get(), "test", "sparse", tokens)); EXPECT_EQ(bm25_stats.GetTokenDocCount(db_ptr.get(), "test", "sparse", 1), 1); EXPECT_EQ(bm25_stats.GetTokenDocCount(db_ptr.get(), "test", "sparse", 2), 2); EXPECT_EQ(bm25_stats.GetTokenDocCount(db_ptr.get(), "test", "sparse", 3), 3); EXPECT_TRUE( bm25_stats.AddBM25Stats(db_ptr.get(), "test", "sparse", 100, 20)); { auto [token, doc] = bm25_stats.GetTokenNumAndDocNum(db_ptr.get(), "test", "sparse"); EXPECT_EQ(token, 100); EXPECT_EQ(doc, 20); } EXPECT_TRUE( bm25_stats.DeleteBM25Stats(db_ptr.get(), "test", "sparse", 20, 10)); { auto [token, doc] = bm25_stats.GetTokenNumAndDocNum(db_ptr.get(), "test", "sparse"); EXPECT_EQ(token, 80); EXPECT_EQ(doc, 10); } std::remove(db_path); } } // namespace milvus::local ================================================ FILE: src/unittest/test_util.cpp ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #include "test_util.h" #include #include #include #include #include #include "common.h" #include "log/Log.h" #include "type.h" #include "pb/milvus.pb.h" #include "pb/msg.pb.h" #include "pb/schema.pb.h" #include "pb/segcore.pb.h" namespace milvus::local { namespace test { std::string CreateCollection(const std::string& collection_name, const std::string& vec_type) { ::milvus::proto::schema::CollectionSchema schema; schema.set_name(collection_name); schema.set_enable_dynamic_field(false); auto field1 = schema.add_fields(); field1->set_fieldid(PK_ID); field1->set_name(PK_NAME); field1->set_is_primary_key(true); field1->set_data_type(::milvus::proto::schema::DataType::Int64); if (vec_type == "float_vector") { auto field2 = schema.add_fields(); field2->set_fieldid(VEC_ID); field2->set_name(VEC_NAME); field2->set_data_type(::milvus::proto::schema::DataType::FloatVector); auto params = field2->add_type_params(); params->set_key(VEC_DIM_NAME); params->set_value(std::to_string(VEC_DIM)); auto field3 = schema.add_fields(); field3->set_fieldid(SCALAR_ID); field3->set_name(SCALAR_NAME); field3->set_data_type(::milvus::proto::schema::DataType::Int32); return schema.SerializeAsString(); } else { auto field2 = schema.add_fields(); field2->set_fieldid(VEC_ID); field2->set_name(SPARSE_VEC); field2->set_data_type( ::milvus::proto::schema::DataType::SparseFloatVector); auto field3 = schema.add_fields(); field3->set_fieldid(SCALAR_ID); field3->set_name(VARCHAR_SCALAR_NAME); field3->set_data_type(::milvus::proto::schema::DataType::VarChar); auto p1 = field3->add_type_params(); p1->set_key("enable_analyzer"); p1->set_value("true"); auto p2 = field3->add_type_params(); p2->set_key("max_length"); p2->set_value("1000"); return schema.SerializeAsString(); } } std::string CreateBM25Function(const std::string& name, const std::string& input_name, const std::string& output_name) { ::milvus::proto::schema::FunctionSchema fschema; fschema.set_name(name); fschema.add_input_field_names(input_name); fschema.add_output_field_names(output_name); fschema.set_type(::milvus::proto::schema::FunctionType::BM25); return fschema.SerializeAsString(); } std::string CreateVectorIndex() { milvus::proto::segcore::CollectionIndexMeta index_meta; index_meta.set_maxindexrowcount(1000000); auto field_meta = index_meta.add_index_metas(); field_meta->set_index_name("vec_index"); field_meta->set_fieldid(VEC_ID); field_meta->set_collectionid(0); field_meta->set_is_auto_index(true); auto pair = field_meta->add_index_params(); pair->set_key("metric_type"); pair->set_value("IP"); return index_meta.SerializeAsString(); } milvus::local::Rows CreateData(int32_t count) { milvus::local::Rows rs; for (int64_t i = 0; i < count; i++) { ::milvus::proto::segcore::InsertRecord r; r.set_num_rows(1); // set pk ::milvus::proto::schema::FieldData* pk = r.add_fields_data(); pk->set_field_id(PK_ID); pk->set_field_name(PK_NAME); pk->set_type(::milvus::proto::schema::Int64); pk->mutable_scalars()->mutable_long_data()->add_data(i); // set vec ::milvus::proto::schema::FieldData* vec = r.add_fields_data(); vec->set_field_id(VEC_ID); vec->set_field_name(VEC_NAME); vec->set_type(::milvus::proto::schema::FloatVector); auto v = vec->mutable_vectors(); v->set_dim(VEC_DIM); auto vd = v->mutable_float_vector(); vd->add_data(0.1); vd->add_data(0.5); vd->add_data(0.4); // set scalar ::milvus::proto::schema::FieldData* sc = r.add_fields_data(); sc->set_field_id(SCALAR_ID); sc->set_field_name(SCALAR_NAME); sc->set_type(::milvus::proto::schema::Int32); sc->mutable_scalars()->mutable_int_data()->add_data(i); rs.push_back(std::make_tuple(std::to_string(i), r.SerializeAsString())); } return rs; } ::milvus::proto::milvus::CreateCollectionRequest GetCreateCollectionRequestProto(const std::string& collection_name) { ::milvus::proto::milvus::CreateCollectionRequest r; r.set_collection_name(collection_name); auto schema_str = CreateCollection(collection_name); r.set_schema(schema_str.data()); r.set_consistency_level(::milvus::proto::common::ConsistencyLevel::Strong); return r; } ::milvus::proto::milvus::LoadCollectionRequest GetLoadCollectionRequestProto(const std::string& collection_name) { ::milvus::proto::milvus::LoadCollectionRequest r; r.set_collection_name(collection_name); return r; } ::milvus::proto::milvus::CreateIndexRequest GetCreateIndexRequestProto(const std::string& collection_name, const std::string& index_name, const std::string& field_name) { ::milvus::proto::milvus::CreateIndexRequest r; r.set_index_name(index_name); r.set_collection_name(collection_name); r.set_field_name(field_name); auto p1 = r.add_extra_params(); p1->set_key("params"); p1->set_value("{}"); auto p2 = r.add_extra_params(); p2->set_key("metric_type"); p2->set_value("IP"); auto p3 = r.add_extra_params(); p3->set_key("index_type"); p3->set_value("AUTOINDEX"); return r; } ::milvus::proto::milvus::InsertRequest GetInsertRequestProto(const std::string& collection_name, int64_t row_num) { ::milvus::proto::milvus::InsertRequest r; r.set_collection_name(collection_name); r.set_num_rows(row_num); // set pk ::milvus::proto::schema::FieldData* pk = r.add_fields_data(); pk->set_field_id(PK_ID); pk->set_field_name(PK_NAME); pk->set_type(::milvus::proto::schema::Int64); for (int64_t i = 0; i < row_num; ++i) { pk->mutable_scalars()->mutable_long_data()->add_data(i); } // set vec ::milvus::proto::schema::FieldData* vec = r.add_fields_data(); vec->set_field_id(VEC_ID); vec->set_field_name(VEC_NAME); vec->set_type(::milvus::proto::schema::FloatVector); auto v = vec->mutable_vectors(); v->set_dim(VEC_DIM); auto vd = v->mutable_float_vector(); for (int64_t i = 0; i < row_num; ++i) { vd->add_data(0.1 * i); vd->add_data(0.5 * i); vd->add_data(0.4 * i); } // set scalar ::milvus::proto::schema::FieldData* sc = r.add_fields_data(); sc->set_field_id(SCALAR_ID); sc->set_field_name(SCALAR_NAME); sc->set_type(::milvus::proto::schema::Int32); for (int64_t i = 0; i < row_num; ++i) { sc->mutable_scalars()->mutable_int_data()->add_data(i); } return r; } ::milvus::proto::milvus::UpsertRequest GetUpsertRequestProto(const std::string& collection_name, int64_t row_num) { ::milvus::proto::milvus::UpsertRequest r; r.set_collection_name(collection_name); r.set_num_rows(row_num); // set pk ::milvus::proto::schema::FieldData* pk = r.add_fields_data(); pk->set_field_id(PK_ID); pk->set_field_name(PK_NAME); pk->set_type(::milvus::proto::schema::Int64); for (int64_t i = 0; i < row_num; ++i) { pk->mutable_scalars()->mutable_long_data()->add_data(i); } // set vec ::milvus::proto::schema::FieldData* vec = r.add_fields_data(); vec->set_field_id(VEC_ID); vec->set_field_name(VEC_NAME); vec->set_type(::milvus::proto::schema::FloatVector); auto v = vec->mutable_vectors(); v->set_dim(VEC_DIM); auto vd = v->mutable_float_vector(); for (int64_t i = 0; i < row_num; ++i) { vd->add_data(0.1 * i); vd->add_data(0.5 * i); vd->add_data(0.4 * i); } // set scalar ::milvus::proto::schema::FieldData* sc = r.add_fields_data(); sc->set_field_id(SCALAR_ID); sc->set_field_name(SCALAR_NAME); sc->set_type(::milvus::proto::schema::Int32); for (int64_t i = 0; i < row_num; ++i) { sc->mutable_scalars()->mutable_int_data()->add_data(i); } return r; } ::milvus::proto::milvus::SearchRequest GetSearchRequestProto(const std::string& collection_name, const std::string& expr, const std::vector>& vecs, const std::string& topk, const std::string& metric_type, const std::string& offset) { ::milvus::proto::milvus::SearchRequest r; r.set_collection_name(collection_name); r.set_dsl(expr); r.set_dsl_type(::milvus::proto::common::DslType::BoolExprV1); r.mutable_output_fields()->Add(SCALAR_NAME); r.mutable_output_fields()->Add(VEC_NAME); milvus::proto::common::PlaceholderGroup raw_group; auto value = raw_group.add_placeholders(); value->set_tag(milvus::local::kPlaceholderTag); value->set_type(milvus::proto::common::PlaceholderType::FloatVector); for (const auto& vec : vecs) { value->add_values(vec.data(), vec.size() * sizeof(float)); } r.set_placeholder_group(raw_group.SerializeAsString()); r.set_nq(vecs.size()); auto p1 = r.mutable_search_params()->Add(); // p1->set_key("search_param"); // p1->set_value("{\"nprobe\":10}"); p1->set_key("params"); p1->set_value("{\"nprobe\":10}"); auto p2 = r.mutable_search_params()->Add(); p2->set_key("round_decimal"); p2->set_value("-1"); auto p3 = r.mutable_search_params()->Add(); p3->set_key("ignore_growing"); p3->set_value("False"); auto p4 = r.mutable_search_params()->Add(); p4->set_key("topk"); p4->set_value(topk); auto p5 = r.mutable_search_params()->Add(); p5->set_key("metric_type"); p5->set_value(metric_type); auto p6 = r.mutable_search_params()->Add(); p6->set_key("offset"); p6->set_value(offset); return r; } ::milvus::proto::milvus::QueryRequest GetQueryRequestProto(const std::string& collection_name, const std::string& expr, const std::string& limit, const std::string& offset, const std::vector& output_fields) { ::milvus::proto::milvus::QueryRequest r; r.set_collection_name(collection_name); r.set_expr(expr); auto p1 = r.mutable_query_params()->Add(); p1->set_key("limit"); p1->set_value(limit); auto p2 = r.mutable_query_params()->Add(); p2->set_key("reduce_stop_for_best"); p2->set_value("False"); auto p3 = r.mutable_query_params()->Add(); p3->set_key("ignore_growing"); p3->set_value("False"); auto p4 = r.mutable_query_params()->Add(); p4->set_key("offset"); p4->set_value(offset); r.set_guarantee_timestamp(1); r.set_use_default_consistency(true); for (const auto& f : output_fields) { r.add_output_fields(f); } return r; } ::milvus::proto::milvus::DeleteRequest GetDeleteRequestProto(const std::string& collection_name, const std::string& expr) { ::milvus::proto::milvus::DeleteRequest r; r.set_collection_name(collection_name); r.set_expr(expr); return r; } ::milvus::proto::milvus::DescribeCollectionRequest GetDescribeCollectionRequest(const std::string& collection_name) { ::milvus::proto::milvus::DescribeCollectionRequest r; r.set_collection_name(collection_name); return r; } } // namespace test } // namespace milvus::local ================================================ FILE: src/unittest/test_util.h ================================================ // Copyright (C) 2019-2024 Zilliz. 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. #pragma once #include #include #include #include "type.h" #include "pb/milvus.pb.h" namespace milvus::local { namespace test { #define PK_NAME "id" #define PK_ID 200 #define VEC_NAME "vec" #define SPARSE_VEC "sparse_vec" #define VEC_ID 201 #define VEC_DIM_NAME "dim" #define VEC_DIM 3 #define SCALAR_NAME "sc" #define VARCHAR_SCALAR_NAME "vsc" #define SCALAR_ID 202 std::string CreateCollection(const std::string& collection_name = "test_schema", const std::string& vec_type = "float_vector"); std::string CreateBM25Function(const std::string&, const std::string&, const std::string&); std::string CreateVectorIndex(); milvus::local::Rows CreateData(int32_t count); ::milvus::proto::milvus::CreateCollectionRequest GetCreateCollectionRequestProto(const std::string& collection_name); ::milvus::proto::milvus::LoadCollectionRequest GetLoadCollectionRequestProto(const std::string& collection_name); ::milvus::proto::milvus::CreateIndexRequest GetCreateIndexRequestProto(const std::string& collection_name, const std::string& index_name, const std::string& field_name); ::milvus::proto::milvus::InsertRequest GetInsertRequestProto(const std::string& collection_name, int64_t row_num); ::milvus::proto::milvus::UpsertRequest GetUpsertRequestProto(const std::string& collection_name, int64_t row_num); ::milvus::proto::milvus::SearchRequest GetSearchRequestProto(const std::string& collection_name, const std::string& expr, const std::vector>& vecs, const std::string& topk, const std::string& metric_type, const std::string& offset); ::milvus::proto::milvus::QueryRequest GetQueryRequestProto(const std::string& collection_name, const std::string& expr, const std::string& limit, const std::string& offset, const std::vector& output_fields); ::milvus::proto::milvus::DeleteRequest GetDeleteRequestProto(const std::string& collection_name, const std::string& expr); ::milvus::proto::milvus::DescribeCollectionRequest GetDescribeCollectionRequest(const std::string& collection_name); inline ::milvus::proto::milvus::DropCollectionRequest GetDropCollectionRequest(const std::string& collection_name) { ::milvus::proto::milvus::DropCollectionRequest request; request.set_collection_name(collection_name); return request; } } // namespace test } // namespace milvus::local ================================================ FILE: src/upsert_task.cpp ================================================ #include "upsert_task.h" #include #include #include "schema.pb.h" #include "status.h" namespace milvus::local { Status UpsertTask::Process(::milvus::proto::milvus::InsertRequest* insert_q, ::milvus::proto::schema::IDs* delete_ids) { const ::milvus::proto::schema::FieldSchema* primary_field = nullptr; for (const auto& field_schema : schema_->fields()) { if (field_schema.is_primary_key()) { primary_field = &field_schema; break; } } if (primary_field == nullptr) return Status::ServiceInternal("Can not found primary key"); for (const auto& field_data : upsert_request_->fields_data()) { if (field_data.field_name() == primary_field->name()) { if (field_data.type() == ::milvus::proto::schema::DataType::Int64) { delete_ids->mutable_int_id()->CopyFrom( field_data.scalars().long_data()); } else if (field_data.type() == ::milvus::proto::schema::DataType::VarChar) { delete_ids->mutable_str_id()->CopyFrom( field_data.scalars().string_data()); } else { return Status::ParameterInvalid("Primary key error"); } break; } } // upsert request to insert request insert_q->mutable_base()->CopyFrom(upsert_request_->base()); insert_q->set_db_name(upsert_request_->db_name()); insert_q->set_collection_name(upsert_request_->collection_name()); insert_q->set_partition_name(upsert_request_->partition_name()); insert_q->mutable_fields_data()->CopyFrom(upsert_request_->fields_data()); insert_q->mutable_hash_keys()->CopyFrom(upsert_request_->hash_keys()); insert_q->set_num_rows(upsert_request_->num_rows()); return Status::Ok(); } } // namespace milvus::local ================================================ FILE: src/upsert_task.h ================================================ #pragma once #include "common.h" #include "pb/milvus.pb.h" #include "pb/schema.pb.h" #include "status.h" namespace milvus::local { class UpsertTask : NonCopyableNonMovable { public: UpsertTask(const ::milvus::proto::milvus::UpsertRequest* r, const ::milvus::proto::schema::CollectionSchema* schema) : upsert_request_(r), schema_(schema) { } virtual ~UpsertTask() = default; public: Status Process(::milvus::proto::milvus::InsertRequest* insert_q, ::milvus::proto::schema::IDs* delete_ids); private: const ::milvus::proto::milvus::UpsertRequest* upsert_request_; const ::milvus::proto::schema::CollectionSchema* schema_; }; } // namespace milvus::local ================================================ FILE: tests/base/client_base.py ================================================ from numpy.core.fromnumeric import _partition_dispatcher import pytest import sys from pymilvus import DefaultConfig from milvus_lite.server_manager import server_manager_instance from base.database_wrapper import ApiDatabaseWrapper sys.path.append("..") from base.connections_wrapper import ApiConnectionsWrapper from base.collection_wrapper import ApiCollectionWrapper from base.partition_wrapper import ApiPartitionWrapper from base.index_wrapper import ApiIndexWrapper from base.utility_wrapper import ApiUtilityWrapper from base.schema_wrapper import ApiCollectionSchemaWrapper, ApiFieldSchemaWrapper from base.high_level_api_wrapper import HighLevelApiWrapper from utils.util_log import test_log as log from common import common_func as cf from common import common_type as ct from pymilvus import ResourceGroupInfo class Base: """ Initialize class object """ connection_wrap = None collection_wrap = None partition_wrap = None index_wrap = None utility_wrap = None collection_schema_wrap = None field_schema_wrap = None database_wrap = None collection_object_list = [] resource_group_list = [] high_level_api_wrap = None def setup_class(self): log.info("[setup_class] Start setup class...") def teardown_class(self): log.info("[teardown_class] Start teardown class...") def setup_method(self, method): log.info(("*" * 35) + " setup " + ("*" * 35)) log.info("[setup_method] Start setup test case %s." % method.__name__) self.connection_wrap = ApiConnectionsWrapper() self.utility_wrap = ApiUtilityWrapper() self.collection_wrap = ApiCollectionWrapper() self.partition_wrap = ApiPartitionWrapper() self.index_wrap = ApiIndexWrapper() self.collection_schema_wrap = ApiCollectionSchemaWrapper() self.field_schema_wrap = ApiFieldSchemaWrapper() self.database_wrap = ApiDatabaseWrapper() self.high_level_api_wrap = HighLevelApiWrapper() def teardown_method(self, method): log.info(("*" * 35) + " teardown " + ("*" * 35)) log.info("[teardown_method] Start teardown test case %s..." % method.__name__) try: """ Drop collection before disconnect """ if not self.connection_wrap.has_connection(alias=DefaultConfig.DEFAULT_USING)[0]: self.connection_wrap.connect(alias=DefaultConfig.DEFAULT_USING, host=cf.param_info.param_host, port=cf.param_info.param_port, user=ct.default_user, password=ct.default_password) if self.collection_wrap.collection is not None: if self.collection_wrap.collection.name.startswith("alias"): log.info(f"collection {self.collection_wrap.collection.name} is alias, skip drop operation") else: self.collection_wrap.drop(check_task=ct.CheckTasks.check_nothing) collection_list = self.utility_wrap.list_collections()[0] for collection_object in self.collection_object_list: if collection_object.collection is not None and collection_object.name in collection_list: collection_object.drop(check_task=ct.CheckTasks.check_nothing) """ Clean up the rgs before disconnect """ rgs_list = self.utility_wrap.list_resource_groups()[0] for rg_name in self.resource_group_list: if rg_name is not None and rg_name in rgs_list: rg = self.utility_wrap.describe_resource_group(name=rg_name, check_task=ct.CheckTasks.check_nothing)[0] if isinstance(rg, ResourceGroupInfo): if rg.num_available_node > 0: self.utility_wrap.transfer_node(source=rg_name, target=ct.default_resource_group_name, num_node=rg.num_available_node) self.utility_wrap.drop_resource_group(rg_name, check_task=ct.CheckTasks.check_nothing) except Exception as e: log.debug(str(e)) try: """ Drop roles before disconnect """ if not self.connection_wrap.has_connection(alias=DefaultConfig.DEFAULT_USING)[0]: self.connection_wrap.connect(alias=DefaultConfig.DEFAULT_USING, host=cf.param_info.param_host, port=cf.param_info.param_port, user=ct.default_user, password=ct.default_password) role_list = self.utility_wrap.list_roles(False)[0] for role in role_list.groups: role_name = role.role_name if role_name not in ["admin", "public"]: each_role = self.utility_wrap.init_role(name=role_name)[0] each_role.drop() except Exception as e: log.debug(str(e)) try: """ Delete connection and reset configuration""" res = self.connection_wrap.list_connections() for i in res[0]: self.connection_wrap.remove_connection(i[0]) # because the connection is in singleton mode, it needs to be restored to the original state after teardown self.connection_wrap.add_connection(default={"host": DefaultConfig.DEFAULT_HOST, "port": DefaultConfig.DEFAULT_PORT}) except Exception as e: log.debug(str(e)) class TestcaseBase(Base): """ Additional methods; Public methods that can be used for test cases. """ def _connect(self, enable_milvus_client_api=False, enable_milvus_local_api=False, init_collection=False): """ Add a connection and create the connect """ if enable_milvus_client_api and not enable_milvus_local_api: if cf.param_info.param_uri: uri = cf.param_info.param_uri else: uri = "http://" + cf.param_info.param_host + ":" + str(cf.param_info.param_port) res, is_succ = self.connection_wrap.MilvusClient(uri=uri, token=cf.param_info.param_token) elif enable_milvus_local_api: path = ct.default_milvus_local_path if enable_milvus_local_api == "True" else enable_milvus_local_api if init_collection: print("lite connect") res, is_succ = self.connection_wrap.connect(uri=path) else: print("client init url") uri = server_manager_instance.start_and_get_uri(path) res, is_succ = self.connection_wrap.MilvusClient(uri=uri) else: if cf.param_info.param_user and cf.param_info.param_password: res, is_succ = self.connection_wrap.connect(alias=DefaultConfig.DEFAULT_USING, host=cf.param_info.param_host, port=cf.param_info.param_port, user=cf.param_info.param_user, password=cf.param_info.param_password, secure=cf.param_info.param_secure) else: res, is_succ = self.connection_wrap.connect(alias=DefaultConfig.DEFAULT_USING, host=cf.param_info.param_host, port=cf.param_info.param_port) return res def init_collection_wrap(self, name=None, schema=None, check_task=None, check_items=None, enable_dynamic_field=False, with_json=True, **kwargs): name = cf.gen_unique_str('coll_') if name is None else name schema = cf.gen_default_collection_schema(enable_dynamic_field=enable_dynamic_field, with_json=with_json) \ if schema is None else schema if not self.connection_wrap.has_connection(alias=DefaultConfig.DEFAULT_USING)[0]: self._connect(enable_milvus_local_api="milvus-lite.db", init_collection=True) collection_w = ApiCollectionWrapper() collection_w.init_collection(name=name, schema=schema, check_task=check_task, check_items=check_items, **kwargs) self.collection_object_list.append(collection_w) return collection_w def init_multi_fields_collection_wrap(self, name=cf.gen_unique_str()): vec_fields = [cf.gen_float_vec_field(ct.another_float_vec_field_name)] schema = cf.gen_schema_multi_vector_fields(vec_fields) collection_w = self.init_collection_wrap(name=name, schema=schema) df = cf.gen_dataframe_multi_vec_fields(vec_fields=vec_fields) collection_w.insert(df) assert collection_w.num_entities == ct.default_nb return collection_w, df def init_partition_wrap(self, collection_wrap=None, name=None, description=None, check_task=None, check_items=None, **kwargs): name = cf.gen_unique_str("partition_") if name is None else name description = cf.gen_unique_str("partition_des_") if description is None else description collection_wrap = self.init_collection_wrap() if collection_wrap is None else collection_wrap partition_wrap = ApiPartitionWrapper() partition_wrap.init_partition(collection_wrap.collection, name, description, check_task=check_task, check_items=check_items, **kwargs) return partition_wrap def insert_data_general(self, prefix="test", insert_data=False, nb=ct.default_nb, partition_num=0, is_binary=False, is_all_data_type=False, auto_id=False, dim=ct.default_dim, primary_field=ct.default_int64_field_name, is_flush=True, name=None, enable_dynamic_field=False, with_json=True, **kwargs): """ """ self._connect() collection_name = cf.gen_unique_str(prefix) if name is not None: collection_name = name vectors = [] binary_raw_vectors = [] insert_ids = [] time_stamp = 0 # 1 create collection default_schema = cf.gen_default_collection_schema(auto_id=auto_id, dim=dim, primary_field=primary_field, enable_dynamic_field=enable_dynamic_field, with_json=with_json) if is_binary: default_schema = cf.gen_default_binary_collection_schema(auto_id=auto_id, dim=dim, primary_field=primary_field) if is_all_data_type: default_schema = cf.gen_collection_schema_all_datatype(auto_id=auto_id, dim=dim, primary_field=primary_field, enable_dynamic_field=enable_dynamic_field, with_json=with_json) log.info("insert_data_general: collection creation") collection_w = self.init_collection_wrap(name=collection_name, schema=default_schema, **kwargs) pre_entities = collection_w.num_entities if insert_data: collection_w, vectors, binary_raw_vectors, insert_ids, time_stamp = \ cf.insert_data(collection_w, nb, is_binary, is_all_data_type, auto_id=auto_id, dim=dim, enable_dynamic_field=enable_dynamic_field, with_json=with_json) if is_flush: collection_w.flush() assert collection_w.num_entities == nb + pre_entities return collection_w, vectors, binary_raw_vectors, insert_ids, time_stamp def init_collection_general(self, prefix="test", insert_data=False, nb=ct.default_nb, partition_num=0, is_binary=False, is_all_data_type=False, auto_id=False, dim=ct.default_dim, is_index=True, primary_field=ct.default_int64_field_name, is_flush=True, name=None, enable_dynamic_field=False, with_json=True, random_primary_key=False, multiple_dim_array=[], is_partition_key=None, vector_data_type="FLOAT_VECTOR", **kwargs): """ target: create specified collections method: 1. create collections (binary/non-binary, default/all data type, auto_id or not) 2. create partitions if specified 3. insert specified (binary/non-binary, default/all data type) data into each partition if any 4. not load if specifying is_index as True expected: return collection and raw data, insert ids """ log.info("Test case of search interface: initialize before test case") self._connect(enable_milvus_local_api="./local_test.db", init_collection=True) collection_name = cf.gen_unique_str(prefix) if name is not None: collection_name = name vectors = [] binary_raw_vectors = [] insert_ids = [] time_stamp = 0 # 1 create collection default_schema = cf.gen_default_collection_schema(auto_id=auto_id, dim=dim, primary_field=primary_field, enable_dynamic_field=enable_dynamic_field, with_json=with_json, multiple_dim_array=multiple_dim_array, is_partition_key=is_partition_key, vector_data_type=vector_data_type) if is_binary: default_schema = cf.gen_default_binary_collection_schema(auto_id=auto_id, dim=dim, primary_field=primary_field) if vector_data_type == ct.sparse_vector: default_schema = cf.gen_default_sparse_schema(auto_id=auto_id, primary_field=primary_field, enable_dynamic_field=enable_dynamic_field, with_json=with_json, multiple_dim_array=multiple_dim_array) if is_all_data_type: default_schema = cf.gen_collection_schema_all_datatype(auto_id=auto_id, dim=dim, primary_field=primary_field, enable_dynamic_field=enable_dynamic_field, with_json=with_json, multiple_dim_array=multiple_dim_array) collection_w = self.init_collection_wrap(name=collection_name, schema=default_schema, **kwargs) vector_name_list = cf.extract_vector_field_name_list(collection_w) # 2 add extra partitions if specified (default is 1 partition named "_default") if partition_num > 0: cf.gen_partitions(collection_w, partition_num) # 3 insert data if specified if insert_data: collection_w, vectors, binary_raw_vectors, insert_ids, time_stamp = \ cf.insert_data(collection_w, nb, is_binary, is_all_data_type, auto_id=auto_id, dim=dim, enable_dynamic_field=enable_dynamic_field, with_json=with_json, random_primary_key=random_primary_key, multiple_dim_array=multiple_dim_array, primary_field=primary_field, vector_data_type=vector_data_type) if is_flush: assert collection_w.is_empty is False assert collection_w.num_entities == nb # 4 create default index if specified if is_index: # This condition will be removed after auto index feature if is_binary: collection_w.create_index(ct.default_binary_vec_field_name, ct.default_bin_flat_index) elif vector_data_type == ct.sparse_vector: for vector_name in vector_name_list: collection_w.create_index(vector_name, ct.default_sparse_inverted_index) else: if len(multiple_dim_array) == 0 or is_all_data_type == False: vector_name_list.append(ct.default_float_vec_field_name) for vector_name in vector_name_list: # Unlike dense vectors, sparse vectors cannot create flat index. if ct.sparse_vector in vector_name: collection_w.create_index(vector_name, ct.default_sparse_inverted_index) else: collection_w.create_index(vector_name, ct.default_flat_index) collection_w.load() return collection_w, vectors, binary_raw_vectors, insert_ids, time_stamp def insert_entities_into_two_partitions_in_half(self, half, prefix='query'): """ insert default entities into two partitions(partition_w and _default) in half(int64 and float fields values) :param half: half of nb :return: collection wrap and partition wrap """ self._connect() collection_w = self.init_collection_wrap(name=cf.gen_unique_str(prefix)) partition_w = self.init_partition_wrap(collection_wrap=collection_w) # insert [0, half) into partition_w df_partition = cf.gen_default_dataframe_data(nb=half, start=0) partition_w.insert(df_partition) # insert [half, nb) into _default df_default = cf.gen_default_dataframe_data(nb=half, start=half) collection_w.insert(df_default) # flush collection_w.num_entities collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load(partition_names=[partition_w.name, "_default"]) return collection_w, partition_w, df_partition, df_default def collection_insert_multi_segments_one_shard(self, collection_prefix, num_of_segment=2, nb_of_segment=1, is_dup=True): """ init collection with one shard, insert data into two segments on one shard (they can be merged) :param collection_prefix: collection name prefix :param num_of_segment: number of segments :param nb_of_segment: number of entities per segment :param is_dup: whether the primary keys of each segment is duplicated :return: collection wrap and partition wrap """ collection_w = self.init_collection_wrap(name=cf.gen_unique_str(collection_prefix), shards_num=1) for i in range(num_of_segment): start = 0 if is_dup else i * nb_of_segment df = cf.gen_default_dataframe_data(nb_of_segment, start=start) collection_w.insert(df) assert collection_w.num_entities == nb_of_segment * (i + 1) return collection_w def init_resource_group(self, name, using="default", timeout=None, check_task=None, check_items=None, **kwargs): if not self.connection_wrap.has_connection(alias=DefaultConfig.DEFAULT_USING)[0]: self._connect() utility_w = ApiUtilityWrapper() res, check_result = utility_w.create_resource_group(name=name, using=using, timeout=timeout, check_task=check_task, check_items=check_items, **kwargs) if res is None and check_result: self.resource_group_list.append(name) return res, check_result def init_user_with_privilege(self, privilege_object, object_name, privilege, db_name="default"): """ init a user and role, grant privilege to the role with the db, then bind the role to the user :param privilege_object: privilege object: Global, Collection, User :type privilege_object: str :param object_name: privilege object name :type object_name: str :param privilege: privilege :type privilege: str :param db_name: database name :type db_name: str :return: user name, user pwd, role name :rtype: str, str, str """ tmp_user = cf.gen_unique_str("user") tmp_pwd = cf.gen_unique_str("pwd") tmp_role = cf.gen_unique_str("role") # create user self.utility_wrap.create_user(tmp_user, tmp_pwd) # create role self.utility_wrap.init_role(tmp_role) self.utility_wrap.create_role() # grant privilege to the role self.utility_wrap.role_grant(object=privilege_object, object_name=object_name, privilege=privilege, db_name=db_name) # bind the role to the user self.utility_wrap.role_add_user(tmp_user) return tmp_user, tmp_pwd, tmp_role ================================================ FILE: tests/base/collection_wrapper.py ================================================ import sys import time import timeout_decorator from numpy import NaN from pymilvus import Collection sys.path.append("..") from check.func_check import ResponseChecker from utils.api_request import api_request from utils.wrapper import trace from utils.util_log import test_log as log from pymilvus.orm.types import CONSISTENCY_STRONG from common.common_func import param_info TIMEOUT = 180 INDEX_NAME = "" # keep small timeout for stability tests # TIMEOUT = 5 class ApiCollectionWrapper: collection = None def __init__(self, active_trace=False): self.active_trace = active_trace def init_collection(self, name, schema=None, using="default", check_task=None, check_items=None, active_trace=False, **kwargs): self.active_trace = active_trace consistency_level = kwargs.get("consistency_level", CONSISTENCY_STRONG) kwargs.update({"consistency_level": consistency_level}) """ In order to distinguish the same name of collection """ func_name = sys._getframe().f_code.co_name res, is_succ = api_request([Collection, name, schema, using], **kwargs) self.collection = res if is_succ else None check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, name=name, schema=schema, using=using, **kwargs).run() return res, check_result @property def schema(self): return self.collection.schema @property def description(self): return self.collection.description @property def name(self): return self.collection.name @property def is_empty(self): self.flush() return self.collection.is_empty @property def num_entities(self): self.flush() return self.collection.num_entities @property def num_shards(self): return self.collection.num_shards @property def num_entities_without_flush(self): return self.collection.num_entities @property def primary_field(self): return self.collection.primary_field @property def aliases(self): return self.collection.aliases @trace() def construct_from_dataframe(self, name, dataframe, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([Collection.construct_from_dataframe, name, dataframe], **kwargs) self.collection = res[0] if is_succ else None check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, name=name, dataframe=dataframe, **kwargs).run() return res, check_result @trace() def drop(self, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.drop], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def load(self, partition_names=None, replica_number=NaN, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout replica_number = param_info.param_replica_num if replica_number is NaN else replica_number func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.load, partition_names, replica_number, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, partition_names=partition_names, **kwargs).run() return res, check_result @trace() def release(self, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.release], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def insert(self, data, partition_name=None, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.insert, data, partition_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, data=data, partition_name=partition_name, **kwargs).run() return res, check_result # @trace() # def flush(self, check_task=None, check_items=None, **kwargs): # #TODO:currently, flush is not supported by sdk in milvus # timeout = kwargs.get("timeout", TIMEOUT) # # @timeout_decorator.timeout(timeout, timeout_exception=TimeoutError) # def _flush(): # res = self.collection.num_entities # return res # try: # res = _flush() # return res, True # except TimeoutError as e: # log.error(f"flush timeout error: {e}") # res = None # return res, False @trace() def flush(self, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.flush], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def search(self, data, anns_field, param, limit, expr=None, partition_names=None, output_fields=None, timeout=None # round_decimal=-1, , check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.search, data, anns_field, param, limit, expr, partition_names, output_fields, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, data=data, anns_field=anns_field, param=param, limit=limit, expr=expr, partition_names=partition_names, output_fields=output_fields, timeout=timeout, **kwargs).run() return res, check_result @trace() def hybrid_search(self, reqs, rerank, limit, output_fields=None, timeout=None, round_decimal=-1, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout partition_names = None func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.hybrid_search, reqs, rerank, limit, partition_names, output_fields, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, reqs=reqs, rerank=rerank, limit=limit, output_fields=output_fields, timeout=timeout, **kwargs).run() return res, check_result @trace() def search_iterator(self, data, anns_field, param, batch_size, limit=-1, expr=None, partition_names=None, output_fields=None, timeout=None, round_decimal=-1, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.search_iterator, data, anns_field, param, batch_size, limit, expr, partition_names, output_fields, timeout, round_decimal], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, data=data, anns_field=anns_field, param=param, limit=limit, expr=expr, partition_names=partition_names, output_fields=output_fields, timeout=timeout, **kwargs).run() return res, check_result @trace() def query(self, expr, output_fields=None, partition_names=None, timeout=None, check_task=None, check_items=None, **kwargs): # time.sleep(5) timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.query, expr, output_fields, partition_names, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, expression=expr, partition_names=partition_names, output_fields=output_fields, timeout=timeout, **kwargs).run() return res, check_result @trace() def query_iterator(self, batch_size=1000, limit=-1, expr=None, output_fields=None, partition_names=None, timeout=None, check_task=None, check_items=None, **kwargs): # time.sleep(5) timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.query_iterator, batch_size, limit, expr, output_fields, partition_names, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, batch_size=batch_size, limit=limit, expression=expr, output_fields=output_fields, partition_names=partition_names, timeout=timeout, **kwargs).run() return res, check_result @property def partitions(self): return self.collection.partitions @trace() def partition(self, partition_name, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, succ = api_request([self.collection.partition, partition_name]) check_result = ResponseChecker(res, func_name, check_task, check_items, succ, partition_name=partition_name).run() return res, check_result @trace() def has_partition(self, partition_name, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, succ = api_request([self.collection.has_partition, partition_name]) check_result = ResponseChecker(res, func_name, check_task, check_items, succ, partition_name=partition_name).run() return res, check_result @trace() def drop_partition(self, partition_name, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.drop_partition, partition_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, partition_name=partition_name, **kwargs).run() return res, check_result @trace() def create_partition(self, partition_name, check_task=None, check_items=None, description=""): func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.create_partition, partition_name, description]) check_result = ResponseChecker(res, func_name, check_task, check_items, check, partition_name=partition_name).run() return res, check_result @property def indexes(self): return self.collection.indexes @trace() def index(self, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.index]) check_result = ResponseChecker(res, func_name, check_task, check_items, check).run() return res, check_result @trace() def create_index(self, field_name, index_params=None, index_name=None, timeout=None, check_task=None, check_items=None, **kwargs): timeout = 1200 if timeout is None else timeout index_name = INDEX_NAME if index_name is None else index_name index_name = kwargs.get("index_name", index_name) kwargs.update({"index_name": index_name}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.create_index, field_name, index_params, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def has_index(self, index_name=None, check_task=None, check_items=None, **kwargs): index_name = INDEX_NAME if index_name is None else index_name index_name = kwargs.get("index_name", index_name) kwargs.update({"index_name": index_name}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.has_index], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def drop_index(self, index_name=None, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) index_name = INDEX_NAME if index_name is None else index_name index_name = kwargs.get("index_name", index_name) kwargs.update({"timeout": timeout, "index_name": index_name}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.drop_index], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def delete(self, expr, partition_name=None, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.delete, expr, partition_name, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def upsert(self, data, partition_name=None, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.upsert, data, partition_name, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def compact(self, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.compact, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def get_compaction_state(self, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.get_compaction_state, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def get_compaction_plans(self, timeout=None, check_task=None, check_items={}, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.get_compaction_plans, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def wait_for_compaction_completed(self, timeout=None, **kwargs): timeout = TIMEOUT * 3 if timeout is None else timeout res = self.collection.wait_for_compaction_completed(timeout, **kwargs) # log.debug(res) return res @trace() def get_replicas(self, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.get_replicas, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def describe(self, timeout=None, check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.describe, timeout]) check_result = ResponseChecker(res, func_name, check_task, check_items, check).run() return res, check_result @trace() def alter_index(self, index_name, extra_params={}, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.alter_index, index_name, extra_params, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def set_properties(self, extra_params={}, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.collection.set_properties, extra_params, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result ================================================ FILE: tests/base/connections_wrapper.py ================================================ from pymilvus import Connections from pymilvus import DefaultConfig from pymilvus import MilvusClient import sys sys.path.append("..") from check.func_check import ResponseChecker from utils.api_request import api_request class ApiConnectionsWrapper: def __init__(self): self.connection = Connections() def add_connection(self, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.connection.add_connection], **kwargs) check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ, **kwargs).run() return response, check_result def disconnect(self, alias, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.connection.disconnect, alias]) check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ, alias=alias).run() return response, check_result def remove_connection(self, alias, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.connection.remove_connection, alias]) check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ, alias=alias).run() return response, check_result def connect(self, alias=DefaultConfig.DEFAULT_USING, user="", password="", db_name="default", token: str = "", check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name response, succ = api_request([self.connection.connect, alias, user, password, db_name, token], **kwargs) check_result = ResponseChecker(response, func_name, check_task, check_items, succ, alias=alias, user=user, password=password, db_name=db_name, token=token, **kwargs).run() return response, check_result def has_connection(self, alias=DefaultConfig.DEFAULT_USING, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name response, succ = api_request([self.connection.has_connection, alias]) check_result = ResponseChecker(response, func_name, check_task, check_items, succ, alias=alias).run() return response, check_result # def get_connection(self, alias=DefaultConfig.DEFAULT_USING, check_task=None, check_items=None): # func_name = sys._getframe().f_code.co_name # response, is_succ = api_request([self.connection.get_connection, alias]) # check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ, alias=alias).run() # return response, check_result def list_connections(self, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.connection.list_connections]) check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ).run() return response, check_result def get_connection_addr(self, alias, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.connection.get_connection_addr, alias]) check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ, alias=alias).run() return response, check_result # high level api def MilvusClient(self, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name response, succ = api_request([MilvusClient], **kwargs) check_result = ResponseChecker(response, func_name, check_task, check_items, succ, **kwargs).run() return response, check_result ================================================ FILE: tests/base/database_wrapper.py ================================================ import sys from pymilvus import db from utils.api_request import api_request from check.func_check import ResponseChecker class ApiDatabaseWrapper: """ wrapper of database """ database = db def create_database(self, db_name, using="default", timeout=None, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.database.create_database, db_name, using, timeout]) check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ).run() return response, check_result def using_database(self, db_name, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.database.using_database, db_name, using]) check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ).run() return response, check_result def drop_database(self, db_name, using="default", timeout=None, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.database.drop_database, db_name, using, timeout]) check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ).run() return response, check_result def list_database(self, using="default", timeout=None, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.database.list_database, using, timeout]) check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ).run() return response, check_result ================================================ FILE: tests/base/high_level_api_wrapper.py ================================================ import sys import time import timeout_decorator from numpy import NaN from pymilvus import Collection from pymilvus import MilvusClient sys.path.append("..") from check.func_check import ResponseChecker from utils.api_request import api_request from utils.wrapper import trace from utils.util_log import test_log as log from pymilvus.orm.types import CONSISTENCY_STRONG from common.common_func import param_info TIMEOUT = 120 INDEX_NAME = "" # keep small timeout for stability tests # TIMEOUT = 5 class HighLevelApiWrapper: milvus_client = None def __init__(self, active_trace=False): self.active_trace = active_trace def init_milvus_client(self, uri, user="", password="", db_name="", token="", timeout=None, check_task=None, check_items=None, active_trace=False, **kwargs): self.active_trace = active_trace func_name = sys._getframe().f_code.co_name res, is_succ = api_request([MilvusClient, uri, user, password, db_name, token, timeout], **kwargs) self.milvus_client = res if is_succ else None check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, uri=uri, user=user, password=password, db_name=db_name, token=token, timeout=timeout, **kwargs).run() return res, check_result # elstic update def init_collection(self, name, schema=None, using="default", check_task=None, check_items=None, active_trace=False, **kwargs): self.active_trace = active_trace consistency_level = kwargs.get("consistency_level", CONSISTENCY_STRONG) kwargs.update({"consistency_level": consistency_level}) """ In order to distinguish the same name of collection """ func_name = sys._getframe().f_code.co_name res, is_succ = api_request([Collection, name, schema, using], **kwargs) self.collection = res if is_succ else None print("HighLevelApiWrapper init_collection >>> ") check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, name=name, schema=schema, using=using, **kwargs).run() return res, check_result @trace() def create_schema(self, client, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.create_schema], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def create_collection(self, client, collection_name, dimension, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.create_collection, collection_name, dimension], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, dimension=dimension, **kwargs).run() return res, check_result def has_collection(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.has_collection, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def insert(self, client, collection_name, data, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.insert, collection_name, data], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, data=data, **kwargs).run() return res, check_result @trace() def upsert(self, client, collection_name, data, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.upsert, collection_name, data], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, data=data, **kwargs).run() return res, check_result @trace() def search(self, client, collection_name, data, limit=10, filter=None, output_fields=None, search_params=None, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.search, collection_name, data, filter, limit, output_fields, search_params], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, data=data, limit=limit, filter=filter, output_fields=output_fields, search_params=search_params, **kwargs).run() return res, check_result @trace() def query(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.query, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def get(self, client, collection_name, ids, output_fields=None, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.get, collection_name, ids, output_fields], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, ids=ids, output_fields=output_fields, **kwargs).run() return res, check_result @trace() def num_entities(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.num_entities, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def delete(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.delete, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def flush(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.flush, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def describe_collection(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.describe_collection, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def list_collections(self, client, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.list_collections], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def drop_collection(self, client, collection_name, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([client.drop_collection, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def list_partitions(self, client, collection_name, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([client.list_partitions, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def list_indexes(self, client, collection_name, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([client.list_indexes, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def get_load_state(self, client, collection_name, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([client.get_load_state, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def prepare_index_params(self, client, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.prepare_index_params], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def load_collection(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.load_collection, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def release_collection(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.release_collection, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def load_partitions(self, client, collection_name, partition_names, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.load_partitions, collection_name, partition_names], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, partition_names=partition_names, **kwargs).run() return res, check_result @trace() def release_partitions(self, client, collection_name, partition_names, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.release_partitions, collection_name, partition_names], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, partition_names=partition_names, **kwargs).run() return res, check_result @trace() def rename_collection(self, client, old_name, new_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.rename_collection, old_name, new_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, old_name=old_name, new_name=new_name, **kwargs).run() return res, check_result @trace() def use_database(self, client, db_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.use_database, db_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, db_name=db_name, **kwargs).run() return res, check_result @trace() def create_partition(self, client, collection_name, partition_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.create_partition, collection_name, partition_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, partition_name=partition_name, **kwargs).run() return res, check_result @trace() def list_partitions(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.list_partitions, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def drop_partition(self, client, collection_name, partition_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.drop_partition, collection_name, partition_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, partition_name=partition_name, **kwargs).run() return res, check_result @trace() def has_partition(self, client, collection_name, partition_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.has_partition, collection_name, partition_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, partition_name=partition_name, **kwargs).run() return res, check_result @trace() def get_partition_stats(self, client, collection_name, partition_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.get_partition_stats, collection_name, partition_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, partition_name=partition_name, **kwargs).run() return res, check_result @trace() def prepare_index_params(self, client, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([client.prepare_index_params], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def create_index(self, client, collection_name, index_params, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.create_index, collection_name, index_params], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, index_params=index_params, **kwargs).run() return res, check_result @trace() def drop_index(self, client, collection_name, index_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.drop_index, collection_name, index_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, index_name=index_name, **kwargs).run() return res, check_result @trace() def describe_index(self, client, collection_name, index_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.describe_index, collection_name, index_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, index_name=index_name, **kwargs).run() return res, check_result @trace() def list_indexes(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.list_indexes, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def create_alias(self, client, collection_name, alias, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.create_alias, collection_name, alias], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, alias=alias, **kwargs).run() return res, check_result @trace() def drop_alias(self, client, alias, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.drop_alias, alias], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, alias=alias, **kwargs).run() return res, check_result @trace() def alter_alias(self, client, collection_name, alias, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.alter_alias, collection_name, alias], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, alias=alias, **kwargs).run() return res, check_result @trace() def describe_alias(self, client, alias, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.describe_alias, alias], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, alias=alias, **kwargs).run() return res, check_result @trace() def list_aliases(self, client, collection_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.list_aliases, collection_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, **kwargs).run() return res, check_result @trace() def using_database(self, client, db_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([client.using_database, db_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, db_name=db_name, **kwargs).run() return res, check_result def create_user(self, user_name, password, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.create_user, user_name, password], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, user_name=user_name, password=password, **kwargs).run() return res, check_result @trace() def drop_user(self, user_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.drop_user, user_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, user_name=user_name, **kwargs).run() return res, check_result @trace() def update_password(self, user_name, old_password, new_password, reset_connection=False, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.update_password, user_name, old_password, new_password, reset_connection], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, user_name=user_name, old_password=old_password, new_password=new_password, reset_connection=reset_connection, **kwargs).run() return res, check_result @trace() def list_users(self, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.list_users], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def describe_user(self, user_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.describe_user, user_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, user_name=user_name, **kwargs).run() return res, check_result @trace() def create_role(self, role_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.create_role, role_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, role_name=role_name, **kwargs).run() return res, check_result @trace() def drop_role(self, role_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.drop_role, role_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, role_name=role_name, **kwargs).run() return res, check_result @trace() def describe_role(self, role_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.describe_role, role_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, role_name=role_name, **kwargs).run() return res, check_result @trace() def list_roles(self, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.list_roles], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @trace() def grant_role(self, user_name, role_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.grant_role, user_name, role_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, user_name=user_name, role_name=role_name, **kwargs).run() return res, check_result @trace() def revoke_role(self, user_name, role_name, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.revoke_role, user_name, role_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, user_name=user_name, role_name=role_name, **kwargs).run() return res, check_result @trace() def grant_privilege(self, role_name, object_type, privilege, object_name, db_name="", timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.grant_privilege, role_name, object_type, privilege, object_name, db_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, role_name=role_name, object_type=object_type, privilege=privilege, object_name=object_name, db_name=db_name, **kwargs).run() return res, check_result @trace() def revoke_privilege(self, role_name, object_type, privilege, object_name, db_name="", timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, check = api_request([self.milvus_client.revoke_privilege, role_name, object_type, privilege, object_name, db_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, role_name=role_name, object_type=object_type, privilege=privilege, object_name=object_name, db_name=db_name, **kwargs).run() return res, check_result @trace() def hybrid_search(self, client, reqs, rerank, limit, output_fields=None, timeout=None, round_decimal=-1, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([client.hybrid_search, reqs, rerank, limit, output_fields, timeout, round_decimal], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, reqs=reqs, rerank=rerank, limit=limit, output_fields=output_fields, timeout=timeout, **kwargs).run() return res, check_result ================================================ FILE: tests/base/index_wrapper.py ================================================ import sys from pymilvus import Index sys.path.append("..") from check.func_check import ResponseChecker from utils.api_request import api_request TIMEOUT = 20 INDEX_NAME = "" class ApiIndexWrapper: index = None def init_index(self, collection, field_name, index_params, index_name=None, check_task=None, check_items=None, **kwargs): disktimeout = 600 timeout = kwargs.get("timeout", disktimeout * 2) index_name = INDEX_NAME if index_name is None else index_name index_name = kwargs.get("index_name", index_name) kwargs.update({"timeout": timeout, "index_name": index_name}) """ In order to distinguish the same name of index """ func_name = sys._getframe().f_code.co_name res, is_succ = api_request([Index, collection, field_name, index_params], **kwargs) self.index = res if is_succ is True else None check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection=collection, field_name=field_name, index_params=index_params, **kwargs).run() return res, check_result def drop(self, index_name=None, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) index_name = INDEX_NAME if index_name is None else index_name index_name = kwargs.get("index_name", index_name) kwargs.update({"timeout": timeout, "index_name": index_name}) func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.index.drop], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, **kwargs).run() return res, check_result @property def params(self): return self.index.params @property def collection_name(self): return self.index.collection_name @property def field_name(self): return self.index.field_name ================================================ FILE: tests/base/partition_wrapper.py ================================================ import sys from numpy import NaN from pymilvus import Partition sys.path.append("..") from check.func_check import ResponseChecker from utils.api_request import api_request from common.common_func import param_info TIMEOUT = 180 class ApiPartitionWrapper: partition = None def init_partition(self, collection, name, description="", check_task=None, check_items=None, **kwargs): """ In order to distinguish the same name of partition """ func_name = sys._getframe().f_code.co_name response, is_succ = api_request([Partition, collection, name, description], **kwargs) self.partition = response if is_succ is True else None check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ, **kwargs).run() return response, check_result @property def description(self): return self.partition.description if self.partition else None @property def name(self): return self.partition.name if self.partition else None @property def is_empty(self): self.flush() return self.partition.is_empty if self.partition else None @property def num_entities(self): self.flush() return self.partition.num_entities if self.partition else None def drop(self, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, succ = api_request([self.partition.drop], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, succ, **kwargs).run() return res, check_result def load(self, replica_number=NaN, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout replica_number = param_info.param_replica_num if replica_number is NaN else replica_number func_name = sys._getframe().f_code.co_name res, succ = api_request([self.partition.load, replica_number, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ=succ, **kwargs).run() return res, check_result def release(self, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, succ = api_request([self.partition.release], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ=succ, **kwargs).run() return res, check_result def flush(self, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, succ = api_request([self.partition.flush], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ=succ, **kwargs).run() return res, check_result def insert(self, data, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, succ = api_request([self.partition.insert, data], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ=succ, data=data, **kwargs).run() return res, check_result def search(self, data, anns_field, params, limit, expr=None, output_fields=None, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, succ = api_request([self.partition.search, data, anns_field, params, limit, expr, output_fields], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ=succ, data=data, anns_field=anns_field, params=params, limit=limit, expr=expr, output_fields=output_fields, **kwargs).run() return res, check_result def query(self, expr, output_fields=None, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.partition.query, expr, output_fields, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, expression=expr, output_fields=output_fields, timeout=timeout, **kwargs).run() return res, check_result def delete(self, expr, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, succ = api_request([self.partition.delete, expr], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ=succ, expr=expr, **kwargs).run() return res, check_result def upsert(self, data, check_task=None, check_items=None, **kwargs): timeout = kwargs.get("timeout", TIMEOUT) kwargs.update({"timeout": timeout}) func_name = sys._getframe().f_code.co_name res, succ = api_request([self.partition.upsert, data], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ=succ, data=data, **kwargs).run() return res, check_result def get_replicas(self, timeout=None, check_task=None, check_items=None, **kwargs): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, check = api_request([self.partition.get_replicas, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result ================================================ FILE: tests/base/schema_wrapper.py ================================================ import sys sys.path.append("..") from check.func_check import ResponseChecker from utils.api_request import api_request from pymilvus import CollectionSchema, FieldSchema class ApiCollectionSchemaWrapper: collection_schema = None def init_collection_schema(self, fields, description="", check_task=None, check_items=None, **kwargs): """In order to distinguish the same name of CollectionSchema""" func_name = sys._getframe().f_code.co_name response, is_succ = api_request([CollectionSchema, fields, description], **kwargs) self.collection_schema = response if is_succ else None check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ=is_succ, fields=fields, description=description, **kwargs).run() return response, check_result @property def primary_field(self): return self.collection_schema.primary_field if self.collection_schema else None @property def partition_key_field(self): return self.collection_schema.partition_key_field if self.collection_schema else None @property def fields(self): return self.collection_schema.fields if self.collection_schema else None @property def description(self): return self.collection_schema.description if self.collection_schema else None @property def auto_id(self): return self.collection_schema.auto_id if self.collection_schema else None @property def enable_dynamic_field(self): return self.collection_schema.enable_dynamic_field if self.collection_schema else None @property def to_dict(self): return self.collection_schema.to_dict if self.collection_schema else None @property def verify(self): return self.collection_schema.verify if self.collection_schema else None def add_field(self, field_name, datatype, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name response, is_succ = api_request([self.collection_schema.add_field, field_name, datatype], **kwargs) check_result = ResponseChecker(response, func_name, check_task, check_items, field_name=field_name, datatype=datatype, **kwargs).run() return response, check_result class ApiFieldSchemaWrapper: field_schema = None def init_field_schema(self, name, dtype, description="", check_task=None, check_items=None, **kwargs): """In order to distinguish the same name of FieldSchema""" func_name = sys._getframe().f_code.co_name response, is_succ = api_request([FieldSchema, name, dtype, description], **kwargs) self.field_schema = response if is_succ else None check_result = ResponseChecker(response, func_name, check_task, check_items, is_succ, name=name, dtype=dtype, description=description, **kwargs).run() return response, check_result @property def description(self): return self.field_schema.description if self.field_schema else None @property def params(self): return self.field_schema.params if self.field_schema else None @property def dtype(self): return self.field_schema.dtype if self.field_schema else None ================================================ FILE: tests/base/utility_wrapper.py ================================================ from datetime import datetime import time from pymilvus import utility import sys sys.path.append("..") from check.func_check import ResponseChecker from utils.api_request import api_request from pymilvus import BulkInsertState from pymilvus.orm.role import Role from utils.util_log import test_log as log TIMEOUT = 20 class ApiUtilityWrapper: """ Method of encapsulating utility files """ ut = utility role = None def do_bulk_insert(self, collection_name, files="", partition_name=None, timeout=None, using="default", check_task=None, check_items=None, **kwargs): working_tasks = self.get_bulk_insert_working_list() log.info(f"before bulk load, there are {len(working_tasks)} working tasks") log.info(f"files to load: {files}") func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.do_bulk_insert, collection_name, files, partition_name, timeout, using], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, using=using).run() time.sleep(1) working_tasks = self.get_bulk_insert_working_list() log.info(f"after bulk load, there are {len(working_tasks)} working tasks") return res, check_result def get_bulk_insert_state(self, task_id, timeout=None, using="default", check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.get_bulk_insert_state, task_id, timeout, using], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, task_id=task_id, using=using).run() return res, check_result def list_bulk_insert_tasks(self, limit=0, collection_name=None, timeout=None, using="default", check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.list_bulk_insert_tasks, limit, collection_name, timeout, using], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, limit=limit, collection_name=collection_name, using=using).run() return res, check_result def get_bulk_insert_pending_list(self): tasks = {} for task in self.ut.list_bulk_insert_tasks(): if task.state == BulkInsertState.ImportPending: tasks[task.task_id] = task return tasks def get_bulk_insert_working_list(self): tasks = {} for task in self.ut.list_bulk_insert_tasks(): if task.state in [BulkInsertState.ImportStarted]: tasks[task.task_id] = task return tasks def list_all_bulk_insert_tasks(self, limit=0): tasks, _ = self.list_bulk_insert_tasks(limit=limit) pending = 0 started = 0 persisted = 0 completed = 0 failed = 0 failed_and_cleaned = 0 unknown = 0 for task in tasks: print(task) if task.state == BulkInsertState.ImportPending: pending = pending + 1 elif task.state == BulkInsertState.ImportStarted: started = started + 1 elif task.state == BulkInsertState.ImportPersisted: persisted = persisted + 1 elif task.state == BulkInsertState.ImportCompleted: completed = completed + 1 elif task.state == BulkInsertState.ImportFailed: failed = failed + 1 elif task.state == BulkInsertState.ImportFailedAndCleaned: failed_and_cleaned = failed_and_cleaned + 1 else: unknown = unknown + 1 log.info("There are", len(tasks), "bulkload tasks.", pending, "pending,", started, "started,", persisted, "persisted,", completed, "completed,", failed, "failed", failed_and_cleaned, "failed_and_cleaned", unknown, "unknown") def wait_for_bulk_insert_tasks_completed(self, task_ids, target_state=BulkInsertState.ImportCompleted, timeout=None, using="default", **kwargs): tasks_state_distribution = { "success": set(), "failed": set(), "in_progress": set() } tasks_state = {} if timeout is not None: task_timeout = timeout else: task_timeout = TIMEOUT start = time.time() end = time.time() log.info(f"wait bulk load timeout is {task_timeout}") pending_tasks = self.get_bulk_insert_pending_list() log.info(f"before waiting, there are {len(pending_tasks)} pending tasks") while len(tasks_state_distribution["success"]) + len(tasks_state_distribution["failed"]) < len( task_ids) and end - start <= task_timeout: time.sleep(2) for task_id in task_ids: if task_id in tasks_state_distribution["success"] or task_id in tasks_state_distribution["failed"]: continue else: state, _ = self.get_bulk_insert_state(task_id, task_timeout, using, **kwargs) tasks_state[task_id] = state if target_state == BulkInsertState.ImportPersisted: if state.state in [BulkInsertState.ImportPersisted, BulkInsertState.ImportCompleted]: if task_id in tasks_state_distribution["in_progress"]: tasks_state_distribution["in_progress"].remove(task_id) tasks_state_distribution["success"].add(task_id) elif state.state in [BulkInsertState.ImportPending, BulkInsertState.ImportStarted]: tasks_state_distribution["in_progress"].add(task_id) else: tasks_state_distribution["failed"].add(task_id) if target_state == BulkInsertState.ImportCompleted: if state.state in [BulkInsertState.ImportCompleted]: if task_id in tasks_state_distribution["in_progress"]: tasks_state_distribution["in_progress"].remove(task_id) tasks_state_distribution["success"].add(task_id) elif state.state in [BulkInsertState.ImportPending, BulkInsertState.ImportStarted, BulkInsertState.ImportPersisted]: tasks_state_distribution["in_progress"].add(task_id) else: tasks_state_distribution["failed"].add(task_id) end = time.time() pending_tasks = self.get_bulk_insert_pending_list() log.info(f"after waiting, there are {len(pending_tasks)} pending tasks") log.info(f"task state distribution: {tasks_state_distribution}") log.info(tasks_state) if len(tasks_state_distribution["success"]) == len(task_ids): log.info(f"wait for bulk load tasks completed successfully, cost time: {end - start}") return True, tasks_state else: log.info(f"wait for bulk load tasks completed failed, cost time: {end - start}") return False, tasks_state def wait_all_pending_tasks_finished(self): task_states_map = {} all_tasks, _ = self.list_bulk_insert_tasks() # log.info(f"all tasks: {all_tasks}") for task in all_tasks: if task.state in [BulkInsertState.ImportStarted, BulkInsertState.ImportPersisted]: task_states_map[task.task_id] = task.state log.info(f"current tasks states: {task_states_map}") pending_tasks = self.get_bulk_insert_pending_list() working_tasks = self.get_bulk_insert_working_list() log.info( f"in the start, there are {len(working_tasks)} working tasks, {working_tasks} {len(pending_tasks)} pending tasks, {pending_tasks}") time_cnt = 0 pending_task_ids = set() while len(pending_tasks) > 0: time.sleep(5) time_cnt += 5 pending_tasks = self.get_bulk_insert_pending_list() working_tasks = self.get_bulk_insert_working_list() cur_pending_task_ids = [] for task_id in pending_tasks.keys(): cur_pending_task_ids.append(task_id) pending_task_ids.add(task_id) log.info( f"after {time_cnt}, there are {len(working_tasks)} working tasks, {len(pending_tasks)} pending tasks") log.debug(f"total pending tasks: {pending_task_ids} current pending tasks: {cur_pending_task_ids}") log.info(f"after {time_cnt}, all pending tasks are finished") all_tasks, _ = self.list_bulk_insert_tasks() for task in all_tasks: if task.task_id in pending_task_ids: log.info(f"task {task.task_id} state transfer from pending to {task.state_name}") def wait_index_build_completed(self, collection_name, timeout=None): start = time.time() if timeout is not None: task_timeout = timeout else: task_timeout = TIMEOUT end = time.time() while end - start <= task_timeout: time.sleep(0.5) index_states, _ = self.index_building_progress(collection_name) log.debug(f"index states: {index_states}") if index_states["total_rows"] == index_states["indexed_rows"]: log.info(f"index build completed") return True end = time.time() log.info(f"index build timeout") return False def get_query_segment_info(self, collection_name, timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.get_query_segment_info, collection_name, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, timeout=timeout, using=using).run() return res, check_result def loading_progress(self, collection_name, partition_names=None, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.loading_progress, collection_name, partition_names, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, partition_names=partition_names, using=using).run() return res, check_result def load_state(self, collection_name, partition_names=None, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.load_state, collection_name, partition_names, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, partition_names=partition_names, using=using).run() return res, check_result def wait_for_loading_complete(self, collection_name, partition_names=None, timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.wait_for_loading_complete, collection_name, partition_names, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, partition_names=partition_names, timeout=timeout, using=using).run() return res, check_result def index_building_progress(self, collection_name, index_name="", using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.index_building_progress, collection_name, index_name, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, index_name=index_name, using=using).run() return res, check_result def wait_for_index_building_complete(self, collection_name, index_name="", timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.wait_for_index_building_complete, collection_name, index_name, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, index_name=index_name, timeout=timeout, using=using).run() return res, check_result def has_collection(self, collection_name, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.has_collection, collection_name, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, using=using).run() return res, check_result def has_partition(self, collection_name, partition_name, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.has_partition, collection_name, partition_name, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, partition_name=partition_name, using=using).run() return res, check_result def drop_collection(self, collection_name, timeout=None, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.drop_collection, collection_name, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, collection_name=collection_name, timeout=timeout, using=using).run() return res, check_result def list_collections(self, timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.list_collections, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, timeout=timeout, using=using).run() return res, check_result def calc_distance(self, vectors_left, vectors_right, params=None, timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.calc_distance, vectors_left, vectors_right, params, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, timeout=timeout, using=using).run() return res, check_result def load_balance(self, collection_name, src_node_id, dst_node_ids, sealed_segment_ids, timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.load_balance, collection_name, src_node_id, dst_node_ids, sealed_segment_ids, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, timeout=timeout, using=using).run() return res, check_result def create_alias(self, collection_name, alias, timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.create_alias, collection_name, alias, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, timeout=timeout, using=using).run() return res, check_result def drop_alias(self, alias, timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.drop_alias, alias, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, timeout=timeout, using=using).run() return res, check_result def alter_alias(self, collection_name, alias, timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.alter_alias, collection_name, alias, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, timeout=timeout, using=using).run() return res, check_result def list_aliases(self, collection_name, timeout=None, using="default", check_task=None, check_items=None): timeout = TIMEOUT if timeout is None else timeout func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.list_aliases, collection_name, timeout, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, timeout=timeout, using=using).run() return res, check_result def mkts_from_datetime(self, d_time=None, milliseconds=0., delta=None): d_time = datetime.now() if d_time is None else d_time res, _ = api_request([self.ut.mkts_from_datetime, d_time, milliseconds, delta]) return res def mkts_from_hybridts(self, hybridts, milliseconds=0., delta=None): res, _ = api_request([self.ut.mkts_from_hybridts, hybridts, milliseconds, delta]) return res def create_user(self, user, password, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.create_user, user, password, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, using=using).run() return res, check_result def list_usernames(self, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.list_usernames, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, using=using).run() return res, check_result def reset_password(self, user, old_password, new_password, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.reset_password, user, old_password, new_password]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ).run() return res, check_result def update_password(self, user, old_password, new_password, check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.update_password, user, old_password, new_password]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ).run() return res, check_result def delete_user(self, user, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.delete_user, user, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, using=using).run() return res, check_result def list_roles(self, include_user_info: bool, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.list_roles, include_user_info, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, using=using).run() return res, check_result def list_user(self, username: str, include_role_info: bool, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.list_user, username, include_role_info, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, using=using).run() return res, check_result def list_users(self, include_role_info: bool, using="default", check_task=None, check_items=None): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.ut.list_users, include_role_info, using]) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, using=using).run() return res, check_result def init_role(self, name, using="default", check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([Role, name, using], **kwargs) self.role = res if is_succ else None check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, name=name, **kwargs).run() return res, check_result def create_role(self, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, is_succ = api_request([self.role.create], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, is_succ, **kwargs).run() return res, check_result def role_drop(self, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.role.drop], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def role_is_exist(self, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.role.is_exist], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def role_add_user(self, username: str, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.role.add_user, username], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def role_remove_user(self, username: str, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.role.remove_user, username], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def role_get_users(self, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.role.get_users], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result @property def role_name(self): return self.role.name def role_grant(self, object: str, object_name: str, privilege: str, db_name: str = "", check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.role.grant, object, object_name, privilege, db_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def role_revoke(self, object: str, object_name: str, privilege: str, db_name: str = "", check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.role.revoke, object, object_name, privilege, db_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def role_list_grant(self, object: str, object_name: str, db_name: str = "", check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.role.list_grant, object, object_name, db_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def role_list_grants(self, db_name: str = "", check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.role.list_grants, db_name], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def create_resource_group(self, name, using="default", timeout=None, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.ut.create_resource_group, name, using, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def drop_resource_group(self, name, using="default", timeout=None, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.ut.drop_resource_group, name, using, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def list_resource_groups(self, using="default", timeout=None, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.ut.list_resource_groups, using, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def describe_resource_group(self, name, using="default", timeout=None, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.ut.describe_resource_group, name, using, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def transfer_node(self, source, target, num_node, using="default", timeout=None, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.ut.transfer_node, source, target, num_node, using, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def transfer_replica(self, source, target, collection_name, num_replica, using="default", timeout=None, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request( [self.ut.transfer_replica, source, target, collection_name, num_replica, using, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, **kwargs).run() return res, check_result def rename_collection(self, old_collection_name, new_collection_name, new_db_name="", timeout=None, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.ut.rename_collection, old_collection_name, new_collection_name, new_db_name, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, old_collection_name=old_collection_name, new_collection_name=new_collection_name, new_db_name=new_db_name, timeout=timeout, **kwargs).run() return res, check_result def flush_all(self, using="default", timeout=None, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.ut.flush_all, using, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, using=using, timeout=timeout, **kwargs).run() return res, check_result def get_server_type(self, using="default", check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.ut.get_server_type, using], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, using=using, **kwargs).run() return res, check_result def list_indexes(self, collection_name, using="default", timeout=None, check_task=None, check_items=None, **kwargs): func_name = sys._getframe().f_code.co_name res, check = api_request([self.ut.list_indexes, collection_name, using, timeout], **kwargs) check_result = ResponseChecker(res, func_name, check_task, check_items, check, collection_name=collection_name, using=using, timeout=timeout, **kwargs).run() return res, check_result ================================================ FILE: tests/check/func_check.py ================================================ from pymilvus.client.types import CompactionPlans from pymilvus import Role from utils.util_log import test_log as log from common import common_type as ct from common import common_func as cf from common.common_type import CheckTasks, Connect_Object_Name # from common.code_mapping import ErrorCode, ErrorMessage from pymilvus import Collection, Partition, ResourceGroupInfo from utils.api_request import Error import check.param_check as pc class ResponseChecker: def __init__(self, response, func_name, check_task, check_items, is_succ=True, **kwargs): self.response = response # response of api request self.func_name = func_name # api function name self.check_task = check_task # task to check response of the api request self.check_items = check_items # check items and expectations that to be checked in check task self.succ = is_succ # api responses successful or not self.kwargs_dict = {} # not used for now, just for extension for key, value in kwargs.items(): self.kwargs_dict[key] = value self.keys = self.kwargs_dict.keys() def run(self): """ Method: start response checking for milvus API call """ result = True if self.check_task is None: # Interface normal return check result = self.assert_succ(self.succ, True) elif self.check_task == CheckTasks.err_res: # Interface return error code and error message check result = self.assert_exception(self.response, self.succ, self.check_items) elif self.check_task == CheckTasks.check_nothing: return self.succ elif self.check_task == CheckTasks.ccr: # Connection interface response check result = self.check_value_equal(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_collection_property: # Collection interface response check result = self.check_collection_property(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_partition_property: # Partition interface response check result = self.check_partition_property(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_search_results: # Search interface of collection and partition that response check result = self.check_search_results(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_search_iterator: # Search iterator interface of collection and partition that response check result = self.check_search_iterator(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_query_results: # Query interface of collection and partition that response check result = self.check_query_results(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_query_iterator: # query iterator interface of collection and partition that response check result = self.check_query_iterator(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_query_empty: result = self.check_query_empty(self.response, self.func_name) elif self.check_task == CheckTasks.check_query_empty: result = self.check_query_not_empty(self.response, self.func_name) elif self.check_task == CheckTasks.check_distance: # Calculate distance interface that response check result = self.check_distance(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_delete_compact: result = self.check_delete_compact_plan(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_merge_compact: result = self.check_merge_compact_plan(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_role_property: # Collection interface response check result = self.check_role_property(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_permission_deny: # Collection interface response check result = self.check_permission_deny(self.response, self.succ) elif self.check_task == CheckTasks.check_auth_failure: # connection interface response check result = self.check_auth_failure(self.response, self.succ) elif self.check_task == CheckTasks.check_rg_property: # describe resource group interface response check result = self.check_rg_property(self.response, self.func_name, self.check_items) elif self.check_task == CheckTasks.check_describe_collection_property: # describe collection interface(high level api) response check result = self.check_describe_collection_property(self.response, self.func_name, self.check_items) # Add check_items here if something new need verify return result def assert_succ(self, actual, expect): assert actual is expect, f"Response of API {self.func_name} expect {expect}, but got {actual}" return True def assert_exception(self, res, actual=True, error_dict=None): assert actual is False assert len(error_dict) > 0 if isinstance(res, Error): error_code = error_dict[ct.err_code] assert res.code == error_code or error_dict[ct.err_msg] in res.message, ( f"Response of API {self.func_name} " f"expect get error code {error_dict[ct.err_code]} or error message {error_dict[ct.err_code]}, " f"but got {res.code} {res.message}") else: log.error("[CheckFunc] Response of API is not an error: %s" % str(res)) assert False, (f"Response of API expect get error code {error_dict[ct.err_code]} or " f"error message {error_dict[ct.err_code]}" f"but success") return True @staticmethod def check_value_equal(res, func_name, params): """ check response of connection interface that result is normal """ if func_name == "list_connections": if not isinstance(res, list): log.error("[CheckFunc] Response of list_connections is not a list: %s" % str(res)) assert False list_content = params.get(ct.list_content, None) if not isinstance(list_content, list): log.error("[CheckFunc] Check param of list_content is not a list: %s" % str(list_content)) assert False new_res = pc.get_connect_object_name(res) assert pc.list_equal_check(new_res, list_content) if func_name == "get_connection_addr": dict_content = params.get(ct.dict_content, None) assert pc.dict_equal_check(res, dict_content) if func_name == "connect": type_name = type(res).__name__ assert not type_name.lower().__contains__("error") if func_name == "has_connection": value_content = params.get(ct.value_content, False) res_obj = res if res is not None else False assert res_obj == value_content return True @staticmethod def check_collection_property(res, func_name, check_items): """ According to the check_items to check collection properties of res, which return from func_name :param res: actual response of init collection :type res: Collection :param func_name: init collection API :type func_name: str :param check_items: which items expected to be checked, including name, schema, num_entities, primary :type check_items: dict, {check_key: expected_value} """ exp_func_name = "init_collection" exp_func_name_2 = "construct_from_dataframe" if func_name != exp_func_name and func_name != exp_func_name_2: log.warning("The function name is {} rather than {}".format(func_name, exp_func_name)) if isinstance(res, Collection): collection = res elif isinstance(res, tuple): collection = res[0] log.debug(collection.schema) else: raise Exception(f"The result to check isn't collection type object: {res}") if len(check_items) == 0: raise Exception("No expect values found in the check task") if check_items.get("name", None): assert collection.name == check_items.get("name") if check_items.get("schema", None): assert collection.schema == check_items.get("schema") if check_items.get("num_entities", None): if check_items.get("num_entities") == 0: assert collection.is_empty assert collection.num_entities == check_items.get("num_entities") if check_items.get("primary", None): assert collection.primary_field.name == check_items.get("primary") return True @staticmethod def check_describe_collection_property(res, func_name, check_items): """ According to the check_items to check collection properties of res, which return from func_name :param res: actual response of init collection :type res: Collection :param func_name: init collection API :type func_name: str :param check_items: which items expected to be checked, including name, schema, num_entities, primary :type check_items: dict, {check_key: expected_value} """ exp_func_name = "describe_collection" if func_name != exp_func_name: log.warning("The function name is {} rather than {}".format(func_name, exp_func_name)) if len(check_items) == 0: raise Exception("No expect values found in the check task") if check_items.get("collection_name", None) is not None: assert res["collection_name"] == check_items.get("collection_name") if check_items.get("auto_id", False): assert res["auto_id"] == check_items.get("auto_id") if check_items.get("enable_dynamic_field", True): assert res["enable_dynamic_field"] == check_items.get("enable_dynamic_field", True) if check_items.get("id_name", "id"): assert res["fields"][0]["name"] == check_items.get("id_name", "id") if check_items.get("vector_name", "vector"): assert res["fields"][1]["name"] == check_items.get("vector_name", "vector") if check_items.get("dim", None) is not None: assert res["fields"][1]["params"]["dim"] == check_items.get("dim") assert res["fields"][0]["is_primary"] is True assert res["fields"][0]["field_id"] == 100 and (res["fields"][0]["type"] == 5 or 21) assert res["fields"][1]["field_id"] == 101 and res["fields"][1]["type"] == 101 return True @staticmethod def check_partition_property(partition, func_name, check_items): exp_func_name = "init_partition" if func_name != exp_func_name: log.warning("The function name is {} rather than {}".format(func_name, exp_func_name)) if not isinstance(partition, Partition): raise Exception("The result to check isn't partition type object") if len(check_items) == 0: raise Exception("No expect values found in the check task") if check_items.get("name", None): assert partition.name == check_items["name"] if check_items.get("description", None): assert partition.description == check_items["description"] if check_items.get("is_empty", None): assert partition.is_empty == check_items["is_empty"] if check_items.get("num_entities", None): assert partition.num_entities == check_items["num_entities"] return True @staticmethod def check_rg_property(rg, func_name, check_items): exp_func_name = "describe_resource_group" if func_name != exp_func_name: log.warning("The function name is {} rather than {}".format(func_name, exp_func_name)) if not isinstance(rg, ResourceGroupInfo): raise Exception("The result to check isn't ResourceGroupInfo type object") if len(check_items) == 0: raise Exception("No expect values found in the check task") if check_items.get("name", None): assert rg.name == check_items["name"] if check_items.get("capacity", None): assert rg.capacity == check_items["capacity"] if check_items.get("num_available_node", None): assert rg.num_available_node == check_items["num_available_node"] if check_items.get("num_loaded_replica", None): assert dict(rg.num_loaded_replica).items() >= check_items["num_loaded_replica"].items() if check_items.get("num_outgoing_node", None): assert dict(rg.num_outgoing_node).items() >= check_items["num_outgoing_node"].items() if check_items.get("num_incoming_node", None): assert dict(rg.num_incoming_node).items() >= check_items["num_incoming_node"].items() return True @staticmethod def check_search_results(search_res, func_name, check_items): """ target: check the search results method: 1. check the query number 2. check the limit(topK) and ids 3. check the distance expected: check the search is ok """ log.info("search_results_check: checking the searching results") if func_name != 'search' or func_name != 'hybrid_search': log.warning("The function name is {} rather than {} or {}".format(func_name, "search", "hybrid_search")) if len(check_items) == 0: raise Exception("No expect values found in the check task") if check_items.get("_async", None): if check_items["_async"]: search_res.done() search_res = search_res.result() if check_items.get("output_fields", None): assert set(search_res[0][0].entity.fields) == set(check_items["output_fields"]) log.info('search_results_check: Output fields of query searched is correct') if check_items.get("original_entities", None): original_entities = check_items["original_entities"][0] pc.output_field_value_check(search_res, original_entities) if len(search_res) != check_items["nq"]: log.error("search_results_check: Numbers of query searched (%d) " "is not equal with expected (%d)" % (len(search_res), check_items["nq"])) assert len(search_res) == check_items["nq"] else: log.info("search_results_check: Numbers of query searched is correct") enable_milvus_client_api = check_items.get("enable_milvus_client_api", False) # log.debug(search_res) for hits in search_res: searched_original_vectors = [] ids = [] if enable_milvus_client_api: for hit in hits: ids.append(hit['id']) else: ids = list(hits.ids) if (len(hits) != check_items["limit"]) \ or (len(ids) != check_items["limit"]): log.error("search_results_check: limit(topK) searched (%d) " "is not equal with expected (%d)" % (len(hits), check_items["limit"])) assert len(hits) == check_items["limit"] assert len(ids) == check_items["limit"] else: if check_items.get("ids", None) is not None: ids_match = pc.list_contain_check(ids, list(check_items["ids"])) if not ids_match: log.error("search_results_check: ids searched not match") assert ids_match elif check_items.get("metric", None) is not None: if check_items.get("vector_nq") is None: raise Exception("vector for searched (nq) is needed for distance check") if check_items.get("original_vectors") is None: raise Exception("inserted vectors are needed for distance check") for id in hits.ids: searched_original_vectors.append(check_items["original_vectors"][id]) cf.compare_distance_vector_and_vector_list(check_items["vector_nq"][i], searched_original_vectors, check_items["metric"], hits.distances) log.info("search_results_check: Checked the distances for one nq: OK") else: pass # just check nq and topk, not specific ids need check log.info("search_results_check: limit (topK) and " "ids searched for %d queries are correct" % len(search_res)) return True @staticmethod def check_search_iterator(search_res, func_name, check_items): """ target: check the search iterator results method: 1. check the iterator number 2. check the limit(topK) and ids 3. check the distance expected: check the search is ok """ log.info("search_iterator_results_check: checking the searching results") if func_name != 'search_iterator': log.warning("The function name is {} rather than {}".format(func_name, "search_iterator")) search_iterator = search_res pk_list = [] while True: res = search_iterator.next() if len(res) == 0: log.info("search iteration finished, close") search_iterator.close() break if check_items.get("batch_size", None): assert len(res) <= check_items["batch_size"] if check_items.get("radius", None): for distance in res.distances(): if check_items["metric_type"] == "L2": assert distance < check_items["radius"] else: assert distance > check_items["radius"] if check_items.get("range_filter", None): for distance in res.distances(): if check_items["metric_type"] == "L2": assert distance >= check_items["range_filter"] else: assert distance <= check_items["range_filter"] pk_list.extend(res.ids()) assert len(pk_list) == len(set(pk_list)) log.info("check: total %d results" % len(pk_list)) return True @staticmethod def check_query_results(query_res, func_name, check_items): """ According to the check_items to check actual query result, which return from func_name. :param: query_res: A list that contains all results :type: list :param func_name: Query API name :type func_name: str :param check_items: The items expected to be checked, including exp_res, with_vec The type of exp_res value is as same as query_res The type of with_vec value is bool, True value means check vector field, False otherwise :type check_items: dict """ if func_name != 'query': log.warning("The function name is {} rather than {}".format(func_name, "query")) if not isinstance(query_res, list): raise Exception("The query result to check isn't list type object") if len(check_items) == 0: raise Exception("No expect values found in the check task") exp_res = check_items.get("exp_res", None) with_vec = check_items.get("with_vec", False) primary_field = check_items.get("primary_field", None) if exp_res is not None: if isinstance(query_res, list): assert pc.equal_entities_list(exp=exp_res, actual=query_res, primary_field=primary_field, with_vec=with_vec) return True else: log.error(f"Query result {query_res} is not list") return False log.warning(f'Expected query result is {exp_res}') @staticmethod def check_query_iterator(query_res, func_name, check_items): """ target: check the query results method: 1. check the query number 2. check the limit(topK) and ids 3. check the distance expected: check the search is ok """ log.info("query_iterator_results_check: checking the query results") if func_name != 'query_iterator': log.warning("The function name is {} rather than {}".format(func_name, "query_iterator")) query_iterator = query_res pk_list = [] while True: res = query_iterator.next() if len(res) == 0: log.info("search iteration finished, close") query_iterator.close() break for i in range(len(res)): pk_list.append(res[i][ct.default_int64_field_name]) if check_items.get("limit", None): assert len(res) <= check_items["limit"] assert len(pk_list) == len(set(pk_list)) if check_items.get("count", None): log.info(len(pk_list)) assert len(pk_list) == check_items["count"] if check_items.get("exp_ids", None): assert pk_list == check_items["exp_ids"] log.info("check: total %d results" % len(pk_list)) return True @staticmethod def check_query_empty(query_res, func_name): """ Verify that the query result is empty :param: query_res: A list that contains all results :type: list :param func_name: Query API name :type func_name: str """ if func_name != 'query': log.warning("The function name is {} rather than {}".format(func_name, "query")) if not isinstance(query_res, list): raise Exception("The query result to check isn't list type object") assert len(query_res) == 0, "Query result is not empty" @staticmethod def check_query_not_empty(query_res, func_name): """ Verify that the query result is not empty :param: query_res: A list that contains all results :type: list :param func_name: Query API name :type func_name: str """ if func_name != 'query': log.warning("The function name is {} rather than {}".format(func_name, "query")) if not isinstance(query_res, list): raise Exception("The query result to check isn't list type object") assert len(query_res) > 0 @staticmethod def check_distance(distance_res, func_name, check_items): if func_name != 'calc_distance': log.warning("The function name is {} rather than {}".format(func_name, "calc_distance")) if not isinstance(distance_res, list): raise Exception("The distance result to check isn't list type object") if len(check_items) == 0: raise Exception("No expect values found in the check task") vectors_l = check_items["vectors_l"] vectors_r = check_items["vectors_r"] metric = check_items.get("metric", "L2") sqrt = check_items.get("sqrt", False) cf.compare_distance_2d_vector(vectors_l, vectors_r, distance_res, metric, sqrt) return True @staticmethod def check_delete_compact_plan(compaction_plans, func_name, check_items): """ Verify that the delete type compaction plan :param: compaction_plans: A compaction plan :type: CompactionPlans :param func_name: get_compaction_plans API name :type func_name: str :param check_items: which items you wish to check plans_num represent the delete compact plans number :type: dict """ to_check_func = 'get_compaction_plans' if func_name != to_check_func: log.warning("The function name is {} rather than {}".format(func_name, to_check_func)) if not isinstance(compaction_plans, CompactionPlans): raise Exception("The compaction_plans result to check isn't CompactionPlans type object") plans_num = check_items.get("plans_num", 1) assert len(compaction_plans.plans) == plans_num for plan in compaction_plans.plans: assert len(plan.sources) == 1 assert plan.sources[0] != plan.target @staticmethod def check_merge_compact_plan(compaction_plans, func_name, check_items): """ Verify that the merge type compaction plan :param: compaction_plans: A compaction plan :type: CompactionPlans :param func_name: get_compaction_plans API name :type func_name: str :param check_items: which items you wish to check segment_num represent how many segments are expected to be merged, default is 2 :type: dict """ to_check_func = 'get_compaction_plans' if func_name != to_check_func: log.warning("The function name is {} rather than {}".format(func_name, to_check_func)) if not isinstance(compaction_plans, CompactionPlans): raise Exception("The compaction_plans result to check isn't CompactionPlans type object") segment_num = check_items.get("segment_num", 2) assert len(compaction_plans.plans) == 1 assert len(compaction_plans.plans[0].sources) == segment_num assert compaction_plans.plans[0].target not in compaction_plans.plans[0].sources @staticmethod def check_role_property(role, func_name, check_items): exp_func_name = "create_role" if func_name != exp_func_name: log.warning("The function name is {} rather than {}".format(func_name, exp_func_name)) if not isinstance(role, Role): raise Exception("The result to check isn't role type object") if check_items is None: raise Exception("No expect values found in the check task") if check_items.get("name", None): assert role.name == check_items["name"] return True @staticmethod def check_permission_deny(res, actual=True): assert actual is False if isinstance(res, Error): assert "permission deny" in res.message else: log.error("[CheckFunc] Response of API is not an error: %s" % str(res)) assert False return True @staticmethod def check_auth_failure(res, actual=True): assert actual is False if isinstance(res, Error): assert "auth" in res.message else: log.error("[CheckFunc] Response of API is not an error: %s" % str(res)) assert False return True ================================================ FILE: tests/check/param_check.py ================================================ import sys import operator from common import common_type as ct sys.path.append("..") from utils.util_log import test_log as log def ip_check(ip): if ip == "localhost": return True if not isinstance(ip, str): log.error("[IP_CHECK] IP(%s) is not a string." % ip) return False return True def number_check(num): if str(num).isdigit(): return True else: log.error("[NUMBER_CHECK] Number(%s) is not a numbers." % num) return False def exist_check(param, _list): if param in _list: return True else: log.error("[EXIST_CHECK] Param(%s) is not in (%s)." % (param, _list)) return False def dict_equal_check(dict1, dict2): if not isinstance(dict1, dict) or not isinstance(dict2, dict): log.error("[DICT_EQUAL_CHECK] Type of dict(%s) or dict(%s) is not a dict." % (str(dict1), str(dict2))) return False return operator.eq(dict1, dict2) def list_de_duplication(_list): if not isinstance(_list, list): log.error("[LIST_DE_DUPLICATION] Type of list(%s) is not a list." % str(_list)) return _list # de-duplication of _list result = list(set(_list)) # Keep the order of the elements unchanged result.sort(key=_list.index) log.debug("[LIST_DE_DUPLICATION] %s after removing the duplicate elements, the list becomes %s" % ( str(_list), str(result))) return result def list_equal_check(param1, param2): check_result = True if len(param1) == len(param1): _list1 = list_de_duplication(param1) _list2 = list_de_duplication(param2) if len(_list1) == len(_list2): for i in _list1: if i not in _list2: check_result = False break else: check_result = False else: check_result = False if check_result is False: log.error("[LIST_EQUAL_CHECK] List(%s) and list(%s) are not equal." % (str(param1), str(param2))) return check_result def list_contain_check(sublist, superlist): if not isinstance(sublist, list): raise Exception("%s isn't list type" % sublist) if not isinstance(superlist, list): raise Exception("%s isn't list type" % superlist) check_result = True for i in sublist: if i not in superlist: check_result = False break else: superlist.remove(i) if not check_result: log.error("list_contain_check: List(%s) does not contain list(%s)" % (str(superlist), str(sublist))) return check_result def get_connect_object_name(_list): """ get the name of the objects that returned by the connection """ if not isinstance(_list, list): log.error("[GET_CONNECT_OBJECT_NAME] Type of list(%s) is not a list." % str(_list)) return _list new_list = [] for i in _list: if not isinstance(i, tuple): log.error("[GET_CONNECT_OBJECT_NAME] The element:%s of the list is not tuple, please check manually." % str(i)) return _list if len(i) != 2: log.error("[GET_CONNECT_OBJECT_NAME] The length of the tuple:%s is not equal to 2, please check manually." % str(i)) return _list if i[1] is not None: _obj_name = type(i[1]).__name__ new_list.append((i[0], _obj_name)) else: new_list.append(i) log.debug("[GET_CONNECT_OBJECT_NAME] list:%s is reset to list:%s" % (str(_list), str(new_list))) return new_list def equal_entity(exp, actual): """ compare two entities containing vector field {"int64": 0, "float": 0.0, "float_vec": [0.09111554112502457, ..., 0.08652634258062468]} :param exp: exp entity :param actual: actual entity :return: bool """ assert actual.keys() == exp.keys() for field, value in exp.items(): if isinstance(value, list): assert len(actual[field]) == len(exp[field]) for i in range(0, len(exp[field]), 4): assert abs(actual[field][i] - exp[field][i]) < ct.epsilon else: assert actual[field] == exp[field] return True def entity_in(entity, entities, primary_field): """ according to the primary key to judge entity in the entities list :param entity: dict {"int": 0, "vec": [0.999999, 0.111111]} :param entities: list of dict [{"int": 0, "vec": [0.999999, 0.111111]}, {"int": 1, "vec": [0.888888, 0.222222]}] :param primary_field: collection primary field :return: True or False """ primary_default = ct.default_int64_field_name primary_field = primary_default if primary_field is None else primary_field primary_key = entity.get(primary_field, None) primary_keys = [] for e in entities: primary_keys.append(e[primary_field]) if primary_key not in primary_keys: return False index = primary_keys.index(primary_key) return equal_entity(entities[index], entity) def remove_entity(entity, entities, primary_field): """ according to the primary key to remove an entity from an entities list :param entity: dict {"int": 0, "vec": [0.999999, 0.111111]} :param entities: list of dict [{"int": 0, "vec": [0.999999, 0.111111]}, {"int": 1, "vec": [0.888888, 0.222222]}] :param primary_field: collection primary field :return: entities of removed entity """ primary_default = ct.default_int64_field_name primary_field = primary_default if primary_field is None else primary_field primary_key = entity.get(primary_field, None) primary_keys = [] for e in entities: primary_keys.append(e[primary_field]) index = primary_keys.index(primary_key) entities.pop(index) return entities def equal_entities_list(exp, actual, primary_field, with_vec=False): """ compare two entities lists in inconsistent order :param with_vec: whether entities with vec field :param exp: exp entities list, list of dict :param actual: actual entities list, list of dict :return: True or False example: exp = [{"int": 0, "vec": [0.999999, 0.111111]}, {"int": 1, "vec": [0.888888, 0.222222]}] actual = [{"int": 1, "vec": [0.888888, 0.222222]}, {"int": 0, "vec": [0.999999, 0.111111]}] exp = actual """ exp = exp.copy() if len(exp) != len(actual): return False if with_vec: for a in actual: # if vec field returned in query res if entity_in(a, exp, primary_field): try: # if vec field returned in query res remove_entity(a, exp, primary_field) except Exception as ex: log.error(ex) else: for a in actual: if a in exp: try: exp.remove(a) except Exception as ex: log.error(ex) return True if len(exp) == 0 else False def output_field_value_check(search_res, original): """ check if the value of output fields is correct :param search_res: the search result of specific output fields :param original: the data in the collection :return: True or False """ limit = len(search_res[0]) for i in range(limit): entity = eval(str(search_res[0][i]).split('entity: ', 1)[1]) _id = search_res[0][i].id for field in entity.keys(): if isinstance(entity[field], list): for order in range(0, len(entity[field]), 4): assert abs(original[field][_id][order] - entity[field][order]) < ct.epsilon else: num = original[original[ct.default_int64_field_name] == _id].index.to_list()[0] assert original[field][num] == entity[field] return True ================================================ FILE: tests/common/bulk_insert_data.py ================================================ import copy import json import os import time import numpy as np import jax.numpy as jnp import pandas as pd import random from faker import Faker from sklearn import preprocessing from common.common_func import gen_unique_str from common.minio_comm import copy_files_to_minio from utils.util_log import test_log as log data_source = "/tmp/bulk_insert_data" fake = Faker() BINARY = "binary" FLOAT = "float" class DataField: pk_field = "uid" vec_field = "vectors" float_vec_field = "float_vectors" image_float_vec_field = "image_float_vec_field" text_float_vec_field = "text_float_vec_field" binary_vec_field = "binary_vec_field" bf16_vec_field = "bf16_vec_field" fp16_vec_field = "fp16_vec_field" int_field = "int_scalar" string_field = "string_scalar" bool_field = "bool_scalar" float_field = "float_scalar" double_field = "double_scalar" json_field = "json" array_bool_field = "array_bool" array_int_field = "array_int" array_float_field = "array_float" array_string_field = "array_string" class DataErrorType: one_entity_wrong_dim = "one_entity_wrong_dim" str_on_int_pk = "str_on_int_pk" int_on_float_scalar = "int_on_float_scalar" float_on_int_pk = "float_on_int_pk" typo_on_bool = "typo_on_bool" str_on_float_scalar = "str_on_float_scalar" str_on_vector_field = "str_on_vector_field" empty_array_field = "empty_array_field" mismatch_type_array_field = "mismatch_type_array_field" def gen_file_prefix(is_row_based=True, auto_id=True, prefix=""): if is_row_based: if auto_id: return f"{prefix}_row_auto" else: return f"{prefix}_row_cust" else: if auto_id: return f"{prefix}_col_auto" else: return f"{prefix}_col_cust" def entity_suffix(rows): if rows // 1000000 > 0: suffix = f"{rows // 1000000}m" elif rows // 1000 > 0: suffix = f"{rows // 1000}k" else: suffix = f"{rows}" return suffix def gen_float_vectors(nb, dim): vectors = [[random.random() for _ in range(dim)] for _ in range(nb)] vectors = preprocessing.normalize(vectors, axis=1, norm='l2') return vectors.tolist() def gen_str_invalid_vectors(nb, dim): vectors = [[str(gen_unique_str()) for _ in range(dim)] for _ in range(nb)] return vectors def gen_binary_vectors(nb, dim): # binary: each int presents 8 dimension # so if binary vector dimension is 16,use [x, y], which x and y could be any int between 0 and 255 vectors = [[random.randint(0, 255) for _ in range(dim)] for _ in range(nb)] return vectors def gen_fp16_vectors(num, dim): """ generate float16 vector data raw_vectors : the vectors fp16_vectors: the bytes used for insert return: raw_vectors and fp16_vectors """ raw_vectors = [] fp16_vectors = [] for _ in range(num): raw_vector = [random.random() for _ in range(dim)] raw_vectors.append(raw_vector) fp16_vector = np.array(raw_vector, dtype=np.float16).view(np.uint8).tolist() fp16_vectors.append(fp16_vector) return raw_vectors, fp16_vectors def gen_bf16_vectors(num, dim): """ generate brain float16 vector data raw_vectors : the vectors bf16_vectors: the bytes used for insert return: raw_vectors and bf16_vectors """ raw_vectors = [] bf16_vectors = [] for _ in range(num): raw_vector = [random.random() for _ in range(dim)] raw_vectors.append(raw_vector) bf16_vector = np.array(jnp.array(raw_vector, dtype=jnp.bfloat16)).view(np.uint8).tolist() bf16_vectors.append(bf16_vector) return raw_vectors, bf16_vectors def gen_row_based_json_file(row_file, str_pk, data_fields, float_vect, rows, dim, start_uid=0, err_type="", enable_dynamic_field=False, **kwargs): if err_type == DataErrorType.str_on_int_pk: str_pk = True if err_type in [DataErrorType.one_entity_wrong_dim, DataErrorType.str_on_vector_field]: wrong_dim = dim + 8 # add 8 to compatible with binary vectors wrong_row = kwargs.get("wrong_position", start_uid) with open(row_file, "w") as f: f.write("{") f.write("\n") f.write('"rows":[') f.write("\n") for i in range(rows): if i > 0: f.write(",") f.write("\n") # scalar fields f.write('{') for j in range(len(data_fields)): data_field = data_fields[j] if data_field == DataField.pk_field: if str_pk: line = '"uid":"' + str(gen_unique_str()) + '"' f.write(line) # f.write('"uid":"' + str(gen_unique_str()) + '"') else: if err_type == DataErrorType.float_on_int_pk: f.write('"uid":' + str(i + start_uid + random.random()) + '') else: f.write('"uid":' + str(i + start_uid) + '') if data_field == DataField.int_field: if DataField.pk_field in data_fields: # if not auto_id, use the same value as pk to check the query results later f.write('"int_scalar":' + str(i + start_uid) + '') else: line = '"int_scalar":' + str(random.randint(-999999, 9999999)) + '' f.write(line) if data_field == DataField.float_field: if err_type == DataErrorType.int_on_float_scalar: f.write('"float_scalar":' + str(random.randint(-999999, 9999999)) + '') elif err_type == DataErrorType.str_on_float_scalar: f.write('"float_scalar":"' + str(gen_unique_str()) + '"') else: line = '"float_scalar":' + str(random.random()) + '' f.write(line) if data_field == DataField.double_field: if err_type == DataErrorType.int_on_float_scalar: f.write('"double_scalar":' + str(random.randint(-999999, 9999999)) + '') elif err_type == DataErrorType.str_on_float_scalar: f.write('"double_scalar":"' + str(gen_unique_str()) + '"') else: line = '"double_scalar":' + str(random.random()) + '' f.write(line) if data_field == DataField.string_field: f.write('"string_scalar":"' + str(gen_unique_str()) + '"') if data_field == DataField.bool_field: if err_type == DataErrorType.typo_on_bool: f.write('"bool_scalar":' + str(random.choice(["True", "False", "TRUE", "FALSE", "0", "1"])) + '') else: f.write('"bool_scalar":' + str(random.choice(["true", "false"])) + '') if data_field == DataField.json_field: data = { gen_unique_str(): random.randint(-999999, 9999999), } f.write('"json":' + json.dumps(data) + '') if data_field == DataField.array_bool_field: if err_type == DataErrorType.empty_array_field: f.write('"array_bool":[]') elif err_type == DataErrorType.mismatch_type_array_field: f.write('"array_bool": "mistype"') else: f.write('"array_bool":[' + str(random.choice(["true", "false"])) + ',' + str(random.choice(["true", "false"])) + ']') if data_field == DataField.array_int_field: if err_type == DataErrorType.empty_array_field: f.write('"array_int":[]') elif err_type == DataErrorType.mismatch_type_array_field: f.write('"array_int": "mistype"') else: f.write('"array_int":[' + str(random.randint(-999999, 9999999)) + ',' + str(random.randint(-999999, 9999999)) + ']') if data_field == DataField.array_float_field: if err_type == DataErrorType.empty_array_field: f.write('"array_float":[]') elif err_type == DataErrorType.mismatch_type_array_field: f.write('"array_float": "mistype"') else: f.write('"array_float":[' + str(random.random()) + ',' + str(random.random()) + ']') if data_field == DataField.array_string_field: if err_type == DataErrorType.empty_array_field: f.write('"array_string":[]') elif err_type == DataErrorType.mismatch_type_array_field: f.write('"array_string": "mistype"') else: f.write('"array_string":["' + str(gen_unique_str()) + '","' + str(gen_unique_str()) + '"]') if data_field == DataField.vec_field: # vector field if err_type == DataErrorType.one_entity_wrong_dim and i == wrong_row: vectors = gen_float_vectors(1, wrong_dim) if float_vect else gen_binary_vectors(1, (wrong_dim//8)) elif err_type == DataErrorType.str_on_vector_field and i == wrong_row: vectors = gen_str_invalid_vectors(1, dim) if float_vect else gen_str_invalid_vectors(1, dim//8) else: vectors = gen_float_vectors(1, dim) if float_vect else gen_binary_vectors(1, (dim//8)) line = '"vectors":' + ",".join(str(x).replace("'", '"') for x in vectors) + '' f.write(line) # not write common for the last field if j != len(data_fields) - 1: f.write(',') if enable_dynamic_field: d = {str(i+start_uid): i+start_uid, "name": fake.name(), "address": fake.address()} d_str = json.dumps(d) d_str = d_str[1:-1] # remove {} f.write("," + d_str) f.write('}') f.write("\n") f.write("]") f.write("\n") f.write("}") f.write("\n") def gen_column_base_json_file(col_file, str_pk, data_fields, float_vect, rows, dim, start_uid=0, err_type="", **kwargs): if err_type == DataErrorType.str_on_int_pk: str_pk = True with open(col_file, "w") as f: f.write("{") f.write("\n") if rows > 0: # data columns for j in range(len(data_fields)): data_field = data_fields[j] if data_field == DataField.pk_field: if str_pk: f.write('"uid":["' + ',"'.join(str(gen_unique_str()) + '"' for i in range(rows)) + ']') f.write("\n") else: if err_type == DataErrorType.float_on_int_pk: f.write('"uid":[' + ",".join( str(i + random.random()) for i in range(start_uid, start_uid + rows)) + "]") else: f.write('"uid":[' + ",".join(str(i) for i in range(start_uid, start_uid + rows)) + "]") f.write("\n") if data_field == DataField.int_field: if DataField.pk_field in data_fields: # if not auto_id, use the same value as pk to check the query results later f.write('"int_scalar":[' + ",".join(str(i) for i in range(start_uid, start_uid + rows)) + "]") else: f.write('"int_scalar":[' + ",".join(str( random.randint(-999999, 9999999)) for i in range(rows)) + "]") f.write("\n") if data_field == DataField.float_field: if err_type == DataErrorType.int_on_float_scalar: f.write('"float_scalar":[' + ",".join( str(random.randint(-999999, 9999999)) for i in range(rows)) + "]") elif err_type == DataErrorType.str_on_float_scalar: f.write('"float_scalar":["' + ',"'.join(str( gen_unique_str()) + '"' for i in range(rows)) + ']') else: f.write('"float_scalar":[' + ",".join( str(random.random()) for i in range(rows)) + "]") f.write("\n") if data_field == DataField.string_field: f.write('"string_scalar":["' + ',"'.join(str( gen_unique_str()) + '"' for i in range(rows)) + ']') f.write("\n") if data_field == DataField.bool_field: if err_type == DataErrorType.typo_on_bool: f.write('"bool_scalar":[' + ",".join( str(random.choice(["True", "False", "TRUE", "FALSE", "1", "0"])) for i in range(rows)) + "]") else: f.write('"bool_scalar":[' + ",".join( str(random.choice(["true", "false"])) for i in range(rows)) + "]") f.write("\n") if data_field == DataField.vec_field: # vector columns if err_type == DataErrorType.one_entity_wrong_dim: wrong_dim = dim + 8 # add 8 to compatible with binary vectors wrong_row = kwargs.get("wrong_position", 0) if wrong_row <= 0: vectors1 = [] else: vectors1 = gen_float_vectors(wrong_row, dim) if float_vect else \ gen_binary_vectors(wrong_row, (dim//8)) if wrong_row >= rows -1: vectors2 = [] else: vectors2 = gen_float_vectors(rows-wrong_row-1, dim) if float_vect else\ gen_binary_vectors(rows-wrong_row-1, (dim//8)) vectors_wrong_dim = gen_float_vectors(1, wrong_dim) if float_vect else \ gen_binary_vectors(1, (wrong_dim//8)) vectors = vectors1 + vectors_wrong_dim + vectors2 elif err_type == DataErrorType.str_on_vector_field: wrong_row = kwargs.get("wrong_position", 0) if wrong_row <= 0: vectors1 = [] else: vectors1 = gen_float_vectors(wrong_row, dim) if float_vect else \ gen_binary_vectors(wrong_row, (dim//8)) if wrong_row >= rows - 1: vectors2 = [] else: vectors2 = gen_float_vectors(rows - wrong_row - 1, dim) if float_vect else \ gen_binary_vectors(rows - wrong_row - 1, (dim // 8)) invalid_str_vectors = gen_str_invalid_vectors(1, dim) if float_vect else \ gen_str_invalid_vectors(1, (dim // 8)) vectors = vectors1 + invalid_str_vectors + vectors2 else: vectors = gen_float_vectors(rows, dim) if float_vect else gen_binary_vectors(rows, (dim//8)) f.write('"vectors":[' + ",".join(str(x).replace("'", '"') for x in vectors) + "]") f.write("\n") if j != len(data_fields) - 1: f.write(",") f.write("}") f.write("\n") def gen_vectors_in_numpy_file(dir, data_field, float_vector, rows, dim, vector_type="float32", force=False): file_name = f"{data_field}.npy" file = f'{dir}/{file_name}' if not os.path.exists(file) or force: # vector columns vectors = [] if rows > 0: if vector_type == "float32": vectors = gen_float_vectors(rows, dim) arr = np.array(vectors) elif vector_type == "fp16": vectors = gen_fp16_vectors(rows, dim)[1] arr = np.array(vectors, dtype=np.dtype("uint8")) elif vector_type == "bf16": vectors = gen_bf16_vectors(rows, dim)[1] arr = np.array(vectors, dtype=np.dtype("uint8")) elif vector_type == "binary": vectors = gen_binary_vectors(rows, (dim // 8)) arr = np.array(vectors, dtype=np.dtype("uint8")) else: vectors = gen_binary_vectors(rows, (dim // 8)) arr = np.array(vectors, dtype=np.dtype("uint8")) log.info(f"file_name: {file_name} data type: {arr.dtype} data shape: {arr.shape}") np.save(file, arr) return file_name def gen_string_in_numpy_file(dir, data_field, rows, start=0, force=False): file_name = f"{data_field}.npy" file = f"{dir}/{file_name}" if not os.path.exists(file) or force: # non vector columns data = [] if rows > 0: data = [gen_unique_str(str(i)) for i in range(start, rows+start)] arr = np.array(data) # print(f"file_name: {file_name} data type: {arr.dtype}") log.info(f"file_name: {file_name} data type: {arr.dtype} data shape: {arr.shape}") np.save(file, arr) return file_name def gen_dynamic_field_in_numpy_file(dir, rows, start=0, force=False): file_name = f"$meta.npy" file = f"{dir}/{file_name}" if not os.path.exists(file) or force: # non vector columns data = [] if rows > 0: data = [json.dumps({str(i): i, "name": fake.name(), "address": fake.address()}) for i in range(start, rows+start)] arr = np.array(data) log.info(f"file_name: {file_name} data type: {arr.dtype} data shape: {arr.shape}") np.save(file, arr) return file_name def gen_bool_in_numpy_file(dir, data_field, rows, start=0, force=False): file_name = f"{data_field}.npy" file = f"{dir}/{file_name}" if not os.path.exists(file) or force: # non vector columns data = [] if rows > 0: data = [random.choice([True, False]) for i in range(start, rows+start)] arr = np.array(data) # print(f"file_name: {file_name} data type: {arr.dtype}") log.info(f"file_name: {file_name} data type: {arr.dtype} data shape: {arr.shape}") np.save(file, arr) return file_name def gen_json_in_numpy_file(dir, data_field, rows, start=0, force=False): file_name = f"{data_field}.npy" file = f"{dir}/{file_name}" if not os.path.exists(file) or force: data = [] if rows > 0: data = [json.dumps({"name": fake.name(), "address": fake.address()}) for i in range(start, rows+start)] arr = np.array(data) log.info(f"file_name: {file_name} data type: {arr.dtype} data shape: {arr.shape}") np.save(file, arr) return file_name def gen_int_or_float_in_numpy_file(dir, data_field, rows, start=0, force=False): file_name = f"{data_field}.npy" file = f"{dir}/{file_name}" if not os.path.exists(file) or force: # non vector columns data = [] # arr = np.array([]) if rows > 0: if data_field == DataField.float_field: data = [np.float32(random.random()) for _ in range(rows)] elif data_field == DataField.double_field: data = [np.float64(random.random()) for _ in range(rows)] elif data_field == DataField.pk_field: data = [i for i in range(start, start + rows)] elif data_field == DataField.int_field: data = [random.randint(-999999, 9999999) for _ in range(rows)] arr = np.array(data) log.info(f"file_name: {file_name} data type: {arr.dtype} data shape: {arr.shape}") np.save(file, arr) return file_name def gen_vectors(float_vector, rows, dim): vectors = [] if rows > 0: if float_vector: vectors = gen_float_vectors(rows, dim) else: vectors = gen_binary_vectors(rows, (dim // 8)) return vectors def gen_data_by_data_field(data_field, rows, start=0, float_vector=True, dim=128, array_length=None): if array_length is None: array_length = random.randint(0, 10) data = [] if rows > 0: if "vec" in data_field: if "float" in data_field: data = gen_vectors(float_vector=True, rows=rows, dim=dim) data = pd.Series([np.array(x, dtype=np.dtype("float32")) for x in data]) elif "fp16" in data_field: data = gen_fp16_vectors(rows, dim)[1] data = pd.Series([np.array(x, dtype=np.dtype("uint8")) for x in data]) elif "bf16" in data_field: data = gen_bf16_vectors(rows, dim)[1] data = pd.Series([np.array(x, dtype=np.dtype("uint8")) for x in data]) elif "binary" in data_field: data = gen_vectors(float_vector=False, rows=rows, dim=dim) data = pd.Series([np.array(x, dtype=np.dtype("uint8")) for x in data]) else: data = gen_vectors(float_vector=float_vector, rows=rows, dim=dim) elif data_field == DataField.float_field: data = [np.float32(random.random()) for _ in range(rows)] elif data_field == DataField.double_field: data = [np.float64(random.random()) for _ in range(rows)] elif data_field == DataField.pk_field: data = [np.int64(i) for i in range(start, start + rows)] elif data_field == DataField.int_field: data = [np.int64(random.randint(-999999, 9999999)) for _ in range(rows)] elif data_field == DataField.string_field: data = [gen_unique_str(str(i)) for i in range(start, rows + start)] elif data_field == DataField.bool_field: data = [random.choice([True, False]) for i in range(start, rows + start)] elif data_field == DataField.json_field: data = pd.Series([json.dumps({ gen_unique_str(): random.randint(-999999, 9999999) }) for i in range(start, rows + start)], dtype=np.dtype("str")) elif data_field == DataField.array_bool_field: data = pd.Series( [np.array([random.choice([True, False]) for _ in range(array_length)], dtype=np.dtype("bool")) for i in range(start, rows + start)]) elif data_field == DataField.array_int_field: data = pd.Series( [np.array([random.randint(-999999, 9999999) for _ in range(array_length)], dtype=np.dtype("int64")) for i in range(start, rows + start)]) elif data_field == DataField.array_float_field: data = pd.Series( [np.array([random.random() for _ in range(array_length)], dtype=np.dtype("float32")) for i in range(start, rows + start)]) elif data_field == DataField.array_string_field: data = pd.Series( [np.array([gen_unique_str(str(i)) for _ in range(array_length)], dtype=np.dtype("str")) for i in range(start, rows + start)]) return data def gen_file_name(is_row_based, rows, dim, auto_id, str_pk, float_vector, data_fields, file_num, file_type, err_type): row_suffix = entity_suffix(rows) field_suffix = "" if len(data_fields) > 3: field_suffix = "multi_scalars_" else: for data_field in data_fields: if data_field != DataField.vec_field: field_suffix += f"{data_field}_" vt = "" if DataField.vec_field in data_fields: vt = "float_vectors_" if float_vector else "binary_vectors_" pk = "" if str_pk: pk = "str_pk_" prefix = gen_file_prefix(is_row_based=is_row_based, auto_id=auto_id, prefix=err_type) file_name = f"{prefix}_{pk}{vt}{field_suffix}{dim}d_{row_suffix}_{file_num}_{int(time.time())}{file_type}" return file_name def gen_subfolder(root, dim, rows, file_num): suffix = entity_suffix(rows) subfolder = f"{dim}d_{suffix}_{file_num}" path = f"{root}/{subfolder}" if not os.path.isdir(path): os.mkdir(path) return subfolder def gen_json_files(is_row_based, rows, dim, auto_id, str_pk, float_vector, data_fields, file_nums, multi_folder, file_type, err_type, force, **kwargs): # gen json files files = [] start_uid = 0 # make sure pk field exists when not auto_id if (not auto_id) and (DataField.pk_field not in data_fields): data_fields.append(DataField.pk_field) for i in range(file_nums): file_name = gen_file_name(is_row_based=is_row_based, rows=rows, dim=dim, auto_id=auto_id, str_pk=str_pk, float_vector=float_vector, data_fields=data_fields, file_num=i, file_type=file_type, err_type=err_type) file = f"{data_source}/{file_name}" if multi_folder: subfolder = gen_subfolder(root=data_source, dim=dim, rows=rows, file_num=i) file = f"{data_source}/{subfolder}/{file_name}" if not os.path.exists(file) or force: if is_row_based: gen_row_based_json_file(row_file=file, str_pk=str_pk, float_vect=float_vector, data_fields=data_fields, rows=rows, dim=dim, start_uid=start_uid, err_type=err_type, **kwargs) else: gen_column_base_json_file(col_file=file, str_pk=str_pk, float_vect=float_vector, data_fields=data_fields, rows=rows, dim=dim, start_uid=start_uid, err_type=err_type, **kwargs) start_uid += rows if multi_folder: files.append(f"{subfolder}/{file_name}") else: files.append(file_name) return files def gen_dict_data_by_data_field(data_fields, rows, start=0, float_vector=True, dim=128, array_length=None, enable_dynamic_field=False): data = [] for r in range(rows): d = {} for data_field in data_fields: if "vec" in data_field: if "float" in data_field: float_vector = True d[data_field] = gen_vectors(float_vector=float_vector, rows=1, dim=dim)[0] if "binary" in data_field: float_vector = False d[data_field] = gen_vectors(float_vector=float_vector, rows=1, dim=dim)[0] if "bf16" in data_field: d[data_field] = gen_bf16_vectors(1, dim)[1][0] if "fp16" in data_field: d[data_field] = gen_fp16_vectors(1, dim)[1][0] elif data_field == DataField.float_field: d[data_field] = random.random() elif data_field == DataField.double_field: d[data_field] = random.random() elif data_field == DataField.pk_field: d[data_field] = r+start elif data_field == DataField.int_field: d[data_field] =random.randint(-999999, 9999999) elif data_field == DataField.string_field: d[data_field] = gen_unique_str(str(r + start)) elif data_field == DataField.bool_field: d[data_field] = random.choice([True, False]) elif data_field == DataField.json_field: d[data_field] = {str(r+start): r+start} elif data_field == DataField.array_bool_field: array_length = random.randint(0, 10) if array_length is None else array_length d[data_field] = [random.choice([True, False]) for _ in range(array_length)] elif data_field == DataField.array_int_field: array_length = random.randint(0, 10) if array_length is None else array_length d[data_field] = [random.randint(-999999, 9999999) for _ in range(array_length)] elif data_field == DataField.array_float_field: array_length = random.randint(0, 10) if array_length is None else array_length d[data_field] = [random.random() for _ in range(array_length)] elif data_field == DataField.array_string_field: array_length = random.randint(0, 10) if array_length is None else array_length d[data_field] = [gen_unique_str(str(i)) for i in range(array_length)] if enable_dynamic_field: d[str(r+start)] = r+start d["name"] = fake.name() d["address"] = fake.address() data.append(d) return data def gen_new_json_files(float_vector, rows, dim, data_fields, file_nums=1, array_length=None, file_size=None, err_type="", enable_dynamic_field=False): files = [] if file_size is not None: rows = 5000 start_uid = 0 for i in range(file_nums): file_name = f"data-fields-{len(data_fields)}-rows-{rows}-dim-{dim}-file-num-{i}-{int(time.time())}.json" file = f"{data_source}/{file_name}" data = gen_dict_data_by_data_field(data_fields=data_fields, rows=rows, start=start_uid, float_vector=float_vector, dim=dim, array_length=array_length, enable_dynamic_field=enable_dynamic_field) # log.info(f"data: {data}") with open(file, "w") as f: json.dump(data, f) # get the file size if file_size is not None: batch_file_size = os.path.getsize(f"{data_source}/{file_name}") log.info(f"file_size with rows {rows} for {file_name}: {batch_file_size/1024/1024} MB") # calculate the rows to be generated total_batch = int(file_size*1024*1024*1024/batch_file_size) total_rows = total_batch * rows log.info(f"total_rows: {total_rows}") all_data = [] for _ in range(total_batch): all_data += data file_name = f"data-fields-{len(data_fields)}-rows-{total_rows}-dim-{dim}-file-num-{i}-{int(time.time())}.json" with open(f"{data_source}/{file_name}", "w") as f: json.dump(all_data, f) batch_file_size = os.path.getsize(f"{data_source}/{file_name}") log.info(f"file_size with rows {total_rows} for {file_name}: {batch_file_size/1024/1024/1024} GB") files.append(file_name) start_uid += rows return files def gen_npy_files(float_vector, rows, dim, data_fields, file_size=None, file_nums=1, err_type="", force=False, enable_dynamic_field=False): # gen numpy files files = [] start_uid = 0 if file_nums == 1: # gen the numpy file without subfolders if only one set of files for data_field in data_fields: if "vec" in data_field: vector_type = "float32" if "float" in data_field: float_vector = True vector_type = "float32" if "binary" in data_field: float_vector = False vector_type = "binary" if "bf16" in data_field: float_vector = True vector_type = "bf16" if "fp16" in data_field: float_vector = True vector_type = "fp16" file_name = gen_vectors_in_numpy_file(dir=data_source, data_field=data_field, float_vector=float_vector, vector_type=vector_type, rows=rows, dim=dim, force=force) elif data_field == DataField.string_field: # string field for numpy not supported yet at 2022-10-17 file_name = gen_string_in_numpy_file(dir=data_source, data_field=data_field, rows=rows, force=force) elif data_field == DataField.bool_field: file_name = gen_bool_in_numpy_file(dir=data_source, data_field=data_field, rows=rows, force=force) elif data_field == DataField.json_field: file_name = gen_json_in_numpy_file(dir=data_source, data_field=data_field, rows=rows, force=force) else: file_name = gen_int_or_float_in_numpy_file(dir=data_source, data_field=data_field, rows=rows, force=force) files.append(file_name) if enable_dynamic_field: file_name = gen_dynamic_field_in_numpy_file(dir=data_source, rows=rows, force=force) files.append(file_name) if file_size is not None: batch_file_size = 0 for file_name in files: batch_file_size += os.path.getsize(f"{data_source}/{file_name}") log.info(f"file_size with rows {rows} for {files}: {batch_file_size/1024/1024} MB") # calculate the rows to be generated total_batch = int(file_size*1024*1024*1024/batch_file_size) total_rows = total_batch * rows new_files = [] for f in files: arr = np.load(f"{data_source}/{f}") all_arr = np.concatenate([arr for _ in range(total_batch)], axis=0) file_name = f np.save(f"{data_source}/{file_name}", all_arr) log.info(f"file_name: {file_name} data type: {all_arr.dtype} data shape: {all_arr.shape}") new_files.append(file_name) files = new_files batch_file_size = 0 for file_name in files: batch_file_size += os.path.getsize(f"{data_source}/{file_name}") log.info(f"file_size with rows {total_rows} for {files}: {batch_file_size/1024/1024/1024} GB") else: for i in range(file_nums): subfolder = gen_subfolder(root=data_source, dim=dim, rows=rows, file_num=i) dir = f"{data_source}/{subfolder}" for data_field in data_fields: if DataField.vec_field in data_field: file_name = gen_vectors_in_numpy_file(dir=dir, data_field=data_field, float_vector=float_vector, rows=rows, dim=dim, force=force) else: file_name = gen_int_or_float_in_numpy_file(dir=dir, data_field=data_field, rows=rows, start=start_uid, force=force) files.append(f"{subfolder}/{file_name}") if enable_dynamic_field: file_name = gen_dynamic_field_in_numpy_file(dir=dir, rows=rows, start=start_uid, force=force) files.append(f"{subfolder}/{file_name}") start_uid += rows return files def gen_dynamic_field_data_in_parquet_file(rows, start=0): data = [] if rows > 0: data = pd.Series([json.dumps({str(i): i, "name": fake.name(), "address": fake.address()}) for i in range(start, rows+start)], dtype=np.dtype("str")) return data def gen_parquet_files(float_vector, rows, dim, data_fields, file_size=None, row_group_size=None, file_nums=1, array_length=None, err_type="", enable_dynamic_field=False): # gen numpy files if err_type == "": err_type = "none" files = [] # generate 5000 entities and check the file size, then calculate the rows to be generated if file_size is not None: rows = 5000 start_uid = 0 if file_nums == 1: all_field_data = {} for data_field in data_fields: data = gen_data_by_data_field(data_field=data_field, rows=rows, start=0, float_vector=float_vector, dim=dim, array_length=array_length) all_field_data[data_field] = data if enable_dynamic_field: all_field_data["$meta"] = gen_dynamic_field_data_in_parquet_file(rows=rows, start=0) df = pd.DataFrame(all_field_data) log.info(f"df: \n{df}") file_name = f"data-fields-{len(data_fields)}-rows-{rows}-dim-{dim}-file-num-{file_nums}-error-{err_type}-{int(time.time())}.parquet" if row_group_size is not None: df.to_parquet(f"{data_source}/{file_name}", engine='pyarrow', row_group_size=row_group_size) else: df.to_parquet(f"{data_source}/{file_name}", engine='pyarrow') # get the file size if file_size is not None: batch_file_size = os.path.getsize(f"{data_source}/{file_name}") log.info(f"file_size with rows {rows} for {file_name}: {batch_file_size/1024/1024} MB") # calculate the rows to be generated total_batch = int(file_size*1024*1024*1024/batch_file_size) total_rows = total_batch * rows all_df = pd.concat([df for _ in range(total_batch)], axis=0, ignore_index=True) file_name = f"data-fields-{len(data_fields)}-rows-{total_rows}-dim-{dim}-file-num-{file_nums}-error-{err_type}-{int(time.time())}.parquet" log.info(f"all df: \n {all_df}") if row_group_size is not None: all_df.to_parquet(f"{data_source}/{file_name}", engine='pyarrow', row_group_size=row_group_size) else: all_df.to_parquet(f"{data_source}/{file_name}", engine='pyarrow') batch_file_size = os.path.getsize(f"{data_source}/{file_name}") log.info(f"file_size with rows {total_rows} for {file_name}: {batch_file_size/1024/1024} MB") files.append(file_name) else: for i in range(file_nums): all_field_data = {} for data_field in data_fields: data = gen_data_by_data_field(data_field=data_field, rows=rows, start=0, float_vector=float_vector, dim=dim, array_length=array_length) all_field_data[data_field] = data if enable_dynamic_field: all_field_data["$meta"] = gen_dynamic_field_data_in_parquet_file(rows=rows, start=0) df = pd.DataFrame(all_field_data) file_name = f"data-fields-{len(data_fields)}-rows-{rows}-dim-{dim}-file-num-{i}-error-{err_type}-{int(time.time())}.parquet" if row_group_size is not None: df.to_parquet(f"{data_source}/{file_name}", engine='pyarrow', row_group_size=row_group_size) else: df.to_parquet(f"{data_source}/{file_name}", engine='pyarrow') files.append(file_name) start_uid += rows return files def prepare_bulk_insert_json_files(minio_endpoint="", bucket_name="milvus-bucket", is_row_based=True, rows=100, dim=128, auto_id=True, str_pk=False, float_vector=True, data_fields=[], file_nums=1, multi_folder=False, file_type=".json", err_type="", force=False, **kwargs): """ Generate files based on the params in json format and copy them to minio :param minio_endpoint: the minio_endpoint of minio :type minio_endpoint: str :param bucket_name: the bucket name of Milvus :type bucket_name: str :param is_row_based: indicate the file(s) to be generated is row based or not :type is_row_based: boolean :param rows: the number entities to be generated in the file(s) :type rows: int :param dim: dim of vector data :type dim: int :param auto_id: generate primary key data or not :type auto_id: boolean :param str_pk: generate string or int as primary key :type str_pk: boolean :param: float_vector: generate float vectors or binary vectors :type float_vector: boolean :param: data_fields: data fields to be generated in the file(s): It supports one or all of [pk, vectors, int, float, string, boolean] Note: it automatically adds pk field if auto_id=False :type data_fields: list :param file_nums: file numbers to be generated :type file_nums: int :param multi_folder: generate the files in bucket root folder or new subfolders :type multi_folder: boolean :param file_type: specify the file suffix to be generate :type file_type: str :param err_type: inject some errors in the file(s). All errors should be predefined in DataErrorType :type err_type: str :param force: re-generate the file(s) regardless existing or not :type force: boolean :param **kwargs * *wrong_position* (``int``) -- indicate the error entity in the file if DataErrorType.one_entity_wrong_dim :return list file names list """ data_fields_c = copy.deepcopy(data_fields) log.info(f"data_fields: {data_fields}") log.info(f"data_fields_c: {data_fields_c}") files = gen_json_files(is_row_based=is_row_based, rows=rows, dim=dim, auto_id=auto_id, str_pk=str_pk, float_vector=float_vector, data_fields=data_fields_c, file_nums=file_nums, multi_folder=multi_folder, file_type=file_type, err_type=err_type, force=force, **kwargs) copy_files_to_minio(host=minio_endpoint, r_source=data_source, files=files, bucket_name=bucket_name, force=force) return files def prepare_bulk_insert_new_json_files(minio_endpoint="", bucket_name="milvus-bucket", rows=100, dim=128, float_vector=True, file_size=None, data_fields=[], file_nums=1, enable_dynamic_field=False, err_type="", force=False, **kwargs): log.info(f"data_fields: {data_fields}") files = gen_new_json_files(float_vector=float_vector, rows=rows, dim=dim, data_fields=data_fields, file_nums=file_nums, file_size=file_size, err_type=err_type, enable_dynamic_field=enable_dynamic_field, **kwargs) copy_files_to_minio(host=minio_endpoint, r_source=data_source, files=files, bucket_name=bucket_name, force=force) return files def prepare_bulk_insert_numpy_files(minio_endpoint="", bucket_name="milvus-bucket", rows=100, dim=128, enable_dynamic_field=False, file_size=None, data_fields=[DataField.vec_field], float_vector=True, file_nums=1, force=False): """ Generate column based files based on params in numpy format and copy them to the minio Note: each field in data_fields would be generated one numpy file. :param rows: the number entities to be generated in the file(s) :type rows: int :param dim: dim of vector data :type dim: int :param: float_vector: generate float vectors or binary vectors :type float_vector: boolean :param: data_fields: data fields to be generated in the file(s): it supports one or all of [int_pk, vectors, int, float] Note: it does not automatically add pk field :type data_fields: list :param file_nums: file numbers to be generated The file(s) would be generated in data_source folder if file_nums = 1 The file(s) would be generated in different sub-folders if file_nums > 1 :type file_nums: int :param force: re-generate the file(s) regardless existing or not :type force: boolean Return: List File name list or file name with sub-folder list """ files = gen_npy_files(rows=rows, dim=dim, float_vector=float_vector, file_size=file_size, data_fields=data_fields, enable_dynamic_field=enable_dynamic_field, file_nums=file_nums, force=force) copy_files_to_minio(host=minio_endpoint, r_source=data_source, files=files, bucket_name=bucket_name, force=force) return files def prepare_bulk_insert_parquet_files(minio_endpoint="", bucket_name="milvus-bucket", rows=100, dim=128, array_length=None, file_size=None, row_group_size=None, enable_dynamic_field=False, data_fields=[DataField.vec_field], float_vector=True, file_nums=1, force=False): """ Generate column based files based on params in parquet format and copy them to the minio Note: each field in data_fields would be generated one parquet file. :param rows: the number entities to be generated in the file(s) :type rows: int :param dim: dim of vector data :type dim: int :param: float_vector: generate float vectors or binary vectors :type float_vector: boolean :param: data_fields: data fields to be generated in the file(s): it supports one or all of [int_pk, vectors, int, float] Note: it does not automatically add pk field :type data_fields: list :param file_nums: file numbers to be generated The file(s) would be generated in data_source folder if file_nums = 1 The file(s) would be generated in different sub-folders if file_nums > 1 :type file_nums: int :param force: re-generate the file(s) regardless existing or not :type force: boolean Return: List File name list or file name with sub-folder list """ files = gen_parquet_files(rows=rows, dim=dim, float_vector=float_vector, enable_dynamic_field=enable_dynamic_field, data_fields=data_fields, array_length=array_length, file_size=file_size, row_group_size=row_group_size, file_nums=file_nums) copy_files_to_minio(host=minio_endpoint, r_source=data_source, files=files, bucket_name=bucket_name, force=force) return files def gen_csv_file(file, float_vector, data_fields, rows, dim, start_uid): with open(file, "w") as f: # field name for i in range(len(data_fields)): f.write(data_fields[i]) if i != len(data_fields) - 1: f.write(",") f.write("\n") for i in range(rows): # field value for j in range(len(data_fields)): data_field = data_fields[j] if data_field == DataField.pk_field: f.write(str(i + start_uid)) if data_field == DataField.int_field: f.write(str(random.randint(-999999, 9999999))) if data_field == DataField.float_field: f.write(str(random.random())) if data_field == DataField.string_field: f.write(str(gen_unique_str())) if data_field == DataField.bool_field: f.write(str(random.choice(["true", "false"]))) if data_field == DataField.vec_field: vectors = gen_float_vectors(1, dim) if float_vector else gen_binary_vectors(1, dim//8) f.write('"' + ','.join(str(x) for x in vectors) + '"') if j != len(data_fields) - 1: f.write(",") f.write("\n") def gen_csv_files(rows, dim, auto_id, float_vector, data_fields, file_nums, force): files = [] start_uid = 0 if (not auto_id) and (DataField.pk_field not in data_fields): data_fields.append(DataField.pk_field) for i in range(file_nums): file_name = gen_file_name(is_row_based=True, rows=rows, dim=dim, auto_id=auto_id, float_vector=float_vector, data_fields=data_fields, file_num=i, file_type=".csv", str_pk=False, err_type="") file = f"{data_source}/{file_name}" if not os.path.exists(file) or force: gen_csv_file(file, float_vector, data_fields, rows, dim, start_uid) start_uid += rows files.append(file_name) return files def prepare_bulk_insert_csv_files(minio_endpoint="", bucket_name="milvus-bucket", rows=100, dim=128, auto_id=True, float_vector=True, data_fields=[], file_nums=1, force=False): """ Generate row based files based on params in csv format and copy them to minio :param minio_endpoint: the minio_endpoint of minio :type minio_endpoint: str :param bucket_name: the bucket name of Milvus :type bucket_name: str :param rows: the number entities to be generated in the file :type rows: int :param dim: dim of vector data :type dim: int :param auto_id: generate primary key data or not :type auto_id: bool :param float_vector: generate float vectors or binary vectors :type float_vector: boolean :param: data_fields: data fields to be generated in the file(s): It supports one or all of [pk, vectors, int, float, string, boolean] Note: it automatically adds pk field if auto_id=False :type data_fields: list :param file_nums: file numbers to be generated :type file_nums: int :param force: re-generate the file(s) regardless existing or not :type force: boolean """ data_fields_c = copy.deepcopy(data_fields) log.info(f"data_fields: {data_fields}") log.info(f"data_fields_c: {data_fields_c}") files = gen_csv_files(rows=rows, dim=dim, auto_id=auto_id, float_vector=float_vector, data_fields=data_fields_c, file_nums=file_nums, force=force) copy_files_to_minio(host=minio_endpoint, r_source=data_source, files=files, bucket_name=bucket_name, force=force) return files ================================================ FILE: tests/common/code_mapping.py ================================================ from enum import Enum from pymilvus import ExceptionsMessage class ErrorCode(Enum): ErrorOk = 0 Error = 1 ErrorMessage = {ErrorCode.ErrorOk: "", ErrorCode.Error: "is illegal"} class ErrorMap: def __init__(self, err_code, err_msg): self.err_code = err_code self.err_msg = err_msg class ConnectionErrorMessage(ExceptionsMessage): FailConnect = "Fail connecting to server on %s:%s. Timeout" ConnectExist = "The connection named %s already creating, but passed parameters don't match the configured parameters" class CollectionErrorMessage(ExceptionsMessage): CollNotLoaded = "collection %s was not loaded into memory" class PartitionErrorMessage(ExceptionsMessage): pass class IndexErrorMessage(ExceptionsMessage): WrongFieldName = "cannot create index on non-vector field: %s" ================================================ FILE: tests/common/common_func.py ================================================ import os import random import math import string import json import time import uuid from functools import singledispatch import numpy as np import pandas as pd import jax.numpy as jnp from sklearn import preprocessing from npy_append_array import NpyAppendArray from faker import Faker from pathlib import Path from minio import Minio from pymilvus import DataType from base.schema_wrapper import ApiCollectionSchemaWrapper, ApiFieldSchemaWrapper from common import common_type as ct from utils.util_log import test_log as log from customize.milvus_operator import MilvusOperator import pickle import tensorflow as tf fake = Faker() """" Methods of processing data """ @singledispatch def to_serializable(val): """Used by default.""" return str(val) @to_serializable.register(np.float32) def ts_float32(val): """Used if *val* is an instance of numpy.float32.""" return np.float64(val) class ParamInfo: def __init__(self): self.param_host = "" self.param_port = "" self.param_handler = "" self.param_user = "" self.param_password = "" self.param_secure = False self.param_replica_num = ct.default_replica_num self.param_uri = "" self.param_token = "" def prepare_param_info(self, host, port, handler, replica_num, user, password, secure, uri, token): self.param_host = host self.param_port = port self.param_handler = handler self.param_user = user self.param_password = password self.param_secure = secure self.param_replica_num = replica_num self.param_uri = uri self.param_token = token param_info = ParamInfo() def gen_unique_str(str_value=None): prefix = "".join(random.choice(string.ascii_letters + string.digits) for _ in range(8)) return "test_" + prefix if str_value is None else str_value + "_" + prefix def gen_str_by_length(length=8, letters_only=False): if letters_only: return "".join(random.choice(string.ascii_letters) for _ in range(length)) return "".join(random.choice(string.ascii_letters + string.digits) for _ in range(length)) def gen_digits_by_length(length=8): return "".join(random.choice(string.digits) for _ in range(length)) def gen_bool_field(name=ct.default_bool_field_name, description=ct.default_desc, is_primary=False, **kwargs): bool_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.BOOL, description=description, is_primary=is_primary, **kwargs) return bool_field def gen_string_field(name=ct.default_string_field_name, description=ct.default_desc, is_primary=False, max_length=ct.default_length, **kwargs): string_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.VARCHAR, description=description, max_length=max_length, is_primary=is_primary, **kwargs) return string_field def gen_json_field(name=ct.default_json_field_name, description=ct.default_desc, is_primary=False, **kwargs): json_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.JSON, description=description, is_primary=is_primary, **kwargs) return json_field def gen_array_field(name=ct.default_array_field_name, element_type=DataType.INT64, max_capacity=ct.default_max_capacity, description=ct.default_desc, is_primary=False, **kwargs): array_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.ARRAY, element_type=element_type, max_capacity=max_capacity, description=description, is_primary=is_primary, **kwargs) return array_field def gen_int8_field(name=ct.default_int8_field_name, description=ct.default_desc, is_primary=False, **kwargs): int8_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.INT8, description=description, is_primary=is_primary, **kwargs) return int8_field def gen_int16_field(name=ct.default_int16_field_name, description=ct.default_desc, is_primary=False, **kwargs): int16_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.INT16, description=description, is_primary=is_primary, **kwargs) return int16_field def gen_int32_field(name=ct.default_int32_field_name, description=ct.default_desc, is_primary=False, **kwargs): int32_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.INT32, description=description, is_primary=is_primary, **kwargs) return int32_field def gen_int64_field(name=ct.default_int64_field_name, description=ct.default_desc, is_primary=False, **kwargs): int64_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.INT64, description=description, is_primary=is_primary, **kwargs) return int64_field def gen_float_field(name=ct.default_float_field_name, is_primary=False, description=ct.default_desc, **kwargs): float_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.FLOAT, description=description, is_primary=is_primary, **kwargs) return float_field def gen_double_field(name=ct.default_double_field_name, is_primary=False, description=ct.default_desc, **kwargs): double_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.DOUBLE, description=description, is_primary=is_primary, **kwargs) return double_field def gen_float_vec_field(name=ct.default_float_vec_field_name, is_primary=False, dim=ct.default_dim, description=ct.default_desc, vector_data_type="FLOAT_VECTOR", **kwargs): if vector_data_type == "SPARSE_FLOAT_VECTOR": dtype = DataType.SPARSE_FLOAT_VECTOR float_vec_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=dtype, description=description, is_primary=is_primary, **kwargs) return float_vec_field if vector_data_type == "FLOAT_VECTOR": dtype = DataType.FLOAT_VECTOR elif vector_data_type == "FLOAT16_VECTOR": dtype = DataType.FLOAT16_VECTOR elif vector_data_type == "BFLOAT16_VECTOR": dtype = DataType.BFLOAT16_VECTOR float_vec_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=dtype, description=description, dim=dim, is_primary=is_primary, **kwargs) return float_vec_field def gen_binary_vec_field(name=ct.default_binary_vec_field_name, is_primary=False, dim=ct.default_dim, description=ct.default_desc, **kwargs): binary_vec_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.BINARY_VECTOR, description=description, dim=dim, is_primary=is_primary, **kwargs) return binary_vec_field def gen_float16_vec_field(name=ct.default_float_vec_field_name, is_primary=False, dim=ct.default_dim, description=ct.default_desc, **kwargs): float_vec_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.FLOAT16_VECTOR, description=description, dim=dim, is_primary=is_primary, **kwargs) return float_vec_field def gen_bfloat16_vec_field(name=ct.default_float_vec_field_name, is_primary=False, dim=ct.default_dim, description=ct.default_desc, **kwargs): float_vec_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.BFLOAT16_VECTOR, description=description, dim=dim, is_primary=is_primary, **kwargs) return float_vec_field def gen_sparse_vec_field(name=ct.default_sparse_vec_field_name, is_primary=False, description=ct.default_desc, **kwargs): sparse_vec_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.SPARSE_FLOAT_VECTOR, description=description, is_primary=is_primary, **kwargs) return sparse_vec_field def gen_default_collection_schema(description=ct.default_desc, primary_field=ct.default_int64_field_name, auto_id=False, dim=ct.default_dim, enable_dynamic_field=False, with_json=True, multiple_dim_array=[], is_partition_key=None, vector_data_type="FLOAT_VECTOR", **kwargs): if enable_dynamic_field: if primary_field is ct.default_int64_field_name: if is_partition_key is None: fields = [gen_int64_field(), gen_float_vec_field(dim=dim, vector_data_type=vector_data_type)] else: fields = [gen_int64_field(is_partition_key=(is_partition_key == ct.default_int64_field_name)), gen_float_vec_field(dim=dim, vector_data_type=vector_data_type)] elif primary_field is ct.default_string_field_name: if is_partition_key is None: fields = [gen_string_field(), gen_float_vec_field(dim=dim, vector_data_type=vector_data_type)] else: fields = [gen_string_field(is_partition_key=(is_partition_key == ct.default_string_field_name)), gen_float_vec_field(dim=dim, vector_data_type=vector_data_type)] else: log.error("Primary key only support int or varchar") assert False else: if is_partition_key is None: int64_field = gen_int64_field() vchar_field = gen_string_field() else: int64_field = gen_int64_field(is_partition_key=(is_partition_key == ct.default_int64_field_name)) vchar_field = gen_string_field(is_partition_key=(is_partition_key == ct.default_string_field_name)) fields = [int64_field, gen_float_field(), vchar_field, gen_json_field(), gen_float_vec_field(dim=dim, vector_data_type=vector_data_type)] if with_json is False: fields.remove(gen_json_field()) if len(multiple_dim_array) != 0: for other_dim in multiple_dim_array: fields.append(gen_float_vec_field(gen_unique_str("multiple_vector"), dim=other_dim, vector_data_type=vector_data_type)) schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, enable_dynamic_field=enable_dynamic_field, **kwargs) return schema def gen_all_datatype_collection_schema(description=ct.default_desc, primary_field=ct.default_int64_field_name, auto_id=False, dim=ct.default_dim, enable_dynamic_field=True, **kwargs): fields = [ gen_int64_field(), gen_float_field(), gen_string_field(), gen_json_field(), gen_array_field(name="array_int", element_type=DataType.INT64), gen_array_field(name="array_float", element_type=DataType.FLOAT), gen_array_field(name="array_varchar", element_type=DataType.VARCHAR, max_length=200), gen_array_field(name="array_bool", element_type=DataType.BOOL), gen_float_vec_field(dim=dim), gen_float_vec_field(name="image_emb", dim=dim), gen_float_vec_field(name="text_emb", dim=dim), gen_float_vec_field(name="voice_emb", dim=dim), ] schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, enable_dynamic_field=enable_dynamic_field, **kwargs) return schema def gen_array_collection_schema(description=ct.default_desc, primary_field=ct.default_int64_field_name, auto_id=False, dim=ct.default_dim, enable_dynamic_field=False, max_capacity=ct.default_max_capacity, max_length=100, with_json=False, **kwargs): if enable_dynamic_field: if primary_field is ct.default_int64_field_name: fields = [gen_int64_field(), gen_float_vec_field(dim=dim)] elif primary_field is ct.default_string_field_name: fields = [gen_string_field(), gen_float_vec_field(dim=dim)] else: log.error("Primary key only support int or varchar") assert False else: fields = [gen_int64_field(), gen_float_vec_field(dim=dim), gen_json_field(), gen_array_field(name=ct.default_int32_array_field_name, element_type=DataType.INT32, max_capacity=max_capacity), gen_array_field(name=ct.default_float_array_field_name, element_type=DataType.FLOAT, max_capacity=max_capacity), gen_array_field(name=ct.default_string_array_field_name, element_type=DataType.VARCHAR, max_capacity=max_capacity, max_length=max_length)] if with_json is False: fields.remove(gen_json_field()) schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, enable_dynamic_field=enable_dynamic_field, **kwargs) return schema def gen_bulk_insert_collection_schema(description=ct.default_desc, primary_field=ct.default_int64_field_name, with_varchar_field=True, auto_id=False, dim=ct.default_dim, enable_dynamic_field=False, with_json=False): if enable_dynamic_field: if primary_field is ct.default_int64_field_name: fields = [gen_int64_field(), gen_float_vec_field(dim=dim)] elif primary_field is ct.default_string_field_name: fields = [gen_string_field(), gen_float_vec_field(dim=dim)] else: log.error("Primary key only support int or varchar") assert False else: fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_json_field(), gen_float_vec_field(dim=dim)] if with_json is False: fields.remove(gen_json_field()) if with_varchar_field is False: fields.remove(gen_string_field()) schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, enable_dynamic_field=enable_dynamic_field) return schema def gen_general_collection_schema(description=ct.default_desc, primary_field=ct.default_int64_field_name, auto_id=False, is_binary=False, dim=ct.default_dim, **kwargs): if is_binary: fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_binary_vec_field(dim=dim)] else: fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_float_vec_field(dim=dim)] schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, **kwargs) return schema def gen_string_pk_default_collection_schema(description=ct.default_desc, primary_field=ct.default_string_field_name, auto_id=False, dim=ct.default_dim, **kwargs): fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_json_field(), gen_float_vec_field(dim=dim)] schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, **kwargs) return schema def gen_json_default_collection_schema(description=ct.default_desc, primary_field=ct.default_int64_field_name, auto_id=False, dim=ct.default_dim, **kwargs): fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_json_field(), gen_float_vec_field(dim=dim)] schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, **kwargs) return schema def gen_multiple_json_default_collection_schema(description=ct.default_desc, primary_field=ct.default_int64_field_name, auto_id=False, dim=ct.default_dim, **kwargs): fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_json_field(name="json1"), gen_json_field(name="json2"), gen_float_vec_field(dim=dim)] schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, **kwargs) return schema def gen_collection_schema_all_datatype(description=ct.default_desc, primary_field=ct.default_int64_field_name, auto_id=False, dim=ct.default_dim, enable_dynamic_field=False, with_json=True, multiple_dim_array=[], **kwargs): if enable_dynamic_field: fields = [gen_int64_field()] else: fields = [gen_int64_field(), gen_int32_field(), gen_int16_field(), gen_int8_field(), gen_bool_field(), gen_float_field(), gen_double_field(), gen_string_field(), gen_json_field()] if with_json is False: fields.remove(gen_json_field()) if len(multiple_dim_array) == 0: fields.append(gen_float_vec_field(dim=dim)) else: multiple_dim_array.insert(0, dim) for i in range(len(multiple_dim_array)): fields.append(gen_float_vec_field(name=f"multiple_vector_{ct.all_float_vector_types[i%3]}", dim=multiple_dim_array[i], vector_data_type=ct.all_float_vector_types[i%3])) schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, enable_dynamic_field=enable_dynamic_field, **kwargs) return schema def gen_collection_schema(fields, primary_field=None, description=ct.default_desc, auto_id=False, **kwargs): schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, primary_field=primary_field, description=description, auto_id=auto_id, **kwargs) return schema def gen_default_binary_collection_schema(description=ct.default_desc, primary_field=ct.default_int64_field_name, auto_id=False, dim=ct.default_dim, **kwargs): fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_binary_vec_field(dim=dim)] binary_schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, **kwargs) return binary_schema def gen_default_sparse_schema(description=ct.default_desc, primary_field=ct.default_int64_field_name, auto_id=False, with_json=False, multiple_dim_array=[], **kwargs): fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_sparse_vec_field()] if with_json: fields.insert(-1, gen_json_field()) if len(multiple_dim_array) != 0: for i in range(len(multiple_dim_array)): vec_name = ct.default_sparse_vec_field_name + "_" + str(i) vec_field = gen_sparse_vec_field(name=vec_name) fields.append(vec_field) sparse_schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=description, primary_field=primary_field, auto_id=auto_id, **kwargs) return sparse_schema def gen_schema_multi_vector_fields(vec_fields): fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_float_vec_field()] fields.extend(vec_fields) primary_field = ct.default_int64_field_name schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=ct.default_desc, primary_field=primary_field, auto_id=False) return schema def gen_schema_multi_string_fields(string_fields): fields = [gen_int64_field(), gen_float_field(), gen_string_field(), gen_float_vec_field()] fields.extend(string_fields) primary_field = ct.default_int64_field_name schema, _ = ApiCollectionSchemaWrapper().init_collection_schema(fields=fields, description=ct.default_desc, primary_field=primary_field, auto_id=False) return schema def gen_vectors(nb, dim, vector_data_type="FLOAT_VECTOR"): vectors = [] if vector_data_type == "FLOAT_VECTOR": vectors = [[random.random() for _ in range(dim)] for _ in range(nb)] elif vector_data_type == "FLOAT16_VECTOR": vectors = gen_fp16_vectors(nb, dim)[1] elif vector_data_type == "BFLOAT16_VECTOR": vectors = gen_bf16_vectors(nb, dim)[1] elif vector_data_type == "SPARSE_FLOAT_VECTOR": vectors = gen_sparse_vectors(nb, dim) if dim > 1: if vector_data_type == "FLOAT_VECTOR": vectors = preprocessing.normalize(vectors, axis=1, norm='l2') vectors = vectors.tolist() return vectors def gen_string(nb): string_values = [str(random.random()) for _ in range(nb)] return string_values def gen_binary_vectors(num, dim): raw_vectors = [] binary_vectors = [] for _ in range(num): raw_vector = [random.randint(0, 1) for _ in range(dim)] raw_vectors.append(raw_vector) # packs a binary-valued array into bits in a unit8 array, and bytes array_of_ints binary_vectors.append(bytes(np.packbits(raw_vector, axis=-1).tolist())) return raw_vectors, binary_vectors def gen_default_dataframe_data(nb=ct.default_nb, dim=ct.default_dim, start=0, with_json=True, random_primary_key=False, multiple_dim_array=[], multiple_vector_field_name=[], vector_data_type="FLOAT_VECTOR", auto_id=False, primary_field = ct.default_int64_field_name): if not random_primary_key: int_values = pd.Series(data=[i for i in range(start, start + nb)]) else: int_values = pd.Series(data=random.sample(range(start, start + nb), nb)) float_values = pd.Series(data=[np.float32(i) for i in range(start, start + nb)], dtype="float32") string_values = pd.Series(data=[str(i) for i in range(start, start + nb)], dtype="string") json_values = [{"number": i, "float": i*1.0} for i in range(start, start + nb)] float_vec_values = gen_vectors(nb, dim, vector_data_type=vector_data_type) df = pd.DataFrame({ ct.default_int64_field_name: int_values, ct.default_float_field_name: float_values, ct.default_string_field_name: string_values, ct.default_json_field_name: json_values, ct.default_float_vec_field_name: float_vec_values }) if with_json is False: df.drop(ct.default_json_field_name, axis=1, inplace=True) if auto_id is True: if primary_field == ct.default_int64_field_name: df.drop(ct.default_int64_field_name, axis=1, inplace=True) elif primary_field == ct.default_string_field_name: df.drop(ct.default_string_field_name, axis=1, inplace=True) if len(multiple_dim_array) != 0: if len(multiple_vector_field_name) != len(multiple_dim_array): log.error("multiple vector feature is enabled, please input the vector field name list " "not including the default vector field") assert len(multiple_vector_field_name) == len(multiple_dim_array) for i in range(len(multiple_dim_array)): new_float_vec_values = gen_vectors(nb, multiple_dim_array[i], vector_data_type=vector_data_type) df[multiple_vector_field_name[i]] = new_float_vec_values return df def gen_general_default_list_data(nb=ct.default_nb, dim=ct.default_dim, start=0, with_json=True, random_primary_key=False, multiple_dim_array=[], multiple_vector_field_name=[], vector_data_type="FLOAT_VECTOR", auto_id=False, primary_field=ct.default_int64_field_name): insert_list = [] if not random_primary_key: int_values = pd.Series(data=[i for i in range(start, start + nb)]) else: int_values = pd.Series(data=random.sample(range(start, start + nb), nb)) float_values = pd.Series(data=[np.float32(i) for i in range(start, start + nb)], dtype="float32") string_values = pd.Series(data=[str(i) for i in range(start, start + nb)], dtype="string") json_values = [{"number": i, "float": i*1.0} for i in range(start, start + nb)] float_vec_values = gen_vectors(nb, dim, vector_data_type=vector_data_type) insert_list = [int_values, float_values, string_values] if with_json is True: insert_list.append(json_values) insert_list.append(float_vec_values) if auto_id is True: if primary_field == ct.default_int64_field_name: index = 0 elif primary_field == ct.default_string_field_name: index = 2 del insert_list[index] if len(multiple_dim_array) != 0: # if len(multiple_vector_field_name) != len(multiple_dim_array): # log.error("multiple vector feature is enabled, please input the vector field name list " # "not including the default vector field") # assert len(multiple_vector_field_name) == len(multiple_dim_array) for i in range(len(multiple_dim_array)): new_float_vec_values = gen_vectors(nb, multiple_dim_array[i], vector_data_type=vector_data_type) insert_list.append(new_float_vec_values) return insert_list def gen_default_rows_data(nb=ct.default_nb, dim=ct.default_dim, start=0, with_json=True, multiple_dim_array=[], multiple_vector_field_name=[], vector_data_type="FLOAT_VECTOR", auto_id=False, primary_field = ct.default_int64_field_name): array = [] for i in range(start, start + nb): dict = {ct.default_int64_field_name: i, ct.default_float_field_name: i*1.0, ct.default_string_field_name: str(i), ct.default_json_field_name: {"number": i, "float": i*1.0}, ct.default_float_vec_field_name: gen_vectors(1, dim, vector_data_type=vector_data_type)[0] } if with_json is False: dict.pop(ct.default_json_field_name, None) if auto_id is True: if primary_field == ct.default_int64_field_name: dict.pop(ct.default_int64_field_name) elif primary_field == ct.default_string_field_name: dict.pop(ct.default_string_field_name) array.append(dict) if len(multiple_dim_array) != 0: for i in range(len(multiple_dim_array)): dict[multiple_vector_field_name[i]] = gen_vectors(1, multiple_dim_array[i], vector_data_type=vector_data_type)[0] log.debug("generated default row data") return array def gen_json_data_for_diff_json_types(nb=ct.default_nb, start=0, json_type="json_embedded_object"): """ Method: gen json data for different json types. Refer to RFC7159 """ if json_type == "json_embedded_object": # a json object with an embedd json object return [{json_type: {"number": i, "level2": {"level2_number": i, "level2_float": i*1.0, "level2_str": str(i)}, "float": i*1.0}, "str": str(i)} for i in range(start, start + nb)] if json_type == "json_objects_array": # a json-objects array with 2 json objects return [[{"number": i, "level2": {"level2_number": i, "level2_float": i*1.0, "level2_str": str(i)}, "float": i*1.0, "str": str(i)}, {"number": i, "level2": {"level2_number": i, "level2_float": i*1.0, "level2_str": str(i)}, "float": i*1.0, "str": str(i)} ] for i in range(start, start + nb)] if json_type == "json_array": # single array as json value return [[i for i in range(j, j + 10)] for j in range(start, start + nb)] if json_type == "json_int": # single int as json value return [i for i in range(start, start + nb)] if json_type == "json_float": # single float as json value return [i*1.0 for i in range(start, start + nb)] if json_type == "json_string": # single string as json value return [str(i) for i in range(start, start + nb)] if json_type == "json_bool": # single bool as json value return [bool(i) for i in range(start, start + nb)] else: return [] def gen_default_data_for_upsert(nb=ct.default_nb, dim=ct.default_dim, start=0, size=10000): int_values = pd.Series(data=[i for i in range(start, start + nb)]) float_values = pd.Series(data=[np.float32(i + size) for i in range(start, start + nb)], dtype="float32") string_values = pd.Series(data=[str(i + size) for i in range(start, start + nb)], dtype="string") json_values = [{"number": i, "string": str(i)} for i in range(start, start + nb)] float_vec_values = gen_vectors(nb, dim) df = pd.DataFrame({ ct.default_int64_field_name: int_values, ct.default_float_field_name: float_values, ct.default_string_field_name: string_values, ct.default_json_field_name: json_values, ct.default_float_vec_field_name: float_vec_values }) return df, float_values def gen_array_dataframe_data(nb=ct.default_nb, dim=ct.default_dim, start=0, auto_id=False, array_length=ct.default_max_capacity, with_json=False, random_primary_key=False): if not random_primary_key: int_values = pd.Series(data=[i for i in range(start, start + nb)]) else: int_values = pd.Series(data=random.sample(range(start, start + nb), nb)) float_vec_values = gen_vectors(nb, dim) json_values = [{"number": i, "float": i * 1.0} for i in range(start, start + nb)] int32_values = pd.Series(data=[[np.int32(j) for j in range(i, i + array_length)] for i in range(start, start + nb)]) float_values = pd.Series(data=[[np.float32(j) for j in range(i, i + array_length)] for i in range(start, start + nb)]) string_values = pd.Series(data=[[str(j) for j in range(i, i + array_length)] for i in range(start, start + nb)]) df = pd.DataFrame({ ct.default_int64_field_name: int_values, ct.default_float_vec_field_name: float_vec_values, ct.default_json_field_name: json_values, ct.default_int32_array_field_name: int32_values, ct.default_float_array_field_name: float_values, ct.default_string_array_field_name: string_values, }) if with_json is False: df.drop(ct.default_json_field_name, axis=1, inplace=True) if auto_id: df.drop(ct.default_int64_field_name, axis=1, inplace=True) return df def gen_dataframe_multi_vec_fields(vec_fields, nb=ct.default_nb): """ gen dataframe data for fields: int64, float, float_vec and vec_fields :param nb: num of entities, default default_nb :param vec_fields: list of FieldSchema :return: dataframe """ int_values = pd.Series(data=[i for i in range(0, nb)]) float_values = pd.Series(data=[float(i) for i in range(nb)], dtype="float32") string_values = pd.Series(data=[str(i) for i in range(nb)], dtype="string") df = pd.DataFrame({ ct.default_int64_field_name: int_values, ct.default_float_field_name: float_values, ct.default_string_field_name: string_values, ct.default_float_vec_field_name: gen_vectors(nb, ct.default_dim) }) for field in vec_fields: dim = field.params['dim'] if field.dtype == DataType.FLOAT_VECTOR: vec_values = gen_vectors(nb, dim) elif field.dtype == DataType.BINARY_VECTOR: vec_values = gen_binary_vectors(nb, dim)[1] df[field.name] = vec_values return df def gen_dataframe_multi_string_fields(string_fields, nb=ct.default_nb): """ gen dataframe data for fields: int64, float, float_vec and vec_fields :param nb: num of entities, default default_nb :param vec_fields: list of FieldSchema :return: dataframe """ int_values = pd.Series(data=[i for i in range(0, nb)]) float_values = pd.Series(data=[float(i) for i in range(nb)], dtype="float32") string_values = pd.Series(data=[str(i) for i in range(nb)], dtype="string") df = pd.DataFrame({ ct.default_int64_field_name: int_values, ct.default_float_field_name: float_values, ct.default_string_field_name: string_values, ct.default_float_vec_field_name: gen_vectors(nb, ct.default_dim) }) for field in string_fields: if field.dtype == DataType.VARCHAR: string_values = gen_string(nb) df[field.name] = string_values return df def gen_dataframe_all_data_type(nb=ct.default_nb, dim=ct.default_dim, start=0, with_json=True, auto_id=False, random_primary_key=False, multiple_dim_array=[], multiple_vector_field_name=[], primary_field=ct.default_int64_field_name): if not random_primary_key: int64_values = pd.Series(data=[i for i in range(start, start + nb)]) else: int64_values = pd.Series(data=random.sample(range(start, start + nb), nb)) int32_values = pd.Series(data=[np.int32(i) for i in range(start, start + nb)], dtype="int32") int16_values = pd.Series(data=[np.int16(i) for i in range(start, start + nb)], dtype="int16") int8_values = pd.Series(data=[np.int8(i) for i in range(start, start + nb)], dtype="int8") bool_values = pd.Series(data=[np.bool_(i) for i in range(start, start + nb)], dtype="bool") float_values = pd.Series(data=[np.float32(i) for i in range(start, start + nb)], dtype="float32") double_values = pd.Series(data=[np.double(i) for i in range(start, start + nb)], dtype="double") string_values = pd.Series(data=[str(i) for i in range(start, start + nb)], dtype="string") json_values = [{"number": i, "string": str(i), "bool": bool(i), "list": [j for j in range(i, i + ct.default_json_list_length)]} for i in range(start, start + nb)] float_vec_values = gen_vectors(nb, dim) df = pd.DataFrame({ ct.default_int64_field_name: int64_values, ct.default_int32_field_name: int32_values, ct.default_int16_field_name: int16_values, ct.default_int8_field_name: int8_values, ct.default_bool_field_name: bool_values, ct.default_float_field_name: float_values, ct.default_double_field_name: double_values, ct.default_string_field_name: string_values, ct.default_json_field_name: json_values }) if len(multiple_dim_array) == 0: df[ct.default_float_vec_field_name] = float_vec_values else: for i in range(len(multiple_dim_array)): df[multiple_vector_field_name[i]] = gen_vectors(nb, multiple_dim_array[i], ct.all_float_vector_types[i%3]) if with_json is False: df.drop(ct.default_json_field_name, axis=1, inplace=True) if auto_id: if primary_field == ct.default_int64_field_name: df.drop(ct.default_int64_field_name, axis=1, inplace=True) elif primary_field == ct.default_string_field_name: df.drop(ct.default_string_field_name, axis=1, inplace=True) log.debug("generated data completed") return df def gen_general_list_all_data_type(nb=ct.default_nb, dim=ct.default_dim, start=0, with_json=True, auto_id=False, random_primary_key=False, multiple_dim_array=[], multiple_vector_field_name=[], primary_field=ct.default_int64_field_name): if not random_primary_key: int64_values = pd.Series(data=[i for i in range(start, start + nb)]) else: int64_values = pd.Series(data=random.sample(range(start, start + nb), nb)) int32_values = pd.Series(data=[np.int32(i) for i in range(start, start + nb)], dtype="int32") int16_values = pd.Series(data=[np.int16(i) for i in range(start, start + nb)], dtype="int16") int8_values = pd.Series(data=[np.int8(i) for i in range(start, start + nb)], dtype="int8") bool_values = pd.Series(data=[np.bool_(i) for i in range(start, start + nb)], dtype="bool") float_values = pd.Series(data=[np.float32(i) for i in range(start, start + nb)], dtype="float32") double_values = pd.Series(data=[np.double(i) for i in range(start, start + nb)], dtype="double") string_values = pd.Series(data=[str(i) for i in range(start, start + nb)], dtype="string") json_values = [{"number": i, "string": str(i), "bool": bool(i), "list": [j for j in range(i, i + ct.default_json_list_length)]} for i in range(start, start + nb)] float_vec_values = gen_vectors(nb, dim) insert_list = [int64_values, int32_values, int16_values, int8_values, bool_values, float_values, double_values, string_values, json_values] if len(multiple_dim_array) == 0: insert_list.append(float_vec_values) else: for i in range(len(multiple_dim_array)): insert_list.append(gen_vectors(nb, multiple_dim_array[i], ct.all_float_vector_types[i%3])) if with_json is False: # index = insert_list.index(json_values) del insert_list[8] if auto_id: if primary_field == ct.default_int64_field_name: index = insert_list.index(int64_values) elif primary_field == ct.default_string_field_name: index = insert_list.index(string_values) del insert_list[index] log.debug("generated data completed") return insert_list def gen_default_rows_data_all_data_type(nb=ct.default_nb, dim=ct.default_dim, start=0, with_json=True, multiple_dim_array=[], multiple_vector_field_name=[], partition_id=0, auto_id=False, primary_field=ct.default_int64_field_name): array = [] for i in range(start, start + nb): dict = {ct.default_int64_field_name: i, ct.default_int32_field_name: i, ct.default_int16_field_name: i, ct.default_int8_field_name: i, ct.default_bool_field_name: bool(i), ct.default_float_field_name: i*1.0, ct.default_double_field_name: i * 1.0, ct.default_string_field_name: str(i), ct.default_json_field_name: {"number": i, "string": str(i), "bool": bool(i), "list": [j for j in range(i, i + ct.default_json_list_length)]} } if with_json is False: dict.pop(ct.default_json_field_name, None) if auto_id is True: if primary_field == ct.default_int64_field_name: dict.pop(ct.default_int64_field_name, None) elif primary_field == ct.default_string_field_name: dict.pop(ct.default_string_field_name, None) array.append(dict) if len(multiple_dim_array) == 0: dict[ct.default_float_vec_field_name] = gen_vectors(1, dim)[0] else: for i in range(len(multiple_dim_array)): dict[multiple_vector_field_name[i]] = gen_vectors(nb, multiple_dim_array[i], ct.all_float_vector_types[i])[0] if len(multiple_dim_array) != 0: with open(ct.rows_all_data_type_file_path + f'_{partition_id}' + f'_dim{dim}.txt', 'wb') as json_file: pickle.dump(array, json_file) log.info("generated rows data") return array def gen_default_binary_dataframe_data(nb=ct.default_nb, dim=ct.default_dim, start=0, auto_id=False, primary_field=ct.default_int64_field_name): int_values = pd.Series(data=[i for i in range(start, start + nb)]) float_values = pd.Series(data=[np.float32(i) for i in range(start, start + nb)], dtype="float32") string_values = pd.Series(data=[str(i) for i in range(start, start + nb)], dtype="string") binary_raw_values, binary_vec_values = gen_binary_vectors(nb, dim) df = pd.DataFrame({ ct.default_int64_field_name: int_values, ct.default_float_field_name: float_values, ct.default_string_field_name: string_values, ct.default_binary_vec_field_name: binary_vec_values }) if auto_id is True: if primary_field == ct.default_int64_field_name: df.drop(ct.default_int64_field_name, axis=1, inplace=True) elif primary_field == ct.default_string_field_name: df.drop(ct.default_string_field_name, axis=1, inplace=True) return df, binary_raw_values def gen_default_list_data(nb=ct.default_nb, dim=ct.default_dim, start=0, with_json=True): int_values = [i for i in range(start, start + nb)] float_values = [np.float32(i) for i in range(start, start + nb)] string_values = [str(i) for i in range(start, start + nb)] json_values = [{"number": i, "string": str(i), "bool": bool(i), "list": [j for j in range(0, i)]} for i in range(start, start + nb)] float_vec_values = gen_vectors(nb, dim) if with_json is False: data = [int_values, float_values, string_values, float_vec_values] else: data = [int_values, float_values, string_values, json_values, float_vec_values] return data def gen_default_list_sparse_data(nb=ct.default_nb, dim=ct.default_dim, start=0, with_json=False): int_values = [i for i in range(start, start + nb)] float_values = [np.float32(i) for i in range(start, start + nb)] string_values = [str(i) for i in range(start, start + nb)] json_values = [{"number": i, "string": str(i), "bool": bool(i), "list": [j for j in range(0, i)]} for i in range(start, start + nb)] sparse_vec_values = gen_vectors(nb, dim, vector_data_type="SPARSE_VECTOR") if with_json: data = [int_values, float_values, string_values, json_values, sparse_vec_values] else: data = [int_values, float_values, string_values, sparse_vec_values] return data def gen_default_list_data_for_bulk_insert(nb=ct.default_nb, varchar_len=2000, with_varchar_field=True): str_value = gen_str_by_length(length=varchar_len) int_values = [i for i in range(nb)] float_values = [np.float32(i) for i in range(nb)] string_values = [f"{str(i)}_{str_value}" for i in range(nb)] # in case of large nb, float_vec_values will be too large in memory # then generate float_vec_values in each loop instead of generating all at once during generate npy or json file float_vec_values = [] # placeholder for float_vec data = [int_values, float_values, string_values, float_vec_values] if with_varchar_field is False: data = [int_values, float_values, float_vec_values] return data def prepare_bulk_insert_data(schema=None, nb=ct.default_nb, file_type="npy", minio_endpoint="127.0.0.1:9000", bucket_name="milvus-bucket"): schema = gen_default_collection_schema() if schema is None else schema dim = get_dim_by_schema(schema=schema) log.info(f"start to generate raw data for bulk insert") t0 = time.time() data = get_column_data_by_schema(schema=schema, nb=nb, skip_vectors=True) log.info(f"generate raw data for bulk insert cost {time.time() - t0} s") data_dir = "/tmp/bulk_insert_data" Path(data_dir).mkdir(parents=True, exist_ok=True) log.info(f"schema:{schema}, nb:{nb}, file_type:{file_type}, minio_endpoint:{minio_endpoint}, bucket_name:{bucket_name}") files = [] log.info(f"generate {file_type} files for bulk insert") if file_type == "json": files = gen_json_files_for_bulk_insert(data, schema, data_dir) if file_type == "npy": files = gen_npy_files_for_bulk_insert(data, schema, data_dir) log.info(f"generated {len(files)} {file_type} files for bulk insert, cost {time.time() - t0} s") log.info("upload file to minio") client = Minio(minio_endpoint, access_key="minioadmin", secret_key="minioadmin", secure=False) for file_name in files: file_size = os.path.getsize(os.path.join(data_dir, file_name)) / 1024 / 1024 t0 = time.time() client.fput_object(bucket_name, file_name, os.path.join(data_dir, file_name)) log.info(f"upload file {file_name} to minio, size: {file_size:.2f} MB, cost {time.time() - t0:.2f} s") return files def get_column_data_by_schema(nb=ct.default_nb, schema=None, skip_vectors=False, start=None): if schema is None: schema = gen_default_collection_schema() fields = schema.fields fields_not_auto_id = [] for field in fields: if not field.auto_id: fields_not_auto_id.append(field) data = [] for field in fields_not_auto_id: if field.dtype == DataType.FLOAT_VECTOR and skip_vectors is True: tmp = [] else: tmp = gen_data_by_type(field, nb=nb, start=start) data.append(tmp) return data def get_row_data_by_schema(nb=ct.default_nb, schema=None): if schema is None: schema = gen_default_collection_schema() fields = schema.fields fields_not_auto_id = [] for field in fields: if not field.auto_id: fields_not_auto_id.append(field) data = [] for i in range(nb): tmp = {} for field in fields_not_auto_id: tmp[field.name] = gen_data_by_type(field) data.append(tmp) return data def get_fields_map(schema=None): if schema is None: schema = gen_default_collection_schema() fields = schema.fields fields_map = {} for field in fields: fields_map[field.name] = field.dtype return fields_map def get_int64_field_name(schema=None): if schema is None: schema = gen_default_collection_schema() fields = schema.fields for field in fields: if field.dtype == DataType.INT64: return field.name return None def get_float_field_name(schema=None): if schema is None: schema = gen_default_collection_schema() fields = schema.fields for field in fields: if field.dtype == DataType.FLOAT or field.dtype == DataType.DOUBLE: return field.name return None def get_float_vec_field_name(schema=None): if schema is None: schema = gen_default_collection_schema() fields = schema.fields for field in fields: if field.dtype == DataType.FLOAT_VECTOR: return field.name return None def get_float_vec_field_name_list(schema=None): vec_fields = [] if schema is None: schema = gen_default_collection_schema() fields = schema.fields for field in fields: if field.dtype in [DataType.FLOAT_VECTOR, DataType.FLOAT16_VECTOR, DataType.BFLOAT16_VECTOR]: vec_fields.append(field.name) return vec_fields def get_scalar_field_name_list(schema=None): vec_fields = [] if schema is None: schema = gen_default_collection_schema() fields = schema.fields for field in fields: if field.dtype in [DataType.BOOL, DataType.INT8, DataType.INT16, DataType.INT32, DataType.INT64, DataType.FLOAT, DataType.DOUBLE, DataType.VARCHAR]: vec_fields.append(field.name) return vec_fields def get_binary_vec_field_name(schema=None): if schema is None: schema = gen_default_collection_schema() fields = schema.fields for field in fields: if field.dtype == DataType.BINARY_VECTOR: return field.name return None def get_binary_vec_field_name_list(schema=None): vec_fields = [] if schema is None: schema = gen_default_collection_schema() fields = schema.fields for field in fields: if field.dtype in [DataType.BINARY_VECTOR]: vec_fields.append(field.name) return vec_fields def get_dim_by_schema(schema=None): if schema is None: schema = gen_default_collection_schema() fields = schema.fields for field in fields: if field.dtype == DataType.FLOAT_VECTOR or field.dtype == DataType.BINARY_VECTOR: dim = field.params['dim'] return dim return None def gen_data_by_type(field, nb=None, start=None): # if nb is None, return one data, else return a list of data data_type = field.dtype if data_type == DataType.BOOL: if nb is None: return random.choice([True, False]) return [random.choice([True, False]) for _ in range(nb)] if data_type == DataType.INT8: if nb is None: return random.randint(-128, 127) return [random.randint(-128, 127) for _ in range(nb)] if data_type == DataType.INT16: if nb is None: return random.randint(-32768, 32767) return [random.randint(-32768, 32767) for _ in range(nb)] if data_type == DataType.INT32: if nb is None: return random.randint(-2147483648, 2147483647) return [random.randint(-2147483648, 2147483647) for _ in range(nb)] if data_type == DataType.INT64: if nb is None: return random.randint(-9223372036854775808, 9223372036854775807) if start is not None: return [i for i in range(start, start+nb)] return [random.randint(-9223372036854775808, 9223372036854775807) for _ in range(nb)] if data_type == DataType.FLOAT: if nb is None: return np.float32(random.random()) return [np.float32(random.random()) for _ in range(nb)] if data_type == DataType.DOUBLE: if nb is None: return np.float64(random.random()) return [np.float64(random.random()) for _ in range(nb)] if data_type == DataType.VARCHAR: max_length = field.params['max_length'] max_length = min(20, max_length-1) length = random.randint(0, max_length) if nb is None: return "".join([chr(random.randint(97, 122)) for _ in range(length)]) return ["".join([chr(random.randint(97, 122)) for _ in range(length)]) for _ in range(nb)] if data_type == DataType.JSON: if nb is None: return {"name": fake.name(), "address": fake.address()} data = [{"name": str(i), "address": i} for i in range(nb)] return data if data_type == DataType.FLOAT_VECTOR: dim = field.params['dim'] if nb is None: return [random.random() for i in range(dim)] return [[random.random() for i in range(dim)] for _ in range(nb)] if data_type == DataType.BFLOAT16_VECTOR: dim = field.params['dim'] if nb is None: raw_vector = [random.random() for _ in range(dim)] bf16_vector = jnp.array(raw_vector, dtype=jnp.bfloat16) bf16_vector = np.array(bf16_vector).view(np.uint8).tolist() return bytes(bf16_vector) bf16_vectors = [] for i in range(nb): raw_vector = [random.random() for _ in range(dim)] bf16_vector = jnp.array(raw_vector, dtype=jnp.bfloat16) bf16_vector = np.array(bf16_vector).view(np.uint8).tolist() bf16_vectors.append(bytes(bf16_vector)) return bf16_vectors if data_type == DataType.FLOAT16_VECTOR: dim = field.params['dim'] if nb is None: return [random.random() for i in range(dim)] return [[random.random() for i in range(dim)] for _ in range(nb)] if data_type == DataType.BINARY_VECTOR: dim = field.params['dim'] if nb is None: raw_vector = [random.randint(0, 1) for _ in range(dim)] binary_byte = bytes(np.packbits(raw_vector, axis=-1).tolist()) return binary_byte return [bytes(np.packbits([random.randint(0, 1) for _ in range(dim)], axis=-1).tolist()) for _ in range(nb)] if data_type == DataType.ARRAY: max_capacity = field.params['max_capacity'] element_type = field.element_type if element_type == DataType.INT32: if nb is None: return [random.randint(-2147483648, 2147483647) for _ in range(max_capacity)] return [[random.randint(-2147483648, 2147483647) for _ in range(max_capacity)] for _ in range(nb)] if element_type == DataType.INT64: if nb is None: return [random.randint(-9223372036854775808, 9223372036854775807) for _ in range(max_capacity)] return [[random.randint(-9223372036854775808, 9223372036854775807) for _ in range(max_capacity)] for _ in range(nb)] if element_type == DataType.BOOL: if nb is None: return [random.choice([True, False]) for _ in range(max_capacity)] return [[random.choice([True, False]) for _ in range(max_capacity)] for _ in range(nb)] if element_type == DataType.FLOAT: if nb is None: return [np.float32(random.random()) for _ in range(max_capacity)] return [[np.float32(random.random()) for _ in range(max_capacity)] for _ in range(nb)] if element_type == DataType.VARCHAR: max_length = field.params['max_length'] max_length = min(20, max_length - 1) length = random.randint(0, max_length) if nb is None: return ["".join([chr(random.randint(97, 122)) for _ in range(length)]) for _ in range(max_capacity)] return [["".join([chr(random.randint(97, 122)) for _ in range(length)]) for _ in range(max_capacity)] for _ in range(nb)] return None def gen_json_files_for_bulk_insert(data, schema, data_dir): for d in data: if len(d) > 0: nb = len(d) dim = get_dim_by_schema(schema) vec_field_name = get_float_vec_field_name(schema) fields_name = [field.name for field in schema.fields] # get vec field index vec_field_index = fields_name.index(vec_field_name) uuid_str = str(uuid.uuid4()) log.info(f"file dir name: {uuid_str}") file_name = f"{uuid_str}/bulk_insert_data_source_dim_{dim}_nb_{nb}.json" files = [file_name] data_source = os.path.join(data_dir, file_name) Path(data_source).parent.mkdir(parents=True, exist_ok=True) log.info(f"file name: {data_source}") with open(data_source, "w") as f: f.write("{") f.write("\n") f.write('"rows":[') f.write("\n") for i in range(nb): entity_value = [None for _ in range(len(fields_name))] for j in range(len(data)): if j == vec_field_index: entity_value[j] = [random.random() for _ in range(dim)] else: entity_value[j] = data[j][i] entity = dict(zip(fields_name, entity_value)) f.write(json.dumps(entity, indent=4, default=to_serializable)) if i != nb - 1: f.write(",") f.write("\n") f.write("]") f.write("\n") f.write("}") return files def gen_npy_files_for_bulk_insert(data, schema, data_dir): for d in data: if len(d) > 0: nb = len(d) dim = get_dim_by_schema(schema) vec_field_name = get_float_vec_field_name(schema) fields_name = [field.name for field in schema.fields] files = [] uuid_str = uuid.uuid4() for field in fields_name: files.append(f"{uuid_str}/{field}.npy") for i, file in enumerate(files): data_source = os.path.join(data_dir, file) # mkdir for npy file Path(data_source).parent.mkdir(parents=True, exist_ok=True) log.info(f"save file {data_source}") if vec_field_name in file: log.info(f"generate {nb} vectors with dim {dim} for {data_source}") with NpyAppendArray(data_source, "wb") as npaa: for j in range(nb): vector = np.array([[random.random() for _ in range(dim)]]) npaa.append(vector) elif isinstance(data[i][0], dict): tmp = [] for d in data[i]: tmp.append(json.dumps(d)) data[i] = tmp np.save(data_source, np.array(data[i])) else: np.save(data_source, np.array(data[i])) return files def gen_default_tuple_data(nb=ct.default_nb, dim=ct.default_dim): int_values = [i for i in range(nb)] float_values = [np.float32(i) for i in range(nb)] string_values = [str(i) for i in range(nb)] float_vec_values = gen_vectors(nb, dim) data = (int_values, float_values, string_values, float_vec_values) return data def gen_numpy_data(nb=ct.default_nb, dim=ct.default_dim): int_values = np.arange(nb, dtype='int64') float_values = np.arange(nb, dtype='float32') string_values = [np.str_(i) for i in range(nb)] json_values = [{"number": i, "string": str(i), "bool": bool(i), "list": [j for j in range(i, i + ct.default_json_list_length)]} for i in range(nb)] float_vec_values = gen_vectors(nb, dim) data = [int_values, float_values, string_values, json_values, float_vec_values] return data def gen_default_binary_list_data(nb=ct.default_nb, dim=ct.default_dim): int_values = [i for i in range(nb)] float_values = [np.float32(i) for i in range(nb)] string_values = [str(i) for i in range(nb)] binary_raw_values, binary_vec_values = gen_binary_vectors(nb, dim) data = [int_values, float_values, string_values, binary_vec_values] return data, binary_raw_values def gen_simple_index(): index_params = [] for i in range(len(ct.all_index_types)): if ct.all_index_types[i] in ct.binary_support: continue dic = {"index_type": ct.all_index_types[i], "metric_type": "L2"} dic.update({"params": ct.default_index_params[i]}) index_params.append(dic) return index_params def gen_autoindex_params(): index_params = [ {}, {"metric_type": "IP"}, {"metric_type": "L2"}, {"metric_type": "COSINE"}, {"index_type": "AUTOINDEX"}, {"index_type": "AUTOINDEX", "metric_type": "L2"}, {"index_type": "AUTOINDEX", "metric_type": "COSINE"}, {"index_type": "IVF_FLAT", "metric_type": "L2", "nlist": "1024", "m": "100"}, {"index_type": "DISKANN", "metric_type": "L2"}, {"index_type": "IVF_PQ", "nlist": "128", "m": "16", "nbits": "8", "metric_type": "IP"}, {"index_type": "IVF_SQ8", "nlist": "128", "metric_type": "COSINE"} ] return index_params def gen_invalid_field_types(): field_types = [ 6, 1.0, [[]], {}, (), "", "a" ] return field_types def gen_invalid_search_params_type(): invalid_search_key = 100 search_params = [] for index_type in ct.all_index_types: if index_type == "FLAT": continue # search_params.append({"index_type": index_type, "search_params": {"invalid_key": invalid_search_key}}) if index_type in ["IVF_FLAT", "IVF_SQ8", "IVF_PQ"]: for nprobe in ct.get_invalid_ints: ivf_search_params = {"index_type": index_type, "search_params": {"nprobe": nprobe}} search_params.append(ivf_search_params) elif index_type in ["HNSW"]: for ef in ct.get_invalid_ints: hnsw_search_param = {"index_type": index_type, "search_params": {"ef": ef}} search_params.append(hnsw_search_param) elif index_type == "ANNOY": for search_k in ct.get_invalid_ints: if isinstance(search_k, int): continue annoy_search_param = {"index_type": index_type, "search_params": {"search_k": search_k}} search_params.append(annoy_search_param) elif index_type == "SCANN": for reorder_k in ct.get_invalid_ints: if isinstance(reorder_k, int): continue scann_search_param = {"index_type": index_type, "search_params": {"nprobe": 8, "reorder_k": reorder_k}} search_params.append(scann_search_param) elif index_type == "DISKANN": for search_list in ct.get_invalid_ints[1:]: diskann_search_param = {"index_type": index_type, "search_params": {"search_list": search_list}} search_params.append(diskann_search_param) return search_params def gen_search_param(index_type, metric_type="L2"): search_params = [] if index_type in ["FLAT", "IVF_FLAT", "IVF_SQ8", "IVF_PQ", "GPU_IVF_FLAT", "GPU_IVF_PQ"]: if index_type in ["GPU_FLAT"]: ivf_search_params = {"metric_type": metric_type, "params": {}} search_params.append(ivf_search_params) else: for nprobe in [64]: ivf_search_params = {"metric_type": metric_type, "params": {"nprobe": nprobe}} search_params.append(ivf_search_params) elif index_type in ["BIN_FLAT", "BIN_IVF_FLAT"]: if metric_type not in ct.binary_metrics: log.error("Metric type error: binary index only supports distance type in (%s)" % ct.binary_metrics) # default metric type for binary index metric_type = "JACCARD" for nprobe in [64, 128]: binary_search_params = {"metric_type": metric_type, "params": {"nprobe": nprobe}} search_params.append(binary_search_params) elif index_type in ["HNSW"]: for ef in [64, 1500, 32768]: hnsw_search_param = {"metric_type": metric_type, "params": {"ef": ef}} search_params.append(hnsw_search_param) elif index_type == "ANNOY": for search_k in [1000, 5000]: annoy_search_param = {"metric_type": metric_type, "params": {"search_k": search_k}} search_params.append(annoy_search_param) elif index_type == "SCANN": for reorder_k in [1200, 3000]: scann_search_param = {"metric_type": metric_type, "params": {"nprobe": 64, "reorder_k": reorder_k}} search_params.append(scann_search_param) elif index_type == "DISKANN": for search_list in [20, 300, 1500]: diskann_search_param = {"metric_type": metric_type, "params": {"search_list": search_list}} search_params.append(diskann_search_param) else: log.error("Invalid index_type.") raise Exception("Invalid index_type.") log.debug(search_params) return search_params def gen_autoindex_search_params(): search_params = [ {}, {"metric_type": "IP"}, {"nlist": "1024"}, {"efSearch": "100"}, {"search_k": "1000"} ] return search_params def gen_invalid_search_param(index_type, metric_type="L2"): search_params = [] if index_type in ["FLAT", "IVF_FLAT", "IVF_SQ8", "IVF_PQ"] \ or index_type in ["BIN_FLAT", "BIN_IVF_FLAT"]: for nprobe in [-1]: ivf_search_params = {"metric_type": metric_type, "params": {"nprobe": nprobe}} search_params.append(ivf_search_params) elif index_type in ["HNSW"]: for ef in [-1]: hnsw_search_param = {"metric_type": metric_type, "params": {"ef": ef}} search_params.append(hnsw_search_param) elif index_type == "ANNOY": for search_k in ["-2"]: annoy_search_param = {"metric_type": metric_type, "params": {"search_k": search_k}} search_params.append(annoy_search_param) elif index_type == "DISKANN": for search_list in ["-1"]: diskann_search_param = {"metric_type": metric_type, "params": {"search_list": search_list}} search_params.append(diskann_search_param) elif index_type == "SCANN": for reorder_k in [-1]: scann_search_param = {"metric_type": metric_type, "params": {"reorder_k": reorder_k, "nprobe": 10}} search_params.append(scann_search_param) else: log.error("Invalid index_type.") raise Exception("Invalid index_type.") return search_params def gen_all_type_fields(): fields = [] for k, v in DataType.__members__.items(): if v != DataType.UNKNOWN: field, _ = ApiFieldSchemaWrapper().init_field_schema(name=k.lower(), dtype=v) fields.append(field) return fields def gen_normal_expressions(): expressions = [ "", "int64 > 0", "(int64 > 0 && int64 < 400) or (int64 > 500 && int64 < 1000)", "int64 not in [1, 2, 3]", "int64 in [1, 2, 3] and float != 2", "int64 == 0 || float == 10**2 || (int64 + 1) == 3", "0 <= int64 < 400 and int64 % 100 == 0", "200+300 < int64 <= 500+500", "int64 > 400 && int64 < 200", "int64 in [300/2, 900%40, -10*30+800, (100+200)*2] or float in [+3**6, 2**10/2]", "float <= -4**5/2 && float > 500-1 && float != 500/2+260" ] return expressions def gen_json_field_expressions(): expressions = [ "json_field['number'] > 0", "0 <= json_field['number'] < 400 or 1000 > json_field['number'] >= 500", "json_field['number'] not in [1, 2, 3]", "json_field['number'] in [1, 2, 3] and json_field['float'] != 2", "json_field['number'] == 0 || json_field['float'] == 10**2 || json_field['number'] + 1 == 3", "json_field['number'] < 400 and json_field['number'] >= 100 and json_field['number'] % 100 == 0", "json_field['float'] > 400 && json_field['float'] < 200", "json_field['number'] in [300/2, -10*30+800, (100+200)*2] or json_field['float'] in [+3**6, 2**10/2]", "json_field['float'] <= -4**5/2 && json_field['float'] > 500-1 && json_field['float'] != 500/2+260" ] return expressions def gen_array_field_expressions(): expressions = [ "int32_array[0] > 0", "0 <= int32_array[0] < 400 or 1000 > float_array[1] >= 500", "int32_array[1] not in [1, 2, 3]", "int32_array[1] in [1, 2, 3] and string_array[1] != '2'", "int32_array == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]", "int32_array[1] + 1 == 3 && int32_array[0] - 1 != 1", "int32_array[1] % 100 == 0 && string_array[1] in ['1', '2']", "int32_array[1] in [300/2, -10*30+800, (200-100)*2] " "or (float_array[1] <= -4**5/2 || 100 <= int32_array[1] < 200)" ] return expressions def gen_field_compare_expressions(fields1=None, fields2=None): if fields1 is None: fields1 = ["int64_1"] fields2 = ["int64_2"] expressions = [] for field1, field2 in zip(fields1, fields2): expression = [ f"{field1} | {field2} == 1", f"{field1} + {field2} <= 10 || {field1} - {field2} == 2", f"{field1} * {field2} >= 8 && {field1} / {field2} < 2", f"{field1} ** {field2} != 4 and {field1} + {field2} > 5", f"{field1} not in {field2}", f"{field1} in {field2}", ] expressions.extend(expression) return expressions def gen_normal_string_expressions(fields=None): if fields is None: fields = [ct.default_string_field_name] expressions = [] for field in fields: expression = [ f"\"0\"< {field} < \"3\"", f"{field} >= \"0\"", f"({field} > \"0\" && {field} < \"100\") or ({field} > \"200\" && {field} < \"300\")", f"\"0\" <= {field} <= \"100\"", f"{field} == \"0\"|| {field} == \"1\"|| {field} ==\"2\"", f"{field} != \"0\"", f"{field} not in [\"0\", \"1\", \"2\"]", f"{field} in [\"0\", \"1\", \"2\"]" ] expressions.extend(expression) return expressions def gen_invalid_string_expressions(): expressions = [ "varchar in [0, \"1\"]", "varchar not in [\"0\", 1, 2]" ] return expressions def gen_invalid_bool_expressions(): expressions = [ "bool", "!bool", "true", "false", "int64 > 0 and bool", "int64 > 0 or false" ] return expressions def gen_normal_expressions_field(field): expressions = [ "", f"{field} > 0", f"({field} > 0 && {field} < 400) or ({field} > 500 && {field} < 1000)", f"{field} not in [1, 2, 3]", f"{field} in [1, 2, 3] and {field} != 2", f"{field} == 0 || {field} == 1 || {field} == 2", f"0 < {field} < 400", f"500 <= {field} <= 1000", f"200+300 <= {field} <= 500+500", f"{field} in [300/2, 900%40, -10*30+800, 2048/2%200, (100+200)*2]", f"{field} in [+3**6, 2**10/2]", f"{field} <= 4**5/2 && {field} > 500-1 && {field} != 500/2+260", f"{field} > 400 && {field} < 200", f"{field} < -2**8", f"({field} + 1) == 3 || {field} * 2 == 64 || {field} == 10**2" ] return expressions def gen_integer_overflow_expressions(): expressions = [ "int8 < - 128", "int8 > 127", "int8 > -129 && int8 < 128", "int16 < -32768", "int16 >= 32768", "int16 > -32769 && int16 <32768", "int32 < -2147483648", "int32 == 2147483648", "int32 < 2147483648 || int32 == -2147483648", "int8 in [-129, 1] || int16 in [32769] || int32 in [2147483650, 0]" ] return expressions def l2(x, y): return np.linalg.norm(np.array(x) - np.array(y)) def ip(x, y): return np.inner(np.array(x), np.array(y)) def cosine(x, y): return np.dot(x, y)/(np.linalg.norm(x)*np.linalg.norm(y)) def jaccard(x, y): x = np.asarray(x, np.bool_) y = np.asarray(y, np.bool_) return 1 - np.double(np.bitwise_and(x, y).sum()) / np.double(np.bitwise_or(x, y).sum()) def hamming(x, y): x = np.asarray(x, np.bool_) y = np.asarray(y, np.bool_) return np.bitwise_xor(x, y).sum() def tanimoto(x, y): x = np.asarray(x, np.bool_) y = np.asarray(y, np.bool_) res = np.double(np.bitwise_and(x, y).sum()) / np.double(np.bitwise_or(x, y).sum()) if res == 0: value = float("inf") else: value = -np.log2(res) return value def tanimoto_calc(x, y): x = np.asarray(x, np.bool_) y = np.asarray(y, np.bool_) return np.double((len(x) - np.bitwise_xor(x, y).sum())) / (len(y) + np.bitwise_xor(x, y).sum()) def substructure(x, y): x = np.asarray(x, np.bool_) y = np.asarray(y, np.bool_) return 1 - np.double(np.bitwise_and(x, y).sum()) / np.count_nonzero(y) def superstructure(x, y): x = np.asarray(x, np.bool_) y = np.asarray(y, np.bool_) return 1 - np.double(np.bitwise_and(x, y).sum()) / np.count_nonzero(x) def compare_distance_2d_vector(x, y, distance, metric, sqrt): for i in range(len(x)): for j in range(len(y)): if metric == "L2": distance_i = l2(x[i], y[j]) if not sqrt: distance_i = math.pow(distance_i, 2) elif metric == "IP": distance_i = ip(x[i], y[j]) elif metric == "HAMMING": distance_i = hamming(x[i], y[j]) elif metric == "TANIMOTO": distance_i = tanimoto_calc(x[i], y[j]) elif metric == "JACCARD": distance_i = jaccard(x[i], y[j]) else: raise Exception("metric type is invalid") assert abs(distance_i - distance[i][j]) < ct.epsilon return True def compare_distance_vector_and_vector_list(x, y, metric, distance): """ target: compare the distance between x and y[i] with the expected distance array method: compare the distance between x and y[i] with the expected distance array expected: return true if all distances are matched """ if not isinstance(y, list): log.error("%s is not a list." % str(y)) assert False for i in range(len(y)): if metric == "L2": distance_i = l2(x, y[i]) elif metric == "IP": distance_i = ip(x, y[i]) elif metric == "COSINE": distance_i = cosine(x, y[i]) else: raise Exception("metric type is invalid") if abs(distance_i - distance[i]) > ct.epsilon: log.error("The distance between %f and %f is not equal with %f" % (x, y[i], distance[i])) assert abs(distance_i - distance[i]) < ct.epsilon return True def modify_file(file_path_list, is_modify=False, input_content=""): """ file_path_list : file list -> list[] is_modify : does the file need to be reset input_content :the content that need to insert to the file """ if not isinstance(file_path_list, list): log.error("[modify_file] file is not a list.") for file_path in file_path_list: folder_path, file_name = os.path.split(file_path) if not os.path.isdir(folder_path): log.debug("[modify_file] folder(%s) is not exist." % folder_path) os.makedirs(folder_path) if not os.path.isfile(file_path): log.error("[modify_file] file(%s) is not exist." % file_path) else: if is_modify is True: log.debug("[modify_file] start modifying file(%s)..." % file_path) with open(file_path, "r+") as f: f.seek(0) f.truncate() f.write(input_content) f.close() log.info("[modify_file] file(%s) modification is complete." % file_path_list) def index_to_dict(index): return { "collection_name": index.collection_name, "field_name": index.field_name, # "name": index.name, "params": index.params } def get_index_params_params(index_type): """get default params of index params by index type""" return ct.default_all_indexes_params[ct.all_index_types.index(index_type)] def get_search_params_params(index_type): """get default params of search params by index type""" return ct.default_all_search_params_params[ct.all_index_types.index(index_type)] def assert_json_contains(expr, list_data): opposite = False if expr.startswith("not"): opposite = True expr = expr.split("not ", 1)[1] result_ids = [] expr_prefix = expr.split('(', 1)[0] exp_ids = eval(expr.split(', ', 1)[1].split(')', 1)[0]) if expr_prefix in ["json_contains", "JSON_CONTAINS", "array_contains", "ARRAY_CONTAINS"]: for i in range(len(list_data)): if exp_ids in list_data[i]: result_ids.append(i) elif expr_prefix in ["json_contains_all", "JSON_CONTAINS_ALL", "array_contains_all", "ARRAY_CONTAINS_ALL"]: for i in range(len(list_data)): set_list_data = set(tuple(element) if isinstance(element, list) else element for element in list_data[i]) if set(exp_ids).issubset(set_list_data): result_ids.append(i) elif expr_prefix in ["json_contains_any", "JSON_CONTAINS_ANY", "array_contains_any", "ARRAY_CONTAINS_ANY"]: for i in range(len(list_data)): set_list_data = set(tuple(element) if isinstance(element, list) else element for element in list_data[i]) if set(exp_ids) & set_list_data: result_ids.append(i) else: log.warning("unknown expr: %s" % expr) if opposite: result_ids = [i for i in range(len(list_data)) if i not in result_ids] return result_ids def assert_equal_index(index_1, index_2): return index_to_dict(index_1) == index_to_dict(index_2) def gen_partitions(collection_w, partition_num=1): """ target: create extra partitions except for _default method: create more than one partitions expected: return collection and raw data """ log.info("gen_partitions: creating partitions") for i in range(partition_num): partition_name = "search_partition_" + str(i) collection_w.create_partition(partition_name=partition_name, description="search partition") par = collection_w.partitions assert len(par) == (partition_num + 1) log.info("gen_partitions: created partitions %s" % par) def insert_data(collection_w, nb=ct.default_nb, is_binary=False, is_all_data_type=False, auto_id=False, dim=ct.default_dim, insert_offset=0, enable_dynamic_field=False, with_json=True, random_primary_key=False, multiple_dim_array=[], primary_field=ct.default_int64_field_name, vector_data_type="FLOAT_VECTOR"): """ target: insert non-binary/binary data method: insert non-binary/binary data into partitions if any expected: return collection and raw data """ # par = collection_w.partitions # num = len(par) num = 1 vectors = [] binary_raw_vectors = [] insert_ids = [] start = insert_offset log.info(f"inserting {nb} data into collection {collection_w.name}") # extract the vector field name list vector_name_list = extract_vector_field_name_list(collection_w) # prepare data for i in range(num): log.debug("Dynamic field is enabled: %s" % enable_dynamic_field) if not is_binary: if not is_all_data_type: if not enable_dynamic_field: if vector_data_type == "FLOAT_VECTOR": default_data = gen_default_dataframe_data(nb // num, dim=dim, start=start, with_json=with_json, random_primary_key=random_primary_key, multiple_dim_array=multiple_dim_array, multiple_vector_field_name=vector_name_list, vector_data_type=vector_data_type, auto_id=auto_id, primary_field=primary_field) elif vector_data_type in ct.append_vector_type: default_data = gen_general_default_list_data(nb // num, dim=dim, start=start, with_json=with_json, random_primary_key=random_primary_key, multiple_dim_array=multiple_dim_array, multiple_vector_field_name=vector_name_list, vector_data_type=vector_data_type, auto_id=auto_id, primary_field=primary_field) else: default_data = gen_default_rows_data(nb // num, dim=dim, start=start, with_json=with_json, multiple_dim_array=multiple_dim_array, multiple_vector_field_name=vector_name_list, vector_data_type=vector_data_type, auto_id=auto_id, primary_field=primary_field) else: if not enable_dynamic_field: if vector_data_type == "FLOAT_VECTOR": default_data = gen_general_list_all_data_type(nb // num, dim=dim, start=start, with_json=with_json, random_primary_key=random_primary_key, multiple_dim_array=multiple_dim_array, multiple_vector_field_name=vector_name_list, auto_id=auto_id, primary_field=primary_field) elif vector_data_type == "FLOAT16_VECTOR" or "BFLOAT16_VECTOR": default_data = gen_general_list_all_data_type(nb // num, dim=dim, start=start, with_json=with_json, random_primary_key=random_primary_key, multiple_dim_array=multiple_dim_array, multiple_vector_field_name=vector_name_list, auto_id=auto_id, primary_field=primary_field) else: if os.path.exists(ct.rows_all_data_type_file_path + f'_{i}' + f'_dim{dim}.txt'): with open(ct.rows_all_data_type_file_path + f'_{i}' + f'_dim{dim}.txt', 'rb') as f: default_data = pickle.load(f) else: default_data = gen_default_rows_data_all_data_type(nb // num, dim=dim, start=start, with_json=with_json, multiple_dim_array=multiple_dim_array, multiple_vector_field_name=vector_name_list, partition_id=i, auto_id=auto_id, primary_field=primary_field) else: default_data, binary_raw_data = gen_default_binary_dataframe_data(nb // num, dim=dim, start=start, auto_id=auto_id, primary_field=primary_field) binary_raw_vectors.extend(binary_raw_data) insert_res = collection_w.insert(default_data)[0] log.info(f"inserted {nb // num} data into collection {collection_w.name}") time_stamp = insert_res.timestamp insert_ids.extend(insert_res.primary_keys) vectors.append(default_data) start += nb // num return collection_w, vectors, binary_raw_vectors, insert_ids, time_stamp def _check_primary_keys(primary_keys, nb): if primary_keys is None: raise Exception("The primary_keys is None") assert len(primary_keys) == nb for i in range(nb - 1): if primary_keys[i] >= primary_keys[i + 1]: return False return True def get_segment_distribution(res): """ Get segment distribution """ from collections import defaultdict segment_distribution = defaultdict(lambda: {"sealed": []}) for r in res: for node_id in r.nodeIds: if r.state == 3: segment_distribution[node_id]["sealed"].append(r.segmentID) return segment_distribution def percent_to_int(string): """ transform percent(0%--100%) to int """ new_int = -1 if not isinstance(string, str): log.error("%s is not a string" % string) return new_int if "%" not in string: log.error("%s is not a percent" % string) else: new_int = int(string.strip("%")) return new_int def gen_grant_list(collection_name): grant_list = [{"object": "Collection", "object_name": collection_name, "privilege": "Load"}, {"object": "Collection", "object_name": collection_name, "privilege": "Release"}, {"object": "Collection", "object_name": collection_name, "privilege": "Compaction"}, {"object": "Collection", "object_name": collection_name, "privilege": "Delete"}, {"object": "Collection", "object_name": collection_name, "privilege": "GetStatistics"}, {"object": "Collection", "object_name": collection_name, "privilege": "CreateIndex"}, {"object": "Collection", "object_name": collection_name, "privilege": "IndexDetail"}, {"object": "Collection", "object_name": collection_name, "privilege": "DropIndex"}, {"object": "Collection", "object_name": collection_name, "privilege": "Search"}, {"object": "Collection", "object_name": collection_name, "privilege": "Flush"}, {"object": "Collection", "object_name": collection_name, "privilege": "Query"}, {"object": "Collection", "object_name": collection_name, "privilege": "LoadBalance"}, {"object": "Collection", "object_name": collection_name, "privilege": "Import"}, {"object": "Global", "object_name": "*", "privilege": "All"}, {"object": "Global", "object_name": "*", "privilege": "CreateCollection"}, {"object": "Global", "object_name": "*", "privilege": "DropCollection"}, {"object": "Global", "object_name": "*", "privilege": "DescribeCollection"}, {"object": "Global", "object_name": "*", "privilege": "ShowCollections"}, {"object": "Global", "object_name": "*", "privilege": "CreateOwnership"}, {"object": "Global", "object_name": "*", "privilege": "DropOwnership"}, {"object": "Global", "object_name": "*", "privilege": "SelectOwnership"}, {"object": "Global", "object_name": "*", "privilege": "ManageOwnership"}, {"object": "User", "object_name": "*", "privilege": "UpdateUser"}, {"object": "User", "object_name": "*", "privilege": "SelectUser"}] return grant_list def install_milvus_operator_specific_config(namespace, milvus_mode, release_name, image, rate_limit_enable, collection_rate_limit): """ namespace : str milvus_mode : str -> standalone or cluster release_name : str image: str -> image tag including repository rate_limit_enable: str -> true or false, switch for rate limit collection_rate_limit: int -> collection rate limit numbers input_content :the content that need to insert to the file return: milvus host name """ if not isinstance(namespace, str): log.error("[namespace] is not a string.") if not isinstance(milvus_mode, str): log.error("[milvus_mode] is not a string.") if not isinstance(release_name, str): log.error("[release_name] is not a string.") if not isinstance(image, str): log.error("[image] is not a string.") if not isinstance(rate_limit_enable, str): log.error("[rate_limit_enable] is not a string.") if not isinstance(collection_rate_limit, int): log.error("[collection_rate_limit] is not an integer.") if milvus_mode not in ["standalone", "cluster"]: log.error("[milvus_mode] is not 'standalone' or 'cluster'") if rate_limit_enable not in ["true", "false"]: log.error("[rate_limit_enable] is not 'true' or 'false'") data_config = { 'metadata.namespace': namespace, 'spec.mode': milvus_mode, 'metadata.name': release_name, 'spec.components.image': image, 'spec.components.proxy.serviceType': 'LoadBalancer', 'spec.components.dataNode.replicas': 2, 'spec.config.common.retentionDuration': 60, 'spec.config.quotaAndLimits.enable': rate_limit_enable, 'spec.config.quotaAndLimits.ddl.collectionRate': collection_rate_limit, } mil = MilvusOperator() mil.install(data_config) if mil.wait_for_healthy(release_name, NAMESPACE, timeout=TIMEOUT): host = mic.endpoint(release_name, NAMESPACE).split(':')[0] else: raise MilvusException(message=f'Milvus healthy timeout 1800s') return host def get_wildcard_output_field_names(collection_w, output_fields): all_fields = [field.name for field in collection_w.schema.fields] output_fields = output_fields.copy() if "*" in output_fields: output_fields.remove("*") output_fields.extend(all_fields) return output_fields def extract_vector_field_name_list(collection_w): """ extract the vector field name list collection_w : the collection object to be extracted thea name of all the vector fields return: the vector field name list without the default float vector field name """ schema_dict = collection_w.schema.to_dict() fields = schema_dict.get('fields') vector_name_list = [] for field in fields: if field['type'] == DataType.FLOAT_VECTOR \ or field['type'] == DataType.FLOAT16_VECTOR \ or field['type'] == DataType.BFLOAT16_VECTOR \ or field['type'] == DataType.SPARSE_FLOAT_VECTOR: if field['name'] != ct.default_float_vec_field_name: vector_name_list.append(field['name']) return vector_name_list def get_activate_func_from_metric_type(metric_type): activate_function = lambda x: x if metric_type == "COSINE": activate_function = lambda x: (1 + x) * 0.5 elif metric_type == "IP": activate_function = lambda x: 0.5 + math.atan(x)/ math.pi else: activate_function = lambda x: 1.0 - 2*math.atan(x) / math.pi return activate_function def get_hybrid_search_base_results_rrf(search_res_dict_array, round_decimal=-1): """ merge the element in the dicts array search_res_dict_array : the dict array in which the elements to be merged return: the sorted id and score answer """ # calculate hybrid search base line search_res_dict_merge = {} ids_answer = [] score_answer = [] for i, result in enumerate(search_res_dict_array, 0): for key, distance in result.items(): search_res_dict_merge[key] = search_res_dict_merge.get(key, 0) + distance if round_decimal != -1 : for k, v in search_res_dict_merge.items(): multiplier = math.pow(10.0, round_decimal) v = math.floor(v*multiplier+0.5) / multiplier search_res_dict_merge[k] = v sorted_list = sorted(search_res_dict_merge.items(), key=lambda x: x[1], reverse=True) for sort in sorted_list: ids_answer.append(int(sort[0])) score_answer.append(float(sort[1])) return ids_answer, score_answer def get_hybrid_search_base_results(search_res_dict_array, weights, metric_types, round_decimal=-1): """ merge the element in the dicts array search_res_dict_array : the dict array in which the elements to be merged return: the sorted id and score answer """ # calculate hybrid search base line search_res_dict_merge = {} ids_answer = [] score_answer = [] for i, result in enumerate(search_res_dict_array, 0): activate_function = get_activate_func_from_metric_type(metric_types[i]) for key, distance in result.items(): activate_distance = activate_function(distance) weight = weights[i] search_res_dict_merge[key] = search_res_dict_merge.get(key, 0) + activate_function(distance) * weights[i] if round_decimal != -1 : for k, v in search_res_dict_merge.items(): multiplier = math.pow(10.0, round_decimal) v = math.floor(v*multiplier+0.5) / multiplier search_res_dict_merge[k] = v sorted_list = sorted(search_res_dict_merge.items(), key=lambda x: x[1], reverse=True) for sort in sorted_list: ids_answer.append(int(sort[0])) score_answer.append(float(sort[1])) return ids_answer, score_answer def gen_bf16_vectors(num, dim): """ generate brain float16 vector data raw_vectors : the vectors bf16_vectors: the bytes used for insert return: raw_vectors and bf16_vectors """ raw_vectors = [] bf16_vectors = [] for _ in range(num): raw_vector = [random.random() for _ in range(dim)] raw_vectors.append(raw_vector) bf16_vector = tf.cast(raw_vector, dtype=tf.bfloat16).numpy() bf16_vectors.append(bf16_vector) return raw_vectors, bf16_vectors def gen_fp16_vectors(num, dim): """ generate float16 vector data raw_vectors : the vectors fp16_vectors: the bytes used for insert return: raw_vectors and fp16_vectors """ raw_vectors = [] fp16_vectors = [] for _ in range(num): raw_vector = [random.random() for _ in range(dim)] raw_vectors.append(raw_vector) fp16_vector = np.array(raw_vector, dtype=np.float16) fp16_vectors.append(fp16_vector) return raw_vectors, fp16_vectors def gen_sparse_vectors(nb, dim): """ generate sparse vector data return sparse_vectors """ rng = np.random.default_rng() entities = [ { d: rng.random() for d in random.sample(range(dim), random.randint(1, 1)) } for _ in range(nb) ] return entities def gen_vectors_based_on_vector_type(num, dim, vector_data_type): """ generate float16 vector data raw_vectors : the vectors fp16_vectors: the bytes used for insert return: raw_vectors and fp16_vectors """ if vector_data_type == "FLOAT_VECTOR": vectors = [[random.random() for _ in range(dim)] for _ in range(num)] elif vector_data_type == "FLOAT16_VECTOR": vectors = gen_fp16_vectors(num, dim)[1] elif vector_data_type == "BFLOAT16_VECTOR": vectors = gen_bf16_vectors(num, dim)[1] return vectors ================================================ FILE: tests/common/common_type.py ================================================ """ Initialized parameters """ port = 19530 epsilon = 0.000001 namespace = "milvus" default_flush_interval = 1 big_flush_interval = 1000 default_drop_interval = 3 default_dim = 128 default_nb = 1000 default_nb_medium = 5000 default_max_capacity = 100 default_top_k = 10 default_nq = 2 default_limit = 10 default_batch_size = 1000 max_limit = 16384 default_search_params = {"metric_type": "COSINE", "params": {"nprobe": 10}} default_search_ip_params = {"metric_type": "IP", "params": {"nprobe": 10}} default_search_binary_params = {"metric_type": "JACCARD", "params": {"nprobe": 10}} default_index = {"index_type": "IVF_SQ8", "metric_type": "COSINE", "params": {"nlist": 64}} default_binary_index = {"index_type": "BIN_IVF_FLAT", "params": {"nlist": 128}, "metric_type": "JACCARD"} default_diskann_index = {"index_type": "DISKANN", "metric_type": "COSINE", "params": {}} default_diskann_search_params = {"metric_type": "COSINE", "params": {"search_list": 30}} max_top_k = 16384 max_partition_num = 4096 max_role_num = 10 default_partition_num = 64 # default num_partitions for partition key feature default_segment_row_limit = 1000 default_server_segment_row_limit = 1024 * 512 default_alias = "default" default_user = "root" default_password = "Milvus" default_bool_field_name = "bool" default_int8_field_name = "int8" default_int16_field_name = "int16" default_int32_field_name = "int32" default_int64_field_name = "int64" default_float_field_name = "float" default_double_field_name = "double" default_string_field_name = "varchar" default_json_field_name = "json_field" default_array_field_name = "int_array" default_int32_array_field_name = "int32_array" default_float_array_field_name = "float_array" default_string_array_field_name = "string_array" default_float_vec_field_name = "float_vector" default_float16_vec_field_name = "float16_vector" default_bfloat16_vec_field_name = "bfloat16_vector" another_float_vec_field_name = "float_vector1" default_binary_vec_field_name = "binary_vector" float_type = "FLOAT_VECTOR" float16_type = "FLOAT16_VECTOR" bfloat16_type = "BFLOAT16_VECTOR" sparse_vector = "SPARSE_FLOAT_VECTOR" append_vector_type = [float16_type, bfloat16_type, sparse_vector] vector_data_type_all = [float_type, float16_type, bfloat16_type] sparse_vector = "SPARSE_FLOAT_VECTOR" append_vector_type = [float16_type, bfloat16_type, sparse_vector] all_dense_vector_types = [float_type, float16_type, bfloat16_type] default_sparse_vec_field_name = "sparse_vector" default_partition_name = "_default" default_resource_group_name = '__default_resource_group' default_resource_group_capacity = 1000000 default_tag = "1970_01_01" row_count = "row_count" default_length = 65535 default_json_list_length = 1 default_desc = "" default_collection_desc = "default collection" default_index_name = "default_index_name" default_binary_desc = "default binary collection" collection_desc = "collection" int_field_desc = "int64 type field" float_field_desc = "float type field" float_vec_field_desc = "float vector type field" binary_vec_field_desc = "binary vector type field" max_dim = 32768 min_dim = 2 max_binary_vector_dim = 262144 max_sparse_vector_dim = 4294967294 min_sparse_vector_dim = 1 gracefulTime = 1 default_nlist = 128 compact_segment_num_threshold = 3 compact_delta_ratio_reciprocal = 5 # compact_delta_binlog_ratio is 0.2 compact_retention_duration = 40 # compaction travel time retention range 20s max_compaction_interval = 60 # the max time interval (s) from the last compaction max_field_num = 64 # Maximum number of fields in a collection max_vector_field_num = 4 # Maximum number of vector fields in a collection max_name_length = 255 # Maximum length of name for a collection or alias default_replica_num = 1 default_graceful_time = 5 # default_shards_num = 1 max_shards_num = 16 default_db = "default" max_database_num = 64 max_collections_per_db = 65536 max_collection_num = 65536 max_hybrid_search_req_num = 1024 IMAGE_REPOSITORY_MILVUS = "harbor.milvus.io/dockerhub/milvusdb/milvus" NAMESPACE_CHAOS_TESTING = "chaos-testing" Not_Exist = "Not_Exist" Connect_Object_Name = True list_content = "list_content" dict_content = "dict_content" value_content = "value_content" code = "code" err_code = "err_code" err_msg = "err_msg" in_cluster_env = "IN_CLUSTER" default_flat_index = {"index_type": "FLAT", "params": {}, "metric_type": "COSINE"} default_hnsw_index = {"index_type": "HNSW", "metric_type": "COSINE", "params": {"M": 16, "efConstruction": 128}} default_bin_flat_index = {"index_type": "BIN_FLAT", "params": {}, "metric_type": "JACCARD"} default_sparse_inverted_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP", "params": {"drop_ratio_build": 0.2}} default_count_output = "count(*)" rows_all_data_type_file_path = "/tmp/rows_all_data_type" """" List of parameters used to pass """ get_invalid_strs = [ [], 1, [1, "2", 3], (1,), {1: 1}, None, "", " ", "12-s", "12 s", "(mn)", "中文", "%$#", "".join("a" for i in range(max_name_length + 1))] get_invalid_type_fields = [ 1, [1, "2", 3], (1,), {1: 1}, None, "", " ", "12-s", "12 s", "(mn)", "中文", "%$#", "".join("a" for i in range(max_name_length + 1))] get_not_string = [ [], {}, None, (1,), 1, 1.0, [1, "2", 3] ] get_not_string_value = [ " ", "12-s", "12 s", "(mn)", "中文", "%$#", "a".join("a" for i in range(256)) ] get_invalid_vectors = [ "1*2", [1], [1, 2], [" "], ['a'], [None], None, (1, 2), {"a": 1}, " ", "", "String", " siede ", "中文", "a".join("a" for i in range(256)) ] get_invalid_ints = [ 9999999999, 1.0, None, [1, 2, 3], " ", "", -1, "String", "=c", "中文", "a".join("a" for i in range(256)) ] get_invalid_dict = [ [], 1, [1, "2", 3], (1,), None, "", " ", "12-s", {1: 1}, {"中文": 1}, {"%$#": ["a"]}, {"a".join("a" for i in range(256)): "a"} ] get_invalid_metric_type = [ [], 1, [1, "2", 3], (1,), {1: 1}, " ", "12-s", "12 s", "(mn)", "中文", "%$#", "".join("a" for i in range(max_name_length + 1))] get_dict_without_host_port = [ {"host": "host"}, {"": ""} ] get_dict_invalid_host_port = [ {"port": "port"}, # ["host", "port"], # ("host", "port"), {"host": -1}, {"port": ["192.168.1.1"]}, {"port": "-1", "host": "hostlocal"}, ] get_wrong_format_dict = [ {"host": "string_host", "port": {}}, {"host": 0, "port": 19520} ] """ Specially defined list """ all_index_types = ["FLAT", "IVF_FLAT", "IVF_SQ8", "IVF_PQ", "HNSW", "SCANN", "DISKANN", "BIN_FLAT", "BIN_IVF_FLAT", "SPARSE_INVERTED_INDEX", "SPARSE_WAND", "GPU_IVF_FLAT", "GPU_IVF_PQ"] default_index_params = [{"nlist": 128}, {"nlist": 128}, {"nlist": 128}, {"nlist": 128, "m": 16, "nbits": 8}, {"M": 48, "efConstruction": 500}, {"nlist": 128}, {}, {"nlist": 128}, {"nlist": 128}, {"drop_ratio_build": 0.2}, {"drop_ratio_build": 0.2}, {"nlist": 64}, {"nlist": 64, "m": 16, "nbits": 8}] Handler_type = ["GRPC", "HTTP"] binary_support = ["BIN_FLAT", "BIN_IVF_FLAT"] delete_support = ["FLAT", "IVF_FLAT", "IVF_SQ8", "IVF_PQ"] ivf = ["FLAT", "IVF_FLAT", "IVF_SQ8", "IVF_PQ"] sparse_support = ["SPARSE_INVERTED_INDEX", "SPARSE_WAND"] skip_pq = ["IVF_PQ"] float_metrics = ["L2", "IP", "COSINE"] binary_metrics = ["JACCARD", "HAMMING", "SUBSTRUCTURE", "SUPERSTRUCTURE"] structure_metrics = ["SUBSTRUCTURE", "SUPERSTRUCTURE"] all_scalar_data_types = ['int8', 'int16', 'int32', 'int64', 'float', 'double', 'bool', 'varchar'] class CheckTasks: """ The name of the method used to check the result """ check_nothing = "check_nothing" err_res = "error_response" ccr = "check_connection_result" check_collection_property = "check_collection_property" check_partition_property = "check_partition_property" check_search_results = "check_search_results" check_search_iterator = "check_search_iterator" check_query_results = "check_query_results" check_query_iterator = "check_query_iterator" check_query_empty = "check_query_empty" # verify that query result is empty check_query_not_empty = "check_query_not_empty" check_distance = "check_distance" check_delete_compact = "check_delete_compact" check_merge_compact = "check_merge_compact" check_role_property = "check_role_property" check_permission_deny = "check_permission_deny" check_auth_failure = "check_auth_failure" check_value_equal = "check_value_equal" check_rg_property = "check_resource_group_property" check_describe_collection_property = "check_describe_collection_property" class BulkLoadStates: BulkLoadPersisted = "BulkLoadPersisted" BulkLoadFailed = "BulkLoadFailed" BulkLoadDataQueryable = "BulkLoadDataQueryable" BulkLoadDataIndexed = "BulkLoadDataIndexed" class CaseLabel: """ Testcase Levels CI Regression: L0: part of CI Regression triggered by github commit optional used for dev to verify his fix before submitting a PR(like smoke) ~100 testcases and run in 3 mins L1: part of CI Regression triggered by github commit must pass before merge run in 15 mins Benchmark: L2: E2E tests and bug-fix verification Nightly run triggered by cron job run in 60 mins L3: Stability/Performance/reliability, etc. special tests Triggered by cron job or manually run duration depends on test configuration Loadbalance: loadbalance testcases which need to be run in multi query nodes ClusterOnly: For functions only suitable to cluster mode GPU: For GPU supported cases """ L0 = "L0" L1 = "L1" L2 = "L2" L3 = "L3" RBAC = "RBAC" Loadbalance = "Loadbalance" # loadbalance testcases which need to be run in multi query nodes ClusterOnly = "ClusterOnly" # For functions only suitable to cluster mode MultiQueryNodes = "MultiQueryNodes" # for 8 query nodes configs tests, such as resource group GPU = "GPU" ================================================ FILE: tests/common/constants.py ================================================ # constants for old pymilvus API test import utils.util_pymilvus as utils default_fields = utils.gen_default_fields() default_binary_fields = utils.gen_binary_default_fields() default_entity = utils.gen_entities(1) default_raw_binary_vector, default_binary_entity = utils.gen_binary_entities(1) default_entity_row = utils.gen_entities_rows(1) default_raw_binary_vector_row, default_binary_entity_row = utils.gen_binary_entities_rows(1) default_entities = utils.gen_entities(utils.default_nb) default_raw_binary_vectors, default_binary_entities = utils.gen_binary_entities(utils.default_nb) default_entities_new = utils.gen_entities_new(utils.default_nb) default_raw_binary_vectors_new, default_binary_entities_new = utils.gen_binary_entities_new(utils.default_nb) default_entities_rows = utils.gen_entities_rows(utils.default_nb) default_raw_binary_vectors_rows, default_binary_entities_rows = utils.gen_binary_entities_rows(utils.default_nb) ================================================ FILE: tests/common/cus_resource_opts.py ================================================ from __future__ import print_function import os from kubernetes import client, config from kubernetes.client.rest import ApiException from utils.util_log import test_log as log from common.common_type import in_cluster_env _GROUP = 'milvus.io' _VERSION = 'v1alpha1' _NAMESPACE = "default" class CustomResourceOperations(object): def __init__(self, kind, group=_GROUP, version=_VERSION, namespace=_NAMESPACE): self.group = group self.version = version self.namespace = namespace if kind.lower()[-1] != "s": self.plural = kind.lower() + "s" else: self.plural = kind.lower() # init k8s client config in_cluster = os.getenv(in_cluster_env, default='False') log.debug(f"env variable IN_CLUSTER: {in_cluster}") if in_cluster.lower() == 'true': config.load_incluster_config() else: config.load_kube_config() def create(self, body): """create or apply a custom resource in k8s""" pretty = 'true' api_instance = client.CustomObjectsApi() try: api_response = api_instance.create_namespaced_custom_object(self.group, self.version, self.namespace, plural=self.plural, body=body, pretty=pretty) log.info(f"create custom resource response: {api_response}") except ApiException as e: log.error("Exception when calling CustomObjectsApi->create_namespaced_custom_object: %s\n" % e) raise Exception(str(e)) return api_response def delete(self, metadata_name, raise_ex=True): """delete or uninstall a custom resource in k8s""" print(metadata_name) try: api_instance = client.CustomObjectsApi() api_response = api_instance.delete_namespaced_custom_object(self.group, self.version, self.namespace, self.plural, metadata_name) log.info(f"delete custom resource response: {api_response}") except ApiException as e: if raise_ex: log.error("Exception when calling CustomObjectsApi->delete_namespaced_custom_object: %s\n" % e) raise Exception(str(e)) def patch(self, metadata_name, body): """patch a custom resource in k8s""" api_instance = client.CustomObjectsApi() try: api_response = api_instance.patch_namespaced_custom_object(self.group, self.version, self.namespace, plural=self.plural, name=metadata_name, body=body) log.debug(f"patch custom resource response: {api_response}") except ApiException as e: log.error("Exception when calling CustomObjectsApi->patch_namespaced_custom_object: %s\n" % e) raise Exception(str(e)) return api_response def list_all(self): """list all the customer resources in k8s""" pretty = 'true' try: api_instance = client.CustomObjectsApi() api_response = api_instance.list_namespaced_custom_object(self.group, self.version, self.namespace, plural=self.plural, pretty=pretty) log.debug(f"list custom resource response: {api_response}") except ApiException as e: log.error("Exception when calling CustomObjectsApi->list_namespaced_custom_object: %s\n" % e) raise Exception(str(e)) return api_response def get(self, metadata_name): """get a customer resources by name in k8s""" try: api_instance = client.CustomObjectsApi() api_response = api_instance.get_namespaced_custom_object(self.group, self.version, self.namespace, self.plural, name=metadata_name) # log.debug(f"get custom resource response: {api_response}") except ApiException as e: log.error("Exception when calling CustomObjectsApi->get_namespaced_custom_object: %s\n" % e) raise Exception(str(e)) return api_response def delete_all(self): """delete all the customer resources in k8s""" cus_objects = self.list_all() if len(cus_objects["items"]) > 0: for item in cus_objects["items"]: metadata_name = item["metadata"]["name"] self.delete(metadata_name) ================================================ FILE: tests/common/milvus_sys.py ================================================ import ujson import json from pymilvus.grpc_gen import milvus_pb2 as milvus_types from pymilvus import connections sys_info_req = ujson.dumps({"metric_type": "system_info"}) sys_statistics_req = ujson.dumps({"metric_type": "system_statistics"}) sys_logs_req = ujson.dumps({"metric_type": "system_logs"}) class MilvusSys: def __init__(self, alias='default'): self.alias = alias self.handler = connections._fetch_handler(alias=self.alias) if self.handler is None: raise Exception(f"Connection {alias} is disconnected or nonexistent") # TODO: for now it only supports non_orm style API for getMetricsRequest req = milvus_types.GetMetricsRequest(request=sys_info_req) self.sys_info = self.handler._stub.GetMetrics(req, wait_for_ready=True, timeout=None) req = milvus_types.GetMetricsRequest(request=sys_statistics_req) self.sys_statistics = self.handler._stub.GetMetrics(req, wait_for_ready=True, timeout=None) req = milvus_types.GetMetricsRequest(request=sys_logs_req) self.sys_logs = self.handler._stub.GetMetrics(req, wait_for_ready=True, timeout=None) @property def build_version(self): """get the first node's build version as milvus build version""" return self.nodes[0].get('infos').get('system_info').get('system_version') @property def build_time(self): """get the first node's build time as milvus build time""" return self.nodes[0].get('infos').get('system_info').get('build_time') @property def deploy_mode(self): """get the first node's deploy_mode as milvus deploy_mode""" return self.nodes[0].get('infos').get('system_info').get('deploy_mode') @property def simd_type(self): """ get simd type that milvus is running against return the first query node's simd type """ for node in self.query_nodes: return node.get('infos').get('system_configurations').get('simd_type') raise Exception("No query node found") @property def query_nodes(self): """get all query nodes in Milvus deployment""" query_nodes = [] for node in self.nodes: if 'querynode' == node.get('infos').get('type'): query_nodes.append(node) return query_nodes @property def data_nodes(self): """get all data nodes in Milvus deployment""" data_nodes = [] for node in self.nodes: if 'datanode' == node.get('infos').get('type'): data_nodes.append(node) return data_nodes @property def index_nodes(self): """get all index nodes in Milvus deployment""" index_nodes = [] for node in self.nodes: if 'indexnode' == node.get('infos').get('type'): index_nodes.append(node) return index_nodes @property def proxy_nodes(self): """get all proxy nodes in Milvus deployment""" proxy_nodes = [] for node in self.nodes: if 'proxy' == node.get('infos').get('type'): proxy_nodes.append(node) return proxy_nodes @property def nodes(self): """get all the nodes in Milvus deployment""" all_nodes = json.loads(self.sys_info.response).get('nodes_info') online_nodes = [node for node in all_nodes if node["infos"]["has_error"] is False] return online_nodes def get_nodes_by_type(self, node_type=None): """get milvus nodes by node type""" target_nodes = [] if node_type is not None: for node in self.nodes: if str(node_type).lower() == str(node.get('infos').get('type')).lower(): target_nodes.append(node) return target_nodes if __name__ == '__main__': connections.connect(host="10.96.250.111", port="19530") ms = MilvusSys() ================================================ FILE: tests/common/minio_comm.py ================================================ import os from minio import Minio from minio.error import S3Error from utils.util_log import test_log as log def copy_files_to_bucket(client, r_source, target_files, bucket_name, force=False): # check the bucket exist found = client.bucket_exists(bucket_name) if not found: log.error(f"Bucket {bucket_name} not found.") return # copy target files from root source folder os.chdir(r_source) for target_file in target_files: found = False try: result = client.stat_object(bucket_name, target_file) found = True except S3Error as exc: pass if force or not found: res = client.fput_object(bucket_name, target_file, f"{r_source}/{target_file}") log.info(f"copied {res.object_name} to minio") else: log.info(f"skip copy {target_file} to minio") def copy_files_to_minio(host, r_source, files, bucket_name, access_key="minioadmin", secret_key="minioadmin", secure=False, force=False): client = Minio( host, access_key=access_key, secret_key=secret_key, secure=secure, ) try: copy_files_to_bucket(client, r_source=r_source, target_files=files, bucket_name=bucket_name, force=force) except S3Error as exc: log.error("fail to copy files to minio", exc) ================================================ FILE: tests/config/log_config.py ================================================ import os from pathlib import Path class LogConfig: def __init__(self): self.log_debug = "" self.log_err = "" self.log_info = "" self.log_worker = "" self.get_default_config() @staticmethod def get_env_variable(var="CI_LOG_PATH"): """ get log path for testing """ try: log_path = os.environ[var] return str(log_path) except Exception as e: # now = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") log_path = f"/tmp/ci_logs" print("[get_env_variable] failed to get environment variables : %s, use default path : %s" % (str(e), log_path)) return log_path @staticmethod def create_path(log_path): print("[create_path] folder(%s) is not exist." % log_path) print("[create_path] create path now...") folder_path = Path(str(log_path)) folder_path.mkdir(parents=True, exist_ok=True) def get_default_config(self): """ Make sure the path exists """ log_dir = self.get_env_variable() self.log_debug = "%s/ci_test_log.debug" % log_dir self.log_info = "%s/ci_test_log.log" % log_dir self.log_err = "%s/ci_test_log.err" % log_dir work_log = os.environ.get('PYTEST_XDIST_WORKER') if work_log is not None: self.log_worker = f'{log_dir}/{work_log}.log' self.create_path(log_dir) log_config = LogConfig() ================================================ FILE: tests/conftest.py ================================================ import logging import pytest import functools import socket import common.common_type as ct import common.common_func as cf from utils.util_log import test_log as log from common.common_func import param_info from check.param_check import ip_check, number_check from config.log_config import log_config from utils.util_pymilvus import get_milvus, gen_unique_str, gen_default_fields, gen_binary_default_fields from pymilvus.orm.types import CONSISTENCY_STRONG timeout = 60 dimension = 128 delete_timeout = 60 def pytest_addoption(parser): parser.addoption("--host", action="store", default="localhost", help="service's ip") parser.addoption("--service", action="store", default="", help="service address") parser.addoption("--port", action="store", default=19530, help="service's port") parser.addoption("--user", action="store", default="", help="user name for connection") parser.addoption("--password", action="store", default="", help="password for connection") parser.addoption("--db_name", action="store", default="default", help="database name for connection") parser.addoption("--secure", type=bool, action="store", default=False, help="secure for connection") parser.addoption("--milvus_ns", action="store", default="chaos-testing", help="milvus_ns") parser.addoption("--http_port", action="store", default=19121, help="http's port") parser.addoption("--handler", action="store", default="GRPC", help="handler of request") parser.addoption("--tag", action="store", default="all", help="only run tests matching the tag.") parser.addoption('--dry_run', action='store_true', default=False, help="") parser.addoption('--database_name', action='store', default="default", help="name of database") parser.addoption('--partition_name', action='store', default="partition_name", help="name of partition") parser.addoption('--connect_name', action='store', default="connect_name", help="name of connect") parser.addoption('--descriptions', action='store', default="partition_des", help="descriptions of partition") parser.addoption('--collection_name', action='store', default="collection_name", help="name of collection") parser.addoption('--search_vectors', action='store', default="search_vectors", help="vectors of search") parser.addoption('--index_param', action='store', default="index_param", help="index_param of index") parser.addoption('--data', action='store', default="data", help="data of request") parser.addoption('--clean_log', action='store_true', default=False, help="clean log before testing") parser.addoption('--schema', action='store', default="schema", help="schema of test interface") parser.addoption('--err_msg', action='store', default="err_msg", help="error message of test") parser.addoption('--term_expr', action='store', default="term_expr", help="expr of query quest") parser.addoption('--check_content', action='store', default="check_content", help="content of check") parser.addoption('--field_name', action='store', default="field_name", help="field_name of index") parser.addoption('--replica_num', type='int', action='store', default=ct.default_replica_num, help="memory replica number") parser.addoption('--minio_host', action='store', default="localhost", help="minio service's ip") parser.addoption('--uri', action='store', default="", help="uri for high level api") parser.addoption('--token', action='store', default="", help="token for high level api") parser.addoption("--request_duration", action="store", default="10m", help="request_duration") parser.addoption("--enable_milvus_local_api", action="store", default=False, help="use milvus local") @pytest.fixture def host(request): return request.config.getoption("--host") @pytest.fixture def service(request): return request.config.getoption("--service") @pytest.fixture def port(request): return request.config.getoption("--port") @pytest.fixture def user(request): return request.config.getoption("--user") @pytest.fixture def password(request): return request.config.getoption("--password") @pytest.fixture def db_name(request): return request.config.getoption("--db_name") @pytest.fixture def secure(request): return request.config.getoption("--secure") @pytest.fixture def milvus_ns(request): return request.config.getoption("--milvus_ns") @pytest.fixture def http_port(request): return request.config.getoption("--http_port") @pytest.fixture def handler(request): return request.config.getoption("--handler") @pytest.fixture def tag(request): return request.config.getoption("--tag") @pytest.fixture def dry_run(request): return request.config.getoption("--dry_run") @pytest.fixture def connect_name(request): return request.config.getoption("--connect_name") @pytest.fixture def database_name(request): return request.config.getoption("--database_name") @pytest.fixture def partition_name(request): return request.config.getoption("--partition_name") @pytest.fixture def descriptions(request): return request.config.getoption("--descriptions") @pytest.fixture def collection_name(request): return request.config.getoption("--collection_name") @pytest.fixture def search_vectors(request): return request.config.getoption("--search_vectors") @pytest.fixture def index_param(request): return request.config.getoption("--index_param") @pytest.fixture def data(request): return request.config.getoption("--data") @pytest.fixture def clean_log(request): return request.config.getoption("--clean_log") @pytest.fixture def schema(request): return request.config.getoption("--schema") @pytest.fixture def err_msg(request): return request.config.getoption("--err_msg") @pytest.fixture def term_expr(request): return request.config.getoption("--term_expr") @pytest.fixture def check_content(request): log.error("^" * 50) log.error("check_content") return request.config.getoption("--check_content") @pytest.fixture def field_name(request): return request.config.getoption("--field_name") @pytest.fixture def minio_host(request): return request.config.getoption("--minio_host") @pytest.fixture def uri(request): return request.config.getoption("--uri") @pytest.fixture def token(request): return request.config.getoption("--token") @pytest.fixture def request_duration(request): return request.config.getoption("--request_duration") @pytest.fixture def enable_milvus_local_api(request): return request.config.getoption("--enable_milvus_local_api") """ fixture func """ @pytest.fixture(scope="session", autouse=True) def initialize_env(request): """ clean log before testing """ host = request.config.getoption("--host") port = request.config.getoption("--port") handler = request.config.getoption("--handler") user = request.config.getoption("--user") password = request.config.getoption("--password") secure = request.config.getoption("--secure") clean_log = request.config.getoption("--clean_log") replica_num = request.config.getoption("--replica_num") uri = request.config.getoption("--uri") token = request.config.getoption("--token") """ params check """ assert ip_check(host) and number_check(port) """ modify log files """ file_path_list = [log_config.log_debug, log_config.log_info, log_config.log_err] if log_config.log_worker != "": file_path_list.append(log_config.log_worker) cf.modify_file(file_path_list=file_path_list, is_modify=clean_log) log.info("#" * 80) log.info("[initialize_milvus] Log cleaned up, start testing...") param_info.prepare_param_info(host, port, handler, replica_num, user, password, secure, uri, token) @pytest.fixture(params=ct.get_invalid_strs) def get_invalid_string(request): yield request.param @pytest.fixture(params=cf.gen_simple_index()) def get_index_param(request): yield request.param @pytest.fixture(params=ct.get_invalid_strs) def get_invalid_collection_name(request): yield request.param @pytest.fixture(params=ct.get_invalid_strs) def get_invalid_field_name(request): yield request.param @pytest.fixture(params=ct.get_invalid_strs) def get_invalid_index_type(request): yield request.param # TODO: construct invalid index params for all index types @pytest.fixture(params=[{"metric_type": "L3", "index_type": "IVF_FLAT"}, {"metric_type": "L2", "index_type": "IVF_FLAT", "err_params": {"nlist": 10}}, {"metric_type": "L2", "index_type": "IVF_FLAT", "params": {"nlist": -1}}]) def get_invalid_index_params(request): yield request.param @pytest.fixture(params=ct.get_invalid_strs) def get_invalid_partition_name(request): yield request.param @pytest.fixture(params=ct.get_invalid_dict) def get_invalid_vector_dict(request): yield request.param def pytest_configure(config): # register an additional marker config.addinivalue_line( "markers", "tag(name): mark test to run only matching the tag" ) def pytest_runtest_setup(item): tags = list() for marker in item.iter_markers(name="tag"): for tag in marker.args: tags.append(tag) if tags: cmd_tag = item.config.getoption("--tag") if cmd_tag != "all" and cmd_tag not in tags: pytest.skip("test requires tag in {!r}".format(tags)) def pytest_runtestloop(session): if session.config.getoption('--dry_run'): total_num = 0 file_num = 0 tags_num = 0 res = {"total_num": total_num, "tags_num": tags_num} for item in session.items: print(item.nodeid) if item.fspath.basename not in res: res.update({item.fspath.basename: {"total": 1, "tags": 0}}) else: res[item.fspath.basename]["total"] += 1 res["total_num"] += 1 for marker in item.own_markers: if marker.name == "tags" and "0331" in marker.args: res["tags_num"] += 1 res[item.fspath.basename]["tags"] += 1 print(res) return True def check_server_connection(request): host = request.config.getoption("--host") port = request.config.getoption("--port") connected = True if host and (host not in ['localhost', '127.0.0.1']): try: socket.getaddrinfo(host, port, 0, 0, socket.IPPROTO_TCP) except Exception as e: print("Socket connnet failed: %s" % str(e)) connected = False return connected # @pytest.fixture(scope="session", autouse=True) # def change_mutation_result_to_primary_keys(): # def insert_future_decorator(func): # @functools.wraps(func) # def change(*args, **kwargs): # try: # return func(*args, **kwargs).primary_keys # except Exception as e: # raise e # return change # # from pymilvus import MutationFuture # MutationFuture.result = insert_future_decorator(MutationFuture.result) # # def insert_decorator(func): # @functools.wraps(func) # def change(*args, **kwargs): # if kwargs.get("_async", False): # return func(*args, **kwargs) # try: # return func(*args, **kwargs).primary_keys # except Exception as e: # raise e # return change # Milvus.insert = insert_decorator(Milvus.insert) # yield @pytest.fixture(scope="module") def connect(request): host = request.config.getoption("--host") service_name = request.config.getoption("--service") port = request.config.getoption("--port") http_port = request.config.getoption("--http_port") handler = request.config.getoption("--handler") if handler == "HTTP": port = http_port try: milvus = get_milvus(host=host, port=port, handler=handler) # reset_build_index_threshold(milvus) except Exception as e: logging.getLogger().error(str(e)) pytest.exit("Milvus server can not connected, exit pytest ...") def fin(): try: milvus.close() pass except Exception as e: logging.getLogger().info(str(e)) request.addfinalizer(fin) return milvus @pytest.fixture(scope="module") def dis_connect(request): host = request.config.getoption("--host") service_name = request.config.getoption("--service") port = request.config.getoption("--port") http_port = request.config.getoption("--http_port") handler = request.config.getoption("--handler") if handler == "HTTP": port = http_port milvus = get_milvus(host=host, port=port, handler=handler) milvus.close() return milvus @pytest.fixture(scope="module") def args(request): host = request.config.getoption("--host") service_name = request.config.getoption("--service") port = request.config.getoption("--port") http_port = request.config.getoption("--http_port") handler = request.config.getoption("--handler") if handler == "HTTP": port = http_port args = {"ip": host, "port": port, "handler": handler, "service_name": service_name} return args @pytest.fixture(scope="module") def milvus(request): host = request.config.getoption("--host") port = request.config.getoption("--port") http_port = request.config.getoption("--http_port") handler = request.config.getoption("--handler") if handler == "HTTP": port = http_port return get_milvus(host=host, port=port, handler=handler) @pytest.fixture(scope="function") def collection(request, connect): ori_collection_name = getattr(request.module, "collection_id", "test") collection_name = gen_unique_str(ori_collection_name) log.debug(f'collection_name: {collection_name}') try: default_fields = gen_default_fields() connect.create_collection(collection_name, default_fields, consistency_level=CONSISTENCY_STRONG) except Exception as e: pytest.exit(str(e)) def teardown(): if connect.has_collection(collection_name): connect.drop_collection(collection_name, timeout=delete_timeout) request.addfinalizer(teardown) assert connect.has_collection(collection_name) return collection_name # customised id @pytest.fixture(scope="function") def id_collection(request, connect): ori_collection_name = getattr(request.module, "collection_id", "test") collection_name = gen_unique_str(ori_collection_name) log.debug(f'id_collection_name: {collection_name}') try: fields = gen_default_fields(auto_id=False) connect.create_collection(collection_name, fields, consistency_level=CONSISTENCY_STRONG) except Exception as e: pytest.exit(str(e)) def teardown(): if connect.has_collection(collection_name): connect.drop_collection(collection_name, timeout=delete_timeout) request.addfinalizer(teardown) assert connect.has_collection(collection_name) return collection_name @pytest.fixture(scope="function") def binary_collection(request, connect): ori_collection_name = getattr(request.module, "collection_id", "test") collection_name = gen_unique_str(ori_collection_name) try: fields = gen_binary_default_fields() connect.create_collection(collection_name, fields, consistency_level=CONSISTENCY_STRONG) except Exception as e: pytest.exit(str(e)) def teardown(): collection_names = connect.list_collections() if connect.has_collection(collection_name): connect.drop_collection(collection_name, timeout=delete_timeout) request.addfinalizer(teardown) assert connect.has_collection(collection_name) return collection_name # customised id @pytest.fixture(scope="function") def binary_id_collection(request, connect): ori_collection_name = getattr(request.module, "collection_id", "test") collection_name = gen_unique_str(ori_collection_name) try: fields = gen_binary_default_fields(auto_id=False) connect.create_collection(collection_name, fields, consistency_level=CONSISTENCY_STRONG) except Exception as e: pytest.exit(str(e)) def teardown(): if connect.has_collection(collection_name): connect.drop_collection(collection_name, timeout=delete_timeout) request.addfinalizer(teardown) assert connect.has_collection(collection_name) return collection_name # for test exit in the future # @pytest.hookimpl(hookwrapper=True, tryfirst=True) # def pytest_runtest_makereport(): # result = yield # report = result.get_result() # if report.outcome == "failed": # msg = "The execution of the test case fails and the test exits..." # log.error(msg) # pytest.exit(msg) ================================================ FILE: tests/customize/README.md ================================================ Verify user is able to easily customize Milvus deployment with various configuration items. To be updated... ================================================ FILE: tests/customize/milvus_operator.py ================================================ import json import os import time from benedict import benedict from utils.util_log import test_log as log from common.cus_resource_opts import CustomResourceOperations as CusResource template_yaml = os.path.join(os.path.dirname(__file__), 'template/default.yaml') MILVUS_GRP = 'milvus.io' # MILVUS_VER = 'v1alpha1' MILVUS_VER = 'v1beta1' # MILVUS_PLURAL = 'milvusclusters' MILVUS_PLURAL = 'milvuses' # MILVUS_KIND = 'MilvusCluster' MILVUS_KIND = 'Milvus' class MilvusOperator(object): def __init__(self): self.group = MILVUS_GRP self.version = MILVUS_VER self.plural = MILVUS_PLURAL.lower() @staticmethod def _update_configs(configs, template=None): """ Method: update the template with customized configs Params: configs: a dict type of configurations that describe the properties of milvus to be deployed template: Optional. Pass the template file location if there is a template to apply Return: a dict type customized configs """ if not isinstance(configs, dict): log.error("customize configurations must be in dict type") return None if template is None: # d_configs = benedict() log.debug(f'template yaml {template_yaml}') d_configs = benedict.from_yaml(template_yaml) d_configs['apiVersion'] = f'{MILVUS_GRP}/{MILVUS_VER}' d_configs['kind'] = MILVUS_KIND else: d_configs = benedict.from_yaml(template) for key in configs.keys(): d_configs[key] = configs[key] # return a python dict if it is not none return d_configs._dict if d_configs._dict is not None else d_configs def install(self, configs, template=None): """ Method: apply a custom resource object to install milvus Params: configs: a dict type of configurations that describe the properties of milvus to be deployed template: Optional. Pass the template file location if there is a template to apply Return: custom resource object instance """ new_configs = self._update_configs(configs, template) log.debug(new_configs) namespace = new_configs['metadata'].get('namespace', 'default') # apply custom resource object to deploy milvus cus_res = CusResource(kind=self.plural, group=self.group, version=self.version, namespace=namespace) log.info(f'install milvus with configs: {json.dumps(new_configs, indent=4)}') return cus_res.create(new_configs) def uninstall(self, release_name, namespace='default', delete_depends=True, delete_pvc=True): """ Method: delete custom resource object to uninstall milvus Params: release_name: release name of milvus namespace: namespace that the milvus is running in delete_depends: whether to delete the dependent etcd, pulsar and minio services. default: True delete_pvc: whether to delete the data persistent pvc volumes. default: True """ cus_res = CusResource(kind=self.plural, group=self.group, version=self.version, namespace=namespace) del_configs = {} if delete_depends: del_configs = {'spec.dependencies.etcd.inCluster.deletionPolicy': 'Delete', 'spec.dependencies.pulsar.inCluster.deletionPolicy': 'Delete', 'spec.dependencies.storage.inCluster.deletionPolicy': 'Delete' } if delete_pvc: del_configs.update({'spec.dependencies.etcd.inCluster.pvcDeletion': True, 'spec.dependencies.pulsar.inCluster.pvcDeletion': True, 'spec.dependencies.storage.inCluster.pvcDeletion': True }) if delete_depends or delete_pvc: self.upgrade(release_name, del_configs, namespace=namespace) cus_res.delete(release_name) def upgrade(self, release_name, configs, namespace='default'): """ Method: patch custom resource object to upgrade milvus Params: release_name: release name of milvus configs: a dict type like configurations to be upgrade milvus namespace: namespace that the milvus is running in """ if not isinstance(configs, dict): log.error("customize configurations must be in dict type") return None d_configs = benedict() for key in configs.keys(): d_configs[key] = configs[key] cus_res = CusResource(kind=self.plural, group=self.group, version=self.version, namespace=namespace) log.debug(f"upgrade milvus with configs: {d_configs}") cus_res.patch(release_name, d_configs) def wait_for_healthy(self, release_name, namespace='default', timeout=600): """ Method: wait a milvus instance until healthy or timeout Params: release_name: release name of milvus namespace: namespace that the milvus is running in timeout: default: 600 seconds """ cus_res = CusResource(kind=self.plural, group=self.group, version=self.version, namespace=namespace) starttime = time.time() log.info(f"start to check healthy: {starttime}") while time.time() < starttime + timeout: time.sleep(10) res_object = cus_res.get(release_name) mic_status = res_object.get('status', None) if mic_status is not None: if 'Healthy' == mic_status.get('status'): log.info(f"milvus healthy in {time.time() - starttime} seconds") return True else: log.info(f"milvus status is: {mic_status.get('status')}") log.info(f"end to check healthy until timeout {timeout}") return False def endpoint(self, release_name, namespace='default'): """ Method: get Milvus endpoint by name and namespace Return: a string type endpoint. e.g: host:port """ endpoint = None cus_res = CusResource(kind=self.plural, group=self.group, version=self.version, namespace=namespace) res_object = cus_res.get(release_name) if res_object.get('status', None) is not None: endpoint = res_object['status']['endpoint'] return endpoint ================================================ FILE: tests/customize/template/default.yaml ================================================ apiVersion: milvus.io/v1beta1 kind: Milvus metadata: name: my-release namespace: chaos-testing labels: app: milvus spec: config: log: level: debug common: simdType: avx components: {} dependencies: etcd: inCluster: deletionPolicy: Delete pvcDeletion: true values: metrics: podMonitor: enabled: true storage: inCluster: deletionPolicy: Delete pvcDeletion: true values: metrics: podMonitor: enabled: true ================================================ FILE: tests/customize/template/minimum.yaml ================================================ apiVersion: milvus.io/v1alpha1 kind: MilvusCluster metadata: name: my-release labels: app: milvus spec: components: image: milvusdb/milvus:master-latest config: knowhere: simdType: avx2 dependencies: etcd: inCluster: deletionPolicy: Delete pvcDeletion: true values: replicaCount: 1 pulsar: inCluster: deletionPolicy: Delete pvcDeletion: true values: components: autorecovery: false zookeeper: replicaCount: 1 bookkeeper: replicaCount: 1 broker: replicaCount: 1 configData: ## Enable `autoSkipNonRecoverableData` since bookkeeper is running ## without persistence autoSkipNonRecoverableData: "true" managedLedgerDefaultEnsembleSize: "1" managedLedgerDefaultWriteQuorum: "1" managedLedgerDefaultAckQuorum: "1" proxy: replicaCount: 1 storage: inCluster: deletionPolicy: Delete pvcDeletion: true values: mode: standalone ================================================ FILE: tests/customize/test_customize_segment_size.py ================================================ import pytest import time from pymilvus import connections from utils.util_log import test_log as log from base.collection_wrapper import ApiCollectionWrapper from base.utility_wrapper import ApiUtilityWrapper from common import common_func as cf from common import common_type as ct from milvus_operator import MilvusOperator from common.milvus_sys import MilvusSys from common.common_type import CaseLabel namespace = 'chaos-testing' def _install_milvus(seg_size): release_name = f"mil-segsize-{seg_size}-" + cf.gen_digits_by_length(6) cus_configs = {'spec.components.image': 'milvusdb/milvus:master-latest', 'metadata.namespace': namespace, 'metadata.name': release_name, 'spec.components.proxy.serviceType': 'LoadBalancer', 'spec.config.dataCoord.segment.maxSize': seg_size } milvus_op = MilvusOperator() log.info(f"install milvus with configs: {cus_configs}") milvus_op.install(cus_configs) healthy = milvus_op.wait_for_healthy(release_name, namespace, timeout=1200) log.info(f"milvus healthy: {healthy}") if healthy: endpoint = milvus_op.endpoint(release_name, namespace).split(':') log.info(f"milvus endpoint: {endpoint}") host = endpoint[0] port = endpoint[1] return release_name, host, port else: return release_name, None, None class TestCustomizeSegmentSize: def teardown_method(self): pass milvus_op = MilvusOperator() milvus_op.uninstall(self.release_name, namespace) connections.disconnect("default") connections.remove_connection("default") @pytest.mark.tags(CaseLabel.L3) @pytest.mark.parametrize('seg_size, seg_count', [(128, 10), (1024, 2)]) def test_customize_segment_size(self, seg_size, seg_count): """ steps """ log.info(f"start to install milvus with segment size {seg_size}") release_name, host, port = _install_milvus(seg_size) self.release_name = release_name assert host is not None conn = connections.connect("default", host=host, port=port) assert conn is not None mil = MilvusSys(alias="default") log.info(f"milvus build version: {mil.build_version}") log.info(f"start to e2e verification: {seg_size}") # create name = cf.gen_unique_str("segsiz") t0 = time.time() collection_w = ApiCollectionWrapper() collection_w.init_collection(name=name, schema=cf.gen_default_collection_schema(), timeout=40) tt = time.time() - t0 assert collection_w.name == name entities = collection_w.num_entities log.info(f"assert create collection: {tt}, init_entities: {entities}") # insert nb = 50000 data = cf.gen_default_list_data(nb=nb) t0 = time.time() _, res = collection_w.insert(data) tt = time.time() - t0 log.info(f"assert insert: {tt}") assert res # insert 2 million entities rounds = 40 for _ in range(rounds-1): _, res = collection_w.insert(data) entities = collection_w.num_entities assert entities == nb * rounds # load collection_w.load() utility_wrap = ApiUtilityWrapper() segs, _ = utility_wrap.get_query_segment_info(collection_w.name) log.info(f"assert segments: {len(segs)}") assert len(segs) == seg_count # search search_vectors = cf.gen_vectors(1, ct.default_dim) search_params = {"metric_type": "L2", "params": {"nprobe": 16}} t0 = time.time() res_1, _ = collection_w.search(data=search_vectors, anns_field=ct.default_float_vec_field_name, param=search_params, limit=1, timeout=30) tt = time.time() - t0 log.info(f"assert search: {tt}") assert len(res_1) == 1 collection_w.release() # index d = cf.gen_default_list_data() collection_w.insert(d) log.info(f"assert index entities: {collection_w.num_entities}") _index_params = {"index_type": "IVF_SQ8", "params": {"nlist": 64}, "metric_type": "L2"} t0 = time.time() index, _ = collection_w.create_index(field_name=ct.default_float_vec_field_name, index_params=_index_params, name=cf.gen_unique_str(), timeout=120) tt = time.time() - t0 log.info(f"assert index: {tt}") assert len(collection_w.indexes) == 1 # search t0 = time.time() collection_w.load() tt = time.time() - t0 log.info(f"assert load: {tt}") search_vectors = cf.gen_vectors(1, ct.default_dim) t0 = time.time() res_1, _ = collection_w.search(data=search_vectors, anns_field=ct.default_float_vec_field_name, param=search_params, limit=1, timeout=30) tt = time.time() - t0 log.info(f"assert search: {tt}") # query term_expr = f'{ct.default_int64_field_name} in [1001,1201,4999,2999]' t0 = time.time() res, _ = collection_w.query(term_expr, timeout=30) tt = time.time() - t0 log.info(f"assert query result {len(res)}: {tt}") ================================================ FILE: tests/customize/test_simd_compat.py ================================================ import pytest import time from pymilvus import connections from utils.util_log import test_log as log from base.collection_wrapper import ApiCollectionWrapper from common import common_func as cf from common import common_type as ct from milvus_operator import MilvusOperator from common.milvus_sys import MilvusSys from common.common_type import CaseLabel # sorted by the priority order of the simd # | configuration | possible returned SIMD | # |--------|----------| # | auto | avx512 / avx2 / sse4_2| # | avx512 | avx512 / avx2 / sse4_2| # | avx2 | avx2 / sse4_2| # | avx | sse4_2| # | sse4_2 | sse4_2| supported_simd_types = ["avx512", "avx2", "avx", "sse4_2"] namespace = 'chaos-testing' def _install_milvus(simd): release_name = f"mil-{simd.replace('_','-')}-" + cf.gen_digits_by_length(6) cus_configs = {'spec.components.image': 'harbor.milvus.io/milvus/milvus:master-latest', 'metadata.namespace': namespace, 'metadata.name': release_name, 'spec.config.common.simdType': simd } milvus_op = MilvusOperator() log.info(f"install milvus with configs: {cus_configs}") milvus_op.install(cus_configs) healthy = milvus_op.wait_for_healthy(release_name, namespace, timeout=1200) log.info(f"milvus healthy: {healthy}") if healthy: endpoint = milvus_op.endpoint(release_name, namespace).split(':') log.info(f"milvus endpoint: {endpoint}") host = endpoint[0] port = endpoint[1] return release_name, host, port else: return release_name, None, None class TestSimdCompatibility: def teardown_method(self): milvus_op = MilvusOperator() milvus_op.uninstall(self.release_name, namespace) @pytest.mark.tags(CaseLabel.L3) @pytest.mark.parametrize('simd', supported_simd_types) def test_simd_compat_e2e(self, simd): """ steps 1. [test_milvus_install]: set up milvus with customized simd configured 2. [test_simd_compat_e2e]: verify milvus is working well 4. [test_milvus_cleanup]: delete milvus instances in teardown """ log.info(f"start to install milvus with simd {simd}") release_name, host, port = _install_milvus(simd) time.sleep(10) self.release_name = release_name assert host is not None conn = connections.connect("default", host=host, port=port) assert conn is not None mil = MilvusSys(alias="default") log.info(f"milvus build version: {mil.build_version}") log.info(f"milvus simdType: {mil.simd_type}") assert str(mil.simd_type).lower() == simd.lower() log.info(f"start to e2e verification: {simd}") # create prefix = "simd_" name = cf.gen_unique_str(prefix) t0 = time.time() collection_w = ApiCollectionWrapper() collection_w.init_collection_wrap(name=name) tt = time.time() - t0 assert collection_w.name == name entities = collection_w.num_entities log.info(f"assert create collection: {tt}, init_entities: {entities}") # insert for _ in range(10): data = cf.gen_default_list_data(nb=300) t0 = time.time() _, res = collection_w.insert(data) tt = time.time() - t0 log.info(f"assert insert: {tt}") assert res # flush t0 = time.time() _, check_result = collection_w.flush(timeout=180) assert check_result assert collection_w.num_entities == len(data[0]) + entities tt = time.time() - t0 entities = collection_w.num_entities log.info(f"assert flush: {tt}, entities: {entities}") # index index_params = {"index_type": "IVF_SQ8", "params": {"nlist": 64}, "metric_type": "L2"} t0 = time.time() index, _ = collection_w.create_index(field_name=ct.default_float_vec_field_name, index_params=index_params, index_name=cf.gen_unique_str()) index, _ = collection_w.create_index(field_name=ct.default_string_field_name, index_params={}, index_name=cf.gen_unique_str()) tt = time.time() - t0 log.info(f"assert index: {tt}") assert len(collection_w.indexes) == 2 # load collection_w.load() # search search_vectors = cf.gen_vectors(1, ct.default_dim) search_params = {"metric_type": "L2", "params": {"nprobe": 16}} t0 = time.time() res_1, _ = collection_w.search(data=search_vectors, anns_field=ct.default_float_vec_field_name, param=search_params, limit=1) tt = time.time() - t0 log.info(f"assert search: {tt}") assert len(res_1) == 1 # release collection_w.release() # insert d = cf.gen_default_list_data() collection_w.insert(d) # search t0 = time.time() collection_w.load() tt = time.time() - t0 log.info(f"assert load: {tt}") nq = 5 topk = 5 search_vectors = cf.gen_vectors(nq, ct.default_dim) t0 = time.time() res, _ = collection_w.search(data=search_vectors, anns_field=ct.default_float_vec_field_name, param=search_params, limit=topk) tt = time.time() - t0 log.info(f"assert search: {tt}") assert len(res) == nq assert len(res[0]) <= topk # query term_expr = f'{ct.default_int64_field_name} in [1, 2, 3, 4]' t0 = time.time() res, _ = collection_w.query(term_expr) tt = time.time() - t0 log.info(f"assert query result {len(res)}: {tt}") assert len(res) >= 4 ================================================ FILE: tests/data/train_embeddings.csv ================================================ path,label,vector ./train/brain_coral/n01917289_1783.JPEG,brain_coral,"[0.001221718150191009, 0.019385283812880516, 0.0012966834474354982, -0.05869423225522041, -0.07314745336771011, 0.009818739257752895, -0.012571299448609352, 0.01936987228691578, 0.013926480896770954, 0.012706195004284382, -0.052923139184713364, 0.009748490527272224, -0.06815765053033829, -0.04255993291735649, 0.018230020999908447, -0.037875499576330185, 0.024184122681617737, 0.059950366616249084, 0.017211226746439934, 0.03073771297931671, -0.020521296188235283, -0.024839947000145912, -0.00846018549054861, -0.057747043669223785, 0.02150764875113964, 0.03388987481594086, 0.007583513390272856, 0.008437358774244785, 0.01229020208120346, 0.009813790209591389, -0.02302813157439232, -0.012931917794048786, 0.022550180554389954, 0.026420213282108307, -0.01120482012629509, 0.014809561893343925, -0.010993415489792824, 0.010669862851500511, 0.020848875865340233, 0.028226274996995926, 0.02036280743777752, -0.0035496894270181656, -0.009294223971664906, 0.0029178974218666553, -0.004718594718724489, -0.09612877666950226, -0.009631907567381859, 0.049230773001909256, 0.012917592190206051, 0.05222393944859505, -0.04392702132463455, -0.0036753222811967134, 0.021286237984895706, -0.0059196799993515015, -0.05065504461526871, 0.004512702580541372, -0.03858316317200661, -0.04840949922800064, 0.014436020515859127, -0.030610544607043266, 0.07143566012382507, 0.03150143846869469, 0.0014469764428213239, -0.04632197320461273, -0.024495359510183334, 0.03744146227836609, 0.021294962614774704, 0.0333864800632, 0.019304761663079262, 0.002186872996389866, 0.0068594468757510185, 0.009355125948786736, -0.014642133377492428, -0.054781410843133926, -0.00626756576821208, -0.01919372007250786, -0.01720968261361122, 0.0007040352211333811, 0.05765358358621597, -0.07006881386041641, 0.024907104671001434, -0.00892073567956686, -0.027642177417874336, -0.06236721947789192, 0.0043600862845778465, 0.017025552690029144, 0.09016869217157364, 0.008515060879290104, 0.04664630815386772, 0.011623155325651169, 0.0032848224509507418, -0.06795591115951538, -0.6259476542472839, -0.007728567346930504, -0.025071177631616592, 0.00011937286762986332, 0.039217978715896606, -0.031032774597406387, -0.06342501193284988, -0.029736774042248726, -0.01001911610364914, 0.03174501284956932, -0.046531084924936295, 0.03392285481095314, 0.039682645350694656, -0.05001003295183182, -0.12021227180957794, 0.014744549058377743, -0.012904336676001549, 0.008932258933782578, 0.005187372211366892, -0.019940296187996864, -0.0028669172897934914, -0.003918901085853577, -0.03165661543607712, -0.02342270128428936, 0.06060972809791565, 0.03113136813044548, 0.009707986377179623, 0.043800871819257736, 0.035453423857688904, -0.02417859435081482, -0.03860082849860191, -0.0010492188157513738, -0.04815253987908363, 0.040451399981975555, 0.0051850383169949055, -0.00031929914257489145, 0.061612293124198914, 0.033727020025253296, 0.06716141104698181, -0.018795758485794067, -0.03186720237135887, 0.08439403772354126, 0.028561435639858246, 0.03500004857778549, 0.018373921513557434, -0.07822065055370331, -0.00968142133206129, -0.009037631563842297, -0.0006754738278687, -0.0006758966483175755, -0.043954119086265564, 0.051497932523489, -0.013305061496794224, -0.03768585994839668, -0.041958119720220566, -0.012403735890984535, -0.006560985930263996, 0.002182713942602277, -0.019771432504057884, -0.027173619717359543, 0.013592621311545372, 0.019726527854800224, -0.014863594435155392, 0.011970067396759987, 0.05852051451802254, -0.0070762294344604015, -0.020926719531416893, 0.02160836197435856, -0.0239261444658041, -0.017207840457558632, -0.017299210652709007, -0.0008296205196529627, -0.008649470284581184, -0.02409556321799755, -0.039505958557128906, 0.04034298658370972, 0.014762120321393013, -0.014202671125531197, -0.007209654897451401, 0.04877933859825134, 0.0058827148750424385, 0.008805567398667336, 0.029077809303998947, 0.04879843816161156, -0.15259991586208344, -0.006606928072869778, -0.044722236692905426, 0.01155830081552267, 0.025887807831168175, -0.021578649058938026, -0.02978898212313652, 0.0005227273795753717, 0.0316801443696022, -0.005391034297645092, -0.019648844376206398, -0.025077860802412033, 0.02826586551964283, 0.025150548666715622, -0.010993001982569695, -0.03380497172474861, 0.03955618292093277, -0.0138495909050107, 0.06079041212797165, -0.02818967029452324, 0.009694435633718967, 0.002082411665469408, 0.056310027837753296, -0.033551208674907684, -0.008376296609640121, -0.03443599492311478, 0.002174908062443137, 0.05802189186215401, 0.025996537879109383, 0.00869351252913475, 0.05604097992181778, -0.03300655633211136, 0.028668126091361046, -0.005312946625053883, -0.004241508897393942, 0.0665111243724823, -0.0404139868915081, -0.027791008353233337, 0.047970328480005264, 0.041513893753290176, 0.027446750551462173, -0.01832973212003708, -0.02976425737142563, -0.023539137095212936, 0.07758922129869461, 0.006750558968633413, 0.0003101127513218671, -0.019799431785941124, 0.04228958860039711, -0.031824756413698196, 0.03140674903988838, -0.02710939757525921, -0.033283259719610214, 0.03930933028459549, -0.016562877222895622, -0.0064820898696780205, 0.00426897406578064, -0.0695774108171463, -0.04427722096443176, -0.032380156219005585, 0.01827336847782135, -0.02894454449415207, 0.005540952552109957, 0.003995177336037159, -0.02588990144431591, 0.02499106153845787, 0.04812454804778099, 0.013987633399665356, 0.047479841858148575, -0.00930949579924345, -0.002293654251843691, 0.008119403384625912, -0.004450938198715448, -0.014123366214334965, 0.004239714238792658, 0.008748475462198257, 0.012639671564102173, 0.04891880974173546, -0.04597224295139313, -0.008786633610725403, -0.0025974821764975786, -0.013477222993969917, -0.0004558212822303176, -0.0024495646357536316, 0.017340440303087234, -0.006223208270967007, -0.00542718730866909, -0.033118780702352524, 0.01291426457464695, 0.03207503259181976, 0.04568491131067276, 0.01345248706638813, -0.0409737303853035, -0.030906356871128082, 0.00465419003739953, -0.004034377634525299, -0.014891531318426132, -0.020851364359259605, -0.010582742281258106, -0.016865426674485207, -0.06460393965244293, 0.016306644305586815, -0.0253023449331522, 0.010285922326147556, 0.010201609693467617, 0.023495299741625786, 0.02520771510899067, 0.012172509916126728, 0.030864292755723, -0.0014350998681038618, 0.008326390758156776, -0.04995478689670563, 0.0008675490389578044, -0.01759454607963562, -0.027484361082315445, -0.0028969082050025463, 0.04590573161840439, 0.0497613288462162, -0.002413267269730568, 0.023223204538226128, 0.010706713423132896, -0.007484216243028641, 0.0054794964380562305, 0.02646036632359028, -0.04441550746560097, -0.021489158272743225, -0.027319932356476784, 0.05399017035961151, 0.018553080037236214, 0.05461462587118149, -0.04428033158183098, 0.045155465602874756, 0.04466323181986809, -0.018545938655734062, -0.007688949815928936, 0.011336770839989185, 0.08427230268716812, 0.023578306660056114, 0.030584005638957024, 0.006102858576923609, -0.016971135511994362, 0.033741313964128494, -0.02787940204143524, -0.05533058941364288, 0.003088860074058175, 0.3039807379245758, -0.003395779523998499, -0.01063270028680563, 0.005414784420281649, -0.0011391661828383803, -0.025765664875507355, 0.003914338536560535, -0.007290754932910204, -0.011946084909141064, -0.03791847079992294, -0.011175365187227726, 0.02184748649597168, -0.07230505347251892, -0.04358438402414322, -0.02792268432676792, -0.053413379937410355, -0.008991723880171776, -0.029400693252682686, 0.02880329079926014, 0.02150757797062397, -0.011530823074281216, -0.004593593999743462, -0.0007110543665476143, 0.02570359781384468, -0.014085776172578335, -0.008367540314793587, -0.014532211236655712, 0.006445315200835466, 0.02315516024827957, -0.020979339256882668, 0.02595711126923561, 0.01831023581326008, 0.03225408494472504, -0.04528190940618515, -0.03713070601224899, 0.026804868131875992, -0.031775765120983124, 0.00837370753288269, -0.006575821433216333, 0.0036296278703957796, -0.013106582686305046, 0.010968723334372044, -0.005508617497980595, 0.001803478691726923, -0.018464792519807816, -0.00031942359055392444, -0.10293339937925339, 0.011012648232281208, 0.008059212937951088, -0.01774260215461254, -0.007777142804116011, 0.012344634160399437, 0.0007159134838730097, 0.05562476068735123, 0.024525852873921394, 0.04337157681584358, -0.01108828466385603, -0.020193802192807198, -0.010093411430716515, 0.009932332672178745, -0.02831672690808773, -0.01681121252477169, -0.029746320098638535, -0.02308264560997486, -0.002508130855858326, 0.0021620572078973055, 0.0019277663668617606, -0.049627434462308884, -0.07957715541124344, 0.0029747653752565384, -0.02422175370156765, 0.010684613138437271, 0.026240745559334755, -0.022674966603517532, -0.02035714127123356, 0.03441911190748215, 0.05665254965424538, -0.05284406244754791, -0.051573120057582855, -0.0015692983288317919, -0.02510220557451248, 0.015741022303700447, 0.005480002146214247, -0.0006552161648869514, -0.05601179972290993, -0.02185860648751259, 0.03188024461269379, -0.025694245472550392, -0.035124678164720535, 0.10171634703874588, 0.001869317959062755, 0.011409019120037556, -0.0023135256487876177, -0.019047560170292854, -0.021358031779527664, 0.00725221261382103, 0.0015804298454895616, -0.01375295128673315, 0.014687266200780869, -0.0071539985947310925, 0.014539686031639576, 0.033473603427410126, -0.09310445189476013, 0.03505554795265198, 0.004325835965573788, 0.0003844561579171568, 0.01416606456041336, -0.015537984669208527, -0.03878694772720337, -0.009785465896129608, 0.015604461543262005, 0.025009306147694588, -0.015820268541574478, 0.00027974971453659236, -0.013252857141196728, 0.008904673159122467, 0.003266391344368458, 0.023797621950507164, 0.00570606580004096, 0.013980093412101269, -0.06584031134843826, -0.026356449350714684, -0.047652363777160645, -0.004817895125597715, -0.011806580238044262, 0.003813729854300618, -0.0402517132461071, 0.033773474395275116, 0.008595536462962627, 0.026618387550115585, -0.03511270508170128, 0.013947744853794575, -0.02425958216190338, 0.04903092235326767, -0.00011286354856565595, 0.009353292174637318, 0.04392123967409134, 0.01428733766078949, -0.005682367831468582, -0.013255510479211807, 0.05889745056629181, -0.024579312652349472, -0.030495306476950645, 0.0333281084895134, -0.022689608857035637, 0.0074622672982513905, -0.004539880435913801, -0.004759244155138731, -0.05106324329972267, 0.008984125219285488, -0.04986017942428589, 0.011842883192002773, -0.06618290394544601, -0.025831589475274086, 0.027168264612555504, -0.018176747485995293, 0.009196448139846325, -0.019454728811979294, -0.0036425322759896517, 0.011614187620580196, -0.02067616768181324, -0.013262901455163956, -0.022966844961047173, -0.008114003576338291, 0.008427989669144154, -0.009798438288271427, 0.01706165261566639, 0.01622101105749607, 0.02603824995458126, -0.0376153290271759, -0.003192473202943802, 0.017432857304811478, -0.03504026308655739, -0.016897136345505714, -0.0028924262151122093, 0.016650879755616188, 0.01776239648461342, -0.01094372570514679, 0.036773283034563065, 0.014697672799229622, -0.00983431376516819, -0.00021365514839999378, 0.02606816031038761, 0.03596058115363121, -0.031501129269599915, 0.0002436949871480465, 0.016978342086076736, -0.03333284705877304, 0.0001591629843460396, 0.0015672218287363648, 0.012397180311381817]" ./train/brain_coral/n01917289_4317.JPEG,brain_coral,"[-0.0035346506629139185, 0.05662623047828674, -0.006546225864440203, 0.018148371949791908, -0.02343796007335186, 0.03359470143914223, -0.010615892708301544, -0.019308285787701607, 0.029026925563812256, 0.012703489512205124, -0.024220015853643417, 0.014141703955829144, -0.03520560264587402, -0.006465750280767679, -0.024893825873732567, -0.03040763922035694, 0.06816482543945312, 0.02185847982764244, -0.007838425226509571, 0.0006191319553181529, -0.06328409165143967, -0.012101993896067142, -0.01729797199368477, -0.07177019864320755, 0.035082053393125534, 0.07275072485208511, 0.03840383514761925, -0.013599958270788193, 0.022904332727193832, -0.0174654982984066, 0.0005695597501471639, -0.0029985385481268167, 0.025365682318806648, 0.004728809930384159, 0.03755638375878334, -0.008654817938804626, -0.007565413136035204, 0.014116642996668816, -0.005352620966732502, 0.08305922895669937, -0.045063212513923645, -0.02395275980234146, -0.0030176101718097925, 0.020628750324249268, 0.05485522747039795, -0.15082788467407227, 0.021712306886911392, 0.03947906568646431, 0.03716788813471794, 0.032059963792562485, 0.004549226723611355, 0.027067380025982857, 0.029321644455194473, -0.019146505743265152, -0.04771728813648224, -0.00999420415610075, 0.012951602227985859, -0.060554079711437225, 0.01820671372115612, -0.002367178676649928, 0.04899837449193001, -0.018231861293315887, 0.00985976867377758, -0.012163713574409485, -0.049652110785245895, 0.02671213261783123, -0.013333864510059357, 0.014994795434176922, -0.02897394262254238, -0.027375932782888412, -0.009200889617204666, 0.012565316632390022, -0.041034430265426636, -0.015007981099188328, 0.0252289567142725, -0.05104199796915054, -0.004728095140308142, 0.005118922796100378, 0.002101179677993059, -0.02697649970650673, -0.0057145883329212666, 0.0007005869410932064, 0.022599637508392334, -0.07764431834220886, 0.016284974291920662, 0.045175254344940186, 0.11135180294513702, -0.027547962963581085, 0.0017774682492017746, 0.013852040283381939, 0.007007112260907888, -0.018953416496515274, -0.6018176078796387, 0.03397924825549126, 0.007545778062194586, 0.01881307177245617, -0.0067797270603477955, -0.025720203295350075, -0.11550389975309372, -0.02984602563083172, -0.04009420797228813, 0.010347317904233932, -0.013363104313611984, 0.017257973551750183, -0.010943346656858921, -0.0068943677470088005, -0.13841816782951355, -0.018115561455488205, -0.051630087196826935, 0.03511476889252663, 0.025243977084755898, -0.051111530512571335, 0.006692747585475445, 0.009289529174566269, -0.006142623722553253, 0.00943254679441452, 0.1108407974243164, 0.050990279763936996, 0.024779682978987694, 0.034255728125572205, -0.002413279376924038, -0.01730242930352688, -0.0188672486692667, 0.006881274748593569, -0.02722799777984619, -0.0026960186660289764, -0.04409237951040268, -0.021037908270955086, 0.020027389749884605, -0.001512201619334519, 0.040768176317214966, 0.009897264651954174, -0.03522362932562828, 0.07762308418750763, 0.015474103391170502, 0.05864917114377022, 0.02129516191780567, -0.08628851920366287, -0.019719962030649185, 0.008573314175009727, -0.0037077206652611494, 0.028401538729667664, -0.07833240926265717, 0.07100043445825577, 0.008359044790267944, -0.011631587520241737, -0.012857002206146717, 0.01328237447887659, -0.03348309174180031, -0.018765104934573174, -0.01651536300778389, -0.01260745245963335, 0.04853980615735054, 0.00742303766310215, -0.007245857734233141, 0.003189630573615432, 0.012495351955294609, 0.0307345949113369, -0.026669222861528397, -0.013740173541009426, -0.06703022867441177, -0.03652043640613556, 0.001635305117815733, -0.006468937266618013, -0.05171310529112816, -0.0013190535828471184, -0.06918428838253021, 0.0662977397441864, -0.0024899898562580347, 0.006748323328793049, 0.020511075854301453, 0.016545815393328667, -0.022000549361109734, -0.03411495313048363, -0.006807886529713869, -0.0033615357242524624, -0.008284587413072586, 0.006578691769391298, -0.010544474236667156, -0.027730261906981468, -0.015550400130450726, -0.007572605740278959, -0.03631191328167915, 0.0006284655537456274, 0.016359908506274223, 0.01686336100101471, 0.016850393265485764, -0.009148934856057167, 0.003145830938592553, 0.023247050121426582, 0.0007291871006600559, 0.00998793076723814, 0.016345907002687454, -0.0009847626788541675, 0.03722359240055084, -0.025116270408034325, 0.0031950282864272594, -0.04425588995218277, 0.026922062039375305, -0.030216896906495094, 0.004084683954715729, 0.005412565544247627, -0.02523030899465084, 0.03200026601552963, -0.012179155834019184, -0.015155969187617302, 0.015889964997768402, -0.0630267783999443, 0.017201844602823257, -0.016987601295113564, -0.032432880252599716, 0.06991249322891235, -0.059704702347517014, -0.030150197446346283, 0.01093253307044506, 0.005847826134413481, 0.036060117185115814, 0.01714879460632801, 0.058922845870256424, 0.012033389881253242, 0.05951855704188347, 0.01814277656376362, -0.011763869784772396, -0.0665980875492096, 0.004006145987659693, 0.005934175569564104, -0.001672628684900701, -0.021181616932153702, -0.002746175043284893, 0.024427691474556923, -0.04350672662258148, 0.00777314230799675, 0.021808035671710968, 0.012730845250189304, -0.01309180073440075, 0.029628736898303032, 0.004213433247059584, 0.016964031383395195, 0.015475060790777206, 0.0033002065028995275, -0.04933961480855942, 0.032746706157922745, -0.010037182830274105, -0.02380494214594364, -0.005571553949266672, 0.005194603465497494, 0.003465911140665412, 0.010903059504926205, -0.07320915907621384, 0.021770743653178215, 0.04289271682500839, 0.05149680748581886, 0.029697149991989136, 0.05052043870091438, -0.04040173813700676, 0.007988466881215572, -0.0034778413828462362, 0.004820669535547495, 0.060350269079208374, 0.01790103316307068, 0.014949515461921692, 0.02151348441839218, 0.036654993891716, -0.009902575053274632, -0.003905113087967038, -0.003404183080419898, 0.021204177290201187, -0.001075381995178759, -0.013545380905270576, -0.013370396569371223, 0.019951574504375458, 0.016165342181921005, -0.020365269854664803, 0.0181951392441988, -0.034105364233255386, -0.02855762653052807, -0.013179103843867779, -0.017361003905534744, 0.022782620042562485, 0.00830661691725254, 0.01770482212305069, 0.00891081802546978, 0.022276531904935837, -0.00024927264894358814, 0.028535695746541023, 0.014937818050384521, -0.061516277492046356, -0.06576494127511978, -0.0006669149152003229, -0.004640038125216961, 0.008748194202780724, -0.044126298278570175, 0.004954325035214424, 0.0234039518982172, -3.861808363581076e-05, 0.012791840359568596, -0.027665548026561737, 0.012563085183501244, 0.013536513783037663, 0.05000300332903862, -0.0315568670630455, -0.012933477759361267, -0.016719577834010124, 0.02746349573135376, 0.05546285957098007, 0.02129710651934147, -0.03311627730727196, 0.0119816018268466, 0.05338208004832268, -0.005023131147027016, 0.05031517893075943, -0.002792343031615019, 0.07746055722236633, 0.025575866922736168, -0.00889764167368412, -0.039300285279750824, -0.007629699073731899, 0.051874417811632156, -0.051472920924425125, -0.07472678273916245, 0.038079727441072464, 0.2637408375740051, -0.03454411402344704, -0.07563488185405731, 0.042710255831480026, 0.0055932640098035336, 0.023459844291210175, 0.013203036040067673, -0.021488338708877563, -0.022663669660687447, -0.01688467152416706, -0.0013909833505749702, 0.014828233048319817, -0.008173340000212193, -0.02757025696337223, -0.028315190225839615, -0.012136731296777725, -0.020602496340870857, 0.03816873952746391, 0.04935569316148758, -0.008788990788161755, -0.021309401839971542, -0.021345969289541245, 0.03348550200462341, 0.0005472784396260977, -0.007988746277987957, -0.03779127448797226, -0.011939851567149162, -0.005325864069163799, 0.008328658528625965, -0.012332357466220856, 0.005897667724639177, 0.03132413700222969, -0.025319745764136314, -0.019017772749066353, 0.004862639587372541, 0.018101723864674568, -0.07932012528181076, -0.017369482666254044, -0.01223890483379364, 0.047466449439525604, -0.02903013490140438, 0.00878403801470995, 0.007419889327138662, -0.05099180340766907, -0.003329923376441002, 0.01588583178818226, -0.06426668167114258, -0.03124677948653698, -0.018406923860311508, -0.000667548447381705, -0.03063742071390152, -0.007698176894336939, 0.025855259969830513, 0.08066485077142715, -0.007319597993046045, 0.014409373514354229, -0.019469456747174263, -0.033879946917295456, -0.008407322689890862, -0.033224813640117645, -0.0372307226061821, -0.048728130757808685, -0.01956865005195141, 0.0324256457388401, -0.05041824281215668, -0.01579068787395954, 0.027795596048235893, -0.06995304673910141, -0.07902522385120392, -0.016323495656251907, -0.006068381946533918, 0.02549322508275509, 0.02233492024242878, -0.005861957557499409, -0.05196446552872658, 0.04171157628297806, 0.010494782589375973, -0.029686087742447853, 0.00697956420481205, 0.01929616741836071, 0.00478693563491106, 0.019971659407019615, -0.011411833576858044, 0.03627149388194084, -0.027709651738405228, -0.03284553065896034, -0.027316777035593987, -0.018496448174118996, 0.005455233622342348, 0.04284586012363434, -0.03484726324677467, 0.026607364416122437, 0.003985297866165638, -0.0005465889698825777, 0.012526004575192928, 0.07124942541122437, -0.036317043006420135, -0.0362858772277832, 0.0010768789798021317, 0.0293856430798769, -0.056667812168598175, -0.006813930347561836, -0.04773714393377304, 0.03235090523958206, -0.024110808968544006, 0.05911170691251755, 0.04873655363917351, 0.02908339351415634, -0.00535031221807003, -0.020791195333003998, 0.022339683026075363, 0.06790285557508469, 0.005071578547358513, -0.006280467379838228, -0.010160928592085838, -0.0008954498916864395, 0.03536129370331764, 0.005365451332181692, -0.016348715871572495, 0.006985573098063469, -0.008925951085984707, -0.029928935691714287, -0.06205638498067856, -0.021203532814979553, -0.01571105606853962, 0.009924612939357758, -0.030449192970991135, 0.017424456775188446, 0.02462223917245865, 0.0022559312637895346, 0.008291262201964855, 0.028960207477211952, -0.0796857550740242, 0.018536752089858055, -0.05839689075946808, 0.05648409575223923, 0.02563333883881569, -0.02323971502482891, -0.03564165532588959, -0.009778953157365322, 0.06060228869318962, -0.015349053777754307, -0.005661006551235914, 0.05016116797924042, -0.05273061618208885, -0.03825591877102852, -0.0026195587124675512, 0.04060006141662598, 0.01841512694954872, 0.028893206268548965, -0.005008779000490904, 0.02174580655992031, 0.005083051975816488, 0.018596136942505836, -0.022104982286691666, 0.024230020120739937, 0.04089144989848137, -0.03100738301873207, -0.0019483559299260378, 0.03284509852528572, -0.0016634139465168118, -0.0004970395821146667, 0.00673564150929451, -0.007875566370785236, 0.04084210470318794, -0.005788496229797602, 0.023096753284335136, 0.03745684400200844, 0.04444529488682747, -0.02418791875243187, 0.013106084428727627, -0.0016506874235346913, -0.08404789865016937, 0.0031760744750499725, 0.026327477768063545, 0.0162209440022707, 4.5100397983333096e-05, -0.029763439670205116, 0.01566014438867569, 0.008345335721969604, -0.006100584287196398, 0.012035632506012917, 0.02017470821738243, 0.04867299273610115, -0.037856489419937134, 0.03968527913093567, -0.013988298363983631, -0.03829678148031235, 0.06683263927698135, -0.043642789125442505, -0.01224011741578579]" ./train/brain_coral/n01917289_765.JPEG,brain_coral,"[0.014164197258651257, -0.0024078513961285353, -0.020693127065896988, 0.014125490561127663, -0.05186880752444267, -0.048621244728565216, -0.038626983761787415, 0.005568904336541891, 0.018612565472722054, 0.0025265044532716274, -0.03621451184153557, -0.0032830191776156425, 0.06408753246068954, 0.015709539875388145, 0.03684704750776291, -0.015743382275104523, -0.002703967737033963, 0.05411682277917862, 0.0021316143684089184, -0.013320923782885075, -0.06277459859848022, 0.02442651242017746, 0.007865587249398232, -0.07765968888998032, -0.0020447729621082544, -0.015789175406098366, -0.018699178472161293, -0.02527361549437046, 0.00043353423825465143, 0.014598974026739597, -0.00632471265271306, -0.009535265155136585, -0.026513444259762764, -0.031262170523405075, 0.027239082381129265, 0.0072206417098641396, -0.0048000393435359, -0.02608088217675686, 0.0167438555508852, 0.1383960098028183, 0.044255517423152924, -0.012020106427371502, -0.0026599643751978874, 0.018102433532476425, 0.021843595430254936, -0.06442821025848389, -0.006894918158650398, 0.006415418349206448, -0.04553873836994171, 0.019438674673438072, 0.002379688434302807, 0.013176405802369118, -0.008774510584771633, -0.016790006309747696, -0.05672341585159302, 0.012280775234103203, -0.02758503518998623, 0.010736276395618916, -0.017929188907146454, -0.02672831527888775, 0.027232849970459938, -0.027759641408920288, 0.01859496906399727, 0.037359584122896194, 0.02710828371345997, -0.017413651570677757, 0.024967005476355553, 0.10749220848083496, 0.04323463886976242, -0.0062866793014109135, 0.008933093398809433, -0.040517475455999374, 0.008768362924456596, -0.030296621844172478, -0.005174541845917702, 0.05552505701780319, 0.008851645514369011, -0.005730961449444294, 0.010433126240968704, -0.03267822787165642, -0.000706608931068331, 0.0038532097823917866, -0.007132350001484156, -0.04251588135957718, 0.05081722140312195, 0.00888276007026434, 0.04370304197072983, -0.020544754341244698, -0.00034311512717977166, 0.02951008826494217, 0.024494223296642303, -0.028902115300297737, -0.6203188896179199, 0.00936109572649002, -0.027312567457556725, 0.02175315096974373, 0.016896149143576622, -0.03341570496559143, -0.008615926839411259, -0.08721306920051575, -0.005025862250477076, 0.013924098573625088, -0.07975930720567703, 0.0038076606579124928, 0.04519256204366684, 0.025679610669612885, -0.2066219300031662, -0.004548500757664442, -0.028402606025338173, 0.004520033951848745, 0.03016483224928379, -0.029008515179157257, 0.021866746246814728, 0.020075442269444466, -0.010660446248948574, -0.057111456990242004, 0.02484986186027527, -0.015213494189083576, -0.004142126068472862, 0.013902736827731133, -0.003557224292308092, 0.013223156332969666, -0.03351901099085808, -0.017904147505760193, -0.03936821594834328, 0.0017140936106443405, 0.030471833422780037, 0.004614141304045916, 0.01509706862270832, -0.036043062806129456, 0.04296676442027092, 0.03141496330499649, -0.01393505185842514, 0.08139383792877197, 0.015994761139154434, 0.011486695148050785, 0.004291613586246967, -0.003550427732989192, 0.02127469889819622, -0.046455446630716324, 0.02181077189743519, -0.02639806643128395, -0.04042408987879753, -0.0036199174355715513, -0.0014569010818377137, -0.04222479835152626, -0.02399398759007454, 0.029071154072880745, -0.016070201992988586, 0.02020438015460968, 0.017950180917978287, -0.006446303799748421, 0.002830107929185033, -0.0032222485169768333, 0.0008942632703110576, -0.006153308320790529, 0.0005408073193393648, 0.00533779663965106, 0.024184362962841988, 0.045668307691812515, -0.02826365828514099, -0.027374127879738808, -0.020896241068840027, 0.044162556529045105, 0.01827186904847622, 0.022646108642220497, -0.00629041250795126, 0.03926371783018112, -0.002533613471314311, 0.012497806921601295, -0.0040849121287465096, 0.04799439013004303, -0.004770941101014614, 0.011935784481465816, 0.01961791329085827, -0.003053531749173999, -0.09481249749660492, -0.0073720491491258144, -0.04702837020158768, 0.007443617098033428, 0.05622953549027443, 0.006914329715073109, -0.0033298993948847055, -0.005629046820104122, -0.00940453726798296, 0.003931019920855761, 0.00017350881535094231, -0.08230755478143692, -0.020257165655493736, 0.03495809808373451, 0.004514231812208891, -0.01138500776141882, 0.005933583714067936, -0.02093084342777729, 0.007272976916283369, -0.011807875707745552, 0.021066147834062576, 0.03227626532316208, 0.019431019201874733, 0.010105594992637634, 0.002075033960863948, -0.023832911625504494, 0.0029695474077016115, 0.031137289479374886, 0.01778503507375717, 0.014381660148501396, 0.06479302793741226, -0.0271307323127985, 0.023230386897921562, 0.01973632350564003, -0.0005330830463208258, 0.01134943962097168, -0.0335158035159111, -0.021837178617715836, 0.04864976182579994, 0.013195916078984737, 0.043631523847579956, -0.00028800146537832916, -0.04513726755976677, -0.03317948430776596, 0.04710468277335167, 0.04588126763701439, -0.0740317553281784, -0.028631292283535004, 0.0008680972969159484, -0.016005277633666992, -0.005460620857775211, 0.013848247937858105, -0.010029858909547329, 0.007395854685455561, -0.008083145134150982, 0.00609584990888834, 0.00032866891706362367, -0.029626768082380295, -0.017834488302469254, -0.07446925342082977, 0.018426457419991493, 0.007866229861974716, 0.025378810241818428, 0.0003977430460508913, 0.029514718800783157, 0.05088000372052193, 0.024988515302538872, -0.02210211381316185, -0.014494848437607288, -0.040715645998716354, -0.016702476888895035, 0.038103487342596054, -0.03194107487797737, -0.014222348108887672, 0.03118462674319744, 0.014275322668254375, 0.003931001760065556, 0.018029557541012764, -0.024766884744167328, 0.03007131814956665, 0.049651533365249634, -0.0076760174706578255, 0.16021740436553955, -0.0006287540309131145, 0.057513054460287094, -0.010426651686429977, -0.008189184591174126, 0.08145025372505188, -0.022119779139757156, -0.04889674857258797, 0.013836907222867012, 0.03125379979610443, -0.04282832890748978, -0.02567628212273121, 0.021317439153790474, -0.014251447282731533, 0.024502892047166824, 0.03155798837542534, 0.028115784749388695, -0.01929440163075924, -0.06074907258152962, 0.04158841073513031, -0.02675444632768631, -0.0238706786185503, 0.03091748245060444, 0.0282971803098917, 0.02328573353588581, 0.010668744333088398, 0.0129238935187459, 0.003584642196074128, -0.049333322793245316, -0.03636608272790909, 0.006304028443992138, -0.012806292623281479, -0.0073682451620697975, 0.009132924489676952, -0.03471153602004051, -0.00046040513552725315, -0.01429101824760437, 0.0003945543139707297, 0.07232611626386642, 0.007237594109028578, 0.05962739139795303, 0.05238458141684532, -0.028159480541944504, -0.0156744085252285, 0.00028548832051455975, 0.019615601748228073, 0.028009306639432907, -0.01953914389014244, 0.022870616987347603, 0.04262262582778931, 0.07043293863534927, -0.011897262185811996, -0.004208454862236977, -0.011510743759572506, 0.0812472254037857, 0.022707151249051094, -0.0011362965451553464, 0.005712025333195925, 0.014074020087718964, 0.07049238681793213, -0.07364796847105026, -0.03537619113922119, 0.02458633854985237, 0.10735378414392471, -0.036825548857450485, -0.041420698165893555, 0.07540551573038101, 0.01140530128031969, -0.011356796137988567, 0.03164081647992134, 0.010110867209732533, -0.007724021561443806, -0.0032002225052565336, -0.022649381309747696, 0.01908680610358715, -0.02635256201028824, -0.005191638134419918, -0.005953507497906685, -0.007826190441846848, -0.05087525397539139, -0.025851920247077942, 0.015143584460020065, -0.026632003486156464, -0.02359597571194172, 0.0008984400192275643, -0.02290843240916729, 0.008689959533512592, 0.01903548650443554, -0.018284669145941734, 0.03049718216061592, 0.002814788604155183, 0.0400698184967041, 0.061134204268455505, -0.023934559896588326, 0.03376057371497154, 0.043923795223236084, -0.0009706718265078962, -0.018127385526895523, -0.015772083774209023, -0.08005917817354202, 0.03846651688218117, 0.02038603276014328, 0.04243502765893936, -0.03394318372011185, 0.01389408204704523, 0.023513546213507652, 0.01606745831668377, 0.002110379049554467, 0.023547468706965446, -0.18169005215168, -0.007654329761862755, 0.02284890227019787, 0.01259469985961914, 0.04828767478466034, 0.03377027064561844, 0.012909816578030586, 0.03732939064502716, 0.0021576627623289824, 0.09182474762201309, -0.011520253494381905, -0.07159098237752914, -0.001427975483238697, -0.04296916723251343, -0.015491115860641003, 0.024331875145435333, -0.020956408232450485, -0.007697051391005516, 0.017726240679621696, 0.017536642029881477, -0.01571659743785858, -0.02332453988492489, -0.03734724223613739, -0.06388294696807861, -0.0005511351628229022, 0.0007305804756470025, 0.02003813348710537, -0.04127991199493408, -0.014687723480165005, 0.05504611134529114, 0.04465226083993912, -0.09891118109226227, -0.009410101920366287, -0.016707809641957283, -0.04004039987921715, -0.008110404014587402, -0.014039197005331516, -0.005451940931379795, -0.01579020544886589, 0.023235512897372246, 0.014199179597198963, 0.01974080316722393, -0.04275210574269295, 0.05346451699733734, 0.021824821829795837, -0.011505666188895702, -0.023432118818163872, -0.0005010849563404918, -0.04383514076471329, 0.026785042136907578, 0.03125796839594841, -0.02829795889556408, -0.012873442843556404, -0.006285638082772493, 0.007889307104051113, -0.014432757161557674, -0.029124952852725983, 0.06172161549329758, -0.041301827877759933, 0.006052809301763773, 0.0778292641043663, -0.07293860614299774, -0.009304599836468697, -0.01094637718051672, -0.02603442594408989, 5.451541437651031e-05, -0.04855833575129509, -0.015150467865169048, 0.011604057624936104, 0.005521630868315697, 0.02611953392624855, 0.04100227355957031, 0.028920339420437813, -0.031222131103277206, -0.009469239041209221, -0.023292196914553642, -0.017026511952280998, -0.016903890296816826, -0.04599207267165184, 0.01365770772099495, -0.007063748314976692, -0.0037514111027121544, 0.014770912006497383, -0.028613341972231865, -0.06088222563266754, -0.008265034295618534, -0.07413607835769653, 0.016276082023978233, -0.03630638122558594, 0.01198494527488947, 0.006152692716568708, 0.02410264126956463, -0.04267509654164314, 0.012672645039856434, 0.020486751571297646, -0.010836529545485973, 0.015692099928855896, 0.011452130042016506, -0.04312790557742119, 0.033248744904994965, -0.022645331919193268, -0.009259083308279514, -0.004286001902073622, -0.04570821300148964, -0.026141030713915825, 0.03075231984257698, -0.01053661946207285, -0.0236465223133564, -0.019150810316205025, -0.012375532649457455, -0.012372682802379131, -0.041557639837265015, -0.007395348511636257, -0.0033912467770278454, -0.031852371990680695, 0.02270866185426712, 0.0019058706238865852, -0.018549025058746338, -0.0117440614849329, -0.016027124598622322, 0.006487192120403051, 0.0058392975479364395, 0.0415889136493206, 0.002004072768613696, -0.009133223444223404, 0.0270755086094141, -0.06956266611814499, -0.013258879072964191, -0.03142261132597923, 0.016932640224695206, 0.022082149982452393, -0.0013963603414595127, 0.02769565023481846, 0.015369853004813194, -0.042785439640283585, -0.028319241479039192, 0.014013205654919147, 0.04633069410920143, -0.034307267516851425, 0.0014869198203086853, -0.04015924409031868, -0.019370319321751595, 0.04572893679141998, 0.0072915940545499325, 0.013897990807890892]" ./train/brain_coral/n01917289_1079.JPEG,brain_coral,"[0.038912225514650345, 0.01806790940463543, 0.00023707015498075634, -0.03852386400103569, -0.058701593428850174, -0.027913998812437057, -0.013419334776699543, 0.0367317758500576, 0.013160083442926407, -0.017745565623044968, -0.03524596244096756, 0.04685594514012337, -0.024645650759339333, -0.01413408387452364, -0.013075891882181168, -0.016125408932566643, 0.0822748988866806, 0.08708959817886353, -0.015820510685443878, 0.01054526399821043, -0.046657685190439224, -0.021413113921880722, 0.02717651054263115, -0.05863280966877937, 0.04673377051949501, 0.03207198902964592, -0.005497436970472336, -0.023064101114869118, 0.01905898191034794, 0.01568916067481041, 0.004803818184882402, -0.005781729239970446, 0.010654679499566555, -0.009114465676248074, 0.01773378811776638, 0.001977465348318219, -0.021827176213264465, -0.023053694516420364, 0.04735191538929939, 0.10093075037002563, 0.013589063659310341, -0.003017357550561428, -0.011589224450290203, 0.022483523935079575, -0.02023591473698616, -0.11250817030668259, 0.0019716033712029457, 0.01937892474234104, 0.017573989927768707, 0.05138383060693741, -0.04428211227059364, -0.025876734405755997, 0.010951703414320946, -0.0431208536028862, -0.04832765460014343, -0.004930510651320219, -0.03054073639214039, -0.05708151310682297, 0.0036253388971090317, -0.0696641057729721, 0.08002401143312454, -0.012600534595549107, -0.007635702844709158, -0.002730629639700055, -0.011437050998210907, 0.011546673253178596, 0.023360837250947952, 0.034862153232097626, 0.061278924345970154, -0.032424334436655045, 0.01901385560631752, -0.0399496890604496, -0.01065403688699007, -0.06599507480859756, -0.01803114078938961, -0.014882444404065609, -0.015798548236489296, 0.04187120869755745, 0.06176896020770073, -0.05189545452594757, 0.023403044790029526, 0.00549068721011281, -0.005201814696192741, -0.05615974962711334, -0.008331517688930035, 0.001982392743229866, 0.0789434164762497, 0.007104796357452869, -0.0022554812021553516, 0.0354917049407959, 0.03992610424757004, -0.06620954722166061, -0.5997709631919861, 0.004960144404321909, -0.029549522325396538, 0.0008966445457190275, 0.06097151339054108, -0.04400147497653961, -0.07063636928796768, 0.025750987231731415, -0.010966681875288486, 0.030701909214258194, -0.04096748307347298, -0.00799713283777237, -0.002300436608493328, -0.018517421558499336, -0.17623993754386902, 0.012258199043571949, -0.017547620460391045, 0.011635017581284046, 0.03428293392062187, 0.007412702776491642, -0.021918093785643578, -0.005297275725752115, -0.01890791393816471, -0.057425156235694885, 0.06591687351465225, -0.01233886368572712, -0.006092427764087915, 0.03806278109550476, -0.00017413104069419205, -0.048095155507326126, -0.04835837706923485, -0.05204920843243599, -0.04185440391302109, 0.040772709995508194, 0.001787107321433723, -0.004107009153813124, 0.03208700940012932, -0.034988053143024445, 0.003336889436468482, -0.007952332496643066, -0.01558589655905962, 0.08072023093700409, 0.007221754640340805, 0.031728923320770264, 0.006611012388020754, -0.05282966047525406, 0.00881221517920494, 0.014321212656795979, 0.033009033650159836, -0.0002583040331955999, -0.05736105889081955, 0.019054189324378967, -0.026761775836348534, -0.01210459042340517, -0.010335099883377552, -0.01852681301534176, 0.01627950370311737, 0.01489071361720562, -0.03220812603831291, -0.043142981827259064, -0.036088645458221436, -0.007615088950842619, -0.014638688415288925, 0.06755836308002472, 0.029202766716480255, -0.0016548667335882783, -0.007876728661358356, 0.0021428216714411974, -0.060725193470716476, -0.011483740992844105, -0.0255507193505764, 0.019224863499403, 0.0018451301148161292, -0.0033590917009860277, -0.03183218836784363, 0.03863200917840004, 0.028777122497558594, -0.017500098794698715, -0.005981673486530781, 0.006638894323259592, -0.014118451625108719, 0.015421178191900253, 0.03413627669215202, 0.03133917972445488, -0.09203597903251648, -0.0011311059352010489, 0.0036955007817596197, -0.02011510357260704, -0.01740032434463501, -0.000772087718360126, 0.002574219834059477, -0.014965768903493881, 0.017830297350883484, -0.010358703322708607, 0.014467047527432442, -0.005014743655920029, 0.059986140578985214, 0.03256795182824135, 0.014319751411676407, 0.011261757463216782, 0.03249400854110718, -0.028059961274266243, 0.1092943325638771, -0.01933991350233555, 0.014990639872848988, 0.014430967159569263, 0.013407454825937748, 0.013754324987530708, -0.03530825302004814, -0.004187775310128927, -0.006831655744463205, 0.06734111905097961, -0.029584527015686035, 0.0168213602155447, 0.052061449736356735, -0.031440749764442444, 0.009432622231543064, -0.012969955801963806, -0.012158253230154514, 0.029176898300647736, -0.020167293027043343, -0.06566304713487625, 0.04910755157470703, 0.050599463284015656, 8.753096381042269e-08, -0.055107634514570236, -0.045783691108226776, -0.024097662419080734, 0.08064227551221848, 0.04633181914687157, -0.010180129669606686, -0.043052881956100464, 0.05520331487059593, -0.019076161086559296, -0.0023687512148171663, -0.02585470862686634, 0.009618770331144333, 0.028648946434259415, 0.005347302183508873, -0.03601650148630142, 0.027579281479120255, -0.02716863714158535, -0.03060961700975895, -0.02127414010465145, 0.019226668402552605, -0.031911659985780716, -0.01674043759703636, 0.017805151641368866, -0.011626284569501877, 0.042691830545663834, 0.027260472998023033, 0.01322109717875719, -0.005239886697381735, 0.007032020948827267, 0.013675513677299023, 0.04633864387869835, -0.031561121344566345, -0.011294984258711338, 0.039109621196985245, 0.012249338440597057, 0.008866125717759132, 0.033372413367033005, 0.003520280122756958, -0.005459364969283342, -0.005192616954445839, -0.013447347097098827, 0.055032987147569656, 0.0042066415771842, 0.025138700380921364, 0.011421742849051952, -0.007851780392229557, 0.006925035733729601, -0.0410812608897686, -0.03252634406089783, 0.04388297721743584, 0.03610014542937279, -0.028973106294870377, -0.0147278793156147, -0.008805324323475361, -0.0016701248241588473, 0.008880894631147385, -0.02265651896595955, -0.027955766767263412, -0.032365791499614716, -0.027974804863333702, 0.0308750718832016, -0.022076856344938278, -0.012197460047900677, 0.0232941135764122, 0.05287570133805275, -0.00807225052267313, 0.018589846789836884, -0.015216190367937088, 0.02322385460138321, -0.029221853241324425, -0.07212097942829132, 0.01065891794860363, -0.02276766300201416, -0.030854709446430206, 0.009052028879523277, 0.005200696177780628, 0.02689393050968647, -0.008149540983140469, 0.02480284310877323, 0.02545279823243618, 0.000275374943157658, 0.05006411671638489, -0.011895166710019112, -0.028631849214434624, -0.019612545147538185, -0.022019021213054657, 0.03600257635116577, -0.016666295006871223, 0.03870922699570656, 0.0035298701841384172, 0.031170884147286415, 0.034520454704761505, 0.0018910965882241726, 0.07294141501188278, -0.045426301658153534, 0.08057920634746552, 0.004322039429098368, 0.030189432203769684, 0.020973673090338707, -0.049841683357954025, 0.04548264294862747, -0.05223603546619415, -0.04378100112080574, 0.02913615293800831, 0.25252389907836914, -0.06147170066833496, -0.039787258952856064, 0.04336303099989891, -0.007992153987288475, -0.006362824700772762, 0.01437583938241005, 0.0006705867708660662, -0.00024500206927768886, -0.03146502748131752, -0.04373989999294281, 0.018724070861935616, -0.0687064379453659, -0.006957496050745249, -0.05598410964012146, -0.04142176732420921, -0.01897784136235714, 0.006859293673187494, 0.03878245875239372, 0.020253513008356094, -0.004822116810828447, -0.006279704160988331, 0.006148947402834892, 0.03548483923077583, 0.0073198010213673115, 0.005797917954623699, -0.0071646240539848804, 0.013142785988748074, 0.04841690883040428, 0.01514731626957655, -0.010035165585577488, 0.02961266040802002, 0.027209201827645302, -0.030988041311502457, -0.038701195269823074, 0.040285855531692505, -0.09482467174530029, 0.028437310829758644, -0.005389396566897631, -0.0029448727145791054, -0.018100401386618614, 0.025748636573553085, -0.0038549627643078566, -0.06342901289463043, 0.012193959206342697, -0.003898088587448001, -0.08457440137863159, 0.02157779596745968, 0.02676970139145851, -0.0013398415176197886, 0.017924312502145767, -0.00666919257491827, -0.003524203784763813, 0.06365862488746643, 0.050417907536029816, 0.017155854031443596, -0.01605679653584957, -0.08246099203824997, -0.03507959470152855, -0.025509295985102654, -0.03023502789437771, -0.02440844662487507, 0.016849540174007416, -0.005686944350600243, 0.011187457479536533, 0.016754575073719025, -0.02035672403872013, -0.0383424311876297, -0.055282916873693466, -0.013706429861485958, -0.016790930181741714, 0.014824618585407734, 0.01777557283639908, -0.014224565587937832, -0.059857409447431564, 0.02059967815876007, 0.049222253262996674, -0.036074280738830566, -0.020600423216819763, -0.025873271748423576, -0.02323264069855213, 0.009258399717509747, 0.023374086245894432, 0.03627721965312958, -0.02626447193324566, 0.02137037180364132, 0.02426370047032833, -0.013904242776334286, -0.0198840219527483, 0.07084668427705765, 0.003207683563232422, 0.017664575949311256, -0.03631581366062164, 0.01580549217760563, -0.019529080018401146, 0.042083702981472015, 0.040120720863342285, -0.005222539883106947, 0.0082083223387599, 0.0447889119386673, 0.001522596343420446, 0.0012348080053925514, -0.04094742238521576, 0.03727986291050911, -0.03456743806600571, 0.04197361320257187, 0.04940427467226982, 0.035224396735429764, -0.06572597473859787, -0.03510027378797531, 0.0035129853058606386, 0.07085905224084854, -0.000609134673140943, -0.005170895718038082, -0.005702244583517313, -0.014449384063482285, 0.0526176393032074, -0.012077988125383854, 0.013375772163271904, -0.04419396072626114, -0.06564532220363617, -0.0036461246199905872, -0.02862740121781826, 0.02096736431121826, 0.005605899263173342, -0.0015967441722750664, -0.0067869205959141254, -0.03298245742917061, 0.023389143869280815, 0.006752107758074999, -0.03760537877678871, 0.01622956432402134, -0.04652532935142517, 0.04958254471421242, -0.043309930711984634, 0.037898194044828415, 0.03230994567275047, 0.013524684123694897, -0.033315856009721756, -0.030270133167505264, 0.001637317705899477, 0.006545145530253649, 0.010069254785776138, 0.029688343405723572, 0.01104008685797453, -0.0010991188464686275, 0.00046055621351115406, 0.0017691879766061902, -0.019880518317222595, -0.01119572576135397, -0.04539167135953903, 0.051035284996032715, -0.03284919634461403, -0.045775096863508224, -0.013190786354243755, 0.008777379989624023, -0.0038090485613793135, -0.02543489821255207, 0.00677487812936306, 0.010115012526512146, -0.019578175619244576, 0.006543862633407116, -0.0005651062238030136, -8.719972538528964e-05, 0.017997097223997116, 0.020978042855858803, -0.02079092711210251, 0.02340199053287506, 0.025369444862008095, -0.043679963797330856, -0.0013179872184991837, 0.03342761471867561, -0.0322025828063488, 0.016777869313955307, -0.011295781470835209, 0.04026825726032257, 0.021841080859303474, -0.0024473408702760935, 0.012854959815740585, 0.009824445471167564, -0.028606120496988297, -0.004616886377334595, 0.033436037600040436, 0.036298707127571106, -0.03188231959939003, 0.0197409950196743, -0.009559388272464275, 0.014656939543783665, 0.02464335225522518, 0.005446465685963631, 0.009038642980158329]" ./train/brain_coral/n01917289_2484.JPEG,brain_coral,"[0.05507666990160942, 0.015379576943814754, -0.00749883521348238, 0.00519414059817791, -0.04877340421080589, -0.0409923791885376, -0.054283831268548965, -0.03186291456222534, 0.03863987699151039, -0.0008869633311405778, -0.058267831802368164, 0.023397453129291534, -0.010483969002962112, 0.034654922783374786, 0.0008682682528160512, -0.05172604322433472, 0.071042999625206, 0.0819540023803711, -0.01688583567738533, -0.010976514779031277, -0.054569218307733536, -0.008058176375925541, 0.014418456703424454, -0.06205743923783302, 0.004825621377676725, 0.023349616676568985, -0.020689427852630615, -0.008749308995902538, 0.039608292281627655, 0.005740939173847437, 0.01287701167166233, -0.00323764281347394, -0.023532982915639877, -0.023570725694298744, 0.010082068853080273, -0.016949789598584175, -0.01835848018527031, -0.01924416795372963, 0.026695551350712776, 0.1686481386423111, 0.022034000605344772, 0.005296051036566496, -0.027226632460951805, 0.029305703938007355, 0.024155059829354286, -0.09164199233055115, 0.00723682576790452, 0.04754374176263809, -0.00768313417211175, 0.018537454307079315, -0.0155639024451375, -0.027290724217891693, -0.008007201366126537, -0.0367518849670887, -0.0753302350640297, 0.007986710406839848, -0.02139357104897499, -0.0222454983741045, -0.010146453976631165, -0.05321589112281799, 0.07706759870052338, -0.027361111715435982, 0.002219080226495862, -0.024386407807469368, -0.009967037476599216, 0.01039008516818285, -0.006373845972120762, 0.09699277579784393, 0.0289210993796587, -0.020768871530890465, 0.036619897931814194, -0.05611289665102959, 0.007165851071476936, -0.05989617109298706, 0.011953027918934822, 0.0002951327769551426, -0.004076380282640457, 0.027850572019815445, 0.010274611413478851, -0.017902301624417305, -0.022961780428886414, 0.01966583915054798, 0.017595143988728523, -0.056074533611536026, 0.05524398759007454, 0.01990519091486931, 0.08660687506198883, -0.023041844367980957, -0.008857817389070988, 0.04850396886467934, 0.015127000398933887, -0.04128670319914818, -0.5254279971122742, 0.000796411419287324, -0.017591940239071846, 0.012438689358532429, 0.01880102977156639, -0.04226981848478317, -0.058071788400411606, -0.00499296747148037, -0.004595884587615728, 0.03198280185461044, -0.07153909653425217, -0.031986746937036514, 0.0190456323325634, 0.00430073169991374, -0.11747822910547256, -0.0005411507445387542, -0.021448271349072456, 0.04666995257139206, 0.03643294796347618, -0.030992813408374786, -0.0033590139355510473, 0.01067621260881424, -0.008280518464744091, -0.03359946236014366, 0.09121689200401306, 0.0081638153642416, -0.01620866358280182, 0.03505854308605194, 0.006291994359344244, -0.04921291396021843, -0.0599849596619606, -0.016374770551919937, -0.018060745671391487, 0.003259231336414814, 0.0014957557432353497, -0.009999912232160568, 0.038033824414014816, -0.012894039042294025, 0.0329730398952961, 0.011565573513507843, -0.009929892607033253, 0.07422150671482086, 0.0025388493668287992, 0.028896009549498558, 0.0076498002745211124, -0.01706830970942974, 0.017757898196578026, -0.06447134912014008, 0.04454218968749046, -0.0030115218833088875, -0.0808207094669342, 0.01777050271630287, -0.004253118298947811, -0.01581927388906479, -0.029264438897371292, 0.0005403142422437668, -0.009268191643059254, 0.029945485293865204, -0.0032112132757902145, -0.007474037352949381, -0.0332937128841877, 0.021887578070163727, -0.025837380439043045, 0.037294019013643265, 0.002686284016817808, -0.006363458000123501, 0.020899828523397446, 0.03376820683479309, -0.03436025232076645, -0.010117672383785248, -0.030000949278473854, 0.004613746423274279, 0.0014412784948945045, -0.017617573961615562, -0.002586544957011938, 0.04195424169301987, 0.023258263245224953, 0.017515750601887703, 0.016863474622368813, 0.04671802744269371, -0.01112313847988844, 0.0454719103872776, -0.013958596624433994, 0.07193208485841751, -0.10408800840377808, -0.001563574536703527, -0.03723453730344772, 0.006321378517895937, 0.0504680834710598, -0.006999375764280558, 0.0007039306219667196, -0.006535873282700777, -0.005330515094101429, -0.004852435551583767, 0.010138364508748055, -0.04033847153186798, 0.028252996504306793, 0.041592709720134735, 0.0032199311535805464, -0.0366152822971344, 0.04337949678301811, -0.025299765169620514, 0.05690253898501396, -0.044010840356349945, 0.03328867629170418, 0.028119022026658058, 0.01785283163189888, -0.015654949471354485, -0.02363240346312523, -0.04815685376524925, -0.03991136699914932, 0.06197616457939148, 0.004444566555321217, -0.0009398434194736183, 0.06124311685562134, -0.030693603679537773, 0.0248834528028965, 0.003293215297162533, -0.03236458823084831, 0.028871886432170868, -0.03931537643074989, -0.03921450302004814, 0.05581343546509743, 0.043234433978796005, 0.03786931931972504, -0.010894663631916046, -0.010387826710939407, -0.021482842043042183, 0.09795050323009491, 0.02533448114991188, -0.04269569367170334, -0.004825867246836424, 0.039453838020563126, -0.03596900403499603, -0.026500575244426727, 0.027133965864777565, -0.015034569427371025, 0.025821449235081673, -0.0008947006426751614, -0.021474016830325127, 0.02894682064652443, -0.023105623200535774, -0.011818532831966877, -0.06934376060962677, 0.0233870018273592, -0.0020366047974675894, 0.0366043895483017, 0.027350982651114464, 0.034153033047914505, 0.05089285224676132, 0.043754417449235916, 0.006731166038662195, 0.02908511832356453, -0.001949525554664433, 0.008571282960474491, 0.054558590054512024, -0.03792739659547806, -0.02079091966152191, 0.05324297770857811, 0.007441201712936163, 0.06409943103790283, 0.04054548218846321, -0.0025521789211779833, 0.05687817931175232, 0.009685472585260868, 0.008274028077721596, 0.15202781558036804, 0.0383923277258873, 0.020161554217338562, -0.009662552736699581, 0.02652614936232567, 0.038866110146045685, -0.04486970975995064, -0.04370685666799545, 0.050569016486406326, 0.006866443436592817, -0.03044090047478676, -0.016219276934862137, -0.017610089853405952, -0.0190373994410038, -0.006395113654434681, 0.00459545711055398, -0.016623418778181076, -0.0010119971120730042, -0.05658270791172981, 0.04826229065656662, -0.03776903450489044, -0.014447669498622417, 0.035170529037714005, -0.004961547441780567, -0.004917162470519543, -0.008895146660506725, -0.0006509236409328878, 0.028132030740380287, -0.020052582025527954, -0.05958212539553642, 0.0046250647865235806, -0.018460964784026146, 0.016280947253108025, 0.0012780993711203337, -0.009229769930243492, 0.03470636159181595, 0.0057768141850829124, -0.0014835919719189405, 0.050535306334495544, 0.0009263944812119007, 0.05011814087629318, 0.0425308421254158, -0.010894551873207092, -0.04895782843232155, -0.021817434579133987, 0.032462913542985916, -0.01372967753559351, 0.00989431980997324, 0.036073148250579834, 0.06741280853748322, 0.06234872713685036, 0.01573508232831955, 0.050458770245313644, -0.03845583274960518, 0.07397211343050003, 0.013487688265740871, 0.009719299152493477, 0.005615349393337965, -0.011985164135694504, 0.047318339347839355, -0.08104050159454346, -0.033345144242048264, 0.03606584668159485, 0.25542935729026794, -0.03129973262548447, -0.060038067400455475, 0.06070178747177124, -0.009208926931023598, -0.013513638637959957, -0.013547624461352825, 0.011069766245782375, -0.04300171136856079, -0.0005759980413131416, -0.0165520291775465, 0.03899618238210678, -0.015051894821226597, -0.012868373654782772, -0.03303426131606102, -0.028326159343123436, -0.048350740224123, -0.021083848550915718, 0.040506187826395035, -0.004105472471565008, -0.007085283752530813, -0.014514087699353695, -0.03084338828921318, 0.02408173494040966, 0.008054769597947598, -0.02032257616519928, 0.004078429192304611, 0.002314451616257429, 0.020996620878577232, 0.04100680723786354, 0.029299186542630196, 0.007754135876893997, 0.062043871730566025, -0.017639508470892906, -0.03694494441151619, -0.010938940569758415, -0.08733714371919632, 0.02091800980269909, 0.02999833971261978, 0.04073702171444893, -0.033577192574739456, 0.016500310972332954, -0.001009901287034154, -0.040666673332452774, -0.002660448430106044, -0.008295439183712006, -0.12787824869155884, -0.014170706272125244, -0.016912998631596565, -0.00022652283951174468, 0.013193986378610134, 0.0313127376139164, 0.011136386543512344, 0.03700408339500427, 0.057511020451784134, 0.04458703100681305, -0.001389365759678185, -0.09805804491043091, -0.04376785457134247, -0.04743090271949768, -0.02935066819190979, 0.016009513288736343, 0.022539973258972168, -0.01989356055855751, 0.010268323123455048, 0.022427162155508995, -0.027284901589155197, -0.03190762549638748, -0.0924047902226448, -0.046884968876838684, 0.0019010750111192465, -0.0011539688566699624, 0.032556645572185516, -0.021591467782855034, -0.028193246573209763, 0.046744637191295624, 0.0029887156561017036, -0.10596143454313278, -0.008646218106150627, -0.013943502679467201, -0.03453144431114197, -0.013205050490796566, -0.00869543757289648, 0.013368349522352219, -0.023661889135837555, 0.012132585979998112, 0.0260144229978323, 0.013164904899895191, -0.039561156183481216, 0.07841736078262329, -0.004457461182028055, -0.008190992288291454, -0.031552545726299286, -0.008884256705641747, -0.03543868288397789, 0.0298463087528944, 0.060680922120809555, -0.035881731659173965, 0.01467161439359188, 0.031409554183483124, -0.006012483034282923, -0.012067096307873726, -0.01856827735900879, 0.045199789106845856, -0.0046273949556052685, 0.045104656368494034, 0.05340546369552612, 0.04214278608560562, -0.012350923381745815, -0.006556008476763964, -0.03763120248913765, 0.04279829189181328, -0.009126976132392883, -0.02472555637359619, -0.0014486220898106694, -0.011946587823331356, 0.021999230608344078, 0.012793059460818768, 0.008118142373859882, -0.026958590373396873, -0.019758163020014763, -0.026845145970582962, -0.0207530464977026, -0.010549608618021011, -0.024317527189850807, 0.02140156365931034, -0.060164421796798706, 0.006349672097712755, 0.036886535584926605, 0.0014398901257663965, -0.06545688956975937, -0.008502503857016563, -0.06004820019006729, 0.013938234187662601, -0.03258123993873596, 0.0198596753180027, 0.04108629375696182, 0.015229860320687294, -0.022646425291895866, -0.0012827073223888874, 0.05805578455328941, 0.012865678407251835, -0.02356121689081192, 0.03859712556004524, -0.02098928391933441, 0.005994981620460749, -0.00986066646873951, 0.03300071507692337, -0.028302662074565887, -0.03765076398849487, -0.050104547291994095, 0.012462878599762917, -0.03704933822154999, -0.048666518181562424, -0.004851127974689007, -0.014466376975178719, 0.007893591187894344, -0.020449746400117874, -0.012773334048688412, 0.006612356286495924, -0.0376940481364727, 0.011529588140547276, 0.001575613860040903, -0.024194270372390747, 0.030002877116203308, 0.00903929490596056, 0.01059694867581129, 0.018230291083455086, 0.04507501795887947, -0.0434405654668808, -0.00282356608659029, 0.013535605743527412, -0.04894368723034859, 0.03197599574923515, -0.02565190941095352, 0.044435374438762665, 0.003685327945277095, -0.026290670037269592, 0.046243492513895035, 0.027644790709018707, -0.04727296903729439, -0.048285093158483505, 0.025491761043667793, 0.025903400033712387, -0.015036444179713726, 0.036710359156131744, -0.04303087294101715, 0.010982812382280827, 0.04680660367012024, 0.0015577712329104543, 0.004722308833152056]" ./train/brain_coral/n01917289_1082.JPEG,brain_coral,"[0.01281997561454773, 0.005894457455724478, 0.012932969257235527, -0.06641177088022232, -0.0683240070939064, 0.015379040502011776, -0.025871848687529564, 0.019130758941173553, 0.043279796838760376, -0.01090285461395979, -0.03309614211320877, 0.016481533646583557, -0.05019741877913475, -0.04107280448079109, 0.0004495503380894661, -0.037662237882614136, 0.00759456492960453, 0.06571037322282791, 0.028190936893224716, 0.041273877024650574, -0.04380977526307106, -0.00771605409681797, -0.012727589346468449, -0.07270872592926025, 0.02791466936469078, 0.03378216177225113, -0.012395837344229221, 0.013284717686474323, 0.012973864562809467, 0.004958619829267263, -0.009506228379905224, -0.006835390347987413, 0.013393706642091274, 0.025129366666078568, -0.017310461029410362, -0.019180506467819214, -0.014670860022306442, -0.0030163023620843887, 0.029156522825360298, 0.053556688129901886, 0.032842375338077545, -0.012213385663926601, -0.02094428986310959, -0.009830196388065815, -0.014634476974606514, -0.15030351281166077, -0.0034142539370805025, 0.04620105028152466, -0.003038248047232628, 0.040513474494218826, -0.0635092630982399, 0.017356328666210175, 0.0224857646971941, -0.023977462202310562, -0.06877262145280838, 0.014745714142918587, -0.055801451206207275, -0.045435454696416855, 0.02804710902273655, -0.04558899998664856, 0.08680012822151184, -0.0002747638791333884, -0.0013579264050349593, -0.037298377603292465, -0.04414895176887512, 0.025761282071471214, 0.02743266522884369, 0.022505206987261772, 0.03294305503368378, 0.03644349053502083, -0.0030219496693462133, -0.02104535885155201, -0.010163296945393085, -0.0448073111474514, -0.00042971159564331174, -0.034834109246730804, -0.00164504861459136, 0.032599739730358124, 0.05077311396598816, -0.08204878866672516, 0.017367584630846977, 0.011462732218205929, -0.002524866256862879, -0.057088807225227356, 0.01871759630739689, 0.03986542671918869, 0.10699770599603653, -0.003937221132218838, 0.015593382529914379, 0.029652372002601624, -0.0016244141152128577, -0.06243515387177467, -0.5953307151794434, -0.01116594672203064, -0.027046790346503258, 0.01357133686542511, 0.036855749785900116, -0.0273596178740263, -0.05855806916952133, -0.04141915217041969, -0.0175990741699934, 0.021186240017414093, -0.07050570845603943, 0.0387490876019001, 0.018028315156698227, -0.03201357275247574, -0.14006023108959198, 0.01019893866032362, -0.028229419142007828, 0.027111820876598358, 0.021905455738306046, -0.02796967141330242, 0.010194561444222927, 0.018414996564388275, -0.017831219360232353, -0.03967718034982681, 0.07677806913852692, 0.04263615235686302, 0.02605750970542431, 0.039460428059101105, 0.01601235195994377, -0.004597303923219442, -0.06320838630199432, 0.0312928669154644, -0.03588955104351044, 0.04947224631905556, -0.008662267588078976, 0.008452572859823704, 0.06072443723678589, 0.006387764122337103, 0.07212254405021667, -0.03507198020815849, -0.035096123814582825, 0.0801820158958435, 0.03999945893883705, 0.031461868435144424, 0.021766159683465958, -0.05269920080900192, -0.014086741022765636, -0.014846458099782467, 0.012161326594650745, -0.009517567232251167, -0.042122937738895416, 0.04149198904633522, 0.0044428762048482895, -0.015054221265017986, -0.03636576980352402, -0.01720249652862549, 0.005881591700017452, 0.0073343063704669476, -0.001803046092391014, -0.025604132562875748, -0.02013130486011505, -0.00038043002132326365, -0.010669740848243237, 0.02062108740210533, 0.02675948664546013, 0.016096550971269608, 0.010042255744338036, 0.035810086876153946, -0.031717509031295776, -0.01902703568339348, -0.005951412487775087, -0.01941288821399212, -0.022093014791607857, -0.015567978844046593, -0.04445734992623329, 0.03174407780170441, -0.0017093475908041, -0.011208525858819485, 0.006899552885442972, 0.03229716420173645, 0.0061241742223501205, -0.0004265730385668576, 0.05525976046919823, 0.005456879269331694, -0.11542700231075287, -0.024528266862034798, -0.04554522782564163, -0.0039575607515871525, 0.02668219432234764, -0.02072877809405327, -0.01184038631618023, -0.003536668373271823, 0.04317403957247734, -0.018893931061029434, -0.003420780645683408, -0.022062066942453384, 0.035498153418302536, 0.020444810390472412, -0.010571155697107315, -0.043773628771305084, 0.06477102637290955, 0.009806642308831215, 0.06458226591348648, -0.026274386793375015, 0.007240812759846449, -0.03517632931470871, 0.028193695470690727, -0.03846270591020584, 0.005563211161643267, -0.021873213350772858, 0.03189567103981972, 0.05161932855844498, 0.016552520915865898, 0.020870298147201538, 0.06033362075686455, -0.03216821700334549, 0.012111220508813858, -0.006982849445194006, -0.03227939084172249, 0.06101522967219353, -0.035143543034791946, -0.049425382167100906, 0.05387857183814049, 0.041795678436756134, 0.003148695221170783, -0.04558120295405388, -0.051287855952978134, -0.019902292639017105, 0.05659728869795799, -0.00015907791384961456, 0.001133046462200582, -0.004740349017083645, 0.06358884274959564, -0.018562976270914078, 0.06677890568971634, -0.050137635320425034, -0.03735704347491264, 0.03998992219567299, -0.00790312234312296, -0.018352558836340904, 0.03936230018734932, -0.03067665733397007, -0.03555456921458244, -0.05026984214782715, 0.017684942111372948, -0.04146011546254158, 0.0299117099493742, 0.02249538153409958, -0.02898046188056469, 0.01593291014432907, 0.056066807359457016, -0.0024777823127806187, 0.04583581164479256, -0.025789938867092133, -0.00453916983678937, -0.0019326609326526523, -0.009971726685762405, -0.004717470146715641, 0.018603213131427765, 0.004145925864577293, 0.0106691624969244, 0.06737020611763, -0.03329874202609062, -0.03946642950177193, -0.0055608986876904964, -0.014398706145584583, 0.04459797963500023, -0.01074113231152296, 0.019145281985402107, -0.002851310884580016, -0.011089975014328957, 0.02601255290210247, -0.019517719745635986, 0.04419736936688423, 0.06276725232601166, 0.0010205358266830444, -0.038061559200286865, -0.006051641423255205, -0.010344029404222965, -0.010308152064681053, 0.008555727079510689, -0.012255052104592323, -0.01464243046939373, -0.036454904824495316, -0.05596642941236496, 0.0361841581761837, -0.012106643058359623, 0.006104869302362204, 0.009554929099977016, 0.029217800125479698, 0.012967417016625404, -0.016421593725681305, 0.010665546171367168, 0.0006170407868921757, -0.0639587864279747, -0.03976510092616081, 0.016000421717762947, -0.01926230452954769, -0.03553394600749016, 0.006612741854041815, 0.019024690613150597, 0.049901701509952545, 0.004748361650854349, 0.0034094355069100857, -0.004671214614063501, -0.0025584110990166664, 0.04331863671541214, -0.006295878440141678, -0.04053638502955437, -0.02306627295911312, -0.04398057237267494, 0.06012694910168648, 0.007988553494215012, 0.066439688205719, -0.024558722972869873, 0.03222305327653885, 0.024709925055503845, 0.0057572959922254086, 0.04408833757042885, 0.006733521353453398, 0.08003261685371399, 0.01834612339735031, 0.01806100830435753, 0.014892677776515484, -0.02275068499147892, 0.026702091097831726, -0.0361967533826828, -0.05887776240706444, 0.008884933777153492, 0.28401249647140503, -0.005197336431592703, -0.028150098398327827, 0.03143078088760376, -0.02188771404325962, 0.0035900967195630074, 0.017939243465662003, -0.0025249102618545294, -0.007564217317849398, -0.038871824741363525, -0.0152654517441988, 0.0005669002421200275, -0.036295175552368164, -0.03307656571269035, -0.009380578063428402, -0.04774472862482071, -0.027788838371634483, -0.005021265242248774, 0.04814499244093895, 0.004893172532320023, -0.00813320092856884, -0.016003930941224098, -0.00275798374786973, 0.03531211242079735, 0.00588977849110961, -0.022002700716257095, 0.01718682423233986, -0.023847924545407295, 0.03488292172551155, 0.021291583776474, -0.008926472626626492, -0.00021080153237562627, 0.024900805205106735, -0.04974529147148132, -0.03666016086935997, 0.04315405339002609, -0.0688367635011673, 0.01959441415965557, -0.012893547303974628, -0.014364810660481453, -0.0019238507375121117, 0.012510795146226883, -0.0153139503672719, -0.022007524967193604, -0.020195478573441505, 0.00930784922093153, -0.10919217765331268, 0.0033382782712578773, 0.03309259191155434, 0.011711632832884789, 0.02041665092110634, 0.02658293955028057, 0.005909308325499296, 0.06401323527097702, 0.03300369903445244, 0.026274995878338814, -0.011734653264284134, -0.0387272909283638, -0.018490774556994438, 0.016343459486961365, -0.0467718206346035, -0.008908754214644432, -0.03139482066035271, -0.0008785698446445167, 0.014434285461902618, 0.01157031673938036, -0.011328245513141155, -0.039073146879673004, -0.01957959122955799, 0.005938075017184019, -0.006622792221605778, 0.02637444995343685, 0.020993975922465324, -0.014572699554264545, -0.017474520951509476, 0.018745219334959984, 0.063042551279068, -0.029053298756480217, -0.015388495288789272, 0.00040134257869794965, -0.026494285091757774, -0.017787348479032516, -0.03536631166934967, 0.0242776982486248, -0.04741765931248665, -0.017960064113140106, 0.027218323200941086, -0.01723596639931202, -0.016146061941981316, 0.10565540194511414, 0.004014031030237675, 0.010105708613991737, -0.03823298588395119, -0.009993067011237144, -0.008456110022962093, 0.025713102892041206, 0.004968171939253807, 0.012953858822584152, 0.01744866371154785, -0.020434362813830376, -0.003131506033241749, -0.006449232343584299, -0.06615769118070602, 0.057453226298093796, 0.00986839272081852, 0.03238844871520996, 0.008747135289013386, 0.02624049410223961, -0.03835567831993103, 0.0005253042327240109, 0.013872090727090836, 0.05389003828167915, 0.0031165627297014, -0.017426738515496254, -0.00023667796631343663, 0.017917364835739136, 0.001996217994019389, 0.023675166070461273, -0.01019003614783287, -0.004202307667583227, -0.07612502574920654, -0.041962627321481705, -0.05392902344465256, 0.005363223142921925, -0.031071441248059273, 0.03669159486889839, -0.026162227615714073, 0.039060503244400024, -0.006176587659865618, -0.0059347739443182945, -0.04390159621834755, 0.010933548212051392, -0.013175618834793568, 0.07454493641853333, -0.03480499982833862, 0.006855371408164501, 0.033220190554857254, 0.024918101727962494, -0.01828068122267723, 0.005240262020379305, 0.042547546327114105, -0.0182172991335392, -0.00027662600041367114, 0.03275160491466522, 0.0028145606629550457, 0.01705770008265972, 0.011592530645430088, 0.003382275812327862, -0.03357291221618652, -0.02016393467783928, -0.01663520745933056, 0.015973743051290512, -0.038341328501701355, 0.004121109377592802, 0.00583614269271493, -0.015094969421625137, 0.014135084114968777, -0.04397553205490112, 0.016234135255217552, 0.012333554215729237, -0.022128289565443993, -0.01691485568881035, -0.015597820281982422, 0.005837590899318457, 0.018481247127056122, 0.008373900316655636, 0.01666387729346752, 0.010547643527388573, 0.038387518376111984, -0.03587651625275612, -0.004512229468673468, 0.020273501053452492, -0.039809588342905045, -0.022876083850860596, 0.009541595354676247, -0.004345233552157879, 0.02084493264555931, 0.006470306310802698, 0.02471165545284748, -0.001245092018507421, -0.03267171233892441, -0.001893700915388763, 0.016047634184360504, 0.04998588562011719, -0.007331917528063059, 0.0017323991050943732, 0.02064727060496807, 0.003244235413148999, 0.01826143078505993, -0.007401301525533199, 0.01257232204079628]" ./train/brain_coral/n01917289_1538.JPEG,brain_coral,"[0.03906926512718201, 0.04955126345157623, -0.023420853540301323, -0.0026995562948286533, 0.0017356141470372677, 0.008694981224834919, 0.00500206183642149, -0.020979618653655052, 0.04794033244252205, 0.036049894988536835, 0.02758963406085968, 0.008271549828350544, -0.03679266199469566, 0.007038597483187914, -0.04147816076874733, -0.013654799200594425, 0.03454851731657982, 0.03358469530940056, -0.016097038984298706, -0.03902750462293625, -0.061735257506370544, 0.0198996402323246, 0.023272981867194176, -0.050029680132865906, -0.006907932460308075, 0.037618737667798996, 0.025029273703694344, -0.003387865610420704, -0.04055626317858696, 0.006674348842352629, -0.006717671640217304, 0.006406577304005623, -0.008607042022049427, -0.009968673810362816, 0.050646767020225525, -0.020550720393657684, -0.009022513404488564, 0.024425439536571503, 0.028248513117432594, 0.1406174749135971, 0.00961235910654068, 0.01314295083284378, -0.010129145346581936, -0.0008602944435551763, 0.04678867757320404, -0.03436940908432007, -0.011271430179476738, 0.04729068651795387, 0.029383206740021706, 0.0355297289788723, -0.01670517958700657, -0.018491700291633606, 0.0197629164904356, -0.04697512090206146, -0.04039335623383522, 0.02416704036295414, -0.02657294273376465, -0.02033008635044098, 0.015195400454103947, -0.01534681860357523, 0.0045474376529455185, -0.04553893953561783, -0.02263261191546917, 0.019896650686860085, -0.008452831767499447, -0.014192941598594189, -0.03030656836926937, 0.12068507075309753, -0.010859666392207146, 0.01212919969111681, 0.011059228330850601, -0.00815292913466692, -0.02244798094034195, -0.027089470997452736, 0.031347986310720444, -0.025199849158525467, -0.006541375070810318, -0.02728954330086708, -0.003296421142295003, -0.04297554865479469, 0.034057725220918655, -0.004687882494181395, -0.0036099771969020367, -0.08780553936958313, 0.009155556559562683, -0.0010023294016718864, 0.02774415910243988, -0.004631862509995699, -0.007279268931597471, -0.02918975241482258, -0.003712153062224388, -0.03792746737599373, -0.5650420784950256, 0.013508680276572704, -0.0024298792704939842, 0.015889039263129234, 0.028163189068436623, 0.03778545558452606, -0.0771167129278183, -0.06340862810611725, -0.008071038872003555, 0.004512911196798086, -0.006376413628458977, -0.01028919406235218, -0.02081429585814476, -0.01969926245510578, -0.1569201797246933, -0.01672733947634697, -0.014976304024457932, 0.007762048859149218, -0.007404746487736702, -0.021160556003451347, -0.0235787071287632, 0.029093893244862556, 0.026914238929748535, -0.04203546419739723, 0.038961414247751236, -0.009364422410726547, 0.03379041701555252, 0.024466879665851593, 0.02827020175755024, -0.005467109847813845, 0.002415184397250414, -0.054464586079120636, -0.02347753196954727, 0.02170185185968876, 0.016154969111084938, -0.033345963805913925, 0.0019057588651776314, 0.010754571296274662, -0.00932245422154665, -0.016279911622405052, 0.018302438780665398, 0.08308511227369308, 0.013215183280408382, 0.015388457104563713, 0.04161212965846062, -0.029339253902435303, 0.012703350745141506, 0.012687967158854008, 0.00866498053073883, 0.020437579602003098, -0.03952867165207863, 0.009264471009373665, -0.03575712814927101, -0.04759451374411583, -0.022650357335805893, -0.027489682659506798, -0.026833469048142433, 0.0006469027139246464, -0.01192670501768589, -0.0025340707506984472, -0.007542602717876434, -0.01885092258453369, -0.04053141176700592, 0.03257134556770325, 0.015091324225068092, 0.0010406805668026209, -0.011558889411389828, -0.020946569740772247, -0.09532541036605835, -0.021733267232775688, 0.0006442987942136824, 0.020605307072401047, 0.004987041931599379, -0.039728306233882904, 0.007433115970343351, 0.017433393746614456, -0.028461165726184845, 0.004940371494740248, -0.0328793078660965, 0.028203774243593216, -0.004696873482316732, -0.027038710191845894, -0.025803320109844208, 0.03320081904530525, -0.06735223531723022, 0.01811094768345356, -0.05713261663913727, -0.028865918517112732, 0.058070797473192215, 0.056566592305898666, -0.02175401709973812, -0.01618358865380287, 0.01791958510875702, -5.186162889003754e-05, 0.009195546619594097, 0.017513664439320564, 0.007732401601970196, -0.0020104479044675827, 0.020805148407816887, -0.024569503962993622, -0.016864849254488945, -0.014974157325923443, 0.003914309665560722, -0.04466643184423447, 0.00899122841656208, -0.017651183530688286, 0.056796833872795105, -0.0337398424744606, -0.0017351113492622972, -0.044172514230012894, -0.03159934654831886, 0.04277346283197403, -0.013702698051929474, -0.01456027664244175, 0.0041489670984447, 0.009964744560420513, -0.0038641050923615694, 0.057639967650175095, -0.05727732554078102, 0.07066282629966736, -0.010417753830552101, -0.01430483814328909, 0.011947311460971832, 0.005154249258339405, 0.06136038899421692, 0.011338855139911175, 0.032755833119153976, -0.003480845596641302, 0.06973286718130112, 0.05751064792275429, -0.01112721860408783, -0.017999544739723206, 0.03769925236701965, -0.01758667826652527, -0.0239375289529562, -0.04271187260746956, 0.04440814256668091, -0.005220634397119284, -0.04935884475708008, 0.008005009032785892, 0.005926741287112236, -0.003620302537456155, 0.04226060211658478, -0.06307903677225113, 0.034324321895837784, -0.0119283776730299, 0.014605225063860416, 0.03397749736905098, -0.01358829252421856, 0.01393557246774435, 0.010357892140746117, -0.002070157090201974, -0.009109987877309322, 0.017660802230238914, 0.04691556468605995, 0.03301352635025978, -0.07136266678571701, 0.008276447653770447, -0.019027596339583397, 0.0056512486189603806, 0.009461951442062855, 0.02103724703192711, -0.026239460334181786, 0.016266340389847755, -0.01131509430706501, -0.004372014664113522, 0.11000694334506989, 0.018635142594575882, 0.04279102385044098, 0.03369355574250221, 0.028824826702475548, 0.0597592368721962, 0.020709889009594917, -0.04666532948613167, 0.054501961916685104, 0.05796929821372032, 0.009190051816403866, -0.04523887857794762, -0.019391074776649475, 0.013167927041649818, -0.015440190210938454, 0.0239383727312088, -0.044682350009679794, 0.01796579360961914, -0.036577723920345306, 0.012768000364303589, -0.06821458041667938, -0.024206198751926422, 0.002011151285842061, 0.019172752276062965, -0.02776109240949154, -0.018956458196043968, -0.006554413121193647, 0.006124286446720362, -0.09794902801513672, -0.04755712300539017, 0.021093882620334625, -0.033522311598062515, 0.033624254167079926, -0.015212844125926495, -0.03168483451008797, -0.00384814222343266, -0.039502035826444626, -0.02646450325846672, 0.1520848423242569, 0.023188157007098198, 0.016995174810290337, 0.02431449107825756, -0.0018192460993304849, -0.04667241871356964, -0.02883812040090561, -0.030374927446246147, 0.007746283430606127, 0.0033123751636594534, -0.01999387890100479, -0.010089486837387085, 0.04200274124741554, 0.018031829968094826, -0.028687261044979095, -0.0302259624004364, 0.08298278599977493, 0.024502569809556007, -0.016178438439965248, -0.037238460034132004, 0.045610759407281876, 0.07325959950685501, -0.04270843788981438, -0.08590789139270782, 0.05494416132569313, 0.23399008810520172, -0.0362403579056263, -0.07908805459737778, 0.02183707430958748, -0.026633676141500473, -0.014780349098145962, -0.007107083685696125, -0.02457747794687748, -0.02605360746383667, 0.040233563631772995, -0.03780772164463997, 0.02853414975106716, -0.04393108934164047, -0.04846189543604851, -0.023597221821546555, -0.02050616592168808, -0.007726824842393398, 0.02574368566274643, 0.04520025849342346, -0.0008305732626467943, 0.014835783280432224, -0.013733777217566967, -0.002895730547606945, 0.014568997547030449, 0.027586830779910088, -0.044080354273319244, 0.006154354196041822, -0.03547633811831474, 0.03423557057976723, 0.03283172473311424, -0.0037125360686331987, 0.027552783489227295, -0.012804397381842136, 0.01728810928761959, 0.011527114547789097, -0.03510317578911781, -0.1283147782087326, 0.007471274118870497, 0.0036150997038930655, 0.060412172228097916, -0.02027914486825466, -0.002846138784661889, 0.014816969633102417, -0.08273712545633316, 0.007288997992873192, 0.027078446000814438, -0.10605765134096146, 0.0577266588807106, 0.0005632899701595306, 0.00042115908581763506, 0.013189938850700855, 0.023322897031903267, -0.0027487785555422306, 0.061565104871988297, -0.043341562151908875, 0.009154342114925385, 0.014431224204599857, -0.043402448296546936, -0.020215999335050583, -0.006656815763562918, -0.023224350064992905, -0.046812888234853745, 0.013114077039062977, 0.02423899993300438, 0.027078118175268173, 0.0004721869481727481, 0.009592309594154358, -0.04047154635190964, 0.006325532682240009, -0.08023026585578918, -0.030877934768795967, -0.007829890586435795, 0.013407101854681969, -0.03536887466907501, -0.04948997497558594, -0.018165959045290947, 0.03020537458360195, -0.08037274330854416, -0.03639404475688934, -0.023152366280555725, 0.00543071748688817, -0.018135178834199905, 0.006881864741444588, 0.012400077655911446, 0.010877380147576332, -0.01898409239947796, 0.019146272912621498, 0.007152961101382971, -0.023664934560656548, 0.05444513261318207, -0.01503096055239439, 0.009938299655914307, 0.029304463416337967, -0.034972917288541794, 0.03944072127342224, 0.0687517449259758, 0.011553064920008183, -0.022196117788553238, 0.05666553974151611, -0.027761831879615784, -0.03991503641009331, 0.01178001333028078, -0.010489520616829395, 0.012624463066458702, -0.06366203725337982, 0.018432026728987694, 0.026364518329501152, 0.015139355324208736, -0.02208300307393074, -0.03117220290005207, 0.007969613187015057, 0.07424578070640564, 0.00826232973486185, -0.0528787225484848, -0.022009586915373802, -0.04078235849738121, 0.027699341997504234, -0.013323717750608921, -0.0323159396648407, -0.009530778974294662, 0.0044016544707119465, -0.036210283637046814, -0.006198304705321789, -0.07599236071109772, -0.025703977793455124, 0.0028761618304997683, 0.01331799291074276, -0.026178402826189995, 0.046747565269470215, 0.00023596780374646187, -0.012970581650733948, 0.03259330242872238, -0.06723226606845856, 0.027018921449780464, -0.03106733411550522, 0.1069951206445694, 0.00932501070201397, -0.017127685248851776, -0.046072136610746384, -0.03281452879309654, 0.026592057198286057, -0.0038855154998600483, 0.0035914520267397165, 0.04523254185914993, -0.004822430666536093, -0.017117004841566086, 0.019583728164434433, 0.009458678774535656, 0.011064590886235237, 0.03611619397997856, -0.0022815812844783068, 0.002484476426616311, -0.03416146710515022, -0.0474250465631485, -0.02199794165790081, 0.009495994076132774, 0.004004388581961393, -0.010845858603715897, 0.0011071381159126759, -0.011409355327486992, -0.05211423337459564, 0.004922054708003998, 0.026889408007264137, 0.001734543009661138, -0.012392460368573666, -0.05105391889810562, 0.0233172494918108, 0.014742778614163399, 0.018863392993807793, -0.04740092530846596, 0.010716937482357025, 0.04018447548151016, -0.07057835906744003, 0.022091465070843697, -0.010946854948997498, 0.031935855746269226, -0.013349806889891624, 0.010553807020187378, -0.023207057267427444, 0.021696588024497032, 0.0041603827849030495, 0.013893529772758484, 0.026358013972640038, 0.006186945363879204, 0.014761964790523052, 0.017871731892228127, 0.018083106726408005, -0.0020121911074966192, 0.05426529794931412, -0.06516410410404205, -0.0015352024929597974]" ./train/brain_coral/n01917289_4069.JPEG,brain_coral,"[0.042633119970560074, -0.011637305840849876, 0.001577759045176208, -0.02126309648156166, -0.10066644102334976, -0.017439862713217735, -0.012602720409631729, -0.03824217617511749, 0.06866492331027985, -0.02887042984366417, -0.009532236494123936, 0.06437459588050842, -0.04043206572532654, -0.03285113349556923, -0.02494126744568348, -0.04610978811979294, 0.0260145403444767, 0.05312716215848923, -0.027951376512646675, 0.0018975241109728813, -0.08103097230195999, -0.02074780873954296, -0.0069478582590818405, -0.0789380595088005, 0.028471792116761208, -0.01131110917776823, -0.04096497967839241, -0.011820518411695957, 0.02268267050385475, 0.025878528133034706, -0.00893686804920435, -0.01855858974158764, -0.0002677476149983704, -0.040783606469631195, -0.027819087728857994, -0.016500450670719147, -0.0235583633184433, -0.042161233723163605, 0.0033181956969201565, 0.15810352563858032, 0.023789871484041214, -0.005986896809190512, -0.04107551649212837, 0.0020081661641597748, -0.009589598514139652, -0.1453312337398529, -0.008861650712788105, 0.05269535258412361, -0.011903198435902596, -0.005786715541034937, -0.024675589054822922, -0.048207562416791916, -0.02809864841401577, -0.04877757653594017, -0.08856932818889618, 0.005054723005741835, -0.08385153859853745, -0.028701534494757652, 0.011950436048209667, -0.02893739379942417, 0.08190025389194489, -0.02168133109807968, -0.008330726996064186, -0.019133880734443665, -0.020853107795119286, 0.020331449806690216, 0.013195441104471684, 0.06283964961767197, 0.0699542909860611, -0.00598469004034996, 0.011392030864953995, -0.07258408516645432, 0.005193233489990234, -0.0661529004573822, 0.016532758250832558, 0.03894522413611412, -0.045647792518138885, 0.03769368678331375, 0.03726399317383766, -0.02868388034403324, -0.010103016160428524, 0.03502805158495903, -0.0048889718018472195, 0.015988385304808617, 0.0091475835070014, -0.0030842451378703117, 0.10481967777013779, -0.022069478407502174, 0.0012704703258350492, 0.04624871909618378, 0.019967013970017433, -0.032707154750823975, -0.35496512055397034, -0.02828080952167511, -0.02882608398795128, 0.024996411055326462, 0.015954338014125824, -0.01732284389436245, -0.08246905356645584, 0.005553090013563633, -0.00705288490280509, 0.024926356971263885, -0.07794877886772156, 0.00977973360568285, -0.03876177594065666, 0.01515637245029211, -0.13701121509075165, 0.019092822447419167, -0.031897202134132385, 0.028583383187651634, 0.04187915474176407, -0.026951387524604797, -0.015592475421726704, 0.014777359552681446, 0.004459337797015905, -0.03277938440442085, 0.0549328476190567, -0.04924647882580757, -0.01669657602906227, 0.08712105453014374, 0.037589602172374725, -0.026198411360383034, -0.04650668427348137, 0.0044487579725682735, -0.0325431302189827, 0.02110130526125431, 0.023249274119734764, 0.01068431232124567, 0.022855492308735847, -0.018918534740805626, -0.02111922949552536, -0.01980370096862316, 0.014707624912261963, 0.05745202302932739, -0.02113228850066662, 0.014993724413216114, 0.01593426987528801, -0.012614424340426922, 0.021386906504631042, -0.025792323052883148, 0.032228920608758926, 0.021719135344028473, -0.06279725581407547, -0.0022402447648346424, 0.013266121968626976, 0.003147857030853629, -0.021470820531249046, -0.026341954246163368, 0.00018200169142801315, 0.04928131774067879, -0.017496535554528236, 0.007159180007874966, -0.04352954402565956, 0.02018442191183567, -0.04914068058133125, 0.026493633165955544, 0.03746512532234192, 0.004821633920073509, 0.03115643747150898, 0.01260236743837595, -0.022269072011113167, -0.0015207842225208879, -0.03519642725586891, 0.016927672550082207, -0.002786792116239667, -0.0015364584978669882, -0.007938945665955544, 0.052821215242147446, 0.001905888319015503, -0.007046045269817114, -0.0017779201734811068, 0.03493361920118332, 0.028692476451396942, 0.014876256696879864, -0.0032811560668051243, 0.043478526175022125, -0.11563587188720703, 0.022541336715221405, -0.00034125117235817015, 0.0017052650218829513, 0.017870686948299408, -0.007252580486238003, -0.01855587400496006, 0.02569252997636795, 2.990549364767503e-05, 0.008197109214961529, 0.010544958524405956, -0.019656924530863762, 0.08266706764698029, 0.005614821799099445, 0.01243016216903925, 0.0002620462328195572, 0.07125052809715271, -0.04865465685725212, 0.09653236716985703, -0.05659308657050133, 0.040247928351163864, 0.0021101017482578754, 0.03570326045155525, -0.0043679517693817616, -0.008795936591923237, -0.011232520453631878, 0.020619582384824753, 0.06001489609479904, -0.007033577188849449, 0.023332715034484863, 0.04108329862356186, 0.000689851411152631, 0.0006808520993217826, -0.038979239761829376, -0.027291249483823776, 0.026737280189990997, -0.06220642849802971, -0.06492330133914948, 0.05893367901444435, 0.07870671898126602, 0.04470879212021828, -0.033324506133794785, 0.0059449984692037106, -0.0036222978960722685, 0.05722357705235481, 0.012298491783440113, -0.02533920854330063, -0.007417258806526661, 0.057566430419683456, -0.055558133870363235, 0.015167774632573128, 0.00411220220848918, 0.009990490972995758, 0.04995088651776314, -0.02853059023618698, -0.03693598136305809, 0.03230192884802818, -0.02819240093231201, -0.009017102420330048, -0.045262064784765244, -0.0008874559425748885, -0.03450155258178711, 0.04000449180603027, 0.05720837041735649, -0.011228244751691818, 0.010235226713120937, 0.01342642679810524, -0.008221047930419445, -0.0010613109916448593, -0.043630871921777725, -0.01838909089565277, 0.04917406663298607, -0.01021258719265461, 0.02171163633465767, 0.034282732754945755, 0.0003765280998777598, 0.03634874150156975, 0.05077454820275307, -0.029088767245411873, 0.03150409087538719, 0.031319014728069305, 0.01945449411869049, 0.17037101089954376, 0.018718795850872993, 0.03711019456386566, -0.014117758721113205, 0.01254891138523817, 0.03893648087978363, -0.03702308610081673, -0.03273491561412811, 0.07073646038770676, 0.0661030113697052, -0.03216368332505226, -0.03758575767278671, -0.023418504744768143, -0.006190493702888489, -0.06279648095369339, 0.01049384567886591, 0.0037989714182913303, -0.026777787134051323, -0.07354382425546646, 0.052022650837898254, -0.019008105620741844, -0.05191332474350929, 0.022012723609805107, 0.02191483974456787, -0.00871208868920803, 0.012534418143332005, 0.03365426883101463, 0.00967981107532978, -0.0005028421874158084, -0.08179924637079239, 0.018887819722294807, -0.01609490066766739, -0.01851542480289936, 0.0059799677692353725, 0.006992778740823269, -0.004087565932422876, 0.010586661286652088, -0.025428589433431625, 0.07280213385820389, 0.029383912682533264, 0.06656445562839508, 0.020093098282814026, -0.0338284857571125, -0.04953955486416817, -0.022417251020669937, 0.037893373519182205, 0.011458292603492737, 0.07628250867128372, 0.01811091974377632, 0.03749501705169678, 0.039837174117565155, -0.010074332356452942, 0.024822885170578957, -0.033570803701877594, 0.057163823395967484, -0.022154485806822777, -0.014580556191504002, 0.025779038667678833, -0.01825452409684658, 0.03718128800392151, -0.06907576322555542, 0.028523145243525505, 0.008610176853835583, 0.32167184352874756, -0.04789632931351662, -0.10204025357961655, 0.04142257198691368, -0.0046652257442474365, 0.03139254450798035, -0.021322090178728104, -0.0013705501332879066, -0.10961299389600754, -0.009089904837310314, -0.052777841687202454, 0.0455404594540596, -0.00789988785982132, -0.03155192732810974, 0.0022094815503805876, 0.019548669457435608, -0.03791487589478493, -0.021776624023914337, 0.05369296297430992, 0.014988741837441921, 0.04138905927538872, -0.012923793867230415, -0.029050741344690323, 0.0005422068643383682, 0.004383563995361328, -0.01695706881582737, 0.04173004999756813, -0.002592354081571102, 0.014309629797935486, 0.04789451137185097, 0.05476246774196625, -0.0041035814210772514, 0.06078684329986572, -0.0288777407258749, -0.059161700308322906, 0.0006219827337190509, -0.08374065160751343, 0.06100408360362053, 0.02687947452068329, 0.028356555849313736, -0.0019835704006254673, 0.008933484554290771, -0.009248657152056694, -0.017119500786066055, 0.010469603352248669, -0.0024410004261881113, -0.08770409226417542, -0.015401163138449192, 0.019047504290938377, 0.0005558657576330006, 0.01386653259396553, 0.01665668748319149, -0.004311281256377697, 0.05692737549543381, 0.0778505951166153, 0.017782045528292656, 0.016932852566242218, -0.038518425077199936, -0.04965285211801529, -0.022250810638070107, -0.0505218468606472, 0.016290124505758286, 0.0019900701008737087, 0.01088288240134716, 0.05978528782725334, 0.028483090922236443, -0.01824037730693817, -0.040094900876283646, -0.0912097841501236, -0.03188856691122055, -0.006062565371394157, 0.01684321090579033, 0.011944591999053955, -0.002026753965765238, 0.004576473496854305, 0.03520330414175987, 0.01654430665075779, -0.09287013113498688, 0.05416078120470047, -0.01718628779053688, -0.035735584795475006, -0.042013708502054214, -0.01209487859159708, -0.021578002721071243, 0.005507209803909063, -0.010307978838682175, 0.05937297269701958, 0.00018334270862396806, -0.029912099242210388, 0.08139053732156754, -0.014952074736356735, -0.03439927473664284, -0.06900817155838013, 0.01886797696352005, -0.044651493430137634, 0.026170754805207253, 0.062080103904008865, -0.020818151533603668, -0.003637271700426936, 0.010228910483419895, -0.009077729657292366, 0.026567330583930016, -0.04372530058026314, 0.017110565677285194, -0.026381714269518852, 0.08178842812776566, 0.030685419216752052, 0.08196902275085449, -0.06648984551429749, -0.01698792353272438, -0.024228312075138092, 0.006012937519699335, 9.78800599114038e-05, -0.043664418160915375, 0.039412301033735275, -0.008604461327195168, 0.011646564118564129, 0.009141498245298862, 0.0053284307941794395, -0.03781129792332649, -0.06485823541879654, -0.03609594702720642, -0.031018249690532684, -0.015889747068285942, -0.027613431215286255, 0.008679094724357128, 0.001823322381824255, 0.015281891450285912, 0.014617832377552986, -0.013812302611768246, -0.10413755476474762, -0.03283795341849327, -0.051696937531232834, 0.0368085578083992, -0.10400282591581345, -0.042197518050670624, 0.031277451664209366, 0.00024479060084559023, -0.02885770983994007, -0.003628112841397524, 0.034243084490299225, 0.00769288744777441, -0.046617291867733, -0.0019087055698037148, -0.02203192189335823, 0.00600383710116148, 0.004343471489846706, 0.02669275738298893, -0.03463995084166527, -0.013423576019704342, -0.016486365348100662, 0.00249235681258142, -0.023010289296507835, -0.04296398162841797, -0.04238417372107506, -0.0399908646941185, 0.027545172721147537, -0.029670240357518196, -0.0024297924246639013, 0.003442301880568266, -0.044205084443092346, -0.011641417630016804, 8.514880028087646e-05, -0.011606075800955296, 0.00042916537495329976, -0.0148209473118186, -1.3483437214745209e-05, -0.011434992775321007, 0.025360899046063423, -0.026832284405827522, -0.014820276759564877, 0.02586226910352707, -0.026398159563541412, 0.033623069524765015, -0.05200781673192978, 0.016690997406840324, -0.023114530369639397, 0.008795893751084805, 0.025785274803638458, -0.0026709313970059156, -0.038993485271930695, -0.06336726993322372, 0.007270248606801033, 0.06703818589448929, -0.011703487485647202, 0.039650365710258484, -0.01744360662996769, 0.02124916762113571, 0.03405960649251938, 0.006768384482711554, -0.03160915896296501]" ./train/brain_coral/n01917289_4021.JPEG,brain_coral,"[0.020552314817905426, 0.009100654162466526, 0.021495038643479347, 0.007343200035393238, -0.05506056919693947, -0.05225171893835068, -0.012782135047018528, -0.030221477150917053, 0.04626089334487915, -0.0023178060073405504, -0.036780085414648056, 0.030599122866988182, 0.020002590492367744, 0.022765258327126503, -0.02952764555811882, -0.05623020604252815, 0.015582757070660591, 0.07937750965356827, -0.020113417878746986, -0.033721230924129486, -0.03736376389861107, -0.009205921553075314, -0.03590742126107216, -0.057003602385520935, -0.0038851704448461533, -0.00988792534917593, -0.04536949470639229, -0.010367185808718204, -0.0015644681407138705, 0.033918820321559906, -0.018410874530673027, 0.0032559167593717575, 0.00672817463055253, -0.03795991465449333, 0.00450713699683547, -0.01185352262109518, -0.027655478566884995, -0.026450982317328453, -0.0007222761632874608, 0.13211272656917572, 0.0501101091504097, 0.0009380182600580156, -0.04357856884598732, 0.003750912845134735, 0.004911778960376978, -0.1411539614200592, 0.0236312597990036, 0.045586809515953064, 0.002903339685872197, -0.0026154560036957264, -0.027881931513547897, -0.02457232028245926, -0.03285575658082962, -0.04675951227545738, -0.08303578197956085, 0.035731274634599686, -0.03361017256975174, -0.0034553254954516888, 0.002157712122425437, -0.05786298215389252, 0.09413614869117737, -0.021385131403803825, 0.0047635966911911964, -0.025690991431474686, -0.03841753676533699, 0.01725125126540661, -0.014082709327340126, 0.12463295459747314, 0.03084591031074524, -0.00501847080886364, 0.0037024174816906452, -0.048589181154966354, -0.03405873849987984, -0.06782842427492142, -0.007595343515276909, 0.03898844122886658, -0.015384584665298462, 0.009851687587797642, 0.011337690986692905, -0.042824886739254, 0.0004539442015811801, 0.01021724846214056, -0.012158917263150215, -0.013763421215116978, 0.0415014773607254, 0.0006798969116061926, 0.12182028591632843, -0.03658901900053024, -0.012885432690382004, 0.02668295055627823, 0.01934235356748104, -0.043293047696352005, -0.48791131377220154, -0.001604630844667554, -0.020180782303214073, 0.03434782102704048, 0.015575929544866085, -0.023456653580069542, -0.04689386114478111, -0.014233849011361599, 0.005725625436753035, 0.017000867053866386, -0.060353267937898636, 0.01222850289195776, 0.0017455569468438625, 0.006965167820453644, -0.16365216672420502, -0.0035775532014667988, -0.032393842935562134, 0.032648127526044846, 0.03042314201593399, -0.033505987375974655, -0.03346153721213341, -0.007314019370824099, -0.004853290971368551, -0.025392556563019753, 0.0342327356338501, -0.024983637034893036, 0.023752912878990173, 0.051867760717868805, 0.004737557843327522, -0.029439233243465424, -0.056575413793325424, -0.009744394570589066, -0.023020707070827484, 0.008900230750441551, 0.026967812329530716, 0.02290983684360981, 0.009385790675878525, 0.018832625821232796, -0.009078610688447952, -0.017048310488462448, -0.011761155910789967, 0.06998301297426224, 0.0031743491999804974, 0.00889327097684145, -0.006251743994653225, -0.03389891982078552, 0.013171285390853882, -0.020130803808569908, 0.025293942540884018, 0.008405722677707672, -0.06259133666753769, 0.0007075231405906379, -0.011765262112021446, 0.004881270695477724, -0.02915618009865284, -0.0065020909532904625, -0.02276846207678318, 0.04021059349179268, -0.003991874400526285, -0.03158946707844734, -0.03352376073598862, -0.006043367087841034, -0.03492608293890953, 0.008679880760610104, 0.05111129954457283, -0.013610213994979858, 0.014014367014169693, 0.031410057097673416, -0.033668484538793564, -0.04430726543068886, 0.003605602076277137, 0.027853447943925858, -0.0025830871891230345, -0.02174198627471924, 0.026193086057901382, 0.04869266599416733, 0.006609227973967791, 0.010744900442659855, 0.006992122624069452, 0.006800055969506502, 0.013197560794651508, -0.018360471352934837, -0.013353940099477768, 0.04753561317920685, -0.06824622303247452, 0.015146227553486824, -0.03460170701146126, 0.006351021118462086, 0.06078460067510605, -0.011018048040568829, 0.02325531281530857, 0.02509080059826374, 0.010706057772040367, 0.005578962620347738, 0.01124479342252016, -0.044449176639318466, 0.046202290803194046, 0.006970119196921587, 0.01584518887102604, -0.01529585849493742, 0.06792546063661575, -0.007099741604179144, 0.035851381719112396, -0.05363215506076813, 0.02983637899160385, 0.01289396919310093, 0.028919413685798645, -0.02260209433734417, 0.013704321347177029, -0.036039143800735474, -0.008641553111374378, 0.054070502519607544, 0.023708347231149673, 0.00978647917509079, 0.05171544849872589, -0.023844121024012566, 0.01911615952849388, -0.0019185153068974614, -0.03349076956510544, 0.06694098562002182, -0.03911600261926651, 0.008008758537471294, 0.08922755718231201, 0.05394275486469269, 0.06999286264181137, -0.031856488436460495, 0.011726542375981808, -0.018544498831033707, 0.05931875482201576, 0.019893398508429527, -0.039749037474393845, -0.0069061871618032455, 0.04848551005125046, -0.02157731167972088, -0.001919604022987187, 0.06373646855354309, -0.0153911542147398, 0.02704177238047123, -0.0018903776071965694, -0.018032191321253777, 0.019877655431628227, -0.036349546164274216, 0.0037054731510579586, -0.066560760140419, -0.017516588792204857, -0.0364111103117466, 0.02694925107061863, 0.0035725985653698444, 0.01759827323257923, 0.009758556261658669, 0.051677852869033813, 0.011933522298932076, 0.005666738376021385, -0.012067824602127075, -0.012734193354845047, 0.05271172150969505, -0.03795216232538223, 0.018953029066324234, 0.02747037075459957, 0.015504499897360802, 0.0392509326338768, 0.03190523013472557, -0.0347801148891449, 0.04495678097009659, 0.020274482667446136, 0.0025594299659132957, 0.17184442281723022, 0.020068306475877762, 0.05424225330352783, -0.016139468178153038, -0.025038275867700577, -0.009093771688640118, -0.04646507650613785, -0.03621595352888107, 0.0502355694770813, 0.03181840479373932, -0.04079964756965637, -0.06661824882030487, -0.009228221140801907, 0.01254364661872387, -0.019391309469938278, 0.02989916503429413, 0.015525220893323421, -0.01335892640054226, -0.05625870078802109, 0.014343406073749065, -0.06407185643911362, -0.03864108398556709, 0.033851027488708496, 0.02467566728591919, -0.02594325877726078, 0.01782987080514431, -0.0002451987820677459, -0.0019104690290987492, 0.010846464894711971, -0.056570716202259064, -0.0011009544832631946, -0.050281718373298645, -0.008535720407962799, -0.027774851769208908, 0.006132822018116713, 0.004774153232574463, 0.003034666646271944, -0.001988094300031662, 0.11248832941055298, 0.017619039863348007, 0.047302644699811935, 0.03963671997189522, -0.04850931465625763, -0.053570590913295746, -0.011707932688295841, 0.03433166816830635, 0.024890964850783348, -0.004456370137631893, -0.0012119659222662449, 0.04634273424744606, 0.04227796941995621, 0.013309948146343231, 0.018646378070116043, -0.007859408855438232, 0.06979319453239441, 0.01572079211473465, 0.006729596760123968, 0.0025477400049567223, 0.002910506445914507, 0.042080704122781754, -0.05218107998371124, 0.00221493118442595, 0.0291438065469265, 0.2585635781288147, -0.060790110379457474, -0.07567021250724792, 0.026913587003946304, -0.008086437359452248, 0.0005582098965533078, -0.022416556254029274, -0.004131191410124302, -0.0437636561691761, -0.013194585219025612, -0.045236051082611084, 0.06153884157538414, -0.042081110179424286, -0.04235336184501648, -0.021809164434671402, -0.004932137206196785, -0.006476935464888811, -0.04083380475640297, 0.023301418870687485, -0.00559456879273057, -0.011785589158535004, -0.014412976801395416, -0.017869267612695694, 0.014362159185111523, 0.001797525561414659, -0.02599283494055271, 0.04248669371008873, -0.01614140160381794, 0.026087794452905655, 0.06253690272569656, 0.011459993198513985, 0.015238859690725803, 0.03922314941883087, -0.017794618383049965, -0.01180789154022932, 0.020381174981594086, -0.06625638157129288, 0.04430697485804558, 0.013854341581463814, 0.05583713948726654, -0.01700977049767971, 0.02709796279668808, -0.007816128432750702, -0.07631780207157135, 0.03180366009473801, -0.022502562031149864, -0.13362032175064087, -0.024862583726644516, 0.00946804229170084, -0.010263191536068916, 0.04845162108540535, 0.002447080099955201, 0.03227870911359787, 0.05611315742135048, 0.054666657000780106, 0.06936167925596237, 0.026381686329841614, -0.09161580353975296, -0.017095012590289116, -0.013147672638297081, -0.023986946791410446, -0.022738881409168243, 0.0028973270673304796, 0.006724607665091753, 0.01617249846458435, 0.036556027829647064, -0.018623637035489082, -0.05424979701638222, -0.05921994149684906, -0.03932136297225952, -0.011230305768549442, -0.0005813464522361755, 0.04345778375864029, -0.010528629645705223, -0.03638523444533348, 0.03459490090608597, 0.02383424900472164, -0.08449608087539673, -0.0053688352927565575, -0.020914923399686813, -0.02517782151699066, -0.026496317237615585, -0.051913682371377945, 0.009270966053009033, -0.021432451903820038, -0.0007951405132189393, 0.08513104170560837, 0.020178547129034996, -0.05280827730894089, 0.09082383662462234, -0.014021683484315872, -0.020903892815113068, -0.018942302092909813, -0.035491202026605606, -0.02748679183423519, 0.03979859501123428, 0.03293074294924736, -0.046633895486593246, -0.014024706557393074, -0.012447510845959187, 0.02092829905450344, 0.035760682076215744, -0.03675442188978195, 0.019787631928920746, -0.009908205829560757, 0.027223479002714157, 0.044562604278326035, 0.003619532100856304, -0.016445882618427277, -0.02181071788072586, -0.05544009059667587, 0.031195804476737976, -0.020143480971455574, -0.03877340629696846, 0.012132077477872372, -0.008765468373894691, -0.014278644695878029, -0.008823608048260212, -0.0032519849482923746, -0.038278281688690186, -0.020129842683672905, -0.025829721242189407, -0.021241778507828712, -0.002121365861967206, -0.026325354352593422, 0.047344375401735306, -0.0421372689306736, 0.01600232534110546, 0.057067081332206726, -0.01127244159579277, -0.06658296287059784, -0.041903380304574966, -0.04251778498291969, 0.025677984580397606, -0.04243725165724754, -0.013859976083040237, 0.041000522673130035, 0.008455348201096058, -0.028545809909701347, -0.028292110189795494, 0.025107048451900482, 0.005931340157985687, -0.06556035578250885, 0.032951850444078445, 0.008767074905335903, 0.002279972657561302, -0.010049363598227501, -0.0015812581405043602, -0.04513376206159592, -0.027004530653357506, -0.03412441164255142, 0.001190095441415906, -0.04634102061390877, -0.033354632556438446, -0.028911741450428963, -0.012228211387991905, 0.025707954540848732, -0.03915504366159439, -0.0020516403019428253, -0.037673305720090866, -0.03239461034536362, 0.02625260129570961, 0.011062073521316051, -0.00641865748912096, 0.037495870143175125, -0.02691946178674698, -0.008637048304080963, -0.05653204396367073, 0.03424759581685066, -0.028560398146510124, -0.016805686056613922, 0.03201742842793465, -0.045412857085466385, 0.04028794914484024, -0.02045900747179985, 0.0289077777415514, 0.004340304061770439, 0.009779359214007854, 0.038250427693128586, -0.03396346792578697, -0.023223059251904488, -0.08410054445266724, -0.011609402485191822, 0.03927300497889519, -0.02436044067144394, 0.03001357987523079, -0.02986067719757557, -0.0025063336361199617, 0.052372340112924576, 0.024131255224347115, -0.0008719706675037742]" ./train/brain_coral/n01917289_1022.JPEG,brain_coral,"[0.02037084847688675, -0.007647702470421791, 0.017677675932645798, -0.01982281170785427, -0.031470656394958496, -0.009951162151992321, -0.028087854385375977, 0.03742925077676773, 0.004077325575053692, -0.016604822129011154, -0.04165179654955864, 0.004211266990751028, -0.05196744203567505, 0.02866896241903305, 0.00565241789445281, 0.013383464887738228, 0.0684722512960434, 0.03683677315711975, 0.009442408569157124, 0.024637971073389053, -0.076491579413414, -0.00635487399995327, -0.01284330990165472, -0.040327053517103195, 0.024514926597476006, -0.025455353781580925, 0.02314496971666813, 0.009746260941028595, -0.01856720633804798, -0.02242572046816349, 0.012313669547438622, -0.013074382208287716, 0.018463116139173508, -0.03200918808579445, 0.02289826236665249, -0.02458048239350319, -0.015308352187275887, 0.0037793528754264116, 0.02336074411869049, -0.1360211968421936, 0.008292454294860363, -0.006820224691182375, -0.01625991053879261, 0.01995035819709301, -0.0058448235504329205, -0.0645279809832573, -0.05392957106232643, 0.04463944956660271, -0.01005280390381813, -0.00676585640758276, -0.01302989199757576, -0.0038970436435192823, 0.018380289897322655, -0.048983607441186905, -0.006235363893210888, 0.030351122841238976, -0.023977385833859444, -0.01639559306204319, -0.03145437315106392, -0.04262889549136162, 0.1035747155547142, -0.015882980078458786, 0.023563632741570473, 0.01140834204852581, -0.051986683160066605, 0.011302386410534382, 0.012538124807178974, 0.017992934212088585, 0.009629642590880394, -0.00019055692246183753, 0.0010566803393885493, 0.014776045456528664, -0.03752637282013893, 0.0009704964468255639, -0.016268722712993622, -0.03474091365933418, -0.054111603647470474, 0.03740173578262329, 0.03663189336657524, -0.0017044697888195515, 0.011407273821532726, 0.0013591520255431533, 0.0030082690063863993, -0.05595783516764641, -0.01578233577311039, -0.010928710922598839, 0.18313263356685638, -0.008886258117854595, 0.04225221276283264, 0.008006257005035877, 0.02709590084850788, -0.029126470908522606, -0.6460835337638855, -0.015223103575408459, 0.0009798260871320963, 0.019297076389193535, 0.03076152130961418, -0.03233681246638298, -0.0721113309264183, -0.034244731068611145, -0.010595201514661312, -0.007888752035796642, 0.02133561670780182, 0.015797054395079613, 0.03474101796746254, -0.06119845062494278, -0.09044528007507324, 0.015781033784151077, -0.02356201969087124, 0.013519367203116417, -0.017127137631177902, -0.03943488374352455, -0.017545679584145546, 0.025736218318343163, 0.02043882943689823, -0.011809251271188259, 0.0753609910607338, -0.02062622830271721, 0.01934674195945263, 0.01303917821496725, -0.05856733024120331, -0.04442792385816574, -0.031501878052949905, 0.0305331964045763, -0.013515690341591835, -0.008925353176891804, -0.027320748195052147, -0.03843243047595024, -0.016616204753518105, 0.0046499669551849365, 0.057902127504348755, -0.02768799103796482, -0.02107084169983864, 0.0885978564620018, 0.00776210380718112, 0.013758896850049496, 0.005713246297091246, -0.08566942811012268, 0.004418277647346258, -0.03681830316781998, -0.01914139837026596, -0.010757794603705406, -0.07240185141563416, 0.01746966317296028, -0.023758461698889732, 0.019379669800400734, 0.003835073672235012, 0.03287187218666077, 0.03338555991649628, -0.021241674199700356, -0.06971564888954163, -0.023354249075055122, -0.02759484201669693, -0.0004848384123761207, -0.014013845473527908, 0.01385558396577835, 0.009719117544591427, 0.0016198217635974288, 0.007001939695328474, -0.01420613657683134, -0.017190556973218918, 0.0059104012325406075, -0.00024916944676078856, -0.008077244274318218, 0.0015224508242681623, 0.02158779464662075, -0.06532274931669235, -0.02704496495425701, 0.02917632833123207, 0.004086628556251526, -0.031218884512782097, -0.018935665488243103, -0.0047047375701367855, 0.02567100152373314, 0.00162324751727283, -0.009332370944321156, -0.10299865156412125, 0.018528657034039497, -0.0370611734688282, -0.04562551528215408, -0.05204426124691963, 0.016883350908756256, -0.03395063802599907, -0.007542254403233528, -0.02645343542098999, -0.019386935979127884, 0.004902759101241827, 0.02620251290500164, 0.017156722024083138, 0.037813544273376465, 0.03866570442914963, -0.02343042939901352, 0.02339642308652401, -0.04020160064101219, 0.050534430891275406, -0.0030594116542488337, -0.021370887756347656, -0.026088105514645576, 0.019763421267271042, -0.026216158643364906, -0.0013261805288493633, -0.03914486989378929, 0.010861015878617764, -0.009527212008833885, 0.011170407757163048, -0.009714876301586628, 0.04073202982544899, -0.009883183985948563, 0.02990669757127762, -0.017429526895284653, -0.049027133733034134, 0.07180216908454895, -0.044411372393369675, -0.07158669084310532, 0.01892198622226715, 0.02815139852464199, 0.01911904476583004, -0.012741160579025745, -0.053235601633787155, 0.015274986624717712, 0.06300712376832962, 0.03491926193237305, -0.0014238858129829168, -0.02288796938955784, -0.005570374429225922, -0.04586666449904442, 0.028894789516925812, -0.011193742044270039, -0.025452740490436554, 0.011036071926355362, -0.04153155907988548, -0.010964496061205864, 0.033902380615472794, 0.035685811191797256, -0.03216027840971947, 0.07520609349012375, -0.007231970317661762, 0.009580692276358604, -0.015922773629426956, -0.010483331978321075, -0.009293549694120884, 0.027101976796984673, 0.020161563530564308, 0.008602623827755451, 0.01645796187222004, -0.033684659749269485, -0.009764332324266434, 0.03434626758098602, 0.018056754022836685, -0.06303508579730988, -0.008170678280293941, -0.021716218441724777, 0.0213270615786314, 0.02122725173830986, -0.003826064756140113, 0.028074949979782104, 0.02353779599070549, -0.021862344816327095, 0.061896633356809616, -0.03325090557336807, 0.02895769104361534, -0.011332357302308083, -0.018502358347177505, 0.023195581510663033, 0.030674545094370842, 0.025896262377500534, 0.015493570826947689, -0.08150233328342438, -0.045701634138822556, 0.013931389898061752, -0.012169234454631805, 0.007792777847498655, 0.023420555517077446, -0.03503384068608284, -0.0453948900103569, -0.009627888910472393, -0.0022122433874756098, 0.013761892914772034, -0.042504649609327316, -0.020845256745815277, 0.022145964205265045, 0.02392849698662758, 0.03791056573390961, 0.006838702131062746, -0.006891957018524408, 0.01693321019411087, -0.07882440835237503, -0.03929014131426811, 0.010126943700015545, 0.03183543682098389, -0.00041070874431170523, 0.003420458408072591, 0.0030101719312369823, 0.012878586538136005, 0.04737769439816475, -0.009390373714268208, -0.03574995696544647, -0.0319506898522377, 0.02233113907277584, -0.015271059237420559, -0.014668604359030724, -0.03306613117456436, -0.0454237200319767, 0.04765874892473221, -0.0206262469291687, -0.0036869116593152285, -0.00683649443089962, -0.009128358215093613, -0.0024109005462378263, 0.018795380368828773, 0.01911395601928234, -0.0011780213098973036, 0.08837588876485825, 0.05553848296403885, 0.038291871547698975, 0.053843818604946136, -0.024073684588074684, 0.01534148771315813, -0.027549272403120995, -0.031220687553286552, -0.0005696596344932914, 0.23783208429813385, -0.02654138021171093, -0.0031191278249025345, -0.01575394719839096, 0.02848481945693493, -0.006978889461606741, 0.0474386140704155, 0.027037017047405243, 0.03501690551638603, -0.014807400293648243, -0.01377404946833849, 0.047898873686790466, -0.024198034778237343, -0.0004384314233902842, -0.009285811334848404, 0.01240573264658451, -0.005543424282222986, -0.007209321018308401, 0.03341054171323776, -0.005210688803344965, -0.012622103095054626, -0.008226812817156315, 0.050691135227680206, -0.014239896088838577, 0.05309472233057022, 0.0037067781668156385, 0.013496561907231808, 0.004666357301175594, 0.018680253997445107, 0.03877443075180054, 0.0030893227085471153, 0.038596272468566895, 0.055235445499420166, -0.017370810732245445, -0.02011382021009922, 0.027062471956014633, -0.034474652260541916, -0.002893338445574045, 0.004125961568206549, -0.051598791033029556, 0.013296213932335377, 0.015040921978652477, -0.06258945912122726, -0.02078951895236969, -0.012393133714795113, -0.026470964774489403, -0.14409653842449188, -0.017348211258649826, 0.015581019222736359, 0.0015889343339949846, -0.002754234243184328, -0.028692156076431274, 0.010707158595323563, 0.01673886924982071, -0.0011594250099733472, 0.00962620135396719, 0.012823052704334259, -0.05210394039750099, -0.0060911402106285095, -0.03981112316250801, 0.024079395458102226, -0.026794379577040672, 0.0021759560331702232, 0.006654297932982445, 0.009596803225576878, 0.0008144596358761191, 0.02452918328344822, -0.018229585140943527, -0.037380438297986984, -0.003437913255766034, 0.01506341528147459, 0.004339974839240313, 0.000329189671901986, -0.02480258047580719, -0.021674009039998055, 0.04850572720170021, 0.009864344261586666, -0.030819116160273552, -0.003359084017574787, 0.014267480000853539, -0.017769161611795425, 0.05464820936322212, -0.03855369985103607, 0.021931495517492294, -0.016128256916999817, -0.007742365822196007, -0.019917601719498634, -0.0033625795040279627, -0.032359518110752106, -0.0025282748974859715, -0.0005751175922341645, -0.003395787440240383, -0.03560197353363037, 0.04065917804837227, 0.006000547669827938, -0.00529197882860899, 0.012782761827111244, 0.040260788053274155, 0.039029575884342194, 0.01475492399185896, -0.03823317959904671, -0.044966522604227066, -0.03615599125623703, -0.020492499694228172, -0.005815933924168348, 0.0030328689608722925, -0.004159178584814072, -0.03815891966223717, -0.022891774773597717, -0.022989092394709587, -0.011947079561650753, -0.02292742393910885, -0.006417122669517994, 0.005321265663951635, -0.01709846965968609, -0.028825528919696808, 0.04081946238875389, 0.03568217158317566, -0.010448657907545567, 0.06447219103574753, -0.07205232977867126, -0.05035123974084854, -0.04948807135224342, 0.0514952577650547, 3.182764658049564e-06, 0.03753726929426193, -0.001671434030868113, 0.014185278676450253, -0.007670554798096418, 0.00718418974429369, -0.014297664165496826, 0.014698500744998455, -0.08002962172031403, 0.025227094069123268, -0.026656636968255043, 0.021703537553548813, 0.05827191472053528, 0.012411111034452915, 0.013722407631576061, -0.017039967700839043, 0.014901946298778057, -0.005474053788930178, 0.017343951389193535, -0.000309282768284902, 0.023821350187063217, -0.0004181344120297581, -0.02479393593966961, 0.019780881702899933, 0.036770857870578766, -0.006416903343051672, -0.01912904903292656, 0.019307004287838936, -0.006168140564113855, -0.007058917079120874, 0.013506020419299603, 0.011729356832802296, -0.01566913351416588, -0.02812701277434826, 0.03515700250864029, 0.025041017681360245, -0.003951112274080515, -0.0025746654719114304, 0.008974670432507992, -0.041662219911813736, 0.002725018188357353, 0.03134843707084656, 0.031000131741166115, 0.015773063525557518, -0.005529874004423618, 0.0031584131065756083, -0.0175381638109684, 0.002649056725203991, -0.01570282131433487, -0.018325941637158394, 0.03443681821227074, 0.032416366040706635, -0.02754902094602585, 0.004701398313045502, 0.0184394009411335, 0.0027751296292990446, -0.03797201067209244, 0.008109316229820251, 0.002853680867701769, 0.030838195234537125, -0.006840870715677738, 0.013343265280127525, 0.03312103822827339, -0.010797097347676754, 0.03175454959273338, -0.028644895181059837, -0.005793408490717411]" ./train/Rhodesian_ridgeback/n02087394_6382.JPEG,Rhodesian_ridgeback,"[0.02308417297899723, -0.013243380934000015, -0.0011919172247871757, 0.025169191882014275, 0.014239191077649593, -0.0657489001750946, 0.04157138988375664, 0.06472545862197876, 0.0018119843443855643, -0.01085776649415493, -0.03395659849047661, -0.002928738249465823, 0.007339686620980501, -0.023188825696706772, 0.03630947321653366, 0.02269255369901657, 0.12181247025728226, -0.025292368605732918, 0.032340388745069504, -0.010079457424581051, -0.030457938089966774, -0.019505197182297707, 0.014523853547871113, 0.008477265015244484, -0.004381861537694931, -0.0017177934059873223, 0.03824477270245552, 0.0009682498057372868, 0.005322229117155075, 0.007173600140959024, 0.005672393832355738, 0.006073012948036194, -0.015965400263667107, 0.012695889919996262, -0.006711302325129509, 0.034853510558605194, -0.02459079958498478, -0.019755598157644272, -0.0030319762881845236, 0.14294230937957764, -0.037602830678224564, 0.02768511138856411, -0.0012277445057407022, 0.01967369206249714, -0.004233500920236111, 0.05185554921627045, -0.023571571335196495, -0.007335159927606583, 0.022079383954405785, 0.01789535954594612, -0.020326897501945496, 0.009221176616847515, 0.007814510725438595, 0.036281172186136246, 0.03746308386325836, -0.03603244200348854, 0.04464716464281082, 0.0393059104681015, 0.02384301647543907, -0.02805081009864807, 0.07112420350313187, 0.021915599703788757, 0.04489470273256302, 0.018362410366535187, -0.01032483484596014, -0.0017045268323272467, 0.019352054223418236, 0.052096229046583176, 0.015755873173475266, 0.016499994322657585, 0.044089868664741516, -0.008277129381895065, 0.04340771585702896, -0.01996210217475891, -0.047513771802186966, -0.009614044800400734, -0.02183287777006626, -0.005737907253205776, 0.011905459687113762, -0.0031244494020938873, 0.010101508349180222, -0.03803924843668938, 0.0067970035597682, -0.10000960528850555, 0.026616668328642845, -0.04641132801771164, 0.0719316229224205, -0.0065320925787091255, 0.0235440656542778, -0.019915984943509102, -0.011605681851506233, -0.03407461568713188, -0.686102569103241, 0.037870313972234726, -0.026033738628029823, -0.009214666672050953, 0.0053483047522604465, 0.008706730790436268, -0.029935194179415703, 0.10559388995170593, -0.017501777037978172, 0.0025657666847109795, 0.021034182980656624, -0.021548662334680557, 0.007231469266116619, -0.034995805472135544, 0.013639913871884346, 0.02912517450749874, 0.017743289470672607, -0.02912086993455887, 0.00758344167843461, -0.019725732505321503, 0.035037893801927567, -0.015384136699140072, 0.005531858652830124, -0.015205256640911102, 0.01533540803939104, -0.035633593797683716, 0.026342667639255524, -0.02704468183219433, 0.0385383702814579, -0.029329068958759308, 0.009420477785170078, 0.0033848173916339874, 0.0292982030659914, -0.016751078888773918, 0.03563440963625908, 0.010881530120968819, 0.002747170627117157, -0.03971535339951515, 0.03573324531316757, 0.010124724358320236, -0.023400021716952324, 0.08867970108985901, -0.04155530780553818, 0.03901910036802292, 0.01888192817568779, -0.04308389872312546, -0.023020364344120026, -0.007523694075644016, 0.03743257001042366, 0.010046628303825855, -0.016884401440620422, -0.006885663140565157, 0.0033059308771044016, 0.024232033640146255, -0.02440335415303707, 0.029460808262228966, -0.01077456958591938, -0.004936025012284517, -0.05040370300412178, 0.004216311499476433, 0.01644541323184967, 0.004694309085607529, -0.02598286047577858, 0.05482034385204315, -0.022819770500063896, -0.014457395300269127, -0.011072582565248013, 0.027884026989340782, -0.03146982938051224, -0.0031402448657900095, -0.003753026481717825, -0.0028569006826728582, 0.009028357453644276, -0.058234624564647675, -0.016158662736415863, 0.037865739315748215, 0.0012431625509634614, 0.02558949589729309, -0.005825836211442947, -0.002474182052537799, 0.04242189601063728, -0.017856961116194725, 0.02904997207224369, -0.0016461710911244154, 0.02967512235045433, 0.019543658941984177, 0.049438443034887314, 0.00018281386292073876, -0.03366461396217346, 0.010182569734752178, 0.02327582612633705, -0.0640421137213707, 0.02568628638982773, -0.014651513658463955, -0.021118931472301483, -0.011640595272183418, -0.024282235652208328, 0.0443638414144516, 0.01587750017642975, 0.00457781134173274, 0.006171954330056906, 0.02122187614440918, 0.046856556087732315, 0.006560173351317644, 0.009890185669064522, -0.00683186948299408, -0.11367084830999374, -0.012845740653574467, -0.03074374794960022, 0.03257380798459053, 0.008926098234951496, -0.0014574421802535653, -0.05544530600309372, -0.041575055569410324, 0.007297259755432606, -0.02869582362473011, 0.011752557009458542, 0.04576411098241806, 0.004945625551044941, -0.0015152321429923177, 0.0284246988594532, 0.03141586109995842, 0.013939635828137398, -0.0157669298350811, -0.004252928774803877, 0.006553925108164549, 0.08617712557315826, -0.02314973808825016, 0.06521929800510406, 0.10466964542865753, -0.029243651777505875, -0.007345487829297781, -0.015958376228809357, -0.015705348923802376, -0.024048510938882828, -0.04595770686864853, 0.0073736985214054585, 0.01520211435854435, 0.00275917025282979, 0.009457594715058804, -0.0022441742476075888, 0.03690330311655998, -0.013296636752784252, -0.037248268723487854, -0.013672137632966042, -0.010086788795888424, 0.016497032716870308, -0.02944866381585598, 0.0066977255046367645, 0.023179955780506134, -0.010388088412582874, -0.01709543727338314, -0.0107598677277565, 0.034659165889024734, 0.05455595627427101, -0.09690243750810623, 0.005332504864782095, 0.029650118201971054, 0.010695659555494785, 0.018422508612275124, -0.006281358189880848, -0.006532489322125912, 0.02671656757593155, 0.009258575737476349, 0.004446523729711771, -0.015570143237709999, -0.0665777325630188, -0.013350307010114193, -0.013022365048527718, 0.019069379195570946, 0.014206853695213795, -0.04077300801873207, 0.008040565066039562, -0.010341468267142773, 0.007761290762573481, -0.018447820097208023, -0.037095583975315094, 0.011566268280148506, -0.023041600361466408, -0.003037508809939027, 0.051740534603595734, -0.014792634174227715, 0.013364074751734734, 0.00034846863127313554, -0.02366427332162857, 0.002325209556147456, -0.0038722152821719646, 0.027441484853625298, -0.01792282611131668, -0.002832104917615652, -0.005275101866573095, -0.03038209117949009, -0.01052909530699253, 0.00891028717160225, -0.02045639418065548, 0.003812001785263419, 0.009644805453717709, 0.03325188532471657, -0.00030954432440921664, -0.007831153459846973, -0.046224772930145264, 0.01267195213586092, -0.00110698863863945, 0.003914746455848217, 0.029664885252714157, 0.02961743250489235, 0.05029679462313652, 0.0023566195741295815, 0.008263573981821537, -0.017217978835105896, -0.029691200703382492, 0.0012515621492639184, 0.02381080389022827, -0.007409439422190189, -0.004301964771002531, 0.035902757197618484, 0.029441317543387413, 0.010375967249274254, -0.03464960679411888, 0.06893931329250336, 0.08862821757793427, -0.0005867581930942833, -3.9136979467002675e-05, 0.02205132134258747, 0.004947176668792963, 0.011149519123136997, -0.03743429109454155, -0.05442076921463013, 0.04053838923573494, 0.042739059776067734, -0.06458980590105057, 0.05115669220685959, 0.01921525038778782, -0.015300467610359192, -0.026996038854122162, 0.0634428933262825, 0.03540928661823273, 0.023802174255251884, -0.01780756376683712, -0.05041998624801636, 0.012999407947063446, -0.014846239238977432, 0.03528640791773796, -0.007771408651024103, 0.001280738739296794, 0.021902915090322495, 0.021053723990917206, -0.06184793636202812, 0.016858700662851334, -0.06559113413095474, -0.022622497752308846, -0.00634013069793582, 0.04672214388847351, 0.008856664411723614, 0.0005530653288587928, 0.015405083075165749, -0.01601838693022728, -0.0032613498624414206, -0.03510686010122299, 0.016617082059383392, 0.026413537561893463, 0.022918302565813065, -0.002218767534941435, 0.04870320484042168, 0.0022095704916864634, -0.032224223017692566, 0.005881450604647398, 0.011279494501650333, 0.0377279631793499, 0.010849189013242722, -0.034236613661050797, -0.015039135701954365, -0.07178745418787003, 0.026244448497891426, -0.005576918832957745, -0.0544213131070137, -0.011933778412640095, -0.050966836512088776, 0.02270747348666191, -0.012329911813139915, -0.03152836859226227, 0.004414761438965797, -0.04554259777069092, 0.015316477045416832, 0.13975149393081665, 0.0300371665507555, -0.05469843000173569, 0.02192898467183113, 0.021824492141604424, -0.047085586935281754, 0.05059652775526047, 0.05455033853650093, 0.017912475392222404, -0.020954106003046036, -0.018221687525510788, 0.022795340046286583, -0.004282161593437195, -0.13296733796596527, -0.0499921478331089, -0.06724570691585541, -0.01459234394133091, -0.0015016025863587856, 0.010842657648026943, -0.005170388147234917, 0.03069988638162613, -0.013032454997301102, -0.04528467729687691, -0.04975782707333565, -0.005773667246103287, 0.021383773535490036, -0.0009807921014726162, 0.03722834214568138, 0.02154170162975788, -0.016569625586271286, -0.011417833156883717, -0.030077779665589333, 0.010075600817799568, -0.03229297697544098, 0.08344234526157379, -0.0028047088999301195, 0.01825813762843609, 0.026695676147937775, 0.02617711015045643, 0.012928903102874756, -0.0032679312862455845, 0.028218768537044525, 0.03291582316160202, -0.050454702228307724, -0.0050392248667776585, 0.05351518839597702, -0.012955636717379093, 0.012584292329847813, 0.007567898370325565, -0.010187141597270966, -0.011926345527172089, 0.006621440872550011, 0.005144740920513868, -0.0019006904913112521, 0.0033350579906255007, 0.05995004624128342, 0.035307105630636215, 0.021082185208797455, -0.005104515235871077, -0.012576342560350895, -0.029700856655836105, 0.048547033220529556, -0.027034025639295578, -0.029907917603850365, 0.03277132287621498, -0.02132326178252697, -0.01782977022230625, -0.04319557175040245, 0.02027750387787819, -0.03620484843850136, 0.00565809803083539, 0.007830170914530754, 0.024277107790112495, -0.04031585901975632, 0.01617119088768959, -0.01814967766404152, 0.032375894486904144, 0.01130883302539587, -0.0037063532508909702, -0.0025116608012467623, 0.020978331565856934, 0.030643349513411522, 0.045297473669052124, -0.00048486259765923023, -0.02082754671573639, -0.020237930119037628, -0.016977528110146523, -0.009105159901082516, 0.051274970173835754, 0.04560249298810959, -0.06302233040332794, 0.029230240732431412, -0.02784580923616886, -0.036111220717430115, 0.01592285931110382, -0.005340958945453167, -0.0035265740007162094, -0.039947759360075, -0.009185572154819965, -0.0004828325763810426, 0.008954321034252644, -3.92104520869907e-05, -0.012892201542854309, -0.01975710503757, 0.023718522861599922, -0.038783036172389984, 0.014624500647187233, 0.006012895610183477, -0.03479320555925369, -0.0163680799305439, 0.007833491079509258, -0.027294520288705826, 0.025847241282463074, 0.024027204141020775, 0.00038975843926891685, -0.007308861706405878, -0.010038609616458416, -0.0433305986225605, 0.042142074555158615, -0.002495399909093976, -0.0051120612770318985, 0.07440738379955292, -0.03124675340950489, 0.016038144007325172, -0.03223884105682373, -0.021043747663497925, 0.00303500983864069, 0.018113285303115845, 0.007134533487260342, -0.0020660380832850933, -0.05069791525602341, -0.0194572564214468, -0.017220890149474144, 0.031514301896095276, 0.0008832751191221178, -0.012822096236050129]" ./train/Rhodesian_ridgeback/n02087394_8852.JPEG,Rhodesian_ridgeback,"[0.02117527276277542, 0.03553718701004982, -0.02268850989639759, 0.0392468124628067, 0.0014685774222016335, -0.027038495987653732, 0.010597196407616138, 0.0018308187136426568, -0.010761154815554619, -0.023972634226083755, 0.031564097851514816, -0.003818017430603504, 0.04992454871535301, -0.0005204602493904531, 0.04849961772561073, -0.015648284927010536, -0.024959733709692955, 0.03955164551734924, -0.0326613150537014, -0.05562414973974228, -0.07124499976634979, 0.017978640273213387, 0.0025220916140824556, -0.08993011713027954, -0.0028449073433876038, -0.003224316518753767, 0.005568830296397209, -0.00865926779806614, -0.010858837515115738, -0.007267537526786327, 0.025674108415842056, 0.006176689639687538, 0.003656126093119383, -0.008408168330788612, -0.019473165273666382, 0.034374017268419266, 0.037043966352939606, 0.0008388737915083766, 0.002935869386419654, 0.036868058145046234, -0.022390291094779968, 0.005020489916205406, -0.01850225031375885, -0.03482494503259659, -0.00678364047780633, -0.01129715796560049, 0.024055441841483116, -0.03268428146839142, -0.03796076774597168, 0.020494893193244934, 0.021928565576672554, 0.002718704054132104, 0.008223634213209152, 0.051086511462926865, 0.04069150239229202, 0.06564091891050339, -0.014160070568323135, 0.030112547799944878, 0.02055695280432701, -0.011335675604641438, -0.044978462159633636, 0.0223019327968359, 0.030714822933077812, 0.06425247341394424, -0.03559847176074982, -0.031472429633140564, 0.013776830397546291, 0.10357861965894699, 0.01589849777519703, 0.022187186405062675, 0.02830522321164608, -0.01074372697621584, -0.0006875767139717937, 0.014891412109136581, -0.06442248076200485, 0.018149523064494133, 0.0024030336644500494, -0.006998702883720398, -0.0313735269010067, 0.02591196820139885, 0.07087705284357071, 0.02877000905573368, 0.017210084944963455, -0.0002654658746905625, 0.05199426785111427, -0.026020415127277374, 0.029660603031516075, 0.01526765525341034, 0.039959121495485306, -0.0365675687789917, -0.04072759300470352, -0.008458275347948074, -0.6624232530593872, 0.01743043214082718, -0.01074658427387476, 0.02231523022055626, -0.010997380129992962, 0.028312765061855316, -0.06838919967412949, 0.015174663625657558, 0.0005889015737921, 0.06344211101531982, -0.010327301919460297, 0.004336589947342873, -0.013552573509514332, -0.001065169693902135, -0.01686888188123703, -0.015364201739430428, -0.013647313229739666, -0.019918985664844513, 0.04395458474755287, -0.045380495488643646, 0.02161519043147564, -0.07293511927127838, -0.007488104049116373, -0.04126892611384392, -0.05674704909324646, 0.016025209799408913, 0.043038222938776016, -0.02258637361228466, -0.017880916595458984, 0.025058317929506302, 0.002477772533893585, 0.011426078155636787, 0.003361589042469859, -0.03576537221670151, 0.027405869215726852, -0.0028881963808089495, -0.02625737525522709, -0.0021049981005489826, 0.036034341901540756, -0.0026610023342072964, -0.012969018891453743, 0.08768381923437119, -0.008113141171634197, 0.03558991849422455, -0.02034481056034565, -0.01430926751345396, 0.0010706356260925531, 0.058470096439123154, 0.015228490345180035, 0.015510144643485546, -0.032141946256160736, 0.0055601997300982475, -0.01425198558717966, 0.0553775355219841, 0.014625776559114456, 0.03966519609093666, 0.00014150208153296262, -0.003671289188787341, -0.031434353440999985, 0.0024042113218456507, 0.06156796216964722, 0.02592497318983078, -0.03148602694272995, 0.02560907043516636, -0.018355999141931534, -0.045867934823036194, -0.018705066293478012, 0.03936217352747917, -0.06752033531665802, 0.00407438725233078, -0.032434746623039246, -0.03697807714343071, -0.007760059554129839, -0.002106150845065713, -0.06682291626930237, 0.030769431963562965, 0.021215952932834625, 0.05346294492483139, -0.04435550794005394, 0.016343679279088974, -0.013933940790593624, -0.019290247932076454, 0.013660638593137264, -0.02880728244781494, -0.005626555997878313, 0.041064899414777756, 0.01707322895526886, 0.013569277711212635, -0.026533080264925957, -0.027263974770903587, 0.03366691246628761, -0.029719308018684387, -0.010925267823040485, -0.017708567902445793, 0.003404999850317836, 0.037325818091630936, -0.021210771054029465, 0.003501404542475939, 0.04638824984431267, 0.011814280413091183, 0.005126279778778553, -0.005572848487645388, -0.10412293672561646, 0.011139443144202232, 0.02777773328125477, -0.003238013945519924, -0.011167891323566437, -0.012683053500950336, -0.001514289528131485, -0.004490428604185581, 0.02230544574558735, 0.022100316360592842, 0.0034838623832911253, -0.018809346482157707, -0.014910235069692135, -0.016513830050826073, 0.01371788326650858, 0.038245800882577896, -0.07562121003866196, -0.022699769586324692, 0.03349436819553375, 0.028789378702640533, 0.00877500232309103, -0.0204326044768095, -0.0020721140317618847, 0.03699633851647377, 0.03521065413951874, 0.017990102991461754, 0.041218459606170654, 0.01642143353819847, -0.006140982732176781, 0.02483588084578514, -0.012430171482264996, -0.03231165185570717, 0.0006137196905910969, -0.03559276461601257, 0.015844523906707764, 0.036987319588661194, 0.002681221580132842, 0.0031359833665192127, -0.016917139291763306, 0.06390156596899033, -0.006330080330371857, -0.05907990783452988, -0.005650807172060013, -0.050172001123428345, 0.010060192085802555, 0.031004369258880615, -0.007302736397832632, 0.03863460570573807, 0.03132789582014084, -0.012101789936423302, 9.216603939421475e-05, 0.00010236418165732175, 0.04392009973526001, 0.00406624935567379, 1.1358495612512343e-05, 0.05982978269457817, 0.012331613339483738, -0.007369071710854769, 0.009046184830367565, 0.005937753710895777, -0.013286130502820015, -0.0350256972014904, 0.008945322595536709, -0.0033138704020529985, 0.033899322152137756, -0.028893228620290756, -0.029802698642015457, 0.0502135269343853, 0.007009517401456833, -0.0643424540758133, -0.004665716551244259, 0.003584332298487425, -0.028035016730427742, -0.01414347905665636, -0.0033573152031749487, 0.058106593787670135, 0.04862087219953537, 0.004479182884097099, 0.0721408799290657, 0.03315078467130661, 0.0026157675310969353, 0.007108660414814949, -0.00555716548115015, 0.018083563074469566, -0.019385073333978653, -0.005692837294191122, -0.0039393240585923195, -0.006873246748000383, -0.03757679834961891, 0.011117208749055862, 0.001958576962351799, 0.06410913914442062, -0.12724941968917847, 0.04873267933726311, -0.01936481148004532, 0.02254795841872692, -0.01400560513138771, 0.0367068275809288, -0.0563482865691185, 0.012573259882628918, 0.037220295518636703, -0.04163191094994545, 0.025498520582914352, 0.0013253184733912349, -0.0060380990616977215, -0.001074079074896872, 0.01954513229429722, -0.023029720410704613, -0.030884653329849243, -0.016219234094023705, 0.025102678686380386, -0.05987905338406563, 0.059495266526937485, 0.018566424027085304, 0.04387154057621956, 0.054677706211805344, -0.026608901098370552, 0.031729795038700104, 0.08757682889699936, -0.021633099764585495, 0.04144270345568657, -0.025642046704888344, 0.012031935155391693, 0.04613283649086952, -0.0273493193089962, -0.0022090221755206585, 0.046132877469062805, 0.007153309881687164, -0.04095515236258507, 0.03852458298206329, 0.018728164955973625, -0.03324544057250023, 0.01856211945414543, 0.01009265799075365, 0.0003969431563746184, -0.009762430563569069, 0.06278369575738907, 0.00882750004529953, 0.03789820522069931, -0.035327132791280746, -0.018837230280041695, -0.03621026128530502, -0.02190023846924305, 0.018522731959819794, -0.02117118239402771, -0.08352851867675781, 0.005366807337850332, -0.06155601143836975, 0.017610106617212296, 0.03397803381085396, 0.012247993610799313, 0.0019394587725400925, 0.010103516280651093, 0.029866911470890045, 0.023590512573719025, 0.014139287173748016, -0.04924546927213669, 0.0101967453956604, 0.07073723524808884, 0.06178585812449455, -0.005487464834004641, 0.07524049282073975, -0.009966216050088406, -0.10661272704601288, -0.011368982493877411, -0.027904311195015907, 0.11011992394924164, 0.0007708658231422305, -0.0014838165370747447, 0.019889282062649727, -0.02613353170454502, 0.008819193579256535, 0.001089064171537757, 0.033030033111572266, -0.01694083958864212, -0.01534521859139204, 0.007599352393299341, -0.0020449140574783087, -0.03656617924571037, 0.0020722723565995693, -0.0014190024230629206, -0.023229286074638367, 0.16486728191375732, -0.03104112297296524, 0.01804439350962639, -0.005494855344295502, 0.028935741633176804, -0.017352338880300522, 0.028461718931794167, -0.016008030623197556, -0.005133362021297216, 0.02953382022678852, 0.022606221958994865, -0.031214436516165733, 0.023548472672700882, -0.06678176671266556, -0.0506204329431057, -0.06396453827619553, 0.0677538588643074, 0.0417502261698246, -0.0067047420889139175, -0.01025195699185133, -0.007375617045909166, 0.020232925191521645, -0.026022829115390778, -0.041280318051576614, -0.016046587377786636, -0.017479775473475456, 0.028981903567910194, 0.007784842513501644, -0.0010392825352028012, -0.009222102351486683, 0.0003623109369073063, -0.025889353826642036, 0.027524007484316826, -0.027775749564170837, 0.009910566732287407, -0.02144443243741989, -0.008407671004533768, 0.009253290481865406, -0.005515203811228275, 0.020170509815216064, 0.03177470713853836, 0.0054661282338202, -0.02581113763153553, -0.02961703948676586, 0.022745830938220024, -0.004079309292137623, -0.012626877054572105, 0.04384428262710571, 0.007094684988260269, -0.026521585881710052, -0.022314567118883133, -0.021157460287213326, 0.012678492814302444, -0.0032175749074667692, 0.010943197645246983, 0.0457882359623909, -0.09093289822340012, -0.004140617325901985, -0.0405520536005497, -0.021588122472167015, -0.06100822985172272, 0.00434318371117115, -0.007781725376844406, -0.0323566310107708, 0.03093528002500534, 0.05599706619977951, -0.013678009621798992, -0.01947423443198204, 0.022561976686120033, -0.018908046185970306, 0.049091190099716187, -0.019837556406855583, 0.019930031150579453, -0.042111463844776154, -0.0562775656580925, -0.053799211978912354, 0.022296616807579994, 0.02172345481812954, -0.02389504760503769, -0.006245301105082035, 0.02925233542919159, -0.04275323823094368, 0.051229264587163925, 0.03369337320327759, 0.02963765524327755, -0.017231808975338936, -0.019723229110240936, -0.00218613026663661, -0.00596383074298501, 0.014062386937439442, -0.03416500613093376, 0.036682579666376114, -0.0006757914088666439, 0.003915059845894575, 0.017443351447582245, -0.03805407136678696, 0.01887303777039051, -0.001454069628380239, 0.03020704723894596, -0.004931644070893526, -0.01396971195936203, -0.0059991078451275826, -0.05137663707137108, -0.029432352632284164, 0.017778947949409485, -0.030966445803642273, 0.030313562601804733, -0.001942880917340517, -0.001385117182508111, 0.035472020506858826, -0.01647980511188507, -0.007057815324515104, 0.024929104372859, 0.002242302754893899, -0.033489979803562164, -0.018771693110466003, 0.03873817250132561, -0.04495556652545929, 0.011362278833985329, -0.056489188224077225, 0.0313723050057888, 0.04540208727121353, 0.003716537728905678, -0.013648361898958683, -0.0028073794674128294, -0.0036564278416335583, -0.004123531747609377, -0.020683592185378075, -0.00915680080652237, -0.07274562120437622, -0.03462470322847366, 0.028845256194472313, -0.02484499290585518, 0.05669154226779938, -0.012846777215600014, -0.01913396641612053]" ./train/Rhodesian_ridgeback/n02087394_12174.JPEG,Rhodesian_ridgeback,"[-0.03086918033659458, 0.024168148636817932, -0.05309091508388519, 0.006514130625873804, 0.03497198596596718, 0.00817420519888401, 0.04406194016337395, -0.04169313237071037, -0.046891532838344574, 0.06751111149787903, -0.04959094524383545, -0.010879363864660263, 0.047751620411872864, 0.010411113500595093, 0.024224381893873215, 0.02484786882996559, -0.06990192085504532, -0.019997481256723404, -0.01791338063776493, -0.0027031535282731056, -0.07807371765375137, -0.008958560414612293, -0.010051419958472252, 0.023789454251527786, -0.02375824749469757, 0.030276093631982803, -0.013596837408840656, -0.000685571925714612, 0.007348744664341211, -0.021469777449965477, 0.025877244770526886, 0.02810506895184517, -0.004018981009721756, -0.0023099593818187714, 0.07212576270103455, 0.03772716969251633, 0.014273272827267647, -0.03982068970799446, -0.051254961639642715, 0.12223758548498154, -0.029030459001660347, -0.014455249533057213, 0.01005676668137312, -0.012648036703467369, 0.004007882438600063, -0.07323451340198517, 0.006782740354537964, 0.003596676280722022, -0.019327053800225258, 0.032696258276700974, -0.0004677400866057724, 0.021713970229029655, 0.020921342074871063, 0.01398865319788456, 0.012189644388854504, 0.039885248988866806, 0.02900977060198784, -0.02441113442182541, -0.022473318502306938, 0.015184286050498486, 0.029485410079360008, -0.01024904940277338, 0.05633985623717308, 0.016964027658104897, 0.024577971547842026, -0.0095626600086689, 0.040596313774585724, 0.0043316129595041275, 0.042583122849464417, -0.054622821509838104, 0.029759332537651062, 0.006114080082625151, -0.0009593348950147629, 0.07552628219127655, -0.033436764031648636, 0.011782105080783367, -0.05483897402882576, 0.019378215074539185, -0.014048170298337936, 0.013212703168392181, 0.026511428877711296, 0.03577524051070213, -0.010725020430982113, 0.009533502161502838, 0.018160030245780945, 0.004683412611484528, 0.021851196885108948, -0.006500596180558205, 0.07239262759685516, 0.014543237164616585, -0.008500747382640839, -0.024587620049715042, -0.5545616149902344, 0.0033189672976732254, -0.04267087206244469, 0.02905740961432457, 0.007314181420952082, 0.047171156853437424, -0.030670909211039543, 0.0959658995270729, 0.007336747366935015, 0.040900975465774536, 0.045615702867507935, -0.0178330410271883, 0.03773640841245651, -0.06090069189667702, -0.027618566527962685, -0.008163182064890862, -0.06269772350788116, 0.037212397903203964, 0.026652880012989044, -0.057051703333854675, 0.030150357633829117, -0.027606485411524773, -0.02186562307178974, -0.042103417217731476, -0.016062233597040176, -0.034016795456409454, 0.03541165590286255, 0.014402925968170166, 0.0056815012358129025, 0.018749946728348732, 0.03228025510907173, -0.029143020510673523, -0.027306679636240005, -0.02713829092681408, -0.017825355753302574, -0.012507667765021324, -0.027902187779545784, -0.019944582134485245, 0.06417407840490341, 0.0059363399632275105, 0.01994732953608036, 0.08226735144853592, -0.0052250525914132595, 0.026378348469734192, 0.01356449443846941, -0.09864018112421036, -0.06536606699228287, 0.009367982856929302, 0.004542903043329716, 0.0540754608809948, -0.022325055673718452, 0.06227540597319603, -0.018691711127758026, 0.05242898687720299, 0.03486095368862152, 0.00819886103272438, -0.06254244595766068, 0.005129646509885788, -0.011927183717489243, 0.014293975196778774, 0.12253255397081375, -0.002495321910828352, -0.05328299105167389, -0.0010853966232389212, 0.004536142572760582, 0.010753737762570381, 0.00930415652692318, -0.025439703837037086, -0.07922166585922241, -0.0018646086100488901, 0.042458176612854004, -0.031200503930449486, -0.01153327152132988, 0.0073826792649924755, 0.05938204005360603, 0.018430523574352264, -0.03811407461762428, -0.018422119319438934, -0.03240660950541496, -0.03548293560743332, -0.004430414643138647, -0.0026067167054861784, 0.03822696581482887, -0.014269864186644554, -0.04941723123192787, 0.012778653763234615, 0.030109498649835587, -0.004525596275925636, 0.015994416549801826, -0.0008788332343101501, 0.013488647527992725, -0.02223745919764042, -0.013419308699667454, 0.013791108503937721, 0.00897969864308834, 0.0033531992230564356, -0.0021993406116962433, 0.013999247923493385, -0.029988689348101616, 0.006661329884082079, 0.011661043390631676, 0.07663145661354065, -0.1275886744260788, 0.018410272896289825, 0.009996375069022179, 0.019706960767507553, -0.03311099484562874, 0.00968179851770401, -0.028543217107653618, -0.034393273293972015, 0.045674849301576614, 0.04245048016309738, 0.017926445230841637, -0.05772166699171066, -0.032887835055589676, -0.037928257137537, 0.010944200679659843, 0.034760598093271255, -0.00013456979650072753, -0.024780260398983955, 0.03792691230773926, -0.0241837240755558, -0.011017478071153164, -0.008532345294952393, 0.03808842599391937, 0.039687611162662506, 0.07059814035892487, -0.0668552815914154, 0.014530175365507603, -0.026241786777973175, -0.009345580823719501, 0.008748007006943226, -0.05985543131828308, -0.01122466940432787, 0.008582774549722672, 0.008793748915195465, -0.014010647311806679, -0.0274956151843071, 0.007313963957130909, 0.012400517240166664, 0.0017268109368160367, -0.01675562560558319, 0.010103924199938774, -0.10187804698944092, -0.015898222103714943, -0.027452684938907623, 0.02073722705245018, 0.0009699968504719436, -0.023005381226539612, -0.016260595992207527, 0.04137668013572693, -0.018475038930773735, -0.02878529578447342, 0.01788189820945263, 0.017488669604063034, 0.001783807179890573, 0.050963595509529114, 0.026377977803349495, -0.015192508697509766, 0.015640346333384514, -0.0048707653768360615, 0.004044670145958662, -0.005566886626183987, -0.03934169188141823, -0.003866204060614109, -0.01612909324467182, 0.012281914241611958, -8.665496716275811e-05, -0.0006222633528523147, 0.045187439769506454, -0.059804294258356094, -0.09628172963857651, -0.012665198184549809, -0.0007282962324097753, 0.016331255435943604, 0.02153019607067108, -0.006208302453160286, 0.08989786356687546, 0.0171514842659235, -0.00023660367878619581, 0.0632479190826416, -0.05120743811130524, -0.014693629927933216, -0.003530708607286215, 0.0341513529419899, 0.032831355929374695, -0.023771770298480988, 0.027441730722784996, -0.000507875403854996, 0.012827443890273571, -0.07310214638710022, -0.004172152373939753, 0.010023392736911774, 0.03352797403931618, 0.009837452322244644, -0.016114607453346252, -0.026155415922403336, 0.03449929878115654, -0.011240758933126926, -0.008873947896063328, -0.007201190106570721, 0.012700080871582031, -0.003876630449667573, 0.0008322513895109296, 0.012883699499070644, 0.049339547753334045, -0.01764332875609398, 0.004570713732391596, -0.06977690756320953, -0.020602677017450333, -0.009185749106109142, 0.027479877695441246, 0.04104778543114662, -0.0495302639901638, 0.029896648600697517, 0.0733310878276825, 0.05580880492925644, 0.012025323696434498, -0.008946011774241924, 0.0477481409907341, 0.08220235258340836, 0.013361995108425617, 0.026905613020062447, -0.037451744079589844, 0.044498737901449203, 0.0073314993642270565, -0.018557893112301826, 0.08615486323833466, 0.05571416765451431, -0.11423735320568085, -0.029839355498552322, 0.042901843786239624, 0.00671578012406826, 1.5768062439747155e-05, -0.029911311343312263, 0.029663756489753723, 0.01775755174458027, -0.040092650800943375, -0.007598749827593565, -0.015460018999874592, 0.021206745877861977, -0.04666876792907715, 0.014887218363583088, -0.0033224362414330244, -0.020020507276058197, 0.009782101027667522, -0.008494746871292591, -0.032388873398303986, 0.05498036369681358, -0.019184989854693413, 0.027552705258131027, 0.006869690492749214, 0.04624404013156891, 0.008825480937957764, 0.010744193568825722, 0.008189376443624496, -0.004722654819488525, 0.03230036795139313, -0.015763266012072563, -0.026067491620779037, 0.034285012632608414, 0.01785019412636757, 0.0014992095530033112, -0.020896684378385544, -0.01615285500884056, -0.04015714302659035, -0.04515786096453667, 0.025957947596907616, 0.02495485357940197, 0.025961004197597504, -0.03139371797442436, 0.006863649468868971, -0.08393827080726624, 0.011834009550511837, -0.0023223257157951593, -0.07150805741548538, 0.04202226176857948, 0.002535005798563361, 0.007231026887893677, 0.004659401718527079, -0.017695056274533272, 0.019931292161345482, 0.027737554162740707, 0.045152805745601654, 0.20776931941509247, -0.04407394304871559, 0.01655980385839939, 0.030449867248535156, 0.016030220314860344, 0.019431201741099358, -0.007509213872253895, -0.025318872183561325, 0.03686373308300972, -0.012389784678816795, 0.00644567608833313, 0.015914855524897575, 0.030161380767822266, -0.04225430265069008, -0.06444475799798965, -0.005442110355943441, 0.0418325737118721, -0.0008086543530225754, 0.01218516007065773, 0.020419906824827194, -0.04339192062616348, 0.008804895915091038, -0.02080981805920601, 0.0036370668094605207, -0.024442186579108238, -0.05487003177404404, -0.06807782500982285, 0.00819520466029644, 0.03316614031791687, 0.015080803073942661, -0.010217742994427681, -0.028945012018084526, 0.06997557729482651, -0.00587481539696455, 0.004052473697811365, 0.03187553212046623, -0.060307662934064865, -0.008728515356779099, -0.01459675282239914, -0.004245666787028313, -0.017512699589133263, 0.0322406142950058, 0.02157110720872879, -0.0795174241065979, 0.02219199761748314, -0.05102706328034401, -0.015825260430574417, 0.018786607310175896, 0.0005769160925410688, -0.05687011033296585, 0.006057250779122114, -0.01934223249554634, 0.02805439569056034, 0.0115060368552804, 0.002311351243406534, 0.042828042060136795, 0.02300306037068367, -0.05632317066192627, -0.01907169818878174, -0.03768955543637276, -0.06738924980163574, -3.516851575113833e-05, 0.05094895139336586, 0.02522970549762249, -0.022420886904001236, 0.03884052857756615, -0.00863982830196619, 0.06084766611456871, 0.034093257039785385, -0.020049620419740677, 0.0317535400390625, 0.018615512177348137, -0.06706502288579941, -0.007101304829120636, -0.06420230865478516, -0.015210979618132114, 0.0047750286757946014, -0.0012403319124132395, -0.003637352492660284, -0.0892806425690651, 0.026847103610634804, -0.02101978287100792, -0.007463699672371149, 0.03769724816083908, 0.02557559497654438, -0.00952755194157362, -0.07215117663145065, 0.009772149845957756, 0.02003059908747673, 0.015777869150042534, 0.01652851328253746, 0.02440200187265873, -0.019062282517552376, 0.020421089604496956, 0.0629846602678299, -0.020681986585259438, 0.03945184871554375, -0.016545452177524567, 0.04522128775715828, 0.017452966421842575, 0.004518025554716587, -0.02423085831105709, -0.03697263449430466, -0.03157258778810501, 0.030664166435599327, -0.003164798952639103, -0.014002247713506222, 0.03190823644399643, -0.01183986198157072, 0.026814309880137444, -0.01970338076353073, -0.008670587092638016, -0.006495154462754726, -0.03930578753352165, -0.07284470647573471, -0.03334931656718254, 0.06961982697248459, -0.05289515107870102, 0.04970262572169304, -0.022120626643300056, 0.04995162785053253, 0.07895231992006302, -0.037347108125686646, 0.020965533331036568, -0.09566529840230942, -0.04811815172433853, 0.0011132550425827503, -0.013706407509744167, 0.01452195830643177, -0.006706167943775654, -0.0628184899687767, -0.02206309884786606, -0.039974313229322433, 0.06240648031234741, 0.04189047962427139, 0.020106319338083267]" ./train/Rhodesian_ridgeback/n02087394_239.JPEG,Rhodesian_ridgeback,"[-0.02468119189143181, 0.007838333025574684, -0.009321535006165504, 0.036771468818187714, 0.008914920501410961, -0.05654223635792732, -0.006102464161813259, 0.007773431017994881, -0.024319136515259743, 0.022314956411719322, -0.03308839350938797, -0.010141417384147644, -0.020755257457494736, -0.0033387537114322186, 0.033640168607234955, 0.0005637580179609358, -0.0001393196580465883, 0.019807590171694756, 0.008322685956954956, -0.0410686731338501, -0.0035929034929722548, 0.010888820514082909, -0.014872225932776928, 0.0203776303678751, -1.2863358278991655e-05, -0.0280766561627388, -0.007979374378919601, 0.006366834510117769, -0.004978151060640812, -0.010800421237945557, 0.019570836797356606, 0.03872976452112198, -0.041977282613515854, -0.0419432558119297, -0.02761465683579445, -0.014535229653120041, -0.011720826849341393, -0.014270075596868992, -0.024780986830592155, 0.14215707778930664, -0.007114018779247999, -0.013286150060594082, 0.0016217271331697702, -0.03526578098535538, -0.020039331167936325, -0.029935559257864952, 0.004931064788252115, 0.01675478368997574, -0.018991803750395775, 0.012681043706834316, 0.03058873675763607, 0.00801934115588665, -0.012936011888086796, 0.022426774725317955, 0.046450987458229065, 0.015687787905335426, 0.06761574745178223, 0.011801724322140217, -0.041993409395217896, -0.05269629508256912, 0.00032143082353286445, 0.02302200347185135, 0.024059705436229706, 0.05401613190770149, -0.01351971086114645, -0.024896962568163872, -0.005530844442546368, 0.10181241482496262, -0.01957712695002556, -0.023142367601394653, 0.025810981169342995, 0.013507508672773838, -0.003916857298463583, -0.015817787498235703, 0.00988065917044878, 0.016837233677506447, 0.015358831733465195, -0.010739649645984173, 0.013234660029411316, -0.027737928554415703, 0.004781038500368595, 0.007999047636985779, -0.03135266155004501, -0.03354266285896301, -0.0012720334343612194, 0.020518776029348373, 0.09220007061958313, -0.030422868207097054, 0.0543857105076313, -0.0418122261762619, -0.037442583590745926, -0.061546362936496735, -0.6501213312149048, 0.022301798686385155, -0.025934619829058647, 0.040657591074705124, 0.05378061532974243, -0.0022877445444464684, -0.007527282927185297, 0.09553909301757812, -0.02515603043138981, -0.013413875363767147, 0.0036533824168145657, -0.015101974830031395, 0.03826761990785599, -0.011173476465046406, 0.0022404249757528305, -0.013632374815642834, 0.022579777985811234, -0.023826129734516144, -0.010196654126048088, -0.0597977489233017, -0.013992187567055225, 0.009885583072900772, 0.004004133399575949, -0.05654512345790863, -0.014864567667245865, 0.005350994411855936, 0.010243857279419899, -0.0015507909702137113, 0.010246112011373043, -0.01230231486260891, 0.0457824170589447, 0.04446909949183464, -0.019008956849575043, -0.03169399872422218, -0.02533993124961853, 0.010172604583203793, 0.014679980464279652, -0.04057670384645462, 0.018808910623192787, 0.0007133653853088617, -0.04884018748998642, 0.08445889502763748, -0.06086498498916626, 0.027913831174373627, 0.019015690311789513, -0.06450024247169495, -0.015614936128258705, 0.023080473765730858, 0.014563199132680893, -0.026221908628940582, 0.011975092813372612, -0.022906729951500893, 0.0007936768233776093, 0.009073363617062569, 0.0017619223799556494, -0.027696704491972923, 0.0018413690850138664, 0.03241008520126343, -0.036928657442331314, 0.030879056081175804, 0.02963702566921711, -0.003297810908406973, -0.03679700195789337, 0.02488028258085251, 0.02158745750784874, -0.014170011505484581, 0.01063544675707817, -0.0006279160152189434, -0.008487694896757603, 0.0008398566278629005, 0.0041219634003937244, 0.014655636623501778, 0.0003427859046496451, -0.05145804584026337, 0.017563682049512863, 0.033982377499341965, 0.034681741148233414, 0.004829802084714174, -0.01834987848997116, 0.01409748662263155, 0.03544004261493683, -0.030189096927642822, -0.024860579520463943, -0.06905528903007507, 0.05968893691897392, 0.03877520561218262, -0.01272260956466198, 0.01816270686686039, -0.007050622254610062, -0.028414582833647728, 0.02577079087495804, -0.059728726744651794, -0.017860034480690956, -0.0009455466060899198, -0.019822947680950165, -0.00025199592346325517, -0.014156396500766277, 0.010806229896843433, 0.03847639262676239, -0.0049263713881373405, -0.027567358687520027, 0.015624327585101128, -0.014938297681510448, -0.0072091687470674515, -0.0033906097523868084, -0.009704941883683205, -0.13921111822128296, -0.05312728509306908, 0.020584961399435997, 0.021656803786754608, -0.01348191499710083, 0.05266626924276352, -0.018054606392979622, -0.0386742539703846, -0.0038458318449556828, -0.04035518690943718, -0.00462913466617465, 0.06421037763357162, -0.05988965183496475, 0.018750889226794243, 0.021898280829191208, 0.04484326019883156, 0.0031342143192887306, -0.02493736892938614, -0.027436206117272377, -0.01803595758974552, 0.09094663709402084, -0.006589759141206741, 0.05056225135922432, 0.02483294904232025, -0.03571039065718651, -0.010231412947177887, -0.006969031412154436, -0.029624152928590775, -0.007857137359678745, -0.031322889029979706, 0.0005282396450638771, -0.001058247871696949, -0.004382142797112465, -0.026569847017526627, -0.014727926813066006, 0.02189406007528305, 0.011824843473732471, -0.05677145719528198, -0.034665752202272415, -0.02232607640326023, 0.012651781551539898, 0.005065899342298508, 0.017312675714492798, 0.012285856530070305, 0.016742141917347908, 0.0030492418445646763, -0.010458918288350105, 0.053715646266937256, 0.06383255869150162, -0.07194673269987106, -0.007455969695001841, 0.04890238121151924, 0.03673087805509567, -0.014292404986917973, -0.019763929769396782, -0.008412498049438, -0.00885831005871296, -0.01654713600873947, 0.015412956476211548, -0.004596931394189596, -0.07834620773792267, -0.02655874192714691, -0.04333488643169403, 0.018799372017383575, 0.004709822591394186, 0.03790416568517685, -0.0010122753446921706, -0.024596817791461945, -0.029659347608685493, 0.05035508796572685, -0.017479926347732544, 0.01266385242342949, 0.00773279694840312, 0.03458774462342262, 0.024527302011847496, -0.035331450402736664, 0.020039960741996765, -0.0030770041048526764, -0.0040705581195652485, 0.019726833328604698, -0.017480770125985146, -0.004277363419532776, -0.012574712745845318, 0.016914399340748787, -0.033865973353385925, -0.018922461196780205, 0.009299551136791706, 0.044207215309143066, -0.1391516774892807, 0.017852826043963432, 0.005613981280475855, 0.024919459596276283, 0.017346957698464394, 0.010803911834955215, 0.015672339126467705, -0.012983490712940693, -0.02204972691833973, 0.006798188202083111, 0.031913548707962036, 0.0017669423250481486, 0.02234557457268238, 0.017055662348866463, -0.005098490975797176, -0.013861029408872128, -0.013973517343401909, 0.009761188179254532, 0.03719603642821312, 0.00040045735659077764, -0.015015320852398872, 0.05241014063358307, -0.010407719761133194, 0.035446614027023315, -0.016320660710334778, 0.05658811703324318, 0.08431367576122284, 0.022797076031565666, 0.006643847096711397, -0.005808996502310038, 0.05041789636015892, 0.04288984462618828, -0.028446044772863388, -0.034504905343055725, 0.0260367039591074, 0.061052318662405014, -0.025448208674788475, 0.022344321012496948, 0.003635099856182933, 0.002954852767288685, -0.01049141027033329, 0.03717251867055893, -0.0014858319191262126, -0.0035116076469421387, -0.01795385405421257, 0.0018281119409948587, 0.00018976966384798288, -0.05639205127954483, 0.0036828976590186357, 0.014799575321376324, -0.01233104057610035, 0.021892936900258064, -0.01455322839319706, -0.014603898860514164, -0.0008000044617801905, -0.05940721929073334, 0.02355768531560898, -0.008679759688675404, 0.05344017967581749, -0.00569763733074069, 0.011562683619558811, 0.03846120834350586, -0.030982736498117447, -0.004149939864873886, -0.11287710815668106, 0.008174050599336624, 0.0042945328168570995, 0.01681615225970745, -0.016093961894512177, 0.02565639652311802, 0.021853500977158546, -0.08089493215084076, 0.01681363396346569, 0.04290187731385231, -0.04269524663686752, 0.013504517264664173, -0.015146671794354916, 0.01131061464548111, 0.032765962183475494, 0.02904626727104187, -0.004948735702782869, -0.08425995707511902, 0.016489028930664062, -0.006451059598475695, 0.006651907227933407, 0.00554331298917532, 0.0009166753734461963, 0.0029076440259814262, -0.018803194165229797, -0.016801871359348297, 0.18798814713954926, 0.03598644211888313, -0.044466570019721985, 0.027726532891392708, 0.014685244299471378, -0.06263291835784912, -0.0035613677464425564, -0.017361339181661606, 0.03338950127363205, -0.015994707122445107, 0.016846174374222755, 0.029103459790349007, 0.03681737184524536, -0.0965530127286911, 0.01318363007158041, -0.040157195180654526, 0.005985667929053307, -0.04388689622282982, -0.03876923397183418, 0.0007065713289193809, -0.0070512741804122925, 0.003924395889043808, -0.07243485003709793, -0.014090355485677719, -0.02210092544555664, 0.02560214325785637, 0.031288065016269684, -0.00538196787238121, -0.014959057793021202, -0.0009111134568229318, 0.015311118215322495, -0.021618500351905823, 0.061564259231090546, -0.02420208416879177, 0.10680551826953888, -0.014599322341382504, -0.020831558853387833, -0.008304239250719547, -0.006732345093041658, -0.008068769238889217, -0.012885243631899357, 0.006287217140197754, -0.0003183972730766982, -0.0583205372095108, 0.0051317643374204636, 0.010785670951008797, -0.004859624430537224, -0.0062844837084412575, 0.021874090656638145, 0.00548176234588027, -0.04820827394723892, -0.03845154121518135, 0.02498508058488369, 0.013427319005131721, -0.004496804438531399, 0.02174060046672821, -0.011864510364830494, 0.01590186171233654, -0.0007730001234449446, -0.028637932613492012, -0.0489724837243557, 0.002883836394175887, -0.01345914974808693, -0.003469955874606967, 0.005895473062992096, -0.00442151352763176, 0.002935044700279832, -0.012333492748439312, 0.009404825046658516, -0.011504225432872772, 0.017153456807136536, -0.0035069051664322615, -0.01036550011485815, -0.028856823220849037, -0.04536672309041023, -0.016447557136416435, -0.0006375397206284106, -0.0010761324083432555, -0.021652016788721085, -0.035683151334524155, 0.018284743651747704, 0.01790144294500351, 0.006737259216606617, 0.05343909189105034, 0.02776646427810192, -0.012868975289165974, -0.0019910295959562063, -0.013911601155996323, 0.05834371596574783, 0.02413013018667698, -0.07296336442232132, 0.02469782903790474, -0.05118692293763161, -0.031988706439733505, 0.03322182595729828, -0.007122768089175224, -0.010436310432851315, -0.05542847514152527, -0.028351252898573875, -0.038721129298210144, -0.0024519693106412888, -0.020693141967058182, -0.055306702852249146, -0.06378260999917984, 0.00422519538551569, 0.031236669048666954, 0.013281511142849922, -0.0019389573717489839, -0.02453329786658287, 0.0010274869855493307, -0.042573291808366776, -0.02874159999191761, 0.0009167025564238429, 0.002118397271260619, 0.003367598867043853, -0.06564156711101532, 0.035959094762802124, -0.04756713658571243, 0.015922630205750465, -0.0278417207300663, 0.00678986543789506, 0.054020076990127563, -0.017182517796754837, 0.0042760372161865234, -0.0590076819062233, -0.024216467514634132, -0.03177454695105553, -0.015308823436498642, 0.006049538031220436, 0.01811477355659008, -0.06326744705438614, 0.0038730488158762455, -0.06829989701509476, 0.07792995125055313, -0.03273272141814232, -0.02447505295276642]" ./train/Rhodesian_ridgeback/n02087394_10810.JPEG,Rhodesian_ridgeback,"[0.007226224988698959, 0.013921394012868404, -0.0006083652260713279, -0.009141561575233936, 0.014924641698598862, -0.032617732882499695, 0.05528629571199417, -0.0019942892249673605, 0.021932752802968025, 0.013182957656681538, -0.04723135381937027, 0.04242211580276489, 0.023192651569843292, 0.007664789445698261, 0.006145045626908541, 0.051220040768384933, 0.13021720945835114, 0.00039335686597041786, 0.016790922731161118, 0.0010965028777718544, -0.0234982892870903, 0.026545315980911255, 0.055852483958005905, -0.008405949920415878, -0.04023875296115875, 0.01798396185040474, 0.011373529210686684, -0.011814883910119534, 0.015672951936721802, 0.006600991822779179, 0.05088141933083534, 0.025444908067584038, 0.03733747825026512, 0.013935666531324387, 0.012255796231329441, -0.0006596525781787932, -0.007653084117919207, -0.03798949345946312, -0.027989769354462624, 0.12435315549373627, -0.03150155395269394, 0.004731158725917339, 0.029539303854107857, -0.023474205285310745, -0.012219378724694252, -0.08646795153617859, -0.044688742607831955, 0.0534282810986042, 0.04631976783275604, 0.039267610758543015, 0.01967167668044567, -0.013103227131068707, 0.018278364092111588, 0.03500301390886307, 0.06082017719745636, 0.012553909793496132, 0.048980962485075, 0.03158130869269371, -0.03840288519859314, -0.04446346312761307, 0.17722110450267792, 0.027917034924030304, 0.02152416668832302, -0.038459599018096924, -0.0075683556497097015, -0.00815240666270256, 0.03850669413805008, -0.008448012173175812, 0.0012778433738276362, 0.005741799715906382, -0.015558337792754173, -0.011286594904959202, 0.04246869310736656, 0.006280780304223299, -0.03950400650501251, -0.017629727721214294, -0.0575605146586895, 0.020188966765999794, -0.022279683500528336, 0.006370397750288248, -0.006667206063866615, 0.008772799745202065, 0.009369362145662308, -0.014963049441576004, 0.07057163119316101, -0.01664581149816513, -0.02880759909749031, 0.0015096700517460704, 0.05272992327809334, 0.002023320645093918, -0.0210234634578228, -0.030112456530332565, -0.6025317907333374, 0.09046626836061478, -0.015554008074104786, -0.007096264977008104, 0.05395956709980965, 0.007895967923104763, -0.08783115446567535, 0.0791180208325386, -0.023639995604753494, 0.0006516786525025964, -0.008246852084994316, -0.015323447063565254, 0.045885760337114334, -0.017338061705231667, -0.0735139548778534, 0.009826483204960823, -0.024455459788441658, -0.019157221540808678, -0.008904452435672283, 0.017712559551000595, -0.004926105495542288, 0.021708497777581215, -0.031148111447691917, -0.0213975477963686, 0.020290061831474304, -0.027231333777308464, 0.03205057233572006, -0.0024217937607318163, 0.01477925106883049, -0.05014393478631973, -0.006875942461192608, 0.02668091468513012, -0.003903868142515421, 0.018879849463701248, -0.01005061250180006, -0.012624022550880909, -0.006230880040675402, -0.03012533113360405, 0.05827001482248306, -0.06968551129102707, 0.02136661671102047, 0.07877807319164276, -0.03203441575169563, 0.015561556443572044, 0.04669317975640297, -0.03394497185945511, 0.015759967267513275, -0.02417856454849243, 0.005834169685840607, 0.03380422294139862, -0.010642275214195251, 0.030509304255247116, 0.005687872879207134, 0.012360043823719025, -0.0017846196424216032, 0.03660126402974129, -0.034376099705696106, -0.012331848032772541, -0.031821418553590775, 0.0004641480918508023, 0.052943985909223557, 0.019568460062146187, -0.08140404522418976, 0.0045487103052437305, 0.002575105521827936, 0.006664950400590897, 0.02878100983798504, 0.005665237549692392, -0.02954982779920101, 0.01742502488195896, 0.010065543465316296, -0.0041378941386938095, 0.04638691991567612, -0.015262826345860958, -0.03973677381873131, -0.010790016502141953, -0.0009175380109809339, 0.006646328140050173, 0.00777402613312006, -0.010992025956511497, 0.04706624895334244, 0.01005326583981514, 0.013016900978982449, 0.0348622091114521, 0.06846308708190918, 0.0018368292367085814, 0.04465991631150246, -0.032638855278491974, -0.0031431587412953377, -0.042292725294828415, 0.027373861521482468, -0.028277389705181122, -0.0002715520095080137, -0.04381906986236572, -0.0032604290172457695, -0.001556086353957653, -0.023785924538969994, 0.005992539692670107, 0.001572593697346747, -0.025776831433176994, -0.025045501068234444, -0.022719597443938255, 0.002348375739529729, 0.01618754304945469, 0.02249632216989994, -0.008339092135429382, -0.05684598907828331, -0.04726618528366089, -0.06146125867962837, -0.00036794040352106094, 0.032360948622226715, -0.02382992021739483, -0.009007182903587818, -0.036249443888664246, -0.011575340293347836, -0.013292742893099785, 0.05046069249510765, 0.01735234446823597, -0.0006363015854731202, -0.024716444313526154, 0.019284285604953766, 0.034095413982868195, -0.014568585902452469, 0.005953826941549778, -0.016295388340950012, 0.03589961677789688, 0.049602095037698746, -0.04033295065164566, 0.04907071962952614, 0.09381253272294998, 0.03550494834780693, -0.02678670547902584, -0.023180365562438965, -0.02200399525463581, 0.0018673182930797338, -0.014303622767329216, 0.004415139555931091, -0.030444633215665817, 0.03482968360185623, -0.0050806161016225815, 0.007869268767535686, 0.018791107460856438, 0.011131917126476765, -0.046129874885082245, 0.029567822813987732, -0.02358320727944374, -0.014284403994679451, -0.03453037142753601, 0.013958723284304142, -0.02144128456711769, 0.06052717939019203, -0.033789247274398804, 0.020500343292951584, 0.020214896649122238, -0.005627268459647894, -0.02746857888996601, 0.022583795711398125, 0.06052200123667717, -6.975634278205689e-06, 0.019770972430706024, 0.009292942471802235, 0.027578234672546387, 0.008549901656806469, -0.016204843297600746, -0.01487048901617527, -0.01594327576458454, 0.04994189366698265, -0.06029714271426201, -0.025575077161192894, 0.03311505168676376, -0.00023253522522281855, -0.04421316459774971, -0.028778046369552612, 0.012345883063971996, -0.014330090954899788, 0.0032340281177312136, 0.02172153815627098, 0.02517639845609665, -0.03302193433046341, 0.0059682102873921394, 0.026885686442255974, -0.0278194397687912, 0.03807428851723671, 0.015620389021933079, 0.018164657056331635, 0.02358824759721756, -0.01776832528412342, 0.03747398778796196, -0.02372162416577339, 0.05405639857053757, -0.0017165230819955468, -0.0059245736338198185, 0.02194897085428238, -0.0006317595252767205, 0.10539280623197556, 0.030298257246613503, -0.02664991468191147, 0.03289765492081642, -0.029761267825961113, 0.019793733954429626, -0.024885986000299454, 0.02833898365497589, -0.027718978002667427, 0.009303677827119827, 0.018256833776831627, 0.00991124752908945, -0.029901746660470963, 0.014097912237048149, -0.002158955205231905, -0.017505571246147156, 0.025585629045963287, 0.010781132616102695, 0.038400691002607346, -0.030488256365060806, -0.037327203899621964, 0.025313973426818848, 0.031325340270996094, 0.0020143981091678143, -0.010020873509347439, 0.050595588982105255, 0.07864309102296829, -0.04148445278406143, -0.024744810536503792, -0.001566624385304749, 0.007565822917968035, 0.04346043989062309, 0.005387798883020878, -0.07991943508386612, 0.035660162568092346, 0.04074571281671524, -0.04003284126520157, 0.015989547595381737, 0.025920549407601357, 0.03905202075839043, -0.008540905080735683, 0.037719693034887314, 0.0207842867821455, 0.0032253884710371494, -0.004984131082892418, -0.048183050006628036, 0.04134422540664673, -0.032508086413145065, 0.034137703478336334, -0.009008499793708324, 0.002735558431595564, 0.02348516695201397, 0.04092741012573242, -0.04783264175057411, 0.03165965527296066, 0.006873239763081074, 0.012854418717324734, 0.01750885508954525, 0.05059048905968666, 0.009289621375501156, 0.056427016854286194, 0.010079700499773026, -0.019774330779910088, -0.007108082063496113, -0.05520900338888168, -0.000350261980202049, 0.031082697212696075, 0.00027991124079562724, 0.02616637758910656, -0.017918359488248825, -0.0037497475277632475, -0.11623793095350266, -0.008468418382108212, 0.013518291525542736, 0.054946139454841614, 0.013882145285606384, -0.0013332647504284978, -0.03634705767035484, -0.09283868223428726, 0.007761828135699034, 0.03383060172200203, -0.13107912242412567, 0.010862914845347404, 0.017068378627300262, -0.01932012103497982, 0.009703642688691616, -0.011679118499159813, -0.010983973741531372, -0.02900022827088833, 0.01930386573076248, 0.15592201054096222, -0.0088090430945158, 0.013187882490456104, 0.006411551032215357, 0.009338581003248692, 0.0772821307182312, 0.0021355634089559317, 0.04098280146718025, 0.039013903588056564, 0.03970248997211456, -0.0362837091088295, -0.0025180024094879627, 0.038046449422836304, 0.005310803186148405, -0.03544681519269943, -0.021324828267097473, 0.00045830526505596936, -0.036919768899679184, -0.017637303099036217, -0.014549439772963524, 0.020341984927654266, -0.04793135076761246, -0.042646005749702454, -0.027828432619571686, -0.030444806441664696, -0.022175338119268417, 0.03423888608813286, 0.04470581188797951, 0.019717717543244362, -0.03277499973773956, 0.03172837570309639, -0.04801201820373535, 0.023982325568795204, -0.05461293086409569, 0.0686824768781662, -0.015262192115187645, 0.02296433411538601, -0.007452025078237057, -0.0071670799516141415, 0.027783498167991638, -0.02378123812377453, -0.04114565625786781, 0.06602665036916733, -0.08918885886669159, -0.011414140462875366, 0.006910861004143953, -0.017581529915332794, 0.04265192151069641, -0.006679933052510023, 0.0005930094630457461, 0.0018236541654914618, 0.017484404146671295, -0.0812457725405693, -0.03927332162857056, -0.004229821730405092, 0.06012742593884468, 0.09503975510597229, -0.01653769053518772, 0.022348415106534958, -0.008157886564731598, 0.004823175724595785, 0.04037284478545189, 0.01242245826870203, 0.005530125927180052, -0.009360638447105885, 0.04850120097398758, -0.03942335769534111, -0.008850650861859322, 0.0017608106136322021, 0.02159726805984974, 0.029813431203365326, 0.04443274810910225, -0.029494069516658783, -0.01431019976735115, 0.022968607023358345, -0.004557475913316011, 0.016451450064778328, -0.022550800815224648, -0.023702386766672134, -0.00767878582701087, 0.06757336109876633, 0.021706337109208107, -0.00957897212356329, -0.004645687062293291, 0.058239150792360306, -0.0016145291738212109, -0.003157577943056822, 0.059160664677619934, -0.02493821457028389, 0.028708890080451965, -0.022162050008773804, -0.016104668378829956, -0.04646095260977745, -0.022110985592007637, 0.10325073450803757, -0.039289526641368866, 0.013128986582159996, -0.035218462347984314, -0.0039042900316417217, -0.013764727860689163, 0.0016802630852907896, -0.012944351881742477, -0.011330163106322289, -0.009682339616119862, -0.010197073221206665, -0.04588603228330612, 0.021185457706451416, 0.02849634177982807, 0.007573490496724844, -0.008708823472261429, 0.009174525737762451, -0.03972255438566208, 0.005314575973898172, -0.022888651117682457, -0.029660511761903763, -0.016558628529310226, 0.04848957434296608, -0.02906486578285694, 0.02170192264020443, -0.03615400940179825, 0.022589467465877533, 0.07509852945804596, 0.012858596630394459, 0.010565542615950108, -0.05896903574466705, -0.006168900523334742, 0.0006262952229008079, -0.016750501468777657, -0.04270175099372864, 0.010386757552623749, -0.0468684621155262, 0.008214878849685192, -0.012789204716682434, 0.033028293401002884, -0.009277735836803913, -0.004368272610008717]" ./train/Rhodesian_ridgeback/n02087394_5664.JPEG,Rhodesian_ridgeback,"[-0.02899125963449478, 0.03317302092909813, -0.0056635173968970776, 0.051880862563848495, 0.020769653841853142, -0.06420018523931503, 0.009078173898160458, 0.01534159667789936, -0.02136036567389965, 0.009404926560819149, -0.02849351242184639, -0.021982558071613312, -0.0009343514684587717, -0.019103670492768288, 0.020693626254796982, 0.006080609746277332, -0.047292035073041916, 0.0441165454685688, 0.0007503512315452099, -0.02591431327164173, -0.030626608058810234, -0.0055090212263166904, 0.024271203204989433, 0.034598175436258316, -0.0060048652812838554, -0.010374167002737522, -0.028979185968637466, -0.02509286440908909, -0.012571495026350021, -0.0015516109997406602, 0.004989545326679945, 0.0153352627530694, -0.004781673196703196, -0.02917875163257122, -0.021997319534420967, -0.0018986407667398453, 0.0015051111113280058, -0.02113638073205948, -0.014559620060026646, 0.08158941566944122, -0.0497429296374321, 0.015013061463832855, -0.0050403401255607605, -0.000431773834861815, -0.005014166235923767, -0.08234797418117523, 0.009571998380124569, -0.021019134670495987, 0.027435699477791786, 0.015013981610536575, 0.012391946278512478, 0.00021641621424350888, -0.00034203039831481874, 0.01583845540881157, 0.02525361441075802, 0.027804799377918243, 0.045331817120313644, 0.017620006576180458, -0.018305959179997444, -0.0025042137131094933, -0.027067003771662712, 0.0005499146645888686, 0.04426385462284088, 0.0361085869371891, -0.017168788239359856, -0.0139418113976717, 0.05973569303750992, 0.09564018994569778, -0.0023968724999576807, -0.017233440652489662, 0.01907203532755375, 0.021845199167728424, 0.009419302456080914, -0.005755740217864513, -0.002473371336236596, -0.004112685564905405, 0.007018249947577715, -0.017793728038668633, 0.01807456836104393, -0.0044454303570091724, -0.024624042212963104, 0.00977333728224039, -0.030791286379098892, -0.00645156716927886, 0.0010398293379694223, 0.03774317353963852, 0.12020669132471085, -0.023105740547180176, 0.017054444178938866, -0.012883668765425682, -0.005070478655397892, -0.0218976978212595, -0.6687414646148682, 0.026382936164736748, -0.0033923331648111343, 0.03130587190389633, -0.0025204881094396114, 0.021614758297801018, -0.03985346481204033, 0.039742324501276016, -0.026139583438634872, 0.007673740852624178, 0.0005516718374565244, 0.007009470835328102, 0.061289429664611816, -0.01980026811361313, -0.01707221008837223, -0.01189662516117096, 0.0335712656378746, -0.023798270151019096, -0.014213915914297104, -0.0744561105966568, 0.0005315548041835427, -0.032933589071035385, -0.010645320639014244, -0.052195701748132706, 0.0013187958393245935, -0.009622400626540184, 0.03893904387950897, -0.00990702398121357, -0.005194651894271374, -0.004412974696606398, 0.05449303239583969, -0.009056542068719864, -0.01677851192653179, -0.043453242629766464, 0.015695294365286827, 0.022366924211382866, -0.010561501607298851, -0.016204416751861572, 0.03216039761900902, 0.0067282323725521564, 0.008623975329101086, 0.0830380842089653, -0.0476309172809124, 0.03123825415968895, 0.04469377174973488, -0.03141419589519501, -0.014686837792396545, 0.032261237502098083, 0.026554079726338387, -0.0021584047935903072, -0.004658900201320648, 0.019859949126839638, -0.01283192541450262, 0.035814572125673294, 0.005516296252608299, 0.01182579156011343, -0.0001253167138202116, 0.03563090041279793, -0.029903851449489594, 0.01290950644761324, -0.011912277899682522, -0.01621834747493267, 0.0007000274490565062, 0.017712727189064026, 0.00047010331763885915, -0.024272233247756958, 0.029620664194226265, 0.002198748756200075, -0.0056657628156244755, 0.005117048509418964, 0.0210663340985775, 0.024727363139390945, 0.0088590607047081, -0.04946642369031906, -0.034177228808403015, 0.04603486508131027, 0.025594443082809448, 0.003979829140007496, 0.004685498308390379, 0.03142007440328598, 0.03714568167924881, -0.0020953950006514788, -0.007560182828456163, -0.020925933495163918, 0.062040749937295914, 0.026691477745771408, -0.004299047868698835, 0.009044292382895947, -0.028917819261550903, -0.037869539111852646, 0.01253444142639637, -0.04090210795402527, 0.023598916828632355, 0.0052816360257565975, 0.028542501851916313, 0.004850335419178009, -0.0015500924782827497, 0.02110716514289379, 0.012287060730159283, -0.008800851181149483, -0.016656411811709404, 0.014476132579147816, -0.038900766521692276, 0.009464207105338573, -0.018827414140105247, -0.004445016849786043, -0.13830652832984924, -0.06870057433843613, 0.01196067314594984, 0.044193416833877563, 0.01390149723738432, 0.03321501985192299, -0.020122529938817024, -0.029451223090291023, -0.012480824254453182, -0.03196804225444794, -0.005488364025950432, 0.06113226339221001, -0.030015675351023674, 0.054348837584257126, 0.019695015624165535, 0.006325938738882542, -0.022043215110898018, -0.009563909843564034, -0.0022671918850392103, -0.00022107336553744972, 0.10860148072242737, -0.02547561377286911, 0.03664178401231766, 0.054123785346746445, -0.01934310421347618, -0.02711808867752552, -0.006958452984690666, -0.017772728577256203, -0.0060814921744167805, -0.036247462034225464, 0.020515060052275658, -0.003074157750234008, -0.013314420357346535, -0.000990789383649826, 0.00798744149506092, 0.05230648070573807, 0.0023875883780419827, -0.08806008100509644, -0.012066343799233437, -0.01366499438881874, 0.036085933446884155, 0.003130603116005659, 0.016109993681311607, 0.04860995337367058, 0.008369076997041702, -0.04390409588813782, -0.018928799778223038, 0.06673108786344528, 0.047999706119298935, -0.06254883110523224, -0.0025205144193023443, 0.053391233086586, 0.02455795556306839, 0.03976339101791382, -0.0124595295637846, 0.006803099066019058, -0.003811528906226158, -0.017130183055996895, 0.0025536478497087955, 1.1099989023932721e-05, -0.08441822975873947, -0.020321274176239967, -0.03725282847881317, 0.01639149896800518, 0.010954436846077442, -0.02547464706003666, 0.016374310478568077, -0.01771024614572525, -0.017406029626727104, 0.014631487429141998, -0.010482391342520714, 0.017377745360136032, -0.012861530296504498, 0.004589062184095383, 0.05949326604604721, -0.01478650700300932, 0.008377167396247387, -0.013352613896131516, -0.012098685838282108, -0.019996564835309982, -0.017609180882573128, 0.0021491076331585646, 0.004550434183329344, -0.009235282428562641, -0.04194963350892067, 0.010917898267507553, 0.0045678988099098206, 0.005227130372077227, -0.1707666516304016, 0.0040830327197909355, -0.019079284742474556, 0.005045165307819843, 0.023809609934687614, -0.0017692982219159603, -0.04096761345863342, 0.010906202718615532, -0.004705298691987991, 0.00032793378341011703, 0.027692480012774467, 0.005507953930646181, 0.01916452683508396, 0.005283137783408165, -0.01802179031074047, -0.01575501635670662, -0.018261754885315895, -0.012666094116866589, 0.050518978387117386, -0.008324157446622849, -0.03819156065583229, 0.030769342556595802, 0.020657235756516457, -0.009159449487924576, -0.011455385014414787, 0.056267257779836655, 0.08289042860269547, 0.001709852833300829, -0.0007173172780312598, -0.015731848776340485, 0.05644689500331879, 0.040269382297992706, -0.034240495413541794, -0.06975814700126648, 0.041663821786642075, 0.062407638877630234, -0.05071653053164482, 0.034957706928253174, 0.04427885264158249, 0.007310608867555857, -0.009548316709697247, 0.03504781424999237, -0.019467880949378014, 0.0022904789075255394, -0.014706185087561607, -0.003187738126143813, 0.0185844749212265, -0.05407913774251938, 0.016787603497505188, -0.003495751181617379, 0.03519802168011665, 0.012059365399181843, 0.02347663603723049, -0.020031800493597984, -0.0028405545745044947, -0.0662422925233841, -0.0020065666176378727, 0.010300529189407825, 0.025752563029527664, -0.0024913260713219643, -0.005373949185013771, 0.05000823363661766, -0.05659361183643341, -0.009565966203808784, -0.06887227296829224, 0.010844958946108818, -0.0029021224472671747, 0.02431466616690159, -0.006606523413211107, -0.008993360213935375, -0.012151696719229221, -0.04203194007277489, 0.024523591622710228, 0.0388193316757679, -0.005334748420864344, 0.013638350181281567, 0.010461137630045414, 0.028602086007595062, 0.011249208822846413, 0.023059260100126266, -0.007460279855877161, -0.04306686297059059, -0.005131469573825598, -0.04031535983085632, 0.03248302638530731, 0.019335610792040825, 0.027179578319191933, 0.03539060801267624, 0.0021969731897115707, -0.002558665117248893, 0.16423161327838898, 0.007741499226540327, -0.0032485362607985735, 0.02770886942744255, -0.013194803148508072, -0.06399160623550415, -0.019458765164017677, 0.0002508023171685636, 0.022298870608210564, -0.043787796050310135, 0.023636819794774055, -0.008097057230770588, 0.026316434144973755, -0.10122396051883698, 0.03327816724777222, -0.057976920157670975, 0.014517621137201786, -0.0198570154607296, -0.026674684137105942, -0.008526419289410114, -0.011256416328251362, -0.03797948360443115, -0.07090343534946442, -0.043420761823654175, 0.002760916016995907, -0.012878610752522945, 0.0058709727600216866, 0.012465283274650574, -0.0191149041056633, 0.005056711379438639, -0.018059201538562775, -0.011447652243077755, 0.07260122150182724, -0.028732651844620705, 0.09141276776790619, -0.018376227468252182, -0.03193899616599083, 0.021540377289056778, -0.029249772429466248, -0.028530413284897804, -0.008041385561227798, 0.027270998805761337, 0.011418740265071392, -0.0455777645111084, -0.0014680601889267564, 0.013910937123000622, 0.0031895427964627743, 0.006718674674630165, 0.012035044841468334, -0.025311972945928574, -0.021473649889230728, -0.03185028210282326, -0.08194359391927719, 0.0164197888225317, 0.00979262962937355, 0.04966532811522484, -0.010446375235915184, 0.01566840335726738, -0.015222330577671528, -0.0444253608584404, -0.04159804806113243, 0.04177352041006088, 0.013865907676517963, -0.027828440070152283, 0.004446592181921005, -0.021875567734241486, -0.004991617053747177, -0.0038658829871565104, 0.027306467294692993, -0.0008922039414756, 0.011428352445363998, -0.004000414628535509, -0.004183437209576368, -0.04033149033784866, -0.0489530935883522, -0.021568160504102707, 0.018427085131406784, 0.043983884155750275, -0.035818591713905334, -0.009139039553701878, 0.05121038109064102, 0.012474238872528076, 0.02672913856804371, 0.01328091137111187, 0.01584203913807869, -0.042358316481113434, 0.02025638148188591, -0.049744248390197754, 0.05996574088931084, 0.017071137204766273, -0.05571309104561806, 0.032898589968681335, -0.009432122111320496, -0.019865455105900764, 0.04423270374536514, -0.011207809671759605, -0.001263551996089518, -0.04339727759361267, -0.04177422448992729, -0.023061972111463547, -0.009665058925747871, -0.003706139512360096, -0.03627753630280495, -0.06341040134429932, -0.011131052859127522, -0.005590340588241816, 0.017808733507990837, -0.001147085684351623, -0.026920899748802185, 0.009099168702960014, -0.022000638768076897, -0.017107252031564713, -0.007074524648487568, -0.01798495091497898, 0.005491181276738644, -0.05296119302511215, 0.02982616052031517, -0.03177192062139511, -0.0007685291348025203, -0.02558046579360962, -0.00012990149843972176, 0.06399178504943848, -0.009679695591330528, 0.031911976635456085, -0.037188488990068436, -0.0011856136843562126, -0.009918508119881153, -0.006001745816320181, 0.06618742644786835, -0.012014362961053848, -0.06722822785377502, 0.013764957897365093, -0.034705210477113724, 0.06160711124539375, -0.0395762175321579, -0.027266358956694603]" ./train/Rhodesian_ridgeback/n02087394_21329.JPEG,Rhodesian_ridgeback,"[-0.025644954293966293, 0.011788693256676197, 0.0026109954342246056, 0.016171714290976524, 0.027771446853876114, -0.042158279567956924, 0.024537591263651848, 0.004382104612886906, -0.0021457839757204056, -0.0008596029365435243, -0.028129752725362778, -0.019504664465785027, -0.002774318912997842, -0.004253287799656391, 0.054629988968372345, 0.03129402920603752, 0.07170689851045609, -0.010222033597528934, 0.020030895248055458, -0.04429040476679802, -0.03236914798617363, 0.004376193042844534, -0.0024940534494817257, 0.02599390037357807, -0.030154196545481682, -0.02302185632288456, -0.013667773455381393, -0.016141312196850777, 0.004762436728924513, -0.005045976489782333, 0.03292896971106529, 0.04346372187137604, -0.002176003996282816, -0.03128829225897789, -0.022921578958630562, 0.0039257449097931385, -0.010048070922493935, 0.016750339418649673, -0.03080504760146141, 0.10472717136144638, -0.016140123829245567, -0.021189970895648003, 0.018344560638070107, -0.047129906713962555, 0.005727600771933794, -0.03610925376415253, 0.009691761806607246, -0.00033173238625749946, 0.0018060028087347746, 0.021783677861094475, 0.003660057205706835, 0.06099478900432587, -0.000556741317268461, 0.006964638829231262, 0.034975048154592514, -0.009077858179807663, 0.01732163317501545, 0.023123648017644882, -0.011486887000501156, -0.008652196265757084, 0.0807466059923172, 0.0014830997679382563, 0.034714821726083755, 0.05016372352838516, -0.026186103001236916, -0.02065110392868519, 0.009096772409975529, 0.11917635798454285, -0.03398175910115242, -0.003480239538475871, -0.0068206931464374065, -0.02357565425336361, -0.006128582172095776, 0.031040064990520477, -0.03561031445860863, -0.007383811753243208, -0.02890627644956112, -0.019498765468597412, 0.018268132582306862, -0.04955250024795532, 0.010183206759393215, 0.03240815922617912, 0.0012724197003990412, -0.030280178412795067, 0.010178483091294765, 0.037682391703128815, 0.01203247532248497, -0.032345447689294815, 0.04458693042397499, -0.007564929313957691, -0.025783106684684753, -0.03570055961608887, -0.6622034311294556, 0.0014273611595854163, -0.01834641583263874, 0.003823856357485056, -0.01881660893559456, 0.04561949521303177, -0.12107190489768982, 0.049631986767053604, -0.004952603951096535, -0.0005461013060994446, -0.03781336173415184, -0.017296629026532173, 0.06125437468290329, -0.02632027491927147, -0.02873791754245758, 0.02219029888510704, 0.0343799963593483, -0.02825171872973442, -0.020036660134792328, -0.0328347310423851, 0.016035689041018486, 0.016918795183300972, 0.01241068821400404, -0.004462217912077904, 0.004111241549253464, -0.03226235881447792, 0.00517880916595459, -0.029242871329188347, -0.006478437688201666, 0.03455231338739395, 0.04317901283502579, 0.02623119205236435, -0.009342311881482601, -0.023981839418411255, 0.01203689444810152, 0.024590009823441505, -0.007558037061244249, -0.0061245812103152275, 0.0381922721862793, 0.005801633466035128, -0.017405226826667786, 0.08336497843265533, -0.018793025985360146, 0.013292995281517506, 0.02776542864739895, -0.04975418373942375, -0.002898583421483636, -0.004053050652146339, -0.004689967259764671, 0.000594292301684618, 0.0023250156082212925, 0.035285625606775284, 0.005297048017382622, 0.011374574154615402, 0.02419702522456646, -0.01311406772583723, -0.02798323892056942, 0.007048311643302441, -0.013019335456192493, 0.02174455113708973, 0.060570620000362396, -0.048571716994047165, -0.056159865111112595, 0.02951068803668022, -0.04205096513032913, -0.018308252096176147, -0.004529127851128578, -0.009113536216318607, 0.0074289157055318356, 0.03103996254503727, 0.008451277390122414, -0.023916037753224373, 0.01392521895468235, -0.031716395169496536, -0.051374442875385284, 0.04205471649765968, -0.0043908073566854, 0.05324190482497215, 0.006863588932901621, 0.05280836299061775, 0.02124115452170372, -0.00896894559264183, 0.004470017738640308, -0.04858876392245293, 0.042917508631944656, -0.01150206197053194, 0.03547441214323044, -0.0038341470062732697, -0.02797600068151951, -0.0160579401999712, 0.042095351964235306, -0.03873775899410248, 0.011635111644864082, 0.02075224556028843, -0.04488939046859741, -0.005969759542495012, -0.011906388215720654, 0.05092490464448929, 0.021016407757997513, 0.015768636018037796, -0.01057265792042017, 0.011142848990857601, -0.06637565046548843, 0.016939086839556694, 0.004884950816631317, -0.01447509415447712, -0.07906493544578552, -0.05967545136809349, -0.0014194872928783298, 0.002088648732751608, 0.011758694425225258, 0.04434015229344368, -0.019103266298770905, -0.05648462474346161, -0.016620714217424393, -0.017031904309988022, -0.01300597470253706, 0.0359085388481617, -0.007043435703963041, -0.008278400637209415, 0.01175836194306612, 0.022739237174391747, -0.006324228830635548, -0.01640457473695278, -0.002583601512014866, 0.0048134177923202515, 0.10999178886413574, -0.01716848462820053, 0.04293223097920418, 0.0513681024312973, 0.016099341213703156, -0.001422857167199254, -0.027098624035716057, 0.016563311219215393, -0.012531907297670841, -0.026567181572318077, 0.008221397176384926, 0.02061346173286438, 0.009164472110569477, 0.020680570974946022, -0.00421835295855999, 0.04915255308151245, 0.01526966504752636, -0.07453181594610214, -0.0034621325321495533, -0.02942204475402832, 0.021079258993268013, 0.01775815337896347, 0.0009702324750833213, 0.012294934131205082, 0.004947331268340349, -0.0005273113492876291, 0.0027121384628117085, 0.036609917879104614, 0.0256170816719532, -0.03537235036492348, 0.01760173961520195, 0.04982484132051468, 0.008681437000632286, 0.02266821637749672, -0.0023944468703120947, 0.004989785607904196, -0.006461573764681816, -0.005009779240936041, 0.016930976882576942, 0.014575187116861343, 0.009175701066851616, -0.002199903130531311, -0.05381016805768013, 0.03996694087982178, 0.01647818647325039, -0.004829865414649248, 0.009475278668105602, 0.015348817221820354, -0.014873822219669819, 0.01640428602695465, -0.0025570159777998924, 0.009300191886723042, -0.016702551394701004, -0.0008093433571048081, 0.0422838069498539, 0.0030071923974901438, -0.02282690815627575, -0.053735073655843735, -0.010127965360879898, 0.018019836395978928, 0.007419808302074671, -0.005276944953948259, -0.017474137246608734, 0.015166079625487328, -0.03200840577483177, -0.041907768696546555, -0.008382173255085945, -0.006779431831091642, -0.0858762338757515, 0.0002040460822172463, -0.021960848942399025, 0.008011038415133953, 0.0010644126450642943, 0.004337712656706572, -0.044461071491241455, 0.007108933292329311, -0.00536023173481226, -0.0013003165367990732, 0.00789677444845438, 0.030141348019242287, 0.040765430778265, -0.022869134321808815, -0.010270718485116959, -0.0498930849134922, -0.02901153452694416, -0.008916277438402176, 0.012891219928860664, -0.03452771529555321, -0.012877574190497398, 0.05099581182003021, 0.028505690395832062, 0.04416007548570633, -0.01797490380704403, 0.0638846904039383, 0.08324956893920898, 0.02545366995036602, -0.014803873375058174, -0.029267380014061928, 0.042088668793439865, 0.005084700416773558, -0.05229417234659195, -0.07358596473932266, 0.056039199233055115, 0.05830933153629303, -0.02035602554678917, 0.008825298398733139, 0.002361758379265666, 0.017490779981017113, -0.00514292623847723, 0.03579942137002945, -0.006845276337116957, 0.0030151642858982086, -0.0013347931671887636, -0.017913317307829857, 0.014731827192008495, -0.009371884167194366, 0.0390726737678051, -0.012538653798401356, 0.01773012988269329, 0.003668559482321143, 0.003936268389225006, -0.013389300554990768, -0.012860741466283798, -0.06936734914779663, -0.004331421107053757, -0.006985301151871681, 0.04190022870898247, -0.015531999059021473, -0.005874295718967915, 0.031586240977048874, -0.026165010407567024, -0.010173738934099674, -0.042204324156045914, 0.02203083410859108, 0.021154768764972687, 0.030788902193307877, 0.008047898299992085, 0.002137921517714858, 0.01688753068447113, -0.06731123477220535, 0.017307836562395096, 0.004893491975963116, 0.020352959632873535, 0.016877882182598114, 0.01996215060353279, 0.010774222202599049, 0.005597269162535667, 0.018421992659568787, -0.024363743141293526, -0.04744899272918701, -0.023392273113131523, -0.0327572226524353, 0.006421930156648159, 0.008136816322803497, -0.02045786753296852, 0.002293241210281849, -0.018625324591994286, -0.0149290282279253, 0.20191439986228943, 0.0006443529855459929, -0.0036639876198023558, 0.03126014024019241, 0.05497602000832558, -0.06519157439470291, 0.0079015102237463, -0.015276411548256874, 0.008022595196962357, 0.0048521715216338634, -0.00689621502533555, -0.0016830795211717486, 0.049778133630752563, -0.12009825557470322, -0.01633497141301632, -0.06702516227960587, 0.043436937034130096, -0.0432589128613472, -0.010373277589678764, 0.003971364349126816, -0.004931390751153231, -0.006626570131629705, -0.051244352012872696, -0.06593025475740433, -0.018903309479355812, -0.019727585837244987, -0.054786182940006256, -0.01350716408342123, 0.023054683580994606, -0.005894715432077646, -0.00554518261924386, -0.0035425571259111166, 0.09167280048131943, -0.020510265603661537, 0.07983238995075226, -0.002931776689365506, -0.05774858593940735, -0.028020888566970825, -0.023466145619750023, -0.0026169875636696815, -0.020034685730934143, 0.042016543447971344, 0.026261763647198677, -0.028548797592520714, 0.012765792198479176, 0.036944907158613205, 0.021937144920229912, -0.01527348905801773, 0.002541514113545418, 0.010117321275174618, -0.027502864599227905, -0.009687402285635471, -0.12157442420721054, -0.013442193157970905, 0.0244749803096056, 0.03686755150556564, -0.017554711550474167, -0.0013593145413324237, -0.01715654321014881, -0.04997723922133446, -0.08105137199163437, 0.013181813061237335, -0.004246455617249012, -0.0037547950632870197, 0.023323072120547295, -0.011301024816930294, 0.015407013706862926, -0.027005797252058983, 0.003489146241918206, -0.01826423406600952, 0.015756506472826004, -0.0021992733236402273, -0.012370392680168152, -0.05881796404719353, -0.02991430088877678, -0.013476029969751835, 0.024882353842258453, 5.7712819398147985e-05, -0.013314126059412956, -0.018161296844482422, 0.05158856883645058, 0.0035179019905626774, 0.02611461654305458, 0.01761043071746826, 0.032898910343647, -0.008502214215695858, 0.03140421211719513, -0.011625842191278934, 0.04640812799334526, 0.008075340650975704, -0.04191175475716591, 0.01720743253827095, -0.053411245346069336, -0.05274084955453873, 0.07659730315208435, 0.0037060438189655542, -0.018737221136689186, -0.04976237192749977, -0.016231719404459, -0.036049649119377136, -0.014230899512767792, -0.01576736941933632, -0.012481880374252796, -0.03904184699058533, 0.01606222242116928, 0.016831686720252037, 0.007436744403094053, -0.027527043595910072, -0.01368696615099907, 0.0021376097574830055, -0.05290458723902702, -0.02871835045516491, -0.007197425700724125, -0.036878954619169235, -0.00967331137508154, -0.04731877148151398, 0.053018294274806976, -0.01711968518793583, 0.005203284323215485, -0.011030996218323708, 0.009212091565132141, 0.08657190203666687, -0.024397239089012146, 0.03070426546037197, -0.07221223413944244, -0.01961439661681652, 0.00521020358428359, -0.01310091745108366, 0.0018001069547608495, -0.034422263503074646, -0.04142124950885773, 0.030120590701699257, -0.03848738223314285, 0.06972593814134598, -0.021260228008031845, -0.000786780787166208]" ./train/Rhodesian_ridgeback/n02087394_5846.JPEG,Rhodesian_ridgeback,"[-0.005391986574977636, 0.017691053450107574, 0.0022305939346551895, -0.012397385202348232, 0.014924729242920876, -0.05478691682219505, 0.032143961638212204, 0.0588843859732151, 0.07151506841182709, 0.019826281815767288, -0.01983918994665146, 0.01525361742824316, -0.01885691098868847, -0.011924251914024353, 0.01608782634139061, 0.01831902377307415, 0.0016319771530106664, -0.019304264336824417, -0.013436757028102875, 0.0199236199259758, -0.08029139041900635, 0.0021957061253488064, -0.0013394082197919488, 0.012649846263229847, -0.013112913817167282, -0.021702837198972702, 0.04071122407913208, 0.003955436870455742, 0.014486312866210938, 0.017860647290945053, -0.03698559105396271, -0.00844564102590084, -0.03285542130470276, 0.008930519223213196, -0.02994823455810547, 0.04052222892642021, 0.030189286917448044, -0.04700770229101181, -0.013658326119184494, 0.14125680923461914, -0.08621508628129959, 0.005365687422454357, 0.00021489293430931866, 0.007651452906429768, 0.0028803166933357716, 0.03873344510793686, 0.005647776648402214, -0.016823407262563705, 0.042077381163835526, 0.01751539669930935, -0.014504188671708107, 0.014438329264521599, -0.004290490876883268, 0.0018486634362488985, 0.0387326180934906, 0.055541280657052994, -0.047976259142160416, 0.03161672502756119, 0.006789746694266796, -0.03008427657186985, 0.06121120974421501, 0.005827050656080246, 0.03452357277274132, 0.05331454053521156, -0.02450154721736908, -0.013078983873128891, -0.006638368591666222, 0.023762745782732964, -0.024478258565068245, -0.005798616912215948, -0.0019510671263560653, -0.02250448428094387, -0.021393632516264915, 0.022788599133491516, -0.03344695270061493, -0.027303343638777733, -0.050680432468652725, -6.894405669299886e-05, 0.01734408363699913, -0.006977749988436699, 0.014659307897090912, -0.035194721072912216, -0.0404941700398922, -0.03645014762878418, 0.015078487806022167, -6.957248115213588e-05, 0.10016521066427231, -0.009901348501443863, 0.07822477072477341, 0.0071303993463516235, -0.019525859504938126, -0.01373169757425785, -0.6278891563415527, 0.07291746139526367, -0.062298472970724106, 0.01598794013261795, 0.012573099695146084, 0.011693781241774559, -0.0929255560040474, 0.06209933012723923, -0.007604517508298159, 0.005246815271675587, -0.03430387005209923, -0.006129328161478043, 0.024625152349472046, 0.0029108307790011168, 0.11188171803951263, -0.003630821593105793, 0.004116780124604702, -0.04975070431828499, 0.009676617570221424, 0.0017332235584035516, 0.025375353172421455, 0.002497987123206258, 0.007689016871154308, 0.009950736537575722, -0.08766285330057144, -0.0704977884888649, 0.007708231918513775, -0.013334348797798157, 0.03273578733205795, 0.017867324873805046, 0.03048928640782833, 0.032036226242780685, -0.014318895526230335, -0.013653857633471489, -0.0011197928106412292, 0.0388350673019886, -0.047362376004457474, -0.04986664652824402, 0.07445409148931503, 0.0590493381023407, 0.015262359753251076, 0.08631650358438492, -0.06709418445825577, 0.009015017189085484, 0.05177266150712967, -0.023866688832640648, -0.02357330732047558, -0.028702061623334885, 0.01105351559817791, -0.012946891598403454, 0.02034696750342846, -0.006287009920924902, -0.013452112674713135, 0.02603726275265217, 0.007644022814929485, -0.03729768469929695, 0.051674336194992065, 0.006163427140563726, -0.01630619540810585, -0.0035728663206100464, -0.053432244807481766, 0.03527335077524185, -0.024424677714705467, -0.006453230045735836, -0.04623183608055115, -0.01399326603859663, 0.007457921747118235, 0.024413075298070908, 0.016773799434304237, 0.004407459404319525, -0.025203824043273926, 0.017599575221538544, -0.03436971455812454, -0.043637681752443314, -0.10021776705980301, -0.010239524766802788, 0.010912532918155193, 0.03055335208773613, 0.04005587473511696, 0.0011694723507389426, 0.020687779411673546, -0.03158596158027649, -0.042366620153188705, 0.012841039337217808, -0.0299274493008852, -0.009464872069656849, 0.016470078378915787, -0.025435276329517365, -0.031794410198926926, 0.011128194630146027, 0.039540424942970276, -0.06662911921739578, -0.043987296521663666, -0.03537382185459137, -0.02097848616540432, 0.0025822171010077, -0.018338119611144066, 0.01937953755259514, 0.030911607667803764, 0.019923802465200424, -0.010854248888790607, -0.013998638838529587, -0.0030666207894682884, 0.007958909496665001, 0.03342549502849579, -0.02750435099005699, -0.13337551057338715, -0.005681950133293867, -0.02084488794207573, 0.045521367341279984, 0.0035258049611002207, -0.00746307335793972, -0.04519635811448097, -0.04544134810566902, 0.028682835400104523, -0.01649555191397667, -0.024268288165330887, 0.047294843941926956, 0.0034121170174330473, 0.00538440840318799, 0.02332933433353901, 0.01649387739598751, 0.009051177650690079, -0.06454499810934067, -0.03293003514409065, -0.0020585916936397552, 0.011031092144548893, -0.02467307448387146, 0.02058599330484867, 0.03628186509013176, -0.007103626150637865, 0.007631917484104633, -0.013025371357798576, -0.031263913959264755, 0.0019947586115449667, -0.07610946893692017, -0.0010777569841593504, -0.018483538180589676, 0.004764973185956478, 0.01402492169290781, -0.006277474574744701, 0.09451508522033691, -0.020821304991841316, -0.007637777831405401, 0.004989268258213997, -0.012099593877792358, 0.027708811685442924, -0.03655256703495979, 0.03384053707122803, 0.02097843587398529, 0.0183493010699749, -0.014925920404493809, 0.017190277576446533, 0.026871806010603905, 0.02551736868917942, -0.03322552144527435, 0.020625993609428406, 0.016381267458200455, 0.06351812183856964, 0.008886816911399364, 0.03397113084793091, -0.03275459632277489, 0.006632815580815077, 0.010901892557740211, 0.0013139396905899048, -0.01451388280838728, -0.04187629744410515, -0.027936968952417374, -0.03242424130439758, 0.00392987160012126, 0.05376756936311722, -0.03849327936768532, 0.004115990363061428, -0.007081995718181133, -0.040776412934064865, -0.00838315300643444, -0.005117494147270918, 0.017038270831108093, 0.02352968230843544, -0.010183400474488735, 0.04182342439889908, 0.002848950680345297, -0.010281047783792019, -0.002194163389503956, -0.012245864607393742, 0.020849697291851044, 0.011312051676213741, 0.020414268597960472, -0.019972410053014755, 0.008832997642457485, -0.02482936717569828, -0.0330527164041996, 0.025440914556384087, 0.018525971099734306, 0.007276801858097315, 0.03592492267489433, -0.01518238615244627, 0.047653328627347946, 0.02141023613512516, -0.027678804472088814, -0.03696908429265022, 0.02051270566880703, -0.008394142612814903, 0.026472387835383415, 0.10085442662239075, 0.037785664200782776, 0.06335127353668213, 0.013652759604156017, -0.004250367637723684, -0.013871575705707073, -0.004932180512696505, -0.013431623578071594, 0.007477251812815666, 0.014480357989668846, 0.0005252280388958752, 0.016255399212241173, 0.004309349227696657, -0.011592834256589413, -0.01573210209608078, 0.05300014466047287, 0.0861005112528801, -0.00027667279937304556, -0.02370787411928177, -0.012792913243174553, 0.001622582320123911, 0.052370522171258926, -0.004937384277582169, 0.01942494511604309, 0.03685326129198074, 0.029232880100607872, -0.009726098738610744, -0.03663291782140732, 0.052209626883268356, -0.03708072006702423, 0.009106023237109184, 0.03445904701948166, -0.011473577469587326, -0.0016386540373787284, -0.0059858523309230804, -0.019241809844970703, 0.013552459888160229, -0.03814413771033287, 0.015528273768723011, 0.020209329202771187, -0.0001974956103367731, 0.0228281132876873, -0.03676580637693405, -0.021239373832941055, 0.04316273331642151, -0.026680458337068558, 0.021695466712117195, 0.005663976073265076, 0.007053046952933073, 0.0028948872350156307, 0.05081503838300705, 0.0070738703943789005, -0.02431575208902359, 0.013718661852180958, -0.009567040018737316, 0.03148091956973076, 0.04135219007730484, 0.018594665452837944, -0.02778344601392746, 0.06554219871759415, -0.051547594368457794, -0.07740899920463562, -0.0015624799998477101, -0.008472120389342308, 0.04297628998756409, -0.00906402338296175, -0.019807100296020508, -0.07438536733388901, -0.10814590752124786, 0.04143177345395088, 0.028607821092009544, 0.02243051305413246, -0.021722441539168358, 0.0007777286227792501, -0.013272945769131184, 0.03949497640132904, -0.050396110862493515, -0.0028940036427229643, 0.0054226466454565525, -0.000869342009536922, 0.19810111820697784, 0.002547759562730789, -0.028329890221357346, 0.027520351111888885, 0.011642142198979855, -0.037674807012081146, 0.027082841843366623, 0.028230171650648117, -0.008089377544820309, -0.024764811620116234, -0.004594744648784399, -0.018147548660635948, 0.045349203050136566, -0.10666856914758682, 0.0035193643998354673, -0.06858539581298828, 0.009097951464354992, 0.045434024184942245, 0.015563732013106346, -0.010489290580153465, 0.015973959118127823, 0.025033308193087578, -0.07072363048791885, -0.016767462715506554, -0.009582191705703735, 0.027290958911180496, -0.003426824463531375, 0.006395412143319845, 0.006399312522262335, 0.028240734711289406, -0.0029522560071200132, 0.018539896234869957, -0.038044992834329605, -0.02467244863510132, 0.0890941247344017, -0.0007015911978669465, -0.005614669527858496, -0.00700412318110466, 0.007868952117860317, -0.004608053248375654, 0.0036456710658967495, 0.00710019888356328, -0.008661936968564987, -0.06836719810962677, -0.02397197112441063, 0.01165942195802927, 0.03592205420136452, 0.025678036734461784, 0.0016793393297120929, -0.007712677586823702, -0.03029772825539112, -0.0017517536180093884, 0.01974976249039173, -0.017513714730739594, -0.06451152265071869, 0.030192574486136436, 0.018391078338027, 0.032764825969934464, -0.037879690527915955, -0.03625855594873428, -0.06459753215312958, 0.04810040816664696, 0.005171953234821558, 0.019549669697880745, 0.015476541593670845, 0.00808633305132389, -0.006902987603098154, -0.014877340756356716, 0.01514826063066721, -0.011177574284374714, 0.038105305284261703, -0.024714728817343712, -0.006672631949186325, -0.024556130170822144, -0.006063050124794245, 0.0297069251537323, 0.01693647913634777, 0.060974862426519394, -0.022725354880094528, -0.042329221963882446, -0.012718919664621353, 0.044596392661333084, -0.009680472314357758, 0.051052045077085495, 0.016775311902165413, 0.003033250104635954, 0.00685113575309515, 0.02385883964598179, 0.01781260408461094, 0.027649853378534317, -0.04782991111278534, 0.019228409975767136, -0.006728203035891056, -0.008597920648753643, -0.009056184440851212, -0.023312794044613838, -0.015597645193338394, 0.0034731216728687286, 0.0005337924812920392, -0.015489204786717892, -0.023672373965382576, -0.006827234756201506, -0.03733714297413826, -0.04256891831755638, -0.04138247296214104, -0.03548938408493996, -0.00011985704622929916, -0.007676995825022459, 0.0035624003503471613, 0.028521249070763588, 0.003494899719953537, -0.04887307807803154, 0.021632278338074684, -0.03447125107049942, -0.05285876616835594, -0.05549907311797142, -0.031803976744413376, -0.012178911827504635, -3.320666655781679e-05, 0.011355203576385975, 0.008316188119351864, 0.01939818449318409, 0.010616258718073368, -0.04401259869337082, 0.02993876487016678, 0.00255530490539968, 0.020799769088625908, 0.021544253453612328, -0.044433269649744034, -0.019841980189085007, -0.05082302913069725, 0.028465744107961655, 0.004468484316021204, -0.008348950184881687, 0.04269899055361748, -0.04126589372754097]" ./train/Rhodesian_ridgeback/n02087394_278.JPEG,Rhodesian_ridgeback,"[-0.010339646600186825, 0.03905864059925079, -0.04427637532353401, 0.03662688285112381, 0.00551714189350605, -0.04597872495651245, 0.020785879343748093, -0.004985305480659008, 0.028318464756011963, 0.022074051201343536, 0.009960295632481575, 0.013138801790773869, -0.0455985963344574, -0.01822056621313095, 0.015963178128004074, -0.014736722223460674, 0.04574273154139519, 0.011314240284264088, -0.02903951331973076, 0.011861455626785755, -0.052854057401418686, 0.007721449714154005, -0.014218444935977459, 0.001264224760234356, 0.010907000862061977, 0.01584598235785961, 0.004897905979305506, -0.0014795337338000536, 0.006465176586061716, -0.006136247888207436, -0.01899932511150837, 0.012732642702758312, -0.023714790120720863, -0.015033792704343796, -0.10992522537708282, 0.017254678532481194, 0.006113577168434858, -0.08104635775089264, -0.0007259405683726072, 0.11210425198078156, -0.03016890026628971, 0.0072476621717214584, -0.03543993458151817, -0.0400056391954422, 0.005719995591789484, -0.06976001709699631, 0.052959661930799484, 0.027112282812595367, 0.005807176697999239, 0.03563360869884491, -0.04620663449168205, 0.0033028069883584976, -0.010153735987842083, -0.001875001355074346, 0.010101289488375187, 0.001711782068014145, -0.037188973277807236, 0.03054759092628956, -0.025636514648795128, -0.01918015070259571, -0.03482460975646973, 0.004015339072793722, 0.06685641407966614, 0.0636986494064331, -0.039200808852910995, -0.015290392562747002, 0.05902404710650444, 0.05844423174858093, -0.03405583277344704, -0.021355587989091873, 0.01009396743029356, -0.021286554634571075, 0.016300112009048462, 0.0504414401948452, 0.01121311355382204, 0.005597311072051525, -0.015102432109415531, -0.016404779627919197, -0.008734338916838169, -0.03029402159154415, 0.001691907411441207, -0.012130534276366234, -0.012961125932633877, -0.008497582748532295, 0.025414396077394485, 0.03128167241811752, 0.08056488633155823, -0.043505970388650894, 0.050271742045879364, -0.011639711447060108, 0.025482743978500366, -0.030322914943099022, -0.6253664493560791, 0.03459562733769417, -0.055482883006334305, 0.012391149066388607, 0.012750346213579178, 0.01617354154586792, -0.05431871861219406, 0.08593559265136719, -0.02808159962296486, -0.01393354032188654, -0.018558986485004425, -0.0002472304040566087, 0.05528553947806358, -0.032639630138874054, 0.035755280405282974, -0.002731448272243142, 0.03607450798153877, -0.018773602321743965, -0.0512390173971653, -0.07964260131120682, 0.010252592153847218, 0.004775128792971373, -0.01423320360481739, -0.02933850698173046, -0.03135278820991516, -0.009535428136587143, 0.026022231206297874, 0.011426218785345554, 0.022747017443180084, -0.028731312602758408, 0.024174410849809647, 0.04738447815179825, -0.013125111348927021, -0.04748585447669029, 0.010225223377346992, -0.004672934301197529, -0.04546641558408737, -0.05583610758185387, 0.06216898560523987, 0.011568200774490833, 0.021136987954378128, 0.08159518986940384, -0.029202355071902275, 0.04151567816734314, 0.02192777581512928, -0.05828089267015457, -0.04711170494556427, 0.011390202678740025, 0.035115838050842285, -0.04187607765197754, 0.022716650739312172, 0.024820681661367416, 0.02747446671128273, 0.08838433772325516, 0.020428581163287163, -0.029786452651023865, -0.0061128283850848675, 0.023757239803671837, -0.06296823173761368, 0.023331457749009132, -0.004303973168134689, 0.021055836230516434, -0.0035291104577481747, 0.013990840874612331, -0.03844522312283516, -0.010804795660078526, 0.04165119677782059, 0.02086591348052025, 0.012927064672112465, 0.0025722146965563297, 0.013199616223573685, 0.023993713781237602, 0.0017928474117070436, -0.02474644035100937, -0.045871589332818985, 0.0035952934995293617, 0.012057088315486908, 0.01944211684167385, 0.00914702657610178, 0.03542560711503029, 0.015575747936964035, -0.01503022387623787, 0.01601666398346424, -0.0007900021155364811, 0.04980982840061188, -0.016770852729678154, 0.019268201664090157, -0.007674922235310078, -0.04065057262778282, -0.02252037078142166, 0.02805248834192753, -0.07464098930358887, 0.006647870410233736, 0.0012190809939056635, 0.03838586434721947, 0.01713525503873825, 0.002001642482355237, 0.026383524760603905, 0.044038623571395874, 0.013380360789597034, 0.015412012115120888, -0.022183002904057503, -0.013287652283906937, 0.00842969212681055, 0.0038699216675013304, -0.0009747152216732502, -0.12413594126701355, -0.05280923843383789, 0.0032940588425844908, 0.04085042327642441, 0.026330117136240005, -0.0025973289739340544, -0.02851216122508049, -0.055750031024217606, 0.0018411146011203527, -0.0014864678960293531, -0.011191185563802719, 0.04252554848790169, -0.024646354839205742, 0.02822248637676239, 0.008612736128270626, 0.009592890739440918, -0.004712221212685108, -0.029055288061499596, -0.005250677932053804, 0.03286055102944374, 0.1300635188817978, 0.004856949206441641, 0.016598768532276154, 0.011676136404275894, -0.027349082753062248, 0.006959372665733099, -0.02128349058330059, -0.004276379942893982, -0.007771203760057688, -0.02621028758585453, -0.006979340221732855, -0.00040776815149001777, -0.043349653482437134, 0.020826350897550583, -0.005194316152483225, 0.04159267991781235, -0.006700410507619381, -0.040112558752298355, -0.030939551070332527, 0.004938547499477863, 0.021298792213201523, -0.000610376475378871, 0.012197067961096764, 0.001866475329734385, 0.015017175115644932, -0.039579279720783234, -0.0421413853764534, 0.11013729125261307, 0.03867311030626297, -0.018050717189908028, 0.024639885872602463, 0.07793807983398438, 0.04843248426914215, 0.036105092614889145, 0.009914636611938477, -0.01588389463722706, 0.023626485839486122, 0.013631586916744709, -0.010209927335381508, 0.0034170823637396097, 0.04283933714032173, 0.008499417454004288, -0.03253105655312538, 0.008534083142876625, 0.022205032408237457, -0.047001272439956665, 0.01823495142161846, -0.028662586584687233, -0.015105652622878551, -0.001545483828522265, -0.019111139699816704, 0.025424282997846603, -0.003460813546553254, -0.009727584198117256, 0.045108139514923096, 0.007440049666911364, 0.004899084568023682, -0.008343128487467766, -0.04112769663333893, -0.0009356951923109591, -0.000721571734175086, 0.009531855583190918, -0.009370222687721252, 0.018491597846150398, -0.039615388959646225, 0.010291960090398788, 0.03548731654882431, 0.039062321186065674, 0.013994067907333374, 0.03096366487443447, 0.001438224338926375, 0.012929492630064487, -0.006101786158978939, 0.009842721745371819, -0.02487514726817608, 0.016457684338092804, -0.013144533149898052, -0.000488738645799458, 0.04236304759979248, 0.016956353560090065, 0.017405185848474503, -0.003421591827645898, -0.02130814827978611, -0.017995232716202736, -0.020069703459739685, 0.02569887973368168, 0.020381495356559753, 0.016940584406256676, -0.012860779650509357, 0.041444338858127594, 0.006919574458152056, 0.02470771037042141, -0.029069768264889717, 0.10165641456842422, 0.08133862912654877, 0.021030429750680923, -0.015282310545444489, 0.006195817142724991, 0.03328251466155052, 0.04618784412741661, -0.004665839485824108, 0.019654758274555206, 0.023723609745502472, 0.055645331740379333, -0.023958571255207062, -0.015302691608667374, 0.03263932466506958, -0.025554919615387917, 0.0024383896961808205, 0.018219025805592537, -0.034334681928157806, -0.030754728242754936, -0.0002863049157895148, -0.030023369938135147, 0.04845021665096283, -0.06081711873412132, -0.01245646458119154, -0.0035543020348995924, -0.022041000425815582, 0.009853284806013107, -0.012411502189934254, 0.01162793766707182, 0.020216014236211777, -0.06177813932299614, 0.018150554969906807, 0.009610772132873535, 0.035439711064100266, -0.008880493231117725, 0.007272801361978054, 0.04798315837979317, -0.025047892704606056, 0.009011071175336838, -0.03753677010536194, 0.009424131363630295, 0.03418385237455368, 0.0050114355981349945, 0.0031013721600174904, 0.06500803679227829, -0.0077776541002094746, -0.07803486287593842, 0.0009260940132662654, 0.018818266689777374, 0.03430402651429176, 0.037848103791475296, -0.018709102645516396, -0.0009421348222531378, -0.10412932187318802, 0.044580817222595215, 0.01118628028780222, -0.011788470670580864, 0.013160953298211098, -0.03624584525823593, -0.015419976785779, 0.001031195279210806, -0.013861681334674358, -0.014244203455746174, 0.005248270463198423, 0.022436266764998436, 0.18767544627189636, 0.03114473447203636, 0.00848979502916336, -0.002582792192697525, 0.004706553183495998, -0.071590356528759, 0.008604518137872219, 0.04340184107422829, 0.019459465518593788, 0.01153312437236309, -0.001330107799731195, 0.017178572714328766, 0.011835595592856407, -0.15417605638504028, -0.04224853217601776, -0.037229180335998535, 0.0067863259464502335, -0.013778339140117168, 0.005521815270185471, 0.000912082614377141, 0.01519855111837387, 0.01563907042145729, -0.006373416166752577, -0.04189238324761391, 0.024179477244615555, -0.01185719482600689, 0.0033335741609334946, 0.03178953751921654, 0.0203982163220644, -0.026241041719913483, -0.006019388325512409, -0.002936444478109479, -0.014133582822978497, -0.03979257866740227, 0.058772698044776917, 0.030349677428603172, -0.03891360014677048, -0.006352592259645462, 0.014638759195804596, -0.013930131681263447, -0.05014433339238167, 0.026797432452440262, 0.03206631913781166, -0.08416776359081268, -0.008693108335137367, 0.03349630534648895, 0.03053007833659649, 0.0023501520045101643, 0.0030981325544416904, -0.01582353003323078, -0.025495363399386406, -0.02294282801449299, 0.09190244972705841, 0.0017727595986798406, -0.04356176778674126, 0.04215346649289131, 0.019068360328674316, 0.003989627119153738, -0.02982833795249462, -0.010998078621923923, -0.021844757720828056, -0.0032506175339221954, -0.0013119373470544815, 0.025579404085874557, -0.010794324800372124, -0.025199169293045998, 0.0029234394896775484, -0.022888874635100365, 0.020953526720404625, -0.026302799582481384, 0.029941217973828316, -0.032815657556056976, -0.020572198554873466, -0.038577452301979065, -0.02488905005156994, -0.03084566257894039, -0.0018726526759564877, 0.041550327092409134, 0.0024749445728957653, -0.01272634044289589, 0.047561004757881165, 0.05571592226624489, 0.02687990479171276, 0.025921069085597992, 0.026074379682540894, -0.01706778258085251, 0.01265327725559473, -0.00642224820330739, 0.03604493662714958, 0.034928757697343826, -0.07311214506626129, 0.017128895968198776, -0.03593098744750023, -0.009071087464690208, 0.07357773929834366, -0.03288194164633751, 0.010925577022135258, -0.06774624437093735, -0.002780209993943572, -0.043391648679971695, 0.012464969418942928, -0.012836279347538948, -0.05816589295864105, -0.04275109991431236, 0.005992147605866194, -0.002063536085188389, 0.010000335983932018, -0.007597373798489571, -0.012625264003872871, -0.006160091143101454, -0.014300685375928879, -0.007889405824244022, -0.0007093461463227868, -0.05250920355319977, -0.027687763795256615, -0.07024407386779785, 0.014195474795997143, -0.03941229358315468, 0.03239751607179642, -0.013227191753685474, 0.012571141123771667, 0.04286530613899231, 0.0020289767999202013, 0.03436876833438873, -0.0388738177716732, -0.02269362099468708, -0.004185244906693697, 0.035088878124952316, -0.005091797094792128, -0.014979379251599312, -0.03544396534562111, 0.01736312545835972, -0.03522193804383278, 0.09472496807575226, -0.000720694602932781, -0.012291007675230503]" ./train/Rhodesian_ridgeback/n02087394_9675.JPEG,Rhodesian_ridgeback,"[-0.00642926013097167, 0.011774574406445026, -0.004965600557625294, 0.04012444615364075, 0.010282550938427448, -0.05951981246471405, 0.04351610317826271, 0.018611568957567215, 0.0240706168115139, -0.01737959124147892, -0.031554996967315674, 0.00315316254273057, 0.00831983145326376, -0.012495854869484901, 0.042606208473443985, 0.01496666669845581, 0.1559801995754242, -0.0013113179011270404, -0.007786909118294716, -0.023591604083776474, 0.02200344018638134, -0.009734619408845901, 0.010083937086164951, 0.023845111951231956, -0.026486439630389214, 0.020027441903948784, 0.03857468441128731, 0.005846306681632996, -0.02698405086994171, 0.04064135625958443, -0.00482893455773592, 0.012634741142392159, -0.0506618432700634, -0.003953630104660988, -0.008416024036705494, 0.007637512870132923, 0.01946677267551422, -0.04076175391674042, -0.034122876822948456, 0.14289268851280212, -0.05139057710766792, -0.009689860977232456, -0.007429969031363726, 0.00633455952629447, -0.02563011460006237, -0.0051863729022443295, 0.021861441433429718, 0.004759176168590784, 0.01813994161784649, 0.017356660217046738, 0.018291765823960304, -0.0027140886522829533, 0.007460246328264475, 0.0027377717196941376, 0.0027467806357890368, 0.028744017705321312, -0.003513308707624674, 0.07206111401319504, -0.012749267742037773, -0.03480541706085205, 0.09280239790678024, 0.011946047656238079, 0.06715364754199982, 0.06422613561153412, -0.035047341138124466, -0.01071441825479269, 0.01852513663470745, 0.05992438271641731, -0.06256405264139175, 0.0024755082558840513, 0.006311909761279821, -0.019784996286034584, 0.0032218352425843477, 0.016136301681399345, -0.033726491034030914, -0.04123867675662041, -0.014547637663781643, -0.00037727138260379434, -0.01577398180961609, -0.002146792598068714, -0.0060698906891047955, -0.017982391640543938, -0.049015771597623825, -0.01649750955402851, 0.018942585214972496, 0.025703871622681618, 0.10904256254434586, -0.0132160484790802, 0.074368916451931, -0.014198323711752892, -0.029945416375994682, -0.04863398149609566, -0.6151195168495178, 0.006860040128231049, -0.06993436813354492, 0.0027735133189707994, 0.0011932518100365996, 0.02735515497624874, -0.038601890206336975, 0.07096002995967865, -0.023458285257220268, 0.020493026822805405, 0.023046597838401794, -0.006876177620142698, 0.03469378128647804, -0.018653297796845436, 0.10893097519874573, -0.004278414882719517, 0.010904542170464993, -0.006127052009105682, -0.00868159532546997, -0.024870041757822037, 0.016196435317397118, -0.010376927442848682, -0.013851182535290718, -0.0008336373139172792, -0.033030614256858826, -0.04957796633243561, 0.020622000098228455, 0.0058760009706020355, 0.0860554575920105, -0.014481180347502232, 0.0036034511867910624, -0.031051458790898323, -0.0004360431630630046, -0.02730606310069561, -0.00929574016481638, 0.034491848200559616, -0.050488922744989395, -0.03299088776111603, 0.055560871958732605, -0.017317967489361763, -0.03200691565871239, 0.08397991955280304, -0.04717012494802475, 0.00789358839392662, 0.04954368621110916, -0.057898081839084625, -0.025936231017112732, -0.0018493420211598277, 0.017925841733813286, -0.0102737070992589, -0.028565993532538414, 0.000946461979765445, -0.022759879007935524, 0.012448247522115707, 0.015391524881124496, 0.020134707912802696, 0.017757903784513474, 0.0023167147301137447, -0.060375332832336426, 0.03998134285211563, -0.10616463422775269, 0.0008265558863058686, -0.013567100279033184, 0.02829347737133503, -0.04765458405017853, -0.028429143130779266, 0.015662185847759247, 0.03198317438364029, -0.021400969475507736, 0.00930675771087408, -0.016660533845424652, 0.031660210341215134, 0.0035506202839314938, -0.04929794371128082, 0.026781778782606125, 0.026949003338813782, 0.026936164125800133, 0.044458720833063126, -0.02692827768623829, 0.01469477079808712, 0.029811816290020943, 0.0030284447129815817, 0.014625340700149536, -0.04623761400580406, 0.04210658371448517, -0.02005605213344097, 0.03337322548031807, -0.00781743973493576, -0.014045911841094494, 0.0019360474543645978, 0.06732098013162613, -0.040646374225616455, -0.023043114691972733, -0.010694232769310474, -0.01959412917494774, -0.004592665936797857, 0.006634973920881748, 0.01807990111410618, 0.044423121958971024, 0.03100660629570484, 0.00800128560513258, 0.010038346983492374, -0.020097212865948677, -0.007911799475550652, -0.005155733320862055, -0.006756444461643696, -0.11818107962608337, -0.05529450625181198, -0.015813153237104416, -0.009594175964593887, 0.03677485138177872, 0.031157564371824265, -0.06377432495355606, -0.040151339024305344, -0.0071733249351382256, -0.007805191911756992, -0.012845823541283607, 0.05622439458966255, -0.011010861955583096, 0.010363527573645115, 0.022755973041057587, 0.05505211278796196, -0.005571553949266672, -0.01835271529853344, -0.010758987627923489, -0.014315851032733917, 0.10752670466899872, -0.029224133118987083, 0.0902826189994812, 0.06972993165254593, -0.0038571900222450495, -0.018022196367383003, -0.03740731626749039, -0.020056862384080887, -0.005674014333635569, -0.05963445082306862, -0.03357917070388794, -0.011032938957214355, -0.011509658768773079, -0.004048537462949753, -0.0053857602179050446, 0.0557682067155838, -0.03176291286945343, -0.041240498423576355, -0.010314892046153545, -0.04114950820803642, 0.0175529383122921, -0.023838277906179428, 0.0074266353622078896, 0.008983980864286423, 0.010077117942273617, -0.024026889353990555, -0.022875575348734856, 0.06631719321012497, 0.040883976966142654, -0.04893544316291809, 0.0383126474916935, 0.05661330744624138, 0.020968537777662277, 0.03307196497917175, 0.010013550519943237, -0.010557168163359165, 0.017561353743076324, 0.027614044025540352, -0.011178292334079742, -0.01706625334918499, -0.0028855332639068365, -0.015750033780932426, -0.019120000302791595, 0.018231183290481567, -0.0140139851719141, -0.049715541303157806, -0.0037412424571812153, -0.020753251388669014, 0.005906159523874521, -0.029907749965786934, -0.013996242545545101, 0.027413444593548775, -0.019033964723348618, 0.012185250408947468, 0.041765179485082626, 0.015318097546696663, 0.017573215067386627, -0.03443941846489906, -0.035206831991672516, 0.023611871525645256, -0.015443755313754082, -0.00880451686680317, -0.04299072548747063, 0.03617670014500618, -0.045859720557928085, -0.004159544128924608, 0.009945434518158436, -0.005853855982422829, 0.08166142553091049, 0.012666634283959866, -0.012232569977641106, 0.00781438872218132, -0.02153339609503746, -0.030307257547974586, -0.008866784162819386, 0.00850406289100647, -0.01617431454360485, -0.0008618741994723678, 0.048884619027376175, 0.03690401092171669, 0.0304561760276556, -0.009432272054255009, -0.019926710054278374, -0.0038591737393289804, -0.015279050916433334, -0.0009286064887419343, 0.01314376201480627, -0.009784070774912834, -0.010536900721490383, -0.0018841003766283393, 0.031573377549648285, 0.05093998461961746, 0.013900729827582836, 0.07754374295473099, 0.08378559350967407, 0.000137176743010059, -0.008587849326431751, 0.022899813950061798, 8.025380338949617e-06, 0.031342875212430954, -0.016752135008573532, -0.0782231017947197, 0.041723594069480896, 0.07858502119779587, -0.038192253559827805, -0.012742962688207626, 0.03633275255560875, -0.0026385069359093904, -0.026247384026646614, 0.055805135518312454, 0.021487167105078697, 0.01107367780059576, -0.023563992232084274, -0.03245487064123154, 0.014745412394404411, -0.05405285954475403, 0.04178627207875252, -0.022519558668136597, -0.03464629501104355, 0.04280424118041992, 0.04035640135407448, -0.012905756942927837, -0.00023919210070744157, -0.034464333206415176, 0.001804935629479587, 0.030950814485549927, 0.06342165172100067, 0.010443100705742836, 0.04172161966562271, 0.030189674347639084, -0.01600562408566475, -0.02124182879924774, -0.0027787447907030582, 0.007406942080706358, 0.023458832874894142, 0.03603058308362961, 0.009768177755177021, 0.03515554592013359, -0.030251068994402885, -0.07192102074623108, 0.001408088719472289, 0.005960332229733467, 0.03265371918678284, -0.029677720740437508, 0.007905089296400547, 0.0036639333702623844, -0.08592956513166428, 0.04420589655637741, 0.01558740809559822, -0.008742449805140495, 0.002078457036986947, 0.0005252031842246652, -0.05216806009411812, 0.024311650544404984, -0.029121320694684982, 0.014193949289619923, 0.002997110364958644, 0.014119686558842659, 0.1624218374490738, 0.026860006153583527, -0.019261790439486504, 0.03590904176235199, 0.02450716681778431, -0.03685178607702255, 0.027380509302020073, -0.0011913619237020612, 0.03536242991685867, -0.011817136779427528, -0.04089560732245445, 0.0040316046215593815, 0.026966935023665428, -0.0683479905128479, -0.010340536944568157, -0.10408109426498413, -0.010748367756605148, 0.0012477377895265818, -0.0032117050141096115, -0.024553129449486732, 0.01285347156226635, -0.004240044392645359, -0.04027936980128288, 0.004287989344447851, -0.003858507378026843, 0.02043241076171398, 0.03458452969789505, -0.0024946946650743484, 0.007284277584403753, 0.0017304776702076197, 0.018781205639243126, -0.021469995379447937, 0.008085250854492188, -0.04203220084309578, 0.0923193171620369, 0.003358728252351284, -0.020038971677422523, 0.01913110725581646, 0.019377920776605606, -0.02146841026842594, 0.005836763884872198, 0.014379963278770447, 0.03446222096681595, -0.037708479911088943, 0.011470352299511433, 0.052154116332530975, 0.016650214791297913, 0.026143943890929222, -0.00041798330494202673, -0.00370265101082623, -0.06521797925233841, -0.03125125169754028, 0.025966795161366463, 0.006217402871698141, -0.024058986455202103, 0.03556165099143982, 0.05257745459675789, -0.022912589833140373, -0.025228364393115044, -0.04399696737527847, -0.04792570695281029, 0.009131664410233498, 0.048689160495996475, 0.008531025610864162, 0.020337818190455437, -0.03921192139387131, 0.0009881387231871486, -0.03895493596792221, 0.022328417748212814, -0.0007098002824932337, -0.008249212987720966, -0.03984755650162697, -0.01825314573943615, -0.02659331075847149, -0.0098453089594841, -0.01660744473338127, -8.1525620771572e-05, 0.04894537851214409, -0.0044367252849042416, 0.0011095397640019655, 0.03205812722444534, 0.04114533215761185, 0.020660467445850372, 0.008132324554026127, -0.005370392929762602, 0.019445175305008888, -0.007983095943927765, -0.020692357793450356, 0.05891582742333412, 0.06700751930475235, -0.04171498492360115, 0.009947318583726883, -0.015272402204573154, -0.03143974393606186, 0.027523156255483627, -0.03975512087345123, -0.016607360914349556, -0.038646914064884186, -0.003964670933783054, -0.004689487628638744, 0.010895202867686749, -0.0105355903506279, -0.021120702847838402, -0.00645969295874238, 0.023680031299591064, -0.029380323365330696, 0.018542470410466194, -0.01914518140256405, -0.03470741584897041, -0.0004111460584681481, -0.015175784938037395, -0.03559740632772446, -0.008343890309333801, -0.017721472308039665, -0.03265424817800522, -0.040455035865306854, 0.03331737220287323, -0.046896208077669144, 0.04792838171124458, -0.020706715062260628, 0.036482397466897964, 0.0633036270737648, -0.028765330091118813, 0.014786149375140667, -0.01980029046535492, -0.023905020207166672, 0.007440534885972738, 0.0057053049094974995, -0.006119414232671261, -0.013450154103338718, -0.05321452021598816, -0.0235038660466671, -0.02494187466800213, 0.06946761161088943, 0.016357455402612686, 0.011189817450940609]" ./train/magpie/n01582220_6305.JPEG,magpie,"[0.018827656283974648, -0.024615561589598656, 0.0293282363563776, -0.016135459765791893, -0.03245780989527702, 0.03514721244573593, 0.02763618901371956, 0.03535673767328262, 0.07810372859239578, 0.016499517485499382, -0.0012562614865601063, 0.05151311680674553, -0.042830999940633774, -0.04592282697558403, -0.0017729810206219554, 0.012361395172774792, 0.06660493463277817, 0.01802103966474533, -0.03484049066901207, 0.028711333870887756, 0.022854790091514587, -0.024903589859604836, 0.01204458624124527, -0.034657903015613556, -0.03403854742646217, 0.007625197991728783, 0.008113615214824677, -0.005570975132286549, 0.032691292464733124, -0.00315682590007782, 0.04148256406188011, 0.027817683294415474, -0.0019673812203109264, 0.04231281951069832, 0.06823498755693436, -0.06196039915084839, 0.011346722021698952, -0.03352397307753563, 0.05014587193727493, 0.18125498294830322, 0.0290727186948061, 0.04617666080594063, -0.0035515292547643185, -0.023684725165367126, 0.07034630328416824, -0.16925127804279327, 0.029002757743000984, 0.037657231092453, 0.03319118544459343, -0.022623950615525246, 0.007120820693671703, 0.022583605721592903, 0.003786057233810425, -0.031998880207538605, 0.011543006636202335, 0.020930299535393715, -0.026586279273033142, 0.0272187739610672, -0.019081834703683853, 0.02272575907409191, 0.17716841399669647, -0.03517872840166092, -0.03901701048016548, 0.02855078876018524, -0.05527477711439133, 0.00012810222688131034, 0.041298530995845795, -0.013177312910556793, -0.05802835896611214, -0.001893130480311811, -0.006147097330540419, -0.02573542110621929, 0.01273611281067133, 0.011987520381808281, -0.02724033035337925, -0.02136179432272911, 0.023510338738560677, -0.01950092241168022, -0.04780557379126549, -0.0752376914024353, -0.03189455345273018, -0.0072960155084729195, -0.010745815001428127, -0.010285058058798313, 0.02283707819879055, 0.00264256470836699, -0.05260142311453819, 0.023816702887415886, 0.053955044597387314, 0.003068899968639016, 0.008760971017181873, -0.0837271586060524, -0.48289525508880615, -0.034004390239715576, -0.008714662864804268, 0.020840220153331757, 0.01942824199795723, 0.03857716917991638, -0.1064440906047821, 0.06810073554515839, 0.02460627444088459, 0.0006159464828670025, -0.012722511775791645, 0.004570556804537773, 0.009495123289525509, 0.04238494113087654, 0.0014125303132459521, 0.04358721897006035, 0.03160882368683815, -0.061208389699459076, 0.06583219766616821, -0.015935758128762245, 0.038883958011865616, -0.013600080274045467, -0.013192912563681602, -0.01611938513815403, 0.03449252247810364, -0.015214809216558933, 0.042917173355817795, 0.0083873700350523, 0.04308173060417175, -0.0335669070482254, 0.007892094552516937, 0.04217178747057915, -0.02447384037077427, -0.0032950667664408684, 0.057585708796978, 0.039330098778009415, -0.013039353303611279, -0.023667048662900925, -0.03469773381948471, -0.07116732746362686, -0.06904327869415283, 0.07900821417570114, -0.012688251212239265, -0.028951434418559074, -0.03215756267309189, -0.07290086895227432, 0.016015581786632538, 0.05881794914603233, 0.012797832489013672, -0.00020610801584552974, 0.07982444763183594, 0.015658337622880936, 0.007552145980298519, -0.0009723257971927524, -0.012229140847921371, -0.032932136207818985, 0.02205234207212925, -0.019587507471442223, -0.03332267701625824, 0.010585533455014229, 0.005030203144997358, -0.011524391360580921, 0.0386664979159832, 0.018889253959059715, 0.010414505377411842, 0.015288013964891434, 0.010142264887690544, -0.06952351331710815, 0.0026073053013533354, -0.06397499889135361, 0.028309455141425133, -0.02388712763786316, 0.022124197334051132, 0.005805507767945528, -0.07694584876298904, 0.003609689883887768, 0.05337866395711899, 0.05683017522096634, -0.012204747647047043, -0.004302687477320433, 0.03419233486056328, -0.027286987751722336, 0.022267349064350128, -0.06973061710596085, 0.04834144935011864, -0.02306673862040043, -0.027902454137802124, -0.0105135478079319, -0.05667004734277725, -0.017103424295783043, -0.002543976530432701, -0.011321641504764557, -0.036580584943294525, -0.010841352865099907, 0.014590620063245296, 0.00015263217210303992, 0.07822557538747787, 0.04072045162320137, 0.03713531047105789, -0.018214991316199303, 0.0688062384724617, 0.027509968727827072, 0.06472431868314743, -0.019534794613718987, -0.07046764343976974, 0.004104030318558216, -0.04858775436878204, 0.10078790038824081, -0.04802703484892845, 0.04685457795858383, 0.06751231849193573, 0.002098524011671543, 0.029212553054094315, 0.03553464636206627, -0.03342635929584503, -0.049773141741752625, -0.0036267030518501997, 0.022025899961590767, -0.016620926558971405, 0.047242507338523865, -0.022596921771764755, 0.015844054520130157, -0.039429351687431335, -0.04199626296758652, -0.013968798331916332, -0.029827117919921875, 0.04137323051691055, -0.06541036069393158, 0.05988244712352753, -0.07827461510896683, -0.008621102198958397, 0.04107898846268654, -0.01927870325744152, -0.02173776552081108, -0.007645321544259787, 0.0027409500908106565, 0.01208761241286993, 0.031077664345502853, -0.0718325525522232, -0.026154622435569763, 0.004763956647366285, 0.005333162844181061, -0.005255814641714096, 0.006261635571718216, 0.005613194312900305, -0.013619291596114635, -0.0070898146368563175, 0.01430173497647047, 0.01675896719098091, -0.02349281683564186, 0.0031418497674167156, -0.01507906336337328, -0.012598204426467419, 0.0546768419444561, 0.0008061155676841736, -0.042153868824243546, -0.03754917159676552, -0.010180382989346981, 0.0060064163990318775, 0.016933780163526535, 0.051194529980421066, 0.0002584594185464084, -0.017311330884695053, -0.056363414973020554, -0.026099564507603645, 0.045178644359111786, 0.05458437278866768, 0.03922485560178757, -0.015043593943119049, 0.01975635625422001, -0.047742269933223724, 0.06167758256196976, 0.04718456044793129, -0.0012431119102984667, 0.044951219111680984, 0.045783527195453644, 0.07533808052539825, 0.027329273521900177, 0.0027797971852123737, 0.006039970088750124, 0.0083633903414011, -0.047861889004707336, 0.03139689564704895, -0.025066547095775604, 0.03579997271299362, 0.022677363827824593, 0.04139960557222366, -0.03197820857167244, 0.010648764669895172, 0.05341184884309769, -0.03660346940159798, 0.004987338092178106, -0.009289707988500595, 0.05034167319536209, -0.022230306640267372, -0.05405929684638977, -0.012412209995090961, 0.023405583575367928, -0.03016992099583149, 0.012151060625910759, 0.014858442358672619, 0.022612271830439568, 0.04535754397511482, -0.020900217816233635, 0.04916117712855339, -0.05145430937409401, 0.05058713257312775, -0.06058567762374878, -0.05382015183568001, 0.011961638927459717, 0.017763948068022728, 0.03345884382724762, 0.008241651579737663, 0.08363321423530579, 0.06291977316141129, -0.006945734843611717, 0.023350095376372337, -0.005072975065559149, -0.002968858228996396, 0.0162441935390234, 0.07860051840543747, -0.0099860904738307, -0.00014036381617188454, 0.049050938338041306, -0.04022374004125595, 0.026052962988615036, 0.003980063367635012, -0.023936187848448753, 0.008564280346035957, 0.1677229404449463, -0.0016842774348333478, 0.019501544535160065, -0.031067268922924995, 0.017881371080875397, -0.022479381412267685, -0.04022018983960152, -0.03219716250896454, -0.03844815492630005, -0.034644220024347305, -0.015409181825816631, -0.040217310190200806, 0.04221230745315552, -0.0215977281332016, -0.01842563971877098, -0.007390881888568401, 0.04451281577348709, -0.008431381545960903, -0.013206608593463898, -0.04682400822639465, -0.028428899124264717, -0.0023818761110305786, 0.020847024396061897, 0.014550499618053436, -0.015050939284265041, 0.06152911111712456, 0.028762774541974068, 0.017239609733223915, -0.0117634953930974, 0.01730508543550968, 0.03572648763656616, 0.02246314473450184, -0.02823050320148468, -0.035101279616355896, 0.076643206179142, 0.012799303978681564, -0.12835732102394104, 0.008497282862663269, -0.0032462538219988346, 0.024495316669344902, 0.0014239012962207198, 0.009956886060535908, -0.010444113984704018, -0.009880856610834599, -0.003483743406832218, -0.016522593796253204, -0.03443937003612518, -0.03492997959256172, 0.04547533392906189, -0.019817396998405457, 0.005572588182985783, 0.02962495945394039, 0.0034744562581181526, 0.014807053841650486, 0.03318481892347336, 0.054766252636909485, 0.008004894480109215, -0.03542323410511017, 0.01803155057132244, -0.035466454923152924, 0.012429727241396904, 0.054875411093235016, -0.07571226358413696, -0.03627216815948486, 0.06498254090547562, -0.008632311597466469, 0.03131505101919174, -0.008580134250223637, -0.034100864082574844, -0.02699950523674488, -0.0493195541203022, 0.026191236451268196, -0.017028721049427986, 0.0051125893369317055, -0.0005799022037535906, -0.03859693184494972, -0.00845345202833414, -0.05573398619890213, -0.05846928432583809, -0.011251057498157024, 0.023934610188007355, -0.04379287362098694, -0.002817793982103467, 0.01587926223874092, -0.0004937896155752242, 0.06132238730788231, 0.026758408173918724, 0.003524522529914975, 0.019649703055620193, 0.036177899688482285, 0.022814935073256493, 0.04080281779170036, 0.011952662840485573, -0.032642919570207596, -0.023525632917881012, 0.020891550928354263, -0.005885724909603596, 0.04027673229575157, 0.037472136318683624, 0.0025419951416552067, 0.01619061641395092, -0.008238391019403934, -0.07900701463222504, -0.025203468278050423, -0.05450286343693733, 0.04800764471292496, -0.009256750345230103, 0.14329232275485992, -0.03408517688512802, 0.027076425030827522, -0.019037092104554176, -0.04450215399265289, 0.02104870229959488, -0.014385869726538658, -0.04948332533240318, 0.019127802923321724, -0.017832783982157707, -0.05691763758659363, -0.05071759596467018, 0.026873808354139328, -0.05186035484075546, -0.020169300958514214, -0.038070522248744965, 0.015190396457910538, 0.026914222165942192, -0.02224641479551792, 0.023385904729366302, 0.01237243041396141, -0.027538150548934937, -0.049125682562589645, -0.03205236792564392, -0.007461700588464737, 0.019089408218860626, 0.024555379524827003, -0.020044436678290367, 0.052476268261671066, 0.045300476253032684, -0.011742628179490566, -0.018285227939486504, -0.047239527106285095, -0.0008571780053898692, 0.031017715111374855, 0.007418784312903881, -0.030855506658554077, -0.07381892949342728, 0.00635927077382803, 0.01840704306960106, 0.007481150329113007, -0.0374949648976326, -0.035440366715192795, -0.008510146290063858, -0.032463397830724716, -0.0034047323279082775, -0.024263696745038033, -0.009369195438921452, 0.0046998257748782635, 0.018688149750232697, -0.012986365705728531, -0.0026885224506258965, -0.038365304470062256, 0.001897667534649372, 0.014090548269450665, 0.027172842994332314, 0.0908467173576355, 0.014697374776005745, -0.021754935383796692, 0.007802898529917002, -0.020912429317831993, -0.019221488386392593, -0.00014825395192019641, 0.009452423080801964, 0.03470393642783165, -0.031228376552462578, 0.024859780445694923, 0.02316765859723091, -0.017549145966768265, -0.01092354767024517, -0.04285452887415886, -0.025636132806539536, -0.02466859109699726, -0.011322235688567162, 0.04688114672899246, 0.0022036449518054724, 0.0061861309222877026, -0.06876593083143234, -0.04155696555972099, 0.028165165334939957, 0.01294831745326519, -0.04623892530798912, 0.010454652830958366, -0.043927717953920364]" ./train/magpie/n01582220_4738.JPEG,magpie,"[0.015292543917894363, 0.04362116754055023, 0.007628725841641426, 0.010881729423999786, 0.024764642119407654, -0.028060877695679665, 0.015642408281564713, 0.034400854259729385, -0.026378842070698738, -0.019405851140618324, 0.060798175632953644, -0.02391183376312256, -0.030604101717472076, 0.008744425140321255, 0.0062012444250285625, -0.019226154312491417, -0.06654196977615356, 0.015261747874319553, 0.0133421765640378, 0.00031115702586248517, -0.03837903216481209, 0.01389097049832344, -0.006151710636913776, -0.016190852969884872, -0.0006221572984941304, 0.023233860731124878, 0.011779648251831532, -0.04565407708287239, -0.0008539786213077605, -0.016862327232956886, 0.033465441316366196, 0.024116002023220062, -0.024621104821562767, -0.03438469022512436, 0.011165285483002663, 0.032041940838098526, -0.021838141605257988, 0.03340648487210274, -0.011534401215612888, 0.029355688020586967, 0.03630291298031807, -0.015560242347419262, 0.011608929373323917, 0.02569614350795746, 0.013816500082612038, -0.06796122342348099, 0.04509451240301132, -0.007411142811179161, -0.01855507120490074, -0.0004913398297503591, 0.008464328944683075, 0.0344240628182888, -0.009068472310900688, -0.040071386843919754, -0.009907249361276627, 0.004836720414459705, 0.02947678416967392, 0.02772100828588009, 0.04083435237407684, 0.009934700094163418, 0.007236739620566368, 0.03550399839878082, -0.010371611453592777, 0.0016419297317042947, -0.013490607962012291, 0.004963058512657881, 0.020114324986934662, 0.030515236780047417, -0.044690825045108795, -0.022471608594059944, -0.016025634482502937, 0.005246938671916723, -0.000961273442953825, -0.0027406001463532448, 0.01645161397755146, -0.003134198021143675, -0.019512232393026352, -0.0013432599371299148, -0.0316682904958725, -0.04076208174228668, 0.032295867800712585, -0.016572415828704834, -0.028100358322262764, 0.012039109133183956, 0.026408441364765167, 0.0295528806746006, 0.02933339588344097, -0.030469004064798355, -0.05447564646601677, -0.035112302750349045, 0.036493755877017975, 0.0062155346386134624, -0.723410964012146, 0.049980852752923965, 0.033118270337581635, 0.0064483280293643475, -0.012397044338285923, 0.0005580342840403318, -0.04268363490700722, -0.090152308344841, 0.06099698320031166, -0.037466634064912796, -0.009161040186882019, 0.004536510910838842, 0.02621791698038578, -0.025167951360344887, -0.16159211099147797, 0.008790630847215652, 0.022449247539043427, -0.03704758733510971, 0.00659923953935504, -0.07869014143943787, -0.007483740337193012, -0.015615520998835564, 0.0254527498036623, -0.024565087631344795, -0.01041739247739315, -0.014908761717379093, 0.053242314606904984, -0.02757398784160614, 0.013679598458111286, -0.03592604771256447, -0.02901599369943142, -0.033242713660001755, 0.018963031470775604, -0.02708645537495613, -0.0022854479029774666, -0.016438744962215424, -0.023610947653651237, -0.008900837041437626, 0.0007468771073035896, -0.014244122430682182, -0.005053380969911814, 0.09242809563875198, -0.011175067164003849, 0.028849652037024498, -0.020103134214878082, -0.0774155706167221, 0.014662282541394234, 0.03758082538843155, 0.01056104339659214, 0.018141478300094604, 0.004249155055731535, 0.008989978581666946, -0.048224180936813354, 0.005501713138073683, -0.027458876371383667, 0.04953726381063461, -0.02592974528670311, -0.02510792762041092, 0.014651221223175526, -0.05696415528655052, 0.0990077555179596, -0.03580901399254799, -0.009076593443751335, 0.014648576267063618, 0.01585194282233715, 0.0031883951742202044, 0.02152062952518463, -0.03420904651284218, -0.01671396940946579, -0.03349573165178299, 0.05441536381840706, 0.009206750430166721, 0.0009060743032023311, 0.017128046602010727, 0.02248063124716282, 0.08571243286132812, 0.006619016639888287, 0.005048224236816168, 0.025560559704899788, 0.010621224530041218, 0.03134305030107498, -0.03717535361647606, -0.0047188978642225266, 0.017248019576072693, -0.02087998576462269, -0.004864026326686144, -0.033183202147483826, 0.011387995444238186, 0.05571609362959862, -0.02756722830235958, -0.011252609081566334, 0.013212359510362148, -0.0398319736123085, -0.008801698684692383, 0.023348933085799217, 0.012485031969845295, -0.0288934838026762, 0.013075500726699829, -0.023967856541275978, 0.02294921688735485, 0.035590097308158875, 0.05370105430483818, -0.05443383753299713, -0.0067819408141076565, -0.02571907453238964, -0.013299120590090752, -0.035441961139440536, 0.03242989629507065, 0.011898577213287354, 0.035903021693229675, 0.010319323278963566, 0.036474354565143585, 0.017367662861943245, 0.028596332296729088, -0.00392181659117341, -0.010078608058393002, -0.009102673269808292, 0.01669410988688469, -0.01271507516503334, 0.03721829876303673, -0.0033143965993076563, 0.0053446609526872635, -0.021032676100730896, 0.0038706460036337376, -0.01594540849328041, 0.0076245651580393314, -0.03335675597190857, -0.029007550328969955, 0.009731240570545197, 0.009813249111175537, 0.026320038363337517, 0.008397960104048252, 0.01193604338914156, -0.01210549846291542, -0.02027355693280697, -0.03472243249416351, 0.005647755693644285, 0.029901932924985886, -0.03314487263560295, -0.031211066991090775, 0.007565952837467194, 0.03376330807805061, 0.04191206768155098, -0.03501250222325325, -0.00945955142378807, -0.029086850583553314, 0.00021361267135944217, -0.009715300984680653, -0.018144454807043076, 0.00817896518856287, -0.024071790277957916, 0.005298272240906954, -0.03403734415769577, -0.030542075634002686, -0.026339996606111526, 0.029550019651651382, -0.03843849152326584, -0.002932529663667083, -0.038182493299245834, 0.019305581226944923, 0.005823551677167416, 0.005167664960026741, -0.034143295139074326, -0.007297220174223185, -0.028276534751057625, 0.009492923505604267, 0.09181998670101166, -0.002737307921051979, 0.009362038224935532, 0.019764624536037445, -0.04695770889520645, 0.09877237677574158, 0.06857520341873169, -0.010206594131886959, -0.02630007080733776, -0.02218206785619259, 0.02517954632639885, 0.010195115581154823, -0.004452789667993784, 0.03330954536795616, 0.03667016699910164, -0.002140727825462818, -0.0027986548375338316, -0.019514575600624084, -0.02467435412108898, -0.006857725791633129, -0.035954490303993225, 0.001157983555458486, 0.010107404552400112, 0.02416033111512661, -0.00827929936349392, 0.02372407168149948, -0.01988592930138111, 0.005561378784477711, -0.13592998683452606, 0.0010525216348469257, -0.027079110965132713, -0.04417426884174347, 0.01956019550561905, 0.009517453610897064, -0.010299097746610641, 0.022585753351449966, -0.023238275200128555, 0.009026971645653248, -0.03052825853228569, 0.017246481031179428, 0.037423331290483475, -0.005584127269685268, -0.005500560160726309, 0.016084283590316772, -0.024341728538274765, 0.05004560202360153, 0.040337953716516495, -0.04513762146234512, 0.014430333860218525, 0.0018014527158811688, -0.0013214477803558111, 0.016018139198422432, -0.039687879383563995, -0.03240526467561722, 0.09242105484008789, 0.009267939254641533, 0.025185737758874893, 0.01675095222890377, 0.009192817844450474, 0.006052776239812374, -0.0011536118108779192, -0.03454437851905823, 0.013807956129312515, 0.1253250390291214, -0.013222324661910534, -0.005432587116956711, -0.005076639819890261, -0.02589392103254795, -0.01468055322766304, 0.029781552031636238, -0.019871609285473824, 0.03212330862879753, -0.03459027782082558, -0.01828559674322605, -0.021286072209477425, -0.017216410487890244, 0.019827423617243767, 0.009406271390616894, 0.000876918260473758, 0.010098577477037907, 0.01954353041946888, 0.049981739372015, -0.012543430551886559, -0.009900071658194065, 0.010634014382958412, -0.011177988722920418, 0.021585732698440552, 0.01682884991168976, -0.004464026540517807, 0.008922670036554337, 0.0013542802771553397, 0.04957123473286629, -0.011684070341289043, -0.017570309340953827, 0.03656087815761566, 0.02331305854022503, 0.001436342136003077, -0.0343707911670208, -0.022281425073742867, 0.007957116700708866, 0.033222801983356476, 0.03625232353806496, 0.016592657193541527, 0.018603861331939697, 0.011347517371177673, 0.01957123726606369, 0.04113222658634186, 0.046121906489133835, -0.0022929320111870766, 0.016904663294553757, -0.018557393923401833, 0.0166187547147274, 0.04009866341948509, 0.03216003626585007, 0.02940535917878151, 0.0199104193598032, 0.024269821122288704, 0.0054918378591537476, 0.0983755812048912, -0.0331866592168808, 0.005157677456736565, -0.0014421085361391306, -0.021916819736361504, 0.04308468848466873, 0.0021009657066315413, -0.048449765890836716, 0.015130113810300827, 0.003777915146201849, 0.011070817708969116, -0.012897426262497902, 0.005770217161625624, 0.024336358532309532, -0.021595096215605736, -0.04987045004963875, 0.01366752665489912, 0.0054285237565636635, -0.025217754766345024, 0.0031486384104937315, -0.05758152902126312, -0.019981445744633675, 0.005793343298137188, -0.0031918748281896114, -0.0027462937869131565, 0.019523872062563896, 0.0009617586038075387, -0.046589046716690063, -0.014474228024482727, -0.013061139732599258, -0.033738985657691956, 0.00817074440419674, 0.05630903318524361, 0.0021445087622851133, 0.016129519790410995, 0.042166367173194885, -0.007851673290133476, -0.006206936668604612, -0.021921128034591675, -0.009595335461199284, 0.025778070092201233, -0.015114947222173214, 0.014435471035540104, -0.0035971435718238354, 0.008622578345239162, -0.00989049207419157, -0.00040162226650863886, -0.03878065571188927, -0.023942360654473305, -0.024929963052272797, 0.009157990105450153, -0.007103538606315851, 0.04282687231898308, 0.012099622748792171, 0.014189760200679302, -0.0018507374916225672, -0.016197457909584045, -0.05576727166771889, -0.0028458847664296627, -0.022536123171448708, -0.05089329928159714, 0.0019077083561569452, -0.019712114706635475, -0.01215920690447092, -0.00858595222234726, 0.04485935717821121, 0.036845095455646515, -0.01163542177528143, 0.009444479830563068, 0.03787963464856148, -0.0035606324672698975, 0.023029157891869545, -0.02839764952659607, -0.013131772167980671, -0.019699951633810997, -0.0003447371709626168, -0.013293489813804626, -0.031459856778383255, -0.02446313388645649, -0.027221808210015297, 0.03463547304272652, 0.006658816244453192, -0.03473907709121704, -0.033393051475286484, 0.002355840289965272, -0.005386143457144499, -0.008775263093411922, -0.01592782884836197, -0.0069448151625692844, 0.0167456716299057, 0.04944247752428055, 0.00924029853194952, -0.025206493213772774, -0.00812359806150198, -0.03190092742443085, 0.06038760021328926, 0.023148538544774055, -0.019096167758107185, -0.013492745347321033, -0.007536614779382944, -0.027696793898940086, -0.020360639318823814, -0.01911020837724209, -0.003652525832876563, -0.016740530729293823, 0.04090915992856026, 0.020000778138637543, 0.05291207879781723, 0.060914747416973114, -0.033816419541835785, -0.04768993332982063, -0.017012711614370346, -0.027694299817085266, 0.006100979167968035, 0.023735668510198593, 0.00226080184802413, 0.036687370389699936, -0.07430973649024963, -0.024137217551469803, -0.006822190713137388, 0.00756458006799221, 0.03342881426215172, -0.01236827950924635, -0.00016500747005920857, -0.00994571577757597, -0.015337999910116196, -0.002646353328600526, 0.04395749792456627, 0.11052598804235458, -0.012579129077494144, -0.015063229016959667, -0.0035240082070231438, 0.006523562129586935, 0.031079670414328575, -0.005635326262563467, -0.010728334076702595]" ./train/magpie/n01582220_36701.JPEG,magpie,"[0.0038012422155588865, 0.008829733356833458, 0.020646171644330025, -0.04830809310078621, -0.019023820757865906, 0.04931731894612312, 0.055902738124132156, 0.007528930902481079, 0.028065888211131096, 0.0060812802985310555, 0.019125794991850853, 0.014628889970481396, -0.006963544059544802, -0.009189363569021225, 0.0010980211663991213, 0.03102555312216282, 0.02353353425860405, 0.05442259460687637, 0.012164871208369732, -0.013217187486588955, -0.0055826022289693356, -0.014750157482922077, 0.010403093881905079, -0.03466472402215004, -0.04512110352516174, -0.0017288874369114637, 0.03307700157165527, -0.015622124075889587, -0.002773246495053172, 0.02624332532286644, 0.04720228910446167, 0.01741199940443039, -0.012699568644165993, 0.03761204704642296, 0.03718610852956772, 1.3609343113785144e-05, 0.012340844608843327, -0.008588333614170551, 0.048535775393247604, 0.11929484456777573, 0.03455844521522522, 0.043138422071933746, 0.042972393333911896, -0.06344597786664963, 0.05238969996571541, -0.11022157222032547, 0.017935018986463547, 0.045824095606803894, 0.0427490659058094, 0.029981257393956184, 0.004151367116719484, 0.013719766400754452, 0.003286851104348898, -0.06746656447649002, -0.023563504219055176, 0.005529319401830435, 0.011819425970315933, 0.04143655672669411, -0.002309212228283286, 0.015865366905927658, 0.1113843023777008, 0.0009842469589784741, -0.04159742221236229, 0.02856174297630787, -0.05456705391407013, -0.06104112043976784, 0.01771613582968712, 0.09048959612846375, 0.029330633580684662, 0.001685615163296461, -0.01437695324420929, 0.013745742850005627, 0.0021897521801292896, 0.01141362451016903, -0.026531023904681206, -0.031209144741296768, 0.05705752223730087, 0.053702160716056824, -0.03551480919122696, -0.10166356712579727, -0.020382005721330643, 0.013564295135438442, 0.018996121361851692, -0.027827655896544456, 0.03834344446659088, -0.01024806872010231, 0.04985499754548073, 0.020703226327896118, 0.07269089668989182, -0.045629918575286865, 0.040915753692388535, -0.0387125238776207, -0.5435478091239929, -0.008902394212782383, 0.04032127186655998, 0.0072176456451416016, 0.02241494134068489, -0.0022947443649172783, -0.1228312999010086, 0.0371415801346302, 0.00516860093921423, 0.02466612309217453, -0.030870800837874413, -0.00864415243268013, -0.012650665827095509, 0.016807379201054573, -0.16414648294448853, 0.02037021331489086, -0.00985594093799591, -0.046918898820877075, -0.006921252701431513, -0.052688341587781906, -0.0021941408049315214, -0.024030527099967003, -0.021091556176543236, -0.026609396561980247, 0.017425402998924255, 7.016147719696164e-05, 0.09554189443588257, -0.007886726409196854, 0.09921900182962418, 0.024939415976405144, -0.02010837197303772, 0.033359453082084656, 0.03570246696472168, 0.005649589002132416, 0.003035628702491522, 0.017825819551944733, -0.008440401405096054, 0.0027367710135877132, -0.018655823543667793, -0.021022174507379532, -0.005781305022537708, 0.08116918802261353, 0.009028543718159199, -0.018803369253873825, -0.007247240282595158, -0.04883604124188423, 0.04127276688814163, 0.052563074976205826, 0.009775674901902676, 0.01850331760942936, 0.04160256311297417, 0.04519013687968254, 0.023913705721497536, 0.020633256062865257, 0.006027385592460632, 0.02262905240058899, 0.007711239159107208, 0.011989496648311615, 0.012140489183366299, -0.018412292003631592, 0.0290160421282053, -0.06383804231882095, 0.07620824873447418, 0.02716846391558647, 0.005918459501117468, -0.08787857741117477, -0.004122466780245304, -0.0037063295021653175, -0.04338490217924118, -0.02313442900776863, 0.010914457030594349, -0.04350244998931885, -0.0363382063806057, -0.043969616293907166, -0.029420552775263786, 0.011797388084232807, -0.002091948874294758, 0.046075332909822464, -0.003969493787735701, -7.564237603219226e-05, -0.02560023032128811, -0.04885466396808624, -0.05058823898434639, -0.012737504206597805, -0.0023563839495182037, 0.017143191769719124, 0.004035729914903641, -0.00754529656842351, 0.030006837099790573, -0.018154267221689224, -0.002684615086764097, -0.010481675155460835, -0.03324431926012039, -0.018459944054484367, 0.02228817716240883, -0.052662547677755356, 0.013151997700333595, 0.05299370735883713, 0.00879918597638607, 0.02168431505560875, 0.07412309944629669, -0.012722887098789215, 0.02957170270383358, 0.0018413279904052615, -0.008102186024188995, -0.009343165904283524, -0.0069299316965043545, 0.05598539113998413, -0.0013221626868471503, 0.01973859593272209, 0.031541962176561356, 0.029200991615653038, -0.003070338163524866, -0.0192895345389843, -0.04508843645453453, -0.023122617974877357, -0.014171660877764225, 0.05681987851858139, -0.04455002397298813, 0.039436616003513336, 9.057568240677938e-05, 0.0480821430683136, -0.038364604115486145, -0.014147095382213593, -0.010897820815443993, 0.009971593506634235, 0.08952117711305618, -0.07730120420455933, 0.048760782927274704, 0.03983088210225105, -0.025183262303471565, 0.010649451054632664, 0.036291759461164474, 0.061445269733667374, -0.009343947283923626, 0.02784675359725952, 0.01028990838676691, 0.040325552225112915, -0.04212355241179466, -0.01449439488351345, 0.0422515794634819, 0.001385127892717719, -0.0101992879062891, -0.024595322087407112, 0.0006124246865510941, 0.03408167138695717, 0.005558823235332966, 0.004193051718175411, 0.010340132750570774, 0.019430963322520256, -0.025288226082921028, -0.023421885445713997, 0.05472584441304207, 0.04331621527671814, 0.006466955412179232, -0.02375073917210102, -0.019622275605797768, -0.009841563180088997, -0.010652575641870499, 0.04637102037668228, 0.03708931803703308, -0.05316415801644325, -0.004034750163555145, 0.022062471136450768, 0.0065296003594994545, 0.01845461316406727, 0.12379566580057144, 0.008786496706306934, -0.018533779308199883, 0.04285670071840286, -0.020692680031061172, -0.0317535325884819, 0.0038173175416886806, -0.06089308112859726, 0.05343691259622574, 0.0200953409075737, 0.06502945721149445, 0.012514149770140648, 0.0005179984727874398, -0.0026344838552176952, 0.034452129155397415, -0.01855549030005932, 0.007787375245243311, -0.007969606667757034, 0.017475871369242668, -0.00778370862826705, 0.010692761279642582, 0.010501943528652191, 0.013878819532692432, 0.04780464619398117, -0.06428501009941101, -0.014909631572663784, -0.016006354242563248, 0.0006635376485064626, -0.06591572612524033, -0.02444431185722351, -0.05609367415308952, -0.00838969461619854, -0.015002069063484669, -0.08871480077505112, 0.0051044560968875885, -0.02827935479581356, 0.0006605547969229519, -0.03975808620452881, 0.10316620767116547, -0.005599030293524265, 0.0184513907879591, 0.011479378677904606, -0.022410107776522636, 0.0193896796554327, -0.006494097411632538, 0.002491406397894025, 0.03158826008439064, 0.06271207332611084, 0.029619600623846054, 0.0073328400030732155, 0.04903588816523552, 0.026041777804493904, 0.0315118171274662, 0.021085556596517563, 0.08105088770389557, -0.018438376486301422, 0.0069531966000795364, 0.01666434109210968, -0.04530351608991623, 0.042550478130578995, -0.016338881105184555, -0.07646804302930832, 0.029624473303556442, 0.1292826384305954, 0.02739754319190979, 0.0012455449905246496, 0.010942252352833748, -0.01641077548265457, 0.007675982546061277, -0.01769135147333145, -0.04802084341645241, -0.02304070256650448, 0.0033672533463686705, 0.00825160276144743, -0.06401559710502625, 0.059513770043849945, -0.03077632375061512, 0.076617032289505, -0.0017090064939111471, -0.01791561208665371, -0.03797120973467827, 0.03662492334842682, -0.05342810973525047, -0.056662820279598236, -0.0028465166687965393, 0.033268749713897705, -0.012507878243923187, -0.018182365223765373, 0.032629769295454025, 0.037882447242736816, 0.02650102972984314, 0.006212768144905567, -0.04098347947001457, 0.013448775745928288, 0.061415623873472214, -0.03419099375605583, -0.037280239164829254, 0.030320342630147934, -0.0013534536119550467, -0.1208607479929924, 0.001136938575655222, 0.010947097092866898, 0.06483475118875504, 0.005021937191486359, -0.019216354936361313, 0.046178240329027176, -0.03859354928135872, -0.00996895506978035, -0.003905697027221322, -0.11044671386480331, -0.03436971455812454, 0.0333179347217083, -0.011242331936955452, 0.03485031798481941, 0.03381991386413574, -0.02233007736504078, 0.024635639041662216, 0.01286420039832592, 0.06664509326219559, 0.005412530619651079, -0.052761565893888474, 0.02002304419875145, -0.04996877163648605, 0.0006841456633992493, 0.034085117280483246, -0.059960924088954926, -0.02526191994547844, 0.0549573190510273, -0.05149875953793526, 0.008835929445922375, -0.005569571629166603, 0.01757555454969406, -0.020466281101107597, -0.03788890317082405, -0.0016812199028208852, 0.02783297747373581, -0.031176025047898293, -0.03263973072171211, -0.026436345651745796, 0.015497738495469093, -0.08009810000658035, -0.06416580826044083, -0.029710553586483, 0.001785449800081551, -0.02218662016093731, -0.05620833858847618, 0.0017392609734088182, 0.039619866758584976, 0.03526095673441887, 0.025005077943205833, 0.052641499787569046, -0.011920124292373657, 0.03823254257440567, 0.018175706267356873, -0.012777084484696388, 0.020028462633490562, -0.06857515871524811, -0.005736943334341049, 0.030978620052337646, -0.026738960295915604, 0.007407179102301598, -0.031020114198327065, 0.011410881765186787, 0.007515931501984596, 0.03313516825437546, -0.04033176600933075, 0.008242391981184483, -0.007210214622318745, -0.049588851630687714, -0.01359749585390091, 0.02291884459555149, 0.00872005894780159, 0.05653131380677223, 0.04028964787721634, 0.060668982565402985, -0.022726956754922867, -0.035649076104164124, -0.061943620443344116, 0.04338115081191063, -0.007866333238780499, -0.0467379130423069, -0.01836193911731243, 0.023799307644367218, -0.0147122573107481, -0.020874053239822388, -0.04931187257170677, 0.024256214499473572, -0.003682763548567891, 0.001679842360317707, -0.02432132698595524, -0.02871464379131794, -0.008244635537266731, -0.004117252305150032, -0.04170014336705208, -0.02373519167304039, -0.024100132286548615, -0.014188142493367195, 0.009565561078488827, 0.05605604127049446, -0.029116315767169, -0.012036141008138657, 0.01248566061258316, 0.001943450071848929, -0.008608868345618248, 0.012824096716940403, -0.007605184800922871, 0.016188932582736015, 0.01598120667040348, 0.018185630440711975, -0.03446528688073158, 0.00805705413222313, -0.009521448984742165, -0.024141110479831696, 0.046275123953819275, -0.026368096470832825, -0.018588611856102943, -0.01909104734659195, 0.003027021884918213, -0.023859476670622826, 0.003697426524013281, 0.03303392976522446, -0.0213956069201231, -0.034134913235902786, -0.021102532744407654, -0.04143386706709862, 0.011398518458008766, 0.058912649750709534, 0.031097378581762314, -0.0004001560155302286, 0.026465142145752907, -0.025955846533179283, -0.025454100221395493, -0.027968842536211014, -0.021172448992729187, -0.0026222383603453636, -0.07088986039161682, 0.039667051285505295, -0.010684865526854992, 0.0073723215609788895, -0.007927323691546917, -0.03018614463508129, -0.019112585112452507, -0.04693733528256416, -0.029228689149022102, -0.018803805112838745, 0.04986631125211716, 0.042195871472358704, -0.04359305277466774, -0.021035034209489822, 0.04523124545812607, 0.006032581441104412, 0.04899601638317108, -0.007983697578310966, -0.025190232321619987]" ./train/magpie/n01582220_9174.JPEG,magpie,"[0.024160467088222504, 0.007093454245477915, 0.019073106348514557, -0.02497195266187191, 0.011849849484860897, -0.010847390629351139, 0.03934988006949425, -0.0002885344729293138, 0.07353007793426514, 0.039961736649274826, 0.00034936057636514306, 0.05012034252285957, -0.017881684005260468, -0.02358383499085903, -0.0010736872209236026, 0.0038277709390968084, 0.13183367252349854, 0.058457739651203156, -0.012599710375070572, -0.0015261288499459624, -0.01837468519806862, -0.004037331324070692, -0.012911153957247734, -0.04344477131962776, -0.026901183649897575, 0.008952738717198372, 0.007692967541515827, -0.0160780418664217, 0.03191006928682327, -0.04048678278923035, 0.05708583444356918, 0.06406109780073166, -0.002853631041944027, 0.03014311008155346, 0.010645010508596897, -0.041936565190553665, -0.01490311324596405, -0.0117448465898633, 0.024436650797724724, 0.15548887848854065, 0.012371374294161797, -0.0218665711581707, 0.04407937452197075, -0.034821994602680206, 0.08314365148544312, -0.01915360800921917, 0.034689173102378845, -0.001920580747537315, 0.008992938324809074, -0.01130161713808775, 0.004737488459795713, 0.044334378093481064, -0.011102725751698017, -0.06634591519832611, -0.016643192619085312, -0.018466774374246597, -0.00509846955537796, 0.005855091847479343, 0.027209296822547913, 0.0012536841677501798, 0.13288940489292145, 0.007361594587564468, 0.02211327664554119, 0.03303981199860573, -0.02314656972885132, -0.029837939888238907, 0.012309645302593708, 0.041593510657548904, -0.05628880485892296, -0.008294855244457722, -0.016773955896496773, -0.012951894663274288, -0.002307925373315811, 0.007505937945097685, -0.00012787558080162853, -0.020838387310504913, 0.011492602527141571, -0.0061366925947368145, -0.06358571350574493, -0.09156710654497147, -0.032094694674015045, 0.017406396567821503, 0.02179970033466816, -0.03566784784197807, 0.027256669476628304, -0.003827367676422, -0.015556535683572292, 0.021336140111088753, 0.04989886283874512, -0.020778963342308998, 0.0033111823722720146, -0.042029377073049545, -0.5591980814933777, -0.018316512927412987, 0.007089986000210047, -0.012013779953122139, -0.03538649156689644, -0.0019055482698604465, -0.10490685701370239, 0.0464041642844677, 0.030099300667643547, 0.002691939240321517, 0.0024128840304911137, -0.01875971630215645, -0.014639213681221008, 0.006653680000454187, -0.07801038026809692, 0.04803793504834175, -0.0001672878861427307, -0.07044114172458649, 0.031514186412096024, -0.05908753350377083, 0.03760094195604324, 0.005185714457184076, -0.001722776680253446, -0.025217993184924126, 0.034776315093040466, -0.0391242690384388, 0.015164596028625965, -0.01508896704763174, 0.049217648804187775, -0.03208686783909798, -0.0005495739751495421, -0.004294337704777718, 0.001891521387733519, -0.02055932581424713, 0.036526575684547424, 0.04197143763303757, 0.012211252935230732, -0.028711138293147087, -0.011292953044176102, -0.0064398376271128654, -0.07223217189311981, 0.08537102490663528, -0.0015733791515231133, -0.005380399990826845, -0.025686059147119522, -0.04125167429447174, 0.02835271507501602, 0.03292396292090416, 0.030288226902484894, 0.014428142458200455, 0.03312288597226143, 0.012942712754011154, -0.0005749272531829774, 0.018235716968774796, 0.001226428896188736, -0.02465469017624855, -0.03620892018079758, -0.03566613048315048, -0.02746814303100109, 0.004429561085999012, 0.07448557764291763, -0.06726329028606415, 0.04413578659296036, 0.050667859613895416, 0.0360848605632782, -0.0015272214077413082, -0.020729070529341698, -0.014267168939113617, -0.04422175884246826, -0.042066022753715515, 0.03461253643035889, -0.06393881142139435, 0.023546477779746056, 0.005863412749022245, 0.020660419017076492, 0.048475876450538635, 0.044789303094148636, 0.07250277698040009, -0.0014954545767977834, 0.021231871098279953, -0.004137168172746897, -0.012521357275545597, -0.01960640586912632, -0.015301333740353584, 0.046174705028533936, 0.011521166190505028, 0.030773833394050598, -0.01371778640896082, -0.000434816291090101, -0.02249135635793209, 0.013185111805796623, -0.004227050114423037, -0.02363690175116062, -0.007175542414188385, 0.013524675741791725, -0.01083192229270935, 0.025601565837860107, 0.052843254059553146, 0.003497722325846553, -0.004094867035746574, 0.07059191167354584, 0.032397981733083725, 0.08016367256641388, 0.0007817231235094368, -0.03284246847033501, -0.013202344998717308, -0.06313006579875946, 0.08638224005699158, -0.03140845149755478, 0.008022040128707886, 0.06664121150970459, 0.026024537160992622, 0.028139924630522728, 0.00692152651026845, -0.043695807456970215, -0.07444547861814499, -0.009171117097139359, 0.006991663482040167, -0.02140534110367298, 0.0829557478427887, -0.014280297793447971, 0.007290803827345371, -0.049052126705646515, -0.026399852707982063, -0.017196109518408775, 0.008392718620598316, 0.10099492967128754, -0.00890007708221674, 0.06359001994132996, -0.016995543614029884, -0.0025605240371078253, 0.03160478547215462, -0.03740058094263077, 0.03253684565424919, -0.030784206464886665, 0.03217415139079094, 0.01682494767010212, 0.03899560123682022, -0.08566401153802872, -0.042682331055402756, 0.011642749421298504, 0.02517121098935604, 0.003639258909970522, -0.012818302027881145, 0.0043023740872740746, 0.03459515422582626, -0.01299612782895565, 0.021098019555211067, 0.027451282367110252, -0.00040464921039529145, -0.007524039130657911, -0.01076809037476778, 0.015606734901666641, 0.04350476711988449, 0.0257802102714777, -0.05857046693563461, -0.0652090385556221, 0.005292191170156002, 0.014034935273230076, 0.07533488422632217, 0.06740040332078934, 0.01025830116122961, -0.0005542162689380348, -0.022829405963420868, -0.02116856910288334, 0.01948942057788372, 0.0359378457069397, 0.02264237403869629, -0.029865985736250877, 0.019094198942184448, -0.020829902961850166, 0.04902824014425278, 0.037194158881902695, -0.06069646775722504, 0.024780992418527603, 0.012714999727904797, 0.0691947415471077, 0.030716214329004288, 0.001551494817249477, -0.007465094327926636, 0.036070965230464935, -0.035359229892492294, 0.02511664852499962, -0.02369074709713459, -0.001989488024264574, -0.018030859529972076, 0.00284755602478981, -0.013539100997149944, 0.02853364311158657, 0.01657368429005146, -0.07989802956581116, -0.011099009774625301, -0.004972872324287891, 0.01921026036143303, 0.06202762573957443, -0.03198898583650589, -0.07197672128677368, 0.03638819605112076, 0.027367044240236282, -0.016812097281217575, -0.024425072595477104, -0.0011781038483604789, 0.0018834329675883055, -0.015112644992768764, 0.052254773676395416, -0.0238084364682436, 0.057045016437768936, 0.001644094125367701, -0.0623043030500412, 0.026133863255381584, 0.0060457573272287846, 0.01579425111413002, 0.03945454955101013, 0.0230529997497797, 0.05572323873639107, 0.04560920596122742, 0.05280375853180885, -0.010556241497397423, 0.04519740864634514, -0.0014746158849447966, 0.08513842523097992, 0.0003461302840150893, 0.016469011083245277, 0.024240294471383095, -0.010911987163126469, 0.028248528018593788, 0.00694246543571353, -0.048344653099775314, 0.01788283884525299, 0.17764800786972046, -0.0012313094921410084, 0.027182232588529587, -0.0058734230697155, -0.0203128382563591, -0.009332248009741306, -0.028635213151574135, -0.024131502956151962, -0.02534724585711956, -0.008746733888983727, 0.044231072068214417, -0.026596570387482643, 0.03965161740779877, -0.021966461092233658, 0.005577948410063982, -0.009413330815732479, -0.0031762050930410624, -0.018551232293248177, 0.0404222197830677, -0.060946498066186905, -0.050404757261276245, -0.012903100810945034, 0.034003790467977524, 0.007958239875733852, 0.011308015324175358, 0.01504530105739832, -0.007592208683490753, 0.014820147305727005, 0.0123501131311059, 0.0009878387209028006, -0.009952067397534847, 0.026920432224869728, -0.027846092358231544, -0.03655385226011276, 0.020822983235120773, 0.006281594280153513, -0.1266481727361679, -0.025199538096785545, 0.01657397672533989, 0.05939395725727081, -0.027491329237818718, 0.01870228722691536, 0.0181090347468853, -0.03167564421892166, -0.002583073452115059, -0.007969173602759838, -0.043534550815820694, -0.03577686473727226, 0.033099088817834854, -0.013704787939786911, 0.002888633171096444, 0.01950657367706299, 0.018055617809295654, 0.00822446122765541, 0.027875656262040138, 0.08280688524246216, 0.0031817611306905746, -0.051395900547504425, 0.016961656510829926, -0.05867300182580948, -0.01557796448469162, 0.05602820962667465, -0.04760974273085594, -0.04100887104868889, 0.049678102135658264, -0.010309642180800438, -0.0009282982791773975, -0.01718190312385559, -0.08685006946325302, -0.023924613371491432, -0.028190841898322105, 0.023116661235690117, 0.0043211448937654495, -0.014335491694509983, -0.010885187424719334, -0.04996220022439957, 0.006016165018081665, -0.0764925628900528, -0.0410352386534214, -0.021604374051094055, -0.0014018719084560871, -0.038938671350479126, -0.004331620410084724, -0.0006884632748551667, 0.010979775339365005, 0.037739988416433334, 0.027785243466496468, 0.01817951165139675, 0.023051468655467033, 0.01945107989013195, 0.016077203676104546, 0.02433989942073822, 0.01831074431538582, -0.016537997871637344, 0.006579318083822727, 0.004825262352824211, -0.02433966100215912, -0.004908944945782423, -0.011562207713723183, 0.02305513620376587, 0.015940256416797638, -0.024168238043785095, -0.007666043471544981, 0.0014097335515543818, -0.01776377111673355, 0.038612835109233856, 0.033639587461948395, 0.10767996311187744, -0.003733118763193488, 0.049429114907979965, -0.008152573369443417, 0.07034875452518463, -0.016688473522663116, 0.007732133846729994, -0.0533306859433651, 0.0024239318445324898, 0.01718831993639469, -0.015078617259860039, -0.029803097248077393, -0.0032651452347636223, 0.015175482258200645, -0.04272256791591644, -0.04642597958445549, 0.031953390687704086, -0.0026879359502345324, -0.02597433514893055, -0.007914516143500805, 0.0007166499854065478, -0.04002115875482559, -0.029179958626627922, -0.08463072776794434, -0.005967558361589909, -0.0011628874344751239, -0.010588291101157665, -0.006620184052735567, 0.05052255466580391, 0.011477751657366753, -0.016957247629761696, -0.028367355465888977, -0.02144753746688366, 0.01822798326611519, 0.04277347773313522, 0.03586737439036369, -0.01965181902050972, -0.03424927592277527, 0.016632530838251114, -0.01004241593182087, -0.022837502881884575, -0.01189753133803606, -0.014798690564930439, -0.025130676105618477, -0.031084910035133362, -0.00337382429279387, -0.007632450666278601, -0.0041726198978722095, 0.014692491851747036, 0.007099108770489693, 0.001522693200968206, -0.007602477911859751, -0.024402230978012085, -0.018283359706401825, 0.008135149255394936, 0.0558716282248497, 0.08308357745409012, 0.03957244008779526, 0.007914732210338116, 0.014765379019081593, -0.005076931789517403, -0.026593996211886406, -0.020071789622306824, 0.031864989548921585, 0.018167415633797646, -0.07646191865205765, 0.05492674931883812, 0.013440031558275223, 0.03392993286252022, 0.02309064194560051, -0.0681287944316864, -0.004298768937587738, -0.05320064350962639, -0.01815691776573658, 0.02020857483148575, 0.04271760582923889, 0.049738023430109024, -0.06704781949520111, -0.04431435093283653, 0.004337422549724579, 0.0046394383534789085, 0.04796897992491722, 0.004748394712805748, -0.03285367414355278]" ./train/magpie/n01582220_7366.JPEG,magpie,"[-0.02371249347925186, -0.009645716287195683, -0.0016209741588681936, 0.0009060637094080448, 0.03450147062540054, 0.017253641039133072, 0.045869432389736176, 0.00015077926218509674, 0.01883888430893421, 0.007792784366756678, -0.011369054205715656, 0.003610048210248351, -0.03737921640276909, -0.01980692148208618, -0.01555605698376894, 0.03726719692349434, 0.018710212782025337, 0.05424460396170616, 0.002905221888795495, -0.008288638666272163, 0.012730400077998638, -0.0002417399373371154, 0.004015324171632528, -0.05399547144770622, -0.02729376219213009, 0.007152630016207695, 0.017088813707232475, -0.0007526837289333344, 0.023802585899829865, 0.04117068275809288, 0.002698026830330491, 0.03441814333200455, -0.02958955056965351, 0.041378241032361984, 0.028502514585852623, 0.0066034127958118916, -0.024601560086011887, -0.020483501255512238, 0.021470557898283005, 0.14096757769584656, 0.011897043325006962, 0.03595246002078056, 0.03948592767119408, -0.06017713621258736, 0.06763345748186111, -0.0949864611029625, 0.04709884151816368, 0.008256764151155949, -0.005962083116173744, 0.009331847541034222, 0.0058221472427248955, 0.024431856349110603, 0.01817258633673191, -0.04231194034218788, -0.037667348980903625, 0.027587836608290672, -0.013861940242350101, 0.02033231407403946, -0.013440192677080631, 0.0007481640204787254, 0.09274820983409882, 0.01777949184179306, -0.011011690832674503, 0.043052226305007935, -0.059042878448963165, -0.027257505804300308, 0.05293184146285057, 0.05314425751566887, -0.03803861886262894, -0.010822998359799385, -0.013901042751967907, 0.009247802197933197, -0.008278192952275276, -0.00035889894934371114, -0.0008545722812414169, -0.053942885249853134, 0.02614651992917061, -0.0037872137036174536, -0.05745084211230278, -0.06477154046297073, -0.027296731248497963, -0.008507554419338703, -0.021436680108308792, 0.0030326705891638994, 0.03808005899190903, -0.006414963863790035, 0.0483364574611187, 0.036890286952257156, 0.05692692846059799, -0.05640621483325958, 0.033510297536849976, -0.045481789857149124, -0.5896441340446472, -0.05971495062112808, 0.017108481377363205, -0.018148507922887802, -0.04542689770460129, -0.013390611857175827, -0.10496780276298523, 0.01621687039732933, 0.016685033217072487, 0.002735704416409135, 0.0023957767989486456, -0.010169627144932747, 0.026985839009284973, 0.0031044569332152605, -0.07542374730110168, 0.005354748107492924, -0.016724560409784317, -0.03826900199055672, 0.023078594356775284, -0.07031402736902237, 0.018373822793364525, 0.0016768774949014187, 0.011864947155117989, -0.08081497997045517, 0.0016661698464304209, -0.0550600029528141, 0.06589753925800323, -0.01828802563250065, 0.03755198046565056, 0.030726581811904907, 0.024764368310570717, -0.03181871771812439, 0.01469501107931137, -0.01596648618578911, 0.027697645127773285, 0.018910404294729233, 0.009384779259562492, -0.007583658676594496, -0.014306318014860153, -0.054540760815143585, 0.0020458924118429422, 0.08330405503511429, -0.0012431618524715304, 0.0053216335363686085, -0.025013312697410583, -0.051935646682977676, 0.026648031547665596, 0.050655364990234375, 0.011194187216460705, -0.03311809524893761, 0.04280814900994301, 0.005124401766806841, 0.025355717167258263, 0.005933243315666914, 0.005913678091019392, -0.032133858650922775, -0.0041751740500330925, -0.005216552410274744, -0.0044196234084665775, -0.014219448901712894, 0.03959666192531586, -0.0615244060754776, 0.04761654511094093, 0.004071869887411594, 0.013410443440079689, 0.020280128344893456, -0.013231414370238781, -0.011288641020655632, -0.07747237384319305, -0.04851044341921806, 0.042905233800411224, -0.021356679499149323, 0.026564190164208412, -0.04310188814997673, -0.010483593679964542, 0.049964845180511475, 9.295800737163518e-06, 0.06796199828386307, 0.0266974326223135, 0.012772434391081333, 0.00649450346827507, -0.03917109966278076, -0.032210711389780045, -0.025563716888427734, -0.00806321483105421, 0.010443711653351784, -0.06285403668880463, -0.01832546293735504, 0.013120660558342934, -0.03830739110708237, 0.03909694403409958, 0.035706527531147, 0.012591601349413395, 0.01654517464339733, -0.000490622769575566, -0.009967484511435032, 0.03008981980383396, 0.026224946603178978, 0.011994645930826664, 0.009188218042254448, 0.078854501247406, 0.0388774536550045, 0.044858478009700775, -0.015029014088213444, -0.008711522445082664, -0.031271468847990036, -0.04590999707579613, 0.046848148107528687, -0.018268456682562828, 0.018510906025767326, 0.005675468593835831, 0.030786359682679176, 0.02925882861018181, 0.031498219817876816, -0.006721229758113623, -0.03736579418182373, -0.042268916964530945, 0.03274755924940109, -0.06001751869916916, 0.032222550362348557, -0.039339251816272736, 0.01710750162601471, -0.05827859416604042, -0.055774055421352386, 0.009993472136557102, -0.0017749837134033442, 0.12804384529590607, -0.031546659767627716, 0.04006920009851456, -0.011744220741093159, 0.0068099964410066605, 0.04645772650837898, -0.07127464562654495, 0.03096800670027733, -0.04756840318441391, 0.04281078279018402, -0.014393161050975323, 0.01254145335406065, -0.08580081164836884, -0.051926545798778534, 0.031230712309479713, 0.05752906948328018, -0.010008521378040314, -0.08386486768722534, -0.024363147094845772, 0.04540593922138214, 0.021651364862918854, 0.03286708891391754, -0.011724749580025673, 0.019426435232162476, -0.011646843515336514, 0.019748343154788017, 0.025686245411634445, 0.07704199105501175, 0.009262263774871826, -0.03891934081912041, -0.02029307372868061, 0.0004677810939028859, -0.010666752234101295, 0.05706944316625595, 0.045682694762945175, 0.008713888004422188, -0.02351740002632141, -0.017031611874699593, -0.0408802255988121, 0.0377885103225708, 0.030523139983415604, 0.020501116290688515, -0.02478906698524952, 0.042474500834941864, -0.02438884600996971, -0.05548354610800743, 0.05513571575284004, -0.038919687271118164, 0.06209726259112358, 0.0032807132229208946, 0.0445636548101902, 0.02169184945523739, -0.0038499864749610424, -0.0047645424492657185, 0.0494098998606205, -0.0060448176227509975, 0.008292526938021183, -0.03999287635087967, -0.011831640265882015, -0.026623934507369995, -0.006210496183484793, 0.005779314786195755, 0.012642020359635353, 0.013506862334907055, -0.08722223341464996, 0.03122289851307869, -0.017810843884944916, 0.00032396052847616374, -0.030853301286697388, -0.013738471083343029, -0.015376482158899307, 0.03496458753943443, 0.025028171017766, -0.05438316613435745, 0.03943595290184021, -0.000770176004152745, 0.025169722735881805, -0.007630534470081329, 0.0217487420886755, -0.016348881646990776, -0.004442897159606218, -0.015246191993355751, -0.05783356726169586, 0.003921967465430498, 0.0004141897370573133, 0.032078810036182404, -0.0029484378173947334, 0.044036004692316055, 0.01785258762538433, 0.01599115878343582, 0.05203761160373688, 0.016923654824495316, 0.02243489772081375, -0.002124682068824768, 0.08306946605443954, -0.009397629648447037, 0.0034093570429831743, 0.0314192995429039, -0.021766087040305138, 0.0018191237468272448, -0.0005448040319606662, -0.03754255920648575, 0.0700313076376915, 0.10442429780960083, -0.0074350908398628235, 0.04256679490208626, 0.0006438189884647727, -0.010146372020244598, -0.00042094249511137605, 0.010988553985953331, -0.06122883781790733, -0.01995663344860077, -0.028236834332346916, -0.013168396428227425, -0.04039132967591286, 0.054447926580905914, -0.013779534958302975, 0.029885459691286087, -0.024430057033896446, -0.023661989718675613, -0.02928551845252514, 0.06979049742221832, -0.059790100902318954, -0.05481935665011406, -0.026651544496417046, 0.03734477981925011, -0.03275313600897789, -0.02079956792294979, 0.014755476266145706, 0.026086220517754555, 0.02051837369799614, 0.017664382234215736, -0.0671733170747757, -0.017646262422204018, 0.06474141776561737, -0.016305407509207726, -0.04590162634849548, 0.03963400423526764, 0.014316030777990818, -0.028582798317074776, -0.015106341801583767, 0.01596560887992382, 0.032853227108716965, -0.024650132283568382, 0.046455416828393936, 0.006571703590452671, -0.004508602432906628, -0.031301386654376984, 0.006803995929658413, -0.05042421817779541, -0.051634281873703, 0.045706260949373245, -0.03778461739420891, 0.047002162784338, 0.04195791482925415, 0.012229595333337784, 0.044756680727005005, 0.017167646437883377, 0.0515735000371933, 0.02663460560142994, -0.05065072700381279, -0.0027743412647396326, -0.052658163011074066, 0.005582258105278015, 0.004518348257988691, -0.03770330548286438, -0.0443434864282608, 0.02642912045121193, -0.007909665815532207, 0.023577099665999413, -0.020433560013771057, -0.11792270839214325, -0.015074889175593853, -0.016118858009576797, 0.023293590173125267, 0.010771043598651886, 0.008984006941318512, 0.004243169911205769, -0.03981875255703926, 0.005594640504568815, -0.07644125819206238, -0.02730107679963112, -0.008916007354855537, 0.0181130263954401, -0.07814857363700867, 0.009019787423312664, -0.041332535445690155, -0.008365674875676632, 0.05143185704946518, 0.017079990357160568, 0.07064754515886307, 0.014201432466506958, -0.011817172169685364, 0.009931755252182484, -0.001758753671310842, 0.012164009734988213, -0.013428740203380585, 0.005709748715162277, -0.025297006592154503, -0.018301887437701225, 0.01075462531298399, -0.01961885206401348, 0.024464666843414307, 0.012998536229133606, -0.04649478569626808, -0.040985070168972015, 0.0039030914194881916, -0.040474291890859604, 0.009073516353964806, 0.011244934052228928, 0.11282296478748322, -0.04979439452290535, 0.03351539000868797, 0.032350946217775345, 0.04551555588841438, -0.0541534461081028, -0.015545069240033627, -0.019887080416083336, 0.014615794643759727, -0.021302776411175728, -0.028616556897759438, -0.022875133901834488, -0.004495840985327959, -0.07032947987318039, -0.021478958427906036, -0.006923959590494633, 0.02135641686618328, -0.0046139066107571125, -0.03474412485957146, -0.007048803847283125, 0.008907963521778584, -0.018625101074576378, -0.022529246285557747, -0.047638460993766785, -0.007102517411112785, 0.03537321090698242, -0.010920519009232521, -0.021615345031023026, 0.03008086606860161, 0.031270258128643036, -0.045721635222435, 0.0029615098610520363, -0.00925447791814804, 0.02451382949948311, -0.011767839081585407, 0.0012935498962178826, -0.010982238687574863, -0.016170267015695572, 0.009393093176186085, -0.00595080154016614, -0.006945550441741943, 0.02787531539797783, -0.02437962032854557, 0.029440734535455704, -0.005597281269729137, 0.02771615795791149, -0.019454266875982285, -0.028641143813729286, -0.034604281187057495, 0.04030117020010948, -0.030671285465359688, -0.04259669408202171, 0.02579449489712715, 0.0035982157569378614, 0.007022105623036623, 0.04987793415784836, 0.047403909265995026, 0.015043174847960472, 0.00042390363523736596, 0.042437948286533356, -0.04457980394363403, -0.04633547365665436, -0.002276413841173053, 0.0009596302988938987, 0.02855350449681282, -0.046462081372737885, 0.032227855175733566, 0.02154456079006195, 0.032071150839328766, 0.013303489424288273, -0.0418667271733284, -0.02397536300122738, -0.033488303422927856, -0.001763464999385178, 0.0057095675729215145, 0.037892166525125504, 0.08667585253715515, -0.045697104185819626, -0.04911282658576965, 0.014063685201108456, 0.0031428332440555096, 0.06721703708171844, 0.015605724416673183, -0.020957602187991142]" ./train/magpie/n01582220_8930.JPEG,magpie,"[-0.00112565525341779, 0.02546440251171589, 0.012047139927744865, -0.03276028484106064, 0.012055620551109314, 0.00964032206684351, 0.03826441988348961, 0.015533886849880219, 0.0370512530207634, 0.01405534241348505, 0.006301657296717167, 0.00865269172936678, 0.04431404918432236, -0.0030768210999667645, 0.007015124894678593, 0.02138284407556057, 0.06634464114904404, 0.04021112248301506, -0.025113021954894066, 0.001337815192528069, -0.018167488276958466, -0.001944337273016572, 0.001497034216299653, -0.03335808217525482, -0.04536749795079231, 0.05153121426701546, 0.01848698779940605, -0.05739543214440346, -0.016551628708839417, 0.0011333976872265339, 0.04555647075176239, 0.041424460709095, -0.005163437686860561, 0.02434537187218666, 0.051395826041698456, 0.013767840340733528, -0.020520977675914764, 0.03226440027356148, 0.02115347422659397, 0.11415638774633408, 0.02381863072514534, -0.00040505442302674055, 0.031443435698747635, -0.042003996670246124, 0.07360096275806427, -0.07399679720401764, 0.008254801854491234, 0.002696232171729207, 0.056658677756786346, -0.01166100800037384, 0.026444129645824432, 0.02670886740088463, 0.0027462742291390896, -0.05785804241895676, -0.028699861839413643, 0.04817257821559906, -0.006272474303841591, 0.021232737228274345, -0.030727427452802658, 0.0040565375238657, 0.1291009932756424, -0.0047866967506706715, -0.008150012232363224, 0.013988073915243149, -0.05034605786204338, -0.02358354814350605, 0.051405616104602814, 0.018571021035313606, -0.009928890503942966, -0.019587917253375053, 0.0005826536798849702, -0.04014939069747925, -0.037720732390880585, -0.00034924561623483896, 0.03813565894961357, -0.017953678965568542, 0.021806562319397926, -0.017750518396496773, -0.034694232046604156, -0.12139065563678741, -0.030787881463766098, 0.012590666301548481, 0.0038627658504992723, -0.027249416336417198, 0.019467566162347794, -0.012295144610106945, 0.012673822231590748, 0.016133762896060944, 0.02332511730492115, -0.02127910405397415, 0.005232284311205149, -0.06512340158224106, -0.5682567358016968, -0.030987568199634552, -0.023864613845944405, 0.02294139936566353, -0.042571112513542175, -0.0373971201479435, -0.09950713068246841, -0.013458378612995148, 0.020367665216326714, -0.009799855761229992, -0.008574379608035088, 0.027059189975261688, -0.03718922659754753, 0.02894505113363266, -0.16350795328617096, 0.04485379159450531, 0.009755424223840237, -0.02139291539788246, 0.01635933667421341, -0.07929398119449615, 0.03661178797483444, -0.019189439713954926, -0.0022889100946485996, -0.013579455204308033, 0.04817584529519081, -0.03773549199104309, 0.04699484631419182, -0.01077202893793583, 0.07294129580259323, 0.04446760565042496, 0.014170212671160698, 0.033294565975666046, 0.005378412548452616, -0.023177262395620346, 0.014706633053719997, 0.030917227268218994, -0.011213073506951332, -0.006961210630834103, 0.008062316104769707, -0.025882909074425697, -0.019633406773209572, 0.08422079682350159, 0.047075141221284866, -0.020802438259124756, -0.04345356300473213, -0.01111573912203312, -0.012081518769264221, 0.008153454400599003, -0.022778533399105072, 0.03509002551436424, 0.04756614565849304, 0.03407687693834305, 0.024890858680009842, -0.002188000362366438, -0.015737535431981087, -0.04480910301208496, 0.02456088550388813, -0.01975998841226101, -0.05239621922373772, 0.019129790365695953, 0.03491165116429329, -0.06219632551074028, 0.06717115640640259, -0.014389242976903915, 0.052160557359457016, -0.020391859114170074, -0.03474903106689453, -0.0297583919018507, 0.014651933684945107, -0.009696987457573414, 0.022394685074687004, -0.01811094768345356, -0.010005527175962925, -0.01156611368060112, 0.0011528806062415242, 0.038232285529375076, 0.01928715966641903, 0.08856440335512161, 0.00014753871073480695, 0.012783937156200409, -0.01387330424040556, -0.004090902861207724, 0.005870455410331488, -0.026471389457583427, -0.0022361911833286285, -0.010081466287374496, -0.015968358144164085, -0.007181791588664055, 0.014837289229035378, -0.022114858031272888, -0.00044222993892617524, 0.01681447960436344, -0.06402567774057388, -0.0018232723232358694, 0.005503151100128889, -0.0081002376973629, 0.02908927947282791, 0.04474323242902756, 0.022917522117495537, -0.015398586168885231, 0.03921692073345184, 0.045244716107845306, 0.05401911586523056, -0.010812629945576191, -0.032422155141830444, -0.016924679279327393, -0.06426380574703217, 0.06929168850183487, -0.010896222665905952, -0.011807979084551334, 0.031934235244989395, 0.07074195891618729, 0.04613673314452171, 0.04096414893865585, -0.018763521686196327, -0.09985372424125671, 0.00950019620358944, 0.02971271425485611, 0.0071065546944737434, 0.04482930898666382, 0.0048678237944841385, 0.027152441442012787, -0.03656395897269249, -0.06703604012727737, -0.02230748161673546, -0.0019943546503782272, 0.04791095480322838, -0.016761653125286102, 0.020591819658875465, 0.01762789860367775, 0.013315999880433083, 0.02334427647292614, 0.01928282156586647, 0.011084601283073425, -0.03277968987822533, 0.0375661700963974, -0.01615140400826931, 0.03298268839716911, -0.036006517708301544, -0.004686516709625721, 0.0689597874879837, 0.007298620417714119, 0.015540308319032192, 0.012938928790390491, 0.0504276342689991, -0.006247133947908878, 0.021900223568081856, 0.016594884917140007, 0.010235191322863102, 0.01691308617591858, -0.006922014523297548, -0.034883636981248856, 0.00818298477679491, 0.000979356816969812, 0.01048441044986248, -0.04975460469722748, -0.06959331780672073, -0.039774227887392044, 0.022137293592095375, 0.05571797862648964, 0.044002942740917206, -0.010503682307898998, -0.020954754203557968, -0.05609755963087082, -0.022987723350524902, -0.014620305970311165, -0.029227495193481445, -0.0031756190583109856, -0.019399408251047134, 0.008848058059811592, -0.0187649205327034, 0.04271302372217178, 0.0333530455827713, -0.06213878467679024, -0.006334239151328802, -0.009311113506555557, 0.048780132085084915, 0.035340774804353714, -0.0056940484791994095, -0.015952901914715767, 0.03213610127568245, -0.03054971992969513, 0.03766165301203728, -0.023380674421787262, 0.027094991877675056, -0.01317492313683033, 0.008053110912442207, 0.012710846960544586, 0.0479305163025856, -0.0008132632356137037, -0.04917497560381889, -0.021136105060577393, -0.015785235911607742, 0.02233853191137314, -0.06167694181203842, -0.03732045739889145, -0.03747693449258804, -0.011669988743960857, -0.01864132657647133, -0.0273840744048357, 0.0022262409329414368, 0.019798994064331055, -0.011769979260861874, -0.010552028194069862, 0.0636180192232132, -0.02012818679213524, 0.0644337460398674, 0.000880122825037688, -0.02511628158390522, -0.018079861998558044, -0.0011117112590000033, -0.02308133989572525, 0.04663402587175369, 0.05577520653605461, 0.02551918290555477, 0.02187766321003437, 0.0517970472574234, -0.0010723562445491552, -0.0009439339046366513, 0.05135022848844528, 0.08396995812654495, -0.01960960403084755, 0.010755769908428192, 0.029035702347755432, -0.05923265963792801, 0.0052268835715949535, 0.0035809434484690428, -0.06053074076771736, 0.03882410004734993, 0.09381368011236191, -0.004267187789082527, 0.019228627905249596, -0.017844168469309807, -0.05199246108531952, 9.029927605297416e-05, -0.028653034940361977, -0.018589278683066368, -0.033788468688726425, 0.005057363770902157, 0.04801621660590172, -0.0759601816534996, 0.06502202898263931, -0.011557161808013916, 0.035304710268974304, 0.0003027821076102555, 0.024669615551829338, -0.006493933964520693, 0.0618303008377552, -0.044983550906181335, -0.06368256360292435, -0.0213085375726223, 0.04142550751566887, -0.045841507613658905, 0.03316571190953255, 0.054809607565402985, -0.00636277487501502, -0.0010475782910361886, 0.010239921510219574, -0.043494097888469696, -0.001290464773774147, 0.030330516397953033, -0.06805925816297531, -0.04552794247865677, 0.019116850569844246, 0.008888456039130688, -0.12419604510068893, 0.01556363608688116, 0.011084215715527534, 0.05087375268340111, -0.008463346399366856, -0.0030738050118088722, 0.041040558367967606, 0.005325307138264179, -0.004633887205272913, 0.0010829685488715768, -0.0828186646103859, -0.08447712659835815, 0.03314920887351036, 0.007280614227056503, 0.0077348737977445126, 0.07335692644119263, -0.015802260488271713, 0.005143212154507637, 0.054731786251068115, 0.10102953761816025, -0.0007177017396315932, -0.06481056660413742, 0.0004705816099885851, -0.03749556466937065, -0.04021289199590683, 0.045557901263237, -0.056117329746484756, -0.039801646023988724, 0.059732478111982346, -0.03332623466849327, -0.01643122360110283, -0.023004302754998207, -0.029489802196621895, -0.02254590392112732, -0.034478019922971725, 0.015882717445492744, -0.030576063320040703, -0.009861139580607414, -0.013212610967457294, -0.050627920776605606, 0.010795427486300468, -0.10261395573616028, -0.06456639617681503, -0.001244210172444582, 0.010790649801492691, -0.0566386915743351, -0.006610299926251173, 0.03847161680459976, 0.009328813292086124, 0.06858476251363754, 0.00042605699854902923, 0.021949848160147667, 0.0042291912250220776, 0.011550135910511017, 0.013787642121315002, -0.021104084327816963, 0.01199472788721323, -0.056790050119161606, 0.016031892970204353, 0.030858950689435005, -0.002703997539356351, -0.0094309002161026, -0.017985055223107338, 0.0010227893944829702, -0.017614006996154785, 0.009312450885772705, -0.07149040699005127, -0.03432111814618111, -0.011678951792418957, 0.023608099669218063, 0.04624071344733238, 0.026456933468580246, -0.03364245966076851, 0.014256807044148445, 0.015771977603435516, 0.012187824584543705, -0.03173083811998367, -0.03950490429997444, -0.06769250333309174, 0.051758959889411926, 0.007906798273324966, -0.0019248195458203554, -0.02246972918510437, 0.0018401870038360357, -0.023706326261162758, -0.05092212185263634, -0.005502129439264536, 0.037226706743240356, 0.03789139539003372, -0.02896469086408615, 0.00643089460209012, -0.008319464512169361, -0.04183514788746834, 0.012094623409211636, -0.09278808534145355, 0.013990935869514942, -0.03848994895815849, -0.01973646692931652, 0.021263161674141884, 0.045331891626119614, -0.013253975659608841, -0.002482114126905799, -0.026699988171458244, 0.0017627475317567587, 0.01792280375957489, 0.02383444644510746, 0.055685531347990036, 0.017044665291905403, -0.023409295827150345, 0.00788106583058834, -0.000676533323712647, -0.022302912548184395, 0.008167106658220291, -0.022939888760447502, 0.012909549288451672, -0.0019081628415733576, -0.019797060638666153, 0.021546075120568275, -0.012059240601956844, 0.002972803544253111, 0.0017843388486653566, -0.0015322361141443253, 0.006855033803731203, -0.004677300341427326, -0.0009277092176489532, -0.013665935955941677, 0.03597632795572281, 0.03078432008624077, -0.02632199041545391, -0.0021405366715043783, 0.006968184374272823, -0.05902819707989693, -0.036453377455472946, -0.03173745423555374, 0.02965620346367359, 0.030528295785188675, -0.061380352824926376, 0.049225110560655594, 0.013674608431756496, -0.013550542294979095, 0.044028643518686295, -0.0711965411901474, -0.003692447440698743, -0.017107609659433365, -0.0261248629540205, -0.012633491307497025, 0.01337867509573698, 0.05530655384063721, -0.052388425916433334, -0.024989239871501923, 0.025054490193724632, -0.006167660467326641, 0.037586987018585205, 0.023223554715514183, -0.047719791531562805]" ./train/magpie/n01582220_5870.JPEG,magpie,"[0.02721446380019188, 0.052603598684072495, 0.011121390387415886, -0.021226119250059128, 0.028998088091611862, 0.03684080019593239, 0.040427178144454956, 0.003815658390522003, 0.020972339436411858, -0.004809136968106031, 0.016760507598519325, 0.024895422160625458, 0.009051117114722729, 0.0021383154671639204, 0.0029488566797226667, -0.0023073183838278055, -0.015159009955823421, 0.028645167127251625, -0.02647707425057888, 0.02202826738357544, -0.0347573421895504, -0.03126255050301552, 0.012507937848567963, -0.04985321685671806, -0.014464253559708595, 0.03050452470779419, 0.04850401729345322, -0.014051363803446293, -0.02278324030339718, 0.012548190541565418, 0.015127482824027538, 0.0692000538110733, 0.03990809991955757, 0.025178592652082443, 0.051014531403779984, 0.00026510158204473555, 0.0020226631313562393, 0.031171133741736412, 0.0205028485506773, 0.11713559925556183, 0.042731087654829025, 0.04140693321824074, 0.06574037671089172, -0.05232734978199005, 0.06426537781953812, -0.07632030546665192, 0.013880464248359203, 0.032359734177589417, 0.011034621857106686, -0.02019016444683075, 0.03356942534446716, 0.02408660762012005, -0.013437274843454361, -0.05679707229137421, -0.009157353080809116, 0.021101180464029312, 0.004537724424153566, 0.029836928471922874, 0.014082299545407295, 0.04073469340801239, 0.05401778221130371, 0.01112520880997181, 0.007498587481677532, -0.0014628836652264, -0.03881435841321945, 0.002116382820531726, 0.05708447843790054, 0.0351322777569294, -0.02840319089591503, 0.008327456191182137, 0.001106958487071097, -0.008491392247378826, 0.007138695102185011, 0.025352519005537033, 0.030059756711125374, -0.015502383932471275, 0.02883909083902836, -0.0030941579025238752, -0.03903663158416748, -0.06918872892856598, -0.034859463572502136, -0.0344410203397274, 0.010455901734530926, -0.028598224744200706, 0.035044554620981216, -0.0008768747793510556, 0.035088349133729935, -0.003419548273086548, 0.020621536299586296, -0.02452712692320347, 0.01050837803632021, -0.042998190969228745, -0.6445350050926208, -0.01883791945874691, 0.020826485008001328, -0.00365491327829659, -0.03346892446279526, -0.019640525802969933, -0.11036773025989532, -0.0016463017091155052, 0.021030934527516365, -0.00715994369238615, -0.013220266439020634, 0.03821062296628952, 0.04362751916050911, -0.03906520456075668, -0.08673354983329773, 0.018347004428505898, 0.019576987251639366, -0.04080171138048172, 0.02010294981300831, -0.07608472555875778, 0.021546389907598495, -0.028586555272340775, 0.04617730900645256, -0.02747376449406147, 0.02513878047466278, -0.002689679153263569, 0.04366495832800865, 5.395268453867175e-05, 0.0021393527276813984, -0.007394408341497183, -0.002096185926347971, 0.017069950699806213, 0.0073751104064285755, -0.02318420074880123, -0.003904490265995264, 0.05029948428273201, 0.009014205075800419, -0.02567313238978386, 0.0013917491305619478, -0.034852102398872375, -0.0004907951224595308, 0.08482398092746735, -0.003614588873460889, 0.000475340464618057, 0.00775187648832798, -0.05785268917679787, 0.002081336220726371, 0.05840526521205902, 0.0023515508510172367, -0.02490139566361904, 0.046431854367256165, 0.004971204325556755, 0.023512249812483788, 0.007840224541723728, -0.020875615999102592, -0.02742004208266735, -0.021003391593694687, 0.002474358770996332, -0.013585148379206657, -0.008588951081037521, 0.01806112378835678, -0.05622715875506401, 0.0671164020895958, 0.006877783685922623, 0.02809746563434601, 0.01246190257370472, 0.003891684813424945, -0.044861532747745514, -0.008383776061236858, -0.05377513915300369, 0.08284665644168854, -0.02478325180709362, -0.031534381210803986, 0.013218945823609829, -0.03151411563158035, 0.02832632325589657, 0.011357746087014675, 0.0698942318558693, 0.04601483419537544, 0.03939768299460411, 0.006035353057086468, -0.04681861028075218, -0.00461389496922493, -0.034752607345581055, -0.03581417724490166, 0.019443010911345482, -0.020159641280770302, 0.006422411650419235, 0.029057079926133156, -0.007477427367120981, -0.022130951285362244, 0.005089427810162306, -0.018784478306770325, -0.0076602790504693985, 0.0393378883600235, -0.00022393939434550703, -0.008246303535997868, 0.038983654230833054, 0.022873979061841965, 0.023321500048041344, 0.05648977681994438, 0.047253839671611786, 0.02108941413462162, -0.03140299767255783, -0.06516654044389725, -0.004904748406261206, -0.05354990065097809, 0.07179663330316544, -0.022907178848981857, 0.02238934114575386, 0.02920627035200596, 0.024717941880226135, 0.03595126420259476, 0.03795340284705162, 0.0022419618908315897, -0.05728916823863983, -0.014879068359732628, 0.018786877393722534, -0.023380974307656288, 0.0368991419672966, -0.002452161628752947, 0.03222374990582466, -0.03792374208569527, -0.033050183206796646, -0.029204262420535088, 0.010952172800898552, 0.09553134441375732, -0.04249458387494087, 0.03437862545251846, 0.002945474348962307, 0.010320160537958145, 0.04582377150654793, 0.0022057185415178537, 0.04806296154856682, 0.012099425308406353, 0.014105659909546375, 0.0037313480861485004, 0.04270186647772789, -0.06856843829154968, -0.024197641760110855, 0.034924060106277466, 0.051023177802562714, 0.007948161102831364, -0.022925516590476036, 0.014470508322119713, 0.02589479647576809, 0.001276194816455245, 0.016230765730142593, 0.0043340218253433704, 0.0004233502550050616, -0.013101790100336075, -0.02630612440407276, 0.017647385597229004, 0.053184788674116135, 0.013331866823136806, -0.04837833717465401, -0.02624826319515705, -0.003022043500095606, -0.046637456864118576, 0.0852048397064209, 0.053645700216293335, 0.001980086322873831, -0.024233849719166756, 0.006540506146848202, -0.016505226492881775, -0.009026377461850643, 0.039273470640182495, 0.030977293848991394, -0.0028201667591929436, 0.03722933679819107, -0.00909703504294157, 0.03298152983188629, 0.07179022580385208, -0.01811944879591465, 0.03663168102502823, 0.011744806542992592, 0.06447494029998779, 0.02563181333243847, -0.009929755702614784, -0.015106539241969585, 0.0017257832223549485, -0.0015325581189244986, 0.0391039103269577, -0.019567107781767845, 0.024892229586839676, -0.019483063369989395, 0.018360517919063568, -0.006345998961478472, 0.04955526813864708, 0.05678660422563553, -0.03258041664958, -0.007480238098651171, -0.011801013723015785, 0.01601647026836872, -0.028047023341059685, 0.0071088108234107494, -0.045738428831100464, -0.005487082526087761, -0.010381616652011871, -0.01491838414222002, -9.48274100665003e-06, 0.02963332086801529, -0.00023277659784071147, -0.011808440089225769, 0.01781727559864521, 0.02004646696150303, -0.009104713797569275, -0.030880454927682877, -0.014798760414123535, 0.06047341600060463, -0.009467802941799164, 0.005327897146344185, 0.006757180206477642, 0.02586510218679905, -0.00350237637758255, 0.011385026387870312, 0.028145210817456245, 0.008475573733448982, 0.02193506248295307, -0.0006217693444341421, 0.08470691740512848, -0.0038127372972667217, -0.015261808410286903, 0.033352382481098175, -0.013748652301728725, 0.02666395530104637, 0.0043973312713205814, -0.06199129298329353, 0.06465120613574982, 0.16973495483398438, 0.006246146745979786, -0.017706692218780518, -0.01796705834567547, -0.036026086658239365, 0.010114999487996101, -0.012053395621478558, -0.038820646703243256, -0.013238524086773396, -0.036882903426885605, -0.019900675863027573, -0.0582861453294754, 0.02568686380982399, 0.00521654449403286, 0.020204853266477585, -0.0002709112304728478, 0.016332799568772316, -0.012576894834637642, 0.02654600888490677, -0.03597955033183098, -0.042608004063367844, -0.03484714403748512, 0.009665957652032375, -0.02366930991411209, -0.017412282526493073, 0.007973232306540012, 0.021777793765068054, 0.018144981935620308, 0.018159126862883568, -0.006650939118117094, 0.012674620375037193, 0.058429840952157974, -0.009846774861216545, -0.029535289853811264, 0.028085723519325256, 0.0075401123613119125, -0.07186473160982132, -0.03515526279807091, 0.045660704374313354, 0.08120657503604889, 0.007025731727480888, -0.062305934727191925, 0.03726150840520859, 0.015646370127797127, -0.008985774591565132, -0.021916111931204796, -0.021964525803923607, -0.050963178277015686, 0.04354735091328621, 0.016166260465979576, 0.025511253625154495, 0.05330440774559975, -0.012121589854359627, 0.038635991513729095, 0.01064765453338623, 0.08110740780830383, 0.02337961457669735, -0.05010388419032097, 0.00844673439860344, -0.030513713136315346, 0.006286729127168655, -0.004796361085027456, -0.0765465572476387, -0.01206472422927618, 0.05567546188831329, -0.04704884812235832, -0.0022317832335829735, -0.028409402817487717, -0.06610223650932312, 0.030726183205842972, -0.015400683507323265, 0.013682902790606022, -0.009819671511650085, 0.003679967951029539, 0.011909195221960545, -0.0021522806491702795, -0.01058086846023798, -0.0962708592414856, -0.039208635687828064, -0.005331016145646572, 0.015114972367882729, -0.030930722132325172, -0.016986481845378876, 0.013827241957187653, -0.004053674638271332, 0.024912556633353233, -0.013877995312213898, 0.028200916945934296, 0.02268059179186821, 0.025215579196810722, 0.05793144926428795, -0.017666246742010117, -0.015531758777797222, -0.02536884881556034, 0.016089173033833504, 0.009472785517573357, -0.014410139061510563, -0.0031283951830118895, -0.011232974007725716, 0.03874252736568451, -0.023032531142234802, -0.009118404239416122, -0.02162916399538517, -0.04865060746669769, -0.03573872894048691, 0.02779369056224823, 0.009242271073162556, 0.10380067676305771, -0.01400151476264, 0.020084790885448456, 0.027063781395554543, -0.01923392154276371, -0.00893991906195879, -0.03146233409643173, -0.039928462356328964, 0.03430863469839096, 0.013277345336973667, -0.02507718652486801, -0.04031406342983246, 0.03927960619330406, 0.007197529077529907, -0.008261051028966904, -0.029691418632864952, 0.02726883627474308, 0.019898349419236183, 0.007616595830768347, 0.01885729655623436, -0.01178368553519249, -0.0273180790245533, -0.03520644083619118, -0.07576793432235718, -0.012689076364040375, 0.028832947835326195, 0.020710760727524757, -0.01144587155431509, 0.04652336239814758, 0.01072824839502573, -0.04149962589144707, 0.007418589200824499, -0.03277404606342316, 0.0154582429677248, 0.0022277424577623606, 0.001120538217946887, -0.03032289631664753, -0.03414853289723396, -0.0008177064009942114, -0.0003315364592708647, 0.022021226584911346, -0.013247000984847546, -0.05188534036278725, 0.023500090464949608, -0.011216221377253532, -0.01084478572010994, 0.01961454562842846, -0.03582365810871124, -0.011650120839476585, 0.0077536385506391525, -0.012198705226182938, 0.004142060410231352, -0.022898975759744644, 0.0102253258228302, 0.010129903443157673, 0.03758542239665985, 0.058722324669361115, 0.018149735406041145, 0.0038992883637547493, -0.01022933330386877, -0.0044240802526474, -0.037139829248189926, -0.01365562342107296, 0.0053397309966385365, 0.005730201955884695, -0.058385271579027176, 0.018738403916358948, 0.015480400994420052, 0.006488417275249958, 0.02890988439321518, -0.05864869803190231, -0.006865397561341524, -0.05094011873006821, -0.013562015257775784, 0.028653481975197792, 0.04775562882423401, 0.08707009255886078, -0.07214374095201492, -0.02569577470421791, 0.02203252539038658, 0.0019741528667509556, 0.05176243931055069, -0.02502979338169098, -0.016292793676257133]" ./train/magpie/n01582220_9114.JPEG,magpie,"[-0.021464139223098755, 0.01047519687563181, 0.0304369255900383, -0.044101592153310776, 0.04237538203597069, -0.019581854343414307, 0.05084025114774704, 0.020807454362511635, 0.035158559679985046, 0.001971604535356164, 0.011056228540837765, 0.005577949341386557, 0.012753850780427456, -0.012391900643706322, 0.0021333422046154737, 0.004864285234361887, 0.010834029875695705, 0.005398605018854141, -0.0013975526671856642, 0.03315986320376396, -0.006931839976459742, -0.015504534356296062, 0.024589918553829193, -0.05145225673913956, -0.03208710998296738, 0.034500010311603546, 0.010476828552782536, -0.030444107949733734, -0.043980035930871964, 0.03457419201731682, -0.005262596067041159, 0.0184017326682806, 0.005363957025110722, 0.014713283628225327, -0.0005653556436300278, -0.01375124603509903, 0.0051915645599365234, 0.038489192724227905, 0.026554079726338387, 0.14044737815856934, 0.004693536087870598, 0.026720227673649788, 0.04102446883916855, -0.036187902092933655, 0.055613838136196136, -0.0869632288813591, -0.024159474298357964, 0.03704144433140755, 0.012114283628761768, -0.02845742553472519, 0.009630091488361359, -0.004406477324664593, -0.0007525944383814931, -0.06941040605306625, -0.026442375034093857, 0.03461301699280739, 0.006912937853485346, 0.050969719886779785, -0.001422422588802874, 0.04207688570022583, 0.06409361213445663, 0.03536428138613701, -0.0032641557045280933, 0.005349094979465008, -0.04034176096320152, -0.036267831921577454, 0.02662794105708599, 0.08382397890090942, -0.010612567886710167, -0.026100967079401016, -0.011952103115618229, 0.0024430290795862675, 0.002616456476971507, 0.0011031123576685786, 0.02853894978761673, -0.011795179918408394, 0.004504702519625425, -0.02084161713719368, -0.01327219046652317, -0.07088276743888855, -0.03390436992049217, 0.005779096856713295, -0.03541164472699165, -0.038936831057071686, 0.08172272145748138, 0.013153983280062675, 0.027012847363948822, -0.030590951442718506, 0.06156482174992561, -0.06081287935376167, 0.033799584954977036, -0.02085283026099205, -0.5894887447357178, -0.03563672676682472, 0.016627108678221703, -0.004349624738097191, -0.004672660026699305, -0.019487138837575912, -0.10405777394771576, 0.029750024899840355, -0.005836258642375469, 0.0035853476729243994, 0.002194408094510436, 0.031996749341487885, 0.005044473335146904, 0.00821932777762413, -0.16194842755794525, 0.03690608590841293, 0.03913707658648491, -0.038029465824365616, -0.030601000413298607, -0.023048898205161095, 0.0199742428958416, -0.008090557530522346, 0.031469304114580154, -0.00647295406088233, 0.04910041391849518, -0.03505919501185417, 0.042296621948480606, 0.037325579673051834, 0.03651022911071777, 0.003468903247267008, 0.00634697824716568, 0.03080536611378193, 0.026511989533901215, 0.0003253016620874405, 0.03487122058868408, 0.024207377806305885, -0.02735809050500393, -0.014007632620632648, 0.008478951640427113, -0.007018932141363621, -0.0014716075966134667, 0.07858482003211975, 0.04239477589726448, -0.002990811364725232, 0.029287589713931084, -0.044934190809726715, 0.01226253155618906, 0.028001587837934494, 0.013168940320611, -0.022482430562376976, 0.023309633135795593, 0.009241717867553234, -0.005176643840968609, -0.014242989011108875, -0.043261826038360596, 0.013038958422839642, 0.006577593274414539, -0.019459232687950134, 0.023584870621562004, 0.052164167165756226, -0.012765568681061268, -0.048025961965322495, 0.05128614231944084, -0.017813600599765778, 0.04987478256225586, 0.006140363402664661, 0.004918565042316914, -0.03411918506026268, -0.019994080066680908, -0.028702396899461746, 0.03523535281419754, 0.014730997383594513, -0.03194810822606087, -0.023423930630087852, -0.04013825207948685, 0.01821998506784439, 0.027305403724312782, 0.06486937403678894, 0.05696774274110794, 0.014715764671564102, 0.006180203519761562, -0.06154390797019005, -0.020146628841757774, -0.0001325299817835912, -0.05160960182547569, 0.005293588619679213, -0.051430054008960724, -0.010285905562341213, 0.0481988862156868, -0.007635306566953659, -0.007067415397614241, 0.0316508524119854, -0.00020035469788126647, -0.02335912361741066, 0.04573371261358261, -0.0004257140099070966, 0.01660851761698723, 0.04139121249318123, 0.0023870316799730062, 0.017100263386964798, 0.04643302038311958, 0.028539808467030525, -0.02409164048731327, -0.029515907168388367, -0.031453896313905716, -0.01887321099638939, -0.04679035767912865, 0.019650114700198174, 0.003987055737525225, -0.0072038061916828156, 0.021944018080830574, 0.07426587492227554, 0.01963813044130802, 0.047562308609485626, 0.009891434572637081, -0.06417511403560638, -0.008341901004314423, 0.01901957578957081, -0.04064110666513443, 0.026457780972123146, 0.004977939184755087, 0.041655246168375015, -0.050756167620420456, -0.03801856189966202, -1.1301144695607945e-05, 0.011546719819307327, 0.0704219862818718, -0.04851127043366432, 0.037058643996715546, 0.060400549322366714, -0.004909541457891464, 0.047481171786785126, -0.013338149525225163, 0.02071472816169262, -0.03358406573534012, 0.02219308912754059, 0.007584691513329744, 0.042409833520650864, -0.06122986599802971, -0.040972184389829636, 0.05520159751176834, 0.011807910166680813, -0.0008004626142792404, -0.06236043572425842, 0.006775208283215761, 0.00228584511205554, -0.002216694876551628, 0.006790624000132084, -0.0023766332305967808, -0.013783385045826435, -0.03145473822951317, -0.052024200558662415, 0.011099584400653839, 0.00942471344023943, 0.014667298644781113, -0.08814574033021927, -0.010185323655605316, -0.00446055643260479, -0.04193395376205444, 0.048094458878040314, 0.03441912680864334, -0.0034040173050016165, 0.011647152714431286, -0.002230822341516614, -0.021026041358709335, -0.003368082921952009, 0.16368769109249115, 0.008072043769061565, -0.01574445515871048, 0.001876127440482378, 0.0030836511868983507, 0.04979190602898598, 0.02662212774157524, -0.0034630976151674986, 0.032393209636211395, -0.01979578472673893, 0.02729293331503868, 0.03619766980409622, -0.023598812520503998, -0.015327486209571362, 0.02165708877146244, 0.02729968912899494, 0.030474048107862473, 0.019377470016479492, 0.020069686695933342, -0.02622571960091591, -0.007555528078228235, 0.01150481030344963, 0.04806823655962944, 0.03097984939813614, -0.06246194988489151, -0.03617994487285614, -0.005624090321362019, 0.007323582656681538, -0.13008929789066315, -0.05535544455051422, -0.07243993878364563, -0.0369957871735096, -0.007755643222481012, -0.01511238794773817, -0.03325045108795166, 0.02511587180197239, 0.01537144836038351, -0.017788322642445564, 0.1503438502550125, -0.016001319512724876, 0.013148041442036629, -0.013302838429808617, -0.0014122321736067533, 0.011519449763000011, 0.005087248515337706, 0.0007900818018242717, 0.005395024083554745, 0.016329776495695114, -0.02640429139137268, 0.031934503465890884, 0.04802587628364563, -0.021075280383229256, -0.005178365856409073, 0.01241071056574583, 0.07837080210447311, -0.0044301897287368774, 0.002678339835256338, -0.014740628190338612, 0.014180182479321957, 0.019756140187382698, 0.014254127629101276, -0.06626152992248535, 0.03423554450273514, 0.06068233400583267, -0.029411330819129944, -0.009913792833685875, -0.0037684652488678694, -0.013715406879782677, 0.02458808943629265, -0.04258395731449127, -0.05286859720945358, -0.009261790663003922, -0.051769256591796875, 0.005992176942527294, -0.04200449585914612, 0.004426910076290369, -0.005907668266445398, 0.04463344067335129, 0.014231393113732338, 0.047339946031570435, -0.00892605446279049, 0.004040527623146772, -0.04306457191705704, -0.04498584568500519, -0.03949260711669922, 0.010101228952407837, -0.012041252106428146, 0.00019171192252542824, 0.0176838468760252, 0.0006078315782360733, -0.016495291143655777, -0.016602151095867157, -0.03275280445814133, 0.017322247847914696, 0.04099290072917938, -0.035106759518384933, -0.032147280871868134, -0.0010153691982850432, -0.002508011180907488, -0.08874957263469696, -0.006287787575274706, 0.022961562499403954, 0.09454292804002762, -0.021641289815306664, -0.033597566187381744, 0.03905252367258072, -0.0037358326371759176, -0.018032753840088844, -0.0389077328145504, -0.08683715760707855, -0.07953617721796036, 0.04535793885588646, -0.012691761367022991, -0.0056426371447741985, 0.027707384899258614, 0.0068697272799909115, 0.025671128183603287, 0.024726537987589836, 0.10606803745031357, 0.012650123797357082, -0.08436614274978638, 0.013257674872875214, -0.010854724794626236, -0.008740969933569431, -0.012249674648046494, -0.04883992299437523, -0.011339650489389896, 0.0774301216006279, -0.03156866878271103, 0.027869390323758125, -0.046923283487558365, 0.07201649248600006, -0.01489650271832943, -0.03987850993871689, -0.0022270118352025747, -0.010351983830332756, 0.021398577839136124, -0.027860013768076897, 0.0032004881650209427, 0.00086966622620821, -0.15271314978599548, -0.06367145478725433, -0.010732925496995449, 0.017187533900141716, -0.023852430284023285, -0.007495356258004904, 0.011181505396962166, 0.02116543799638748, 0.005852330941706896, -0.018398117274045944, 0.032934702932834625, -0.02815060503780842, 0.006079418584704399, 0.03032485954463482, -0.019518472254276276, -0.0014239208539947867, -0.047078296542167664, 0.03374145179986954, -0.000641902384813875, -0.01228210050612688, -0.0008348394185304642, -0.030578115954995155, 0.007769971154630184, 0.010994921438395977, -8.169444481609389e-05, 0.012126587331295013, -0.05103065073490143, -0.015544218942523003, 0.008880315348505974, 0.04214302822947502, -0.030265092849731445, -0.026811176910996437, 0.015219174325466156, 0.041905634105205536, 0.022267524152994156, -0.020310120657086372, -0.027806000784039497, -0.04514453932642937, 0.028511065989732742, -0.002121153986081481, -0.021555569022893906, -0.06958524137735367, 0.020433781668543816, -0.01682450622320175, -0.031772710382938385, -0.027621347457170486, 0.045154474675655365, 0.03898796811699867, 7.706537144258618e-05, 0.015527550131082535, 0.029260458424687386, -0.005620542913675308, -0.018412968143820763, -0.06839203089475632, -0.006863339804112911, -0.03771113604307175, -0.003194124437868595, -0.020403221249580383, 0.022620955482125282, 0.008548643440008163, -0.012702606618404388, -0.00049525749636814, -0.026071486994624138, 0.04684777185320854, 0.017170753329992294, -0.026600096374750137, -0.007451260462403297, 0.02328350581228733, -0.008738173171877861, 0.015410495921969414, 0.01907379925251007, -0.027491571381688118, 0.005504608154296875, 0.01152441743761301, -0.031609777361154556, -0.023314785212278366, 0.031861092895269394, -0.013086865656077862, -0.03465700522065163, 0.03321380540728569, -0.0005114009836688638, 0.011277670040726662, -0.0018411320634186268, -0.033671047538518906, -0.024427471682429314, 0.015409172512590885, 0.01048248540610075, 0.011301097460091114, -0.021032653748989105, -0.002570532262325287, -0.04854467138648033, -0.013149761594831944, 0.006636922247707844, -0.02349812164902687, -0.007563426624983549, -0.03870590403676033, 0.03653358295559883, 0.033137399703264236, 0.008942208252847195, 0.040399517863988876, -0.02951541543006897, -0.0024163885973393917, -0.005808964837342501, -0.01222173310816288, 0.02200852520763874, 0.012244717217981815, 0.04229230061173439, -0.04334888979792595, -0.040793951600790024, 0.009069355204701424, 0.01283949427306652, 0.05325431004166603, -0.021472401916980743, -0.02893964573740959]" ./train/magpie/n01582220_10712.JPEG,magpie,"[-0.026607904583215714, -0.011466811411082745, -0.012620311230421066, 0.019881760701537132, 0.016633806750178337, 0.02497093193233013, 0.03777454048395157, -0.006279908120632172, -0.028369830921292305, 0.016199128702282906, 0.03127364069223404, 0.037619903683662415, -0.031108228489756584, -0.0055695646442472935, 0.021500105038285255, 0.026333564892411232, 0.046729207038879395, 0.05657913163304329, 0.0065145003609359264, -0.01158673595637083, 0.007593668065965176, -0.0019529360579326749, 0.02824932523071766, -0.03974735364317894, -0.019626973196864128, 0.01851228065788746, 0.044756460934877396, 0.005137820728123188, -0.006428947206586599, 0.03280721604824066, 0.018673712387681007, 0.06935165822505951, -0.039107806980609894, -0.008609011769294739, -0.04655933007597923, -0.0159921757876873, -0.021889828145503998, -0.009563526138663292, 0.026868725195527077, 0.029024774208664894, 0.045726846903562546, 0.02769407629966736, 0.035695020109415054, -0.09333430230617523, 0.055473167449235916, -0.0380723811686039, 0.0199575237929821, -0.002448753919452429, -0.0197629164904356, 0.014038676396012306, 0.012398059479892254, 0.050389617681503296, 0.001761875580996275, -0.05584799870848656, -0.03589293733239174, 0.045702021569013596, -0.0038089489098638296, 0.045596711337566376, 0.012101074680685997, -0.044251393526792526, 0.09630392491817474, 0.040040746331214905, -0.01670151576399803, 0.008252983912825584, -0.06355415284633636, -0.004041959531605244, 0.013997805304825306, 0.05818278715014458, -0.013010092079639435, -0.0009255806216970086, -0.0150612723082304, -0.0020335777662694454, -0.0038800095207989216, 0.012423829175531864, 0.017080379649996758, -0.026616450399160385, -0.008427081629633904, -0.005434438120573759, -0.01028183288872242, -0.05760788917541504, 0.012936613522469997, 0.0009125646902248263, -0.03659892454743385, -0.008691525086760521, 0.05334226042032242, 0.007652198895812035, 0.04291623830795288, -0.04222801700234413, -0.000698596762958914, -0.033783961087465286, 0.01860174722969532, -0.07216420769691467, -0.6021720170974731, -0.012552076019346714, 0.03493381291627884, -0.008479677140712738, -0.016714556142687798, 0.029049444943666458, -0.024455396458506584, 0.024860799312591553, 0.013105754740536213, -0.051113568246364594, 0.05908166244626045, -0.024431994184851646, 0.05964858829975128, 0.008319818414747715, -0.00704649044200778, 0.000464772863779217, 0.02634720504283905, -0.06098078563809395, 0.029815586283802986, -0.02787797711789608, 0.016877802088856697, 0.016016706824302673, 0.030563639476895332, -0.03024642914533615, -0.010192938148975372, -0.01699904352426529, 0.019013501703739166, -0.035137902945280075, 0.018461480736732483, -0.011407371610403061, -0.0015299832448363304, -0.023636892437934875, 0.02018435299396515, -0.04376322031021118, 0.006712895818054676, 0.016344791278243065, 0.0025821144226938486, -0.008010271936655045, -0.03521662950515747, -0.03785562142729759, -0.023711875081062317, 0.08582395315170288, -0.03570796176791191, 0.018836399540305138, -0.01839178428053856, -0.049613069742918015, 0.008657180704176426, 0.02466460131108761, 0.012462446466088295, 0.001673343824222684, 0.014187938533723354, 0.00832336861640215, 0.012520705349743366, 0.04122934490442276, -0.027875088155269623, -0.02264712192118168, 0.014546851627528667, -0.00501417089253664, -0.01908203400671482, -0.020123548805713654, 0.03023763932287693, -0.08546149730682373, 0.00846849661320448, 0.03060349076986313, -0.005363535601645708, 0.031334444880485535, 0.028986938297748566, -0.04598454758524895, -0.05377072095870972, -0.036606620997190475, 0.021541418507695198, -0.007818957790732384, 0.019856436178088188, -0.05717216804623604, 0.005306602921336889, 0.03813327103853226, 0.04211311414837837, 0.03801792487502098, 0.011381305754184723, 0.01879405416548252, -0.010677555575966835, -0.028349336236715317, -0.005175299476832151, -0.04631220921874046, -0.007991796359419823, 0.0033292733132839203, -0.052135758101940155, -0.006605557166039944, -0.011742166243493557, -0.007351215463131666, 0.025840777903795242, 0.03734639286994934, -0.01443777047097683, 0.016310440376400948, 0.025134023278951645, 0.003749625291675329, 0.03917134553194046, -0.011678081005811691, 0.008792342618107796, 0.01859613135457039, 0.06609682738780975, 0.043141525238752365, 0.057978156954050064, 0.00034715112997218966, -0.06580384075641632, -0.01785128191113472, -0.07733772695064545, 0.06305438280105591, 0.01953190565109253, 0.016989361494779587, 0.033783331513404846, 0.04904557392001152, -0.0014710150426253676, 0.025477740913629532, -0.005748958792537451, -0.051596738398075104, 0.004260113462805748, 0.006244449410587549, -0.02723805420100689, 0.052194107323884964, -0.03166820481419563, 0.04679016396403313, -0.014527959749102592, -0.028521452099084854, -0.0276094451546669, 0.019704150035977364, 0.06539218872785568, -0.013398903422057629, 0.06337147951126099, -0.04674818366765976, 0.011517121456563473, 0.032537490129470825, -0.007914797402918339, 0.03575257584452629, -0.025554688647389412, 0.014211909845471382, -0.016926676034927368, -0.014646336436271667, -0.02830587886273861, -0.04691758751869202, 0.005106305703520775, 0.05757357180118561, 0.012546978890895844, -0.0462246872484684, 0.017688527703285217, 0.020225049927830696, 0.037332598119974136, 0.0024242778308689594, -0.020724326372146606, 0.004020397551357746, -0.02864738181233406, -0.0005527944304049015, 0.014072202146053314, 0.09236735105514526, -0.0039253574796020985, -0.018110258504748344, -0.007867518812417984, 0.0358315147459507, -0.03592929244041443, 0.04625535011291504, 0.011554143391549587, 0.00416019931435585, 0.010509960353374481, -0.0398719385266304, -0.026974817737936974, 0.03424464166164398, 0.060966189950704575, 0.028264665976166725, -0.0030008703470230103, 0.03517097979784012, -0.013381293043494225, 0.0574973002076149, 0.07735711336135864, -0.0060197473503649235, 0.06470680981874466, -0.02422177977859974, 0.01078152284026146, 0.01353942509740591, -0.030239559710025787, 0.009156023152172565, 0.024638166651129723, 0.010000665672123432, 0.036941058933734894, -0.0175970196723938, -0.005193066783249378, -0.0452486127614975, -0.008922897279262543, -0.004932910669595003, 0.0012577279703691602, 0.04021931067109108, -0.04110075533390045, 0.003189362585544586, -0.016922425478696823, -0.027196288108825684, -0.029607705771923065, -0.020543724298477173, -0.01878688484430313, -0.0024296066258102655, -0.0034875802230089903, -0.017397381365299225, -0.02231588400900364, -0.012455987744033337, 0.01892612688243389, -0.014982267282903194, 0.02477690391242504, 0.024082066491246223, 0.04663296416401863, -0.0059134080074727535, -0.05583823844790459, -0.036672431975603104, 0.009708143770694733, -0.007309447042644024, -0.01841471530497074, 0.048437681049108505, -0.002201516879722476, 0.00686388136819005, 0.04642399027943611, 0.02292303554713726, -0.051623161882162094, -0.007577050477266312, 0.08564507216215134, -0.02214350365102291, -0.004707372281700373, 0.039709046483039856, 0.00041046939441002905, 0.02845596708357334, 0.010039490647614002, -0.03562028706073761, 0.05361136794090271, 0.24227194488048553, 0.008504723198711872, 0.009164276532828808, -0.022732481360435486, -0.001708017778582871, -0.009404445998370647, 0.01301612425595522, -0.007487643044441938, -0.0058731697499752045, -0.02132493443787098, 0.0025307058822363615, -0.038134776055812836, 0.006595805287361145, -0.0035828675609081984, 0.01102682575583458, -0.016723237931728363, -0.036869216710329056, -0.0035176484379917383, 0.0686432495713234, -0.043113745748996735, -0.0338565930724144, -0.06512746959924698, 0.03315168619155884, -0.0335322804749012, -0.012475397437810898, 0.01987013965845108, 0.04351913183927536, 0.004878560546785593, 0.024497443810105324, -0.0662907212972641, -0.022847650572657585, 0.04528975114226341, -0.014324836432933807, -0.035356029868125916, -0.003338199108839035, 0.033408474177122116, 0.047535885125398636, 0.004426464904099703, 0.03861038386821747, 0.02455662190914154, -0.011218090541660786, 0.04826570302248001, -0.01332262996584177, 0.02196357399225235, -0.0009385798475705087, 0.013767663389444351, -0.057151664048433304, -0.031318001449108124, 0.06003797426819801, -0.03593851998448372, 0.01162281446158886, 0.0032192650251090527, -0.01580711267888546, 0.04107508808374405, 0.02020793966948986, 0.030061734840273857, 0.04223454371094704, -0.09468171745538712, -0.023288452997803688, -0.02250843495130539, 0.009622294455766678, 0.02300860546529293, -0.041700731962919235, -0.021900417283177376, 0.038314174860715866, -0.03288258612155914, 0.0322667621076107, -0.026678914204239845, -0.01763378083705902, 0.00023100928228814155, -0.053171269595623016, 0.021134860813617706, 0.03849305957555771, -0.03992578759789467, -0.04524930194020271, -0.03854411840438843, 0.0023841606453061104, -0.05965288355946541, -0.022047579288482666, -0.031652819365262985, 0.008509238250553608, -0.006491081323474646, -0.010956858284771442, -0.028576305136084557, 0.009076463989913464, 0.021113332360982895, -0.006976043805480003, 0.01910318061709404, 0.039631202816963196, -0.04315432533621788, 0.007304104045033455, 0.006329575087875128, 0.023568911477923393, -0.0024906606413424015, 0.019807910546660423, 0.005100997630506754, -0.02968081831932068, 0.05604835972189903, -0.010023019276559353, 0.005010905675590038, 0.0008812341256998479, -0.04477877542376518, 0.019557172432541847, -0.03469470515847206, -0.020822081714868546, 0.03178078308701515, -0.018518658354878426, 0.21177814900875092, -0.017692930996418, 0.020088480785489082, 0.026162611320614815, -0.019857168197631836, -0.027144620195031166, -0.004120515193790197, -0.024068422615528107, 0.029687216505408287, -0.0043264878913760185, -0.04199621081352234, -0.057289160788059235, 0.0316443033516407, -0.024722106754779816, -0.003869539825245738, -0.004315606784075499, -0.0027292969170957804, -0.02696232870221138, -0.054654497653245926, -0.013856510631740093, -0.005058071110397577, -0.01563762128353119, -0.044135890901088715, -0.06663483381271362, -0.026579681783914566, 0.06935890763998032, -0.047039445489645004, 0.022869182750582695, 0.02848871238529682, 0.0019243393326178193, -0.02442340739071369, -0.001449297065846622, -0.036112334579229355, 0.01155080460011959, 0.018295438960194588, 0.015682362020015717, 0.0008461009128950536, -0.025950349867343903, 0.011605268344283104, -0.01115945540368557, 0.008949129842221737, 0.01715284399688244, -0.06856101006269455, 0.013518617488443851, 0.027725979685783386, -0.0005545354215428233, -0.0039035140071064234, -0.022472981363534927, -0.008072501048445702, 0.030853062868118286, -0.020799634978175163, -0.038421377539634705, -0.028125500306487083, -0.0027822842821478844, 0.00103016069624573, 0.025699865072965622, 0.06575188040733337, 0.00925673171877861, 0.014575888402760029, 0.02987634763121605, -0.04749644920229912, 0.03699981048703194, -0.0008104642620310187, -0.006269342266023159, 0.027418013662099838, -0.08257885277271271, 0.054953742772340775, 0.01732902228832245, 0.0352570004761219, -0.004446100443601608, -0.05042492225766182, -0.02991987019777298, -0.0039821225218474865, -0.02664395608007908, 0.026308614760637283, 0.0351797379553318, 0.11235533654689789, -0.02648826502263546, -0.04523378610610962, 0.020262451842427254, 0.03358561918139458, 0.020637081936001778, 0.050401318818330765, 0.026157937943935394]" ./train/magpie/n01582220_6915.JPEG,magpie,"[0.004143659491091967, 0.049068160355091095, 0.01457479689270258, -0.011238853447139263, 0.03075021132826805, 0.028907079249620438, 0.002911347197368741, -0.001657250802963972, -0.018759233877062798, 0.015981465578079224, 0.011476386338472366, 0.024626919999718666, -0.08337893337011337, -0.029162773862481117, 0.02736371010541916, -0.001985885202884674, -0.03450118377804756, -0.0059612710028886795, -0.0035692332312464714, 0.05067067593336105, 0.00825472641736269, -0.019964834675192833, 0.0054072109051048756, -0.03527330607175827, -0.012371232733130455, 0.0070979539304971695, -0.0240856371819973, -0.011363358236849308, 0.003306921571493149, -0.004131243098527193, 0.01375339925289154, -0.021049557253718376, -0.013962413184344769, 0.04764513298869133, 0.07005153596401215, -0.006188036873936653, 0.00225463486276567, -0.03157131373882294, 0.021719809621572495, 0.14119288325309753, 0.005021162796765566, 0.005619138944894075, 0.012818843126296997, 0.010052470490336418, 0.008579741232097149, -0.1857924461364746, 0.056058067828416824, -0.02460404671728611, 0.03220801427960396, -0.0033052093349397182, -0.02177617698907852, 0.031406402587890625, -0.017044996842741966, -0.04457555338740349, -0.012348645366728306, -0.0027227874379605055, -0.07716178148984909, 0.04384312778711319, 0.018046658486127853, 0.034433893859386444, 0.052710212767124176, -0.032114457339048386, 7.358119091804838e-06, 0.032663166522979736, -0.019820034503936768, 0.029503021389245987, 0.06231261044740677, 0.030213171616196632, -0.06706604361534119, -0.022561026737093925, -0.002108130371198058, -0.0035429929848760366, -0.0009973377455025911, -0.004135185852646828, 0.054717451333999634, -0.018231365829706192, 0.021239647641777992, -0.004239062312990427, -0.06326542049646378, -0.049154624342918396, 0.009103426709771156, -0.004065282642841339, -0.0205732062458992, 0.0041910638101398945, -0.008443902246654034, -0.03552912175655365, -0.0043520438484847546, 0.01600726693868637, -0.001386912539601326, 0.001318640075623989, 0.021982943639159203, -0.031613368541002274, -0.5795839428901672, -0.060252416878938675, 0.021667635068297386, 0.004090653732419014, 0.006591196171939373, -0.027077069506049156, -0.10227370262145996, -0.002271832199767232, 0.005328234750777483, -0.05295721814036369, -0.016846906393766403, 0.00678431149572134, 0.003291348461061716, -0.01591123454272747, 0.0003725560090970248, 0.015281813219189644, 0.01367385033518076, -0.0038911672309041023, 0.035032968968153, -0.03691869601607323, 0.0427958220243454, -0.04276609420776367, 0.030372891575098038, -0.0031606813427060843, 0.007531376089900732, 0.02767004817724228, 0.01808982901275158, 0.008244815282523632, 0.02320529706776142, -0.01648634858429432, -0.03713243827223778, -0.05186084285378456, -0.009592504240572453, -0.017132017761468887, -0.008280772715806961, 0.01985807903110981, -0.007750054821372032, -0.045487191528081894, 0.01239206362515688, -0.06314397603273392, -0.0003101775946561247, 0.08417466282844543, -0.03280098736286163, -0.011059656739234924, -0.028131045401096344, -0.06627954542636871, 0.015444486401975155, 0.0129261314868927, 0.00044050972792319953, -0.044341523200273514, 0.08689002692699432, -0.000718416937161237, -0.02026546746492386, 0.024766182526946068, -0.03804263472557068, -0.004973308648914099, 0.021798167377710342, -0.004708998836576939, -0.06158840283751488, -0.03740433230996132, -0.003209504531696439, 0.003101167967543006, 0.00523516396060586, 0.006608552765101194, 0.07178263366222382, 0.010395332239568233, 0.02580920420587063, -0.07724451273679733, -0.013978235423564911, -0.03582118824124336, 0.018726836889982224, -0.005921861156821251, 0.06485728174448013, -0.008807755075395107, -0.023894451558589935, 0.011706302873790264, 0.06929642707109451, 0.019569309428334236, 0.00792984664440155, 0.03451518341898918, -0.001832404755987227, 0.01270974799990654, 0.007856679148972034, -0.01213913131505251, 0.056934576481580734, 0.012339017353951931, -0.03853367269039154, -0.019067998975515366, 0.02245817892253399, -0.036991510540246964, -0.021420374512672424, 0.008875959552824497, -0.002119826851412654, -0.002312419703230262, 0.0965879037976265, -0.010585504584014416, 0.03327135369181633, 0.02722710743546486, 0.0135857705026865, -0.025777388364076614, 0.0333750918507576, 0.045499593019485474, -0.029179299250245094, -0.022749802097678185, 0.0021901223808526993, -0.054666053503751755, -0.06721930205821991, 0.048005640506744385, -0.0027186316438019276, 0.05125069245696068, 0.035620421171188354, 0.016070997342467308, 0.02568536438047886, 0.045576564967632294, -0.01654619723558426, -0.07472552359104156, -0.032438766211271286, 0.02977983094751835, -0.011705092154443264, 0.08650200814008713, -0.002855312777683139, -0.008468969725072384, -0.016066433861851692, -0.02947155386209488, -0.024128507822752, -0.015588058158755302, 0.06501485407352448, -0.024903541430830956, 0.02655388042330742, 0.03853064402937889, -0.0030853948555886745, 0.016590986400842667, 0.011890437453985214, -0.0013555362820625305, -0.03580591455101967, 0.032174766063690186, 0.021561259403824806, 0.014902154915034771, -0.02657165564596653, -0.030879460275173187, 0.016440225765109062, -0.01458519697189331, 0.0052475896663963795, 0.03595120087265968, -0.03147557005286217, 0.020567599684000015, 0.0035354855936020613, -0.016265161335468292, -0.015109466388821602, 0.016765575855970383, -0.005017516203224659, -0.05324094370007515, -0.05423632636666298, 0.11668933182954788, 0.002270533237606287, 0.04611791670322418, -0.011399420909583569, -0.019195443019270897, -0.026516681537032127, 0.027357403188943863, 0.01904813013970852, 0.019446469843387604, -0.04727322608232498, -0.027992235496640205, -0.02532039023935795, 0.016136454418301582, 0.003851503599435091, 0.06426702439785004, -0.038509879261255264, 0.022345639765262604, -0.03520655259490013, 0.11991171538829803, 0.07026220113039017, 0.00034371481160633266, 0.06231306120753288, -0.06508668512105942, 0.04109940677881241, 0.00688133342191577, 0.0245536919683218, -0.0036859079264104366, 0.024149922654032707, 0.0066624912433326244, 0.043697308748960495, -0.04469549283385277, -0.035899411886930466, -0.02413029596209526, 0.012449590489268303, 0.008389783091843128, -0.02190747857093811, 0.008257118053734303, -0.0015306358691304922, -0.022585628554224968, 0.008106373250484467, 0.06302038580179214, -0.06541463732719421, -0.013245675712823868, -0.03233780711889267, 0.00937881413847208, 0.03434356302022934, -0.012621360830962658, 0.020451735705137253, 0.027614803984761238, 0.029280707240104675, -0.0006167255924083292, 0.01721915975213051, -0.0022795898839831352, 0.013714696280658245, -0.017101814970374107, -0.04698949679732323, 0.04775714874267578, -0.006326519418507814, 0.037836622446775436, 0.010722958482801914, -0.003635002765804529, 0.03120054304599762, -0.011476260609924793, 0.05508636683225632, -0.006344572640955448, -0.0005410437588579953, 0.0445193313062191, 0.08379136770963669, -0.04784625023603439, 0.023691236972808838, 0.028742996975779533, -0.0232632365077734, 0.018536433577537537, 0.0361042283475399, 0.0029530024621635675, 0.060597725212574005, 0.11615385115146637, 0.012944389134645462, 0.05453500896692276, -0.062422994524240494, -0.009670664556324482, -0.020340703427791595, 0.009042799472808838, -0.054504506289958954, -0.02184399589896202, -0.00883864052593708, 0.0008204469340853393, -0.04251573979854584, -0.014513375237584114, 0.004512618761509657, 0.05160575732588768, 0.011851917952299118, -0.010565194301307201, 0.0012433113297447562, 0.018341148272156715, -0.019748305901885033, -0.019732914865016937, -0.0097682885825634, 0.0077183363027870655, -0.033512458205223083, 0.007624192163348198, 0.0336076021194458, -0.007660646922886372, 0.05298882722854614, -0.012781759724020958, 0.024699848145246506, 0.05220288783311844, 0.016938336193561554, 0.019643599167466164, -0.0373242050409317, 0.005312077701091766, 0.051972776651382446, -0.09598979353904724, 0.008293258026242256, 0.013343751430511475, -0.023932455107569695, -0.02657982148230076, 0.028701363131403923, 0.02223784849047661, -0.009816938079893589, -0.050606127828359604, -0.045265860855579376, -0.057744815945625305, -0.04338165000081062, 0.048975348472595215, 0.004406976979225874, 0.018942706286907196, 0.05724520608782768, 0.016104916110634804, 0.06201735883951187, 0.02952958643436432, 0.10545927286148071, -0.022616585716605186, -0.02396535314619541, -0.017198627814650536, -0.04139002412557602, -0.05633005127310753, -0.011518309824168682, -0.10053050518035889, -0.02604053169488907, 0.0009397880639880896, 0.0054123238660395145, 0.030730564147233963, -0.020752646028995514, -0.11734601110219955, -0.01648706942796707, -0.0846472680568695, 0.06321805715560913, -0.015338953584432602, 0.01647343300282955, -0.030000953003764153, -0.01616761088371277, -0.0190570168197155, -0.0884215384721756, -0.06123151257634163, -0.0049066320061683655, 0.0013794528786092997, -0.035298191010951996, -0.01833472214639187, -0.04220237582921982, -0.015264299698174, -0.008667766116559505, -0.0073442114517092705, 0.03565827012062073, 0.020418895408511162, -0.041652582585811615, 0.021062344312667847, -0.0072674984112381935, 0.017971236258745193, -0.01991529017686844, -0.004614377394318581, 0.001240498386323452, -0.028586797416210175, -0.027014661580324173, -0.015205418691039085, 0.04499354586005211, -0.029774941504001617, -0.0037079439498484135, -0.025342334061861038, -0.02820003777742386, 0.020759224891662598, -0.0032101834658533335, 0.025236045941710472, 0.1226259246468544, 0.0020220146980136633, 0.004879393614828587, -0.003962431102991104, -0.050919853150844574, -0.012277335859835148, 0.016431959345936775, -0.07598106563091278, -0.020659415051341057, 0.00022128099226392806, 0.017168840393424034, -0.0388350784778595, 0.031867314130067825, -0.02331400103867054, 0.01191009022295475, -0.020988047122955322, 0.03611333668231964, 0.030634939670562744, -0.009272606112062931, -0.015516533516347408, 0.0166485458612442, -0.009717556647956371, -0.012796605937182903, -0.05966358259320259, -0.021603122353553772, 0.01044865045696497, -0.02628624625504017, 0.005766925401985645, 0.012365695089101791, 0.002313744043931365, 0.016216594725847244, -0.04842959716916084, -0.0017835469916462898, -0.01707575097680092, -0.014141195453703403, 0.02229800447821617, 0.00520090339705348, -0.03189132362604141, 0.014184021390974522, 0.008628140203654766, -0.03750037029385567, -0.012045111507177353, -0.033798765391111374, 0.018958628177642822, -0.0006065763300284743, 0.017735261470079422, -0.012399440631270409, -0.017759907990694046, -0.009580699726939201, -0.029107630252838135, -0.026605114340782166, -0.014860779047012329, -0.029983526095747948, 0.00686071440577507, 0.03976267948746681, 0.0033037327229976654, 0.06851048767566681, 0.0115872323513031, 0.02299812249839306, -0.021076783537864685, -0.021003108471632004, -0.026726212352514267, 0.005678002722561359, -0.010457344353199005, 0.02840505912899971, -0.0451875701546669, 0.03498206287622452, 0.06664972007274628, 0.004933478310704231, -0.0008509003091603518, -0.07724155485630035, 0.01327351201325655, -0.039094213396310806, -0.005534225143492222, 0.010626907460391521, -0.002819716464728117, 0.031513627618551254, -0.046013955026865005, -0.062490154057741165, -0.007400722708553076, 7.467919203918427e-05, -0.010164565406739712, 0.024696340784430504, -0.03855942189693451]" ./train/jean/n03594734_42955.JPEG,jean,"[-0.009250803850591183, 0.012322312220931053, 0.02808552421629429, 0.05902959033846855, 0.000236805179156363, 0.016972830519080162, -0.06358473747968674, 0.01959928311407566, 0.012879122979938984, -0.020618172362446785, 0.039544478058815, -0.013559355400502682, -0.004450248554348946, 0.0066564129665493965, -0.019406842067837715, 0.008249912410974503, 0.03352469205856323, 0.00783276092261076, 0.004279797896742821, -0.058034706860780716, -0.0023238479625433683, 0.015972832217812538, 0.04728401079773903, 0.0007459920016117394, 0.054776210337877274, 0.027463076636195183, -0.00033179996535182, -0.00999362301081419, -0.04692128673195839, -0.033154744654893875, 0.03861751779913902, 0.014732747338712215, -0.020029574632644653, -0.0397295281291008, 0.003313852474093437, 0.035192687064409256, 0.034947969019412994, 0.05463278293609619, 0.004939456935971975, 0.0884433388710022, -0.025316303595900536, -0.021343722939491272, -0.00443622563034296, -0.010279453359544277, 0.01890520565211773, 0.029648730531334877, 0.042756352573633194, -0.025339186191558838, -0.005122830625623465, 0.005722492001950741, 0.02730323001742363, 0.012556749396026134, 0.01585051231086254, -0.00044027541298419237, 0.010338140651583672, 0.05342378467321396, 0.01932423748075962, 0.04872087389230728, -0.0503542423248291, 0.003177863312885165, 0.03528203070163727, 0.04559268802404404, 0.003669929690659046, 0.02168172225356102, -0.01855250634253025, -0.009707729332149029, -0.010127518326044083, 0.011435340158641338, 0.002900907536968589, 0.037099599838256836, 0.007495556026697159, 0.023352570831775665, 0.015085137449204922, 0.0007247452740557492, 0.010711953975260258, 0.014913385733962059, 0.02057541161775589, 0.008210137486457825, 0.020718025043606758, 0.06594257801771164, -0.010777311399579048, -0.014126508496701717, 0.02321736142039299, -0.03437319025397301, 0.03246500343084335, 0.02042238786816597, -0.032857540994882584, 0.0011381570948287845, -0.02593720518052578, 0.023078272119164467, 0.02907896414399147, -0.02611195482313633, -0.6710094213485718, 0.07594990730285645, 0.0335288867354393, 0.019464850425720215, 0.02164452336728573, -0.0011839051730930805, -0.03576503321528435, 0.08085495233535767, -0.0005088116158731282, -0.057477694004774094, -0.04341501742601395, -0.027414284646511078, -0.03470764309167862, 0.01277427189052105, -0.004088974092155695, -0.00739296805113554, -0.04540560394525528, 0.04345197603106499, 0.016030365601181984, -0.0013486008392646909, 0.020697014406323433, -0.031564850360155106, -0.014166298322379589, -0.006084361579269171, 0.00563681498169899, -0.034898385405540466, -0.005243981722742319, 0.010533281601965427, -0.012735564261674881, -0.0634777620434761, -0.0338299423456192, -0.04211946949362755, -0.018051285296678543, 0.006610114127397537, -0.004034935496747494, -0.06855188310146332, 0.009186885319650173, 0.015276600606739521, 0.0044186413288116455, 0.06683209538459778, -0.004149787127971649, 0.09300220012664795, -0.035629626363515854, 0.034540001302957535, 0.0024009747430682182, -0.01976882666349411, 0.0035262068267911673, 0.025070156902074814, -0.006088922265917063, 0.008677905425429344, -0.01631687767803669, 0.019537312909960747, -0.001983505906537175, 0.005082234274595976, -0.000993979163467884, 0.08240504562854767, -0.021119626238942146, -0.012021937407553196, 0.021243324503302574, -0.05781254544854164, 0.13348394632339478, -0.029164426028728485, -0.024603161960840225, 0.0072661349549889565, 0.006144283339381218, 0.06872962415218353, -0.01617470569908619, -0.015974445268511772, 0.015185133554041386, -0.04275774955749512, -0.0052709635347127914, -0.050331950187683105, -0.003957974258810282, 0.017119377851486206, -0.03443940356373787, -0.008888037875294685, 0.026665261015295982, 0.0079936059191823, -0.039144184440374374, -0.03208094835281372, 0.011229869909584522, -0.034017372876405716, 0.02032984048128128, -0.013037120923399925, 0.0975218340754509, -0.014820028096437454, 0.03994664177298546, 0.019710760563611984, -0.014451451599597931, -0.030619444325566292, 0.013754768297076225, -0.018753085285425186, -0.02778182551264763, 0.031901028007268906, 0.04806138947606087, 0.005936720874160528, 0.01619800552725792, 0.00620461069047451, 0.03211366385221481, 0.0281694196164608, -0.01704261638224125, 0.02651543915271759, -0.03204226866364479, -0.043978020548820496, 0.019733048975467682, -0.009967472404241562, -0.023531263694167137, -0.004858158994466066, -0.002712259301915765, 0.020804764702916145, 0.004494397900998592, 0.067225880920887, 0.001987377181649208, -0.03114987351000309, 0.008251573890447617, 0.026795659214258194, -0.044480834156274796, 0.015311102382838726, -0.020868714898824692, 0.050753578543663025, 0.0006563772330991924, 0.049232494086027145, -0.04124262556433678, 0.004418450407683849, -0.01777629740536213, 0.008661714382469654, -0.015230730175971985, 0.030031638219952583, -0.009307309053838253, 0.029294373467564583, -0.022470945492386818, -0.029186801984906197, 0.005961475893855095, -0.05370142310857773, 0.017357250675559044, -0.021147530525922775, 0.012754862196743488, 0.0066425614058971405, 0.02195614203810692, -0.009074554778635502, -0.04489981383085251, 0.04115290567278862, -0.0013640583492815495, -0.07444220036268234, -0.00883606355637312, 0.009413975290954113, -0.005124643445014954, 0.026715846732258797, 0.01744442619383335, 0.007413033861666918, -0.032652318477630615, -0.02554798126220703, 0.0003874099929817021, -0.06750645488500595, 0.016459723934531212, 0.03183800354599953, -0.005817078985273838, 0.005294490605592728, 0.030391324311494827, -0.023660363629460335, -0.019225379452109337, 0.01950709894299507, 0.021407967433333397, -0.011007456108927727, -0.01622665859758854, 0.009636290371418, -0.07088295370340347, 0.005804048851132393, 0.03042440488934517, -0.00011163221643073484, 0.03540128469467163, 0.10661344230175018, 0.02699308656156063, 0.006974473129957914, 0.00975125003606081, 0.02097119204699993, 0.02386264130473137, 0.022881299257278442, 0.006954931654036045, -0.012821418233215809, 0.01938825100660324, -0.019428232684731483, -0.008736073970794678, -0.0026451728772372007, 0.0050881169736385345, 0.011129633523523808, 0.016952278092503548, -0.01626388542354107, -0.018901949748396873, -0.0028063824865967035, -0.10760054737329483, -0.026457590982317924, -0.023331016302108765, -0.020209498703479767, 0.08091450482606888, 0.04239701107144356, 0.009016483090817928, -8.822129530017264e-06, 0.028406580910086632, -0.0008531513740308583, -0.022961720824241638, 0.010512830689549446, 0.016485122963786125, -0.031702179461717606, -0.08732893317937851, -0.012450150214135647, 0.006614765152335167, 0.01970357447862625, 0.0022850900422781706, -0.009359003975987434, -0.015410173684358597, -0.018098419532179832, -0.01086166687309742, -0.020652392879128456, -0.018736111000180244, -0.005495141260325909, 0.025753283873200417, 0.006370019633322954, -0.010565871372818947, -0.004140132572501898, 0.09300120174884796, 0.04824464023113251, 0.005831289105117321, 0.031238161027431488, 0.06513447314500809, 0.020221101120114326, -0.019702879711985588, 0.0086594233289361, -0.037666790187358856, 0.16599395871162415, -0.014936745166778564, 0.002909093163907528, -0.025998195633292198, -0.034388285130262375, 0.026970122009515762, 0.011245465837419033, -0.02020813152194023, 0.021295737475156784, -0.014058580622076988, 0.00900267530232668, 0.04483219236135483, 0.004495789296925068, -0.004212616942822933, 0.006187107879668474, 0.05912170559167862, 0.0024884771555662155, -0.002575341612100601, -0.000666618172544986, -0.02485045976936817, -0.009737911634147167, 0.017022589221596718, 0.024977456778287888, 0.0012263433309271932, -0.009119956754148006, -0.004788726568222046, 0.025131596252322197, 0.014296373352408409, -0.02105609141290188, 0.0882173404097557, 0.008802216500043869, 0.008603649213910103, 0.013786215335130692, 0.014916681684553623, -0.05220433697104454, -0.03344753384590149, 0.0807005763053894, -0.002660841913893819, -0.035743825137615204, 0.10405983030796051, 0.001695261220447719, -0.02255472168326378, -0.008949985727667809, 0.07277025282382965, 0.011412173509597778, -0.02818618342280388, 0.0021167874801903963, 0.00015423998411279172, 0.0015751906903460622, 0.0551476813852787, 0.034893665462732315, 0.005997140426188707, 0.00419655442237854, 0.0011125397868454456, -0.013648518361151218, 0.10840362310409546, -0.008385304361581802, -0.004754204303026199, 0.03609840199351311, 0.019851980730891228, 0.0003585583181120455, 0.02489081583917141, -0.04845976456999779, -0.01994137465953827, 0.019239669665694237, 0.05189340189099312, -0.022383904084563255, -0.04196125268936157, -0.03463062271475792, 0.0495946891605854, -0.016662972047924995, 0.0176981333643198, 0.0015696301124989986, -0.02778850495815277, -0.027847249060869217, -0.026062235236167908, 0.0030490958597511053, 0.040390852838754654, -0.009633942507207394, -0.014426371082663536, 0.0407639741897583, 0.07324813306331635, 0.0257757306098938, -0.02985106036067009, 0.005054202396422625, -0.003956955391913652, -0.0063992878422141075, 0.02649587206542492, -0.014454741962254047, -0.03084515780210495, -0.02391740493476391, 0.012923024594783783, -0.013894502073526382, -0.02781366929411888, -0.012089484371244907, 0.0031628443393856287, 0.04006722569465637, -0.06870902329683304, -0.03779842332005501, 0.010300770401954651, -0.05473863333463669, 0.012862448580563068, 0.0314016118645668, 0.03778437525033951, 0.008624257519841194, -0.05498100817203522, -0.002358386991545558, -0.062120456248521805, 0.07304611057043076, 0.02299979329109192, 0.021271666511893272, 0.012458143755793571, -0.003193598473444581, 0.00576023617759347, -0.004017241299152374, -0.0007747133495286107, 0.003485211404040456, 0.03488025814294815, -0.0038815645966678858, -0.015336093492805958, -0.0048915003426373005, 0.011277551762759686, 0.0021961817983537912, -0.014253146015107632, -0.006455938331782818, -0.027345888316631317, 0.016945568844676018, -0.0033816485665738583, -0.07249298691749573, -0.03719721734523773, 0.03917410969734192, 0.05740126222372055, -0.06705238670110703, -0.012046699412167072, -0.009371628984808922, -0.005113016813993454, -0.03074638545513153, -0.01532105915248394, 0.012975155375897884, 0.010523570701479912, -0.012312267906963825, -0.024165989831089973, -0.008778279647231102, -0.0018493181560188532, -0.014636178500950336, -0.007346898317337036, 0.0051817623898386955, 0.006863399408757687, 0.027738971635699272, 0.014428178779780865, 0.015736864879727364, 0.02993049845099449, -0.006569392047822475, 0.017704594880342484, -0.044990044087171555, -0.019098686054348946, -0.003101193346083164, 0.0006872275262139738, -0.05461610108613968, 0.007526044733822346, 0.012102875858545303, 0.043844472616910934, -0.0012323800474405289, -0.02584674023091793, 0.02879941463470459, -0.024603860452771187, -0.049868594855070114, -0.013202890753746033, -0.04302944242954254, -0.004900199361145496, -0.026200640946626663, 0.015155604109168053, -0.0552833192050457, -0.06955073028802872, 0.03164966031908989, 0.006622417829930782, 0.004079601261764765, 0.026619190350174904, -0.019994724541902542, 0.025235746055841446, -0.006844880059361458, 0.02119741216301918, 0.008792771026492119, 0.06498711556196213, 0.0043671391904354095, -0.06662975251674652, -0.01936175860464573, 0.017290113493800163, 0.05422491952776909, -0.04774321988224983, 0.02406579628586769]" ./train/jean/n03594734_54417.JPEG,jean,"[0.03459589183330536, 0.0032141038682311773, 0.006180970463901758, 0.016795562580227852, 0.012557215057313442, 0.053737640380859375, -0.014674331992864609, -0.04599811136722565, 0.011172055266797543, -0.0005053899949416518, -0.015667814761400223, -0.039289217442274094, 0.008570482954382896, -0.013188575394451618, 0.033998772501945496, 0.030950849875807762, -0.03669792041182518, 0.03206120803952217, 0.007431856356561184, 0.008337318897247314, -0.03359003737568855, 0.023825496435165405, -0.022496389225125313, -0.032001543790102005, -0.006282797548919916, 0.028273427858948708, -0.022146031260490417, 0.015182078815996647, -0.05252915993332863, -0.005385795142501593, -0.013098791241645813, 0.021913282573223114, 0.0021178140304982662, 0.006941625382751226, 0.03456928953528404, 0.0236516110599041, 0.02816499024629593, 0.06346326321363449, 0.0007243360741995275, -0.07229486107826233, -0.029686065390706062, 0.012539074756205082, 0.008300866931676865, -0.039008527994155884, -0.010875648818910122, 0.20271797478199005, 0.01736346259713173, 0.044261254370212555, 0.04939506575465202, 0.0049839625135064125, -0.0024767431896179914, 0.03534650802612305, 0.0019974347669631243, 0.0070791388861835, -0.018091296777129173, 0.04631287604570389, -0.004508038982748985, -0.06701119989156723, 0.03616439178586006, 0.0022297282703220844, 0.005244649015367031, -0.04131923243403435, 0.04230549558997154, 0.03183107450604439, 0.002778921741992235, -0.02164888009428978, -0.018048042431473732, 0.14194564521312714, 0.004581120330840349, 0.014774833805859089, 0.0012510607484728098, 0.00550356088206172, 0.04068301245570183, 0.03501880168914795, 0.00851159542798996, 0.013152322731912136, -0.0017520836554467678, 0.00047245059977285564, 0.023139262571930885, 0.0214094091206789, 0.03765416145324707, 0.024909794330596924, 0.008325701579451561, -0.0397317111492157, 0.0031591164879500866, -0.0037046626675873995, 0.004694529343396425, -0.03633830323815346, 0.024978462606668472, -0.009107854217290878, 0.023207271471619606, -0.046726539731025696, -0.5446058511734009, -0.026935577392578125, 0.027194814756512642, 0.029402248561382294, -0.04107488691806793, 0.03621392697095871, 0.062069423496723175, 0.054985493421554565, -0.005969509482383728, 0.04276454076170921, 0.015932923182845116, 0.03239933028817177, 0.03512411564588547, 0.031290456652641296, -0.0671006590127945, 0.003534757997840643, -0.010950017720460892, -0.013986633159220219, 0.04960855469107628, -0.10234292596578598, -0.02228485234081745, -0.008464100770652294, -0.03442180156707764, 0.03145448490977287, 0.026040421798825264, -0.019052330404520035, 0.016116909682750702, 0.05096961930394173, -0.004086403641849756, 0.053580671548843384, -0.033767540007829666, -0.08693771809339523, 0.020033737644553185, -0.027888374403119087, 0.02287941426038742, 0.009863501414656639, -0.04338567331433296, 0.00497572822496295, 0.04455951228737831, 0.030322764068841934, -0.0031173424795269966, 0.0834893211722374, -0.009331121109426022, 0.0017177138943225145, -0.005869515240192413, -0.021907774731516838, -0.0212319977581501, 0.02991059049963951, -0.024473674595355988, -0.022095805034041405, -0.04945271834731102, -0.00098015449475497, -0.002763633383437991, -0.043764565140008926, -0.07324594259262085, -0.030673861503601074, -0.010249470360577106, -0.038011498749256134, -0.047621604055166245, 0.013686602003872395, -0.005522285588085651, 0.009834879077970982, 0.05313534662127495, -0.015121576376259327, -0.001049891347065568, 0.009680378250777721, -0.016963057219982147, -0.00973921362310648, -0.06159442290663719, 0.00927054975181818, 0.0013980543008074164, -0.021469080820679665, 0.022984489798545837, 0.0008773072040639818, 0.0006212428561411798, -0.0032948998268693686, 0.03182607889175415, 0.051744285970926285, 0.013199808076024055, 0.024311484768986702, -0.0014730532420799136, -0.0955318883061409, -0.0728529542684555, -0.07726041972637177, 0.016432706266641617, 0.00018580566393211484, -0.05015026405453682, -0.007865587249398232, 0.021685540676116943, 0.0017120350385084748, 0.04990267753601074, 0.027872230857610703, -0.03188345208764076, 0.03758653625845909, 0.032291240990161896, -0.009306011721491814, -0.024576988071203232, 0.043738409876823425, -0.043814949691295624, -0.010423011146485806, 0.04514000937342644, -9.460085129830986e-05, 0.0051521118730306625, -0.006015520542860031, -0.017973901703953743, -0.06333457678556442, 0.026716338470578194, -0.008723403327167034, 0.0014049314195290208, 0.0142266396433115, 0.03024635650217533, 0.011856594122946262, 0.06225377693772316, -0.010854107327759266, -0.031827256083488464, -0.006133079528808594, -0.016209274530410767, 0.019004732370376587, -0.06698735803365707, -0.007671052124351263, -0.0022695441730320454, 0.0272910688072443, 0.017041541635990143, -0.028431903570890427, -0.04160701110959053, -0.049872711300849915, -0.06509216874837875, 0.033436667174100876, -0.08631464838981628, -0.019031979143619537, -0.019101716578006744, -0.04706285893917084, 0.017031608149409294, -0.019190512597560883, 0.006831638980656862, 0.021281670778989792, 0.0009450857760384679, 0.038489893078804016, -0.005144525319337845, -0.01629500836133957, -0.021174468100070953, 0.014604905620217323, -0.008622893132269382, -0.053777702152729034, 0.008330917917191982, -0.03933343663811684, -0.04378556087613106, -0.029419414699077606, 0.01430830080062151, 0.05855146795511246, -0.0825839713215828, 0.011077872477471828, 0.0012652920559048653, 0.05714802071452141, 0.012189019471406937, 0.01886526308953762, 0.046005379408597946, 0.014625323005020618, -0.02057652734220028, -0.0074534001760184765, 0.013886867091059685, 0.036532141268253326, 0.026653733104467392, -0.004653465934097767, 0.013161329552531242, 0.007388136349618435, 0.13076601922512054, 0.0008026235154829919, 0.06316705048084259, 0.012826402671635151, 0.007612420711666346, 0.014680149033665657, 0.012937101535499096, 0.0035363028291612864, -0.030543968081474304, 0.03947383910417557, 0.0257368516176939, -0.03819912299513817, -0.010655208490788937, 0.01924959011375904, 0.053211942315101624, -0.010407771915197372, 0.0068090553395450115, -0.04437786340713501, -0.010187662206590176, -0.030269606038928032, -0.03142671659588814, -0.01152266189455986, 0.009298916906118393, -0.016266224905848503, -0.10761386156082153, 0.0031812957022339106, -0.0251407902687788, -0.02256517857313156, 0.11981162428855896, -0.002743573160842061, -0.016204535961151123, -0.03325445577502251, -0.03769983351230621, -0.015706446021795273, 0.009241522289812565, -0.027009282261133194, 0.008881502784788609, -0.03197631984949112, 0.024747323244810104, 0.01595715805888176, -0.0015021058497950435, -0.01997288130223751, 0.03302893787622452, 0.0049940431490540504, 0.009748000651597977, -0.04327692463994026, 0.0055805379524827, 0.005336563102900982, 0.009782589972019196, 0.014434872195124626, 0.009973612613976002, -0.01610538549721241, -0.0021507416386157274, 0.0052222153171896935, 0.0832914188504219, 0.05056695267558098, -0.006331141572445631, -0.005727216135710478, -0.027205223217606544, 0.05863098427653313, -0.003908692859113216, 0.1640438735485077, -0.001473629497922957, 0.018390314653515816, 0.0014244362246245146, -0.016951078549027443, -0.009230625815689564, -0.035518988966941833, -0.020480753853917122, 0.0187605582177639, 0.004457724280655384, -0.04450586810708046, -0.002680458128452301, -0.04141499102115631, -0.015927428379654884, -0.0049190763384103775, 0.017757058143615723, -0.0006599496118724346, 0.003346922341734171, -0.0032970644533634186, 0.0019964799284934998, 0.03532659262418747, -0.0040093339048326015, 0.00972142443060875, -0.01685583032667637, 0.050697050988674164, 0.02757805958390236, -0.01749335788190365, 0.0184802059084177, 0.024975335225462914, 0.03142508864402771, 0.007356136571615934, 0.03292921185493469, 0.0442730113863945, 0.03676542267203331, 0.005031588952988386, 0.0036385213024914265, -0.02613212540745735, -0.039729245007038116, 0.09519609063863754, -0.016121558845043182, 0.0002457669179420918, -0.03406459838151932, 0.012232727371156216, 0.020625898614525795, 0.15110856294631958, -0.05866692215204239, -0.0004588295123539865, 0.015700191259384155, -0.07525159418582916, -0.019168870523571968, 0.031511832028627396, -0.010744336061179638, 0.007066797930747271, 0.007447861600667238, 0.003474270459264517, 0.04702205955982208, 0.03739708662033081, 0.12229405343532562, 0.022168893367052078, -0.019215408712625504, 0.018069088459014893, -0.013569723814725876, 0.006820587906986475, 0.004168996587395668, 0.02258678898215294, -0.020855693146586418, -0.04356931895017624, -0.02644035592675209, -0.038919270038604736, 0.006969272159039974, 0.19725386798381805, -0.037039127200841904, -0.010785884223878384, -0.0031222247052937746, 0.008579881861805916, -0.015181123279035091, -0.02044624462723732, -0.0004942267551086843, 0.0022393923718482256, 0.019755858927965164, 0.07967483252286911, 0.0028198750223964453, 0.009613770991563797, 0.0058938683941960335, -0.00949653796851635, -0.021583590656518936, -0.02931235171854496, -0.026010505855083466, -0.02203526720404625, -0.016391851007938385, 0.0388658381998539, 0.020899873226881027, -0.0029924712143838406, -0.003165804548189044, 0.02898329682648182, 0.04462392255663872, -0.01524279173463583, -0.02869768626987934, -0.029567016288638115, -0.03620070964097977, -0.023992428556084633, -0.0531577430665493, -0.05928860604763031, 0.025680916383862495, 0.017761029303073883, -0.012686114758253098, 0.004734857939183712, 0.0008687840308994055, 0.026378577575087547, 0.14743220806121826, 0.03499620407819748, -0.012974719516932964, 0.012524024583399296, 0.018312601372599602, 0.003224920714274049, 2.6190376956947148e-05, 0.006832062266767025, -0.056229934096336365, 0.014183643274009228, -0.004362177103757858, -0.024065272882580757, 0.007708615157753229, 0.03584616258740425, 0.015877284109592438, 0.021963592618703842, 0.024648934602737427, -0.03052307479083538, 0.004869939759373665, -0.007517841644585133, 0.03962166607379913, 0.005827122367918491, -0.024849476292729378, 0.006111276801675558, -0.008767015300691128, -0.09715936332941055, -0.01940944232046604, -0.05307433009147644, 0.0063306717202067375, -0.030432047322392464, -0.03980459272861481, 0.012579516507685184, -0.028940603137016296, -0.013048706576228142, -0.020731117576360703, -0.004077371675521135, 0.014802445657551289, 0.004488598555326462, -0.0037544481456279755, -0.005062522366642952, -0.0156880971044302, -0.020615242421627045, 0.0038397852331399918, 0.012636179104447365, -0.01200867909938097, -0.04274279251694679, -0.07254946231842041, -0.058661866933107376, -0.008112113922834396, 0.002341554267331958, -0.023578044027090073, -0.03991503268480301, -0.013521555811166763, -0.055928606539964676, 0.023580854758620262, 0.003941800910979509, -0.01783289760351181, -0.012533309869468212, -0.026433425024151802, -0.01367372926324606, 0.002684390638023615, 0.019574064761400223, -0.012904263101518154, 0.0008979302947409451, 0.027897406369447708, -0.04784446954727173, -0.009806102141737938, -0.006041964050382376, 0.03805265575647354, 0.012121662497520447, 0.016065320000052452, -0.014076193794608116, 0.039394304156303406, -0.03246364742517471, 0.004435465671122074, 0.029172096401453018, 0.0967276319861412, -0.02633434534072876, -0.007028376217931509, 0.04668568819761276, -0.006609960924834013, 0.08231144398450851, -0.0113457590341568, -0.0030177393928170204]" ./train/jean/n03594734_43949.JPEG,jean,"[0.005384139716625214, 0.0005604744073934853, 0.022056719288229942, 0.06237775459885597, -0.038242608308792114, 0.005809865891933441, -0.026240212842822075, 0.031151004135608673, 0.007179402746260166, -0.0007662788848392665, 0.01909918338060379, -0.013565662316977978, 0.06211262196302414, 0.020527640357613564, -0.02475900575518608, 0.021965745836496353, 0.10374125093221664, 0.03582170605659485, 0.05424589663743973, -0.0672532320022583, -0.0009857326513156295, 0.03518732264637947, 0.04211939871311188, -0.07276798039674759, 0.020452100783586502, 0.05072780326008797, 0.024569952860474586, -0.018149420619010925, -0.0053034014999866486, 0.0066693793050944805, -0.002251958940178156, 0.00999748520553112, -0.011442800983786583, 0.004263828042894602, 0.03096815198659897, -0.00931953452527523, 0.0015312375035136938, 0.0017194561660289764, 0.0038824700750410557, 0.12940391898155212, -0.033945731818675995, -0.03168250992894173, -0.054048266261816025, -0.0022929012775421143, 0.03371043503284454, 0.029803909361362457, 0.02978457510471344, 0.005156164523214102, -0.031438201665878296, -0.014660300686955452, 0.04286710172891617, -0.0352005697786808, 0.008851385675370693, 0.013342738151550293, -0.023580651730298996, 0.014965442009270191, -0.012352421879768372, -0.011498453095555305, 0.0246619563549757, 0.009073416702449322, 0.020464587956666946, 0.017391882836818695, -0.021582311019301414, 0.031053995713591576, -0.028420530259609222, 0.05636594071984291, -0.027045607566833496, 0.06712901592254639, -0.0016294840024784207, 0.006294324062764645, -0.005855259485542774, 0.03683089092373848, 0.04295725002884865, -0.022120630368590355, 0.006923481356352568, -0.015387719497084618, 0.027756785973906517, -0.011205237358808517, 0.03239726275205612, -0.01412511058151722, -0.010186513885855675, -0.01706114038825035, -0.04357405751943588, -0.043447818607091904, 0.04778825864195824, -0.004192998167127371, -0.02812165580689907, -0.04288320988416672, 0.03184880316257477, 0.016118502244353294, 0.02389906346797943, -0.0010222942801192403, -0.6615744829177856, 0.0569414384663105, 0.02263159491121769, 0.01251891441643238, 0.06018565967679024, 0.050626739859580994, -0.012159050442278385, 0.030867548659443855, 0.025964532047510147, 0.012184870429337025, -0.04533068835735321, -0.017446883022785187, 0.04655039682984352, 0.037000834941864014, -0.1072111576795578, 0.016235431656241417, -0.014300559647381306, -0.005849103908985853, 0.00043584598461166024, -0.016154387965798378, -0.0027922724839299917, 0.020331205800175667, 0.006579156033694744, 0.020701924338936806, -0.04526183009147644, -0.06848910450935364, 0.005972986575216055, -0.016448261216282845, 0.01661643758416176, -0.060009557753801346, -0.016530277207493782, 0.029776638373732567, 0.012124447152018547, 0.03263159468770027, -0.02694384753704071, -0.022014226764440536, 0.010276083834469318, -0.0009291486931033432, 0.00993164163082838, -0.012621361762285233, -0.01416591927409172, 0.09337867051362991, -0.01986558735370636, 0.04614280164241791, -0.005667227320373058, -0.04991242662072182, -0.017750384286046028, -0.004633708391338587, 0.015657519921660423, 0.03578433394432068, -0.028291640803217888, 0.028930578380823135, 0.030757922679185867, 0.004448737483471632, -0.018266817554831505, -0.05305107310414314, 0.02810770273208618, -0.011931180953979492, 0.0012419973500072956, 0.0012246125843375921, 0.11790047585964203, -0.07520259916782379, 0.003066716715693474, -0.023969855159521103, -0.017030766233801842, -0.01310472097247839, 0.06454721838235855, 0.0404517762362957, -0.041727304458618164, -0.019251132383942604, -0.005081434268504381, -0.021903015673160553, -0.0005601728917099535, -0.024795804172754288, 0.0020201695151627064, 0.0543246865272522, 0.004246066324412823, 0.07026828825473785, -0.025800084695219994, 0.013233919627964497, 0.0079727778211236, -0.038971830159425735, 0.008598873391747475, 0.00951386708766222, 0.07391981035470963, -0.008582329377532005, 0.04517684131860733, 0.022529717534780502, 0.014717478305101395, -0.0422992929816246, -0.002114958595484495, -0.0052534532733261585, -0.019982201978564262, 0.05645573511719704, 0.052617672830820084, 0.025674957782030106, 0.004972062073647976, 0.014123954810202122, 0.015811223536729813, 0.04506023973226547, -0.057287994772195816, 0.004406712483614683, 0.02104494534432888, -0.04317955672740936, 0.00941938254982233, -0.011516074649989605, -0.029513206332921982, -0.0039044853765517473, -0.03559877723455429, -0.017078621312975883, -0.004030666314065456, 0.034475114196538925, -0.0010250096675008535, -0.031777385622262955, -0.0483175590634346, 0.01669239066541195, -0.00437482725828886, 0.018565770238637924, -0.018443487584590912, 0.004331185482442379, -0.024525217711925507, 0.046115629374980927, 0.008653342723846436, -0.025888187810778618, -0.002527416218072176, 0.017252644523978233, -0.03763648495078087, 0.0020263579208403826, -0.01448435802012682, 0.04766456410288811, -0.02248239703476429, -0.007751923520117998, -0.02779366821050644, 0.022188015282154083, -0.016366994008421898, -0.0225919671356678, -0.0010577865177765489, 0.007360944524407387, 0.033169958740472794, -0.0007093599997460842, -0.005063877906650305, -0.00033513683592900634, 0.030829312279820442, -0.044992826879024506, -0.01983966864645481, -0.03409121185541153, 0.016804080456495285, 0.030460920184850693, 0.01350368745625019, -0.01345987431704998, -0.047899097204208374, 0.002590837422758341, -0.02592698484659195, -0.0065269251354038715, -0.009843763895332813, 0.002846682444214821, 0.006940868217498064, 0.061788175255060196, -0.0036597480066120625, 7.697127148276195e-05, 0.02624177187681198, -0.01486967597156763, -0.01468909066170454, 0.0181385800242424, -0.05800292640924454, 0.0170739833265543, -0.08068300783634186, 0.017955824732780457, 0.025138327851891518, 0.006172216963022947, 0.011103142984211445, 0.046000681817531586, 0.0005230528186075389, -0.03587639331817627, -0.013842337764799595, 0.02985551208257675, 0.050530292093753815, -0.0031532554421573877, -0.048905305564403534, 0.003795928554609418, -0.02647441253066063, 0.023203661665320396, -0.020566830411553383, -0.017628949135541916, -0.03225160017609596, -0.019465962424874306, -0.0073747336864471436, 0.003224398009479046, 0.0180524792522192, -0.004913595970720053, -0.061499711126089096, 0.032183051109313965, -0.02251584827899933, -0.02392585761845112, 0.025477368384599686, -0.010473175905644894, -0.04622241482138634, -0.020704984664916992, 0.025312844663858414, 0.04385675489902496, 0.013261568732559681, 0.005821171682327986, -0.012005381286144257, 0.021961327642202377, -0.05058588087558746, -0.02800692617893219, 0.02602178230881691, 0.031637731939554214, 0.014106901362538338, -0.021899588406085968, -0.013979211449623108, -0.00014139620179776102, -0.020550791174173355, -0.036704275757074356, -0.040734756737947464, 0.06786929070949554, -3.5031771403737366e-05, 0.0014991175848990679, -0.02661909908056259, -0.004136039409786463, 0.09333793818950653, 0.058270037174224854, 0.0009215320460498333, 0.06700722128152847, 0.040821611881256104, 0.019536051899194717, 0.0005030740867368877, -0.01565174013376236, -0.02144562639296055, 0.1243678480386734, -0.040882401168346405, -0.06700685620307922, 0.0036216871812939644, 0.0018005403690040112, -0.0419311486184597, -0.044969864189624786, 0.0021600769832730293, 0.022847997024655342, -0.005325599107891321, -0.01872384175658226, 0.02374892123043537, -0.005036687478423119, 0.040285561233758926, 0.002034772653132677, -0.005614066496491432, 0.03883497044444084, 0.0072397212497889996, 0.01950354315340519, -0.009558177553117275, 0.005514331627637148, -0.0077634043991565704, 0.017574632540345192, 0.015329551883041859, -0.015979627147316933, -0.016596214845776558, 0.030369708314538002, 0.01243579387664795, -0.004618503153324127, 0.05006147548556328, -0.02062637358903885, 0.013121734373271465, -0.008106544613838196, -0.030576882883906364, 0.001794134033843875, 0.003994893282651901, 0.12221208214759827, 0.018938355147838593, -0.011304750107228756, 0.06168820336461067, 0.01782580465078354, -0.02019832469522953, -0.04085727035999298, 0.10297434777021408, -0.025482436642050743, -0.01719677448272705, 0.010819296352565289, -0.007228091359138489, 0.03117542900145054, 0.012119846418499947, 0.010580262169241905, 0.002873095218092203, -0.00030363028054125607, 0.02654382400214672, 0.021921515464782715, 0.10174944996833801, -0.006912982556968927, 0.0213803481310606, -0.004097628872841597, 0.028946226462721825, -0.028976574540138245, 0.04537723585963249, -0.05816352367401123, 0.016617845743894577, 0.003764163935557008, 0.009027495980262756, -0.027577634900808334, -0.02800239622592926, -0.08120272308588028, -0.0869230404496193, 0.019206231459975243, 0.027154630050063133, 0.01610264554619789, 0.012726647779345512, 0.007955209352076054, 0.02089179866015911, -0.015790754929184914, 0.05280483886599541, -0.003785663517192006, -0.018874866887927055, 0.051814716309309006, 0.09466832876205444, 0.023023074492812157, 0.01252170279622078, -0.029514573514461517, -0.0006779135437682271, -0.0009592006681486964, -0.04725360870361328, 0.005291900131851435, -0.0030482651200145483, 0.010386253707110882, 0.02903035841882229, -0.03271719068288803, -0.005158631131052971, -0.009163021109998226, 0.0024484796449542046, -0.013943965546786785, -0.007411076221615076, -0.018395643681287766, 0.013857358135282993, -0.009290352463722229, 0.02658921293914318, 0.08501224219799042, 0.003693240461871028, -0.014312801882624626, -0.034091517329216, -0.004812336526811123, 0.047523632645606995, -0.013608270324766636, 0.024852175265550613, 0.04774204641580582, 0.05499592423439026, 0.0007217992097139359, -0.003447467228397727, 0.027630232274532318, -0.026661653071641922, 0.023339778184890747, 0.021280305460095406, 0.005077281966805458, 0.0042786370031535625, -0.02063821256160736, 0.00228450377471745, -0.04209037497639656, -0.006756443064659834, 0.0039950180798769, -0.002047046786174178, 0.015371897257864475, -0.020065180957317352, -0.05600827559828758, -0.06856034696102142, 0.006945015862584114, 0.013411104679107666, -0.010323276743292809, -0.004458795301616192, -0.005137507803738117, 0.038633160293102264, -0.0010921313660219312, -0.03205404430627823, -0.039518631994724274, -0.040164701640605927, -0.02080790139734745, -0.015061317943036556, -0.057714346796274185, 0.04966989532113075, -0.04483197256922722, -0.030303364619612694, 0.009804361499845982, -0.0019579711370170116, 0.009092450141906738, 0.03805893659591675, 0.029196206480264664, 0.024797571823000908, -0.005079813301563263, 0.008887635543942451, -0.03536214679479599, 0.027068957686424255, -0.005047260317951441, -0.028057970106601715, -0.020371830090880394, 0.004110309761017561, -0.02954355627298355, 0.04610816761851311, -0.01058388501405716, -0.005839231889694929, 0.024042120203375816, 0.00047185385483317077, 0.026374148204922676, -0.04614023491740227, -0.020000506192445755, 0.0006193991866894066, 0.0065586864948272705, 0.022866718471050262, -0.06819094717502594, -0.03679394721984863, 0.0019869720563292503, 0.0052899811416864395, 0.04659387841820717, 0.01276194117963314, 0.00586628308519721, -0.07486347109079361, 0.010069104842841625, -0.025012647733092308, 0.02191348746418953, 0.02635444886982441, 0.026750760152935982, -0.013848259113729, -0.008952016942203045, 0.008897703140974045, 0.055879250168800354, -0.011386322788894176, 0.07375964522361755]" ./train/jean/n03594734_6277.JPEG,jean,"[-0.019220562651753426, 0.024717286229133606, -0.00964001938700676, 0.004655081778764725, -0.03944068029522896, 0.020604457706212997, -0.016848653554916382, -0.10451135039329529, 0.03295749053359032, 0.014575486071407795, 0.030898336321115494, 0.007368828170001507, 0.048814818263053894, 0.0009533989941701293, 0.015426497906446457, -0.009953558444976807, 0.1353660523891449, 0.006987568456679583, -0.016271263360977173, -0.03795282542705536, -0.03770376741886139, 0.017830828204751015, 0.03055090270936489, -0.024212468415498734, 0.017855476588010788, 0.01824437826871872, 0.0160063449293375, 0.028832923620939255, 0.024514544755220413, 0.0184274110943079, 0.0252299252897501, -0.01893637515604496, -0.009914465248584747, 0.021763775497674942, 0.002950162161141634, -0.00020202041196171194, 0.02680116333067417, 0.044018909335136414, -0.025730160996317863, 0.06459260731935501, -0.01871855929493904, -0.03859420493245125, -0.01912391185760498, 0.0028938131872564554, 0.01424546167254448, -0.007689789403229952, -0.01318434439599514, 0.010062889195978642, -0.029552631080150604, 0.013688463717699051, 0.022827455773949623, -0.012859731912612915, -0.005667535588145256, -0.0076690781861543655, 0.0017879616934806108, -0.008233116939663887, 0.0037649041041731834, 0.027697009965777397, 0.006451333407312632, 0.007259667385369539, 0.11828700453042984, 0.018801618367433548, 0.02172704227268696, 0.025718167424201965, -0.008514097891747952, -0.0021197872702032328, 0.032929517328739166, -0.03567000851035118, 0.0167947206646204, 0.03246842697262764, 0.016888704150915146, 0.006789127830415964, 0.0013910665875300765, 0.05695226788520813, 0.010263185948133469, 0.006951471325010061, 0.04595690220594406, -0.025429895147681236, 0.010987791232764721, 0.03145138546824455, -0.03781910240650177, -0.03949544206261635, -0.006587303709238768, -0.011193476617336273, 0.028706738725304604, -0.005860654637217522, -0.04091551899909973, -0.03774452954530716, -0.01078587956726551, 0.03900722786784172, 0.014817156828939915, -0.007477976847440004, -0.5872605443000793, 0.03809521347284317, 0.013411627151072025, 0.01687702350318432, 0.030685823410749435, 0.07169965654611588, 0.03280147910118103, 0.13099709153175354, 0.012834648601710796, 0.0033102466259151697, -0.015106730163097382, -0.06314551085233688, -0.001217295415699482, 0.027098188176751137, -0.02360248938202858, -0.04568914324045181, 0.03019309788942337, -0.010346414521336555, 0.034231677651405334, 0.0035997808445245028, 0.020469751209020615, 0.003153885481879115, -0.003081665374338627, 0.02859344333410263, 0.027896055951714516, -0.013904630206525326, -0.04786119982600212, -0.02975734882056713, 0.030897926539182663, 0.010100330226123333, -0.014897143468260765, 0.005819079000502825, -0.02939792349934578, 0.04728415608406067, -0.02271779626607895, -0.004572713281959295, -0.0034583904780447483, 0.011710583232343197, 0.024782521650195122, 0.015696506947278976, -0.04243237525224686, 0.06962229311466217, -0.0005591714871115983, 0.00631692074239254, 0.0404815748333931, 0.02774268388748169, -0.019514165818691254, -0.014587796293199062, -0.011232131160795689, 0.01616116799414158, -0.01381518505513668, 0.04325317591428757, -0.006382044404745102, 0.017391186207532883, -0.017687281593680382, 0.002802269533276558, 0.010276632383465767, 0.022847235202789307, 0.033914774656295776, 0.014022033661603928, 0.11969195306301117, -0.03311491757631302, -0.0007927822880446911, 0.01279495470225811, 0.0006803838768973947, 0.007869113236665726, -0.022016506642103195, 0.03564392402768135, -0.010039379820227623, 0.020246433094143867, 0.01551510114222765, -0.04874655604362488, -0.01595032587647438, 0.009512252174317837, 0.00847038347274065, -0.006587126757949591, 0.011934078298509121, 0.055849749594926834, -0.012872722931206226, 0.047935135662555695, -0.007562956772744656, -0.009320535697042942, 0.028777698054909706, -0.001313761342316866, 0.12311787903308868, 0.0008019625092856586, -0.007167843170464039, 0.004701992496848106, 0.037042781710624695, -0.006031556986272335, 0.04252643138170242, -0.009194836020469666, -0.015227999538183212, 0.02532324194908142, 0.008993738330900669, -0.012888782657682896, -0.029983164742588997, 0.033666349947452545, -0.012752179056406021, 0.03268706798553467, -0.020671598613262177, -0.004962096456438303, 0.02721305936574936, -0.031202904880046844, 0.025769660249352455, 0.010240850038826466, -0.03201622515916824, 0.033948712050914764, -0.006034079473465681, -0.05129820853471756, -0.002356745069846511, 0.026031261309981346, 0.011275838129222393, -0.04000046104192734, -0.03301789611577988, 0.04714873060584068, -0.02632272243499756, -0.030702557414770126, -0.022722478955984116, -0.011336381547152996, -0.0176283810287714, 0.032472845166921616, -0.05197647586464882, 0.042164839804172516, -0.04024888947606087, 0.034055136144161224, 0.004300463479012251, -0.0016908871475607157, -0.02443619817495346, -0.06463035196065903, 0.011008324101567268, 0.002626235829666257, -0.011908077634871006, 0.02618805505335331, 0.007536816410720348, -0.058947280049324036, 0.022519076243042946, 0.018315818160772324, 0.03084770031273365, 0.0009801771957427263, -0.031769879162311554, 0.04106759652495384, 0.013127066195011139, -0.019020408391952515, 0.006915432866662741, -0.012016555294394493, -0.015508247539401054, -0.002010883530601859, 0.03150847926735878, 0.04730885848402977, -0.04441562294960022, 0.011927017942070961, -0.01262728963047266, 0.009012287482619286, 0.003709478536620736, 0.018248457461595535, 0.01222369633615017, 0.03257349878549576, 0.03686701878905296, -0.023738853633403778, -0.018032630905508995, 0.0028671494219452143, 0.014035376720130444, -0.03197898343205452, -0.0074718971736729145, 0.0076950909569859505, -0.014539324678480625, -0.028468772768974304, 0.01969394087791443, -0.0067177205346524715, 0.028482496738433838, -0.022724032402038574, 0.011057371273636818, -0.015216791070997715, 0.0033461584243923426, 0.011118861846625805, 0.055488333106040955, 0.026654580608010292, -0.049606405198574066, 0.014691900461912155, 0.03077523782849312, -0.002111291280016303, 0.02671409770846367, -0.018076514825224876, -0.01713571324944496, 0.013636788353323936, 0.004687362350523472, -0.008293543010950089, -0.008239141665399075, 0.008391952142119408, -0.11053653806447983, 0.00821757037192583, 0.027985259890556335, 0.0105227530002594, 0.21451270580291748, 0.004472055472433567, -0.0031930075492709875, -0.037774380296468735, 0.06980036944150925, 0.02042275480926037, -0.010000590234994888, -0.005386334843933582, 0.027151288464665413, 0.00167977181263268, -0.050434477627277374, 0.010295437648892403, 0.016949614509940147, 0.06172306463122368, -0.06822887808084488, 0.03359087184071541, 0.07123701274394989, -0.02790948562324047, 0.044726695865392685, -0.08324050158262253, 0.0017690809909254313, 0.02146044373512268, -0.020773563534021378, 0.02895171195268631, 0.04888792708516121, 0.007255125790834427, 0.06942562013864517, 0.0668303370475769, 0.027126960456371307, -0.01947391964495182, 0.014345969073474407, 0.041971027851104736, -0.016345856711268425, -0.022462967783212662, -0.039064303040504456, 0.2475004643201828, -0.004485790152102709, -0.015227972529828548, 0.02852904424071312, -0.002100548706948757, 0.00020236104319337755, 0.007100760005414486, 0.041262734681367874, -0.03243725746870041, -0.008274526335299015, 0.005620541982352734, 0.026933282613754272, -0.023716552183032036, 0.004668996669352055, 0.03873163089156151, 0.026823285967111588, -0.03459496796131134, -0.020634550601243973, -0.0015979859745129943, -0.016096707433462143, 0.047767266631126404, -0.005342497956007719, 0.046623483300209045, 0.0018613362917676568, -0.02396085485816002, -0.01995968632400036, 0.04890032485127449, 0.03983806073665619, 0.006515451241284609, 0.06555034220218658, 0.024164624512195587, -0.02224133163690567, 0.05272936448454857, 0.05309682711958885, -0.029609760269522667, -0.019367367029190063, 0.06621803343296051, -0.03907525911927223, -0.046136077493429184, 0.11123617738485336, -0.02360530197620392, 0.010012620128691196, 0.024246864020824432, 0.04181671515107155, -0.006171969696879387, 0.03215267136693001, -0.012245132587850094, -0.004610806703567505, -0.01970800571143627, 0.019259966909885406, 0.015410300344228745, -0.002709123305976391, 0.018126105889678, -0.008747117593884468, -0.002409889129921794, 0.08520599454641342, -0.03296826034784317, 0.04998194798827171, 0.004518924746662378, 0.04226663336157799, -0.03796974569559097, -0.029596073552966118, -0.01665731891989708, -0.02728482149541378, 0.004041016101837158, -0.004766629543155432, -0.02448316663503647, 0.015136949717998505, 0.01809203065931797, -0.06180231273174286, 0.045258328318595886, 0.02173740789294243, 0.018516112118959427, -0.026405759155750275, 0.028628677129745483, 0.011324663646519184, -0.015854401513934135, 0.050848718732595444, 0.011586296372115612, 0.0006051996606402099, 0.05193395912647247, 0.10317157953977585, 0.026360606774687767, -0.004637964069843292, -0.026936179026961327, -0.01605471968650818, -0.009202574379742146, -0.040126197040081024, 0.05772516131401062, -0.0034030494280159473, -0.017990970984101295, 0.019783614203333855, -0.015232520177960396, -0.045580796897411346, 0.012415642850100994, 0.024541379883885384, -0.020288608968257904, -0.02315640263259411, -0.0384565144777298, -0.0032805639784783125, 0.03277123346924782, -0.024691252037882805, 0.10032518953084946, 0.05558503791689873, 0.007953306660056114, 0.009788799099624157, -0.006227351725101471, -0.06471212208271027, 0.0032078351359814405, 0.03363851457834244, 0.022024912759661674, 0.022594530135393143, 0.013232424855232239, -0.014677433297038078, 0.0027669048868119717, 0.0016072129365056753, 0.027720170095562935, 0.036309290677309036, 0.05654482915997505, 0.0007359957089647651, 0.033562205731868744, 0.034600939601659775, 0.030612997710704803, 0.040247172117233276, -0.07962816953659058, -0.04596684128046036, 0.000842834182549268, 0.009921013377606869, -0.008033419027924538, -0.06151759251952171, 0.03058401495218277, 0.04940849170088768, -0.059317782521247864, 0.003929860424250364, -0.021498678252100945, -0.020534781739115715, 0.002784173237159848, -0.009048149921000004, 0.028428329154849052, 0.019595419988036156, -0.009011122398078442, 0.009923432022333145, -0.0028429918456822634, -0.0019513237057253718, -0.008391874842345715, 0.024614127352833748, -0.009447097778320312, -0.007351917214691639, -0.004359281621873379, -0.020089032128453255, 0.018201246857643127, 0.014467447996139526, 0.015853049233555794, 0.013488966040313244, -0.03158680722117424, 0.015499369241297245, -0.02963239885866642, -0.013839310966432095, -0.04137803986668587, -0.00847906619310379, -0.0066124266013503075, 0.004134650807827711, -0.03132520243525505, 0.0035241662990301847, 0.03293558210134506, -0.010813433676958084, 0.014223854057490826, 0.0105642881244421, -0.032251302152872086, 0.008709067478775978, -0.015025151893496513, -0.06997100263834, -0.02516862377524376, -0.008502586744725704, 0.0048204949125647545, -0.02292061783373356, -0.002096828306093812, 0.030922600999474525, 0.018194027245044708, 0.0351748988032341, -0.009993432089686394, -0.02920580469071865, 0.010986695066094398, 0.06650547683238983, -0.004544876981526613, -0.030922571197152138, -0.0013224165886640549, 0.00807326938956976, 0.12624263763427734, -0.023779142647981644, 0.04821734130382538]" ./train/jean/n03594734_24159.JPEG,jean,"[0.010868342593312263, 0.01871558465063572, 0.015267259441316128, 0.00272343005053699, -0.02959972620010376, -0.0017163503216579556, -0.008350824937224388, -0.011647334322333336, 0.020928258076310158, 0.007770449388772249, 0.04013310372829437, -0.014042616821825504, 0.028422480449080467, 0.029466573148965836, -0.016471385955810547, 0.004357824567705393, 0.08719909191131592, 0.017259838059544563, -0.010290474630892277, -0.026883672922849655, 0.03157258778810501, -0.010694600641727448, -0.01268729567527771, -0.04910366237163544, 0.021032636985182762, 0.006732075475156307, -0.009415331296622753, 0.0008495888905599713, 0.013686704449355602, -0.014371559955179691, 0.022396400570869446, 0.00980012770742178, 0.00017182821466121823, 0.007060657255351543, 0.023716194555163383, -0.028178934007883072, 0.01288866251707077, 0.01793324202299118, -0.0030787114519625902, 0.07420177757740021, -0.01750495657324791, 0.024094700813293457, 0.003413897706195712, 0.018218912184238434, 0.007197806145995855, 0.1213216707110405, 0.01280094776302576, 0.014567801728844643, -0.0005421494133770466, 0.0055866120383143425, 0.010666726157069206, -0.01515259314328432, -0.017494451254606247, 0.011945405974984169, -0.00439161853864789, 0.05255189538002014, 0.03708264231681824, 0.015820488333702087, -0.03998780623078346, 0.0013210491742938757, 0.08421408385038376, 0.003575538285076618, -0.009407196193933487, 0.004960955586284399, 0.013518601655960083, -0.023760594427585602, -0.010996448807418346, 0.016188615933060646, 0.027926642447710037, -0.027858247980475426, 0.000787261058576405, 0.013317822478711605, 0.004875349812209606, 0.03435768932104111, 0.005267905071377754, -0.02220437116920948, 0.016966067254543304, 0.012456213124096394, 0.007024367805570364, 0.022384800016880035, 0.0011392130982130766, -0.025405291467905045, 0.014561324380338192, -0.018106132745742798, 0.00967492163181305, 0.002705432241782546, 0.0008471233304589987, -0.01659703627228737, -0.01568746007978916, 0.021686742082238197, 0.00038939897785894573, -0.004618926905095577, -0.7639380097389221, -0.024647675454616547, 0.027523627504706383, -0.008660959079861641, 0.006111662834882736, -0.00607893755659461, 0.007374943234026432, 0.06469294428825378, -0.03154006600379944, -0.009099547751247883, 0.006676800083369017, -0.005902510602027178, 0.027209576219320297, -0.003562249941751361, 0.09140241891145706, 0.003358538495376706, -0.008776514790952206, -0.0016709910705685616, -0.018972238525748253, 0.006485875230282545, 0.028845753520727158, -0.009442867711186409, -0.01622120477259159, -0.011569288559257984, 0.01562747359275818, -0.015371222980320454, -0.01264389418065548, 0.006072022020816803, 0.005169479176402092, -0.06331054121255875, -0.010039971210062504, 0.007055893074721098, -0.016123071312904358, 0.007496166508644819, -0.013866749592125416, -0.017101025208830833, 0.013604297302663326, 0.01574227772653103, 0.02092806063592434, 0.01802709698677063, -0.007922901771962643, 0.08894050121307373, -0.040386270731687546, 0.04544719308614731, 0.0032036779448390007, -0.05820021778345108, -0.0159183070063591, 0.009200194850564003, 0.004000743851065636, -0.03309172764420509, -0.03909476101398468, 0.015829024836421013, 0.005558428354561329, 0.034216735512018204, -0.013028446584939957, 0.03107239119708538, 0.020436599850654602, -0.0026254260446876287, -0.006470716092735529, 0.009453373961150646, 0.07240094989538193, 0.0002201739844167605, -0.0029879703652113676, -0.005797912832349539, -0.02823631651699543, 0.020904995501041412, -0.03328000009059906, 0.015249750576913357, -0.01362928468734026, -0.0016856432193890214, 0.023717209696769714, -0.015712479129433632, -0.006051153410226107, 0.01413506455719471, 0.0004359828308224678, 0.035025835037231445, -0.0033736680634319782, 0.012009384110569954, -0.002370619447901845, 0.022404469549655914, 0.004071645438671112, -0.02483181841671467, -0.03222833201289177, 0.0035404886584728956, 0.08780614286661148, -0.003176321741193533, 0.03596007451415062, -0.012744909152388573, 0.04377879202365875, -0.041786327958106995, -0.0014840394724160433, 0.0015147392405197024, 0.0015000882558524609, 0.005061745177954435, 0.0038688783533871174, -0.016849661245942116, 0.02422954887151718, 0.00686579430475831, 0.03553925082087517, -0.005958838388323784, 0.017621228471398354, -0.011553882621228695, 0.01613522134721279, -0.015083016827702522, -0.022866565734148026, -0.004807886201888323, -0.027176223695278168, 0.0015859251143410802, -0.0409817136824131, -0.013062168844044209, 0.006091452203691006, -0.01466295588761568, 0.009522873908281326, -0.017435690388083458, 0.028875263407826424, 0.004558397922664881, 0.009758303873240948, 0.0020483783446252346, -0.04082322120666504, 0.035205550491809845, -0.01777915470302105, 0.06260503828525543, 0.01892426796257496, 0.03442135825753212, -0.0018131054239347577, 0.007363584358245134, 0.006307654548436403, 0.015351244248449802, 0.051595620810985565, -0.013729618862271309, -0.008825983852148056, -0.01991596445441246, 0.00714698014780879, -0.028359171003103256, 0.001245418912731111, -0.022650321945548058, 0.004726665560156107, 0.009695875458419323, -0.016555901616811752, 0.0015685149701312184, -0.037534985691308975, 0.019997460767626762, -0.006704316008836031, -0.035014744848012924, -0.015340570360422134, -0.00011540477134985849, -0.0005098450346849859, 0.02213825099170208, 0.02614813670516014, 0.005879752337932587, -0.0002542873262427747, -0.02549964189529419, -0.030413983389735222, -0.004567896015942097, -0.005886301398277283, -0.002087595872581005, 0.017106354236602783, 0.0207537729293108, 0.0015220920322462916, 0.026577984914183617, 0.026506837457418442, 0.020676620304584503, 0.0401502326130867, -0.030947955325245857, 0.004994206130504608, 0.0031370162032544613, -0.07933328300714493, -0.036438457667827606, -0.0375361405313015, -0.022771082818508148, 0.004102634731680155, 0.01114965695887804, -0.014382959343492985, -0.005725170020014048, 0.01525035034865141, 0.0014515265356749296, 0.02281067706644535, -0.01807583123445511, 0.0030519787687808275, 0.023966006934642792, 0.06253843754529953, 0.01207582838833332, 0.005564916413277388, -0.010069643147289753, -0.0037019243463873863, 0.012311927042901516, 0.0115048848092556, -0.00622541131451726, -0.008816537447273731, -0.0027425852604210377, -0.06723066419363022, 0.011771626770496368, -0.0026510292664170265, -0.034728989005088806, 0.04331095516681671, 0.004099217709153891, 0.026456331834197044, -0.015204207971692085, -0.012207104824483395, -0.012070753611624241, -0.014346460811793804, 0.012770870700478554, 0.020685967057943344, -0.022480109706521034, -0.08007344603538513, 0.004036588594317436, 0.011739742010831833, 0.0071062492206692696, 0.0005367494304664433, 0.007368107326328754, 0.04185080900788307, 0.017230382189154625, 0.026837456971406937, -0.09860993176698685, -0.023661989718675613, 0.022158486768603325, 0.005866704508662224, -0.00484071671962738, 0.00416551623493433, -0.04833798110485077, 0.0887923538684845, 0.023646816611289978, 0.030620679259300232, 0.03344551846385002, 0.00878579169511795, 0.07380201667547226, -0.03126786649227142, -0.019893676042556763, -0.005469853989779949, 0.06605920940637589, -0.0019603611435741186, -0.03793487697839737, 0.00029685540357604623, -0.01548851653933525, -0.013468083925545216, -0.011376217007637024, 0.0010709791677072644, 0.06614667922258377, -0.01818809099495411, -0.04926100745797157, 0.02446851134300232, -0.02445623278617859, -0.012430072762072086, -0.009148446843028069, 0.017357030883431435, -0.001050127437338233, 0.016065021976828575, 0.031192200258374214, -0.0009642568766139448, 0.0046470738016068935, -0.028483331203460693, -0.002115720184519887, -0.008412417955696583, 0.016067782416939735, 0.010786283761262894, 0.013090417720377445, 0.003907197155058384, 0.03754624351859093, 0.113937608897686, -0.014570602215826511, 0.021731305867433548, 0.0006398663390427828, 0.007378232665359974, 0.04283857345581055, -0.023228315636515617, 0.0886043831706047, -0.015354327857494354, -0.03211348503828049, 0.017232442274689674, 0.03362059220671654, 0.006462659686803818, 0.0497271865606308, -0.009605631232261658, -0.011126326397061348, 0.005213373340666294, -0.0376213937997818, 0.04052598774433136, 0.015562045387923717, 0.014452207833528519, 0.0255288053303957, -0.0031214456539601088, -0.028407054021954536, 0.0063614691607654095, -0.002809548983350396, 0.12673139572143555, 0.00516201788559556, 0.014306953176856041, 0.03241701051592827, 0.00013892495189793408, -0.059991270303726196, 0.0017610453069210052, -0.014414777047932148, -0.01880739815533161, 0.032501086592674255, 0.016718124970793724, -0.04072917625308037, -0.01526353508234024, 0.07946452498435974, -0.09105455130338669, 0.014210582710802555, -0.008781438693404198, 0.009967678226530552, 0.0017750983824953437, 0.027430670335888863, 0.02494630217552185, -0.004508334677666426, 0.012958134524524212, 0.020723383873701096, -0.034394681453704834, 0.027635809034109116, 0.11128158867359161, 0.014781841076910496, 0.004380596335977316, -0.012552709318697453, 0.02794710546731949, 0.00030563524342142045, -0.02310936152935028, -0.021422188729047775, 0.01403516624122858, -0.0059362114407122135, 0.003347183344885707, -0.03529899939894676, -0.007907044142484665, -0.014981643296778202, 0.034471143037080765, 0.03254339471459389, -0.031541742384433746, -0.01569822058081627, -0.02160981111228466, 0.03310171887278557, 0.02097012847661972, 0.02324056066572666, 0.003062369767576456, 0.015913264825940132, -0.018963754177093506, -0.018031982704997063, 0.08732450008392334, 0.03629397600889206, 0.010525837540626526, 0.023663047701120377, 0.09664236754179001, -0.0032574650831520557, -0.01802641525864601, 0.009284269995987415, 0.011096249334514141, 0.0034467040095478296, 0.013928066939115524, 0.03315480425953865, 0.014352712780237198, 0.058761946856975555, 0.00024970664526335895, 0.002609426621347666, 0.00316821807064116, 0.01335460226982832, 0.01673448458313942, 0.014348478987812996, -0.01285166572779417, 0.012046203017234802, 0.008883580565452576, -0.018490422517061234, 0.006382599472999573, 0.011946534737944603, 0.003109591780230403, 0.02116517350077629, 0.015453262254595757, 0.020256374031305313, 0.010325247421860695, 0.05577011778950691, 0.03243977949023247, -0.0023574531078338623, -0.03562603518366814, -0.014914223924279213, -0.003418134758248925, 0.012583767995238304, -0.030413703992962837, -0.023627761751413345, -0.001861330820247531, 0.0018395426450297236, 0.02334056794643402, -0.011196721345186234, 0.00188669771887362, -0.024107370525598526, -0.018740570172667503, -0.004339372739195824, 0.025059737265110016, -0.002090656431391835, -0.004964321851730347, -0.0003604160447139293, -0.006474816706031561, -0.012503557838499546, -0.038704607635736465, 0.0007573782349936664, -0.022380487993359566, -0.0056401463225483894, -0.005248475354164839, 0.005364641547203064, 0.0019959399942308664, -0.030642857775092125, 0.01317458227276802, -0.019580041989684105, -0.006059072911739349, -0.04015515744686127, -0.015303167514503002, -0.009661735966801643, -0.036195576190948486, -0.0197795070707798, 0.0028483399655669928, 0.008663494139909744, -0.025569453835487366, 0.01871437020599842, -0.018295489251613617, 0.00894463062286377, 0.06953819841146469, -0.032800380140542984, 0.01412203162908554, 0.0027800516691058874, -0.006681911181658506, 0.08049354702234268, -0.00985292624682188, -0.004441693425178528]" ./train/jean/n03594734_9714.JPEG,jean,"[-0.009134986437857151, 0.03921075165271759, 0.03525053709745407, 0.005668971687555313, 0.004338265862315893, -0.007020590361207724, -0.006882478483021259, 0.00826993864029646, -0.02702222764492035, -7.319793803617358e-05, 0.027612369507551193, -0.043377142399549484, -0.005647329613566399, 0.02943223901093006, 0.008730181492865086, -0.031236615031957626, -0.0038105829153209925, -0.0020977724343538284, 0.02372226119041443, -0.035238467156887054, -0.019032292068004608, 0.002009755000472069, 0.03298744186758995, -0.02449977584183216, 0.044280752539634705, 0.06340591609477997, -0.030266549438238144, 0.007656428962945938, -0.02297338843345642, -0.03145899996161461, 0.03663483262062073, -0.004038655199110508, -0.013484368100762367, -0.020061541348695755, -0.0031431971583515406, -0.015710314735770226, 0.025240587070584297, -0.017313743010163307, 0.004223180003464222, 0.06317298859357834, -0.001721603563055396, -0.009013012051582336, -0.03522621467709541, 0.01099491212517023, 0.017953231930732727, -0.19098080694675446, 0.04515455663204193, -0.021905753761529922, -0.02946009300649166, 0.005790542811155319, -0.033924490213394165, 0.03631838038563728, 0.01962747983634472, -0.030832653865218163, -0.00984378531575203, 0.09717129170894623, 0.010976841673254967, 0.023800961673259735, 0.015308079309761524, -0.025630123913288116, -0.00414964510127902, 0.03999336063861847, 0.004493105690926313, 0.021173084154725075, -0.05342509225010872, 0.010545355267822742, 0.008923297747969627, 0.06602015346288681, 0.0008176873088814318, 0.004392106086015701, 0.0012511826353147626, -0.008654589764773846, -0.009675932116806507, 0.01744900830090046, 0.01591167412698269, 0.026464072987437248, -0.011998791247606277, -0.0019430785905569792, -0.04288056865334511, -0.05420731008052826, 0.04483475536108017, 0.02149069309234619, 0.007373455446213484, -0.0006483050528913736, 0.023892777040600777, 0.037891414016485214, 0.001074326690286398, -0.002122160280123353, -0.04086875915527344, 0.03034229762852192, -0.03582342714071274, -0.05777578055858612, -0.6815584897994995, -0.016151314601302147, 0.02000478282570839, -0.022141676396131516, 0.0005382458330132067, 0.008813442662358284, -0.028146330267190933, -0.11525730043649673, 0.01829095371067524, 0.0018124360358342528, -0.028932688757777214, 0.03422011807560921, -0.005491182208061218, -0.008005072362720966, -0.05791718512773514, 0.00983075238764286, -0.041940443217754364, 0.02496781386435032, 0.0199875608086586, -0.07693207263946533, 0.026701129972934723, -0.0022282665595412254, 0.0028324744198471308, -0.0807836651802063, -0.0006485566846095026, -0.014536295086145401, -0.007779812440276146, -0.011368236504495144, -0.033848587423563004, -0.02347453311085701, -0.03072330914437771, -0.004591208882629871, -0.009114472195506096, -0.024388901889324188, -0.014770044945180416, -0.07138483226299286, -0.005270202178508043, -0.007910387590527534, 0.02499324642121792, -0.013775639235973358, -0.05662645772099495, 0.08828816562891006, -0.03524087369441986, 0.06187058240175247, 0.018482299521565437, -0.023458164185285568, -0.04007181152701378, 0.02189471945166588, 0.030437147244811058, -0.04467025771737099, -0.10418196767568588, 0.05272582545876503, -0.0115615613758564, -0.003537080017849803, -0.029020879417657852, 0.01736525446176529, -0.039151523262262344, 0.030020616948604584, 0.018738113343715668, 0.0038631160277873278, 0.04620044678449631, 0.04157232493162155, -0.021129630506038666, 0.005571785848587751, 0.01703484356403351, 0.03651144355535507, 0.022999994456768036, 0.0014224954647943377, -0.047710370272397995, -0.020186204463243484, -0.030201172456145287, -0.02840675413608551, -7.028193795122206e-05, -0.031281616538763046, 0.014064407907426357, 0.014165901578962803, 0.015973739326000214, 0.03484554588794708, -0.017340674996376038, 0.00945278536528349, 0.0013896364253014326, -0.03895837068557739, 0.030235346406698227, 0.001071087084710598, 0.031116290017962456, 0.012241117656230927, -0.05991921201348305, 0.006136161740869284, 0.062254901975393295, -0.040148600935935974, 0.03411733731627464, -0.0030865913722664118, -0.03572378307580948, 0.030109262093901634, 0.054210346192121506, -0.001956242835149169, 0.012930992059409618, 0.021738778799772263, -0.01185770332813263, 0.018246417865157127, -0.0025679320096969604, 0.03727991506457329, -0.018419526517391205, -0.0026864639949053526, -0.00023560300178360194, -0.04448077082633972, 0.014484611339867115, -0.012333636172115803, 0.015314070507884026, 0.012672007083892822, 0.04107977822422981, 0.023486198857426643, -0.0025732070207595825, -0.009289265610277653, -0.026443589478731155, -0.009039937518537045, -0.014272228814661503, 0.06020252779126167, -0.04648016020655632, 0.05913932994008064, 0.03378477692604065, 0.03531147539615631, -0.0298371110111475, 0.031588006764650345, 0.03114841692149639, 0.025739703327417374, -0.022020522505044937, 0.004241655580699444, -0.005883777514100075, 0.006850637495517731, 0.03956533223390579, -0.03615007922053337, 0.028641002252697945, -0.00915677659213543, -0.004897489212453365, -0.008970282040536404, 0.027606457471847534, 0.019021164625883102, -0.014271214604377747, -0.0025018099695444107, -0.0025370747316628695, 0.02891353704035282, 0.03184778615832329, -0.054494552314281464, 0.00703973276540637, -0.0018195179291069508, -0.0013524135574698448, -0.01605871319770813, -0.010690443217754364, -0.006321703549474478, 0.00025302357971668243, 0.010669533163309097, -0.005720817018300295, -0.030380940064787865, 0.017643939703702927, 0.03124893456697464, -0.04115087538957596, 0.016169551759958267, 0.01488671824336052, -0.03187672793865204, -0.028312450274825096, 0.02257269248366356, -0.007268051151186228, 0.0039118025451898575, 0.0008765596430748701, 0.03577185422182083, 0.09032538533210754, 0.032028794288635254, 0.033614691346883774, -0.02342253178358078, -0.032685860991477966, 0.16131892800331116, 0.027222977951169014, 0.01229785941541195, 0.06225330010056496, 0.018353162333369255, -0.0064041162841022015, 0.014845852740108967, -0.01158040203154087, 0.007227471098303795, 0.017464829608798027, -0.013246101327240467, 0.006218647118657827, -0.006819550879299641, -0.01810901239514351, -0.016070857644081116, -0.009356222115457058, -0.014548050239682198, -0.002338175429031253, -0.018365461379289627, -0.004330592229962349, -0.012384534813463688, 0.02354647032916546, 0.011375919915735722, -0.06758984923362732, -0.04282854497432709, -0.012751513160765171, -0.036202434450387955, 0.01239161379635334, 0.033942777663469315, -0.005236759781837463, 0.002985222963616252, -0.027589427307248116, -0.02840951271355152, -0.05083780735731125, 0.012596262618899345, 0.0339023619890213, 0.01578592136502266, -0.030163981020450592, -0.029872460290789604, -0.02330530807375908, 0.02697637304663658, 0.01566319540143013, 0.0037260507233440876, -0.01108736451715231, 0.0008349972194992006, 0.0102468840777874, -0.018769053742289543, -0.003811574773862958, 0.010980631224811077, 0.08825698494911194, 0.049533821642398834, 0.010931000113487244, -0.01281284261494875, 0.018764391541481018, 0.007504700217396021, -0.05709916353225708, -0.041953183710575104, 0.010077445767819881, 0.11821822822093964, 0.010469887405633926, -0.03931468725204468, 0.03113873116672039, 0.011113542132079601, -0.028421778231859207, 0.02464619278907776, 0.024308286607265472, 0.01797175221145153, -0.0018878846894949675, -0.01786341331899166, 0.02060910500586033, -0.052696119993925095, 0.00010760295845102519, -0.020242873579263687, 0.026039617136120796, 0.016332533210515976, 0.0055786925368011, 0.011831507086753845, -0.019681353121995926, 0.027193713933229446, -0.00329328840598464, 0.004220827016979456, 0.013650858774781227, -0.019330305978655815, -0.04490595683455467, 0.06596356630325317, 0.03031895123422146, -0.008325425907969475, 0.02819824032485485, -0.002212454564869404, -0.01467340998351574, -0.0025643205735832453, 0.02893681265413761, 0.019633812829852104, 0.01647321879863739, -0.0007566751446574926, 0.024082105606794357, -0.019382894039154053, 0.05317577347159386, 0.018499869853258133, 0.02431194856762886, 0.01592899113893509, 0.04615677148103714, 0.026344092562794685, 0.01036833692342043, -0.03355267643928528, 0.011110627092421055, 0.024166161194443703, 0.05081744119524956, 0.022555502131581306, 0.0047439164482057095, 0.01886674016714096, 0.029901843518018723, 0.01791541278362274, 0.08138392865657806, 0.017302468419075012, -0.04082951694726944, 0.02138066478073597, 0.0018625942757353187, -0.009378012269735336, 0.044444695115089417, -0.04272082820534706, -0.02273079752922058, -0.0018511434318497777, 0.002674124436452985, 0.0071490113623440266, -0.047150883823633194, -0.03718484938144684, -0.03904811292886734, -0.055396951735019684, 0.0024965358898043633, -0.005041155498474836, -0.04202193021774292, -0.019267398864030838, 0.0058262040838599205, -0.011700008995831013, 0.01033943984657526, -0.00457634637132287, -0.018177097663283348, 0.034324899315834045, 0.02771979197859764, -0.010401569306850433, -0.03813622519373894, -0.0316198505461216, -0.002732423134148121, -0.0017364907544106245, -0.02195267379283905, 0.007176192943006754, 0.05001905933022499, 0.018557460978627205, 0.001960733672603965, -0.019921142607927322, 0.037038158625364304, -0.01458648033440113, 0.054415568709373474, -0.013695001602172852, -0.07102423906326294, 0.0394890196621418, -0.006315319798886776, -0.02957361564040184, 0.027810178697109222, -0.03915134072303772, 0.004134254064410925, -0.011378795839846134, -0.007433726917952299, 0.0066596693359315395, -0.0024547220673412085, 0.015556261874735355, 0.04019543156027794, 0.015775540843605995, -0.03245026245713234, -0.029516760259866714, -0.010834257118403912, -0.004302376881241798, -0.05429167300462723, 0.01321353018283844, -0.008566375821828842, -0.009314185939729214, -0.0076734148897230625, 0.02101180888712406, 0.012842920608818531, 0.01720336824655533, -0.03585457801818848, -0.0019923774525523186, -0.0005935553926974535, -0.009494470432400703, 0.02225668542087078, -0.029551152139902115, -0.01947426237165928, -0.014214287512004375, 0.015260724350810051, -0.1120201051235199, -0.0061029838398098946, -0.03732654079794884, 0.01511622965335846, -0.03232899308204651, -0.0065028369426727295, -0.04177168756723404, 0.002539220033213496, -0.01135808601975441, -0.029649952426552773, -0.026093682274222374, 0.02386733703315258, 0.023208558559417725, -0.040407486259937286, -0.024726932868361473, -0.037382978945970535, -0.03072262741625309, -0.02276133932173252, 0.034005776047706604, -0.003327053738757968, -0.04089104384183884, 0.026456816121935844, -0.03523353487253189, 0.00953145045787096, -0.01678653247654438, -0.034679267555475235, -0.03652067855000496, -0.007158024702221155, 0.05322793498635292, 0.01317732036113739, 0.020593302324414253, -0.007316172122955322, 0.022068843245506287, -0.00803996343165636, -0.05160336196422577, -0.01361123751848936, 0.030824843794107437, 0.047114092856645584, -0.0032002434600144625, 0.06522864103317261, -0.08670363575220108, -0.02314511314034462, 0.036710891872644424, 0.009993511252105236, -0.013001385144889355, 0.0128525635227561, 0.001944083720445633, -0.020813245326280594, 0.019853267818689346, -0.0030715567991137505, 0.03883309289813042, 0.07446344196796417, -0.009661451913416386, -0.02583443373441696, 0.020120158791542053, -0.036666207015514374, 0.043870214372873306, -0.0016123006353154778, -4.787339094036724e-06]" ./train/jean/n03594734_32813.JPEG,jean,"[-0.009363916702568531, 0.010428757406771183, -0.015395153313875198, 0.041781648993492126, -0.0029708652291446924, -0.008751732297241688, -0.05462757498025894, -0.035740338265895844, -0.0008784861420281231, 0.031538765877485275, 0.05457746982574463, -0.0005049121682532132, -0.05191979557275772, 0.01924949698150158, -0.07061571627855301, -0.06237589195370674, 0.11912652850151062, 0.03313304856419563, 0.02757549285888672, -0.0037485011853277683, -0.017601221799850464, 0.019877035170793533, 0.03658661991357803, -0.006198260001838207, -0.006220818031579256, -0.011079344898462296, -0.03542918339371681, 0.029847847297787666, 0.02864178828895092, 0.008601030334830284, 0.016149010509252548, 0.053820498287677765, -0.010971006937325, -0.03802959620952606, 0.022574828937649727, 0.04378784820437431, 0.007233757060021162, -0.029586128890514374, -0.014372420497238636, 0.04380644112825394, 0.011312153190374374, -0.030733581632375717, -0.04299236088991165, -0.03234720602631569, 0.02484000101685524, 0.13219672441482544, 0.018989715725183487, 0.020059138536453247, -0.0745544359087944, 0.004955534357577562, 0.009251724928617477, 0.026838593184947968, -0.02881329506635666, 0.0011323336511850357, 0.03178434073925018, -0.03859083354473114, -0.03130152076482773, 0.01636216975748539, -0.055831871926784515, 0.029284046962857246, 0.006925327703356743, -0.005438774358481169, 0.018814319744706154, -0.011367627419531345, -0.03118596039712429, -0.04305205121636391, -0.044659122824668884, 0.024696413427591324, 0.04249849170446396, -0.010966120287775993, -0.036242153495550156, 0.027390798553824425, 0.01543585304170847, -0.00948128942400217, -0.0064729140140116215, 0.011545626446604729, 0.039477597922086716, -0.013886000961065292, -0.031185416504740715, 0.007621085271239281, -0.0036180708557367325, -0.016864251345396042, -0.03142552450299263, -0.04152204468846321, -0.011126158758997917, 0.013419217430055141, 0.0329098142683506, -0.03694426268339157, 0.04877554997801781, 0.005996819585561752, -0.009591802023351192, -0.013350768014788628, -0.4863452911376953, 0.016726940870285034, 0.025142628699541092, 0.01461818814277649, -0.016764504835009575, 0.0037457970902323723, -0.022702785208821297, -0.06574056297540665, 0.05123300477862358, -0.009580584242939949, 0.012710729613900185, -0.010151749476790428, 0.049587104469537735, 0.0003647980047389865, 0.12764447927474976, 0.030060967430472374, -0.04112759977579117, -0.0028007137589156628, 0.04012124985456467, -0.024041742086410522, 0.01672745868563652, -0.02018066495656967, -0.01799648255109787, 0.008500627242028713, 0.0068311975337564945, 0.018658647313714027, 0.015510809607803822, 0.04990927129983902, -0.04859374463558197, -0.04163297638297081, -0.025010019540786743, 0.06360463798046112, 0.011586809530854225, 0.00744049996137619, 0.000828928779810667, -0.03737723454833031, -0.005582056473940611, 0.05075826123356819, 0.013346978463232517, -0.07263342291116714, -0.016499219462275505, 0.08796606957912445, 0.028422163799405098, -0.02399720437824726, -0.07172505557537079, 0.03696230426430702, -0.02266581542789936, -0.024360183626413345, -0.03812892735004425, -0.02063049003481865, -0.07347714155912399, 0.07745083421468735, -0.003948281053453684, -0.0010228768223896623, -0.00871339626610279, 0.01339794136583805, -0.04271094873547554, -0.03781329467892647, -0.02776646800339222, 0.0032174105290323496, 0.10623347014188766, -0.011582172475755215, 0.02225114218890667, -0.00472178403288126, -0.0018955403938889503, 0.04320960119366646, -0.029912332072854042, 0.03921273723244667, -0.07161203771829605, -0.043894678354263306, -0.025913886725902557, 0.003007040824741125, -0.020037997514009476, 0.01759316399693489, 0.026826897636055946, 0.013179788365960121, -0.04710375517606735, 0.021746333688497543, 0.03075963631272316, 7.282917067641392e-05, 0.0004572944017127156, -0.03749984875321388, -0.003889822168275714, -0.024329891428351402, 0.03645426407456398, 0.004260548390448093, 0.047796573489904404, 0.022307371720671654, 0.01275298185646534, -0.07652612775564194, 0.08440054953098297, -0.02479575015604496, -0.00548657076433301, 0.0322529636323452, 0.0963752269744873, -0.0008520605624653399, 0.02446921356022358, 0.04225699603557587, -0.003318857867270708, -0.034954000264406204, 0.01632050611078739, -0.030538301914930344, 0.010429280810058117, 0.010599201545119286, 0.08705810457468033, 0.019854102283716202, -0.015092381276190281, -0.048208463937044144, -0.00430799275636673, 0.022623883560299873, 0.04406600445508957, 0.03755444660782814, 0.01535185519605875, 0.04067029803991318, -0.028910871595144272, -0.03471044450998306, -0.06782873719930649, 0.041370149701833725, -0.08982548862695694, -0.021987363696098328, 0.017166148871183395, 0.03881854936480522, 0.07178732007741928, 0.029340878129005432, -0.04436132311820984, 0.03689294680953026, -0.04226049408316612, 0.0048712389543652534, 0.009525241330265999, -0.04958541691303253, -0.09339798241853714, -0.02885531634092331, 0.04765207692980766, 0.02994224615395069, 0.025693390518426895, -0.03446633741259575, -0.006707966327667236, 0.0996849536895752, -0.019904667511582375, 0.00913158804178238, 0.031146857887506485, 0.03599843010306358, 0.03195038437843323, -0.04019801318645477, -0.05524226650595665, 0.008117950521409512, -0.0036591130774468184, 0.03265126049518585, 0.014612791128456593, -0.0033943348098546267, -0.02289644256234169, 0.017885558307170868, 0.030760807916522026, -0.035294461995363235, 0.03469022735953331, 0.04165368899703026, -0.008526981808245182, -0.03478250280022621, 0.05467119440436363, 0.007649117615073919, 0.018375450745224953, 0.021457653492689133, 0.01842057891190052, -0.032725121825933456, -0.045560043305158615, -0.032946981489658356, -0.03706474229693413, -0.0032892306335270405, 0.029629820957779884, -0.013688430190086365, -0.051746170967817307, 0.00467286491766572, -0.01656835898756981, -0.0021646874956786633, -0.03790552169084549, -0.016043633222579956, -0.012965858913958073, -0.019469579681754112, 0.011113282293081284, 0.00153735198546201, -0.027171626687049866, 0.006806802004575729, 0.028256310150027275, -0.022676821798086166, -0.012569339014589787, 0.053053125739097595, -0.06032612547278404, 0.006530026905238628, -0.013240080326795578, -0.018203308805823326, -0.06173035502433777, -0.0032746046781539917, 0.020805172622203827, 0.004939827602356672, 0.08862601220607758, 0.019914181903004646, -0.013078741729259491, 0.03502243012189865, 0.05030152201652527, -0.02453465946018696, 0.011865472421050072, 0.017102934420108795, -0.028324546292424202, -0.005109832156449556, -0.06865305453538895, -0.024464646354317665, 0.0069371480494737625, 0.014133704826235771, -0.0075414287857711315, -0.0007623337442055345, -0.03209235891699791, 0.0362776480615139, -0.0056029376573860645, -0.014493121765553951, -0.019349858164787292, 0.016470016911625862, -0.050440605729818344, -0.014688970521092415, -0.002788056619465351, 0.011150929145514965, 0.08768521994352341, 0.09920350462198257, -0.07095127552747726, -0.008623127825558186, -0.003346160752698779, -0.0732647255063057, 0.0006381754647009075, 0.04024259373545647, -0.015436617657542229, 0.15675471723079681, -0.007101456634700298, -0.06737630814313889, 0.028939127922058105, 0.03355497866868973, -0.004093187861144543, -0.01513039693236351, 0.0186788197606802, -0.03787046670913696, -0.003563124919310212, -0.048575762659311295, 0.03261958062648773, -0.01456096675246954, -0.00831771269440651, 0.023757029324769974, -0.004130208399146795, 0.003336395602673292, -0.0374491922557354, 0.01902170479297638, 0.004009617492556572, 0.007597811054438353, 0.012704613618552685, 0.037367355078458786, -0.04293128475546837, 0.01817469857633114, -0.03927576169371605, 0.04874036833643913, 0.053653914481401443, 0.06618107855319977, 0.04945167154073715, -0.021924825385212898, -0.017006389796733856, -0.019282395020127296, -0.036456149071455, 0.026982756331562996, -0.01081270445138216, 0.15970845520496368, -0.01806461066007614, -0.04930373281240463, 0.010151341557502747, 0.01537278387695551, 0.024739742279052734, -0.01488814502954483, 0.03692298382520676, -0.029285237193107605, -0.01525657158344984, 0.08952300995588303, -0.004605820868164301, 0.06921757012605667, 0.03844190016388893, -0.019154027104377747, 0.00376363517716527, 8.00357447587885e-05, 0.07062084227800369, -0.008982853032648563, 0.029105914756655693, 0.04187367483973503, -0.007088630460202694, 0.01627936027944088, 0.04100770130753517, 0.0033147004432976246, -0.012311795726418495, -0.07171235978603363, -0.03562553972005844, 0.03282475471496582, 0.018334785476326942, 0.0286080501973629, -0.0212406013160944, -0.14177177846431732, -0.048605889081954956, -0.036741774529218674, -0.01768595352768898, 0.0027823084965348244, 0.01198312547057867, -0.07109485566616058, 0.011126337572932243, -0.014383843168616295, 0.01096976175904274, 0.005053537432104349, -0.06377413123846054, -0.00012102033360861242, 0.06700736284255981, 0.044209398329257965, 0.004026265349239111, -0.024608829990029335, 0.009377796202898026, 0.02787197381258011, -0.0321938656270504, -0.011253074742853642, -0.02853778563439846, -0.013967504724860191, 0.03500230237841606, 0.0050976392813026905, -0.08198543637990952, -0.007940790615975857, -0.0036104971077293158, 0.03863685578107834, -0.02778344415128231, -0.004980036988854408, -0.054509326815605164, -0.023646889254450798, 0.028368839994072914, 0.09972341358661652, -0.03111368976533413, -0.027803312987089157, -0.005146704148501158, -0.023412929847836494, -0.08912859857082367, 0.022813869640231133, 0.005689264740794897, 0.0007427496020682156, 0.07936963438987732, 0.005326034035533667, 0.04458053037524223, 0.0044274539686739445, 0.036541908979415894, 0.04964978247880936, 0.033397067338228226, -0.00938434712588787, 0.028947990387678146, -0.05370120704174042, -0.005651154555380344, 0.003937885630875826, -0.016388531774282455, -0.0537492036819458, -0.050959087908267975, 0.012390322051942348, -0.025725821033120155, -0.0635317862033844, -0.004643630236387253, -0.03514278680086136, -0.03910316899418831, -0.030951986089348793, 0.010775833390653133, 0.003471348201856017, 0.0403188019990921, 0.012588654644787312, -0.026667414233088493, 0.05626264214515686, 0.0015337865334004164, -0.04407783970236778, 0.02543013170361519, 0.00028147330158390105, 0.06004617363214493, 0.04954531788825989, -0.04022857919335365, -0.047115325927734375, 0.022375356405973434, 0.03218213468790054, 0.019382433965802193, 0.017608195543289185, 0.07602240145206451, -0.010697241872549057, 0.08909071236848831, -0.07703045010566711, 0.008671428076922894, -0.02088448591530323, -0.010094854980707169, -0.04756804555654526, 0.038011565804481506, 0.021772410720586777, 0.0379474014043808, -0.003954372368752956, 0.008349156007170677, -0.019479012116789818, -0.006377424579113722, -0.020299511030316353, 0.017790714278817177, -0.05730002745985985, -0.030508778989315033, 0.014690592885017395, 0.03944860026240349, -0.022001223638653755, -0.0007675797678530216, -0.037691231817007065, 0.018469298258423805, 0.03377237915992737, -0.02506111189723015, -0.0509149432182312, -0.05837945640087128, 0.0015602040803059936, -0.05275818705558777, 0.04124831035733223, 0.03551248088479042, -0.08392006158828735, -0.002174869878217578, 0.01156991720199585, 0.014368060044944286, 0.054701704531908035, -0.009814431890845299, 0.05871652811765671]" ./train/jean/n03594734_16188.JPEG,jean,"[-0.0029063948895782232, 0.021027371287345886, -0.014468035660684109, 0.0376032330095768, -0.02600681781768799, 0.017190605401992798, 0.026088306680321693, -0.005443091504275799, 0.04366198554635048, 0.022876199334859848, 0.01777157001197338, 0.023643771186470985, 0.008618745021522045, 0.03594265505671501, -0.0364069938659668, -0.053626906126737595, 0.1240021213889122, 0.02776692435145378, 0.00784018449485302, -0.018989453092217445, -0.008937026374042034, 0.007410610560327768, 0.04558151587843895, -0.030215764418244362, 0.03360038623213768, 0.020690791308879852, -0.030527187511324883, -0.004636789672076702, -0.020740024745464325, 0.044317543506622314, -0.018766433000564575, 0.033719465136528015, 0.01182133611291647, -0.038883160799741745, 0.0311060082167387, 0.04778032377362251, -0.00835983082652092, 0.024104055017232895, -0.012763990089297295, -0.01675417274236679, -0.05906219035387039, -0.031039707362651825, -0.010938492603600025, 0.0017115336377173662, 0.013917607255280018, 0.06841398775577545, 0.03194650262594223, 0.014965093694627285, -0.06853090226650238, -0.0022596418857574463, 0.06689133495092392, 0.010811148211359978, 0.010259194299578667, 0.007533464580774307, 0.04876001924276352, 0.03550644963979721, 0.011263439431786537, 0.03342077508568764, -0.0636591836810112, 0.005264395382255316, 0.06311849504709244, 0.02005048096179962, -0.028158046305179596, 0.0240582674741745, -0.009107072837650776, 0.013578352518379688, 0.004720059223473072, 0.09369315207004547, -0.004003665875643492, -0.020765898749232292, -0.0260140560567379, 0.0038049165159463882, -0.0397305004298687, -0.018789617344737053, 0.030607620254158974, -0.0017984448932111263, 0.04025351256132126, -0.0136826541274786, 0.0025573628954589367, 0.002025228925049305, 0.01992652378976345, -0.028411800041794777, -0.00445153983309865, -0.005086217075586319, 0.00995302852243185, 0.027181051671504974, 0.0347568541765213, -0.006901465356349945, 0.052672456949949265, -0.00102545868139714, 0.03170860558748245, -0.021563870832324028, -0.7048259973526001, -0.0001378805609419942, -0.0061462270095944405, 0.012785932049155235, 0.03129995986819267, -0.005616628564894199, 0.012389925308525562, 0.055806487798690796, -0.007365581579506397, -0.01871132105588913, 0.003863545833155513, -0.007725868374109268, 0.05240725353360176, 0.024574192240834236, 0.09312143176794052, 0.01328875683248043, -0.015728924423456192, -0.011286965571343899, 0.015916453674435616, -0.022005073726177216, -0.020216694101691246, -0.03337171673774719, -0.008314928039908409, -0.010430260561406612, 0.011630330234766006, -0.05580097436904907, 0.015592570416629314, 0.015992237254977226, -0.020490162074565887, -0.018666420131921768, -0.021402878686785698, 0.012810271233320236, -0.01851469837129116, 0.014025130309164524, -0.016419826075434685, 0.009984886273741722, 0.018519818782806396, 0.06198927015066147, -0.008634014055132866, 0.0017093009082600474, 0.041907183825969696, 0.08856360614299774, -0.01627674698829651, -0.011671261861920357, 0.009379884228110313, -0.010281269438564777, -0.05150969326496124, 0.011573554947972298, -0.015160703100264072, -0.038772765547037125, -0.06120848283171654, 0.03958852216601372, 0.03477298095822334, -0.04688168689608574, -0.019518975168466568, -0.025397315621376038, -0.01778283715248108, -0.003343891818076372, -0.03289226442575455, -0.019676197320222855, 0.11600890755653381, -0.0014009634032845497, 0.0048029315657913685, -0.02499021776020527, -0.0002726332750171423, 0.0015958674484863877, 0.0027095915284007788, -0.00047764027840457857, -0.02316325716674328, -0.04766229912638664, 0.034543976187705994, -0.01396208442747593, -0.023731736466288567, 0.024157164618372917, -0.006599259562790394, -0.01079944521188736, 0.021848469972610474, 0.016362644731998444, 0.011591335758566856, 0.03096599690616131, -0.03901585936546326, -0.03186981752514839, -0.0044179209508001804, -0.0045991395600140095, 0.04752412438392639, -0.005977343302220106, 0.00045107712503522635, -0.035719871520996094, -0.011104222387075424, -0.08460202813148499, 0.018983792513608932, -0.010433351621031761, 0.0050476002506911755, 0.015395947732031345, 0.01949354261159897, 0.007267100270837545, 0.00990154966711998, 0.019981328397989273, 0.0231475867331028, 0.03695335611701012, -0.006094166077673435, 0.001153753139078617, -0.025227850303053856, -0.02762673608958721, -0.043637704104185104, 0.005514776799827814, -0.04254342243075371, -0.006836265325546265, -0.01283675990998745, 0.016093747690320015, -0.01524235587567091, -0.002047348767518997, 0.03509211167693138, 0.004012685269117355, 0.01047996524721384, -0.01100114919245243, -0.029704412445425987, 0.017869962379336357, -0.07995293289422989, -0.037127524614334106, -0.005341087467968464, 0.015341872349381447, 0.045894648879766464, 0.016457878053188324, -0.028175173327326775, -0.009543124586343765, -0.0004694631206803024, 0.04757709056138992, -0.04379839450120926, 0.0003213988966308534, -0.0030396003276109695, -0.031588681042194366, 0.03588023781776428, 0.05172770097851753, -0.008471286855638027, -0.02433345466852188, -0.040589213371276855, 0.028808023780584335, -0.0029551719781011343, 0.012781788595020771, 0.012061245739459991, 0.05033537372946739, 0.028864527121186256, -0.05452713370323181, -0.013394534587860107, -0.007223630324006081, -0.01690671220421791, -0.010799779556691647, -0.014615707099437714, 0.0061419145204126835, 0.007920597679913044, 0.015524047426879406, -0.0364854596555233, 0.024151720106601715, 0.020989354699850082, 0.013221795670688152, -0.03957533836364746, 0.02569158934056759, -0.0024382774718105793, 0.03270129859447479, 0.03739645704627037, -0.03691538795828819, -0.0006733559421263635, -0.04306735843420029, 0.005466659087687731, -0.012446587905287743, -0.040243420749902725, -0.006711328402161598, 0.021097566932439804, 0.021313298493623734, -0.016812769696116447, 0.05798191949725151, 0.013272127136588097, 0.008620135486125946, -0.029354311525821686, -0.0044817011803388596, 0.02194909192621708, -0.005184783134609461, 0.03714719042181969, 0.0013285053428262472, -0.0440981462597847, -0.015284588560461998, 0.027643412351608276, -0.042486246675252914, -0.02364518865942955, -0.03693258389830589, -0.014523319900035858, -0.007056706584990025, -0.00016531998699065298, -0.006976103410124779, -0.033664338290691376, -0.009677155874669552, 0.011141262017190456, -0.005191328935325146, 0.06588596105575562, 0.015984972938895226, -0.020675046369433403, -0.006925446446985006, 0.010107823647558689, 0.03318876028060913, 0.02254108525812626, -0.00832907110452652, -0.03914180025458336, 0.02994406223297119, -0.07505099475383759, -0.024767080321907997, -0.03193006291985512, 0.0018777898512780666, -0.002210906706750393, -0.020629962906241417, 0.001321418327279389, 0.00963536649942398, 0.01316088531166315, -0.04927430674433708, -0.041229162365198135, 0.029545200988650322, -0.03146522492170334, 0.011418979614973068, -0.007239589001983404, -0.008465835824608803, 0.08843453228473663, 0.04081523418426514, 0.005133466329425573, 0.021957023069262505, 0.0068242428824305534, 0.036235835403203964, -0.02841614931821823, -0.0007256141398102045, -0.040211424231529236, 0.13238993287086487, 0.01544405147433281, -0.010037385858595371, -0.0008648356888443232, -0.027471624314785004, 0.007938607595860958, 0.006476189009845257, -0.010623381473124027, 0.013290648348629475, -0.0326109379529953, -0.03119146265089512, 0.04310261458158493, 0.02183045633137226, -0.007685144431889057, 0.03694428876042366, 0.023872010409832, 0.010164509527385235, 0.01276707649230957, 0.057174425572156906, -0.028091788291931152, 0.019778257235884666, -0.006750084459781647, 0.00948631577193737, -0.022313881665468216, -0.00036103904130868614, -0.011243999004364014, -0.011942222714424133, 0.036735132336616516, 0.004689059220254421, 0.1147923469543457, 0.010656553320586681, -0.021288897842168808, -0.03178028389811516, -0.005287021864205599, -0.017754826694726944, -0.05031967535614967, 0.08976316452026367, 0.005284320097416639, -0.06001904606819153, -0.005244382191449404, 0.026636827737092972, -0.0165491234511137, -0.005266426131129265, 0.08237259089946747, 0.056615300476551056, -0.0016125867841765285, -0.06194637715816498, 0.04902269318699837, 0.03569011390209198, -0.005154552403837442, 0.018684161826968193, 0.030668672174215317, -0.01769276149570942, 0.027471350505948067, -0.018320618197321892, 0.07690349221229553, 0.02495979331433773, -0.027844572439789772, 0.02257373370230198, -0.028533633798360825, -0.040160246193408966, 0.009380890987813473, -0.020265091210603714, -0.012780494056642056, -0.007934927940368652, 0.008714867755770683, -0.0004132982576265931, 0.008372693322598934, -0.10886143893003464, 0.007606063969433308, -0.0011848579160869122, 0.03447989746928215, -0.007152843754738569, -0.050878748297691345, 0.002138530369848013, 0.01176848728209734, -0.017998483031988144, -0.026700740680098534, 0.01365059893578291, -0.014315496198832989, 0.0030567676294595003, 0.11815300583839417, 0.0225174892693758, -0.006179787218570709, 0.00980474054813385, -0.02372611314058304, -0.011057538911700249, -0.052157677710056305, 0.03727421537041664, -0.0247445460408926, 0.03924630954861641, -0.002936023287475109, -0.00529869319871068, 0.001685862778685987, -0.016066506505012512, -0.06849566847085953, -0.009829582646489143, -0.01869642734527588, -0.0237642303109169, -0.026225408539175987, -0.04396330565214157, 0.0008423837716691196, 0.006705013569444418, -0.014160491526126862, -0.005126843228936195, -0.02674967050552368, -0.052913565188646317, -0.022741906344890594, 0.009075872600078583, 0.006500774994492531, 0.03344607725739479, -0.04239184781908989, 0.004942859522998333, 0.014017361216247082, 0.0324254035949707, 0.020680978894233704, 0.014554964378476143, -0.02282753959298134, 0.0036742694210261106, 0.010257663205265999, -0.033017758280038834, 0.015703879296779633, -0.04137725383043289, 6.679580837953836e-05, 0.0004646815941669047, 0.006140219513326883, 0.021621717140078545, -0.04161648452281952, 0.0075032818131148815, -0.060781266540288925, 0.028435207903385162, 0.002859867410734296, -0.040124423801898956, -0.018658673390746117, 0.030782977119088173, 0.019604457542300224, -0.02381180226802826, -0.008526487275958061, -0.008003398776054382, 0.027081722393631935, -0.026070227846503258, 0.023041630163788795, 0.015924977138638496, 0.024897586554288864, -0.0048806071281433105, -0.009656820446252823, -0.006606312468647957, 0.016449496150016785, 0.015420567244291306, 0.023846302181482315, 0.03136115148663521, 0.017400167882442474, -0.03912174329161644, 0.016346538439393044, -0.049601055681705475, 0.0032128822058439255, -5.834957119077444e-05, -0.024794012308120728, -0.025120535865426064, -0.019519442692399025, 0.005805997643619776, 0.00021340060629881918, 0.02119707502424717, -0.013154841959476471, 0.005486250855028629, -0.006501158233731985, -0.026642700657248497, 0.00028668579761870205, -0.039910487830638885, -0.038650669157505035, -0.0026663593016564846, -0.017628604546189308, -0.029050786048173904, 0.004509801510721445, 0.015420072712004185, 0.003088671248406172, 0.05307294800877571, -0.0561971515417099, 0.009770526550710201, -0.028214916586875916, 0.015360419638454914, -0.00370827061124146, 0.003044331446290016, 0.038777291774749756, 0.011676202528178692, 0.015142703428864479, -0.01102481409907341, -0.04346364736557007, 0.08094070106744766, -0.011509029194712639, 0.021699272096157074]" ./train/jean/n03594734_38343.JPEG,jean,"[0.005129501689225435, -0.02052535116672516, 0.002287328476086259, 0.05208679288625717, -0.044076960533857346, 0.02562316134572029, -0.028221728280186653, -0.05305327847599983, 0.011904824525117874, 0.025780031457543373, 0.020631898194551468, 0.016953550279140472, -0.03694227710366249, -0.018167397007346153, -0.02469945326447487, -0.0006375666125677526, 0.1818729043006897, -0.0036934870295226574, 0.04931251332163811, -0.057414423674345016, 0.019580168649554253, 0.06518727540969849, 0.06335584819316864, -0.01906673237681389, 0.03044087253510952, 0.05724777653813362, -0.023677116259932518, 0.009324532002210617, -0.011734509840607643, 0.007049631793051958, -0.0011146408505737782, -0.027750801295042038, -0.016817161813378334, -0.019147101789712906, 0.001857368042692542, 0.048448868095874786, 0.02940807305276394, 0.003594338661059737, 0.009771019220352173, 0.05195004120469093, -0.060692355036735535, 0.005220957566052675, -0.0130991879850626, 0.003945291042327881, -0.017685040831565857, -0.011858020909130573, 0.01572791300714016, -0.014836227521300316, -0.033537376672029495, 0.039375804364681244, 0.009114505723118782, -0.045807790011167526, 0.05214942619204521, 0.009692233987152576, -0.0030953981913626194, -0.007314406801015139, -0.01692330092191696, 0.016670117154717445, -0.03181701526045799, -0.03353041782975197, 0.08006949722766876, 0.024073775857686996, 0.0049232845194637775, 0.023062264546751976, -0.021646765992045403, -0.024342555552721024, -0.001389644225127995, 0.049642227590084076, -0.003987779840826988, -0.03348948433995247, -0.01207521092146635, 0.004553855396807194, -4.083911335328594e-05, 0.016812486574053764, -0.02576603926718235, -0.005074667744338512, 0.03657388314604759, -0.020754186436533928, 0.026773720979690552, -0.00569064961746335, -0.049178704619407654, -0.0662602111697197, -0.03134378790855408, -0.007244657259434462, 0.015937956050038338, 0.04473087564110756, 0.007400526199489832, -0.032714612782001495, 0.003964951261878014, -0.007253807038068771, 0.04062197357416153, 0.00043986481614410877, -0.543774425983429, 0.0020591493230313063, 0.03208573907613754, 0.018270188942551613, 0.04793144389986992, 0.0472654290497303, 0.02693909965455532, 0.09637876600027084, 0.003736486891284585, -0.026894433423876762, 0.004524144809693098, -0.025922415778040886, 0.015776146203279495, 0.009697393514215946, -0.018035879358649254, 0.029502060264348984, -0.007509803399443626, 0.025722524151206017, -0.022185983136296272, -0.005852839443832636, 0.025143004953861237, 0.008127975277602673, 0.0058410693891346455, 0.014484792947769165, -0.0005910992040298879, -0.05106518417596817, 6.458574353018776e-05, 0.041829824447631836, 0.022403107956051826, -0.037562061101198196, -0.028118237853050232, -0.013731714338064194, -0.026732854545116425, -0.0036233363207429647, -0.02304600365459919, 0.0011757895117625594, 0.002930412534624338, 0.043550364673137665, 0.019325917586684227, -0.020743858069181442, -0.04457990825176239, 0.07284735888242722, 0.014556890353560448, 0.0355428084731102, -0.0009076886344701052, 0.04806634038686752, -0.014258304610848427, 0.0035829946864396334, -0.006533788982778788, -0.04752304404973984, -0.061086155474185944, 0.011116055771708488, -0.02529118023812771, 0.004149502143263817, -0.011546394787728786, 0.016710549592971802, -0.007522208150476217, -0.027421070262789726, -0.0019463164499029517, -0.025546232238411903, -0.002648541470989585, -0.01728000119328499, -0.01575593650341034, -0.0004953142488375306, 0.0013184023555368185, 0.05682104453444481, 0.02393149584531784, 0.003733891760930419, -0.0460285060107708, 0.0019727912731468678, -0.0063967411406338215, -0.03220842033624649, 0.014802081510424614, -0.027035292237997055, 0.07062617689371109, 0.015927618369460106, 0.022595707327127457, 0.008955025114119053, -0.03158425912261009, 0.03570055961608887, -0.030158868059515953, -0.0023053123150020838, -0.04415479302406311, -0.01272925641387701, 0.1456119269132614, -0.0340154655277729, -0.021430904045701027, -0.007966390810906887, 0.02627216838300228, -0.01656258851289749, 0.026788227260112762, 0.01408142875880003, -0.032696399837732315, 0.03538478538393974, 0.0009695008629933, -0.011793275363743305, -0.01827223040163517, -0.014232075773179531, 0.017331590875983238, 0.0007569644949398935, -0.03185327723622322, 0.04892584681510925, -0.008917677216231823, -0.030513323843479156, -0.012452170252799988, 0.011221874505281448, 0.013184682466089725, 0.004643725231289864, -0.020272353664040565, -0.002879220759496093, 0.0075822374783456326, 0.014888761565089226, 0.006096863653510809, -0.020463377237319946, -0.03403936326503754, 0.01068416889756918, -0.06519658118486404, 0.028610428795218468, -0.06888752430677414, 0.05659087747335434, -0.02455204725265503, -0.035432085394859314, 0.0012789814500138164, 0.014997262507677078, 0.013669206760823727, 0.01741848886013031, -0.005052656400948763, 0.00813938956707716, -0.049008868634700775, 0.009225658141076565, -0.0036024274304509163, 0.0032622660510241985, -0.003697420470416546, -0.01020385604351759, 0.04764914512634277, 0.009066118858754635, -0.019623540341854095, 0.029731517657637596, -0.0029579598922282457, 0.02063915506005287, -0.015541568398475647, 0.015852849930524826, 0.03502163290977478, -0.004901187028735876, -0.06426352262496948, -0.010882522910833359, -0.019439905881881714, -0.005267991218715906, 0.04542923346161842, 0.03784874081611633, -0.012213178910315037, 0.003591757034882903, 0.060500796884298325, -0.00823599100112915, -0.012876451015472412, 0.07729685306549072, 0.014818045310676098, 0.052810873836278915, 0.021497348323464394, 0.004043581895530224, 0.03781607002019882, 0.015424349345266819, 0.0013014563592150807, -0.007313067559152842, -0.043807502835989, -0.005685605574399233, -0.03183954581618309, -0.03032713569700718, 0.04260466620326042, 0.010295760817825794, -0.005468212999403477, 0.06942270696163177, 0.019360829144716263, -0.027482744306325912, -0.006598285399377346, 0.027503008022904396, 0.008765947073698044, 0.04736854135990143, -0.02827516943216324, 0.01632882095873356, 0.029239175841212273, -0.0010447789682075381, 0.005766098853200674, 0.010707058943808079, -0.012221936136484146, 0.048358410596847534, -0.00406202208250761, -0.04645402356982231, -0.01218116469681263, -0.007714484352618456, -0.06982362270355225, 0.0201396644115448, 0.02210894413292408, -0.03158088028430939, 0.25193408131599426, 0.0016636403743177652, -0.02529587782919407, -0.014770178124308586, 0.03130776807665825, 0.009013088420033455, 0.00035335877328179777, 0.013133767060935497, -0.026349708437919617, -0.031235145404934883, -0.05053689703345299, -0.03579799830913544, -0.019839610904455185, 0.03716176748275757, -0.062469013035297394, -0.010858847759664059, -0.007725422736257315, 0.001609104685485363, -0.014163719490170479, -0.00489832041785121, -0.055077165365219116, 0.02463160827755928, -0.05885661765933037, 0.028615329414606094, 0.0008865237468853593, 0.03320503979921341, 0.07263494282960892, 0.06159402057528496, -0.022725064307451248, 0.052349530160427094, 0.030451593920588493, 0.03563908115029335, -0.011885016225278378, -0.008143533021211624, -0.033539846539497375, 0.29530683159828186, -0.041397955268621445, -0.04250626266002655, -0.01719370298087597, -0.03241991996765137, -0.017800265923142433, -0.007358701899647713, 0.010844217613339424, -0.037751682102680206, -0.03199809044599533, -0.04456515982747078, 0.03332861512899399, 0.0329803004860878, 0.015954477712512016, 0.026936441659927368, 0.030477387830615044, 0.0005929201142862439, -0.027574710547924042, 0.04235037416219711, -0.016033124178647995, 0.04003973305225372, 0.017801066860556602, 0.06283707916736603, 0.006331578828394413, 0.009838314726948738, -0.013792509213089943, 0.01258842647075653, 0.02182542346417904, 0.009236331097781658, 0.08840615302324295, -0.012526428326964378, -0.020482124760746956, 0.059857793152332306, -0.017496006563305855, -0.026071149855852127, -0.004055711440742016, 0.07764104008674622, -0.044902343302965164, -0.04439183324575424, -0.006577725987881422, 0.007555653806775808, -0.058347951620817184, 0.02112525887787342, 0.011815479025244713, -0.04305143281817436, 0.0029675045516341925, 0.048224739730358124, -0.030197346583008766, 0.005495979450643063, 0.0383569672703743, 0.04177200421690941, 0.03855595737695694, 0.02097354270517826, -0.005777947138994932, -0.021141180768609047, 0.047681476920843124, -0.003346298588439822, 0.017140522599220276, 0.012476936914026737, -0.0024298420175909996, 0.013187912292778492, 0.01726485975086689, -0.009526818059384823, -0.0002218857262050733, 0.05641739070415497, -0.018838459625840187, -0.04057943820953369, -0.0026477922219783068, 0.0035262671299278736, -0.010558189824223518, -0.024808375164866447, 0.0010755020193755627, 0.000510111334733665, -0.042735613882541656, 0.0007797671132721007, 0.02526172250509262, -0.028616072610020638, 0.07627499103546143, 0.08532904833555222, -0.00923083070665598, 0.011460664682090282, 0.17365291714668274, 0.02809922583401203, -0.013897642493247986, 0.01106290239840746, 0.008150734938681126, 0.02200961858034134, -0.06145470216870308, 0.046587150543928146, -0.013882114551961422, 0.023732146248221397, 0.0036556303966790438, -0.03405912220478058, -0.01976669952273369, 0.004212276078760624, 0.026122896000742912, -0.015980074182152748, -0.016809988766908646, 0.011735089123249054, 0.010525843128561974, -0.037212107330560684, 0.006349517032504082, 0.10859442502260208, -0.0022963914088904858, -0.006477014161646366, -0.03762916103005409, -0.0015870239585638046, -0.03095979429781437, -0.006403201259672642, -0.038000885397195816, -0.009389057755470276, 0.06296979635953903, 0.023791400715708733, -0.004135057795792818, -0.0031737296376377344, -0.020757058635354042, 0.03372322395443916, 0.06929698586463928, -0.027419963851571083, 0.021601704880595207, -0.022327488288283348, -0.0034617381170392036, -0.02312706597149372, -0.014540805481374264, -0.012502113357186317, -0.010024623945355415, -0.006686368957161903, 0.021219374611973763, -0.013125435449182987, -0.0597049742937088, -0.00757038127630949, -0.0031001190654933453, -0.032096296548843384, 0.01643836498260498, 0.04025328904390335, 0.011591549031436443, -0.005589902866631746, -0.005140257067978382, 0.03998490422964096, -0.012955105863511562, -0.005946590565145016, 0.022535793483257294, -0.033715203404426575, 0.03527189418673515, 0.007196477614343166, -0.022817697376012802, -0.012908565811812878, 0.004271452780812979, 0.013652280904352665, -0.012661350890994072, -0.013660997152328491, 0.01014947984367609, -0.053513314574956894, 0.016415223479270935, -0.013512385077774525, 0.006067649461328983, -0.003141198307275772, -0.02214226685464382, 0.01914600469172001, -0.00914570689201355, -0.042027465999126434, 0.03834829106926918, -0.005003137979656458, -0.05346701294183731, 0.03113570064306259, -0.0156828835606575, 0.011660094372928143, 0.008836092427372932, -0.028507081791758537, -0.014462015591561794, -0.005371596198529005, -0.017822979018092155, -0.023721348494291306, -0.04676303640007973, -0.004494838882237673, -0.00783954281359911, 0.04434102028608322, 0.02129780687391758, -0.016744529828429222, -0.031016921624541283, 0.0042395154014229774, -0.016640592366456985, 0.02881462499499321, 0.044416554272174835, 0.0003123805799987167, -0.02741682343184948, 0.020170491188764572, -0.008250060491263866, 0.08912299573421478, -0.0055054668337106705, 0.09389524161815643]" ./train/jean/n03594734_4800.JPEG,jean,"[0.0021229367703199387, 0.008529282175004482, -0.0035486011765897274, 0.03826257586479187, -0.027114588767290115, 0.05836280435323715, -0.02130945958197117, 0.05845630168914795, -0.003833070630207658, 0.03612609580159187, 0.008067586459219456, -0.002312262076884508, 0.006037954706698656, -0.0166904516518116, -0.02800832688808441, 0.014477658085525036, 0.09463228285312653, 0.030733361840248108, 0.02029009908437729, 0.006475971080362797, 0.019459523260593414, 0.02183191478252411, 0.0113486023619771, -0.013421808369457722, 0.008070812560617924, 0.0053499420173466206, -0.013322942890226841, 0.0006972561241127551, 0.010216175578534603, 0.0028692889027297497, 0.015441072173416615, -0.031147122383117676, -0.00392330763861537, -0.03459658846259117, -0.00597107969224453, 0.019264377653598785, 0.022409653291106224, -0.03226745128631592, -0.002522876253351569, 0.04470014572143555, -0.030272625386714935, 0.0051315827295184135, -0.03535643592476845, 0.016809847205877304, 0.015362518839538097, -0.07400642335414886, 0.046750813722610474, -0.007360534276813269, 0.0003565555962268263, 0.003211330622434616, 0.00048769707791507244, -0.051553405821323395, 0.015093334950506687, -0.007458659820258617, 0.0018822895362973213, 0.01728552021086216, -0.005069664679467678, 0.015818120911717415, -0.05463710427284241, 0.006998006720095873, 0.09329541027545929, -0.018923254683613777, -0.00410090945661068, 0.006918884348124266, -0.04592925310134888, 0.02181234583258629, -0.01750040613114834, 0.04323141276836395, 0.017403433099389076, -0.005587500985711813, 0.028378482908010483, -0.0019172056345269084, -0.01713906042277813, 0.044814981520175934, -0.015862111002206802, -0.010255735367536545, 0.03927776589989662, 0.012897166423499584, -0.02130304090678692, 0.01841334067285061, -0.03371038660407066, -0.0257578045129776, 0.007691232953220606, -0.034286338835954666, -0.023352064192295074, 0.004386645741760731, 0.11133592575788498, 0.0018914409447461367, 0.02628299407660961, -0.02081143856048584, 0.017702016979455948, -0.06313260644674301, -0.704035222530365, 0.047944143414497375, 0.019656427204608917, -0.006562472321093082, 0.02233177050948143, 0.025985926389694214, 0.018297899514436722, 0.0898943543434143, -0.000493774248752743, -0.020253673195838928, -0.005154975689947605, -0.016253884881734848, 0.03221164643764496, -0.005639615468680859, -0.10682693123817444, 0.00037014440749771893, -0.004313274752348661, 0.031024333089590073, -0.029027029871940613, 0.00456561055034399, -0.009507293812930584, -0.013183983974158764, 0.004651764407753944, 0.0042511229403316975, -0.02392229065299034, -0.016177518293261528, 0.03430619090795517, 0.042384084314107895, -0.015537546947598457, -0.12392810732126236, -0.02895571105182171, -0.01355607621371746, -0.009653646498918533, 0.005709163844585419, -0.045405901968479156, -0.010118461214005947, 0.019330540671944618, 0.012055088765919209, 0.01230141893029213, -0.003787357360124588, -0.011384287849068642, 0.08753450214862823, -0.013050098903477192, 0.036969855427742004, -0.07194513082504272, -0.04769231006503105, -0.013494672253727913, -0.014638657681643963, 0.01113403495401144, -0.002437652088701725, -0.0722479373216629, 0.034450847655534744, -0.01796969398856163, 0.025365840643644333, 0.006007857155054808, -0.05040517449378967, -0.010040516033768654, -0.010588202625513077, 0.001733926241286099, 0.010354939848184586, 0.02028603106737137, 0.023577438667416573, -0.001265701954253018, -0.024622952565550804, 0.035653289407491684, -0.013536959886550903, 0.027925411239266396, 0.04214007407426834, -0.03566558659076691, -0.038807738572359085, 0.021208487451076508, -0.00908696185797453, 0.013786752708256245, -0.041732147336006165, -0.029100656509399414, 0.041596584022045135, 0.010630869306623936, 0.03982812538743019, -0.03497033566236496, -0.029154013842344284, 0.008710874244570732, -0.03301224112510681, 0.006302384193986654, -0.02176661603152752, 0.031928565353155136, -0.02360774762928486, 0.003688151016831398, -0.0023575748782604933, -0.016305837780237198, -0.021153075620532036, 0.027289198711514473, -0.005842435173690319, -0.008404931053519249, 0.036047786474227905, 0.04254266992211342, -0.004255247768014669, -0.0009500433225184679, 0.01127084344625473, 0.043979521840810776, -0.0075011542066931725, -0.02298780344426632, -0.005289743188768625, 0.017389439046382904, -0.02163512073457241, -0.028350697830319405, -0.003749184077605605, -0.055561210960149765, -0.026254083961248398, -0.032953668385744095, 0.009889228269457817, -0.03708776831626892, 0.0389338955283165, 0.021922755986452103, 0.0011433011386543512, 0.019058534875512123, 0.0027318827342242002, -0.02989727444946766, 0.01134488731622696, -0.001796502387151122, 0.04815803840756416, -0.006124787963926792, 0.03605874255299568, 0.026255829259753227, 0.02177920937538147, -0.019059475511312485, -0.02343115583062172, 0.024441054090857506, 0.018232673406600952, 0.0006480949814431369, -0.024187715724110603, -0.04749568924307823, -0.005238202400505543, 0.025541307404637337, -0.0016933187143877149, 0.007107253652065992, 0.02122543379664421, 0.016634203493595123, -0.03818979859352112, -0.028947079554200172, -0.019783155992627144, 0.009081144817173481, 0.0031541790813207626, 0.022588375955820084, 0.03379187360405922, -0.02127155289053917, 0.020262308418750763, 0.016049057245254517, -0.028799090534448624, 0.023146627470850945, 0.00841076672077179, 0.04349953308701515, 0.0033178701996803284, 0.022945668548345566, -0.016739165410399437, 0.038675323128700256, 0.03983267769217491, 0.004735251422971487, 0.06289614737033844, -0.000676346302498132, 0.007934657856822014, 0.014616969972848892, 0.011282972991466522, 0.025138704106211662, -0.009820128791034222, -0.01368440967053175, 0.029965441673994064, 0.023489724844694138, 0.0008859946392476559, -0.0035238589625805616, 0.015357723459601402, -0.057302962988615036, -0.002820330671966076, 0.020139826461672783, -0.02719179540872574, 0.048400744795799255, -0.009811138734221458, 0.0287762600928545, -0.010932344943284988, -0.03269109129905701, 0.026101678609848022, 0.016932934522628784, 0.0014505647122859955, -0.005280073266476393, 0.018284030258655548, -0.02991371415555477, -0.00895110983401537, -0.006639036349952221, 0.012003186158835888, 0.0049973661080002785, -0.017504962161183357, -0.02022753842175007, 0.003414754057303071, 0.03364482894539833, -0.0007008684915490448, 0.07793799042701721, 0.008454827591776848, -0.021863998845219612, -0.007977595552802086, 0.03990761935710907, -0.009485132060945034, 0.006777216214686632, 0.057869985699653625, 0.017154758796095848, -0.05253535136580467, -0.053791195154190063, -0.016814054921269417, -0.014788096770644188, 0.029201878234744072, 0.004297013394534588, -0.009295068681240082, 0.013036336749792099, 0.020720340311527252, -0.025232169777154922, -0.015139572322368622, 0.021595466881990433, -0.0022238860838115215, -0.04337252676486969, 0.027104852721095085, -0.00214322074316442, -0.021324297413229942, 0.08747845888137817, 0.058982547372579575, -0.0015801913104951382, 0.008256594650447369, 0.0029049748554825783, -0.04731843248009682, -0.01123580802232027, -0.0242850910872221, -0.03499136120080948, 0.18324017524719238, -0.010507403872907162, -0.0019649823661893606, -0.035586707293987274, -0.002275384496897459, -0.04694031924009323, -0.0022861731704324484, 0.007942121475934982, 0.0484391413629055, 0.02546536549925804, 0.0019255130318924785, 0.006247553043067455, -0.02582552284002304, -0.0032330902758985758, 0.002281168010085821, 0.02987406961619854, -0.006351963616907597, -0.01621042750775814, 0.05155294016003609, 5.0877235480584204e-05, -0.004641960375010967, 0.029755951836705208, -0.015260177664458752, -0.0044178953394293785, -0.003114939434453845, -0.008030467666685581, 0.005499042104929686, 0.04706214740872383, -0.019968045875430107, 0.10015904903411865, -0.012612467631697655, 0.012118407525122166, 0.01874363049864769, -0.018999801948666573, -0.041467808187007904, -0.0225794930011034, -0.010455070994794369, -0.04049534723162651, 0.016750339418649673, 0.0506550669670105, 0.0048333462327718735, -0.001726197311654687, 0.0002546778414398432, 0.07611740380525589, -0.029188329353928566, -0.01421352569013834, 0.027496512979269028, 0.04129880294203758, -0.009992074221372604, 0.026946542784571648, -0.00453066686168313, -0.03455261513590813, 0.03573828935623169, 0.049273524433374405, 0.060284968465566635, 0.02379160188138485, 0.03157049044966698, -0.04082286357879639, 0.04124144837260246, -0.002046523615717888, 0.009837280958890915, 0.009523567743599415, -0.03067486174404621, 0.0033164762426167727, -0.0009035681141540408, -0.03423686698079109, 0.0043403347954154015, -0.027787676081061363, -0.121074378490448, -0.0735132172703743, 4.425051884027198e-05, -0.03797079250216484, 0.03459634631872177, 0.02313731238245964, -0.0059296186082065105, 0.041176218539476395, -0.011355055496096611, -0.026521097868680954, 0.05485662817955017, 0.010298876091837883, -0.017327530309557915, 0.1018960103392601, 0.02424122765660286, -0.018344087526202202, -0.025486396625638008, 0.024227773770689964, 0.008658361621201038, -0.015107598155736923, -0.01983989030122757, 0.0068148477002978325, -0.016486531123518944, 0.02506340481340885, -0.01013732235878706, -0.02672664448618889, -0.03154468536376953, 0.0023238344583660364, 0.01960345171391964, 0.033111557364463806, -0.011843284592032433, -0.02002110332250595, -0.04990794137120247, 0.020820841193199158, 0.05562448501586914, 0.031411729753017426, -0.03143059089779854, -0.01769488863646984, -0.014084473252296448, 0.07179201394319534, 0.020858068019151688, -0.006626761518418789, -0.008225812576711178, 0.05404525250196457, -0.001912238891236484, -0.013016573153436184, 0.00989407766610384, 0.007725624367594719, 0.015348698012530804, -0.013656039722263813, 0.017522847279906273, -0.02596265822649002, 0.02448756992816925, 0.003437500214204192, -0.02826702408492565, 0.0006946534267626703, -0.01255976501852274, 0.006752952467650175, -0.00041660910937935114, 0.0030147782526910305, 0.002072475152090192, -0.03540515899658203, -0.027401845902204514, 0.035438474267721176, -0.09124637395143509, 0.004424097947776318, 0.020695459097623825, 0.011562591418623924, 0.03249220922589302, -0.01885383203625679, 0.027436543256044388, 0.0008031695033423603, 0.004821651615202427, -0.037523552775382996, -0.00538927735760808, 0.04729802906513214, -0.0034231317695230246, -0.034562043845653534, -0.02030257135629654, -0.01563076488673687, -0.02922978438436985, 0.00034717534435912967, -0.030075209215283394, 0.029919033870100975, -0.02781042829155922, -0.0025671711191534996, -0.013073128648102283, 0.039104461669921875, -0.02570229582488537, -0.008994143456220627, 0.004287609830498695, 0.007639365270733833, 0.020843859761953354, 0.010414420627057552, 0.014921040274202824, -0.016661930829286575, 0.022843144834041595, 0.022779876366257668, -0.00314286258071661, -0.008064023219048977, -0.020539185032248497, 0.01031897310167551, -0.01972994953393936, 0.013171084225177765, -0.03140562027692795, -0.0008303505601361394, -0.03418087959289551, 0.021957550197839737, 0.021176425740122795, -0.04640407860279083, 0.03435322269797325, -0.0012520987074822187, -0.0030764820985496044, -0.0073584094643592834, 0.05175533518195152, 0.05136197805404663, -0.04188986495137215, -0.026080027222633362, 0.016584215685725212, 0.006540116388350725, 0.08956847339868546, -0.003807343076914549, 0.03319761902093887]" ./train/goblet/n03443371_3708.JPEG,goblet,"[-0.016182556748390198, 0.020235447213053703, 0.005917652510106564, -0.013088850304484367, 0.04683683067560196, -0.004525289870798588, -0.0011214170372113585, 0.06033722311258316, -0.022175781428813934, 0.025990309193730354, 0.011911571957170963, 0.003615487599745393, 0.053525686264038086, -0.015308802947402, 0.014775767922401428, -0.00580353569239378, 0.1163867637515068, 0.044954538345336914, -0.0015980665339156985, -0.026945123448967934, -0.03356388583779335, 0.014898397959768772, -0.034654922783374786, -0.0023036820348352194, -0.0108151501044631, 0.021670272573828697, 0.002906398382037878, 0.008612082339823246, -0.019671261310577393, -0.01435891818255186, 0.01005698274821043, 0.005683470983058214, -0.022200237959623337, -0.04974622651934624, 0.02129339426755905, -0.04523073881864548, -0.029269911348819733, -0.016149327158927917, -0.040037911385297775, 0.16240240633487701, 0.009087440557777882, -0.020022664219141006, 0.039039239287376404, 0.0044781542383134365, -0.002003438537940383, -0.18863323330879211, -0.006746112369000912, -0.015677811577916145, 0.03310593217611313, -0.010453763417899609, -0.025772681459784508, -0.01455682422965765, -0.005445202812552452, -0.02044466882944107, 0.004448275081813335, -0.03766416013240814, -0.07445861399173737, -0.004042825195938349, 0.003379042027518153, 0.024000026285648346, 0.02093425765633583, -0.06318805366754532, 0.004126355051994324, 0.01548464223742485, 0.029750140383839607, 0.044830307364463806, 0.0032126563601195812, -0.03807743638753891, -0.03925316780805588, -0.014691346324980259, -0.0071023134514689445, -0.018346887081861496, 0.014265895821154118, 0.008789296261966228, -0.012411069124937057, -0.014644639566540718, -0.012917282059788704, -0.006737885996699333, -0.0026643318124115467, -0.033695586025714874, -0.002146168379113078, -0.0322456881403923, 0.02753860130906105, -0.02930448390543461, 0.020308513194322586, -0.008636053651571274, -0.003335018176585436, 0.017663873732089996, -0.0030862237326800823, -0.016383690759539604, -0.011372433044016361, -0.0020016618072986603, -0.6665853261947632, -0.011410927399992943, -0.004602306522428989, -0.009985064156353474, 0.016436630859971046, 0.04295593872666359, 0.046542271971702576, 0.07031621783971786, 0.035105980932712555, -0.04439849033951759, 0.002123597078025341, 0.023796772584319115, 0.04672715812921524, -0.022586800158023834, -0.10731332004070282, 0.00960621703416109, 0.008458520285785198, 0.006703203544020653, 0.021680552512407303, 0.0406816191971302, 0.006940048187971115, 0.016052180901169777, -0.008866705000400543, 0.0365208275616169, -0.030178967863321304, 0.019405243918299675, -0.03245054557919502, 0.03632516786456108, 0.005890597589313984, -0.05456668138504028, -0.0016429872484877706, -0.040994010865688324, 0.02084161341190338, -0.051308926194906235, -0.009245411492884159, 0.018094727769494057, 0.03231135755777359, -0.034547511488199234, -0.033811915665864944, -0.028933081775903702, -0.009073251858353615, 0.07645096629858017, 0.014797484502196312, 0.005235651973634958, -0.06510446965694427, -0.004273128230124712, -0.015122918412089348, 0.010326002724468708, 0.0025111688300967216, 0.02691839635372162, -0.04152843356132507, -0.020658720284700394, -0.029044821858406067, 0.03355950862169266, 0.014445911161601543, -0.0241059809923172, -0.025152454152703285, -0.022627582773566246, 0.016131099313497543, 0.006110156420618296, 0.05538976192474365, -0.050148461014032364, -0.012571060098707676, -0.034485265612602234, 0.0073049007914960384, 0.0054078176617622375, -0.010482363402843475, -0.011969195678830147, -0.017929047346115112, -0.020605238154530525, -0.008185899816453457, -0.05219551920890808, -0.006735696457326412, 0.04852568730711937, -0.07329974323511124, -0.010362628847360611, -0.023649131879210472, 0.02477193810045719, -0.010964276269078255, -0.012246496975421906, -0.005231965333223343, 0.01768990233540535, -0.04221690073609352, -0.011452986858785152, 0.04952308163046837, -0.004927441943436861, 0.04638441279530525, 0.013463359326124191, 0.008721409365534782, 0.04437047615647316, 0.023125987499952316, 0.02916991524398327, -0.0370028018951416, 0.018650148063898087, -0.010813734494149685, 0.034521277993917465, 0.02964692749083042, 0.014856591820716858, 0.030404163524508476, -0.0006931874086149037, 0.01716778241097927, 0.013609099201858044, 0.08788036555051804, -0.0014121091226115823, 0.020607735961675644, -0.006938071921467781, -0.021953050047159195, -0.04049595817923546, -0.03235536813735962, 0.0025707732420414686, -0.029275715351104736, 0.045907557010650635, 0.009400702081620693, 0.004092767834663391, 0.027964046224951744, 0.00851136539131403, -0.005625887308269739, -0.050965990871191025, 0.002669075271114707, 0.09630768746137619, 0.007005386985838413, 0.009618895128369331, 0.000431548134656623, 0.00878593884408474, 0.03451697155833244, 0.03135223314166069, 0.010339190252125263, 0.016251323744654655, 0.00669148238375783, 0.06054045259952545, 0.02195691131055355, -0.025940513238310814, 0.05501361936330795, -0.028486212715506554, -0.01650603860616684, -0.04740254208445549, 0.0058133406564593315, 0.01037029642611742, 0.003760081948712468, 0.02011089213192463, -0.057926129549741745, 0.009111849591135979, 0.00020618429698515683, -0.0014314873842522502, 0.022582944482564926, -0.018908055499196053, -0.023165414109826088, -0.006142511498183012, 0.010536782443523407, -0.020306138321757317, -0.01690550521016121, -0.03694550320506096, -0.05853753536939621, 0.014737704768776894, 0.008595145307481289, 0.04575486108660698, -0.018702689558267593, 0.01994343101978302, -0.013616291806101799, 0.009494599886238575, -0.016300814226269722, -0.02137855440378189, -0.0024737222120165825, -0.010025609284639359, -0.014730137772858143, -0.025846371427178383, -0.0791143998503685, 0.03291172906756401, -0.006562082562595606, -0.03483407944440842, -0.03038002736866474, -0.051837895065546036, -0.02554316632449627, -0.05138899385929108, 0.014131269417703152, -0.026650257408618927, 0.025115903466939926, -0.006475056521594524, -0.035988908261060715, 0.010397869162261486, 0.06268279254436493, -0.0020652192179113626, -0.014821023680269718, 0.033580340445041656, 0.023178676143288612, 0.010521222837269306, -0.029511770233511925, -0.018606586381793022, 0.013921959325671196, 0.024444496259093285, -0.024720564484596252, 0.0022247859742492437, -0.030859220772981644, 0.004497352987527847, 0.06445430219173431, 0.04176859185099602, 0.013133072294294834, -0.03986204043030739, 0.03935612738132477, -0.011653396300971508, -0.012128276750445366, 0.02312764711678028, 0.025030100718140602, 0.02212425321340561, 0.009006615728139877, 0.051724594086408615, -0.009870188310742378, 0.03329736366868019, -0.009739451110363007, -0.016326867043972015, 0.025835596024990082, -0.022746212780475616, -0.022698847576975822, -0.01825939118862152, 0.041314128786325455, -5.813856114400551e-05, 0.0033390389289706945, -0.006063532549887896, 0.025362592190504074, 0.008662852458655834, 0.0763649269938469, 0.017122335731983185, 0.012933348305523396, -0.03547598049044609, 0.003004963044077158, -0.0013788678916171193, 0.004145135637372732, -0.04964926093816757, -0.014702736400067806, 0.1566944569349289, -0.015099449083209038, -0.010444206185638905, -0.009613772854208946, -0.017316628247499466, -0.02018393576145172, -0.03645157068967819, 0.029639514163136482, 0.031297605484724045, 0.0033388659358024597, -0.007093805819749832, -0.04093826562166214, -0.008945071138441563, 0.007491953670978546, -0.028092190623283386, 0.009027700871229172, -0.01569352298974991, 0.0029867461416870356, -0.007472456898540258, -0.013632155954837799, 0.007850666530430317, 0.02377120591700077, 0.0054057142697274685, 0.019064316526055336, -0.006438254378736019, 0.03972103074193001, 0.020221015438437462, -0.03978422284126282, 0.003091007936745882, 0.030009904876351357, 0.02137105166912079, 0.03739003837108612, 0.0059602889232337475, 0.010110476054251194, -0.03063724748790264, 0.016750773414969444, -0.08272998034954071, -0.011203638277947903, -0.04655739292502403, -0.025420021265745163, 0.019473208114504814, -0.003990962170064449, -0.05162341147661209, -0.14219751954078674, -0.01623273640871048, -0.0004555520717985928, 0.037311192601919174, 0.03358803316950798, 0.04631674662232399, 0.01294615026563406, 0.013309790752828121, -0.05916354060173035, -0.024883821606636047, -0.00961060356348753, -0.025534706190228462, 0.010709980502724648, -0.0023713582195341587, 0.010106283240020275, 0.010849637910723686, -0.005279801320284605, -0.03162093460559845, -0.047025930136442184, -0.027616726234555244, -0.0018309119623154402, 0.011623243801295757, 0.02336753159761429, 0.011228818446397781, 0.02083062008023262, -0.025647610425949097, -0.0068798670545220375, -0.004279139451682568, -0.029280956834554672, -0.02681112289428711, -0.01566290855407715, 0.012888888828456402, 0.002128773368895054, -0.019852731376886368, 0.06298282742500305, 0.043352700769901276, -0.011072454042732716, 0.02731940895318985, 0.10502394288778305, 0.024074820801615715, -0.00014298202586360276, 0.012034892104566097, 0.02598125860095024, 0.011226068250834942, 0.015104452148079872, -0.0195099376142025, 0.009260573424398899, 0.0014294673455879092, -0.018050435930490494, -0.013987528160214424, -0.005432180594652891, 0.012565012089908123, 0.01909739337861538, -0.008078156039118767, -0.014321191236376762, -0.006402784958481789, -0.010969714261591434, 0.001061290968209505, -0.0022339096758514643, 0.02520573139190674, -0.029294991865754128, -0.017080169171094894, 0.008498464711010456, -0.054085202515125275, -0.05751151591539383, 0.00214785966090858, 0.024341115728020668, -0.000792324251960963, 0.16127511858940125, -0.010464933700859547, -0.006728397216647863, -0.015555293299257755, -0.004018216859549284, -0.010594855062663555, 0.0015122912591323256, 0.006243086885660887, -0.0185562651604414, -0.009894683957099915, -0.00741627486422658, -0.014421912841498852, 0.03154245391488075, -0.01979362964630127, -0.009217062965035439, -0.0019760667346417904, -0.01632603257894516, 0.025308581069111824, 0.053767021745443344, -0.02508707530796528, 0.021857768297195435, -0.036498360335826874, -0.0314602293074131, 0.0159862469881773, 0.004169749561697245, 0.011932612396776676, 0.02577388286590576, 0.0016246956074610353, 0.038886867463588715, -0.010733242146670818, -0.030167968943715096, 0.009903893806040287, -0.035828765481710434, 0.009257582016289234, 0.06936381012201309, 0.0037516793236136436, 0.004162049852311611, -0.011466095224022865, -0.017703818157315254, -0.022050265222787857, 0.00443230289965868, -0.058296140283346176, -0.014138292521238327, -0.023724740371108055, 0.04222329333424568, -0.08180326223373413, -0.001892961678095162, 0.017893409356474876, 0.01834210194647312, -0.02126939222216606, 0.021465783938765526, -0.0020658858120441437, -0.035196319222450256, -0.048595890402793884, -0.0046686045825481415, 0.010561764240264893, 0.026185059919953346, -0.0056517841294407845, -0.03596732020378113, 0.041497644037008286, 0.05433662608265877, -0.01856227219104767, -0.022112339735031128, 0.017691174522042274, 0.02987314574420452, 0.010483275167644024, 0.0010931744473055005, 0.0033948400523513556, -0.04138308763504028, 0.01740824244916439, -0.01565633900463581, 0.019512124359607697, 0.03332020714879036, -0.03364025428891182, 0.03124324418604374, -0.015993302688002586, -0.04893605411052704, 0.0331389456987381, 0.026908788830041885, -0.01592801883816719]" ./train/goblet/n03443371_23436.JPEG,goblet,"[-0.0450693778693676, 0.026051582768559456, -0.011273087933659554, -0.004612727090716362, 0.051336947828531265, -0.013216470368206501, 0.014392076060175896, 0.011015099473297596, -0.018717005848884583, -0.015836771577596664, -0.002310379408299923, -0.02079358883202076, 0.02120416983962059, -0.0005253629642538726, 0.021807365119457245, -0.019508427008986473, 0.06271395087242126, 0.011877483688294888, 0.009828111156821251, -0.013848613947629929, -0.0863482728600502, 0.015184069983661175, 0.017531337216496468, -0.01033791247755289, -0.03383141756057739, 0.015041145496070385, 0.01334148459136486, 0.0014399205101653934, -0.007997835986316204, -0.012932848185300827, -0.015289055183529854, -0.005541784223169088, -0.002057566773146391, -0.024300776422023773, -0.0661306381225586, -0.007031149696558714, -0.026840917766094208, 0.003557239193469286, -0.04065132886171341, 0.1194201111793518, -0.007013827562332153, -0.036265913397073746, 0.0047331396490335464, 0.015683040022850037, 0.0031043689232319593, -0.20633500814437866, 0.033737726509571075, 0.014621341601014137, -0.024039356037974358, 0.03759230300784111, 0.015831131488084793, 0.033965662121772766, 0.005978048779070377, -0.02389931119978428, -0.00537845166400075, 0.03492855653166771, -0.03430918976664543, 0.00423333328217268, -0.03636736795306206, 0.042908404022455215, -0.10874161869287491, -0.02547948621213436, -0.024364778771996498, 0.031341467052698135, -0.008398297242820263, 0.02955131232738495, 0.012163094244897366, 0.02512572892010212, -0.050013042986392975, -0.01292337290942669, 0.03228900954127312, 0.007878576405346394, 0.010898315347731113, -0.008701249025762081, -0.0014603093732148409, -0.0008424217812716961, -0.04078318178653717, 0.0014914972707629204, -0.019806765019893646, -0.026248425245285034, 0.0021218573674559593, 0.02999367192387581, -0.012376389466226101, 0.018215926364064217, -0.016746781766414642, 0.03396837040781975, -0.02517206035554409, -0.014575181528925896, 0.04496555030345917, -0.027799835428595543, 0.009612669236958027, 0.0027614294085651636, -0.7173800468444824, -0.0274348184466362, -0.007359990384429693, 0.026286188513040543, 0.013173960149288177, -0.009503455832600594, 0.07242885231971741, 0.01050991378724575, 0.027220867574214935, 0.024348149076104164, -0.01098752859979868, 0.01407511718571186, 0.05840270221233368, 0.001415639417245984, -0.017436625435948372, 0.012870263308286667, 0.0051220497116446495, 0.00709189660847187, 0.018880153074860573, -0.04795565456151962, -0.017742769792675972, -0.010807122103869915, -0.00108752038795501, 0.009108232334256172, -0.041366130113601685, 0.009459569118916988, 0.027530763298273087, 0.019215751439332962, -0.010510931722819805, -0.02661438100039959, 0.004744222853332758, 0.0009174246224574745, -0.0009320468525402248, -0.03471081331372261, -0.023833515122532845, -0.007146263495087624, -0.007617878261953592, -0.010880173183977604, 0.014404197223484516, -0.049488965421915054, -0.0010189871536567807, 0.08316612243652344, -0.029551979154348373, 0.009831896051764488, -0.06924054026603699, -0.0377536416053772, -0.03559174761176109, 0.03002970479428768, 0.002483659889549017, -0.013840445317327976, 0.004324223846197128, 0.008318204432725906, -0.03424202650785446, 0.012555824592709541, -0.008093747310340405, -0.028794026002287865, -0.017921973019838333, 0.002308878116309643, -0.03191332519054413, 0.03171765059232712, 0.12232395261526108, -0.02484149858355522, -0.007515972480177879, -0.03679405897855759, 0.013894563540816307, -0.017507323995232582, 0.013584000989794731, 0.003463177476078272, 0.023071477189660072, -0.033012937754392624, -0.007412073202431202, -0.006781099829822779, 0.00851403921842575, 0.014661906287074089, 0.022028740495443344, 0.05579102784395218, 0.016933156177401543, -0.010906919836997986, 0.0005851716850884259, 0.02035493589937687, 0.005390392616391182, -0.03959072753787041, -0.03013661503791809, 0.005438574124127626, -0.00593242421746254, 0.008249256759881973, 0.06717400252819061, -0.018968455493450165, -0.0033083760645240545, 0.009401892311871052, -0.030761055648326874, 0.01995459757745266, -0.023758066818118095, 0.008123603649437428, -0.004113242961466312, 0.013915061950683594, -0.022298354655504227, -0.00769814383238554, 0.006891035009175539, 0.026604129001498222, -0.014415361918509007, 0.021858619526028633, 0.011352439410984516, -0.0020495534408837557, -0.018764054402709007, 0.01945323869585991, -0.0335264652967453, -0.016131462529301643, 0.005334461573511362, -0.007476193830370903, -0.010121837258338928, 0.07589273899793625, 0.031163055449724197, -0.02647918462753296, -0.004988713189959526, -0.036580074578523636, 0.008915044367313385, -0.017048073932528496, 0.007130960933864117, 0.05670205503702164, -0.009637076407670975, 0.009645320475101471, -0.010883106850087643, -0.03603203594684601, 0.019095320254564285, 0.02806927263736725, 0.028145287185907364, -0.007590717636048794, -0.01420249231159687, 0.10881469398736954, -0.029817748814821243, -0.001220441423356533, 0.031051313504576683, -0.005335794761776924, -0.003599446965381503, -0.025815261527895927, 0.008462746627628803, 0.03968670591711998, -0.0053945137187838554, 0.01480216532945633, 0.0010926647810265422, -0.03405842185020447, -0.013969499617815018, 0.00430659344419837, 0.0032144631259143353, -0.022041669115424156, -0.012180604971945286, 0.0229614470154047, -0.022311309352517128, -0.013416619040071964, -0.00524992635473609, -0.04730910435318947, -0.06812021136283875, -0.012057280167937279, 0.019572339951992035, 0.0561726875603199, -0.007547259796410799, 0.003966636024415493, -0.025202255696058273, 0.05503220856189728, 0.014153603464365005, -0.028796805068850517, 0.0008666121866554022, -0.01566237397491932, -0.04567994922399521, -0.020561572164297104, 0.045433610677719116, 0.02438913658261299, -0.01654728129506111, -0.009453271515667439, 0.009768183343112469, 0.11623306572437286, 0.03374321758747101, -0.03585967421531677, 0.04508034139871597, -0.015844136476516724, 0.021949108690023422, -0.007954437285661697, -0.015002492815256119, 0.04073600471019745, 0.007112074643373489, 0.01624183915555477, 0.0044084582477808, -0.014467321336269379, -0.02924872189760208, -0.00243549351580441, -0.014091014862060547, 0.009028198197484016, 0.00919333565980196, 0.0024487085174769163, -0.018226079642772675, 0.008161970414221287, -0.016929294914007187, 0.020739344879984856, 4.6584995288867503e-05, -0.033954229205846786, -0.006923758890479803, -0.024338465183973312, 0.008660538122057915, 0.006495265290141106, 0.02065705507993698, 0.0184819083660841, -0.008339585736393929, 0.03148413822054863, 0.00903349369764328, 0.010828607715666294, 0.00843160692602396, 0.02190445177257061, -0.007140041794627905, -0.01381033193320036, -0.01730462536215782, -0.004819685593247414, 0.009951588697731495, -0.006120194680988789, 0.027672717347741127, 0.007106506731361151, 0.022502729669213295, -0.010783078148961067, 0.012223144061863422, 0.02403508499264717, 0.08287612348794937, -0.011503968387842178, 0.012934982776641846, 0.0150303915143013, 0.034776344895362854, 0.027400635182857513, -0.006329878233373165, 0.011645428836345673, 0.007158591412007809, 0.06699299067258835, -0.006553455255925655, -0.0006859868881292641, -0.023569121956825256, -0.00273873470723629, -0.007859303615987301, -0.018198231235146523, 0.013318341225385666, 0.03744081035256386, -0.02036813646554947, -0.021545540541410446, -0.025105781853199005, -0.0024068127386271954, -0.017739254981279373, -0.008475128561258316, 0.018337862566113472, -0.036029331386089325, 0.025434494018554688, -0.00815065111964941, -0.006099841091781855, -0.00821267906576395, -0.02378297969698906, -0.023019855841994286, 0.009382009506225586, -0.007652125786989927, 0.018785107880830765, 0.032961729913949966, 0.006802116520702839, 0.0362110361456871, 0.005134968087077141, 0.007607544306665659, 0.025006791576743126, -0.01591102033853531, -0.012752220034599304, -0.065269336104393, 0.0018706588307395577, -0.003803504630923271, -0.009084692224860191, 0.00037032036925666034, -0.076507069170475, 0.017653578892350197, 0.024114226922392845, -0.00026644766330718994, -0.04021038860082626, 0.028058715164661407, 0.01363515853881836, 0.04767134040594101, 0.009329589083790779, 0.027970848605036736, 0.0037665616255253553, 0.020433582365512848, -0.02149498090147972, -0.03009486198425293, 0.002129683271050453, -0.003622649470344186, 0.08722662925720215, 0.028513368219137192, -0.021675879135727882, 0.01502162218093872, -0.020759927108883858, -0.11595480144023895, -0.013393406756222248, 0.00512614194303751, 0.04741282761096954, 0.004215894266963005, 0.021742405369877815, 0.030992640182375908, -0.008876916952431202, 0.1317841112613678, 0.044354647397994995, -0.03919599950313568, -0.008899730630218983, -0.05711458995938301, -0.00541232293471694, 0.005394771695137024, 0.0038069903384894133, -0.02015388198196888, -0.00613227067515254, 0.0011034916387870908, 0.01815151236951351, 0.011869950219988823, 0.08880682289600372, -0.007991858758032322, -0.01638924889266491, 0.04047464579343796, 0.007091899868100882, -0.015105255879461765, 0.0478583462536335, -0.021068647503852844, 0.004018048755824566, -0.01439423393458128, -0.028858773410320282, 0.014294810593128204, -0.013186908327043056, -0.004431215580552816, 0.005063132848590612, 0.013644028455018997, -0.042017612606287, 0.00512951472774148, -0.03249335289001465, -0.0013568061403930187, 0.006385552231222391, 0.009628547355532646, -0.027160244062542915, 0.001133912825025618, 0.01744295470416546, -0.008811643347144127, -0.05358314514160156, 0.007897076196968555, 0.016996657475829124, 0.02477976121008396, 0.06862599402666092, -0.023385103791952133, -0.004563448019325733, -0.02020745351910591, -0.01019154954701662, -0.014394866302609444, 0.02286757156252861, 0.0031634073238819838, -0.003964697476476431, -0.028000516816973686, 0.02393963560461998, 0.003516004653647542, 0.0007622449193149805, -0.01302761398255825, 0.003880575532093644, 0.027136949822306633, -0.017619287595152855, 0.04297330975532532, 0.019109144806861877, -0.030007779598236084, 0.024668268859386444, -0.032572779804468155, -0.021478772163391113, -0.007599030155688524, 0.005762042012065649, -0.02210739068686962, -0.016464784741401672, -0.02309875749051571, 0.01822495460510254, -0.03991216793656349, -0.039915163069963455, -0.03492704778909683, -0.01594385877251625, 0.012651434168219566, 0.0450420118868351, -0.02668105997145176, -0.00010275862587150186, -0.0338837094604969, -0.04822969064116478, 0.025651004165410995, 0.031401749700307846, -0.051161643117666245, -0.016384201124310493, -0.03474261611700058, 0.013979857787489891, -0.04410014674067497, -0.007728576194494963, -0.016532909125089645, 0.008176074363291264, 0.03893687576055527, 0.0009154184954240918, 0.023845257237553596, -0.025023428723216057, -0.05378835275769234, -0.01852780021727085, 0.01491010095924139, -0.0032581358682364225, -0.014522546902298927, 0.006931892596185207, 0.013538351282477379, 0.030108368024230003, -0.06374421715736389, 0.020448071882128716, 0.010085254907608032, 0.0014871408930048347, -0.013971978798508644, 0.0006017365376465023, -0.025009088218212128, -0.019770434126257896, 0.014097071252763271, -0.022446902468800545, 0.00948405172675848, 0.05010519176721573, -0.03902936726808548, 0.04011968895792961, -0.012248233892023563, -0.05921133607625961, 0.0744318813085556, 0.026572508737444878, 0.019097277894616127]" ./train/goblet/n03443371_3723.JPEG,goblet,"[-0.041451480239629745, 0.06275096535682678, 0.003666272386908531, -0.012515930458903313, 0.06693916022777557, 0.010274271480739117, 0.06305275857448578, 0.005715062841773033, -0.02271636389195919, 0.003843697952106595, 0.024247216060757637, -0.0027656767051666975, -0.08397912979125977, -0.016750657930970192, 0.019626274704933167, 0.0010954680619761348, 0.024378202855587006, 0.004881994798779488, -0.012088008224964142, -0.03545401990413666, -0.011390571482479572, -0.022648435086011887, 0.009801778011023998, 0.020760763436555862, 0.0028027198277413845, 0.06609372794628143, 0.007925505749881268, -0.015856929123401642, -0.014932023361325264, -0.03160877525806427, -0.0009009240311570466, 0.0004267621843609959, -0.013800772838294506, -0.08866265416145325, -0.010233446955680847, 0.0381430983543396, 0.01681937463581562, 0.016378020867705345, 0.060306012630462646, 0.073499895632267, 0.02028653956949711, -0.0023604563903063536, -0.02247558906674385, 0.006281455047428608, 0.010150597430765629, -0.21192742884159088, 0.042086079716682434, 0.006313384510576725, -0.007017321418970823, 0.045925550162792206, -0.0037817980628460646, 0.049470435827970505, 0.010083876550197601, -0.07111269980669022, -0.02304978109896183, -0.01789618656039238, -0.08148841559886932, 0.026349421590566635, 0.024961968883872032, 0.06179536506533623, -0.006739888805896044, -0.010925906710326672, 0.015125089325010777, 0.016493018716573715, -0.016891224309802055, 0.05593133345246315, -0.030779648572206497, 0.03383534029126167, -0.01684938557446003, -0.007938885129988194, 0.008440244942903519, -0.0061247278936207294, 0.017746159806847572, 0.011919854208827019, -0.01017051562666893, 0.030570952221751213, -0.019010575488209724, 0.002924154745414853, 0.04184061288833618, -0.05170923098921776, -0.00687211100012064, -0.024419063702225685, 0.005675048101693392, -0.07153145223855972, -0.013992330990731716, 0.019362416118383408, -0.05296031013131142, 0.00957806222140789, 0.007088512182235718, -0.02208050526678562, -0.01049611996859312, -0.010390673764050007, -0.6043848991394043, 0.044261347502470016, -0.036040354520082474, -0.004407272208482027, 0.0045515308156609535, 0.022054169327020645, -0.031805653125047684, 0.03760959953069687, 0.014717931859195232, -0.0008330612326972187, -0.008732324466109276, 0.036322418600320816, -0.0026848625857383013, -0.028829624876379967, -0.1209883987903595, 0.033312998712062836, -7.224955334095284e-05, 0.016344236209988594, 0.03550795093178749, 0.015588609501719475, 0.019546207040548325, 0.005509954411536455, 0.007614925038069487, -0.037628769874572754, -0.024319937452673912, -0.006174183916300535, 0.050938189029693604, -0.017527498304843903, 0.014644698239862919, -0.04653145372867584, 0.04589454457163811, -0.0046073137782514095, -0.012311062775552273, 0.052229609340429306, -0.010167370550334454, -0.009520485065877438, -0.019718516618013382, -0.03190283104777336, -0.009703935123980045, 0.00795700028538704, 0.03114362061023712, 0.08402567356824875, 0.006155792158097029, 0.03200117498636246, -0.011381999589502811, -0.05129179358482361, -0.008808929473161697, 0.029820209369063377, 0.008996177464723587, 0.0069000329822301865, -0.03327018395066261, -0.00893966294825077, -0.02487650141119957, -0.023526694625616074, 0.0012938663130626082, -0.0395917072892189, -0.007653333712369204, -0.006322951056063175, -0.03435295447707176, 0.005222581326961517, 0.024966832250356674, -0.0007299418793991208, 0.005546835251152515, -0.02058597467839718, 0.02061559073626995, -0.02635858580470085, 0.05869535729289055, -0.004673316143453121, -0.032184403389692307, 0.005829344969242811, 0.007632487919181585, -0.010634691454470158, -0.012624043971300125, -0.021373383700847626, -0.011759922839701176, 0.04464130476117134, -0.019552472978830338, -0.03761410340666771, -0.00637883460149169, 0.008655703626573086, -0.011276555247604847, -0.0015091401292011142, -0.016205357387661934, 0.04520750790834427, 0.010685007087886333, -0.009371221996843815, -0.004379487596452236, -0.0025594362523406744, 0.059133488684892654, -0.04412393644452095, 0.0065293340012431145, -0.0522523894906044, 0.013535077683627605, -0.004736109636723995, 0.02333916164934635, 0.03744576498866081, 0.0067673334851861, 0.01291376817971468, 0.015848321840167046, -0.013472343795001507, 0.008157871663570404, -0.023035356774926186, -0.014780005440115929, 0.04098017141222954, 0.027946259826421738, -0.008404248394072056, 0.03809377923607826, -0.0047579919919371605, 0.0031725438311696053, 0.03830341249704361, 0.03693928197026253, 0.0054396954365074635, 0.021051159128546715, 0.013480735011398792, 0.005249266512691975, 0.014134140685200691, -0.010640760883688927, 0.007817727513611317, -0.014375055208802223, 0.055955905467271805, -0.02020670473575592, -0.03317209705710411, -0.007328273728489876, -0.015266165137290955, 0.06368862837553024, -0.008132576942443848, -0.02339678630232811, -0.05652192607522011, -0.024764901027083397, 0.053545866161584854, -0.020327957347035408, 0.001339890412054956, -0.004808108787983656, -0.04065655916929245, -0.013217017985880375, 0.028638366609811783, 0.003908264916390181, 0.007818852551281452, -0.07061048597097397, -0.010736122727394104, -0.052255429327487946, 0.06640522181987762, -0.004638635087758303, 0.04483392834663391, -0.03230078145861626, -0.03854016214609146, -0.047904014587402344, -0.025304343551397324, 0.02079826034605503, 0.017993899062275887, 0.019157791510224342, 0.015989292412996292, -0.061935629695653915, 0.024425668641924858, -0.008594841696321964, 0.07920954376459122, -0.01597949117422104, 0.03261220455169678, 0.0070608630776405334, 0.04723301902413368, -0.03797447681427002, -0.029547322541475296, -0.01640673354268074, 0.013070604763925076, -0.027496928349137306, 0.00656296219676733, -0.07937401533126831, 0.014711614698171616, 0.022749416530132294, -0.0032626185566186905, 0.016294974833726883, -0.034523606300354004, 0.012639068067073822, -0.03539297729730606, 0.0017996104434132576, 0.031537916511297226, 0.06898724287748337, -0.044532377272844315, -0.042424410581588745, 0.01859099417924881, 0.008300062268972397, 0.009624714031815529, -0.0025508615653961897, -0.03198092803359032, -0.04285772889852524, -0.0030312174931168556, -0.033646706491708755, -0.0413617379963398, -0.014826908707618713, 0.0008928499300964177, -0.045306626707315445, 0.004243860021233559, -0.006291388534009457, 0.032129596918821335, 0.004158386029303074, 0.031930211931467056, 0.012923323549330235, -0.014907401986420155, 0.04785533249378204, 0.003320826683193445, -0.0025315473321825266, -0.006110444664955139, -0.021206026896834373, -0.02809860371053219, -0.03948628902435303, 0.06158597767353058, -0.0165981687605381, -0.011792288161814213, -0.015156115405261517, -0.005384813062846661, -0.0022869068197906017, 0.012586209923028946, -0.014046681113541126, -0.03567557781934738, -0.006288827396929264, 0.011004878208041191, -0.019671835005283356, 0.02049729786813259, -0.036038078367710114, 0.010859272442758083, 0.08373844623565674, -0.0367981418967247, 0.004131792113184929, -0.005607434082776308, -0.02904846891760826, 0.01771189644932747, 0.012886841781437397, -0.10452564060688019, 0.032873377203941345, 0.18924470245838165, -0.023024186491966248, -0.019203370437026024, -0.027247780933976173, -0.02822575904428959, -0.0010263919830322266, 0.017117485404014587, -0.007107362151145935, -0.011241168715059757, 0.022433746606111526, -0.03792320564389229, -0.019151980057358742, -0.012613366357982159, -0.014891405589878559, -0.011341308243572712, -0.008639136329293251, 0.04089749604463577, -0.04287142679095268, -0.003914445172995329, -0.026344647631049156, 0.04981907829642296, 0.027057666331529617, 0.02300410345196724, 0.021317018195986748, -0.0051937769167125225, 0.004613031167536974, 0.015928391367197037, -0.06738513708114624, 0.0074192071333527565, -0.051763612776994705, -0.011197863146662712, 0.06413094699382782, -0.024994725361466408, -0.013844594359397888, -0.09476592391729355, -0.026900460943579674, -0.0421404093503952, -0.009446174837648869, 0.031431861221790314, -0.02966674230992794, 0.003387612523511052, -0.007077881600707769, 0.0036955534014850855, -0.023496706038713455, 0.024000510573387146, 0.04050394520163536, 0.0004466311656869948, 0.027288416400551796, 0.0379023551940918, 0.029924193397164345, 0.02302050217986107, 0.003265014849603176, 0.0090060168877244, 0.014215170405805111, -0.06002206355333328, 0.12751421332359314, 0.008943845517933369, 0.010300720110535622, 0.0028076476883143187, -0.05285269394516945, -0.03625168278813362, 0.006571970880031586, 0.0035367014352232218, -0.0017476144712418318, 0.02004966326057911, 0.008170437067747116, -0.028644628822803497, 0.008803650736808777, 0.08140051364898682, -0.03289364278316498, -0.01654098369181156, 0.011744965799152851, 0.011527876369655132, 0.016288092359900475, -0.008060410618782043, -0.017681285738945007, -0.06015137955546379, 0.06403293460607529, 0.013071696273982525, 0.021164454519748688, 0.012725048698484898, 0.06123097240924835, 0.00010308739001629874, 0.026185642927885056, -0.001045987824909389, -0.0007381107425317168, -0.005598518066108227, -0.007223828695714474, -0.009017293341457844, 0.010269815102219582, 0.03530856966972351, 0.008160430938005447, -0.03353528305888176, -0.01774066500365734, 0.02347235381603241, 0.011533311568200588, 0.01411930751055479, -0.004304466303437948, 0.0013410351239144802, -0.015372183173894882, -0.0007958807982504368, 0.0071602254174649715, 0.003743996610864997, -0.011253572069108486, -0.029737090691924095, -0.0182261373847723, -0.013513149693608284, -0.03593809902667999, 0.014003091491758823, 0.01340735238045454, 0.04025959596037865, 0.15659426152706146, -0.031475409865379333, -0.062489770352840424, -0.051970332860946655, -0.023422835394740105, -0.026634015142917633, 0.023679643869400024, 0.01973326876759529, -0.004933615680783987, -0.005203733686357737, 0.0069068255834281445, 0.0344415120780468, -0.03613968938589096, -0.013577512465417385, 0.0027822854463011026, 0.017513494938611984, -0.06726958602666855, -0.005522304214537144, 0.06770096719264984, 0.007590430788695812, 0.011233814992010593, -0.08716577291488647, -0.01743188127875328, 0.046410709619522095, 0.018756980076432228, -0.04283395782113075, 0.004687910433858633, -0.08112380653619766, 0.03558903560042381, -0.026587318629026413, 0.00895662885159254, -0.02696133777499199, 0.008771877735853195, 0.037004586309194565, 0.054659780114889145, 0.011460796929895878, -0.03777426853775978, -0.018994327634572983, -0.02745751664042473, 0.023216675966978073, -0.005941522307693958, -0.10739582777023315, -0.056986648589372635, -0.03197250887751579, 0.028108904138207436, -0.0018656711326912045, -0.019808243960142136, -0.028641793876886368, -0.00882772821933031, 0.027361081913113594, 0.041019123047590256, -0.02075396105647087, 0.04725489765405655, -0.04141208529472351, -0.00491592101752758, -0.0019225807627663016, 0.02832700125873089, -0.019318759441375732, -0.01882440783083439, -0.02853354439139366, 0.04020074009895325, -0.0769212543964386, -0.04673897847533226, 0.03695785254240036, -0.009633722715079784, 0.0007553813047707081, -0.025996796786785126, 0.0023053032346069813, 0.03175058588385582, -0.050853319466114044, 0.03504067659378052, -0.008562460541725159, -0.002904046094045043, -0.04490545392036438, -0.0055974069982767105, 0.00169001251924783, 0.020141568034887314, 0.08174078911542892, 0.015603305771946907, -0.06346993148326874]" ./train/goblet/n03443371_3288.JPEG,goblet,"[-0.046873725950717926, 0.0412035696208477, 0.013411620631814003, 0.008293306455016136, 0.0683324933052063, -0.008502302691340446, 0.0686645582318306, -0.0022201668471097946, -0.02574271708726883, 0.031031470745801926, 0.016379281878471375, -0.011057370342314243, 0.008068224415183067, -0.035314030945301056, 0.014749070629477501, 0.020932061597704887, 0.06709899753332138, 0.02228245697915554, -0.00360353896394372, -0.021124495193362236, -0.037232477217912674, 0.01575087010860443, -0.013119564391672611, -0.03336254507303238, -0.007841899059712887, 0.01416188757866621, 0.021767212077975273, 0.007983124814927578, -0.007468965370208025, -0.005452136974781752, 0.0029595012310892344, 0.0035943740513175726, -0.0018923281459137797, -0.007539436686784029, 0.0021122219040989876, -0.0064241476356983185, 0.004639983642846346, -0.024686409160494804, 0.018319865688681602, 0.02843533083796501, -0.02181597240269184, -0.005688314791768789, -0.023849697783589363, -0.01175260916352272, -0.004258601926267147, -0.1445077359676361, 0.046256326138973236, -0.01667376421391964, 0.015578333288431168, 0.021407142281532288, -0.02093168906867504, 0.02647949382662773, -0.01901114545762539, -0.08434242010116577, -0.031546059995889664, -0.0648709312081337, -0.06260571628808975, 0.013857903890311718, 0.0448756143450737, 0.028855375945568085, 0.01435663178563118, -0.009958487004041672, 0.011666318401694298, -0.019031498581171036, -0.01906180940568447, 0.045643776655197144, -0.040689900517463684, -0.016209110617637634, -0.01200071070343256, -0.0018293112516403198, 0.013508817180991173, -0.007825857028365135, 0.002417860319837928, 0.0385957695543766, -0.0065691410563886166, 0.008232972584664822, 0.015923067927360535, -0.013995892368257046, 0.010461539030075073, -0.07667118310928345, -0.0019302497385069728, -0.040587183088064194, -0.004630390089005232, -0.059771209955215454, -0.05155437812209129, 0.023111289367079735, -0.027893219143152237, 0.003947890363633633, 0.007216912228614092, -0.006653216667473316, -0.004143164027482271, -0.04356279596686363, -0.6053082346916199, 0.03355173394083977, -0.0333855003118515, 0.03662736341357231, 0.03511342033743858, 0.04666009917855263, -0.032030172646045685, 0.04971126466989517, 0.03967380151152611, -0.058590054512023926, 0.014189674519002438, 0.013155288994312286, 0.025083603337407112, -0.0451403446495533, -0.09702517837285995, 0.015084133483469486, 0.019115954637527466, 0.011273302137851715, 0.05810706317424774, -0.00897097960114479, 0.017218472436070442, 0.04301881045103073, -0.03303040564060211, -0.013725059106945992, -0.027747564017772675, -0.015835754573345184, -0.004904297646135092, 0.023017609491944313, 0.01890604756772518, -0.037887539714574814, -0.03856268152594566, 0.025956686586141586, 0.006705945823341608, 0.031504202634096146, -0.051655422896146774, 0.016713978722691536, -0.02194114401936531, -0.05262841284275055, -0.03322209045290947, -0.04119255393743515, 0.0028998879715800285, 0.08385057747364044, 0.038385726511478424, 0.02886301279067993, 0.0015462483279407024, -0.04322602599859238, -0.03883127495646477, 0.011282073333859444, -0.016979753971099854, 0.04777950048446655, -0.020136874169111252, 0.03284775838255882, -0.03239816054701805, -0.039194412529468536, -0.008849456906318665, -0.04372195526957512, -0.0036784494295716286, -0.033035341650247574, -0.002356137614697218, -0.043208032846450806, 0.042773377150297165, -0.05509692057967186, 0.008009339682757854, -0.03670039772987366, -0.029855066910386086, -0.010770192369818687, 0.06640372425317764, -0.019077029079198837, -0.024089602753520012, -0.012012407183647156, 0.007844649255275726, -0.0600573755800724, 0.02575831301510334, -0.023431070148944855, 0.005030307453125715, 0.01978394202888012, -0.003025243291631341, 0.013800645247101784, -0.02509206347167492, 0.0004908727132715285, -0.02287818118929863, 0.008347547613084316, -0.03833213448524475, 0.005182437598705292, 0.033653151243925095, -0.020850112661719322, -0.009660043753683567, 0.013560153543949127, 0.05559349060058594, -0.055522557348012924, 0.01856948994100094, -0.055370137095451355, -0.021744288504123688, 0.009683363139629364, 0.04356871917843819, 0.029828574508428574, 0.00780340563505888, 0.015603210777044296, 0.02528502605855465, -0.017939062789082527, 0.014013913460075855, 0.01078028418123722, 0.02697344496846199, 0.006809387821704149, -0.04026764631271362, -0.057238586246967316, -0.004178328439593315, -0.01729593425989151, -0.040323227643966675, -0.008909559808671474, 0.003417960135266185, 0.02492784895002842, 0.00041670689824968576, 0.005574213340878487, 0.008942407555878162, 0.01778205670416355, -0.04604800045490265, 0.030023762956261635, -0.04072440788149834, 0.09660405665636063, -0.03629263490438461, 0.009914676658809185, 0.01874769851565361, 0.022520119324326515, 0.011266079731285572, -0.014629955403506756, 0.01977774314582348, 0.014867274090647697, -0.005375949665904045, -0.01675255596637726, 0.005121584050357342, 0.025320863351225853, -0.0022564223036170006, -0.025069046765565872, -0.0090103130787611, 0.03274066373705864, 0.020809831097722054, 0.008717947639524937, -0.06950836628675461, 0.0023289998061954975, -0.04318282753229141, 0.05803251639008522, 0.01481084804981947, -0.006685869302600622, 0.018666857853531837, -0.015637263655662537, -0.01871759258210659, -0.011336324736475945, 0.001200420898385346, -0.003122311318293214, 0.004955333657562733, 0.03516973927617073, -0.05593569949269295, 0.04114864021539688, -0.00161809625569731, 0.06246775761246681, 0.01181778497993946, 0.11030513048171997, 0.0034957348834723234, 0.018500352278351784, -0.02865765616297722, -0.010393792763352394, 0.011425563134253025, -0.006813430693000555, 0.0006497575086541474, 0.03865571320056915, -0.11090493202209473, 0.008945110253989697, 0.018405016511678696, -0.011510091833770275, -0.0039896597154438496, -0.06299443542957306, 0.028302764520049095, -0.024925146251916885, 0.00864992942661047, 0.009182718582451344, 0.03897314891219139, -0.0034012228716164827, -0.0380118191242218, 0.016036953777074814, 0.023771028965711594, -0.03980144113302231, 0.03187740966677666, 0.027178483083844185, -0.03522554785013199, -0.0050838361494243145, 0.02950689010322094, -0.04299061745405197, -0.004640884231775999, 0.006727018393576145, -0.05365951731801033, 0.03696710988879204, 0.004697414115071297, 0.022651562467217445, 0.042604800313711166, 0.043255411088466644, -0.01665526255965233, -0.014128921553492546, 0.03555602207779884, -0.07278241217136383, -0.0588565468788147, 0.024815160781145096, 0.0009274664334952831, -0.011666672304272652, -0.004532822873443365, 0.0444452166557312, -0.008351074531674385, 0.0004580951645039022, -0.006581701338291168, -0.01807430200278759, 0.01902662217617035, 0.057208914309740067, -0.0117869907990098, -0.03661017864942551, -0.021824972704052925, 0.03353404998779297, -0.03600609302520752, 0.002791299019008875, 0.0008902153349481523, 0.021189702674746513, 0.08357992768287659, -0.008838496170938015, 0.03395305946469307, -0.028878208249807358, 0.01623876765370369, 0.02318771928548813, 0.010755039751529694, -0.07014548033475876, 0.04296119138598442, 0.22695060074329376, -0.016853781417012215, -0.03222811967134476, -0.00816247146576643, 0.006006444804370403, -0.042462557554244995, -0.0013235779479146004, -0.04083504155278206, -0.014509666711091995, 0.048826880753040314, -0.014365553855895996, -0.01752682775259018, 0.007849274203181267, -0.051817744970321655, -0.02280469983816147, -0.01383714098483324, 0.010541049763560295, -0.05946347117424011, 0.03734872490167618, -0.004722108598798513, 0.010395524092018604, -0.003258866723626852, 0.02650073543190956, 0.003092443337664008, 0.014764086343348026, 0.012380245141685009, 0.03214340656995773, -0.04080691188573837, -0.01801416091620922, -0.0030963674653321505, 0.024342872202396393, 0.046248845756053925, 0.02026394009590149, -0.023232808336615562, -0.056493669748306274, -0.029704030603170395, -0.04567795246839523, -0.03456678241491318, 0.0011498639360070229, 0.02285108156502247, 0.02749996818602085, 0.014248397201299667, -0.04012507572770119, -0.055329762399196625, -0.010143532417714596, 0.049028292298316956, 0.02670951746404171, 0.03775618597865105, 0.04473511129617691, 0.030899446457624435, 0.0383734330534935, -0.02170209027826786, 0.019492749124765396, 0.03471524268388748, -0.03352102264761925, 0.04734884575009346, 0.0012819495750591159, 0.03495410829782486, 0.01836007460951805, -0.019765086472034454, -0.0669863298535347, -0.008100992999970913, -0.025935150682926178, 0.010932144708931446, 0.02315923385322094, 0.007516043726354837, -0.04027082771062851, -0.032076045870780945, 0.008620730601251125, -0.02582418918609619, -0.017947189509868622, -0.02706657350063324, 0.0033504655584692955, -0.048033978790044785, 0.013288386166095734, 0.00042945114546455443, -0.021861888468265533, 0.08186303824186325, 0.01712052896618843, -0.0066061560064554214, 0.024758052080869675, 0.16283537447452545, 0.0003379285626579076, 0.01138264499604702, -0.027491478249430656, 0.02914912812411785, -0.009006581269204617, -0.03415174037218094, 0.01100600603967905, 0.02423836663365364, -0.010180204175412655, -0.0006184665253385901, -0.060977160930633545, -0.04211442917585373, 0.011490992270410061, 0.060853809118270874, 0.004127005115151405, -0.020950503647327423, 0.01340620405972004, -0.01105630211532116, 0.02059962972998619, -0.005379802081733942, 0.057878583669662476, -0.0002338500926271081, -0.010130347684025764, -0.0007476132013835013, -0.059408560395240784, -0.0027803455013781786, -0.0005618092254735529, 0.05637839064002037, 0.034111522138118744, 0.14340655505657196, -0.008389269933104515, -0.058160003274679184, -0.08111080527305603, -0.028354551643133163, -0.009816658683121204, 0.05078884959220886, 0.019140666350722313, 0.014909784309566021, -0.005661912262439728, -0.004251896403729916, 0.04528220742940903, -0.024827592074871063, 0.008664125576615334, 0.01625676266849041, 0.016022639349102974, -0.03371687978506088, 0.027634840458631516, 0.011385566554963589, -0.010384122841060162, 0.004245727322995663, -0.06751574575901031, -0.0067808665335178375, 0.030789896845817566, 0.021152619272470474, -0.03012799844145775, -0.013428661972284317, 0.012127386406064034, 0.017986811697483063, -0.0021145292557775974, 0.016535287722945213, -0.007382866460829973, 0.0339084193110466, 0.02797938883304596, 0.053788717836141586, 0.04816074296832085, -0.010149429552257061, -0.009753563441336155, -0.02950732409954071, 0.026446614414453506, 0.005336944479495287, -0.0880170539021492, -0.02823486365377903, -0.037076279520988464, 0.033956337720155716, -0.009253001771867275, 0.036828093230724335, -0.06347361952066422, -0.00311260181479156, -0.006597628351300955, 0.012488046661019325, 0.006931119132786989, -0.006715266965329647, -0.03778010234236717, -0.026747548952698708, 0.025031020864844322, 0.008564474061131477, -0.015601607970893383, -0.010270051658153534, -0.009326214902102947, -0.040117282420396805, -0.05377313122153282, -0.015266649425029755, -0.010400534607470036, 0.0195078793913126, -0.009032059460878372, 0.00731195043772459, -0.020536309108138084, 0.030497431755065918, -0.0190886203199625, -0.001174507662653923, 0.03595895692706108, 0.04732412099838257, -0.053244397044181824, -0.004908464848995209, 0.0029819225892424583, 0.022219659760594368, 0.08468396961688995, 0.019403284415602684, -0.021090466529130936]" ./train/goblet/n03443371_7195.JPEG,goblet,"[-0.033952757716178894, 0.01261652261018753, 0.02382134646177292, -0.006991518195718527, 0.056084875017404556, -0.005065521690994501, 0.032327692955732346, -0.006482609547674656, 0.03162644803524017, 0.02745973877608776, 0.033557407557964325, -0.03609459847211838, 0.0008708821260370314, -0.027236120775341988, 0.05092950165271759, 0.003881639800965786, 0.0577484630048275, 0.016363538801670074, 0.011358005926012993, -0.024755647405982018, -0.031855881214141846, -0.008517827838659286, 0.011690560728311539, -0.02038702182471752, -0.04513932019472122, 0.03893516585230827, -0.006774191278964281, 0.0064440276473760605, 0.004103925544768572, 0.0009017104166559875, 0.031142478808760643, 0.01766049861907959, -0.02580832690000534, -0.031801436096429825, -0.015450787730515003, -0.025617467239499092, 0.002848057309165597, 0.0029084954876452684, 0.0032555798534303904, 0.13108213245868683, -0.0030163628980517387, -0.021829234436154366, 0.01959858275949955, 0.03662032634019852, -0.006077121011912823, -0.22821727395057678, -0.027237186208367348, 0.010501505807042122, 0.051232948899269104, -0.0016396930441260338, -0.03709123283624649, -0.019917739555239677, -0.006934762001037598, -0.04187943413853645, 0.003115937812253833, -0.012292908504605293, -0.07058705389499664, -0.016646455973386765, 0.030477482825517654, 0.030519183725118637, 0.05503031611442566, -0.05753234773874283, 0.035680051892995834, 0.012737180106341839, 0.01640806719660759, 0.04630456492304802, 0.017194457352161407, -0.06496031582355499, -0.019139602780342102, -0.0005162483430467546, 0.01100117340683937, -0.001981424866244197, 0.025393608957529068, -0.04886157438158989, -0.007137947250157595, -0.02821614220738411, -0.04398563876748085, -0.005422811955213547, -0.010393112897872925, -0.019796838983893394, -0.008775564841926098, -0.006942912936210632, 0.029341192916035652, -0.03837842866778374, 0.0033521500881761312, -5.695162144547794e-06, -0.03928309679031372, 0.0003123455389868468, 0.01925196312367916, 0.025113394483923912, 0.009013096801936626, 0.022281408309936523, -0.5497124791145325, -0.008609120734035969, -0.0070699783973395824, 0.01854453794658184, 0.0038628370966762304, 0.037230152636766434, 0.028961101546883583, 0.07804080098867416, 0.036342840641736984, -0.03172999620437622, -0.03557106480002403, 0.043819278478622437, 0.006683479994535446, -0.039581842720508575, 0.06327176094055176, 0.0013225909788161516, 0.014734475873410702, 0.009610984474420547, 0.005775575526058674, 0.002673529088497162, -0.0016522961668670177, 0.05358830466866493, 0.007920186966657639, 0.03380070626735687, -0.02245737612247467, 0.020017031580209732, 0.007171499542891979, 0.04414624348282814, 0.00047972812899388373, -0.044637493789196014, 0.013069596141576767, -0.03219662979245186, -0.013749901205301285, 0.02899683453142643, 0.016156964004039764, 0.04509522765874863, 0.028596127405762672, -0.03259091451764107, 0.04169273003935814, 0.004961168393492699, -0.0266093909740448, 0.07019463181495667, 0.05623894929885864, -0.018356336280703545, 0.01358977984637022, -0.010097230784595013, -0.029177598655223846, 0.01864347606897354, -0.013191748410463333, 0.04373209923505783, -0.011364680714905262, 0.01831134222447872, -0.04084279388189316, 0.01621222123503685, -0.025001194328069687, -0.02608349919319153, -0.03932633623480797, 0.019803838804364204, 0.028403468430042267, 0.006579534150660038, 0.10195469856262207, -0.04962700977921486, -0.008813316933810711, -0.04596458375453949, -0.007947138510644436, 0.014999175444245338, 0.03930451348423958, -0.024188213050365448, 0.02582581341266632, -0.0006808338803239167, -0.021495243534445763, -0.0354771688580513, -0.03752174973487854, 0.014655675739049911, -0.00529523054137826, 0.01379832811653614, -0.031030062586069107, -0.013558197766542435, 0.02574802003800869, 0.011878200806677341, 0.006061570253223181, -0.020219184458255768, -0.02936810813844204, 0.0031340466812253, 0.06406693160533905, -0.001044894102960825, 0.068085677921772, -0.003545207902789116, 0.025642983615398407, 0.012522675096988678, 0.006451682653278112, 0.0034428334329277277, -0.04862025007605553, 0.029468923807144165, 0.0018237995682284236, 0.02885921113193035, -0.012071030214428902, 0.011674919165670872, 0.004733305424451828, -0.04235570877790451, 0.026189876720309258, 0.002682517981156707, 0.02621605060994625, 0.027017682790756226, 0.05501992627978325, -0.013997666537761688, -0.020859356969594955, 0.010261764749884605, 0.0034270337782800198, 0.00010918197949649766, 0.008441473357379436, 0.01815013587474823, -0.008631066419184208, 0.017888393253087997, 0.0004987418651580811, -0.017817819491028786, -0.05243845283985138, -0.02108857035636902, -0.0018376231892034411, 0.10153932124376297, -0.015583845786750317, 0.036157604306936264, -0.0199885331094265, -0.0012511992827057838, 0.007288200780749321, 0.03724776580929756, 0.048272594809532166, 0.00824726466089487, -0.002362726256251335, -0.007240203209221363, -0.013780465349555016, -0.022367091849446297, 0.011752739548683167, -0.028727268800139427, -0.009548152796924114, 0.009053999558091164, -0.0431484654545784, -0.021874774247407913, 0.009336203336715698, -0.0023642857559025288, -0.05194401368498802, 0.006792452186346054, -0.02149130590260029, 0.08147866278886795, -0.004739328753203154, -0.03529772534966469, 0.005103396251797676, 0.002878934610635042, -0.027374496683478355, -0.051745932549238205, 0.010851125232875347, -0.043929629027843475, -0.042745091021060944, 0.0033573301043361425, 0.013942408375442028, 0.06833168119192123, 0.005312433000653982, 0.036422938108444214, -0.034082699567079544, 0.013229042291641235, -0.04535447806119919, -0.05392124876379967, -0.025137843564152718, -0.01914353109896183, -0.07524338364601135, -0.03246813267469406, -0.07731825858354568, 0.027255814522504807, -0.017948167398571968, -0.006228964310139418, -0.009534131735563278, -0.044965919107198715, -0.004079227801412344, -0.007507698610424995, -0.009503798559308052, -0.04487277939915657, 0.03571953624486923, 0.016622183844447136, -0.029474221169948578, -0.006609996780753136, 0.06590208411216736, -0.031322140246629715, 0.015502707101404667, 0.0017470089951530099, -0.021391086280345917, -0.008979757316410542, -0.04949318245053291, -0.024219438433647156, 0.010774423368275166, 0.00021215011656749994, 0.00076896051177755, 0.007743872236460447, -0.04540525749325752, -0.01301522646099329, 0.05372655764222145, 0.03099435567855835, -0.030487842857837677, -0.006294523365795612, 0.03324632719159126, -0.005073681473731995, -0.014006056822836399, 0.01915302872657776, -0.015498647466301918, 0.016650747507810593, -0.06682362407445908, 0.04245464876294136, -0.009198886342346668, 0.05309684947133064, -0.005456625949591398, 0.005252709612250328, 0.022778280079364777, -0.029711782932281494, 0.009281454607844353, -0.0039734309539198875, 0.0031115617603063583, 0.0001506826956756413, 0.029228458181023598, 0.053004082292318344, -0.026244936510920525, 0.05640094727277756, 0.06990133970975876, 0.01604008488357067, 0.009670781902968884, -0.0426056869328022, 0.03685692325234413, 0.05466023087501526, -0.006891779135912657, -0.011414317414164543, 0.018829988315701485, 0.2643762528896332, -0.044704124331474304, -0.06532672792673111, -0.002053492236882448, -0.028394922614097595, 0.04994829371571541, -0.032663822174072266, -0.024827422574162483, -0.026060132309794426, 0.038627322763204575, -0.008032312616705894, -0.046993229538202286, -0.00936982873827219, -0.03021140582859516, -0.0358300656080246, 0.03651071712374687, -0.01427903026342392, 0.0003230342990718782, -0.021668506786227226, 0.021472113206982613, -0.0003285981947556138, -0.03381664305925369, 0.02412397228181362, -0.019794588908553123, 0.009609445929527283, 0.03840267285704613, -0.0007365615456365049, -0.034068763256073, 0.013970564119517803, 0.002765632001683116, 0.010317790322005749, 0.027588138356804848, 6.640833453275263e-05, -0.011520462110638618, -0.010920052416622639, 0.01382490899413824, 0.010079344734549522, 0.018116598948836327, -0.04018661379814148, -0.018382778391242027, 0.003699748544022441, 0.00957160722464323, -0.024335196241736412, -0.16489218175411224, -0.003911837935447693, 0.01984581910073757, 0.08048252016305923, 0.03387823328375816, 0.03767115995287895, 0.007009714841842651, 0.014867099933326244, -0.02761918678879738, 0.0026205386966466904, -0.03746500238776207, -0.02072747051715851, 0.14667445421218872, 0.015052491798996925, 0.07105027884244919, 0.023503342643380165, 0.0075687444768846035, -0.04076261818408966, -0.033648546785116196, -0.0014409117866307497, 0.03872677683830261, 0.05697516351938248, 0.036979254335165024, 0.004189902916550636, -0.020603220909833908, 0.09025593101978302, 0.03530094400048256, -0.013123027980327606, 0.026728078722953796, -0.03464990481734276, -0.012013541534543037, 0.007243604399263859, -0.04602727293968201, -0.008133415132761002, 0.06314245611429214, 0.029610347002744675, 0.013575403951108456, 0.03984035179018974, 0.13651198148727417, -0.030061913654208183, 0.0029471528250724077, 0.01715156063437462, -0.010572629980742931, 0.029680654406547546, 0.02571975812315941, -0.0058947219513356686, 0.03174017742276192, -0.011767338961362839, -0.025248054414987564, -0.02757706120610237, 0.0030514325480908155, 0.029965298250317574, 0.0001201753766508773, -0.04558115452528, -0.04388521984219551, -0.003364033065736294, -0.0699358880519867, 0.032316904515028, 0.02527964487671852, 0.023394078016281128, -0.030881356447935104, -0.008441833779215813, 0.0541236512362957, -0.0292209405452013, -0.09377482533454895, 0.005410453770309687, 0.035715386271476746, 0.01941242441534996, 0.1751312017440796, -0.004645857028663158, -0.02576206624507904, -0.037944894284009933, -0.03812597692012787, -0.014367849566042423, 0.024186760187149048, 0.005444956477731466, 0.0015084983315318823, 0.023941770195961, -0.006278220564126968, 0.06517487019300461, 0.06264472752809525, -0.034918058663606644, 0.0139905521646142, 1.6579946532147005e-05, -0.005229031667113304, 0.028069451451301575, 0.03528237342834473, -0.000921290076803416, -0.000550473399925977, -0.021797288209199905, 0.011915064416825771, 0.0013038829201832414, -0.016892949119210243, 0.021702494472265244, 0.01438149157911539, 0.004516376182436943, 0.023915283381938934, -0.031973596662282944, -0.011003107763826847, 0.025385398417711258, 0.023275749757885933, 0.004283412359654903, 0.03714874014258385, 0.008677485398948193, -0.014859744347631931, 0.004723978694528341, 0.0004390793910715729, 0.011011035181581974, 0.009497822262346745, -0.03411770239472389, -0.018379906192421913, -0.055234599858522415, -0.014941433444619179, -0.04241527244448662, 0.02815563976764679, -0.0022896130103617907, 0.0011943946592509747, -0.04055285453796387, 0.01347634568810463, 0.00998660922050476, -0.004481343552470207, -0.005792068317532539, -0.009184706956148148, 0.030706075951457024, 0.01071445643901825, -0.038508035242557526, -0.002461201511323452, -0.012347899377346039, -0.021411538124084473, -0.061142634600400925, -0.04580775275826454, 0.0013778872089460492, 0.02664140611886978, 0.004016229882836342, 0.04517095535993576, 0.0030067586340010166, 0.01671455055475235, -0.00463468162342906, 0.005939367227256298, 0.007030177861452103, 0.0523311085999012, 0.0055011254735291, 0.01386830024421215, 8.505566802341491e-05, -0.002523967996239662, 0.0330137237906456, 0.017461495473980904, -0.024719836190342903]" ./train/goblet/n03443371_3571.JPEG,goblet,"[-0.02086171694099903, -0.007791651878505945, 0.010401059873402119, 0.02360508032143116, 0.05987194553017616, 0.005874249152839184, 0.029256755486130714, 0.010595210827887058, -0.10260812193155289, 0.01420628186315298, 0.029172353446483612, -0.038100942969322205, 0.026076795533299446, -0.022412382066249847, 0.057805486023426056, -0.0016909261466935277, -0.03903694823384285, 0.01431420911103487, 0.047790203243494034, -0.014680507592856884, -0.016270823776721954, -0.0050413953140378, 0.013387809507548809, 0.012778990902006626, -0.02285505086183548, -0.0002051771734841168, 0.012275900691747665, 0.025682657957077026, -0.0008341423817910254, -0.011164318770170212, 0.028772836551070213, 0.016755281016230583, 0.022870272397994995, -0.007008557207882404, -0.014358596876263618, -0.04496360942721367, -0.02634953334927559, -0.02437012642621994, -0.0073446366004645824, 0.030096258968114853, -0.0003852741210721433, -0.028087865561246872, 0.0018679224886000156, -0.02431628853082657, 0.0034083479549735785, -0.0010567529825493693, 0.025811757892370224, -0.01593216136097908, -0.026681309565901756, 0.022237900644540787, 0.012813756242394447, 0.0029415730386972427, 0.008459498174488544, -0.007316119968891144, -0.015316498465836048, -0.028310662135481834, 0.02256062813103199, -0.007568063214421272, -0.00786399282515049, 0.020516542717814445, 0.015295417979359627, -0.005460356827825308, -0.03167929872870445, 0.01813504658639431, 0.039132896810770035, 0.024220529943704605, 0.01827074959874153, 0.02575007639825344, -0.044134654104709625, -0.009062239900231361, -0.017741480842232704, 0.032097212970256805, 0.010955513454973698, -0.06570681929588318, -0.02838779427111149, 0.01066325232386589, -0.050965093076229095, 0.051032308489084244, -0.02881200984120369, -0.009272664785385132, 0.0015194216975942254, 0.007130954414606094, -0.03308342024683952, 0.014274893328547478, -0.011089382693171501, -0.037021514028310776, -0.029646752402186394, 0.017813317477703094, 0.09691672027111053, 0.018013333901762962, -0.002762319054454565, -0.034999165683984756, -0.6407378315925598, -0.021856945008039474, -0.04041759669780731, 0.001825552200898528, -0.03235131502151489, -0.0038961097598075867, 0.0768069326877594, 0.10409213602542877, 0.03342991694808006, 0.011708090081810951, -0.03266996145248413, 0.024128302931785583, 0.08856123685836792, -0.0259749423712492, 0.006941518280655146, 0.015401898883283138, -0.006950177252292633, -0.009556635282933712, 0.03065575659275055, -0.015401287004351616, 0.024196898564696312, 0.03344431892037392, -0.02584102563560009, 0.031871721148490906, -0.056577909737825394, 0.0078432597219944, 0.010734333656728268, 0.04520432651042938, -0.0136565575376153, -0.0264265276491642, -0.006236269138753414, -0.01834561862051487, -0.024188529700040817, -0.05263051763176918, -0.0027259860653430223, 0.017938924953341484, -0.017952274531126022, -0.04418279603123665, -0.03166893869638443, -0.0681903287768364, 0.003793880343437195, 0.09057950228452682, -0.056163351982831955, 0.00897580198943615, -0.0073991091921925545, -0.014511746354401112, -0.03528660908341408, 0.0010201397817581892, -0.021006915718317032, -0.0036726018879562616, -0.040334198623895645, 0.04324895143508911, -0.028839698061347008, 0.0028241132386028767, 0.018193921074271202, -0.0644691213965416, -0.034977443516254425, 0.042287085205316544, -0.043070465326309204, 0.01763341948390007, 0.003456292673945427, -0.06549358367919922, -0.0016086094547063112, -0.035009924322366714, 0.011104154400527477, -0.057331472635269165, 0.03533874452114105, -0.017017660662531853, 0.025227203965187073, -0.006850615609437227, 0.0011651520617306232, -0.03138187527656555, 0.0018791311886161566, -0.0030359996017068624, 0.06164493039250374, 0.018531007692217827, 0.021968776360154152, 0.0217906441539526, -0.0007870583212934434, 0.010037299245595932, 0.04295442998409271, -0.0329652838408947, -0.00805590022355318, -0.05943334847688675, -0.14552095532417297, -0.0027564256452023983, -0.013349237851798534, -0.02707366831600666, 0.02386714145541191, 0.01771398074924946, -0.035551268607378006, -0.018048718571662903, -0.03831474110484123, 0.04815356060862541, 0.018481485545635223, 0.013541797176003456, 0.0007195590878836811, -0.0021246576216071844, 0.002831658348441124, 0.02138475701212883, -0.037914205342531204, 0.009578176774084568, 0.011100453324615955, -0.027712136507034302, 0.016694756224751472, -0.0018555602291598916, -0.05318626016378403, 0.007151004392653704, -0.035365939140319824, 0.012523380108177662, -0.014505434781312943, 0.05316857248544693, -0.022077595815062523, -0.021433435380458832, -0.0016418523155152798, 0.007988275028765202, 0.07753519713878632, 0.026462530717253685, -0.00036772931343875825, 0.0076273540034890175, -0.003091535996645689, 0.026729553937911987, 0.008857282809913158, -0.018674880266189575, 0.04721050709486008, -0.011795712634921074, 0.06432618200778961, 0.010982563719153404, 0.01812039315700531, 0.10207673907279968, -0.04733358696103096, 0.024532347917556763, 0.030414070934057236, -0.028704900294542313, -0.04472966864705086, 0.0040953862480819225, -0.014265945181250572, -0.02924390882253647, 0.01714284159243107, -0.024831809103488922, -0.009439614601433277, -0.08414778113365173, 0.009325160644948483, 0.10157981514930725, 0.008186046965420246, -0.01715519092977047, -0.00020676321582868695, -0.0002656719589140266, -0.017748339101672173, 0.050808101892471313, -0.04713539406657219, 0.006411409936845303, -0.010643660090863705, 0.04775143042206764, 0.01833331026136875, 0.0388944074511528, 0.04068708047270775, 0.03622926399111748, -0.012939905747771263, 0.004341438878327608, 0.03075365349650383, 0.018979551270604134, 0.014809549786150455, 0.00425059674307704, -0.07849280536174774, -0.022211527451872826, -0.09108790010213852, 0.025922035798430443, 0.0020075116772204638, 0.04194004833698273, -0.07033530622720718, -0.015791479498147964, 0.02735021337866783, -0.01528747659176588, 0.007839576341211796, -0.01928406022489071, 0.022571638226509094, -0.0025653447955846786, -0.022006560117006302, 0.03672727197408676, 0.04198174923658371, 0.03152145445346832, 0.016175225377082825, -0.04217556118965149, -0.01972382143139839, 0.012362957000732422, -0.009191085584461689, -0.04012904688715935, 0.005844638217240572, 0.0408104732632637, 0.0023586212191730738, -0.0023089160677045584, -0.03568744286894798, 0.022731943055987358, 0.05015936493873596, -0.0069965762086212635, 0.005160185508430004, 0.01593014970421791, 0.04878814518451691, -0.0359857976436615, 0.019340623170137405, 0.028184207156300545, 0.03392375633120537, 0.012157941237092018, 0.04890213534235954, 0.0001240562996827066, 0.011057008057832718, 0.007679499685764313, -0.0016178451478481293, -0.02832578867673874, 0.013096179813146591, -0.018866034224629402, -0.007943421602249146, 0.02898457832634449, 0.012306811287999153, -0.007557176053524017, 0.025220569223165512, -0.0241212360560894, 0.006733683403581381, -0.025268839672207832, 0.090354323387146, -0.02141675353050232, -0.009795659221708775, -0.00601195776835084, 0.05281153321266174, 0.08222091197967529, 0.011046914383769035, 0.08168214559555054, 0.045631565153598785, 0.06632379442453384, 0.0011588759953156114, 0.00782415084540844, 0.0346221923828125, -0.0003920561575796455, -0.027211934328079224, -0.010600143112242222, 0.04178996756672859, 0.02736692875623703, 0.010625486262142658, -0.043784357607364655, -0.01654038578271866, -0.011919176205992699, -0.04028450697660446, -0.031190235167741776, 0.0008279248140752316, 0.011054068803787231, 0.03249114379286766, 0.005972560029476881, -0.02454918622970581, -0.004696852061897516, -0.0028491865377873182, -0.009755800478160381, 0.015404809266328812, 0.010145914740860462, -0.021179713308811188, 0.04619773477315903, 0.025727340951561928, -0.02417626604437828, -0.0027941795997321606, 0.03740832582116127, 0.022723115980625153, -0.004411021247506142, -0.014331982471048832, -0.030684558674693108, 0.04206859692931175, 0.13002756237983704, -0.06567034870386124, -0.006300326902419329, -0.07338053733110428, 0.026693595573306084, 0.021214457228779793, 0.04673723503947258, -0.03485613316297531, -0.025985196232795715, 0.03931346535682678, 0.014143552631139755, 0.029835041612386703, 0.020885029807686806, -0.010827328078448772, 0.002584723522886634, -0.055267591029405594, -0.028722982853651047, 0.021338842809200287, 0.008278710767626762, 0.03814724087715149, 0.043033417314291, -0.06514905393123627, 0.009298252873122692, 0.03266315162181854, -0.07784252613782883, 0.01010665949434042, 0.050214216113090515, 0.09598104655742645, -0.005508634261786938, 0.0653960257768631, 0.03863559290766716, 0.00766809843480587, 0.030849389731884003, 0.030021533370018005, -0.018255606293678284, 0.008507108315825462, -0.008486047387123108, 0.024465860798954964, 0.0038627374451607466, -0.03449241816997528, -0.043241750448942184, -0.030136248096823692, -0.06114960461854935, -0.004439716227352619, 0.04743025079369545, 0.05850207433104515, 0.02979186177253723, -0.026834450662136078, -0.002557657193392515, -0.0030928379856050014, 0.011065276339650154, 0.047944750636816025, -0.05031638965010643, 0.0030034200754016638, 0.03434734046459198, -0.04606444388628006, 0.005570809822529554, -0.007778350263834, -0.019509293138980865, 0.015584800392389297, 0.023906515911221504, -0.0021380698308348656, 0.01707068458199501, -0.011228788644075394, -0.017116084694862366, 0.040130481123924255, -0.008578559383749962, 0.004122377373278141, 0.014400003477931023, 0.03857187181711197, 0.019551696255803108, 0.09364282339811325, -0.009847654961049557, 0.019505640491843224, 0.004484125413000584, 0.03951505571603775, -0.03472432494163513, -0.02412647008895874, -0.03301854431629181, 0.017848782241344452, -0.017840178683400154, -0.02266893908381462, 0.03856357932090759, -0.047369636595249176, -0.005082028917968273, 0.07545620203018188, -0.07995539903640747, -0.01281908992677927, -0.01000694278627634, 0.007092659827321768, -0.002105381339788437, -0.005926560610532761, 0.059629589319229126, -0.035224899649620056, 0.01718301512300968, 0.026612751185894012, 0.033452194184064865, -0.059492893517017365, -0.009885021485388279, -0.00277060572989285, -0.02037397213280201, -0.006250002887099981, 0.08040362596511841, -0.020794816315174103, -0.015043620020151138, 0.02770421653985977, -0.024038391187787056, 0.026593077927827835, 0.01667206920683384, -0.05054714158177376, -0.01953478716313839, -0.023607823997735977, -0.01221101451665163, -0.03556843474507332, 0.02590170130133629, 0.014109431765973568, -0.03710087016224861, -0.014248578809201717, -0.018204456195235252, 0.01848124898970127, -0.0661039799451828, 0.01109494548290968, -0.08202315866947174, 0.030740439891815186, -0.0202633123844862, -0.019285300746560097, 0.01573273167014122, 0.0033773849718272686, -0.02434632182121277, -0.015201909467577934, 0.029694395139813423, 0.03775986656546593, 0.01847716234624386, -0.033163633197546005, -0.022159215062856674, 0.039433564990758896, -0.049885839223861694, -0.012598386965692043, 0.009408359415829182, -0.03397512063384056, -0.025437677279114723, 0.05994134396314621, -0.016875678673386574, -0.039941322058439255, 0.020623184740543365, -0.01534987986087799, -0.01572040654718876, -0.012003062292933464, -0.010986855253577232, -0.003510251408442855, -0.017658904194831848, -0.012516727671027184, -0.007839479483664036, 0.030589042231440544, 0.00012995387078262866]" ./train/goblet/n03443371_268.JPEG,goblet,"[-0.038253434002399445, 0.029463408514857292, 0.0037732510827481747, -0.006071584299206734, 0.0237810630351305, -0.035886187106370926, 0.03281136229634285, 0.02143477089703083, -0.0004155072965659201, -0.020626431331038475, -0.001249343971721828, 0.009999193251132965, 0.06499619781970978, -0.050555843859910965, 0.013430189341306686, -0.008702821098268032, 0.09544772654771805, 0.010780786164104939, -0.005332515574991703, -0.06185495853424072, -0.08011633157730103, 0.03232194855809212, -0.0315256230533123, 0.009941669180989265, -0.020139653235673904, 0.05375198647379875, 0.015576646663248539, -0.0069970726035535336, 0.007007789332419634, -0.06589356809854507, 0.005640814080834389, 0.05490749701857567, -0.03805899620056152, -0.046465568244457245, 0.023303285241127014, -0.02077893726527691, -0.04813507944345474, 0.005887279752641916, -0.0007504359818994999, 0.03374263644218445, 0.0015594465658068657, -0.03660057112574577, 0.030917126685380936, -0.0007864885265007615, 0.011221544817090034, -0.15273694694042206, 0.00363287259824574, 0.036432892084121704, 0.014046252705156803, 0.00626936974003911, 0.0006965092616155744, 0.03475097194314003, 0.011987936682999134, -0.04922977089881897, -0.03166700527071953, -0.02011382207274437, -0.10239408910274506, -0.006545086391270161, -0.02038375288248062, 0.03133430331945419, -0.0005575378891080618, -0.030879603698849678, 0.01494009979069233, 0.024127142503857613, 0.02782294899225235, 0.05065496638417244, 0.0035748917143791914, -0.02440917305648327, -0.04596371203660965, -0.012819907627999783, 0.002426361432299018, 0.010048584081232548, -0.007407099939882755, 0.03779534623026848, 0.004367006942629814, -0.025067435577511787, 0.0029656917322427034, -0.017264997586607933, 0.0183078832924366, -0.03084838204085827, -0.017631668597459793, -0.029971638694405556, -0.0012157582677900791, -0.05521158128976822, 0.018347980454564095, -0.006907754577696323, 0.017266858369112015, -0.022333690896630287, 0.0452444814145565, -0.014706175774335861, 0.019991807639598846, -0.028569074347615242, -0.6233036518096924, -0.10125312209129333, -0.025352856144309044, -0.003717901650816202, 0.0008933267090469599, 0.03496108204126358, 0.0542219802737236, 0.005825833883136511, 0.027465369552373886, -0.041207581758499146, -0.010659915395081043, 0.02014927566051483, 0.06586617976427078, -0.06879008561372757, -0.06000084429979324, -0.01731126755475998, 0.021402526646852493, -0.038727059960365295, 0.02842935547232628, 0.00830073095858097, 0.017741955816745758, 0.020644037052989006, -0.058505527675151825, 0.04201347008347511, -0.0507836639881134, 0.00574146956205368, 0.018462367355823517, 0.007467615883797407, 0.04572444409132004, 0.0002153143286705017, 0.004571967758238316, -0.007072865962982178, 0.005825958214700222, -0.02395808883011341, -0.010710440576076508, 0.013246383517980576, -0.009873022325336933, -0.015328885987401009, -0.0246318019926548, -0.041476476937532425, 0.03784266486763954, 0.08270055800676346, 0.030926473438739777, -0.04551289975643158, -0.0629347488284111, -0.04382087662816048, -0.049488287419080734, -0.001984914531931281, -0.011157678440213203, 0.033115092664957047, -0.07731375098228455, 0.004265742842108011, -0.03513094410300255, 0.0134867113083601, -0.0360841266810894, -0.013991115614771843, -0.0028231835458427668, -0.013308372348546982, -0.004297849256545305, 0.0046545895747840405, 0.07690224796533585, -0.059343792498111725, 0.004657476209104061, -0.040943849831819534, 0.0038266489282250404, -0.02496168576180935, 0.023147407919168472, -0.003013507928699255, -0.0028243116103112698, -0.03978987783193588, -0.031663887202739716, -0.03810940310359001, -0.009290575049817562, 0.02423311024904251, -0.02274947240948677, 0.03636414185166359, -0.034643396735191345, 0.01756519451737404, -0.027387332171201706, 0.01037607342004776, -0.010241478681564331, -0.004299437627196312, -0.045819032937288284, -0.019464457407593727, 0.0015286707784980536, -0.006485792342573404, 0.013822292909026146, -0.03774682432413101, 0.060222260653972626, 0.018151162192225456, 0.019554302096366882, -0.016917888075113297, -0.04518391564488411, 0.003573172725737095, 0.005730883218348026, 0.036290183663368225, 0.03115174174308777, 0.0037501438055187464, 0.019648516550660133, 0.0010966294212266803, -0.011672833003103733, -0.013457795605063438, 0.09371321648359299, -0.009553727693855762, -0.023077121004462242, 0.0032562410924583673, -0.03686785325407982, -0.010176288895308971, -0.0035452416632324457, 0.025577891618013382, 0.004800235386937857, 0.05182388424873352, -0.0012398068793118, 0.019031371921300888, 0.010731175541877747, 0.0007372814579866827, 0.009073613211512566, 0.005027238745242357, 0.004700970370322466, 0.10839185863733292, -0.014275578781962395, 0.004703809041529894, 0.011424222961068153, 0.012729196809232235, 0.050988707691431046, 0.022780194878578186, -0.022468235343694687, 0.029826408252120018, -0.021526586264371872, 0.03433898463845253, 0.01162299420684576, -0.00424190191552043, 0.042323999106884, -0.018126986920833588, 0.011060262098908424, 0.014565647579729557, -0.0014804652892053127, -0.004263319540768862, -0.013408494181931019, 0.03026147373020649, -0.027826430276036263, 0.01377042755484581, -0.024816520512104034, 0.09150341898202896, 0.03301156684756279, -0.04799507185816765, -0.004867988172918558, -0.00912030041217804, -0.0019821450114250183, -0.021669583395123482, 0.004211344290524721, -0.03969739004969597, -0.07035042345523834, 0.06572374701499939, -0.005420188885182142, 0.065482497215271, -0.018112732097506523, 0.01704471930861473, 0.017005667090415955, 0.00988337118178606, -0.0005960187409073114, -0.006697675213217735, 0.0021950697991997004, 0.025690237060189247, 0.0030076936818659306, -0.015420089475810528, -0.11384754627943039, 0.025139620527625084, -0.022858429700136185, -0.005355441942811012, -0.028960274532437325, -0.06713249534368515, 0.010798778384923935, -0.02132263407111168, -0.0021036502439528704, -0.05857342481613159, 0.05307934805750847, -0.02841966040432453, -0.029725976288318634, 0.0423608273267746, 0.06513264775276184, 0.036597684025764465, 0.012339574284851551, 0.00287195504643023, -0.040977612137794495, 0.0003716954088304192, -0.004189434461295605, -0.030318835750222206, 0.0022994130849838257, 0.01982935518026352, -0.06984851509332657, 0.019345469772815704, 0.0012928505893796682, 0.017067931592464447, 0.00840265117585659, 0.03151537477970123, 0.010157047770917416, -0.009849810041487217, -0.031058823689818382, -0.025220055133104324, -0.04097476974129677, 0.039312899112701416, 0.01075145322829485, -0.00995309092104435, -0.026201393455266953, 0.010016090236604214, -0.03896358236670494, 0.004874632228165865, -0.005922115873545408, -0.013181704096496105, 0.003344545606523752, -0.007543001789599657, -0.011389300227165222, -0.05583282187581062, 0.02081293798983097, 0.02206282876431942, 0.022624190896749496, -0.019618142396211624, 0.03096853196620941, 0.019165076315402985, 0.08253414183855057, -0.03956140577793121, -0.013508206233382225, -0.013876855373382568, 0.03035881742835045, -0.008173906244337559, 0.020157478749752045, -0.05203544348478317, 0.047466691583395004, 0.1930461823940277, 0.013240848667919636, -0.02144399844110012, -0.002987728687003255, -0.01270232629030943, -0.015587616711854935, 0.00864479225128889, -0.015749020501971245, -0.004450488835573196, 0.011053227819502354, 0.003340568859130144, -0.026907432824373245, 0.004835940897464752, 0.01606321707367897, -0.026045482605695724, 0.024101635441184044, 0.02162826992571354, 0.006803442258387804, 0.006173067260533571, -0.027278928086161613, 0.019760895520448685, -0.0014379097847267985, 0.04091539978981018, 0.049661144614219666, -0.012367754243314266, -0.027911150828003883, -0.010487016290426254, -0.025313016027212143, 0.0016900275368243456, 0.0004085330292582512, 0.027496006339788437, 0.037060026079416275, -0.006088819354772568, -0.010857485234737396, -0.03933901712298393, 0.04130888730287552, -0.041127897799015045, -0.016458364203572273, 0.0014043099945411086, -0.0426088348031044, 0.023710062727332115, -0.0016049555270001292, -0.057063162326812744, -0.1324370950460434, -0.018909528851509094, 0.0011969475308433175, -0.041656896471977234, 0.03951010853052139, 0.017148811370134354, -0.008798116818070412, 0.0031747438479214907, 0.011725821532309055, -0.021661240607500076, -0.02009999193251133, -0.0508846752345562, 0.0431625060737133, 0.025741692632436752, 0.004060117993503809, -0.007289892993867397, -0.005200215615332127, -0.07866024971008301, -0.030742183327674866, -0.03822728246450424, 0.03231795132160187, -0.023154160007834435, 0.05411249399185181, -0.008752234280109406, 0.03833046928048134, -0.03589834272861481, 0.0156007194891572, -0.0010414407588541508, -0.004342255648225546, -0.0028150775469839573, -0.07023414224386215, -0.005508938804268837, -0.02352423407137394, -0.05609354376792908, 0.10205850005149841, -0.007501316722482443, 0.006160146091133356, 0.014482985250651836, 0.08389695733785629, -0.0015401048585772514, -0.03211053088307381, -0.001887875609099865, 0.0028236648067831993, 0.00944686308503151, 0.018062733113765717, -0.019968360662460327, -0.012665335088968277, -0.007471668068319559, 0.025087367743253708, -0.002871077274903655, -0.0205298513174057, 0.021915748715400696, -0.0003158684994559735, -0.015079128555953503, -0.04349739849567413, -0.012143747881054878, -0.013306454755365849, 0.003983418457210064, 0.03827216848731041, 0.026215245947241783, -0.029318898916244507, -0.007389922626316547, -0.033675070852041245, -0.008545386604964733, -0.04973826929926872, 0.0394742414355278, 0.051045358180999756, 0.0004085440596099943, 0.09854163229465485, -0.032085318118333817, 0.0009537497535347939, -0.05587015300989151, -0.004495767876505852, -0.014623443596065044, 0.05613941326737404, -0.021197767928242683, 0.038153741508722305, -0.02089642360806465, -0.016067519783973694, 0.0014610246289521456, 0.009537377394735813, -0.024630224332213402, 0.02267640456557274, -0.012636288069188595, -0.030765196308493614, 0.06277794390916824, 0.08103955537080765, -0.0031543360091745853, 0.029795173555612564, -0.02781517244875431, -0.04963485524058342, 0.03916467726230621, 0.02136102318763733, -0.0034116171300411224, 0.03217064216732979, -0.019279619678854942, 0.03912580385804176, -0.011688455939292908, -0.013236810453236103, -0.03819812834262848, -0.0036231321282684803, 0.005778050981462002, 0.06502266973257065, -0.02305692248046398, 0.0017011214513331652, -0.0042367372661828995, -0.00983559712767601, -0.03370986878871918, 0.00394868291914463, -0.050683390349149704, -0.014700854197144508, -0.025146471336483955, 0.037762805819511414, -0.04519367590546608, 0.015841614454984665, -0.006876761559396982, -0.00965709239244461, -0.04396868497133255, -0.024330055341124535, 0.029309671372175217, 0.013976993970572948, -0.031378716230392456, -0.006871491204947233, 0.049321506172418594, 0.013392609544098377, -0.02647840417921543, -0.019506346434354782, 0.0026987604796886444, 0.042804867029190063, -0.04778772592544556, -0.007100215181708336, 0.008476261980831623, 0.06114765629172325, 0.03651327267289162, -0.0036955273244529963, 0.007762038614600897, -0.055705726146698, 0.003432012628763914, -0.0016781643498688936, 0.04212942719459534, 0.00499084684997797, -0.043790120631456375, 0.004190302919596434, 0.01770063117146492, -0.028134357184171677, 0.06383739411830902, 0.007174243684858084, -0.011372983455657959]" ./train/goblet/n03443371_14193.JPEG,goblet,"[-0.03259827196598053, 0.017707617953419685, -0.04040251299738884, -0.01009517814964056, 0.04134560376405716, 0.021403905004262924, 0.030408117920160294, 0.02083464153110981, -0.003724518232047558, -0.01397724635899067, 0.015475861728191376, -0.012842441909015179, 0.0020060688257217407, -0.031095288693904877, 0.024876607581973076, 0.018845850601792336, 0.018231108784675598, 0.003283645026385784, 0.024266207590699196, -0.016047930344939232, -0.04683177173137665, 0.01262848824262619, -0.028498033061623573, -0.0301204863935709, -0.004287088289856911, 0.06371008604764938, 0.014713444747030735, -0.00788845494389534, -0.013581478036940098, 0.01577870547771454, 0.008040628395974636, -0.0091042285785079, -0.029425110667943954, -0.0184919536113739, -0.04815684258937836, 0.004118477459996939, -0.01298669446259737, 0.00856439396739006, -0.034766558557748795, 0.17058740556240082, -0.0025173339527100325, -0.02128441259264946, -0.016351768746972084, -0.002389403758570552, 0.028546329587697983, -0.19460546970367432, 0.01537279412150383, -0.00020482394029386342, 0.0014814648311585188, 0.043241117149591446, -0.051623404026031494, 0.04782669246196747, 0.018885081633925438, -0.028047794476151466, -0.008268555626273155, 0.017556706443428993, -0.03749093413352966, -0.00430560065433383, 0.038689929991960526, 0.0265186820179224, -0.03578007221221924, -0.008523879572749138, -0.017433887347579002, 0.0498773455619812, 0.0011948066530749202, 0.08125325292348862, -0.03520955145359039, -0.06540901958942413, -0.021996892988681793, 0.008185787126421928, 0.005275876261293888, 0.007766261696815491, 0.01800387352705002, -0.04212740436196327, 0.013826238922774792, 0.005109382327646017, -0.02218620665371418, -0.012536458671092987, -0.013349959626793861, -0.03778264671564102, 0.056722916662693024, -0.01563372276723385, 0.010785399004817009, -0.034531570971012115, -0.0024485052563250065, 0.013516640290617943, -0.019900081679224968, 0.015526683069765568, 0.042066484689712524, -0.015508008189499378, 0.006595676764845848, 0.008519486524164677, -0.6768434047698975, -0.0536126047372818, -0.0010144055122509599, -0.03857312351465225, 0.0001941519440151751, 0.005132951308041811, 0.03306431323289871, 0.03608052805066109, 0.0008268126402981579, 0.007516952231526375, -0.02635974809527397, 0.04721784219145775, 0.042915038764476776, 0.02536703832447529, -0.05259435996413231, 0.001594972680322826, 0.01566140167415142, 0.019759073853492737, 0.03172513097524643, -0.03802214190363884, 0.013776198029518127, 0.030123375356197357, 0.02861182577908039, 0.03280066326260567, -0.04619525372982025, 0.039537619799375534, -0.008459473960101604, 0.007688520476222038, -0.005966565106064081, 0.026429275050759315, -0.00677592633292079, -0.022253062576055527, -0.03463480621576309, -0.029866885393857956, 0.000925800297409296, 0.0004686184402089566, 0.007384319789707661, -0.03024689108133316, 0.00013151601888239384, -0.05436868220567703, -0.0054945917800068855, 0.0854964479804039, -0.0017830748111009598, -0.00654169637709856, -0.07410072535276413, -0.049781762063503265, -0.03922073543071747, 0.012588760815560818, -0.011688241735100746, 0.026907790452241898, -0.0296977199614048, -0.013375560753047466, 0.011433948762714863, -0.006687183864414692, 0.012739798985421658, -0.018041227012872696, -0.0412522591650486, 0.02644713781774044, -0.020370861515402794, 0.002976591233164072, 0.1133793368935585, -0.007132634986191988, 0.013732408173382282, -0.04566950350999832, 0.013857988640666008, -0.023818910121917725, 0.010126554407179356, -0.03695286810398102, -0.03684217855334282, -0.024410288780927658, -0.035140205174684525, -0.03359927237033844, -0.03956378251314163, 0.008656774647533894, -0.029401512816548347, 0.011232824064791203, 0.00020408585260156542, -0.007218226790428162, -0.014751892536878586, 0.005030184984207153, -0.020287081599235535, -0.01626458764076233, -0.03640725836157799, 0.000624466803856194, -0.07973652333021164, -0.0006653297459706664, 0.0007497629849240184, -0.003584965132176876, 0.022265760228037834, 0.0049890317022800446, 0.007950405590236187, 0.02156738191843033, -0.018671445548534393, 0.008150891400873661, -8.025595161598176e-05, -0.0030882845167070627, -0.0077301631681621075, 0.0052983881905674934, -0.003803487168624997, -0.005368213169276714, 0.003997212741523981, 0.026566632091999054, 0.0302033182233572, -0.00562492199242115, 0.030412796884775162, 0.006720901001244783, -0.038954418152570724, -0.005980702582746744, 0.041351184248924255, 0.02122875675559044, -0.0007152630714699626, 0.051446374505758286, 0.009030724875628948, -0.009421044029295444, -0.0029465914703905582, 0.017506489530205727, 0.0032980216201394796, -0.023296911269426346, 0.01209238637238741, 0.0482993945479393, -0.01872379705309868, 0.006530987564474344, -0.025652730837464333, -0.00808445643633604, 0.008123544976115227, 0.018113799393177032, -0.04128642752766609, -0.002879079431295395, -0.01498420536518097, 0.10257560759782791, -0.030072450637817383, -0.027633579447865486, 0.03853213042020798, -0.029949693009257317, -0.02560427598655224, -0.05928421393036842, -0.0026866882108151913, 0.023810025304555893, 0.004808912053704262, 0.046098753809928894, -0.01053611095994711, -0.011979983188211918, -0.014247365295886993, 0.05495637655258179, -0.014375830069184303, -0.05937160924077034, -0.0012477494310587645, 0.0016543306410312653, -0.002802061615511775, -0.018572453409433365, -0.0031468383967876434, -0.004969228059053421, -0.07603875547647476, 0.001525061554275453, 0.015803908929228783, 0.034571707248687744, -0.019519522786140442, 0.020934036001563072, -0.031500257551670074, 0.061843059957027435, 0.0029580295085906982, -0.016696861013770103, -0.01925557665526867, -0.01637696661055088, -0.03635701909661293, -0.01864485815167427, -0.0494774766266346, 0.02714674547314644, -0.005480232648551464, -0.005290792789310217, -0.004003796726465225, 0.019040217623114586, 0.029855869710445404, -0.053164076060056686, 0.03312642499804497, 0.007811130024492741, 0.017555834725499153, -0.013295144774019718, -0.05186083912849426, 0.009632701054215431, 0.04562460258603096, 0.026323392987251282, 0.008321685716509819, -0.033996470272541046, -0.024037016555666924, 0.007985501550137997, -0.024211546406149864, -0.016698475927114487, 0.024111196398735046, 0.053498275578022, -0.03549109771847725, -0.026262231171131134, -0.004016045946627855, 0.0008906514849513769, 0.009685312397778034, -0.0327005572617054, 0.0023977363016456366, -0.028192996978759766, -0.02607874572277069, -0.0035132102202624083, 0.042558010667562485, 0.003965812735259533, 0.020978325977921486, 0.020943183451890945, -0.06074513494968414, 0.018241683021187782, -0.04020698368549347, 0.00740151759237051, -0.04109124094247818, -0.012876791879534721, 0.01807492785155773, 0.020961778238415718, -0.0005053688073530793, 0.010353920981287956, 0.026487328112125397, 0.003446590155363083, 0.02479102835059166, -0.010947141796350479, 0.0376078225672245, 0.0520353764295578, 0.08533088862895966, 0.0012686437694355845, 0.005629691295325756, -0.010248744860291481, 0.04363945126533508, -0.001068769139237702, 0.010025675408542156, -0.02008233033120632, 0.028376396745443344, 0.06807752698659897, -0.0023663172032684088, -0.01081946212798357, 0.017069794237613678, -0.02564449980854988, 0.021864552050828934, -0.03046729415655136, 0.0035470975562930107, 0.03919665887951851, 0.012311204336583614, -0.013418303802609444, -0.0503399521112442, 0.014533222652971745, -0.027209416031837463, -0.01183528546243906, -0.007002514321357012, -0.001469168346375227, -0.0006708798464387655, -0.0013392488472163677, -0.010176614858210087, -0.017097650095820427, -0.01819804310798645, 0.022202853113412857, -0.0006706070271320641, -0.021122435107827187, -0.00446728803217411, 0.00754411518573761, -0.0037143491208553314, 0.0013419903116300702, 0.004747470840811729, -0.002843253081664443, 0.01866925321519375, 0.002434291411191225, -0.0013222420820966363, -0.10618378221988678, -0.009325077757239342, 0.026603052392601967, -0.00936692114919424, -0.003699552034959197, -0.057269029319286346, 0.005742260720580816, 0.011681878939270973, -0.012692341580986977, -0.01631644181907177, -0.02939264476299286, 0.0171657782047987, 0.04676172137260437, 0.010828706435859203, 0.07457134872674942, -0.0064938729628920555, 0.0020725259091705084, -0.011751334182918072, 0.006176933646202087, 0.03960118442773819, -0.01836109533905983, 0.11819470673799515, -0.016781410202383995, -0.009328643791377544, 0.01964680850505829, -0.0485563650727272, -0.12295445799827576, -0.008395607583224773, -0.030095059424638748, 0.03566751256585121, 0.014072978869080544, 0.022707028314471245, 0.014639770612120628, -0.023123212158679962, 0.09800832718610764, 0.06216789036989212, -0.05225071683526039, 0.005623961798846722, -0.03420879319310188, -0.023482397198677063, -0.013099987991154194, -0.03977147117257118, 0.009873581118881702, 0.043269988149404526, 0.042848922312259674, 0.008323892951011658, 0.031791072338819504, 0.054819442331790924, 0.004883070942014456, -0.010858312249183655, -0.024924011901021004, -0.0037505023647099733, 0.00736016733571887, 0.03553372994065285, 0.011581635102629662, 0.037390418350696564, 0.02076784335076809, -0.015088403597474098, 0.011461273767054081, -0.0008581414585933089, -0.006647842470556498, -0.0424298457801342, -0.0340125598013401, -0.03981929272413254, 0.0173947811126709, -0.03027736209332943, 0.0013443902134895325, 0.03675442934036255, 0.016612347215414047, -0.03811481595039368, 0.01248998660594225, -0.016607290133833885, -0.005168558098375797, -0.10661214590072632, 0.015431859530508518, 0.03936091065406799, 0.05066080018877983, 0.12016253918409348, -0.002876094775274396, -0.028799496591091156, 0.004008290823549032, -0.020029885694384575, -0.008459992706775665, 0.023505782708525658, -0.005743537098169327, 0.011904614977538586, -0.01861068606376648, 0.02076832950115204, 0.003273645881563425, 0.017558349296450615, -0.02649979293346405, -0.02418540231883526, 0.012822776101529598, -0.004819426219910383, -0.005373488180339336, 0.01375398226082325, -0.0031034655403345823, 0.009261484257876873, -0.04240604117512703, -0.002476791152730584, -0.012493463233113289, -0.005773360375314951, -0.04866261035203934, -0.0046646250411868095, -0.023461179807782173, 0.006041280459612608, -0.02076795883476734, -0.012788232415914536, -0.032945066690444946, 0.026583204045891762, 0.03007674589753151, 0.03661172464489937, -0.014557735994458199, -0.025624334812164307, 0.029963143169879913, -0.025669988244771957, 0.020066555589437485, 0.01887013204395771, -0.07716269791126251, -0.005057983566075563, -0.012407233938574791, -0.023373836651444435, -0.011663362383842468, 0.018926097080111504, -0.04829561710357666, -0.00252967095002532, 0.025291893631219864, -0.006829508114606142, 0.014459551312029362, 0.005697435233741999, -0.05989452823996544, -0.03226964920759201, 0.02816798910498619, -0.009299702942371368, -0.021206505596637726, 0.0017088884487748146, 8.055804210016504e-05, 0.048757512122392654, -0.06281697750091553, -0.009464001283049583, -0.02015961892902851, 0.01619216427206993, 0.015304864384233952, -0.0020100304391235113, -0.020063966512680054, -0.0317540280520916, 0.018049264326691628, -0.019152939319610596, 0.001243677455931902, 0.04905794560909271, -0.03423754498362541, 0.0401340089738369, 0.0023489382583647966, -0.029098818078637123, 0.07735040783882141, 0.003519170917570591, -0.007991425693035126]" ./train/goblet/n03443371_9475.JPEG,goblet,"[0.006918931379914284, 0.029441654682159424, -0.01752876304090023, -0.04685124382376671, 0.04855038970708847, -0.03475022315979004, 0.0178897213190794, 0.06141739338636398, 0.024837376549839973, -0.007426655385643244, 0.01498385053128004, 0.007218323182314634, 0.04683510586619377, -0.04573393240571022, 0.015690067782998085, 0.0016736758407205343, 0.10117226094007492, 0.018963102251291275, 0.0019344394095242023, -0.014311379753053188, -0.09576574712991714, -0.003156126942485571, -0.03462005406618118, 0.007098651956766844, -0.034618228673934937, 0.022395284846425056, 0.014781851321458817, 0.012744849547743797, -0.023274362087249756, -0.023974815383553505, 0.02342446893453598, 0.028045866638422012, -0.012222141958773136, -0.03496589511632919, -0.033069267868995667, -0.04026404395699501, -0.05569441616535187, -0.007373219821602106, -0.022803930565714836, 0.026907823979854584, -0.023995742201805115, 0.012152786366641521, 0.01892712526023388, 0.0023948061279952526, -0.010018475353717804, -0.058535389602184296, -0.006566817406564951, 0.015759583562612534, 0.006150498986244202, 0.0014897200744599104, 0.002306001726537943, 0.03759809583425522, 0.04009831324219704, -0.04366396367549896, 0.013944749720394611, -0.013696876354515553, -0.030791044235229492, -0.016094394028186798, -0.02288680709898472, 0.03989356383681297, -0.05132126808166504, -0.030449938029050827, -0.00046117909369058907, 0.039136335253715515, -0.022639170289039612, 0.014851975254714489, -0.02761996164917946, -0.04594285413622856, -0.04138517379760742, -0.010770450346171856, -0.012498673982918262, 0.028314610943198204, 0.008337619714438915, -0.022958388552069664, -0.010053317062556744, -0.010647407732903957, -0.03096793405711651, -0.051664452999830246, 0.005852377042174339, -0.01732644811272621, -0.007550243753939867, 0.029694048687815666, -0.019000893458724022, -0.018065841868519783, -0.0005680694594047964, -0.008024373091757298, -0.03485928475856781, -0.025640811771154404, 0.029680432751774788, -0.002988286316394806, 0.025170594453811646, -0.007135682739317417, -0.7339099645614624, -0.04820433259010315, -0.0006064388435333967, -0.02157687395811081, -0.024563411250710487, 0.005277686752378941, 0.08320900797843933, -0.027054373174905777, 0.02438339963555336, -0.04904433712363243, 0.012695877812802792, 0.020485706627368927, 0.08250603824853897, -0.03348354622721672, -0.005830856971442699, 0.008548981510102749, 0.015704914927482605, -0.026601985096931458, 0.039305608719587326, -0.021689945831894875, 0.008844971656799316, -0.0024740006774663925, -0.039131294935941696, 0.004054199904203415, -0.008313922211527824, 0.040942780673503876, 0.013304166495800018, 0.0009934866102412343, -0.032857879996299744, 0.011086879298090935, -0.0068415068089962006, -0.0034214004408568144, 0.0057695177383720875, -0.04650498554110527, -0.006741141434758902, 0.009685259312391281, -0.01310358103364706, 0.01406100019812584, -0.032595790922641754, -0.04958130046725273, 0.009071283042430878, 0.08999480307102203, 0.003213149029761553, -0.013745496049523354, 0.007930723018944263, -0.027438633143901825, -0.04211828485131264, -0.029159029945731163, -0.005752740427851677, 0.01409142930060625, -0.03687954694032669, -0.007641995325684547, -0.038784146308898926, 0.022172803059220314, -0.000722824945114553, -0.01500843744724989, -0.009401838295161724, -0.024131055921316147, 0.029851442202925682, 0.029529288411140442, 0.13539540767669678, -0.04245675727725029, -0.010055053047835827, -0.024048496037721634, -0.047782763838768005, 0.015597573481500149, 0.017222406342625618, -0.01188657432794571, 0.0022286539897322655, -0.026588523760437965, -0.013222670182585716, 0.0024079005233943462, 0.014262569136917591, 0.04169740527868271, -0.050311554223299026, 0.043021176010370255, -0.0031440805178135633, 0.0009455080726183951, -0.0028288522735238075, 0.0300336554646492, 0.02370399236679077, -0.025903191417455673, -0.06085547059774399, 0.0007548917201347649, -0.004923409782350063, -0.006582744885236025, 0.0638803169131279, -0.02363050915300846, 0.011632783338427544, 0.045672837644815445, -0.004125341307371855, 0.001584247569553554, -0.05826839432120323, -0.01725514978170395, -0.010155727155506611, -0.024898583069443703, -0.009545165114104748, 0.01103033684194088, 0.030566593632102013, -0.0415213406085968, 0.021941885352134705, 0.022428983822464943, 0.08087190240621567, 0.005685122217983007, 0.024814721196889877, 0.00650330213829875, 0.019688092172145844, -0.008631513454020023, 0.0016833373811095953, 0.02527555637061596, 0.006022312678396702, 0.04318024590611458, 0.006379269994795322, 0.029383709654211998, 0.010929341427981853, 0.008711854927241802, 0.006035331636667252, -0.007634029723703861, 0.04183468967676163, 0.06902437657117844, -0.006344314198940992, 0.0399690642952919, -0.017208106815814972, -0.015707895159721375, 0.03851638734340668, 0.04833681881427765, 0.020226970314979553, 0.002781729446724057, -0.005951995495706797, 0.05970318615436554, -0.00707407807931304, -0.01800859160721302, 0.008888809010386467, 0.02156035229563713, 0.010861538350582123, -0.009535136632621288, 0.0022929769475013018, -0.0017431736923754215, 0.008042601868510246, 0.02323250286281109, -0.02349284663796425, -0.01071044523268938, -0.029970891773700714, 0.042800404131412506, 0.04415612667798996, -0.02609538845717907, -0.006505547557026148, -0.003909055143594742, -0.018746063113212585, -0.04737027734518051, 0.023049430921673775, -0.04877501353621483, -0.02817312441766262, -0.01879841834306717, 0.000647855456918478, 0.031904060393571854, -0.017298351973295212, -0.0030725880060344934, -0.0016476379241794348, -0.005909985862672329, -0.0016789680812507868, -0.012180977500975132, 0.0012593918945640326, 0.022510575130581856, -0.009762316010892391, -0.013505842536687851, -0.03415249288082123, 0.02847202681005001, -0.027556294575333595, 1.759759834385477e-05, -0.03309129923582077, 0.007227911613881588, 0.025296051055192947, -0.02240067347884178, 0.014719764702022076, -0.028256148099899292, 0.035924721509218216, 0.022899992763996124, -0.01641426421701908, 0.027207691222429276, 0.01465604081749916, 0.006829302292317152, -0.022904738783836365, 0.008721310645341873, -0.03467148542404175, 0.041778650134801865, -0.025586461648344994, 0.003197882790118456, 0.005190941505134106, 0.03088628500699997, -0.05769767612218857, -0.0020366786047816277, -0.005132078658789396, 0.015108318999409676, -0.07674470543861389, 0.02274009957909584, 0.003501971485093236, 0.0003452090313658118, 0.011117960326373577, -0.009059335105121136, -0.012189936824142933, 0.024356385692954063, -0.011373069137334824, -0.006176490802317858, -0.033618681132793427, 0.025800485163927078, -0.02053145132958889, 0.0019415015121921897, -0.000963185157161206, -0.029270987957715988, -0.020962253212928772, -0.005828039720654488, -0.0015025907196104527, -0.03464639186859131, 0.00820536445826292, -0.018361346796154976, 0.022942842915654182, -0.027020270004868507, 0.012727412395179272, 0.0074127111583948135, 0.08982285112142563, -0.05239344760775566, -0.0034575050231069326, 0.0039175706915557384, 0.02490568906068802, 0.00852375477552414, -0.009680421091616154, -0.033656977117061615, 0.056705329567193985, 0.12252907454967499, 0.016247542575001717, -0.018495362251996994, 0.004370903130620718, -0.005527877248823643, 0.005683204159140587, 0.01408082153648138, -0.00984178762882948, 0.04793178290128708, -0.005858293734490871, -0.026013534516096115, -0.047697119414806366, -0.009812070988118649, 0.000720841926522553, -0.014442226849496365, 0.0036989895161241293, -0.024538559839129448, 0.033655814826488495, 0.004670568276196718, 0.0015936793060973287, 0.004511144943535328, -0.019104817882180214, 0.009840733371675014, 0.014142659492790699, -0.008496426977217197, 0.023999691009521484, 0.008003517985343933, -0.013732359744608402, 0.01675039902329445, -0.03829624503850937, 0.004343609791249037, 0.03817353397607803, 0.021104197949171066, 0.011076544411480427, -0.07055993378162384, 0.024058056995272636, -0.04930376261472702, -0.001148780807852745, -0.028002403676509857, -0.061859361827373505, 0.029170431196689606, 0.02824084274470806, -0.005728395655751228, -0.08610808849334717, -0.015012938529253006, 0.02699429541826248, 0.02883157506585121, 0.0002683551574591547, 0.017513412982225418, 0.01157260313630104, 0.021687693893909454, -0.013641220517456532, -0.032335951924324036, -0.026396330446004868, -0.0573970302939415, 0.08002828806638718, -0.015110628679394722, 0.018656274303793907, -0.0010861316695809364, -0.0029027373529970646, -0.06703632324934006, -0.014791288413107395, -0.04093176871538162, 0.0406956821680069, -0.019840508699417114, 0.018240606412291527, 0.0026358782779425383, 0.007611323148012161, 0.04076925665140152, 0.03632558137178421, -0.05297200754284859, -0.02562659978866577, -0.037784092128276825, -0.0027161177713423967, -0.0067523568868637085, 0.0017688812222331762, -0.03058803826570511, 0.016933687031269073, -0.012886742129921913, 0.02839583344757557, -0.0004609414318110794, 0.07054650783538818, -0.03168940916657448, -0.0054816375486552715, 0.042317360639572144, 0.010225638747215271, 0.009447077289223671, 0.029693739488720894, -0.018253639340400696, 0.015237188898026943, -0.04976959526538849, 0.0039631277322769165, 0.006380042992532253, 0.0005226886714808643, -0.012197053991258144, 0.0056444816291332245, -0.014795255847275257, -0.03651911020278931, 0.006005181930959225, -0.021779505535960197, 0.014481631107628345, 0.03449421003460884, 0.054478418081998825, -0.03656787797808647, 0.004509574268013239, -0.005085850600153208, -0.025435958057641983, -0.09082282334566116, 0.01223694533109665, 0.058979786932468414, -9.147146192844957e-05, -0.011252468451857567, -0.02551307901740074, -0.0156712643802166, -0.03202972933650017, 0.009006401523947716, -0.0071490113623440266, 0.0068269227631390095, 0.026371844112873077, 0.012874406762421131, 0.012801096774637699, -0.002995270537212491, 0.01261027343571186, 0.019794872030615807, -0.021372664719820023, 0.00017599287093617022, 0.011066592298448086, -0.04901909455657005, 0.05538948252797127, 0.07576993107795715, 0.0006976104341447353, 0.01932498998939991, -0.04156403988599777, -0.04976506531238556, 0.016074124723672867, 0.04969029128551483, -0.008036231622099876, 0.02167450822889805, -0.028081616386771202, 0.002045605331659317, -0.008993024006485939, -0.002889375202357769, 0.0025254501961171627, -0.030177896842360497, -0.004384235013276339, 0.06606025248765945, 0.00835577491670847, 0.027402391657233238, -0.0192959476262331, -0.038001105189323425, 0.02877211570739746, 0.023676306009292603, -0.049384523183107376, -0.005117001011967659, -0.0385805182158947, 0.01037723571062088, -0.05420751869678497, 0.0413484200835228, 0.007204663474112749, -0.015180268324911594, -0.04699584096670151, -0.03423336520791054, 0.009313410148024559, -0.020268945023417473, -0.039036381989717484, -0.020104659721255302, 0.041263073682785034, 0.02190856821835041, 0.02024426870048046, 0.006135211326181889, -0.024584416300058365, 0.011246496811509132, -0.03950362652540207, -0.003064998658373952, -0.00337029411457479, 0.045504771173000336, 0.003908995073288679, -0.01896652951836586, -0.0035441832151263952, -0.010868909768760204, 0.005723851267248392, -0.004048299044370651, 0.02049338072538376, 0.009767264127731323, 0.002333757234737277, 0.0035193029325455427, 0.010267716832458973, -0.017708659172058105, 0.026968345046043396, 0.03664872795343399, 0.00762273371219635]" ./train/goblet/n03443371_7918.JPEG,goblet,"[-0.038609180599451065, 0.056419022381305695, 0.01496845856308937, 0.012909938581287861, 0.026058869436383247, 0.01156141608953476, -0.005816024728119373, 0.01570011116564274, 0.04172535613179207, -0.01198459230363369, 0.0002308467373950407, -0.022306043654680252, 0.012552003376185894, -0.02528570219874382, 0.03694736212491989, -0.0018610437400639057, 0.02681403048336506, 0.028877774253487587, 0.011397456750273705, 0.020654059946537018, -0.07727669924497604, 0.041496649384498596, 0.0021699643693864346, -0.04941689968109131, 0.025440780445933342, 0.04584157466888428, 0.010923714376986027, -0.036866188049316406, 0.037470389157533646, -0.01852947100996971, -0.01898357644677162, 0.017130684107542038, -0.020563386380672455, -0.04292325675487518, 0.001437405589967966, -0.011308282613754272, -0.006946082226932049, -0.012064863927662373, -0.006601699162274599, 0.08291735500097275, -0.042302798479795456, 0.01255758572369814, 0.010488674975931644, 0.0027511529624462128, -0.007193489465862513, -0.1888875812292099, 0.008857227861881256, 0.017531204968690872, 0.020109571516513824, 0.00047854805598035455, -0.030958160758018494, 0.001616375520825386, 0.006541392765939236, -0.012599946931004524, 0.03829580917954445, -0.040224164724349976, -0.07071288675069809, 0.019374528899788857, 0.002153279958292842, 0.036102283746004105, -0.05042930692434311, -0.02281740866601467, 0.02165352739393711, 0.004539842251688242, 0.015292258933186531, 0.01900831051170826, 0.03284737840294838, 0.03220171481370926, -0.049010276794433594, 0.03381170332431793, -0.0317351259291172, 0.0013243099674582481, -0.0013810409000143409, -0.003912079613655806, -0.020517239347100258, 0.020635806024074554, -0.06712322682142258, 0.020475560799241066, 0.027246519923210144, -0.03291764855384827, -0.005413197446614504, -0.02893870882689953, 0.006564901676028967, 0.01968112401664257, 0.013470066711306572, 0.0013236755039542913, -0.006796164903789759, -0.00458510871976614, 0.04122786223888397, -0.0006038801511749625, -0.02932620793581009, 0.018039638176560402, -0.6198961734771729, 0.014715454541146755, -0.010637580417096615, 0.02100718766450882, -0.004270259290933609, 0.020956315100193024, 0.06339749693870544, 0.1101880669593811, -0.006212256383150816, -0.04943561181426048, -0.0850403755903244, 0.027341263368725777, -0.03769558295607567, -0.06209046021103859, -0.051669176667928696, 0.015524644404649734, 0.04790443554520607, -0.02188653126358986, 0.012060063891112804, -0.013576222583651543, 0.027335692197084427, 0.006267134565860033, -0.0156488586217165, -0.017674097791314125, 0.008793462067842484, 0.038532011210918427, -0.02189631573855877, -0.014434613287448883, 0.014202007092535496, -0.04284414276480675, 0.020547306165099144, -0.007214083336293697, -0.007821392267942429, 0.0370200015604496, -0.04833187535405159, 0.04693598300218582, 0.01136916596442461, -0.0036361846141517162, 0.025501158088445663, -0.05406811460852623, 0.03249193727970123, 0.08194133639335632, 0.046918198466300964, -0.02110218070447445, -0.01879086159169674, 0.03202702850103378, 0.0016738666454330087, 0.05490201339125633, 0.002240352798253298, 0.026302775368094444, -0.0053512356244027615, 0.06305457651615143, -0.01252066995948553, -0.009389941580593586, -0.03974852338433266, -0.047027837485075, -0.032251302152872086, -0.00360672059468925, -0.0022440841421484947, 0.010047472082078457, 0.058821067214012146, -0.029516898095607758, 0.03435893729329109, -0.005564470309764147, -0.0007575892377644777, 0.04889214038848877, -0.05383596196770668, 0.0027092082891613245, -0.0136633375659585, -0.02421380952000618, 0.020394328981637955, -0.02575761079788208, 0.0010151612805202603, 0.028146423399448395, 0.041439227759838104, -0.01174347847700119, 0.0007358142756856978, -0.03747659549117088, -0.004819008521735668, 0.04042255878448486, -0.025473911315202713, -0.008571479469537735, 0.012264103628695011, 0.014466737397015095, 0.07881180942058563, -0.01988711580634117, -0.00763845257461071, 0.004007289186120033, 0.03678707778453827, -0.03150247037410736, 0.05826040729880333, -0.01449720747768879, -0.03415301442146301, 0.007728885859251022, -0.019845692440867424, 0.010280143469572067, -0.03001219965517521, -0.00539708836004138, 0.012087943963706493, 4.1549643356120214e-05, 0.06893990933895111, 0.02184533141553402, 0.05499016493558884, 0.023240558803081512, -0.020756768062710762, -0.002236840082332492, -0.038068704307079315, 0.017082057893276215, -0.0037514525465667248, -0.0025853714905679226, 0.02831161767244339, 0.005326415412127972, 0.03453630581498146, -0.018025971949100494, -0.005421932321041822, 0.014901776798069477, -0.014310902915894985, 0.005971335805952549, -0.028098955750465393, 0.06060619652271271, -0.047130946069955826, -0.04287928715348244, 0.0075881024822592735, -0.07382271438837051, 0.019807692617177963, 0.07984103262424469, 0.07197127491235733, 0.000650233356282115, 0.0015298058278858662, 0.014902351424098015, -0.016616806387901306, -0.004854575730860233, 0.024659011512994766, 0.009368211030960083, -0.012429200112819672, -0.00898392777889967, -0.03096579760313034, 0.0032054968178272247, 0.00872099120169878, 0.0052035776898264885, -0.026427363976836205, 0.04294085130095482, -0.023564742878079414, -0.0016028156969696283, 0.05065150186419487, -0.019167086109519005, -0.043547600507736206, 0.006276825908571482, 0.0026595157105475664, 0.004317507613450289, -0.004041296895593405, -0.013432699255645275, -0.06596385687589645, 0.036609064787626266, -0.012288842350244522, 0.017121458426117897, -0.046322986483573914, 0.03399280831217766, -0.011563429608941078, 0.012427842244505882, -0.031433459371328354, -0.03707262873649597, -0.026849864050745964, -0.051400795578956604, -0.030077902600169182, -0.010891233570873737, -0.03214425593614578, 0.02762182615697384, -0.013688708655536175, -0.030797617509961128, -0.026788901537656784, 0.005549667403101921, 0.03106882981956005, -0.03321722894906998, -0.010013028047978878, -0.013902861624956131, 0.03230247274041176, 0.0072776032611727715, 0.009657906368374825, 0.008752170018851757, 0.023640872910618782, 0.02819710597395897, 0.04544874653220177, 0.04617695510387421, -0.01830451563000679, -0.017765941098332405, -0.016614504158496857, -0.04595206677913666, 0.03421418368816376, 0.029659179970622063, 0.0048304093070328236, 0.0450725331902504, -0.017013393342494965, -0.005361126270145178, 0.01009234506636858, -0.022677108645439148, 0.003349443431943655, -0.06867238134145737, 0.026912063360214233, -0.020040150731801987, 0.014903077855706215, 0.00917087309062481, -0.006434210110455751, 0.02974000945687294, -0.021102385595440865, 0.025179678574204445, 0.0025253426283597946, 0.04655146598815918, -0.008568030782043934, -0.00415349705144763, 0.008520699106156826, 0.015332363545894623, 0.0073361750692129135, -0.019483430311083794, 0.05092897638678551, 0.08083993941545486, 0.03165961802005768, 0.016863420605659485, 0.011227092705667019, 0.0336153507232666, 0.08191310614347458, -0.010401136241853237, 0.0009460963192395866, -0.02972884103655815, 0.06746616214513779, 0.045778803527355194, 0.01763625629246235, -0.017706481739878654, 0.014498325064778328, 0.1702522188425064, -0.01727386564016342, -0.04099700599908829, 0.0236425269395113, 0.004163314122706652, 0.021413054317235947, -0.02650105208158493, -0.04089115560054779, -0.016856255009770393, 0.04122543707489967, -0.00016651730402372777, -0.042206693440675735, -0.019627518951892853, -0.04635240137577057, -0.002338727470487356, 0.03057417832314968, -0.0021194452419877052, 0.002314231591299176, 0.04127063229680061, 0.019159050658345222, -0.017172005027532578, -0.028450343757867813, -0.0015729230362921953, 0.02427557297050953, -0.01219040248543024, 0.0036751071456819773, -0.027977976948022842, 0.013649631291627884, 0.00042477899114601314, 0.05015479400753975, 0.002529275370761752, 0.005850520450621843, 0.031669192016124725, -0.03083023987710476, -0.00399965513497591, -0.050942882895469666, -0.06982851773500443, -0.03295983746647835, 0.0442059226334095, -0.08696222305297852, 0.01542575005441904, 0.01176852360367775, 0.030657244846224785, -0.0864015594124794, 0.014542222954332829, -0.01670989580452442, 0.05212681367993355, 0.04105575010180473, 0.03419870138168335, 0.0036551831290125847, 0.020413033664226532, -0.016762569546699524, 0.013573640957474709, 0.028419988229870796, -0.016075070947408676, 0.1120222881436348, -0.009041676297783852, -0.009755618870258331, -0.0085597587749362, -0.025784259662032127, -0.06466089934110641, -0.010249854065477848, 0.013471721671521664, 0.0248890183866024, -0.008355329744517803, -0.007491994649171829, -0.0074028922244906425, -0.030711613595485687, -0.07869423925876617, -0.012360064312815666, 0.03545433655381203, 0.01212631817907095, -0.032713279128074646, -0.0425926148891449, 0.016527174040675163, -0.014952514320611954, -0.05115979164838791, 0.06825530529022217, 0.010864517651498318, 0.016510363668203354, -0.03362860158085823, 0.1039583757519722, -0.012502335011959076, -0.035776253789663315, 0.010357500053942204, 0.016582811251282692, 0.0024085366167128086, -0.04570414870977402, -0.044991347938776016, -0.031087353825569153, 0.04271797090768814, -0.02090076357126236, -0.03909660875797272, -0.046187277883291245, 0.002499347785487771, -0.030712973326444626, -0.041914649307727814, 0.019224664196372032, 0.013683303259313107, -0.014231556095182896, -0.022730423137545586, 0.019762936979532242, 0.0790340006351471, -0.032099589705467224, -0.02278434857726097, -0.0034545620437711477, -0.012530719861388206, -0.06493090093135834, 0.04233884811401367, 0.004353267140686512, 0.03783436492085457, 0.14700299501419067, -0.0781678706407547, 0.010875394567847252, 0.010376621037721634, 0.02771046571433544, -0.0402582623064518, 0.04918023198843002, -0.03003499284386635, -0.019232746213674545, 0.0017575749661773443, 0.019440749660134315, 0.007208380848169327, 0.01380722876638174, 0.0009640012285672128, -0.0036598173901438713, 0.00222307862713933, -0.034636981785297394, 0.016091005876660347, -0.011167322285473347, -0.022774990648031235, -0.019455432891845703, -0.030370118096470833, 0.005049252416938543, 0.014347592368721962, 0.04219277203083038, -0.039944496005773544, -0.024341655895113945, -0.007543455809354782, 0.03372199088335037, 0.003411842742934823, 0.027904890477657318, -0.01536228135228157, 0.02496332861483097, -0.024595919996500015, 0.011895743198692799, 0.0034661460667848587, -0.033085085451602936, -0.012090051546692848, 0.01228837389498949, 0.034495435655117035, -0.0034771671053022146, -0.04486094415187836, -0.03023269772529602, -0.043778471648693085, 0.026129020377993584, -0.017625389620661736, 0.03145695477724075, 0.010460259392857552, 0.038303811103105545, 0.00820110272616148, -0.02587944082915783, 0.04095165804028511, -0.020979981869459152, -0.03522453457117081, -0.01029573380947113, 0.047254178673028946, 0.047745201736688614, 0.006672396324574947, -0.0414205938577652, -0.01236194558441639, 0.04260735586285591, -0.07458686828613281, -0.011203574016690254, 0.001673207152634859, 0.033267781138420105, 0.05150097236037254, -0.019038954749703407, -0.006664011627435684, 0.011275190860033035, 0.001120575936511159, 0.02919001318514347, 0.03354806452989578, 0.03754347190260887, -0.048952989280223846, 0.054853640496730804, -0.012274923734366894, -0.029457878321409225, 0.07257138192653656, -0.019818171858787537, -0.00028284176369197667]" ./train/knee_pad/n03623198_9535.JPEG,knee_pad,"[0.006466824561357498, 0.04400472715497017, 0.009573608636856079, -0.047293782234191895, 0.07289715111255646, -0.026150427758693695, -0.004637961275875568, 0.04900703579187393, 0.0001217102981172502, -0.029360616579651833, 0.0019046824891120195, 0.027078520506620407, 0.06104636937379837, 0.016497928649187088, -0.006985378451645374, -0.033144913613796234, 0.13010726869106293, 0.03791212663054466, 0.012712035328149796, -0.008114607073366642, -0.03361664339900017, 0.014042750932276249, -0.020842179656028748, -0.006692740600556135, -0.051393844187259674, 0.012538271956145763, 0.037970270961523056, -0.01859433762729168, -0.01346617005765438, -0.015138568356633186, 0.021674269810318947, 0.014702018350362778, -0.02337748184800148, 0.012039832770824432, -0.0645899847149849, -0.027555372565984726, -0.012699038721621037, 0.007801620289683342, -0.027185771614313126, 0.0020565581507980824, -0.01939145289361477, -0.013854109682142735, 0.019615763798356056, -0.004307736176997423, 0.019101638346910477, -0.04178435355424881, -0.0014269704697653651, -0.0017359066987410188, 0.019312134012579918, -0.051984746009111404, 0.054469019174575806, 0.0671834871172905, 0.007353825028985739, -0.013898966833949089, 0.01887618936598301, 0.006567249074578285, -0.025662768632173538, 0.03360678628087044, 0.030500054359436035, -0.04278961941599846, 0.058560214936733246, 0.005078699439764023, 0.03555558994412422, -0.014058123342692852, -0.013847747817635536, -0.01009081955999136, -0.0016623459523543715, 0.03084002062678337, 0.018877863883972168, -0.03597664833068848, -0.016369428485631943, -0.02246151678264141, 0.03936561569571495, -0.01656326651573181, -0.008207306265830994, -0.0020277760922908783, -0.024059539660811424, -0.03516794368624687, -0.01218012161552906, -0.02592969499528408, 0.005850037559866905, -0.05292217805981636, 0.0009519317536614835, -0.044431786984205246, 0.049281589686870575, 0.01673125848174095, 0.022943906486034393, -0.03316865116357803, -0.06911185383796692, 0.012674384750425816, -0.01985105872154236, -0.02712509222328663, -0.6984902620315552, 0.030426369979977608, 0.015150538645684719, -0.004556579980999231, -0.0004788349906448275, 0.02799321711063385, -0.01780642755329609, 0.014964902773499489, 0.009503228589892387, -0.02871314249932766, 0.012586099095642567, 0.0016132188029587269, 0.03637613356113434, -0.011421357281506062, -0.16746002435684204, 0.006823510397225618, -0.0035184891894459724, -0.032393261790275574, 0.02670959010720253, -0.010585957206785679, -0.009321589954197407, -0.029059790074825287, -0.0045162891037762165, 0.005406274925917387, 0.018342427909374237, -0.02282951958477497, 0.014205175451934338, -0.0070312065072357655, -0.005511418450623751, -0.0161990225315094, 0.019454555585980415, 0.02060621976852417, 0.004043548833578825, 0.020816097036004066, -0.007786175236105919, 0.0031442642211914062, 0.005890835542231798, -0.009181639179587364, 0.024162890389561653, -0.03846520557999611, -0.027988208457827568, 0.09081414341926575, -0.015736589208245277, 0.012912554666399956, 0.0036112419329583645, -0.029585538432002068, -0.01788344979286194, -0.006766922306269407, 0.035871461033821106, 0.007549104280769825, -0.020162289962172508, -0.023659801110625267, -0.05558342486619949, 0.020047800615429878, -0.009549159556627274, -0.026299485936760902, 0.00011716157314367592, -0.061604712158441544, 0.018933197483420372, -0.047895364463329315, 0.03200400620698929, -0.0371243841946125, -0.01987386681139469, 0.0005121536669321358, 0.005921907722949982, 0.015018426813185215, -0.02775007300078869, -0.005140002816915512, 0.005419366527348757, -0.00811490323394537, 0.016186045482754707, 0.02716102823615074, 0.030022146180272102, -0.021901791915297508, -0.006690189242362976, -0.030093319714069366, 0.03132215142250061, -0.0030671372078359127, -0.00040500584873370826, -0.01867138408124447, 0.03352857381105423, -0.020026421174407005, 0.0038478716742247343, -0.03051173686981201, 0.024587765336036682, 0.04073350504040718, 0.015320667065680027, -0.03012041002511978, 0.051716115325689316, -0.009221792221069336, 0.05383417755365372, -0.008649460971355438, -0.034441541880369186, -0.011054106056690216, 0.04685841128230095, -0.030667336657643318, -0.03332249075174332, -0.0037245999556034803, 0.0007131331949494779, -0.015450571663677692, -0.008801274001598358, -0.00047029784764163196, 0.04034901410341263, 0.003551928559318185, -0.02128426730632782, -0.022425038740038872, -0.05517592653632164, 0.033737119287252426, 0.019924921914935112, 0.0033494033850729465, -0.011993946507573128, 0.043963413685560226, 0.01398820523172617, 0.035283301025629044, -0.012725042179226875, 0.009940766729414463, -0.0022729947231709957, 0.006470391992479563, 0.013709049671888351, 0.022041914984583855, 0.04274619743227959, 0.01213260367512703, 0.001969328848645091, 0.007384716533124447, 0.004413464572280645, 0.005171908065676689, 0.04845082387328148, -0.02734341472387314, 0.0439375601708889, -0.07358179241418839, -0.013941175304353237, 0.041226256638765335, 0.0157703198492527, -0.005145508795976639, -0.029439754784107208, -0.005796329118311405, 0.017913421615958214, 0.008866379968822002, 0.022685201838612556, 0.02945513091981411, -0.0016903874929994345, 0.039868153631687164, 0.026700610294938087, 0.011853267438709736, 0.018014371395111084, -0.010021121241152287, -0.03686092793941498, -0.014328369870781898, 0.03702600300312042, 0.012772426009178162, 0.022737380117177963, 0.012122418731451035, 0.025059159845113754, 0.026329241693019867, 0.005710398778319359, 0.014990022405982018, 0.0023293953854590654, 0.019979586824774742, 0.005745109636336565, -0.003642086172476411, 0.007413760758936405, -0.020892661064863205, 0.010526768863201141, 0.024726325646042824, 0.00873375590890646, -0.007245634216815233, -0.024337656795978546, 0.013508985750377178, 0.02243594452738762, -0.0023291732650250196, 0.006413885857909918, -0.04303522780537605, 0.029379602521657944, 0.027595797553658485, 0.006591833662241697, -0.012427500449120998, 0.01929113082587719, -0.017939867451786995, -0.035194892436265945, -0.0019842784386128187, -0.0048109847120940685, 0.010852472856640816, 0.023908182978630066, -0.03763105720281601, 0.01853281445801258, 0.001458752085454762, -0.043613165616989136, 0.021344270557165146, 0.0009695661719888449, 0.04332311823964119, -0.0455746054649353, -0.051625560969114304, -0.007252574432641268, -0.0009798657847568393, 0.16661114990711212, 0.012929324060678482, -0.005849534645676613, -0.040234971791505814, 0.03429432213306427, 0.002750223269686103, -0.0043647573329508305, 0.025422751903533936, -0.032508671283721924, 0.03266990929841995, -0.014452820643782616, -0.015046264976263046, 0.02419891208410263, -0.019872069358825684, 0.0034128136467188597, -0.02324303612112999, -0.011903764680027962, -0.0018801484256982803, -0.047561973333358765, -0.07902159541845322, 0.0338982418179512, -0.005034530069679022, -0.008189058862626553, 0.01326590683311224, -0.003977241460233927, -0.021897559985518456, 0.09077587723731995, 0.018099961802363396, 0.0033682198263704777, -0.029636118561029434, 0.014723741449415684, -0.020115064457058907, -0.022796357050538063, -0.05037892982363701, 0.04262496158480644, 0.17162807285785675, -0.0029743339400738478, -0.023864800110459328, 0.0058697243221104145, -0.010198220610618591, 0.0067998263984918594, 0.0526813268661499, 0.0007071734289638698, 0.028529206290841103, 0.0014835456386208534, 0.031435277312994, 0.008002289570868015, -0.01127990335226059, -0.016119707375764847, -0.02151276357471943, -0.04226638004183769, 0.020610269159078598, -0.01038274448364973, -0.044657617807388306, -0.006707182619720697, 0.01621849089860916, -0.014857239089906216, -0.003042628290131688, 0.010361635126173496, 0.045477285981178284, 0.041247762739658356, 0.002535824663937092, 0.016109135001897812, -0.027031689882278442, 0.030769670382142067, 0.0046736397780478, 0.05039483308792114, 0.005918261129409075, 0.0714525580406189, -0.0490439236164093, -0.037166792899370193, 0.0296790674328804, 0.07019680738449097, 0.01241354364901781, 0.0707380399107933, -0.002945509972050786, -0.044215552508831024, -0.04101330414414406, -0.08327756822109222, 0.002142254961654544, 0.024657566100358963, -0.009498583152890205, -0.01251551229506731, -0.011907611042261124, -0.019347988069057465, 0.00822782889008522, 0.0015323868719860911, 0.043439410626888275, 0.0051640234887599945, -0.01951400376856327, 0.0028489017859101295, -0.0008615980623289943, -0.03223831206560135, 0.007316067349165678, 0.040159210562705994, -0.031217608600854874, -0.000266123388428241, 0.00021858830587007105, 0.020132141187787056, 0.008048749528825283, 0.011350257322192192, 0.021644260734319687, 0.024577055126428604, -0.053694721311330795, -0.0978977233171463, -0.049430858343839645, -0.022014601156115532, -0.03571194037795067, -0.030792009085416794, 0.025476429611444473, 0.00816761702299118, -0.02533048763871193, -0.008014368824660778, -0.01388829667121172, 0.00021657974866684526, 0.031135840341448784, 0.08667450398206711, 0.001160473213531077, 0.029097840189933777, -0.04702091962099075, 0.000561871740501374, 0.02809015102684498, 0.002499242313206196, -0.018331635743379593, 0.033087246119976044, 0.007082303054630756, 0.010312470607459545, 0.07547380030155182, -0.03480900079011917, 0.013594038784503937, -0.01250292919576168, 0.0050179981626570225, -0.0937836542725563, -0.056616611778736115, 0.00020272440451662987, 0.0052647837437689304, 0.002754698973149061, -0.005455445498228073, 0.01839245855808258, 0.03453569486737251, -0.005348429083824158, -0.034419067203998566, -0.10003790259361267, -0.007746282033622265, 0.025980453938245773, -0.010164952836930752, 0.0154604846611619, -0.03916453570127487, -0.017316307872533798, -0.015747245401144028, 0.00021510296210180968, 0.0064186048693954945, 0.02054779790341854, -0.01736713945865631, -0.012140371836721897, 0.045288946479558945, 0.027347713708877563, 0.02071005292236805, -0.027422405779361725, 0.027695395052433014, 0.027976585552096367, 0.00857736449688673, 0.004145887680351734, 0.004194710403680801, -0.004617678001523018, 0.011201675981283188, -0.0008426818531006575, -0.04727037996053696, -0.028307026252150536, 0.027947572991251945, -0.0019344326574355364, 0.014482918195426464, 0.00026733471895568073, -0.02603091299533844, 0.013192807324230671, 0.02900564856827259, -0.0024529495276510715, 0.021042821928858757, 0.04554808512330055, 0.02547059953212738, 0.021065566688776016, -0.0042849695309996605, -0.016202889382839203, -0.018454011529684067, 0.011373003013432026, 0.011575235053896904, 0.05693244934082031, -0.044570475816726685, 0.01943575218319893, 0.006085551343858242, -0.009424279443919659, 0.0200678501278162, -0.020409535616636276, -0.02415689080953598, -0.0373997762799263, -0.02619588002562523, 0.008136026561260223, -0.02839510515332222, 0.03006657212972641, 0.018902817741036415, 0.008414615876972675, 0.016284115612506866, 0.0024189066607505083, -0.014710663817822933, -0.029650215059518814, -0.0222600270062685, 0.02790522202849388, -0.003268368309363723, -0.0204617902636528, -0.021620823070406914, -0.010084290988743305, -0.05182366073131561, -0.0020812428556382656, -0.0021640751510858536, 0.03415057063102722, 0.0002661696926224977, -0.015934722498059273, -0.0014123532455414534, 0.008533275686204433, -0.03585905581712723, -0.010476323775947094, -0.0016209838213399053, -0.00479645561426878, 0.09359264373779297, 0.015102505683898926, 0.001574956113472581]" ./train/knee_pad/n03623198_4447.JPEG,knee_pad,"[-0.02464980259537697, -0.0031989342533051968, -0.008050726726651192, 0.009623080492019653, 0.03501517325639725, -0.03535924479365349, -0.003053216030821204, -0.0133361229673028, 0.056066304445266724, 0.0198703370988369, 0.032325249165296555, 0.024504711851477623, 0.06443525850772858, 0.017245255410671234, -0.047971971333026886, -0.026915395632386208, 0.07244671881198883, 0.006005171220749617, 0.0019552106969058514, 0.021384600549936295, -0.08761771768331528, 0.015574968419969082, -0.006080497521907091, -0.031016308814287186, -0.002128190128132701, 0.015767402946949005, 0.018609995022416115, -0.03423122689127922, 0.00345241860486567, 0.012976780533790588, -0.014645244926214218, -0.023290708661079407, 0.0019986643455922604, -0.03314288333058357, -0.062395233660936356, -0.026148460805416107, 0.0050703841261565685, -0.0074093458242714405, -0.03145139291882515, 0.014365795068442822, -0.009241163730621338, -0.025075919926166534, 0.025438467040657997, -0.009640416130423546, 0.014755665324628353, -0.13427621126174927, 0.017079591751098633, 0.024546543136239052, 0.039588578045368195, -0.021946143358945847, 0.05079222097992897, 0.034253694117069244, 0.021643223240971565, -0.020566804334521294, -0.0035712970420718193, -0.00948723591864109, -0.026906205341219902, -0.025300558656454086, -0.017184561118483543, -0.02966865710914135, 0.02334950491786003, 0.007185937371104956, 0.03221319988369942, -0.005163155030459166, -0.010696912184357643, -0.04590163007378578, 0.06140388920903206, 0.009853504598140717, -0.034625496715307236, -0.003970974124968052, -0.019057199358940125, -0.005785295274108648, -0.0007336369017139077, -0.008436515927314758, 0.012538355775177479, 0.022742046043276787, -0.018079863861203194, -0.015338312834501266, 0.004693511873483658, 0.006391759961843491, 0.013288801535964012, -0.018737202510237694, -0.018972164019942284, -0.053769007325172424, 0.029125504195690155, 0.008002487011253834, 0.05030134692788124, 0.02664649672806263, -0.06469649821519852, -0.00014259903400670737, -0.0033195274882018566, 0.00697353295981884, -0.6827329397201538, 0.06519073247909546, 0.049035146832466125, 0.002428311388939619, -0.010409997776150703, -0.003135453211143613, -0.03751835599541664, 0.060812849551439285, -0.021422727033495903, -0.049616165459156036, 0.00532244797796011, -0.03644467517733574, 0.022532140836119652, 0.005282638594508171, -0.1623820960521698, -0.0155281787738204, 0.01261983159929514, -0.010553252883255482, -0.02223879098892212, -0.043769437819719315, 0.0019380744779482484, -0.015200523659586906, -0.01639857329428196, -0.006902710068970919, 0.0663810670375824, 0.002187869744375348, -0.004031572490930557, -0.017462417483329773, -0.020337138324975967, 0.006738252006471157, 0.0038709300570189953, 0.010910297743976116, -0.0035166593734174967, 0.05736411735415459, -0.0176988635212183, 0.028645606711506844, -0.004093576688319445, 0.021497370675206184, 0.0371924452483654, 0.021765029057860374, 0.002201191382482648, 0.08318755030632019, -0.009304681792855263, 0.004247634671628475, 0.022046754136681557, -0.04902719706296921, 0.0018601261544972658, 0.0017619122518226504, 0.023869996890425682, -0.014639372006058693, -0.0015002097934484482, -0.01178612932562828, 0.023085545748472214, 0.011824582703411579, 0.0027681076899170876, -0.06908431649208069, -0.03480049595236778, -0.0007908170809969306, -0.0041220709681510925, -0.0036844885908067226, 0.05413578078150749, -0.023952508345246315, -0.03206286206841469, 0.004955900367349386, 0.029038961976766586, 0.004701799713075161, 0.028980063274502754, -0.016816573217511177, 0.005282440222799778, -0.010978896170854568, 0.03547690063714981, -0.01340736635029316, 0.001295564346946776, 0.0009120191098190844, -0.02653479017317295, -0.010351702570915222, 0.06893056631088257, -0.004290188197046518, -2.778896259769681e-06, -0.04224943369626999, 0.04043448716402054, -0.03316790238022804, 0.005794083699584007, -0.017304612323641777, 0.07742778211832047, 0.027840880677103996, -0.007968449033796787, 0.006644934415817261, 0.04163624718785286, -0.01811520755290985, 0.00441526435315609, -0.01962176337838173, -0.02750932052731514, -0.034303441643714905, 0.007323421537876129, -0.021215064451098442, -0.02463206648826599, -0.017880674451589584, -0.002660802099853754, 0.031067602336406708, -0.033135656267404556, -0.005301843397319317, 0.04212029278278351, 0.01642444171011448, -0.02461829036474228, 0.01465535443276167, -0.07344183325767517, 0.017633289098739624, 0.02731926180422306, -0.012790982611477375, 0.026629704982042313, 0.025074008852243423, 0.011512973345816135, -0.023391209542751312, -0.029530340805649757, -0.014636395499110222, -0.0034716250374913216, -0.008092803880572319, -0.03282700851559639, -0.010502305813133717, 0.002016301965340972, -0.0115777887403965, -0.02562408521771431, 0.016670672222971916, -0.05652659758925438, -0.011968723498284817, 0.03696422651410103, -0.02285671979188919, 0.029075847938656807, -0.06492675840854645, -0.017060738056898117, 0.04486113414168358, 0.03166802227497101, 0.0567021481692791, -0.0052253371104598045, -0.02718767151236534, -0.01045480277389288, -0.0009610670385882258, 0.0027863015420734882, 0.011647436767816544, -0.03482788801193237, 0.06939634680747986, -0.018194543197751045, 0.054790008813142776, 0.013870649971067905, -0.015854699537158012, -0.023340148851275444, -0.01801106333732605, 0.0033217845484614372, -0.016113843768835068, 0.001907557132653892, 0.004304076079279184, 0.02735038474202156, -0.01388383936136961, -0.03301595151424408, 0.019132375717163086, -0.008578998036682606, 0.02693689800798893, 0.003236593445762992, -0.011594059877097607, -0.01307029277086258, -0.009597135707736015, 0.009997901506721973, 0.006422822829335928, 0.030214253813028336, -0.007181190885603428, 0.03327192738652229, -0.03461401164531708, 0.0625871792435646, -0.003114057704806328, -0.019005032256245613, -0.06207422539591789, -0.03024679236114025, 0.01689164526760578, -0.011380990967154503, -0.03152668476104736, 0.016798503696918488, -0.025295337662100792, 0.011701163835823536, -0.0184736680239439, 0.0033577890135347843, -0.019606387242674828, -0.04306615889072418, -0.00616249768063426, 0.020434770733118057, -0.005707997828722, -0.0020909765735268593, -0.0002738333714660257, -0.0071524945087730885, -0.0031129135750234127, -0.031220262870192528, -0.02725313976407051, 0.00699971616268158, -0.02026035450398922, 0.1260240375995636, -0.03680115193128586, -0.040011800825595856, -0.031084178015589714, 0.03816501423716545, 0.019161462783813477, -0.04355623573064804, 0.016563186421990395, 0.02653653174638748, 0.013127148151397705, 0.0015974221751093864, -0.019163459539413452, 0.001921480754390359, -0.01214019488543272, -0.01466003991663456, 0.002597428159788251, 0.002077316166833043, 0.049598824232816696, -0.027607860043644905, -0.0364389605820179, 0.038346465677022934, 0.030985353514552116, -0.011373728513717651, 0.025968197733163834, -0.03496035560965538, 0.0028152388986200094, 0.08318886905908585, -0.00906636007130146, -0.00321959494613111, 0.006143130827695131, 0.013370371423661709, 0.026896974071860313, 0.014335553161799908, -0.07380785793066025, 0.0030245063826441765, 0.11046755313873291, -0.006421413738280535, -0.02912658266723156, 0.0005918634124100208, 0.004675555974245071, 0.014652418904006481, 0.017587674781680107, -0.02451646327972412, 0.019906949251890182, 0.02172100357711315, 0.012605822645127773, 0.03732241317629814, -0.019823160022497177, -0.0065734367817640305, -0.018360279500484467, -0.004536747932434082, 0.018351605162024498, -0.008040307089686394, -0.02108173631131649, 0.05866360291838646, 0.04979587718844414, -0.011957169510424137, -0.01242033950984478, -0.0470360703766346, 0.02836582250893116, 0.021073587238788605, 0.018161073327064514, -0.008811972104012966, -0.003525943262502551, 0.06693264096975327, -0.006745841819792986, 0.018583254888653755, 0.003556819399818778, 0.016309279948472977, -0.03957125544548035, -0.06798325479030609, 0.01377848070114851, 0.0015089139342308044, -0.023114779964089394, 0.04939631372690201, -0.020365335047245026, 0.02491908334195614, -0.06388196349143982, -0.07905925065279007, -0.0010844995267689228, 0.007775716949254274, 0.03931710124015808, 0.0043797567486763, 0.021914202719926834, -0.022817330434918404, 0.036692872643470764, -0.03454425185918808, 0.02426476590335369, -0.016726937144994736, 0.0028630199376493692, 0.04567570611834526, 0.023891594260931015, 0.003880973206833005, 0.017802175134420395, 0.00961909070611, -0.02489461563527584, -0.02164364792406559, 0.017495766282081604, 0.0019267161842435598, 0.025345884263515472, -0.041247494518756866, 0.011531497351825237, 0.00024709320859983563, -0.011439618654549122, -0.08294161409139633, -0.0012698324862867594, 0.025933198630809784, -0.029929982498288155, -0.020202815532684326, 0.020481789484620094, -0.0003938851004932076, -0.07351072877645493, 0.026226576417684555, 0.0030110974330455065, -0.0038239837158471346, -0.028063910081982613, 0.05265207961201668, -0.03861892223358154, 0.010277210734784603, -0.0032790182158350945, -0.02891567535698414, -0.012083538807928562, 0.02248579077422619, -0.01929989829659462, -0.015258069150149822, -0.0074492208659648895, -0.02601337991654873, 0.015773415565490723, -0.026247495785355568, 0.021390482783317566, -0.008553183637559414, -0.014583361335098743, -0.051872387528419495, -0.021097233518958092, -0.028619565069675446, -0.008841629140079021, -0.018624451011419296, 0.00934747327119112, 0.024366728961467743, -0.02552551031112671, 0.021177297458052635, -0.05434994772076607, -0.17793148756027222, 0.005958836060017347, -0.009512510150671005, -0.036624226719141006, 0.04200039431452751, -0.01820824109017849, -0.004401952028274536, 0.03796270862221718, -0.009423908777534962, -0.012907380238175392, 0.01848664879798889, -0.008920876309275627, -0.012585903517901897, 0.03035263903439045, 0.004930543247610331, 0.0034497363958507776, 0.040016159415245056, -0.01018137950450182, 0.032959986478090286, 0.03583944961428642, 0.0007230752962641418, 0.03999955579638481, -0.03348036855459213, -0.029768748208880424, 0.01361115649342537, -0.0745411068201065, -0.03836787864565849, 0.0003076946013607085, -0.033395301550626755, 0.004181696102023125, 0.026363974437117577, -0.002428939566016197, 0.05955871194601059, 0.04185295104980469, 0.02847788669168949, 0.009280018508434296, 0.047971442341804504, -0.013576668687164783, -0.018927229568362236, -0.009927288629114628, -0.009689133614301682, -0.027564456686377525, -0.0024785541463643312, 0.02391125075519085, 0.033299002796411514, -0.008126828819513321, 0.04977361112833023, 0.001331094652414322, -0.02309102937579155, 0.0062622749246656895, 0.01863066665828228, -0.019994724541902542, 0.024115892127156258, 0.06343282014131546, -0.031636763364076614, 0.001809004694223404, -0.004830148071050644, 0.03571571409702301, -0.001980372704565525, 0.030063854530453682, 0.012980354018509388, -0.01688779704272747, -0.015090969391167164, 0.03671913966536522, 0.0009153412538580596, -0.0257882010191679, 0.005404678173363209, -0.016475137323141098, 0.006285256240516901, -0.04085385426878929, 0.007641238160431385, -0.015113789588212967, 0.015441141091287136, 0.014647671021521091, -0.05401241034269333, -0.007262759376317263, 0.02122085727751255, 0.0010663443244993687, -0.0168346855789423, -0.006874393671751022, -0.00863008014857769, 0.15683422982692719, -0.0339503213763237, 0.015843555331230164]" ./train/knee_pad/n03623198_14123.JPEG,knee_pad,"[0.026738714426755905, 0.035053059458732605, -0.00133652170188725, -0.010319078341126442, -0.004202430136501789, 0.03351037949323654, 0.006546469405293465, 0.015181081369519234, 0.045050136744976044, 0.017597589641809464, 0.03479982540011406, -0.021446384489536285, 0.07373389601707458, 0.006032632663846016, -0.010475297458469868, -0.02345922403037548, 0.00442547770217061, 0.010090798139572144, 0.010224874131381512, -0.02928418107330799, -0.050356313586235046, -0.009856768883764744, -0.010715986602008343, 0.012492391280829906, -0.008688123896718025, 0.013557546772062778, 0.01604975014925003, 0.01127732265740633, 0.03251085430383682, -0.0015748479636386037, -0.017260242253541946, 0.040346018970012665, -0.0011287527158856392, -0.00877274852246046, -0.026646049693226814, 0.006916712503880262, -0.023047644644975662, 0.015078093856573105, -0.006006171461194754, -0.07603093981742859, -0.040401846170425415, -0.025510214269161224, -0.06375270336866379, 0.016887081786990166, 0.018954182043671608, -0.0405120812356472, 0.001681376132182777, 0.05003051832318306, -0.03526388853788376, -0.001296787871979177, 0.07100841403007507, -0.03816337138414383, 0.01970095746219158, -0.001923775183968246, -0.0010850612306967378, 0.028325563296675682, 0.01774301379919052, 0.009562778286635876, -0.0015983945922926068, 0.020461030304431915, 0.12352544069290161, -0.02858910523355007, 0.012572354637086391, -0.0022090915590524673, -0.03748304769396782, -0.007361068855971098, -0.00016656395746394992, 0.03424555063247681, 0.032969970256090164, 0.0450904481112957, -0.007896053604781628, 0.003453323384746909, 0.006014281418174505, -0.011088832281529903, -0.02889149636030197, 0.041958052664995193, 0.014756795950233936, -0.006374165881425142, 0.014246154576539993, -0.024187415838241577, -0.004470999352633953, -0.006260194815695286, 0.026410743594169617, 0.010733703151345253, -0.03560488298535347, 0.010051445104181767, 0.06058530882000923, 0.0013203172711655498, -0.001608578721061349, 0.004113981034606695, 0.004363969434052706, -0.030777674168348312, -0.7135825753211975, -0.003504981053993106, 0.013825828209519386, 0.0016784638864919543, 0.006889057345688343, -0.007815955206751823, -0.0029225933831185102, 0.03664138540625572, 0.04409626126289368, 0.016012227162718773, 0.04805352911353111, -0.0019855943974107504, 0.037304747849702835, -0.027901697903871536, -0.08686478435993195, 0.003023503813892603, -0.0019118175841867924, -0.0005984638119116426, -0.027414416894316673, -0.01907750591635704, -0.015153895132243633, -0.0012385445879772305, -0.05295505002140999, -0.036703921854496, -0.009999183006584644, 0.00899053830653429, 0.002351311268284917, -0.023226071149110794, -0.024100035429000854, 0.004666110500693321, 0.0015951640671119094, 0.004084259737282991, -0.01151960901916027, 0.025135483592748642, 0.016346530988812447, -0.023064492270350456, 0.025812627747654915, 0.016220612451434135, -0.007269671186804771, 0.040527667850255966, 0.016213560476899147, 0.08799814432859421, 0.03406022489070892, 0.010236225090920925, 0.0416361428797245, -0.0804440826177597, -0.010471483692526817, -0.02073473297059536, 0.0008370578289031982, 0.013063178397715092, -0.036131784319877625, 0.01025068387389183, -0.0003861159784719348, 0.01738387532532215, 2.3828570192563348e-05, 0.009885127656161785, 0.003940174356102943, 0.02999098040163517, 0.005700401030480862, -0.016693545505404472, 0.14786815643310547, -0.014182998798787594, 0.05049784481525421, -0.004816671833395958, 0.025702577084302902, -0.019692445173859596, -0.020575756207108498, 0.03063618578016758, 0.008562609553337097, -0.02193816751241684, 0.029676372185349464, -0.0291646309196949, 0.0009784199064597487, -0.03168993070721626, -0.0831809788942337, 0.03501935675740242, 0.001565786311402917, 0.01731797307729721, -0.0365285649895668, -0.014952395111322403, -0.006540663540363312, 0.024839425459504128, 8.806529513094574e-05, -0.03378412500023842, 0.06081689894199371, 0.004495943896472454, 0.02695191465318203, -0.011907854117453098, 0.038533009588718414, -0.039418332278728485, 0.04439384490251541, -0.016569258645176888, -0.03709356486797333, 0.005616756156086922, 0.0010874926811084151, 0.00945891160517931, -0.014079773798584938, 0.016831431537866592, 0.008492863737046719, 0.01514444500207901, -0.024426879361271858, -0.033269234001636505, -0.01221650280058384, -0.01131538674235344, -0.03693170100450516, -0.011498072184622288, -0.018967514857649803, -0.024286232888698578, -0.013897763565182686, 0.002626467263326049, 0.004169350489974022, 0.009462452493607998, 0.038054194301366806, -0.009423697367310524, 0.01972324401140213, 0.004296140279620886, -0.006019026972353458, -0.008660978637635708, 0.021844204515218735, 0.12640708684921265, -0.03741239011287689, 0.020275840535759926, -0.02069185860455036, -0.02592802420258522, -0.0339600145816803, 0.007940447889268398, 0.016802366822957993, -0.0007053637527860701, -0.04187358543276787, 0.018872518092393875, -0.012143248692154884, -0.005366551224142313, 0.0016076740575954318, 0.026292264461517334, -0.009984332136809826, -0.0231382604688406, 0.01843946799635887, -0.012354404665529728, -0.014284891076385975, -0.028188103809952736, 0.0384146049618721, -0.026352155953645706, -0.006559604778885841, 0.007299675140529871, -0.005497086327522993, -0.025662269443273544, 0.018266906961798668, 0.03820325806736946, 0.020840104669332504, 0.013373696245253086, 0.031046107411384583, -0.0062873028218746185, -0.01320692989975214, -0.10979188978672028, 0.010755330324172974, 0.028772834688425064, 0.0041495803743600845, 0.009765064343810081, 0.005023764446377754, 0.00421079620718956, 0.015107414685189724, 0.008267287164926529, -0.004374989774078131, 0.020642127841711044, -0.012798706069588661, 0.021740827709436417, -0.014874929562211037, 0.02110876515507698, -0.010977711528539658, -0.02326872944831848, 0.001106178853660822, -0.015926692634820938, -0.001639345777221024, 0.008885800838470459, -0.028953511267900467, -0.019374947994947433, 0.03128564730286598, 0.010870082303881645, -0.019137641414999962, 0.01292065903544426, -0.0020789816044270992, -0.017252551391720772, 0.012617540545761585, 0.03122028522193432, -0.016704248264431953, -0.024701328948140144, -0.030672172084450722, 0.007944205775856972, -0.015185744501650333, -0.04058804363012314, -0.05578704923391342, -0.003843017155304551, 0.020174240693449974, 0.04786011949181557, -0.10790666937828064, 0.03266645595431328, 0.010188671760261059, 0.016749156638979912, 0.015882467851042747, 0.004225813318043947, 0.0029869647696614265, 0.007105100899934769, -0.03263267129659653, -0.005409418139606714, -0.03135864436626434, -0.009250782430171967, -0.005950802005827427, 0.02022433653473854, 0.009442148730158806, -0.03671892359852791, -0.01642686128616333, 0.004425353370606899, -0.017929019406437874, -0.04422039911150932, -0.05328097939491272, 0.030187362805008888, 0.02200804278254509, 0.01572662964463234, -0.004811770282685757, -0.027274688705801964, 0.08802545815706253, 0.011281133629381657, 0.03740527480840683, 0.030032264068722725, 0.05645114555954933, 0.032246269285678864, -0.030144255608320236, -0.06161170080304146, -0.0006239297799766064, 0.09085994958877563, -0.02870759554207325, -0.004218806978315115, -0.004764878656715155, 0.016135770827531815, 0.0022201749961823225, 0.005588726606220007, -0.009947717189788818, 0.029589155688881874, 0.014235763810575008, 0.0168097373098135, 0.012240939773619175, -0.019931912422180176, -0.0069676656275987625, 0.011692636646330357, -0.0010195940267294645, 0.004038939252495766, 0.03194884583353996, 0.007601393386721611, 0.020804492756724358, -0.04175876826047897, -0.016940638422966003, 0.026742391288280487, 0.005287792067974806, -0.019726261496543884, 0.023783929646015167, -0.010892270132899284, 0.0070218234322965145, 0.018052516505122185, 0.09833239763975143, 0.005996635649353266, 0.029194507747888565, 0.002304577035829425, 0.0005113622173666954, -0.011367008090019226, -0.03769783303141594, 0.02888578176498413, -0.019593019038438797, -0.023851482197642326, 0.05841697379946709, -0.022584350779652596, 0.009924855083227158, -0.03543786332011223, -0.025737004354596138, -0.016579467803239822, 0.0005717118037864566, -0.0919434204697609, 0.0187744852155447, -0.003209721762686968, 0.021706698462367058, 0.002067683730274439, -0.004214161541312933, -0.011952456086874008, 0.0013239487307146192, 0.0022439765743911266, 0.1403043270111084, 0.013143344782292843, -0.03594806045293808, -0.02667166478931904, 0.036687519401311874, -0.019401440396904945, 0.02890520915389061, 0.0036621498875319958, 0.00854232907295227, 0.02929164655506611, 0.01631902903318405, -0.021994393318891525, 0.004548138473182917, -0.032036248594522476, -0.04822984337806702, -0.025053687393665314, -0.026074307039380074, -0.022425172850489616, 0.008292000740766525, 0.02281338907778263, -0.016533982008695602, 0.03646164759993553, 0.06416675448417664, -0.03402961790561676, -0.02334056794643402, 0.021304458379745483, 0.10444005578756332, -0.002580525353550911, 0.004228579346090555, -0.008957291021943092, -0.0203610397875309, -0.0019715812522917986, -0.02160404808819294, -0.03172367066144943, -0.03968366980552673, -0.0291595458984375, 0.030231650918722153, -0.00814666599035263, -0.001335001434199512, 0.0024227146059274673, -0.01612805761396885, 0.05830201879143715, 0.000788122764788568, 0.011088757775723934, 0.014363245107233524, -0.013625998981297016, -0.01870507374405861, 0.04202494025230408, 0.04769698530435562, 0.008220226503908634, -0.01328213233500719, -0.020918600261211395, -0.18581423163414001, 0.0312480591237545, -0.00724015012383461, -0.01577860116958618, 0.017298623919487, 3.0756229534745216e-05, -0.003156340681016445, -0.0189957432448864, 0.018482105806469917, -0.01863965205848217, -0.01739945448935032, 0.020724084228277206, 0.019323505461215973, 0.044335898011922836, -0.016098342835903168, 0.018480725586414337, -0.03582174703478813, -0.04336855933070183, 0.0014370421413332224, 0.024709833785891533, -0.021810365840792656, 0.001751184812746942, 0.0045839594677090645, 0.017507700249552727, 0.06541495770215988, 0.0026840921491384506, 0.006986195687204599, -0.0012206530664116144, 0.027302801609039307, -0.0012065938208252192, -0.02318338118493557, -0.0012918378924950957, -0.018500957638025284, 0.00903103593736887, -0.0030324740801006556, -0.006150136701762676, 0.05006689950823784, -0.05354509502649307, 0.06387734413146973, 0.010061177425086498, 0.02193794958293438, -0.018975911661982536, 0.017097176983952522, -0.05183979123830795, -0.002173670567572117, -0.00875640008598566, 0.013676533475518227, -0.008760164491832256, 0.0007806782377883792, -0.01431348081678152, 0.022589968517422676, -0.012013289146125317, -0.01702277548611164, 0.0009593627182766795, 0.007794695906341076, 0.016384925693273544, 0.016863957047462463, 0.004261242225766182, 0.004227896220982075, -0.00426060613244772, -0.0366465225815773, -0.03947269916534424, 0.035063330084085464, -0.018007708713412285, -0.007112283259630203, -0.04158816859126091, -6.35832329862751e-05, -0.015727318823337555, 0.010352542623877525, -0.01709926128387451, -0.03810398280620575, 0.015770724043250084, -0.014318611472845078, 0.005099005997180939, -0.00452810013666749, 0.005710944999009371, 0.029496902599930763, 0.02517758496105671, 0.01581737771630287, -0.01028421986848116, -0.02389894239604473, 0.03792339935898781, 0.00048134656390175223, -0.014419745653867722]" ./train/knee_pad/n03623198_3552.JPEG,knee_pad,"[0.021083462983369827, 0.010303120128810406, -0.05787020921707153, -0.031605400145053864, 0.021111348643898964, 0.018407894298434258, 0.0027943856548517942, -0.05266115441918373, 0.005270662251859903, -0.026214832440018654, -0.026981983333826065, 0.017489204183220863, 0.06926222890615463, 0.0017828868003562093, 0.012949192896485329, -0.007600801065564156, 0.012718654237687588, 0.06764566898345947, -0.03987414762377739, 0.08722188323736191, -0.11092297732830048, 0.0008099720580503345, 0.014555752277374268, 0.01686250790953636, -0.031176025047898293, -0.011238845065236092, -0.008475744165480137, 0.031226642429828644, 0.004468872211873531, 0.0031900082249194384, -0.004620150197297335, 0.032435085624456406, 0.05092392861843109, 0.020698990672826767, 0.024423271417617798, -0.04396572336554527, -0.009491988457739353, -0.039038654416799545, -0.026366783306002617, -0.04798073321580887, 0.028170736506581306, 0.010169927030801773, -0.0341869555413723, 0.01707136444747448, -0.009673893451690674, -0.0998498722910881, 0.03849988058209419, 0.008217565715312958, -0.007865512743592262, 0.017753228545188904, -0.017788123339414597, -0.010767104104161263, -0.0004521478258538991, 0.02732781134545803, -0.0346890352666378, -0.001230553025379777, 0.05939532071352005, -0.022792251780629158, 0.02497744932770729, -0.049360595643520355, 0.08688096702098846, 0.02132859081029892, -0.03871069476008415, -0.014549736864864826, -0.03195856884121895, -0.0038541185203939676, 0.006232819519937038, 0.03427319601178169, -0.00018562829063739628, 0.01569330506026745, 0.03493805229663849, 0.014129010029137135, 0.0008518215618096292, -0.041221458464860916, 0.028366394340991974, -0.03781803697347641, -0.015210750512778759, -0.00022015599824953824, 0.015074416063725948, 0.0015778548549860716, 0.01444294210523367, -0.009887361899018288, -0.03531694784760475, 0.055925071239471436, 0.0003500255406834185, -0.01638220250606537, -0.0924842357635498, -0.034489113837480545, 0.11091232299804688, -0.03280659392476082, 0.017649509012699127, -0.04375346377491951, -0.46290531754493713, -0.04937230423092842, -0.022776920348405838, 0.00311154592782259, 0.0048361471854150295, -0.029387857764959335, -0.061091866344213486, 0.004603464622050524, -0.0049394783563911915, 0.014143329113721848, 0.0011600381694734097, 0.02954152598977089, 0.037086911499500275, -0.050318796187639236, -0.04319310933351517, 0.0035800181794911623, -0.04215123504400253, 0.032219525426626205, 0.008028550073504448, -0.0982440933585167, 0.02884693443775177, -0.00974057987332344, -0.0083056865260005, -0.0004356615827418864, -0.058351069688797, -0.009127403609454632, 0.05216977000236511, -0.01471271924674511, 0.02745370753109455, -0.11328070610761642, 0.014412098564207554, -0.03152058273553848, 0.018654460087418556, 0.007738006301224232, -0.028033841401338577, -0.032302066683769226, 0.014054806903004646, 0.037302665412425995, -0.011023989878594875, -0.06207656487822533, 0.04674382135272026, 0.0702843889594078, -0.029053544625639915, 0.011883044615387917, 0.051643989980220795, -0.03823871538043022, -0.027744829654693604, -0.018081942573189735, 0.0562206506729126, 0.04826980084180832, 0.06979784369468689, 0.024159371852874756, 0.023391999304294586, 0.027573151513934135, -0.028704576194286346, -0.03153927996754646, -0.056863680481910706, -0.03590529039502144, 0.023761626332998276, 0.06489371508359909, 0.06969130039215088, -0.0035589069593697786, -0.028865918517112732, -0.005350286606699228, 0.04872792586684227, 0.028005076572299004, 0.06194975972175598, -0.04364059492945671, -0.01793462596833706, -0.037203241139650345, -0.000401556579163298, -0.009224669076502323, 0.024073606356978416, 0.02005915530025959, 0.013461284339427948, 0.015065090730786324, -0.007893295027315617, 0.0013389751547947526, -0.02044421248137951, 0.004400548059493303, 0.06425274163484573, 0.04674824699759483, 0.003530310932546854, -0.03315902501344681, 0.007764207664877176, -0.03997935727238655, 0.08714824169874191, 0.009244578890502453, 0.01956697553396225, -0.017685404047369957, 0.006125998683273792, 0.0114089110866189, -0.011026127263903618, -0.05712515115737915, 0.01770685613155365, -0.016042528674006462, 0.030401015654206276, 0.018165074288845062, 0.0055827973410487175, 0.0024075936526060104, 0.0006729992455802858, 0.0074645583517849445, 0.04333551228046417, 0.0076978690922260284, 0.029757896438241005, 0.0086699603125453, 0.010201921686530113, -0.007885310798883438, -0.024075953289866447, 0.01363215409219265, -0.027800075709819794, 0.03573964163661003, -0.02315349131822586, 0.02691712975502014, 0.003270777640864253, -0.04564446955919266, -0.027526667341589928, 0.01533210463821888, 0.08347571641206741, -0.028201203793287277, 0.039493024349212646, 0.014173203147947788, 0.052076101303100586, -0.005796241108328104, 0.05569079518318176, -0.03494877740740776, -0.0001666833268245682, 0.0001197781166411005, 0.06487719714641571, 0.08863092958927155, -0.016163820400834084, 0.03387993946671486, -0.005145116243511438, -0.025824731215834618, 0.04451175779104233, 0.02416135184466839, 0.0013851841213181615, -0.016987932845950127, -0.0706748515367508, -0.02160063199698925, -0.013140262104570866, -0.007598333992063999, 0.03292367234826088, -0.04984109103679657, -0.023261254653334618, -0.03115762397646904, 0.02069167047739029, 0.05255570262670517, -0.002718754578381777, 0.036630891263484955, -0.011678383685648441, -0.007242074701935053, -0.023960594087839127, 0.021221548318862915, 6.627554103033617e-05, -0.007013747468590736, -0.021431952714920044, 0.062155164778232574, -0.04284863546490669, -0.013731537386775017, -0.09083017706871033, -0.012341393157839775, -0.01423468254506588, -0.016568398103117943, -0.024615440517663956, 0.04859397932887077, -0.08175937831401825, -0.002625376218929887, -0.03812067583203316, -0.0020326790399849415, -0.03255508467555046, -0.15290729701519012, -0.011039621196687222, 0.0044361683540046215, 0.0167684368789196, 0.05381542444229126, -0.03757605329155922, -0.00966715533286333, -0.08346855640411377, -0.00025962828658521175, 0.008946238085627556, -0.036709267646074295, -0.0010840039467439055, -0.0003990694531239569, -0.003060400253161788, -0.00401432765647769, -0.009202591143548489, 0.013993384316563606, -0.014066450297832489, 0.014172026887536049, -0.03530452772974968, 0.052954599261283875, -0.021771790459752083, 0.04855916276574135, 0.17388100922107697, 0.029520409181714058, -0.03626703843474388, 0.030907021835446358, -0.02429310977458954, 0.01677161268889904, 0.030560843646526337, 0.027958650141954422, -0.07242120802402496, 0.005030444823205471, -0.08315367251634598, 0.03625999018549919, 0.04976129159331322, -0.0017797929467633367, -0.015260777436196804, 0.0011630479712039232, 0.014245185069739819, 0.0659765899181366, 0.03655539080500603, -0.03303610160946846, 0.02821020781993866, 0.018023988232016563, -0.009146951138973236, -0.013262221589684486, 0.03233228251338005, 0.08799786120653152, 0.06980301439762115, -0.05025872588157654, -0.014494404196739197, 0.00989621039479971, 0.009782957844436169, -0.006893618497997522, 0.004505367483943701, 0.08766207844018936, -0.0032043277751654387, 0.015256347134709358, -0.04872272163629532, -0.07418283075094223, 0.012504692189395428, 0.02783164568245411, -0.0207204706966877, 0.013559415005147457, 0.006591687444597483, -0.10090571641921997, -0.054292261600494385, 0.056597109884023666, 0.006318091414868832, -0.02130003646016121, -0.023113740608096123, -0.004518244415521622, -0.004380692262202501, 0.026177067309617996, -0.02860816940665245, 0.011184757575392723, 0.029324045404791832, 0.027605216950178146, 0.030149340629577637, 0.030876511707901955, -0.007210287731140852, 0.023623481392860413, 0.028492897748947144, -0.00845419242978096, 0.004604010842740536, 0.06040347367525101, 0.02647467330098152, 0.0023721533361822367, 0.020667148754000664, 0.01862921006977558, -0.00806204229593277, 0.015783006325364113, -0.04982239753007889, 0.030345385894179344, 0.029933840036392212, 0.042067691683769226, 0.07250653207302094, -0.002107855398207903, 0.017451593652367592, -0.0037471007090061903, -0.0015796325169503689, -0.01224733516573906, 0.0009564498905092478, -0.06519081443548203, 0.0025691683404147625, 0.066107377409935, 0.006861420813947916, 0.03698645904660225, -0.0037238704971969128, -0.010266668163239956, 0.040456730872392654, -0.0236392579972744, 0.1765969842672348, 0.04606928676366806, 0.023819101974368095, 0.03963175043463707, 0.053283918648958206, -0.007818283513188362, 0.0021665231324732304, 0.02142002247273922, -0.006199223455041647, -0.043302327394485474, 0.038887932896614075, -0.06725961714982986, -0.03584199771285057, -0.00249445135705173, -0.10064119100570679, 0.04669961705803871, -0.002654403680935502, 0.03275409713387489, 0.047754522413015366, 0.026032738387584686, 0.04466584697365761, 0.020229507237672806, 0.028155341744422913, -0.015887590125203133, -0.007452001795172691, 0.016896037384867668, -0.009139103814959526, -0.014483770355582237, 0.026841679587960243, 0.0016049116384238005, 0.01290940586477518, -0.05111415684223175, -0.011652156710624695, 0.07329892367124557, 0.007341910153627396, 0.015952900052070618, 0.008488942869007587, -0.02248239330947399, -0.061192866414785385, -0.0580856017768383, -0.042157821357250214, 0.028490453958511353, 0.0578395314514637, -0.037758663296699524, 0.005474364385008812, -0.0180960800498724, -0.01591481827199459, 0.03208450600504875, -0.023951897397637367, -0.03873271495103836, -0.0005632652319036424, 0.029408665373921394, 0.19788382947444916, -0.04333820939064026, 0.0023166630417108536, 0.06287438422441483, -0.011858200654387474, -0.006005213130265474, -0.014765101484954357, -0.01682509295642376, -0.07442788779735565, 0.018966667354106903, -0.05702948942780495, 0.004550829529762268, -0.03864956647157669, -0.040087535977363586, 0.022571664303541183, -0.02373291179537773, 0.022919729351997375, -0.0347285158932209, -0.030399324372410774, 0.015211179852485657, -0.04810052365064621, -0.029690219089388847, 0.0007827109075151384, -0.08078543096780777, -0.03483615070581436, 0.03176485002040863, 0.02319072000682354, -0.09653251618146896, -0.025019990280270576, -0.03672046959400177, 0.00895466934889555, 0.014325986616313457, -0.03720581531524658, -0.023796528577804565, -0.06032039597630501, -0.037831176072359085, -0.035954929888248444, 0.006636350881308317, 0.048635948449373245, -0.03585793823003769, -0.051346536725759506, 0.020708616822957993, -0.012802447192370892, -0.01677321456372738, 0.04046347737312317, -0.03986131772398949, -0.003476831130683422, 0.016566768288612366, 0.021293919533491135, -0.012422239407896996, 0.010742837563157082, -0.07291743904352188, -0.02947760932147503, -0.0403485931456089, 0.003309730440378189, -0.01604168489575386, -0.021106157451868057, 0.029096461832523346, -0.04819178953766823, 0.0025200515519827604, -0.04576224088668823, -0.02075062319636345, -0.05335559695959091, 0.0028446430806070566, 0.016991212964057922, -0.0641186311841011, 0.08261209726333618, -0.012141941115260124, -0.0538589172065258, 0.017436522990465164, -0.017448866739869118, -0.02506786584854126, -0.03284019976854324, -0.02432464249432087, 0.03759109601378441, 0.010829166509211063, -0.01351953111588955, 0.011540639214217663, -0.04125701263546944, -0.02919835038483143, -0.026247622445225716, -0.0025802021846175194, 0.009680969640612602, 0.018559593707323074]" ./train/knee_pad/n03623198_10486.JPEG,knee_pad,"[-0.0008871849277056754, -0.003753089113160968, -0.022486966103315353, 0.039079830050468445, 0.041140858083963394, 0.026143012568354607, 0.05173184722661972, -0.059247937053442, 0.027054501697421074, 0.06164366379380226, 0.0074212877079844475, 0.02349141612648964, 0.05280333757400513, -0.007432790473103523, -0.03989343345165253, -0.029682211577892303, -0.01997304894030094, 0.0017740419134497643, -0.0186703409999609, 0.05219731479883194, -0.11577560752630234, -0.006278176326304674, 0.01548085268586874, -0.005913584027439356, 0.0021022213622927666, 0.00427074171602726, -0.01874302327632904, 0.03236650303006172, 0.030474595725536346, -0.014189328998327255, 0.002732046414166689, 0.014188461005687714, 0.004272468853741884, 0.010884170420467854, 0.04129071161150932, 0.009600970894098282, 0.02182040363550186, -0.004457022063434124, 0.02562372386455536, -0.028327947482466698, 0.04484737291932106, 0.024975795298814774, -0.07613831758499146, -0.018894191831350327, 0.005286034196615219, -0.15261025726795197, 0.06194858253002167, -0.0007577824289910495, 0.04682926461100578, 0.055043045431375504, -0.013223894871771336, 0.0017310600960627198, 0.026230759918689728, 0.0035936308559030294, -0.045448917895555496, -0.039809681475162506, 0.036952245980501175, -0.010162540711462498, 0.03942219913005829, -0.07312958687543869, 0.05992629751563072, -0.004130701534450054, -0.011638681404292583, -0.024790503084659576, -0.00096039759228006, -0.043220337480306625, 0.015004976652562618, 0.059109367430210114, 0.007362554781138897, -0.0014358408516272902, -0.053297705948352814, -0.0038228805642575026, -0.02965027652680874, 0.03232121840119362, 0.002763084601610899, -0.04044819250702858, -0.004338601604104042, 0.04524005204439163, -0.009447568096220493, -0.02359495311975479, -0.003626309335231781, 0.009289233945310116, -0.026188917458057404, -0.011436031199991703, -0.01366328727453947, 0.006803842727094889, -0.055924877524375916, 0.03451821580529213, 0.024593446403741837, -0.061045851558446884, 0.0021205611992627382, 0.003757924772799015, -0.5116302967071533, 0.01381941419094801, -0.000627059256657958, -0.05665544793009758, 0.040061067789793015, -0.051389146596193314, -0.09058690816164017, -0.04351811856031418, 0.021083854138851166, -0.04211394116282463, 0.013985314406454563, -0.01535421796143055, 0.07833436876535416, -0.049239348620176315, -0.0865495502948761, -0.0013976278714835644, 0.013283787295222282, 0.030306387692689896, -0.021686803549528122, -0.13045938313007355, 0.014184280298650265, -0.01713024452328682, -0.034471068531274796, 0.04489171504974365, -0.015598871745169163, 0.014713621698319912, 0.05211683735251427, -0.04456702619791031, -0.025883808732032776, -0.021880919113755226, -0.0009712977916933596, -0.053241580724716187, -0.015598922036588192, -0.05851533263921738, -0.06649916619062424, -0.01882362738251686, -0.018727030605077744, 0.006876044441014528, -0.005683856550604105, -0.04492650926113129, 0.02926236391067505, 0.07946819067001343, -0.028830548748373985, -0.0031765045132488012, 0.013469655998051167, -0.01663985289633274, -0.02138291858136654, 0.016123760491609573, 0.03876622021198273, 0.025918422266840935, -0.011035219766199589, 0.04899010434746742, 0.013984044082462788, -0.01566142402589321, -0.05990803241729736, -0.025501441210508347, -0.054250314831733704, 0.029128246009349823, 0.004253028426319361, 0.021784748882055283, 0.0672188401222229, 0.01036495715379715, -0.07516026496887207, 0.012439521960914135, 0.03384369611740112, 0.017476001754403114, 0.0019519627094268799, -0.07100227475166321, -0.03640523925423622, -0.00999020878225565, 0.005039778538048267, -0.026180945336818695, -0.07187749445438385, 0.00881457794457674, -0.017080875113606453, 0.043845124542713165, 0.03375989943742752, -0.0371064655482769, 0.03576985001564026, 0.00835829135030508, 0.022347774356603622, 0.0003911930834874511, -0.020377639681100845, -0.013876321725547314, -0.08896207809448242, 0.010771095752716064, 0.08672457188367844, -0.00752701610326767, 0.03367399796843529, -0.028204599395394325, 0.039874739944934845, 0.04398037865757942, -0.015413026325404644, -0.04197242483496666, 0.003509441390633583, -0.009734567254781723, -0.015104270540177822, -0.011753962375223637, 0.01238227728754282, -0.009650477208197117, 0.0063101365230977535, 0.004301149398088455, -0.03520306199789047, -0.018412239849567413, 0.054866425693035126, 0.027577031403779984, 0.03790082782506943, -0.01832360029220581, 0.017192993313074112, -0.06918369978666306, -0.028973005712032318, 0.04398713260889053, 0.032464951276779175, 0.0006851479411125183, 0.03386041522026062, -0.060783568769693375, -0.03827866539359093, 0.02617189660668373, 0.07075217366218567, -0.0016796347917988896, -0.03020254708826542, 0.026940468698740005, 0.008735869079828262, -0.03645622357726097, 0.04409531131386757, 0.04580650106072426, -0.009199478663504124, -0.015535580925643444, 0.026818281039595604, 0.026143841445446014, -0.008888053707778454, 0.034352853894233704, -0.02905198186635971, -0.033276647329330444, 0.001393745536915958, -0.013504434376955032, 0.012444647029042244, -0.012875246815383434, -0.046792760491371155, 0.01901187188923359, -0.019382191821932793, 0.005414469633251429, 0.03025002032518387, -0.1369898021221161, -0.014606043696403503, 0.0347764678299427, 0.012850272469222546, 0.0622292160987854, 0.006414580624550581, 0.06592334806919098, 0.017743779346346855, -0.029696768149733543, 0.007376488763839006, 0.033640455454587936, 0.0023538724053651094, 0.025060778483748436, -0.031040480360388756, 0.017725881189107895, 0.027081811800599098, -0.016817661002278328, -0.03729605674743652, -0.007257911376655102, 0.007335404399782419, -0.0017683410551398993, -0.03741377219557762, -0.023348111659288406, -0.0747213140130043, 0.01708412542939186, -0.015391958877444267, -0.01090581901371479, 0.02904370240867138, -0.11556389182806015, 0.00679542263969779, 0.017344072461128235, -0.023830080404877663, 0.017989572137594223, -0.018786458298563957, 0.005196953192353249, -0.022349834442138672, 0.025203607976436615, 0.04993981122970581, -0.030314788222312927, -0.024700872600078583, 0.030567524954676628, 0.05713909864425659, 0.015328994020819664, -0.005016196984797716, 0.030481822788715363, -0.037950996309518814, -0.025086285546422005, -0.0838325172662735, 0.03954154625535011, -0.024119235575199127, -0.0313737578690052, 0.1798972636461258, 0.005296573042869568, -0.024673309177160263, -0.03839553892612457, -0.005057706963270903, -0.04088809713721275, 0.03516363352537155, 0.009309161454439163, -0.05688442662358284, 0.04496875777840614, -0.09238981455564499, 0.008602827787399292, 0.013234718702733517, 0.005464186426252127, -0.004100510850548744, -0.013468911871314049, 0.004871627315878868, 0.045246388763189316, 0.008869098499417305, 0.03448620066046715, 0.07069636136293411, -0.014578140340745449, -0.04867316037416458, 0.004685631021857262, 0.017102880403399467, 0.06557571142911911, 0.07916640490293503, -0.02367272414267063, 0.03670598939061165, 0.048775237053632736, 6.00921266595833e-05, -0.013376982882618904, -0.01430358737707138, 0.07324754446744919, -0.020835017785429955, -0.0967334508895874, -0.04335813596844673, -0.0330919474363327, 0.04672455042600632, -0.0005477697122842073, 0.03450234234333038, 0.03991018980741501, -0.007346151862293482, -0.07034895569086075, -0.06535617262125015, 0.043801676481962204, -0.0004603611887432635, 0.029061010107398033, -0.04161464050412178, 0.02259659394621849, 0.01770726405084133, -0.004654751159250736, -0.011994547210633755, 0.028735864907503128, 0.03357836604118347, -0.007793853525072336, -0.018109697848558426, 0.01936260052025318, -0.016591031104326248, -0.012321565300226212, 0.017284082248806953, -0.050503041595220566, -0.027454648166894913, 0.022718382999300957, 0.03349639102816582, 0.02117089368402958, 0.0537949837744236, -0.012871641665697098, -0.040604475885629654, -0.03801741451025009, -0.05582626909017563, 0.11014178395271301, -0.0432259626686573, 0.007423236966133118, 0.04924868792295456, -0.03218201920390129, -0.014656014740467072, 0.0027234614826738834, 0.059658415615558624, -0.012644179165363312, 0.00903609860688448, -0.12324745953083038, -0.0303408931940794, 0.0014124938752502203, -0.028532739728689194, 0.03083430789411068, 0.027355827391147614, -0.0005549454945139587, 0.03176869824528694, 0.0037825170438736677, 0.14385053515434265, 0.03286700323224068, -0.05243339762091637, 0.04702199995517731, 0.003306114114820957, 0.004134438931941986, -0.02385951764881611, 0.006251058541238308, -0.016611188650131226, -0.029163921251893044, 0.022629836574196815, -0.018051011487841606, -0.04264954850077629, -0.08507788181304932, -0.005788459442555904, 0.04941074177622795, -0.02069762535393238, 0.03190813586115837, -0.044864803552627563, 0.03343399986624718, 0.02881002053618431, -0.024915890768170357, 0.025290239602327347, -0.028495417907834053, -0.021394912153482437, 0.014042723923921585, -0.018383311107754707, 0.0008345539099536836, -0.011261722072958946, 0.011453039012849331, -0.04611435905098915, -0.007315397262573242, 0.02460571750998497, 0.002401946811005473, 0.036757104098796844, 0.03268332779407501, 0.013373552821576595, -0.006177005358040333, -0.045078475028276443, -0.015163779258728027, -0.010983751155436039, 0.005139434710144997, 0.030942406505346298, -0.043684620410203934, 0.03550131991505623, -0.020057236775755882, -0.007591412402689457, 0.006760748103260994, -0.02206886187195778, -0.05329226702451706, -0.014058701694011688, 0.0025052381679415703, 0.05854005366563797, 0.0040160841308534145, 0.009784409776329994, 0.02966977097094059, -0.041892193257808685, 0.03589801490306854, 0.004191291984170675, -0.040183208882808685, -0.05678088963031769, 0.0465162917971611, 0.007583917118608952, 0.035214658826589584, 0.006762686185538769, -0.026020735502243042, 0.0257412102073431, 0.041865356266498566, -0.00859732087701559, -0.013841534033417702, -0.01794135943055153, -0.03456999734044075, -0.061141237616539, -0.005688202101737261, 0.015133265405893326, -0.07607818394899368, -0.04169045388698578, 0.030161842703819275, 0.005735569167882204, -0.05061410740017891, 0.0041733686812222, -0.009966803714632988, -0.014752275310456753, 0.00595800532028079, -0.02646149881184101, 0.02355775237083435, -0.04952233284711838, 0.0047036875039339066, -0.019935088232159615, -0.010463534854352474, 0.053148023784160614, 0.02806156314909458, -0.014422599226236343, -0.01632731594145298, 0.006180314812809229, -0.04602654650807381, 0.07161011546850204, 0.0017810509307309985, 0.03437390923500061, 0.009287118911743164, -0.03755464777350426, -0.05044608935713768, 0.04806840792298317, -0.021200288087129593, -0.0063890875317156315, 0.015202401205897331, 0.005732769146561623, -0.039828088134527206, -0.01045918557792902, -2.2250997062656097e-06, -0.024079006165266037, 0.02313106134533882, -0.0034596973564475775, -0.047557439655065536, -0.0075129852630198, -0.015486589632928371, 0.022001653909683228, -0.057871926575899124, 0.019790375605225563, -0.007843428291380405, -0.07203242182731628, 0.02859245426952839, -0.0393824577331543, -0.020071392878890038, -0.025419484823942184, -0.005389868747442961, 0.05529360845685005, -0.0341772735118866, -0.0075701880268752575, -0.005150907207280397, 0.01873994804918766, -0.029062125831842422, -0.024184875190258026, 0.008264917880296707, -0.035640522837638855, -0.003596156369894743]" ./train/knee_pad/n03623198_1346.JPEG,knee_pad,"[-0.011202112771570683, 0.022281235083937645, -0.010904640890657902, -0.027032535523176193, 0.019516540691256523, 0.0337265320122242, 0.008252213709056377, 0.03339102119207382, 0.05833463370800018, -0.01725020632147789, -0.007921495474874973, 0.01948375068604946, -0.010081994347274303, -0.04387355223298073, -0.004723057150840759, -0.013806640170514584, 0.09609383344650269, 0.016004115343093872, 0.010478992015123367, -0.04407235234975815, -0.11431495100259781, 0.01834346167743206, -0.002548505086451769, -0.038625460118055344, -0.009499255567789078, 0.029417460784316063, 0.03373067453503609, -0.03581983223557472, -0.0143590634688735, 0.01779456064105034, -0.031489450484514236, -0.01742541790008545, -0.00550626078620553, 0.023275909945368767, -0.048585738986730576, -0.0040397667326033115, 0.010494067333638668, -0.003307996317744255, -0.031876787543296814, 0.052142199128866196, -0.007532668765634298, -0.07360941171646118, 0.0009111306280829012, -0.024126389995217323, 0.03996199369430542, -0.12467151135206223, -0.006691540125757456, 0.030449409037828445, -0.028985517099499702, -0.018729882314801216, 0.08619783818721771, 0.016230836510658264, 0.0008234636043198407, 0.005828196182847023, 0.001332030282355845, 0.02012549713253975, -0.01581202819943428, 0.008288155309855938, 0.0035177101381123066, 0.00733049726113677, 0.09598466753959656, -0.036052804440259933, 0.01775551214814186, 0.03132668510079384, -0.044644761830568314, -0.04049459844827652, 0.03482603281736374, 0.018791332840919495, 0.018350204452872276, 0.0097288116812706, -0.004685802850872278, -0.012219918891787529, -0.012335202656686306, -0.02419610507786274, 0.0043676444329321384, 0.01540125161409378, 0.032111506909132004, -0.03874943032860756, 0.018522117286920547, -0.03912205621600151, -0.005578240845352411, -0.002244020812213421, -0.025256410241127014, -0.022890707477927208, 0.009869161061942577, -0.006911622826009989, 0.06007767096161842, -0.007044651545584202, 0.007169394753873348, -0.02655477076768875, -0.003637245623394847, -0.021613793447613716, -0.5854319334030151, 0.03382757678627968, -0.04320772737264633, 0.016148632392287254, -0.005350301042199135, 0.03574977070093155, -0.02686111256480217, 0.051948029547929764, 0.010460472665727139, -0.061403896659612656, 0.04614633694291115, 0.03220921754837036, 0.005415008403360844, 0.016076231375336647, -0.09781131893396378, -0.00875706784427166, 0.02222348190844059, -0.023058371618390083, 0.0016857757000252604, 0.0560477040708065, -0.03455160930752754, -0.012755048461258411, -0.027878273278474808, 0.006771287880837917, -0.013870597817003727, -0.021168095991015434, -0.013965270482003689, -0.026455169543623924, -0.0027228009421378374, 0.05472069978713989, -0.03843637928366661, 0.004507473669946194, 0.028256764635443687, 0.04194559529423714, -0.01880069263279438, 0.01099181454628706, -0.022557944059371948, 0.03122342750430107, -0.016520990058779716, 0.005304952152073383, -0.002404757309705019, 0.08370914310216904, 0.02393515035510063, -0.006052350625395775, 0.0034992967266589403, -0.011367151513695717, -0.03398388624191284, -0.032357778400182724, 0.0102335000410676, 0.004567713476717472, 0.032521478831768036, 0.0032564892899245024, 0.015289224684238434, -0.039230961352586746, -0.002222552662715316, -0.05446537956595421, 0.03720298781991005, -0.032258644700050354, -0.017794176936149597, -0.017840640619397163, 0.015595748089253902, -0.03463852405548096, 0.012348483316600323, -0.04471465200185776, -0.012154821306467056, -0.02863774076104164, -0.03463400527834892, -0.013408290222287178, -0.02263152413070202, 0.00753008434548974, 0.045394912362098694, -0.028259428218007088, 0.01652476377785206, -0.020546134561300278, -0.00797571986913681, -0.052224643528461456, 0.08874975889921188, 0.007849705405533314, 0.006846188101917505, -0.030923044309020042, 0.02623298391699791, 0.00609262939542532, -0.03363741934299469, -0.05420783534646034, 0.017506355419754982, -0.01147028524428606, -0.005442253779619932, -0.016909444704651833, 0.0272358451038599, -0.004759275354444981, 0.07070188969373703, -0.008556202054023743, -0.016760721802711487, 0.04039357602596283, 0.05129927769303322, -0.022182568907737732, -0.04216334596276283, 0.004022927023470402, 0.009895951487123966, -0.007910646498203278, -0.038603708148002625, -0.010838082991540432, 0.05875703692436218, -0.049926698207855225, -0.026866434141993523, -0.05061662942171097, -0.01465644035488367, -0.0026234665419906378, -0.011764463037252426, -0.01837795414030552, -0.008169259876012802, 0.02370190992951393, 0.02058780938386917, -0.006941244937479496, -0.03363826125860214, -0.005713278893381357, -0.0466882660984993, -0.00810608547180891, 0.017087779939174652, -0.047168631106615067, -0.0071678017266094685, 0.012744028121232986, -0.025167085230350494, 0.00665909331291914, -0.005659071728587151, 0.01282409019768238, -0.023323485627770424, 0.029538726434111595, -0.005715259350836277, -0.020930470898747444, -0.008966770023107529, 0.03312312811613083, -0.0425928570330143, 0.019228510558605194, 0.0065762042067945, -0.007900409400463104, 0.034307993948459625, 0.0078042978420853615, 0.0038980983663350344, -0.03838525712490082, 0.04922330379486084, 0.027707284316420555, 0.003269432345405221, -0.03128944709897041, 0.037438713014125824, -0.05678989738225937, -0.045999400317668915, 0.012210307642817497, 0.031003903597593307, -0.0009861732833087444, -0.009986062534153461, -0.00960648525506258, 0.01508593000471592, -0.0040826513431966305, 0.019938552752137184, 0.006586580537259579, -0.012518083676695824, 0.04463854059576988, 0.02363887056708336, -0.040408968925476074, 0.006780947558581829, -0.0005628439248539507, 0.009069547057151794, 0.04379138723015785, -0.0015372822526842356, -0.013853639364242554, -0.07112012058496475, 0.03284101560711861, 0.06174590811133385, -0.005458523984998465, 0.0008035330101847649, -0.018054476007819176, -0.0124840522184968, 0.04780115187168121, -0.014205947518348694, 0.010925102978944778, -0.027144286781549454, -0.001283855177462101, -0.01951568014919758, 0.03171127289533615, 0.0002488791069481522, -0.013027382083237171, 0.04709487035870552, 0.019963551312685013, -0.009370219893753529, -0.0027626564260572195, -0.015806976705789566, 0.011610964313149452, -0.03993614763021469, 0.013080473057925701, -0.054189205169677734, 0.007813937030732632, 0.005735641345381737, 0.010540062561631203, 0.17224647104740143, 0.00421591941267252, -0.025837775319814682, -0.04804641753435135, 0.05367537960410118, 0.009573861956596375, -0.0035171748604625463, 0.02736830525100231, -0.06944775581359863, -0.018681449815630913, -0.05071388930082321, 0.027802826836705208, 0.06280133128166199, 0.04895686358213425, -0.00714275473728776, -0.031081991270184517, 0.0016128832940012217, -0.009502888657152653, 0.0005122401635162532, -0.07919935882091522, 0.004046395421028137, 0.040523380041122437, 0.024108581244945526, 0.017130641266703606, -0.014606055803596973, 0.0327455960214138, 0.08363532274961472, 0.03245963156223297, 0.028575077652931213, 0.028984151780605316, 0.0578162744641304, -0.0075268130749464035, -0.01120755635201931, -0.03289635106921196, 0.0574071891605854, 0.11394309252500534, -0.01675649918615818, -0.04538285732269287, 0.006454104091972113, -0.03605738654732704, 0.017020713537931442, 0.04076846316456795, -0.015523826703429222, 0.0003192127333022654, 0.01531057246029377, 0.049254681915044785, 0.024039803072810173, -0.0004775249108206481, 0.004995075520128012, -0.0071285180747509, -0.007467500399798155, 0.008076419122517109, 0.004400638397783041, -0.02083680033683777, -0.01710982248187065, 0.03435568884015083, 0.02555179037153721, 0.03265129402279854, 0.022504327818751335, 0.022724982351064682, 0.05474502965807915, 0.028581824153661728, 0.04161062464118004, -0.03792518377304077, 0.0026713362894952297, -0.007726382929831743, 0.04358720779418945, 0.029160963371396065, -0.003594652283936739, -0.014886976219713688, -0.051718100905418396, -0.019338304176926613, 0.050032105296850204, 0.002694768598303199, 0.13908962905406952, -0.038407549262046814, -0.036266524344682693, -0.014874864369630814, 0.016975978389382362, -0.0123412124812603, 0.001469240989536047, -0.10287546366453171, -0.005106750875711441, 0.07343669980764389, 0.00741182267665863, 0.048127494752407074, -0.0187971368432045, 0.01807420328259468, -0.018816154450178146, 0.01664915680885315, 0.12124410271644592, 0.006182720419019461, 0.02869289368391037, 0.00026515903300605714, 0.0361814983189106, 0.019232869148254395, -0.004739884287118912, -0.0137032400816679, 0.0018240477656945586, -0.0335293710231781, 0.03297127038240433, -0.027525141835212708, -0.00484864879399538, -0.0690416693687439, -0.05963198468089104, 0.0018149552633985877, -0.00290652085095644, -0.038678620010614395, -0.059495776891708374, -0.014182858169078827, 0.05455343425273895, -0.0046886783093214035, 0.028525637462735176, -0.027384396642446518, -0.0015023838495835662, 0.03435860201716423, 0.1057172641158104, -0.04591543972492218, 0.022798897698521614, -0.035647518932819366, -0.01069459319114685, 0.0369781069457531, -0.008198194205760956, 0.01068275235593319, 0.018242431804537773, -0.015750056132674217, 0.05049534887075424, 0.009916332550346851, -0.07189657539129257, 0.04693356901407242, -0.022212715819478035, -0.0018089875811710954, -0.06554596871137619, -0.05749914050102234, 0.008805020712316036, 0.041166529059410095, -0.0002660747559275478, 0.1037195697426796, 0.018365221098065376, -0.012870358303189278, -0.05516054481267929, 0.012979624792933464, -0.21314196288585663, 0.014176489785313606, -0.00907078292220831, -0.00429995683953166, -0.012089326046407223, -0.015708550810813904, -0.02986549213528633, -0.03779986873269081, -0.025332488119602203, -0.005635679233819246, -0.04002774879336357, 0.012961029075086117, 0.0596235953271389, 0.020437180995941162, 0.04256048426032066, 0.045565105974674225, 0.04018676280975342, -0.008784580044448376, 0.0157705619931221, 0.010983922518789768, -0.010771259665489197, 0.03381618484854698, 0.011732414364814758, 0.033986423164606094, 0.08489292114973068, -0.028569038957357407, -0.0029002607334405184, -0.020338373258709908, -0.027455521747469902, 0.029206952080130577, -0.013011733070015907, 0.0009826336754485965, -0.020348532125353813, 0.027520442381501198, 0.0009784011635929346, -0.03212570399045944, 0.010224536061286926, -0.0057390364818274975, 0.04581860452890396, 0.039892714470624924, -0.030698413029313087, -0.02423306554555893, -0.01551760733127594, -0.022387586534023285, 0.04377758875489235, -0.0634000301361084, 0.005367721430957317, -0.03996171057224274, -0.006477090995758772, 0.017389316111803055, 0.0271278265863657, -0.039613477885723114, -0.0445677675306797, -0.03699089586734772, -0.0018152672564610839, -0.013995993882417679, 0.01043345034122467, -0.00365677778609097, -0.009023823775351048, 0.041941817849874496, 0.0281134694814682, -0.05115528404712677, 0.009295525029301643, -0.006461698096245527, -0.03428523987531662, -0.020740333944559097, -0.027666306123137474, -0.04457392543554306, -0.009399245493113995, -0.025109579786658287, -0.05021204426884651, -0.003851130837574601, -0.010745931416749954, 0.009971236810088158, -0.008066688664257526, 0.022689729928970337, -0.03597529977560043, -0.01914326101541519, -0.03614161163568497, 0.01469337660819292, -0.03156092017889023, 0.050823017954826355, -0.018924543634057045, 0.001770130475051701]" ./train/knee_pad/n03623198_4415.JPEG,knee_pad,"[-0.0019983393140137196, 0.015115119516849518, 0.0036497984547168016, -0.03071516938507557, 0.022994672879576683, 0.0032242333982139826, -0.007029103115200996, 0.027545997872948647, 0.025367088615894318, -0.006230480037629604, 0.022331155836582184, 0.012957684695720673, 0.05514300987124443, 0.029070749878883362, 0.044276051223278046, -0.015519704669713974, 0.08346070349216461, 0.014124429784715176, -0.05028339475393295, -0.016387056559324265, -0.0946178138256073, -0.031104179099202156, -0.005466244649142027, 0.010165677405893803, -0.0366554781794548, 0.024581003934144974, 0.001400746637955308, -0.02372625656425953, -0.024073917418718338, 0.0019108110573142767, -0.00995520781725645, 0.02971484325826168, -0.004514227621257305, -0.009730979800224304, -0.02554422616958618, -0.0042732791043818, 0.043240781873464584, 0.009872724302113056, -0.027075206860899925, -0.00975548755377531, 0.0006424073944799602, -0.05378478765487671, -0.0018486269982531667, -0.03355444222688675, 0.03603838011622429, -0.1492869108915329, -0.01556268148124218, 0.03323439508676529, 0.013745415955781937, -0.01192401722073555, 0.09586232155561447, 0.03361634910106659, 0.018353207036852837, -0.0012498836731538177, -0.04339822009205818, 0.035511359572410583, -0.06733377277851105, 0.005837397184222937, 0.036469873040914536, 0.02379770018160343, 0.012978297658264637, -0.013881774619221687, 0.05311800539493561, 0.004629659000784159, -0.025490202009677887, -0.03758307546377182, 0.023900344967842102, 0.030653245747089386, 0.010877366177737713, 0.01955040544271469, -0.014612367376685143, 0.002618663012981415, -0.020575469359755516, -0.016729673370718956, 0.01840250752866268, 0.04321544989943504, 0.012660108506679535, -0.007195256184786558, 0.0045681907795369625, -0.009862781502306461, 0.004604955203831196, -0.0412510484457016, 0.00018558140436653048, -0.03347102925181389, 0.026555266231298447, 0.010271668434143066, 0.048220597207546234, 0.0044909631833434105, -0.053637005388736725, -0.025782134383916855, -0.02709275856614113, -0.0338682197034359, -0.6163800358772278, 0.05389166623353958, 0.0030452769715338945, 0.03323335573077202, -0.001385302166454494, 0.004241258837282658, -0.015497911721467972, 0.11142724007368088, 0.02669479511678219, -0.07314702123403549, 0.018217429518699646, -0.0027477156836539507, 0.005640697665512562, -0.026882776990532875, -0.2009708136320114, 0.007670451421290636, 0.0466187447309494, 0.0021023841109126806, -0.01755131408572197, 0.022044526413083076, -0.022922884672880173, -0.05093593895435333, -0.034350790083408356, 0.003368406556546688, 0.0037934754509478807, -0.006745586637407541, -0.012553858570754528, -0.006131360307335854, 0.005929190665483475, 0.024696694687008858, -0.002783464966341853, 0.0160959642380476, -0.024271950125694275, 0.08528377115726471, 0.001400893903337419, 0.005023140925914049, -0.01186417881399393, -0.013440207578241825, -0.004304747562855482, 0.04282822832465172, -0.010593210346996784, 0.08017906546592712, 0.027951575815677643, 0.007896225899457932, 0.0027789371088147163, -0.03540649265050888, -0.038208819925785065, 0.012316560372710228, -0.009310402907431126, -0.007424620911478996, -0.02956218831241131, -0.002146807499229908, -0.0024886997416615486, -0.0023810567799955606, 0.01786087080836296, -0.07409141957759857, 0.007545720785856247, -0.05078812316060066, -0.03253471478819847, -0.0376150980591774, 0.07091661542654037, -0.022791964933276176, -0.03940209373831749, -0.01656978391110897, 0.02561553567647934, -0.017649035900831223, -0.008273286744952202, -0.034287624061107635, 0.029678447172045708, -0.006035276688635349, 0.03442684933543205, 0.003929398022592068, 0.03311382606625557, -0.011025537736713886, -0.009946453385055065, -0.020586218684911728, 0.0735292136669159, 0.005903295241296291, 0.009315590374171734, -0.01651592366397381, 0.013360217213630676, 0.006905899848788977, -0.012732801958918571, -0.03512780740857124, -0.01661282777786255, 0.001996145350858569, 0.023487690836191177, -0.002268587239086628, 0.06860081106424332, -0.041054584085941315, 0.05073874443769455, -0.01402472797781229, -0.006852096412330866, -0.012307221069931984, 0.025805221870541573, -0.006556174252182245, -0.013166053220629692, -0.0008911677286960185, 0.023557569831609726, -0.01350907888263464, -0.046191368252038956, -0.025790290907025337, 0.024841109290719032, -0.0015464586904272437, -0.030995508655905724, -0.026429710909724236, -0.030204549431800842, 0.019465086981654167, 0.012030191719532013, -0.03492893651127815, -0.003127105999737978, 0.026463894173502922, 0.033371102064847946, -0.025625351816415787, -0.0034970585256814957, -0.003932672552764416, -0.02712315320968628, -0.01706540212035179, -0.03332212194800377, -0.02487039566040039, 0.01544783916324377, 0.011901794001460075, -0.0324675589799881, 0.029298245906829834, -0.02796359173953533, 0.016737112775444984, -0.043984927237033844, -0.035053551197052, -7.583788828924298e-05, -0.02240104228258133, -0.044863853603601456, 0.017255686223506927, -0.0016705067828297615, 0.03570085018873215, -0.012228606268763542, -0.00797294918447733, 0.018246272578835487, 0.015460346825420856, -0.01414716336876154, 0.010463781654834747, -0.002803030190989375, 0.0581793412566185, 0.01497354730963707, 0.020648283883929253, 0.020259536802768707, -0.04720664769411087, -0.05366665497422218, -0.005564603488892317, 0.009613478556275368, -0.02440529875457287, 0.02589777484536171, -0.03166219964623451, -0.0006982391350902617, -0.04221818968653679, 0.003759773913770914, 0.060499873012304306, -0.02108997479081154, 0.01979709602892399, 0.004843739792704582, -0.011221720837056637, 0.018005210906267166, -0.005068704020231962, 0.01749250665307045, 0.03010355308651924, 0.004683198407292366, 0.00261515099555254, -0.02423686347901821, 0.002517860382795334, 0.017933668568730354, -0.00788922794163227, -0.005690176505595446, -0.05915535241365433, -0.026282737031579018, 0.052132498472929, 0.016281308606266975, -0.01888541504740715, 0.009232577867805958, -0.01269550621509552, 0.006229647900909185, 0.008064499124884605, -0.014069578610360622, 0.008016448467969894, 0.032854072749614716, -0.002396794268861413, -0.036255232989788055, -0.009713932871818542, -0.013123925775289536, -0.0029502578545361757, -0.04871278256177902, 0.0024693694431334734, -0.06342798471450806, -0.020770566537976265, 0.003964426927268505, 0.02261519804596901, 0.09714441001415253, -0.025208303704857826, 0.014164157211780548, -0.0220829788595438, 0.042459387332201004, -0.043049558997154236, -0.007044387049973011, 0.039731964468955994, -0.024413438513875008, -0.01833602599799633, -0.022410616278648376, 0.026335928589105606, 0.023985395208001137, 0.020169643685221672, -0.023340530693531036, 0.005587298888713121, -0.006269353907555342, -0.000651385635137558, -0.011354262940585613, -0.03455972671508789, 0.044316165149211884, 0.0565769299864769, 0.04187215864658356, 0.018900014460086823, -0.029251890257000923, 0.05916295573115349, 0.08013717830181122, 0.028362909331917763, 0.011896093375980854, -0.021354826167225838, 0.028226466849446297, 0.002395011018961668, 0.0020974143408238888, -0.06481433659791946, 0.02988194115459919, 0.14605124294757843, 0.006233897991478443, -0.038321249186992645, -0.02679748646914959, -0.005929739214479923, 0.016718653962016106, 0.0037440285086631775, -0.043544866144657135, -0.020238585770130157, 0.08595041930675507, 0.014670426025986671, 0.03700341656804085, 0.0013321463484317064, -0.03267956152558327, -0.009182948619127274, -0.0018620279151946306, -0.014958993531763554, -0.042874421924352646, 0.01289824116975069, 0.018287351354956627, 0.04089401289820671, 0.023079127073287964, 0.013344126753509045, 0.011836761608719826, 0.03318930044770241, 0.029584575444459915, 0.037154119461774826, 0.025090748444199562, -0.008182529360055923, 0.009210405871272087, -0.0036300825886428356, 0.040118712931871414, 0.02396322414278984, 0.054264042526483536, -0.048432327806949615, -0.06794209778308868, -0.01666766218841076, 0.012597821652889252, 0.010478915646672249, 0.06703542172908783, 0.005443057045340538, -0.03559911623597145, -0.08304683119058609, -0.01730479672551155, -0.012906888499855995, 0.006574963219463825, -0.04758240655064583, -0.007715926039963961, 0.032581787556409836, -0.021273475140333176, 0.03452378138899803, -0.01889542117714882, 0.025586513802409172, 0.004711435176432133, -0.017769668251276016, 0.04000253975391388, -0.012546202167868614, -0.002488174941390753, 0.0544714592397213, 0.028136206790804863, -0.03247614577412605, -0.03040674887597561, -0.006730730179697275, 0.004816392436623573, 0.01326137874275446, 0.00913529098033905, -0.026162875816226006, 0.05072258412837982, -0.046499691903591156, -0.12034241855144501, -0.011195613071322441, 0.004977785050868988, -0.017417404800653458, -0.027314865961670876, 0.03435356542468071, 0.02708285301923752, -0.017713043838739395, 0.006076096091419458, -0.017210649326443672, -0.01359936036169529, 0.025069309398531914, 0.12316984683275223, -0.04236453026533127, 0.03138422220945358, -0.008402139879763126, 0.008729826658964157, -0.0018381805857643485, 0.024646852165460587, -0.02289685793220997, 0.00113925791811198, -0.029540440067648888, 0.0051873549818992615, 0.04250665381550789, -0.04261251166462898, 0.003895062953233719, 0.004397392738610506, 0.08633914589881897, -0.09226920455694199, -0.03390372171998024, -0.03598105534911156, 0.053310539573431015, 0.015199295245110989, 0.03350384905934334, 0.01031816191971302, -0.0056919921189546585, -0.022849438712000847, 5.6839402532204986e-05, -0.1961696743965149, 0.01445960346609354, -0.030808713287115097, -0.004601881839334965, 0.02506098523736, -2.716715789574664e-05, -0.05630366504192352, 0.010285218246281147, -0.005028792191296816, -0.058001868426799774, 0.024560723453760147, 0.009705987758934498, 0.032747942954301834, 0.03138120472431183, 0.023008594289422035, 0.053531527519226074, 0.005133429542183876, -0.026440301910042763, 0.016327738761901855, 0.003571692854166031, -0.02478949911892414, 0.03819018974900246, 0.013551568612456322, -0.004493802320212126, 0.0348360650241375, -0.08770774304866791, 0.0016666206065565348, -0.0023776895832270384, -0.040310025215148926, 0.037890251725912094, 0.005240702535957098, -0.003919136244803667, 0.05294360592961311, 0.04090256616473198, -0.01158741395920515, -0.014015374705195427, 0.01850101910531521, 0.005861771292984486, -0.006047532428056002, 0.029540035873651505, -0.04238184541463852, -0.05175226926803589, 0.01460365392267704, 0.012373121455311775, 0.05138254165649414, -0.025100871920585632, -0.00553310988470912, -0.01454173494130373, -0.00830039568245411, -0.0026053956244140863, 0.006608263589441776, -0.008969283662736416, -0.04050629213452339, -0.005127908196300268, -0.004703299608081579, -0.007490117102861404, 0.02111775614321232, 0.0004569303127937019, -0.006964019499719143, 0.04441855102777481, -0.017407121136784554, -0.01325287390500307, 0.013285873457789421, -0.004512702580541372, -0.012492985464632511, -0.021578462794423103, -0.025352846831083298, -0.040336091071367264, 0.011952528730034828, -0.03470369800925255, -0.02058606967329979, -0.0019750448409467936, -0.00745715806260705, -0.0388130247592926, -0.02410520240664482, 0.018249470740556717, -0.005585554987192154, -0.03186619281768799, -0.027891239151358604, 0.011295800097286701, -0.01627039723098278, 0.08742072433233261, -0.009069466963410378, -0.022872332483530045]" ./train/knee_pad/n03623198_14574.JPEG,knee_pad,"[0.01850626990199089, 0.01874321885406971, 0.03375648707151413, -0.027459440752863884, -0.0266229547560215, 0.030763739719986916, -0.01365016307681799, 0.06973465532064438, 0.005869370885193348, -0.008211541920900345, 0.0025697629898786545, -0.007812251802533865, 0.05005372315645218, -9.27773555758904e-07, -0.0069859446957707405, -0.008609953336417675, 0.07837315648794174, 0.027460172772407532, -0.005839263089001179, -0.02573087066411972, -0.1011316105723381, -0.01788945309817791, 0.0003257554199080914, 0.009597737342119217, -0.05538424104452133, -0.024965090677142143, 0.03289360925555229, 0.007924005389213562, 0.029974153265357018, 0.035540621727705, -0.01588377356529236, -0.004143569618463516, -0.0013463965151458979, -0.017797984182834625, 0.006275129038840532, -0.023412054404616356, 0.026554740965366364, -0.00383621989749372, -0.014659034088253975, -0.018781157210469246, -0.04714934155344963, -0.06471597403287888, -0.0315166600048542, 0.030461395159363747, 0.03556777909398079, -0.0054060909897089005, -0.01393978577107191, 0.04093428701162338, -0.035269543528556824, -0.012447187677025795, 0.05817349627614021, -0.021870825439691544, -0.005092641804367304, 0.0011740982299670577, -0.013232591561973095, 0.025143148377537727, 0.00500989705324173, -0.020106982439756393, -0.018802471458911896, 0.022417275235056877, 0.09500454366207123, -0.022510085254907608, 0.004898816347122192, 0.008170140907168388, -0.03290140628814697, 0.0007207758026197553, 0.003708118572831154, 0.02999619022011757, 0.05216905474662781, 0.02060753107070923, -0.017387986183166504, 0.001846628962084651, -0.010055146180093288, -0.00029479217482730746, -0.03805447369813919, 0.05473514646291733, 0.04365773871541023, -0.03157709166407585, -0.025248952209949493, 0.036884941160678864, -0.01736512966454029, -0.026570869609713554, 0.03331902623176575, -0.05797293782234192, -0.04102364555001259, 0.005754152778536081, -0.002830744720995426, 0.023894837126135826, -0.022461101412773132, -0.0012690880103036761, -0.005578863434493542, -0.04957686737179756, -0.6441671252250671, 0.026468049734830856, -0.0032381669152528048, 0.01762484945356846, -0.0006821363349445164, 0.04013404622673988, -0.024671737104654312, 0.02700766548514366, -0.00017750296683516353, -0.009076664224267006, 0.05578691512346268, 0.009808212518692017, 0.053316641598939896, -0.003896865760907531, -0.07752367109060287, -0.021515659987926483, 0.03283621743321419, 0.006920966785401106, 0.004036419093608856, 0.07992302626371384, -0.003709616372361779, -0.003077904460951686, -0.030871165916323662, -0.015542600303888321, -0.04350809007883072, -0.015113400295376778, -0.0352027490735054, -0.01874249055981636, -0.023928917944431305, 0.021018657833337784, 0.008397936820983887, 0.007524642627686262, 0.014735027216374874, 0.05812004581093788, 0.007833855226635933, -0.00027285967371426523, 0.01341182179749012, -0.011564133688807487, -0.04523756727576256, 0.009917614050209522, 0.04672223702073097, 0.08511055260896683, 0.002366018947213888, -0.010355394333600998, -0.01879686862230301, 0.013457457534968853, -0.004305592738091946, -0.009908083826303482, 0.03732655197381973, -0.00036200511385686696, -0.0003391576756257564, 0.02420124039053917, -0.01667747087776661, 0.007382109295576811, 0.013151688501238823, -0.0020039186347275972, 0.013015391305088997, -0.003100473200902343, 0.020253673195838928, -0.022634683176875114, 0.06532511115074158, -0.026257092133164406, 0.024835661053657532, 0.002861459506675601, -0.0049811252392828465, 0.0019981740042567253, 0.0065491641871631145, 0.03128806874155998, 0.011428246274590492, -0.006315195467323065, 0.049027178436517715, -0.046443939208984375, 0.003141190391033888, -0.01794350892305374, -0.079936683177948, -0.021925123408436775, 0.015068545937538147, -0.001313563552685082, -0.00759090855717659, -0.023866940289735794, -0.006327266804873943, -0.03094525821506977, 0.03170810639858246, -0.035454440861940384, 0.05663439631462097, -0.0009658493218012154, -0.0008875823696143925, -0.008727059699594975, -0.012456346303224564, -0.024725938215851784, 0.05102016031742096, -0.018302209675312042, -0.027817318215966225, 0.049500636756420135, 0.019753549247980118, 0.04334911331534386, -0.006458144634962082, 0.028690706938505173, 0.01107941847294569, -0.015582113526761532, -0.036230430006980896, -0.00043814213131554425, 0.0794002115726471, -0.04208580031991005, -0.03539261221885681, -0.03972465172410011, -0.0008075014338828623, -0.034198880195617676, 0.00015619347686879337, 0.03264123946428299, 0.033890366554260254, 0.04099437594413757, 0.01735065132379532, -0.007152313366532326, 0.011298993602395058, 0.018756946548819542, -0.04924771189689636, -0.07714342325925827, 0.05097407102584839, 0.05275879427790642, -0.012099326588213444, 0.01558404415845871, -0.03916358947753906, -0.015222303569316864, -0.01599891670048237, -0.005678197834640741, -0.0209176167845726, 0.04317907616496086, -0.04920801892876625, -0.017852822318673134, 0.012073271907866001, -0.00939718447625637, -0.023529332131147385, 0.035128869116306305, 0.0018499161815270782, -0.00010960322106257081, 0.05054891109466553, 0.002580001251772046, 0.015804672613739967, -0.03409907594323158, 0.04759323224425316, 0.026552215218544006, -0.012792033143341541, -0.04171854257583618, 0.011679871007800102, -0.04031994193792343, -0.005623613018542528, 0.052468229085206985, 0.003993081394582987, -0.008274373598396778, 0.011716227047145367, 0.005179546307772398, 0.03521856293082237, -0.06190258637070656, 0.009468388743698597, 0.024186789989471436, -0.01710009016096592, 0.00351859163492918, -0.008808932267129421, -0.017256783321499825, -0.015312211588025093, -0.026164447888731956, 0.00801406055688858, 0.015926610678434372, -0.0019402889302000403, 0.028915151953697205, -0.0022343804594129324, -0.0071069723926484585, -0.008722065947949886, -0.03492162749171257, -0.021151812747120857, 0.05607268214225769, -0.007864169776439667, 0.05585872381925583, -0.00908654648810625, 0.014207543805241585, 0.002478325739502907, -0.0022140827495604753, -0.05966320261359215, -0.005779717583209276, -0.013790522702038288, -0.053080860525369644, 0.007816227152943611, 0.06262785941362381, -0.004493574611842632, -0.03284188359975815, 0.0034140953794121742, 0.007171740289777517, -0.03479939326643944, -0.015246558003127575, -0.04667951166629791, 0.02168264053761959, -0.02353639155626297, -0.0018312381580471992, 0.05383593216538429, -0.010099810548126698, 0.011180983856320381, 0.024243051186203957, 0.027938013896346092, 0.009403331205248833, -0.010856325738132, 0.04260968789458275, -0.004593981895595789, -0.015177122317254543, -0.0384662039577961, 0.001959916902706027, 0.0091429827734828, 0.05709239840507507, 0.00589834013953805, -0.01198508683592081, 0.005749301984906197, 0.012077556923031807, -0.022280437871813774, -0.013665805570781231, -0.013673043809831142, 0.026631878688931465, -0.015748394653201103, 0.02825436368584633, 0.005322183482348919, 0.0010631384793668985, 0.08512438088655472, 0.02929817885160446, 0.04203704372048378, 0.00417577987536788, 0.04555893316864967, 0.003052642336115241, -0.014580800198018551, -0.09493523091077805, -0.005387275014072657, 0.03987632691860199, -0.013784509152173996, -0.007370011880993843, 0.01946396380662918, 0.003688785480335355, -0.028902146965265274, 0.02561979554593563, -0.025615889579057693, 0.025517133995890617, 0.02548080123960972, 0.037999264895915985, 0.0016650203615427017, 0.016218429431319237, 0.024727150797843933, -0.02063998021185398, -0.004482806660234928, -0.015262356027960777, 0.021247701719403267, -0.0245425496250391, 0.0015340925892814994, 0.048563290387392044, -0.01060846634209156, 0.008312439545989037, -0.014349054545164108, 0.015964530408382416, 0.016129648312926292, 0.019192887470126152, 0.012923574075102806, -0.03320423141121864, 0.07304051518440247, -0.02228502184152603, 0.034212008118629456, 0.0022090880665928125, 0.027351506054401398, 0.008957226760685444, -0.06304093450307846, -0.050308845937252045, -0.01619361899793148, -0.020338401198387146, 0.04474305734038353, -0.047185514122247696, -0.03940850496292114, -0.03321423381567001, -0.008630046620965004, -0.02658686973154545, 0.006039396859705448, -0.10700958967208862, 0.0068387784995138645, 0.03535972163081169, 0.013556056655943394, 0.012985753826797009, -0.025445731356739998, 0.011299239471554756, -0.05502929538488388, -0.00908839050680399, 0.09236826002597809, 0.03069409914314747, 0.013957860879600048, 0.006814303807914257, 0.05687561258673668, 0.0483560673892498, 0.0354374535381794, -0.02931002900004387, 0.012683805078268051, -0.00422412296757102, 0.003100838977843523, -0.024427494034171104, -0.005383905488997698, -0.1490708440542221, -0.05858771130442619, 0.004056710749864578, -0.05046043545007706, -0.020692121237516403, -0.02772633545100689, -0.009015008807182312, -0.005964153446257114, -0.0028487255331128836, 0.10973335802555084, 0.0017095006769523025, -0.029398920014500618, 0.0418756939470768, 0.13477946817874908, -0.01172309648245573, -0.002083791419863701, -0.019014807417988777, -0.007104113232344389, 0.05180532857775688, -0.005638334434479475, 0.028459928929805756, 0.015793630853295326, -0.043393488973379135, 0.05762263387441635, -0.02211766131222248, 0.009012873284518719, 0.009463564492762089, -0.017369979992508888, 0.025267088785767555, -0.029030654579401016, 0.023258917033672333, 0.026547735556960106, 0.00981396809220314, -0.03326954320073128, 0.08310758322477341, 0.05614631623029709, -0.020036151632666588, -0.025324609130620956, -0.004589305259287357, -0.2540397047996521, 0.02519642375409603, 0.025909002870321274, -0.059879519045352936, 0.0006252392777241766, 0.008143779821693897, -0.05813546106219292, 0.013824732974171638, -9.729441808303818e-05, 0.007302827667444944, -0.02748633362352848, 0.002159935887902975, 0.02056293562054634, 0.040041420608758926, 0.010442220605909824, 0.02251015417277813, 0.03614961355924606, -0.03675312548875809, 0.03303385525941849, 0.0031926564406603575, 0.008475663140416145, 0.004948034882545471, -0.019553186371922493, 0.02054583467543125, 0.09821998327970505, 0.0039049568586051464, -0.012653824873268604, 0.003004072466865182, -0.004925272893160582, 0.03083113767206669, -0.018524814397096634, 0.013148343190550804, 0.008169624954462051, -0.005949834361672401, -0.005529439076781273, 0.005952904932200909, 0.029773540794849396, -0.046214740723371506, 0.02678736299276352, 0.043650783598423004, 0.021100999787449837, -0.007324377074837685, 0.01214586291462183, -0.012256462126970291, 0.025394892320036888, -0.018773827701807022, 0.02030859887599945, -0.04039279371500015, 0.021272536367177963, -0.028124239295721054, -0.0183348897844553, -0.031050076708197594, -0.02025168389081955, -0.016338977962732315, 0.013275040313601494, -0.014108470641076565, -0.022329753264784813, 0.011746573261916637, 0.035356055945158005, 0.01728047989308834, -0.005023767706006765, -0.007845893502235413, 0.021376151591539383, 0.004630689509212971, 0.0073084235191345215, -0.011842400766909122, -0.013629748485982418, -0.021756023168563843, 0.0026077907532453537, 0.020828047767281532, -0.035440947860479355, 0.03731925040483475, -0.005118176341056824, -0.006735215429216623, 0.00019989133579656482, -0.00877094641327858, -0.05230670049786568, 0.027622248977422714, 0.04139132425189018, -0.0005003635305911303, -0.038438670337200165, 0.019670268520712852, -0.01303816307336092, 0.011311160400509834]" ./train/knee_pad/n03623198_7294.JPEG,knee_pad,"[-0.016579125076532364, 0.0015200992347672582, -0.003965983632951975, -0.029537152498960495, 0.0035184454172849655, -0.0054880715906620026, 0.003944565076380968, 0.06778626888990402, -0.008047990500926971, -0.012166772969067097, 0.020874515175819397, 0.006210431456565857, 0.045730236917734146, -0.0005643399199470878, 0.016189564019441605, -0.024747055023908615, 0.05772490054368973, 0.024209292605519295, -0.04117211326956749, -0.04010673239827156, -0.08954255282878876, -0.0244295597076416, -0.002849188633263111, 0.0026308598462492228, -0.008972768671810627, 0.02933291345834732, -0.004031633958220482, -0.010609934106469154, -0.006089930888265371, 0.013615514151751995, -0.02348421886563301, 0.010297388769686222, 0.005299607757478952, 0.0011356413597241044, -0.01376150082796812, -0.002078247955068946, -0.0064325821585953236, -0.03452954813838005, -0.027303891256451607, 0.02599264681339264, 0.035337336361408234, -0.0018285728292539716, 0.021540982648730278, -8.032665937207639e-05, 0.023363955318927765, -0.08911535888910294, -0.011856816709041595, 0.006188392639160156, 0.013699413277208805, -0.014567745849490166, 0.042515501379966736, -0.006355289835482836, 0.006186210084706545, -0.014159729704260826, -0.012359175831079483, 0.003329313825815916, -0.0312093123793602, 0.023840418085455894, 0.02831365168094635, 0.0010564234107732773, 0.027168165892362595, -0.008673864416778088, 0.05230157822370529, -0.0054652695544064045, -0.04984210804104805, -0.0448327399790287, 0.04710835590958595, -0.00456991046667099, 0.003340114839375019, 0.01310897246003151, -0.01522856019437313, -0.0355168953537941, -0.030094068497419357, -0.019156107679009438, -0.04832850396633148, -0.00041743062320165336, 0.033568572252988815, -0.017920298501849174, 0.03836046904325485, 0.024937471374869347, 0.021977007389068604, -0.04220851510763168, -0.019413838163018227, -0.012806430459022522, 0.054917335510253906, -0.02384447678923607, 0.08083676546812057, -0.016256168484687805, -0.006013516802340746, -0.008832888677716255, -0.013604397885501385, -0.03335065767168999, -0.6803209781646729, 0.03874975070357323, -0.02056426927447319, -0.015383437275886536, -0.014027898199856281, 0.015576893463730812, -0.04706769809126854, 0.056371428072452545, -0.02704964019358158, -0.031366925686597824, 0.036299996078014374, -0.029024383053183556, 0.025881191715598106, -0.01858064904808998, -0.17488539218902588, -0.045293692499399185, -0.0028959468472748995, -0.02872406132519245, -0.0047946348786354065, 0.011012635193765163, -0.009226996451616287, 0.0005451890756376088, -0.042288005352020264, -0.025089949369430542, 0.030877424404025078, -0.008695816621184349, -0.03418334946036339, -0.012211566790938377, 0.027047665789723396, 0.009259941056370735, -0.04486336186528206, -0.003458369290456176, -0.01459062285721302, 0.05222431197762489, -0.04551548510789871, 0.03563202545046806, 0.009566518478095531, 0.017177646979689598, -0.018687674775719643, -0.05424770340323448, 0.004909242037683725, 0.08605353534221649, -0.023958547040820122, -0.01808967813849449, -0.01154564879834652, -0.008041724562644958, 0.012542035430669785, -0.017206311225891113, -0.011803642846643925, -0.03160468861460686, -0.01842355728149414, -0.007833998650312424, -0.0009474629769101739, -0.029232917353510857, 0.0031763024162501097, -0.05032168701291084, -0.02803509496152401, -0.03602380305528641, -0.011723492294549942, -0.002276020823046565, 0.04988755285739899, -0.04847036674618721, 0.011536620557308197, -0.018987150862812996, -0.010682256892323494, 0.017464905977249146, 0.02817980758845806, -0.029370155185461044, -0.022870594635605812, 0.00671807024627924, 0.04610823839902878, -0.001532697002403438, 0.0344223715364933, -0.026968225836753845, 0.025486215949058533, 0.002753942273557186, 0.019437870010733604, 0.001162312226369977, -0.0010484580416232347, 0.009090794250369072, 0.005754287354648113, -0.023044921457767487, 0.0019092601723968983, -0.005007319618016481, 0.03857291489839554, 0.01112943422049284, -0.0524003691971302, 0.015775321051478386, 0.05953577533364296, 0.002750048413872719, 0.07223712652921677, -0.055901698768138885, -0.0014185294276103377, -0.019430281594395638, 0.02325013093650341, -0.015100829303264618, -0.025400996208190918, 0.006883671507239342, 0.011134155094623566, 0.028410999104380608, -0.02887895703315735, 0.004493447951972485, 0.06975996494293213, -0.03703976795077324, -0.015761520713567734, 0.03053971566259861, -0.023448554798960686, 0.02723454311490059, 0.006524193566292524, -0.02671232633292675, -0.004090035334229469, 0.04558345302939415, 0.018639273941516876, -0.03039463795721531, 0.014017853885889053, -0.02173563838005066, -0.06312286108732224, 0.026003073900938034, -0.015240006148815155, -0.05403567850589752, 0.008537397719919682, -0.01965879648923874, 0.0005302452482283115, 0.023078029975295067, -0.041824113577604294, 0.0121031254529953, -0.03733457997441292, 0.007857170887291431, 0.0038282752502709627, -0.06975400447845459, -0.0068832505494356155, 0.025603968650102615, -0.009256226941943169, 0.05621280148625374, -0.020193560048937798, 0.008010241203010082, 0.018443098291754723, 0.004968029912561178, -0.0031283835414797068, -0.0028427764773368835, -0.011737380176782608, 0.10807971656322479, -0.008968629874289036, 0.011873754672706127, 0.04034728184342384, -0.010090692900121212, -0.027492517605423927, -0.015425439924001694, -0.0008635025005787611, -0.025258615612983704, -0.011824961751699448, -0.005574118811637163, 0.014956437982618809, -0.022047359496355057, 0.01266541052609682, 0.02076825685799122, -0.0026586372405290604, 0.024979444220662117, 0.01237181294709444, -0.02963782660663128, 0.006575917825102806, -0.03588929399847984, -0.01682271435856819, 0.014332633465528488, 0.002430812455713749, 0.012079721316695213, -0.08214446902275085, 0.028711287304759026, 0.06791681051254272, 0.04912303015589714, -0.043289683759212494, -0.032504741102457047, -0.017285354435443878, 0.031032469123601913, -0.03056354820728302, 0.005284002050757408, 0.00024818332167342305, -0.02401270531117916, -0.029660450294613838, 0.03504203259944916, -0.002016874263063073, 0.012970829382538795, 0.017514673992991447, -0.021505888551473618, 0.02571316808462143, 0.0007462006178684533, -0.014579887501895428, 0.008209657855331898, -0.04040192812681198, 0.03545166924595833, -0.04853205382823944, -0.02124687470495701, -0.0019246325828135014, 0.016789071261882782, 0.06012609228491783, 0.01193222962319851, -0.007213940378278494, -0.020091792568564415, 0.026783404871821404, 0.002244187518954277, -0.007695206440985203, -0.01780243031680584, 0.021846579387784004, -0.019733279943466187, 0.00742657296359539, 0.01928660273551941, 0.02224184013903141, 0.02053394727408886, 0.02667560614645481, 0.006281016860157251, 0.014805829152464867, -0.006169015541672707, 0.01431755069643259, -0.06033993512392044, 0.028083698824048042, 0.04598985239863396, -0.05032062903046608, 0.011519362218677998, 0.00876411609351635, 0.03308388590812683, 0.08604207634925842, -0.038132019340991974, 0.008918317034840584, 0.008895640261471272, -0.015541058965027332, -0.028766393661499023, -0.011498410254716873, -0.07321101427078247, -0.013998345471918583, 0.15721486508846283, -0.040711235255002975, -0.022937102243304253, 0.06039200723171234, -0.003552020527422428, 0.024014070630073547, 0.04258464276790619, -0.019903425127267838, 0.01810583658516407, -0.01595655456185341, 0.03290437534451485, -0.024648644030094147, -0.012609167955815792, -0.012425241991877556, 0.014227545820176601, 0.0040813940577209, 0.019451996311545372, -0.03909240663051605, -0.04070015996694565, -0.009706017561256886, 0.02377156913280487, 0.03393220528960228, 0.006291345227509737, -0.01780703477561474, -0.0030608263332396746, -0.0033669942058622837, 0.017041705548763275, 0.02667565457522869, -0.03513281047344208, -0.0014827125705778599, 0.015455571003258228, 0.011244109831750393, 0.05351249501109123, 0.036222804337739944, -0.022228170186281204, -0.06895168125629425, 0.04977228119969368, 0.003220481565222144, -0.016719182953238487, 0.04753017798066139, -0.01993175409734249, -0.019014395773410797, -0.05027727037668228, 0.016068805009126663, -0.01911400444805622, 0.01753384806215763, -0.07185224443674088, -0.0337495282292366, 0.03430289402604103, 0.005527987610548735, -0.004068959504365921, -0.020380899310112, -0.014210446737706661, -0.020255055278539658, -0.018062980845570564, 0.12892669439315796, 0.0017505127470940351, -0.047238729894161224, 0.006815882865339518, 0.013142909854650497, -0.020274445414543152, 0.015944713726639748, 0.029798276722431183, -0.027559898793697357, -0.007415457163006067, -0.017900729551911354, -0.029247501865029335, -0.02747759222984314, -0.0335034504532814, -0.07116582244634628, 0.003708118572831154, 0.01564553938806057, 0.01878802850842476, -0.037491895258426666, -0.01022067666053772, 0.013235588558018208, -0.020190143957734108, 0.01139750611037016, 0.037618327885866165, -0.037304945290088654, 0.01100184302777052, 0.11597009748220444, -0.026053451001644135, 0.01303575374186039, -0.009959426708519459, 0.035326723009347916, -0.014605464413762093, -0.033650871366262436, 0.03246228024363518, 0.03889721632003784, 0.022839920595288277, -0.005261317361146212, 0.021320072934031487, 0.009763904847204685, 0.0072612822987139225, -0.01952234096825123, 0.050353042781353, -0.06265506893396378, -0.028188763186335564, 0.004758363123983145, -0.013668148778378963, 0.032050956040620804, 0.03967542201280594, 0.044651079922914505, 0.004414557479321957, -0.034567542374134064, -0.03821629658341408, -0.11642422527074814, 0.030432701110839844, 0.011983726173639297, 0.016723351553082466, 0.030947213992476463, -0.029811400920152664, 0.01314680278301239, 0.008987787179648876, -0.0023727051448076963, -0.04782894626259804, -0.018058402463793755, -0.006604814436286688, 0.006664660293608904, 0.03980353847146034, 0.05109690874814987, 0.021350307390093803, 0.024255899712443352, -0.06833512336015701, 0.0011024422710761428, 0.028798487037420273, -0.058243125677108765, 0.05414591729640961, -0.006464890204370022, -0.006605371367186308, -0.0061292583122849464, -0.08271332085132599, -0.0006808407488279045, -0.03490515425801277, -0.05739947780966759, 0.026527272537350655, 0.022482270374894142, 0.03376755118370056, 0.023713551461696625, 0.005921141244471073, -0.003677456406876445, 0.023825570940971375, -0.004512087441980839, 0.014242228120565414, 0.04109061881899834, 0.01799314096570015, -0.014756272546947002, -0.0631551519036293, -0.026021843776106834, 0.008029486984014511, -0.0021838522516191006, -0.009828630834817886, 0.024263309314846992, 0.009708904661238194, -0.012398993596434593, -0.03839564695954323, 0.025264449417591095, -0.0034200530499219894, -0.010169836692512035, -0.015525130555033684, -0.02066808007657528, 0.004351859446614981, 0.020082348957657814, -0.01708606258034706, -0.009118031710386276, 0.008651704527437687, 0.02106945961713791, 0.012315532192587852, -0.018657278269529343, 0.034948620945215225, -0.023791734129190445, -0.02898647077381611, -0.01394638977944851, -0.045089028775691986, 0.02535329945385456, -0.0015627635875716805, -0.04621526226401329, 0.0075173876248300076, 0.0006718837539665401, 0.004861081019043922, -0.02489936538040638, -0.002103739883750677, 0.007283593062311411, 0.020878203213214874, -0.020265309140086174, -0.012905499897897243, -0.032839272171258926, 0.0502450056374073, -0.04181181639432907, -0.011189768090844154]" ./train/knee_pad/n03623198_11556.JPEG,knee_pad,"[-0.016324587166309357, 0.005816356744617224, 0.05315540358424187, 0.03134118765592575, -0.026548586785793304, 0.020916858687996864, -0.007257786579430103, 0.011700942181050777, 0.016181712970137596, -0.03150821477174759, 0.06731806695461273, -0.02029573917388916, 0.02095276303589344, 0.0185171477496624, 0.013754208572208881, -0.0005920013645663857, 0.09449837356805801, 0.021945545449852943, -0.034879621118307114, -0.045222487300634384, -0.051853153854608536, 0.008457440882921219, 0.029857970774173737, -0.012982086278498173, -0.013122103177011013, 0.018946515396237373, 0.028938891366124153, 0.0180381890386343, 0.01608601212501526, 0.017684584483504295, 0.008631364442408085, 0.015530685894191265, -0.03403637930750847, -0.01648222841322422, -0.05729268118739128, -0.0009521589381620288, 0.03014279715716839, -0.0023502458352595568, 0.009977808222174644, 0.04614096134901047, -0.0026885545812547207, -0.06870639324188232, -0.03826189786195755, -0.02306213788688183, 0.0641150251030922, -0.10641948133707047, 0.023661373183131218, 0.016569623723626137, -0.11592596024274826, 0.02820160798728466, 0.08292590081691742, 0.01237236987799406, 0.012467630207538605, 0.002246591029688716, -0.011845906265079975, -0.00015347552835009992, -0.010407461784780025, 0.016851138323545456, -0.013076039031147957, -0.014888828620314598, 0.09268491715192795, 0.00459491740912199, -0.025515887886285782, -0.001264349091798067, -0.060194820165634155, -0.020647497847676277, 0.0037974161095917225, 0.07829742878675461, 0.0693586990237236, -0.0067106205970048904, -0.001920699025504291, -0.03930530324578285, 0.02591613493859768, 0.0006132589769549668, 0.006001780275255442, 0.04117149859666824, 0.038796503096818924, -0.004717129748314619, -0.014761856757104397, -0.010412361472845078, 0.013693799264729023, -0.03707103803753853, 0.005101187154650688, 0.01598002389073372, -0.01448388397693634, 0.0055826022289693356, 0.03943497687578201, -0.01733347959816456, 0.02500106766819954, -0.017692510038614273, -0.017891792580485344, -0.060556817799806595, -0.6283513903617859, -0.004211144521832466, -0.020988639444112778, 0.012295189313590527, 0.038059134036302567, 0.04354063421487808, 0.011624385602772236, 0.060233451426029205, 0.018959181383252144, -0.016398640349507332, 0.05581741780042648, -0.0070360759273171425, 0.06576065719127655, 0.03457585349678993, -0.11316636949777603, -0.009310665540397167, -0.0073944577015936375, 0.0030784800183027983, -0.008533663116395473, 0.026658430695533752, -0.0019989577122032642, -0.007351309061050415, -0.030890826135873795, -0.05237920954823494, -0.06392470747232437, -0.030048800632357597, -0.01722724735736847, 0.004343814216554165, -0.0361194834113121, -0.03212853521108627, -0.02427407167851925, 0.017548106610774994, 0.014414952136576176, 0.03663159906864166, -0.022444821894168854, -0.025171978399157524, 0.01029461994767189, -0.0024405750446021557, -0.017453357577323914, -0.0067596291191875935, -0.03497889265418053, 0.08840017765760422, 0.03610015660524368, 0.006663179025053978, -0.007874984294176102, -0.07673680782318115, -0.01761787012219429, -0.014783949591219425, 0.047997646033763885, 0.04168266803026199, -0.000796050822827965, 0.04211049899458885, -0.0006736077484674752, 0.0006307167350314558, 0.05471770092844963, -0.031698647886514664, -0.04857976734638214, 0.0027568109799176455, -0.004876449704170227, -0.003940435126423836, -0.015235223807394505, -0.004498702939599752, -0.014558453112840652, -0.02962987683713436, 0.012702997773885727, -0.03848297894001007, 0.02359406277537346, 0.01790708303451538, -0.023487253114581108, -0.010573784820735455, 0.02597852610051632, 0.00991352554410696, 0.03887638449668884, -0.05150528624653816, 0.05367467552423477, 0.011565192602574825, 0.0033287196420133114, -0.001232942333444953, -0.018735140562057495, -0.011840668506920338, 0.0035725769121199846, -0.010041232220828533, -0.017439663410186768, -0.050621192902326584, 0.052227675914764404, 0.021873267367482185, -0.04315686225891113, -0.00633831974118948, 0.03410685062408447, -0.03784315288066864, 0.06812188774347305, -0.007410629186779261, -0.021736852824687958, -0.007774120196700096, 0.06118441000580788, -0.004087352659553289, -0.01547706313431263, 0.02417384274303913, 0.008852826431393623, 0.025937844067811966, -0.01992940902709961, 0.04431542381644249, 0.02912338636815548, -0.012148556299507618, -0.04474940150976181, -0.03411032259464264, -0.05744394659996033, -0.04433157294988632, 0.02190888114273548, -0.019158991053700447, 0.026346366852521896, 0.056784696877002716, 0.036751292645931244, -0.05745066702365875, 0.022252416238188744, -0.0013789973454549909, -0.05843845009803772, 0.0031840961892157793, -0.0329989455640316, -0.02138039842247963, -0.031386736780405045, 0.02581188827753067, -0.017654171213507652, -0.015140853822231293, -0.024745196104049683, 0.008089287206530571, 0.004765195306390524, 0.0338565818965435, -0.027375252917408943, -0.02901504933834076, -0.008079552091658115, -0.019025441259145737, -0.019526425749063492, 0.008862902410328388, -0.03584396466612816, 0.015619555488228798, 0.03288613632321358, 0.02981995977461338, -0.004313098732382059, -0.007691930513828993, 0.04518406465649605, 0.03874070569872856, -0.006425631232559681, -0.03301152586936951, -0.0016736187972128391, -0.03514576330780983, -0.002130841836333275, 0.013588441535830498, 0.01644197106361389, -0.022230999544262886, -0.013603541068732738, 0.02818085439503193, -0.0008023607661016285, 0.0021707159467041492, 0.028353163972496986, 0.004581948276609182, -0.01986646093428135, 0.012988317757844925, -0.019966971129179, -0.01825244165956974, -0.01991541124880314, -0.007317428011447191, 0.03346794843673706, -0.0006700647645629942, -0.009448659606277943, 0.00919990986585617, 0.024316487833857536, 0.010184591636061668, 0.0055117737501859665, -0.0062865703366696835, 0.022215278819203377, 0.009844625368714333, -0.009191052056849003, 0.021317824721336365, 0.008510749787092209, -0.011293102987110615, 0.0011193384416401386, 0.018429754301905632, -0.05178296938538551, 0.007882676087319851, -0.009269295260310173, -0.05379502847790718, 0.03627290949225426, 0.020479269325733185, -0.03388608992099762, -0.0028298322577029467, -0.005443361587822437, 0.0008896120125427842, 0.0002666393993422389, -0.0341184176504612, -0.07659862190485, -0.005056432913988829, -0.0021082765888422728, 0.04750989004969597, -0.020404040813446045, 0.01997370645403862, 0.03865060210227966, -0.04217630997300148, 0.05347580462694168, -0.027881521731615067, -0.036989692598581314, 0.015599347651004791, -0.019757427275180817, 0.024483904242515564, -0.0758996456861496, 0.00678036967292428, 0.017302144318819046, 0.04807225987315178, 0.04845893383026123, -0.01507606077939272, -0.030703751370310783, 0.025175856426358223, -0.034541502594947815, -0.04747609794139862, -0.06312307715415955, 0.08079230785369873, 0.0038777459412813187, -0.0011316495947539806, -0.006673902273178101, 0.05803708732128143, 0.08829493075609207, -0.0045174360275268555, 0.044997308403253555, 0.010948055423796177, 0.04599178209900856, -0.021760599687695503, -0.005719504319131374, -0.03824406489729881, 0.03894217312335968, 0.03079693205654621, -0.03931277245283127, 0.0267021581530571, 0.0051034134812653065, -0.006357039324939251, -0.024995239451527596, 0.022526070475578308, -0.02109490893781185, 0.020765120163559914, 0.023405728861689568, 0.011686707846820354, -0.003337183967232704, 0.006727705243974924, -0.02635861188173294, 0.029800880700349808, -0.011063153855502605, -0.026520024985074997, -0.0026225480251014233, 0.00045044408761896193, -0.06305695325136185, 0.01975046470761299, 0.009576705284416676, -0.008949186652898788, 0.011304659768939018, 0.01219968218356371, 0.017153918743133545, 0.03039686754345894, 0.06698233634233475, -0.002905569737777114, 0.00020045199198648334, -0.0031532428693026304, 0.013206332921981812, -0.005936683155596256, 0.0031193688046187162, -0.04792289063334465, -0.0570853091776371, 0.02733432501554489, -0.008492016233503819, -0.022426169365644455, 0.06222960725426674, -0.01765139028429985, -0.029709910973906517, -0.06603512167930603, 0.01870490424335003, -0.020962923765182495, 0.0011540809646248817, -0.10649165511131287, 0.030180752277374268, 0.0675269067287445, -0.010827532038092613, 0.030621761456131935, -0.0027323043905198574, 0.018807074055075645, -0.008250917308032513, 0.04308852180838585, 0.1365346908569336, 0.06294147670269012, -0.0460207536816597, 0.003314606612548232, 0.045370131731033325, 0.016474900767207146, 0.021162129938602448, 0.005274132825434208, -0.005267493426799774, 0.0005539111443795264, -0.031111642718315125, -0.008455534465610981, -0.028278937563300133, -0.1182178258895874, -0.049190253019332886, 0.031221546232700348, -0.009096748195588589, 0.014068327844142914, -0.02989567071199417, -0.009625328704714775, -0.01656256429851055, 0.03003889136016369, 0.05906711146235466, 0.02596832625567913, -0.0266403891146183, 0.027095042169094086, 0.16586154699325562, 0.001193744014017284, 0.013539057224988937, -0.020903199911117554, -0.0020773911383002996, -0.012656915932893753, -0.03310752660036087, 0.02723458595573902, -0.0024562012404203415, -0.01988540217280388, 0.02447204850614071, 0.020074710249900818, -0.02626044675707817, -0.009961930103600025, -0.010759464465081692, -0.006493149790912867, -0.039682552218437195, -0.021840926259756088, 0.020468806847929955, 0.031376346945762634, 3.93996424463694e-06, 0.11293649673461914, -0.0020841192454099655, 0.011664276011288166, -0.05547744035720825, -0.022849945351481438, -0.10448965430259705, 0.02155967801809311, -0.032323822379112244, 0.04126427695155144, -0.0037099665496498346, 0.006729165557771921, -0.02714359201490879, -0.01380248460918665, -0.08605970442295074, -0.014385568909347057, -0.02401783876121044, -0.005874316208064556, 0.016504935920238495, 0.04440407082438469, 0.04739855229854584, 0.025159617885947227, 0.053730227053165436, -0.022771675139665604, 0.03508457913994789, -0.006540889386087656, 0.008731554262340069, 0.033604782074689865, -0.04703640192747116, -0.0009808923350647092, 0.0377797856926918, -0.017358606681227684, 0.013723518699407578, -0.011466705240309238, -0.027738898992538452, 0.016623299568891525, -0.022594863548874855, 0.010068004950881004, -0.026595059782266617, 0.03189602494239807, 0.007376561406999826, 0.0017838506028056145, 0.025481946766376495, -0.03709058091044426, 0.044902265071868896, 0.004885484930127859, -0.05853816866874695, -0.03401310369372368, -0.012134344317018986, -0.01678111031651497, 0.02665439248085022, -0.03531255945563316, 0.051593996584415436, -0.012914315797388554, 0.027644064277410507, 0.0213220976293087, -0.02699991688132286, -0.04569544270634651, -0.0028106817044317722, 0.02781687118113041, -0.008087697438895702, 0.0009960730094462633, 0.006711345165967941, -0.018766110762953758, 0.01771303080022335, 0.024312341585755348, 0.0018186051165685058, -0.0038468781858682632, 0.006001865491271019, 0.0109647735953331, 0.005781527608633041, -0.06806749850511551, 0.016575338318943977, -0.010007592849433422, 0.034237392246723175, -7.35404173610732e-05, -0.07236824929714203, 0.0040708924643695354, 0.03810099884867668, 0.00014689183444716036, -0.001135411555878818, 0.01157173328101635, 0.01248777937144041, 0.012559903785586357, 0.024332765489816666, -0.02253030426800251, 0.011051777750253677, 0.07595524936914444, 0.013721498660743237, 0.02280956506729126]" ./train/lion/n02129165_19875.JPEG,lion,"[-0.015019734390079975, -0.007332730572670698, 0.016652319580316544, 0.02002563141286373, 0.011443368159234524, 0.027431631460785866, 0.041515544056892395, -0.008169912733137608, 0.055604252964258194, -0.014036859385669231, 0.006710996851325035, 0.012555358000099659, 0.014276966452598572, -0.023103313520550728, 0.006653125863522291, -0.04291477054357529, -0.02833572030067444, 0.05311780795454979, -0.022651605308055878, 0.05494360253214836, 0.0004186639271210879, -0.006390695925801992, 0.01638546586036682, -0.018900005146861076, -0.022921467199921608, 0.01507753785699606, -0.03273541107773781, -0.01558502484112978, -0.00038862868677824736, -0.06420917809009552, 0.024556603282690048, -0.036429595202207565, 0.011415488086640835, 0.005967243574559689, -0.043766338378190994, -0.008764983154833317, 0.02022230252623558, 0.048749204725027084, -0.011311288923025131, 0.11676967144012451, 0.006358708720654249, 0.03231769800186157, 0.017938507720828056, -0.03751351311802864, -0.00801593717187643, -0.1258961707353592, 0.045899078249931335, 0.033139608800411224, -0.01012851856648922, 0.00294638704508543, -0.010137355886399746, 0.014988405629992485, 0.03197585418820381, -0.033216699957847595, -0.0657699704170227, 0.06351079046726227, 0.017782486975193024, 0.07500585168600082, 0.048076845705509186, 0.024115687236189842, -0.020510127767920494, 0.03400804102420807, -0.03574313595890999, 0.060896605253219604, -0.04527519270777702, -0.04385468736290932, -0.013230710290372372, 0.10086674988269806, -0.03189762309193611, 0.0175842996686697, -0.02583722583949566, -0.012164182960987091, 0.021528227254748344, -0.014991446398198605, -0.02655656635761261, -0.05755792558193207, -0.013792089186608791, 0.021499361842870712, -0.08616571128368378, -0.027745310217142105, 0.00949446763843298, 0.019395902752876282, -0.01230072695761919, 0.03330327197909355, 0.05007234960794449, -0.006707966327667236, -0.03249149024486542, -0.01507211197167635, 0.08647968620061874, -0.01496230997145176, -0.017443884164094925, 0.009138796478509903, -0.5791970491409302, 0.011100592091679573, -0.022135216742753983, 0.007729560136795044, 0.01663898304104805, 0.009913316927850246, -0.043883636593818665, -0.01691395789384842, -0.009376266971230507, 0.011454611085355282, -0.04991498962044716, 0.059782810509204865, -0.020358415320515633, -0.017179755493998528, -0.10264525562524796, 0.002807117300108075, 0.021357771009206772, 0.002174263820052147, -0.0638333261013031, -0.034163691103458405, 0.002283178735524416, -0.012510165572166443, 0.017713528126478195, -0.010082620196044445, 0.040363311767578125, -0.02476201206445694, 0.035089846700429916, 0.022509364411234856, 0.003752215299755335, 0.041249364614486694, 0.02854974754154682, 0.01275735441595316, -0.05275293067097664, -0.015124663710594177, 0.011186203919351101, 0.029409904032945633, -0.014941930770874023, -0.015940656885504723, -0.038024723529815674, -0.05092121660709381, 4.9366921302862465e-05, 0.07398536056280136, -0.011064963415265083, -0.005218361504375935, -0.008362102322280407, -0.031076572835445404, -0.014021490700542927, 0.013472107239067554, -0.05746554210782051, -0.026252172887325287, -0.04440617933869362, 0.014683686196804047, -0.02396209165453911, 0.0058569698594510555, -0.02992182970046997, -0.02643454261124134, 0.0015112431719899178, 0.018697509542107582, -0.024122066795825958, -0.03128202259540558, 0.006041246931999922, -0.0022306290920823812, 0.029291050508618355, 0.040956370532512665, 0.015357120893895626, 0.03430599346756935, 0.0643744245171547, 0.025990350171923637, -0.05368587374687195, -0.01964428462088108, 0.02094678394496441, -0.0174882672727108, -0.02093292586505413, -0.0026817326433956623, -0.04361138865351677, -0.0032520240638405085, -0.01761304773390293, 0.0353405699133873, 0.00612663384526968, 0.03184313699603081, 0.010112755931913853, 0.002259677741676569, -0.04067119583487511, 0.011834767647087574, -0.07529240101575851, 0.03964458033442497, -0.04763147979974747, 0.005898206494748592, 0.010803282260894775, -0.025975901633501053, 0.03086559846997261, -0.03325619176030159, -0.01764334738254547, -0.008831641636788845, 0.024125948548316956, 0.006444022059440613, -0.013853263109922409, 0.02137807011604309, -0.00305590289644897, 0.01252565998584032, 0.01966996118426323, 0.03590608388185501, -0.09684920310974121, 0.024476826190948486, 0.021130776032805443, -0.02551521547138691, -0.01495465636253357, -0.028044119477272034, 0.03718473017215729, 0.015792090445756912, 0.013605956919491291, 0.03590041771531105, -0.0003853841044474393, 0.020020805299282074, 0.025754373520612717, -0.00726561713963747, 0.03592045232653618, 0.004556992556899786, -0.08859620988368988, 0.024576624855399132, 0.02640107087790966, 0.0014171749353408813, -0.006218403577804565, 0.021126657724380493, 0.025547854602336884, 0.0347430445253849, 0.035558126866817474, -0.007535007782280445, 0.021188031882047653, 0.044720884412527084, 0.009480996057391167, -0.01940132863819599, 0.021881939843297005, -0.010849428363144398, -0.02411087602376938, -0.0257825069129467, 0.012197330594062805, 0.023400340229272842, -0.04394811764359474, 0.0047892373986542225, 0.029683366417884827, 0.039658259600400925, 0.04564495012164116, -0.06885987520217896, -0.020030342042446136, -0.009551046416163445, -0.029403170570731163, 0.010357261635363102, -0.029179031029343605, 0.012164815329015255, 0.03869497403502464, -0.006696876138448715, -0.005361638497561216, 0.026043150573968887, -0.03536267951130867, -0.015007070265710354, 0.006045479793101549, 0.035182490944862366, -0.05299736559391022, 0.06470508128404617, 0.012291929684579372, -0.009635357186198235, 0.016133636236190796, 0.033971790224313736, -0.021268030628561974, -0.004308739677071571, 0.2476472705602646, 0.04225859045982361, -0.0032997559756040573, -0.02390671707689762, -0.029836801812052727, 0.09389187395572662, 0.0037927578669041395, 0.018898634240031242, 0.030499715358018875, 0.01068179402500391, 0.0033666950184851885, 0.00874693226069212, -0.0217296052724123, 0.02023588865995407, 0.033493317663669586, 0.03861643746495247, 0.05648494511842728, -0.020777994766831398, -0.019809335470199585, 0.02168969251215458, 0.0005409751902334392, 0.018129775300621986, 0.013450872153043747, 0.03267699480056763, 0.005291023291647434, -0.05497794598340988, 0.035926900804042816, 0.03406328707933426, -0.032694995403289795, -0.026369385421276093, -0.022856557741761208, -0.02034086547791958, -0.03431902080774307, -0.022325288504362106, 0.00035511748865246773, -0.0031524267978966236, 0.0034660291858017445, -0.022941462695598602, 0.144449844956398, 0.030713604763150215, -0.007146872114390135, -0.0457775704562664, -0.03398038074374199, -0.005027386825531721, -0.026824476197361946, 0.012845481745898724, 0.04490911215543747, 0.03416101261973381, 0.015304608270525932, -0.0037760676350444555, 0.007227219175547361, -0.000726974627468735, 0.025269802659749985, 0.007726413197815418, 0.07374715059995651, -0.0561053529381752, 0.025795921683311462, -0.025745781138539314, -0.014514277689158916, 0.039121661335229874, -0.0391048863530159, -0.010409040376543999, -0.0009300036472268403, 0.0901246964931488, 0.0032177662942558527, -0.025733202695846558, 0.03710455447435379, -0.042326416820287704, 0.017386766150593758, -0.012359353713691235, 0.02155943028628826, -0.03581881895661354, 0.02077930048108101, -0.021588025614619255, 0.008114405907690525, -0.032791245728731155, -0.00762569485232234, -0.007490847259759903, 0.009505141526460648, 0.023405427113175392, -0.04309966042637825, -0.005908280611038208, -0.006783910561352968, 0.028193751350045204, 0.004399971105158329, -0.022341903299093246, -0.000701224256772548, -0.022400517016649246, -0.031189288944005966, 0.03518647328019142, -0.01607634499669075, 0.007276453543454409, -0.0432615764439106, 0.024702582508325577, 0.007852334529161453, 0.0509440079331398, -0.008706764318048954, -0.00020463255350477993, -4.84138035972137e-05, -0.1136685237288475, -0.010184869170188904, -0.017732039093971252, 0.09119003266096115, 0.04158806428313255, -0.01639430783689022, 0.030091367661952972, -0.06983962655067444, 0.013888596557080746, 0.005813455209136009, -0.057673875242471695, -0.05862196534872055, 0.05076680704951286, 0.0010747440392151475, -0.018458262085914612, -0.02340054325759411, -0.03821372240781784, 0.04458533227443695, 0.05154431238770485, 0.08135385066270828, 0.016997061669826508, -0.015558741055428982, 0.009500790387392044, 0.02621489204466343, -0.00016834092093631625, -0.0218843724578619, -0.04009894281625748, 0.018928857520222664, 0.09143691509962082, 0.029833823442459106, 0.008607971481978893, -0.04157451167702675, 0.016424717381596565, -0.04310432821512222, -0.044785816222429276, 0.027759717777371407, 0.01931975595653057, 0.03287990391254425, -0.017261898145079613, 0.030373815447092056, 0.02655763551592827, -0.09111478924751282, -0.032874878495931625, 0.01545956265181303, 0.014993860386312008, -0.03281566873192787, -0.007615566719323397, -0.01029630284756422, 0.02710745483636856, -0.05493776872754097, -0.04944790527224541, 0.04459405690431595, -0.004800726193934679, 0.10896799713373184, 0.021471451967954636, -0.0253883209079504, 0.052853308618068695, -0.021441977471113205, -0.029813364148139954, -0.00934947282075882, -0.007415919564664364, 0.027153920382261276, -0.05176062881946564, -0.04110366851091385, 0.011991526931524277, 0.005876548122614622, 0.02044031023979187, 0.02771315537393093, -0.008075087331235409, 0.015143248252570629, -0.011946597136557102, 0.01412948314100504, 0.002877315506339073, -0.00227796146646142, 0.015276005491614342, 0.005123038776218891, -0.011232294142246246, -0.07680242508649826, -0.01751684956252575, 0.019220897927880287, -0.017920400947332382, -0.02612784318625927, -0.024755867198109627, 0.004064553417265415, -0.03282025083899498, -0.03933117911219597, -0.047288186848163605, 0.004524146672338247, 0.02341442182660103, 0.030784349888563156, -0.004277229309082031, 0.029945367947220802, 0.004972160793840885, -0.03510530665516853, -0.051401183009147644, -0.02801363915205002, -0.052938178181648254, 0.0003281319804955274, -0.0367346927523613, 0.08553209155797958, -0.04688430204987526, -0.0059815761633217335, 0.030592089518904686, -0.01280386745929718, 0.0572846494615078, 0.0716002881526947, -0.02821120247244835, 0.02080792561173439, -0.006538664922118187, -0.04870707914233208, -0.016902660951018333, 0.028636744245886803, -0.030073273926973343, 0.00022261857520788908, 0.00918414443731308, -0.013846136629581451, -0.025670833885669708, 0.019307296723127365, -0.05251732096076012, -0.03988282382488251, -0.018996117636561394, -0.009561944752931595, 0.00556078739464283, 0.002417558105662465, -0.02869573049247265, 0.008107895962893963, 0.05800877884030342, 0.02371305786073208, 0.030376553535461426, 0.00638895807787776, -0.015616565942764282, 0.0008169267093762755, -0.04957303777337074, -0.022261524572968483, -0.030015328899025917, 0.0375136099755764, -0.01491496991366148, 0.034859806299209595, 0.005847061984241009, 0.03281540051102638, 0.02699836529791355, 0.019354723393917084, 0.009101767092943192, -0.01534491777420044, 0.060330964624881744, 0.016001496464014053, 0.011704781092703342, -0.0070185535587370396, -0.06221998110413551, 0.03799641132354736, -0.032019153237342834, -0.011105991899967194, 0.03611431270837784, 0.012438495643436909, 0.015433053486049175]" ./train/lion/n02129165_16.JPEG,lion,"[0.036396902054548264, -0.016911417245864868, -0.0009733622428029776, -0.03463451936841011, -0.022810079157352448, -0.018137989565730095, 0.016657257452607155, 0.043397437781095505, -0.008168590255081654, 0.019847411662340164, 0.024201346561312675, -0.018277093768119812, -0.004045441746711731, -0.05262250080704689, 0.0063356319442391396, -0.027913644909858704, 0.039762429893016815, -0.018251655623316765, 0.03312423825263977, 0.05258137732744217, -0.01778014935553074, 0.0329221710562706, 0.04366700351238251, -0.04182606190443039, 0.0017581443535163999, 0.009483512490987778, 0.009042316116392612, 0.03186923265457153, 0.0315481461584568, -0.006063286680728197, 0.025333484634757042, -0.04925064370036125, 0.011182020418345928, 0.004923716653138399, -0.022463232278823853, -0.0002041149855358526, 0.023305635899305344, 0.009227241389453411, 0.0156769510358572, 0.140476793050766, -0.025716347619891167, 0.021934635937213898, 0.04245999827980995, -0.019783401861786842, -0.02338278666138649, 0.0885760560631752, 0.0017193183302879333, 0.03719976916909218, -0.008926240727305412, -0.019454624503850937, -0.015504543669521809, 0.0034006910864263773, 0.026182476431131363, -0.015636736527085304, 0.003794438671320677, 0.03489629551768303, 0.005944998003542423, 0.018949324265122414, 0.022093825042247772, -0.001160781946964562, 0.06891299784183502, 0.009092112071812153, 0.006696658208966255, 0.004768540617078543, 0.024504633620381355, -0.02989061176776886, 0.01378608588129282, 0.015166040509939194, 0.017802849411964417, 0.016599074006080627, -0.03592874854803085, -0.022853128612041473, 0.031835801899433136, 0.010416076518595219, -0.020652176812291145, -0.0008882199181243777, -0.04658733308315277, 0.013837368227541447, -0.033303551375865936, -0.003354072105139494, -0.020442120730876923, -0.013420465402305126, 0.0217729639261961, -0.06099660322070122, 0.023227207362651825, -0.015418324619531631, -0.09023391455411911, -0.027547990903258324, 0.04440651088953018, 0.026659812778234482, 0.024680308997631073, 0.030185088515281677, -0.676810085773468, 0.08572401106357574, -0.06858569383621216, -0.02884017676115036, -0.006890024524182081, -0.020259562879800797, -0.10583405196666718, 0.06553371995687485, -0.0415925495326519, -0.014485865831375122, 0.003609676146879792, 0.044773902744054794, 0.03080679662525654, -0.0061829471960663795, 0.0034675428178161383, 0.05269366130232811, 0.016716856509447098, 0.005823612213134766, 0.005587986670434475, 0.04732469841837883, 0.02275482751429081, 0.018251409754157066, -0.009937308728694916, 0.015947306528687477, 0.008397897705435753, -0.015462679788470268, 0.0412893183529377, 0.026341687887907028, -9.792877244763076e-05, 0.03447934612631798, 0.009661207906901836, 0.010058355517685413, -0.00382331945002079, -0.0016229121247306466, 0.030782774090766907, -0.028603149577975273, -0.006306709721684456, -0.02242748625576496, 0.023297226056456566, 0.013581828214228153, -0.006808644160628319, 0.09108664095401764, 0.006755122449249029, -0.022918691858649254, 0.0015831355703994632, 0.016157275065779686, -0.036681294441223145, -0.020613860338926315, -0.007674351800233126, -0.07057252526283264, 0.013189492747187614, 0.042121391743421555, -0.027958890423178673, -0.009120098315179348, -0.0021225949749350548, -0.02838749997317791, -0.00781264714896679, 0.017930837348103523, 0.01511155255138874, -0.006552712991833687, 0.0301207285374403, 0.0016174863558262587, -0.006958784535527229, 0.048990748822689056, -0.020106198266148567, -0.00984118226915598, 0.006916108541190624, 0.055994294583797455, 0.020514395087957382, -0.005606795195490122, -0.0135157136246562, -0.011414851061999798, 0.038158681243658066, 0.004004389047622681, -0.06817405670881271, -0.0075508649460971355, 0.0042830114252865314, 0.013944990001618862, -0.011525445617735386, 0.03098313696682453, -0.024037668481469154, 0.011238272301852703, -0.004665391985327005, 0.03475933521986008, -0.05123349651694298, -0.03515675663948059, -0.01422420609742403, -0.015658976510167122, 0.0059363748878240585, 0.01945657655596733, 0.0199322197586298, -0.009565001353621483, -0.024105291813611984, -0.032034773379564285, 0.054193660616874695, 0.017412615939974785, 0.0023949621245265007, 0.021288838237524033, 0.015209311619400978, -0.001971573568880558, 0.008890565484762192, 0.01852700486779213, 0.0037669488228857517, 0.04215942695736885, 0.027538686990737915, -0.04208161681890488, -0.06288565695285797, 0.04084630683064461, -0.00026561241247691214, 0.05246533453464508, -0.028476305305957794, -0.020433126017451286, 0.002560623688623309, 0.0037779281847178936, 0.05844748765230179, 0.009621728211641312, 0.03781421482563019, -0.03377329930663109, -0.036808401346206665, 0.011758122593164444, 0.027629928663372993, -0.007387751247733831, -0.00400159927085042, 0.02877744659781456, 0.01667490042746067, 0.018305523321032524, -0.0008485601865686476, 0.03030994161963463, -0.01478817593306303, -0.007924809120595455, 0.02670225501060486, 0.0009907674975693226, -0.013788189738988876, -0.03374042734503746, 0.008043499663472176, -0.021143155172467232, 0.032656073570251465, -0.025831347331404686, -0.0077016400173306465, 0.020610954612493515, 0.05045684054493904, 0.05826374888420105, 0.005800802260637283, -0.016265559941530228, -0.0381462499499321, 0.02984054945409298, -0.007169734686613083, -0.04527374356985092, 0.00978297833353281, 0.012855865992605686, 0.03578633815050125, -0.002959854668006301, -0.02670014090836048, 0.04966159909963608, 0.03936877101659775, -0.017452407628297806, -0.03180748596787453, 0.03225303068757057, 0.03724171593785286, -0.023054393008351326, 0.022486869245767593, -0.013990843668580055, 0.006763089448213577, -0.013664298690855503, -0.01822711154818535, 0.011122960597276688, 0.03791902959346771, 0.027794327586889267, -0.014773044735193253, 0.010092825628817081, -0.011460809037089348, 0.043876491487026215, 0.029489809647202492, 0.003583295503631234, -0.008018454536795616, -0.028166741132736206, 0.023973548784852028, 0.024150608107447624, -0.03177014738321304, 0.012792375870049, 0.0199948288500309, 0.013885464519262314, 0.015081183053553104, -0.018494173884391785, 0.0062710135243833065, -0.010803759098052979, -0.037570733577013016, -0.0301183070987463, 0.028623424470424652, 0.013097859919071198, -0.04404054954648018, 0.0029002230148762465, -0.008373613469302654, 0.005074328742921352, 0.033934757113456726, -0.007993457838892937, -0.01051030121743679, 0.01576784811913967, -0.03920670226216316, 0.02858644537627697, -0.030979759991168976, 0.012777172029018402, 0.009628892876207829, -0.020056836307048798, 0.10449626296758652, -0.02786494791507721, 0.021106138825416565, -0.011739484034478664, 0.02014579437673092, -0.004608530085533857, -0.0015242540976032615, 0.02428467385470867, 0.009971359744668007, 0.0006649151910096407, -0.0171342920511961, 0.0742708146572113, 0.01801542192697525, -0.02890251949429512, -0.009873179718852043, -0.008660579100251198, 0.09095581620931625, -0.03929552808403969, 0.025015398859977722, -0.005779198370873928, -0.012762299738824368, 0.06359190493822098, 0.00899309478700161, -0.021059228107333183, 0.03960349038243294, 0.07851212471723557, 0.03482583165168762, -0.04293617978692055, 0.025760425254702568, 0.02590533159673214, 0.043821677565574646, 0.023676980286836624, 0.03483400121331215, 0.03021719679236412, 0.02979154884815216, -0.02338789403438568, -0.006198480725288391, 0.007080650422722101, 0.011762548238039017, -0.030079852789640427, 0.015425087884068489, 0.06252086907625198, -0.03398390859365463, -0.02891192026436329, -0.0015564319910481572, 0.005826656240969896, -0.015436982735991478, -0.025092534720897675, 0.014431141316890717, 0.012224400416016579, -0.015585719607770443, 0.0006056266720406711, 0.009169533848762512, -0.03170791268348694, -0.027147311717271805, 0.005456159356981516, 0.002300024265423417, 0.005552059970796108, -0.045352499932050705, 0.02898555062711239, 0.0008633824763819575, -0.12059585750102997, -0.019132442772388458, -0.019950589165091515, 0.06764519959688187, -0.005942938849329948, -0.008668391965329647, -0.04694419354200363, -0.10138720273971558, -0.03603024780750275, 0.021206943318247795, -0.018047677353024483, -0.04475916922092438, 0.002927195280790329, 0.009200173430144787, 0.017052235081791878, -0.041336674243211746, 0.01815333589911461, -0.016957439482212067, 0.04431511461734772, 0.11627302318811417, -0.017146503552794456, 0.015241044573485851, -0.0013574666809290648, 0.034887198358774185, -0.006096304394304752, 0.016786236315965652, 0.029186826199293137, -0.023813312873244286, 0.03584791347384453, -0.003264638828113675, 0.01602906547486782, -0.012727160006761551, -0.06642969697713852, -0.05181223154067993, -0.059661220759153366, -0.004528748337179422, 0.03513694554567337, 0.06357140094041824, -0.03926291689276695, -0.01118391938507557, -0.007552360650151968, -0.04058680683374405, -0.06631393730640411, -0.018960319459438324, -0.026235569268465042, 0.006740827113389969, 0.06667007505893707, 0.028019091114401817, -0.03037145547568798, -0.022649336606264114, -0.02365419641137123, 0.026185985654592514, -0.03348499536514282, 0.07095377147197723, 0.01735301874577999, 0.06260565668344498, 0.02939898893237114, -0.01399951707571745, -0.018060676753520966, -0.013769224286079407, -0.006014383863657713, 0.04671633616089821, -0.06231692433357239, -0.042986419051885605, -0.04907481372356415, 0.033755335956811905, 0.04234163835644722, 0.02226395159959793, -0.024035736918449402, 0.022405140101909637, 0.024293269962072372, 0.08296426385641098, -0.03315592557191849, -0.05484386160969734, 0.06279266625642776, 0.03758898004889488, 0.00035322277108207345, -0.02243523672223091, -0.012018664740025997, 0.017353525385260582, 0.02575024589896202, -0.030147727578878403, 0.00590318301692605, 0.0166523028165102, 0.0033863193821161985, -0.07013430446386337, -0.021837472915649414, -0.011725658550858498, -0.005890192463994026, 0.012679978273808956, 0.003305037971585989, 0.013583800755441189, -0.006935552693903446, -0.00970274955034256, -0.014740994200110435, 0.013884142972528934, 0.0240260511636734, 0.05000241473317146, -0.009204549714922905, 0.03485306352376938, 0.023585278540849686, 0.018636653199791908, 0.047623079270124435, 0.00750321801751852, 0.0022196131758391857, 0.04866798594594002, 0.059930432587862015, 0.03837696462869644, 0.007280615158379078, -0.04643120989203453, 0.006852927152067423, -0.012880858965218067, -0.006614581681787968, 0.08749022334814072, -0.0302667748183012, -0.006243125069886446, -0.02853202261030674, -0.0011157100088894367, -0.04406078904867172, 0.008220304735004902, -0.060082219541072845, -0.021099718287587166, -0.039860378950834274, 0.015400797128677368, -0.03113352693617344, 0.018237557262182236, 0.016578951850533485, 0.018099021166563034, 0.02868315577507019, 0.056219689548015594, -0.014498765580356121, 0.04365349933505058, -0.03154010325670242, -0.04097835719585419, -0.008213947527110577, 0.00988795980811119, -0.023832913488149643, 0.031246034428477287, 0.043202415108680725, -0.03569330275058746, 0.018165096640586853, 0.006516059394925833, 0.011006730608642101, -0.05045495554804802, 0.03672277554869652, 0.01974821276962757, 0.007135124411433935, -0.06834108382463455, -0.02708986960351467, 0.0018405842129141092, -0.0012256260961294174, 0.005300640128552914, 0.023318976163864136, 0.010699133388698101, 0.0011755519080907106]" ./train/lion/n02129165_5362.JPEG,lion,"[-0.02597016654908657, 0.020084692165255547, 0.009879271499812603, 0.0028415776323527098, -0.027895264327526093, 0.017088528722524643, 0.03602832555770874, -0.01514675747603178, 0.03642342984676361, 0.003047982696443796, 0.0048470706678926945, -0.01747439242899418, 0.005171701777726412, -0.005930909886956215, -0.007225017994642258, -0.04263928905129433, -0.03991534188389778, 0.01968980021774769, -0.022661594673991203, 0.017203278839588165, -0.03480304405093193, 0.011557511053979397, 0.02939695306122303, -0.015143348835408688, -0.008895735256373882, 0.043131228536367416, -0.019404537975788116, -0.020559359341859818, -0.005863419268280268, -0.02687053009867668, -0.03430405631661415, -0.002334468299522996, 0.026795977726578712, 0.03430952504277229, -0.06507162004709244, -0.030039092525839806, 0.029509060084819794, 0.04631286486983299, -0.011320451274514198, 0.1411380022764206, 0.006424903403967619, 0.0024745448026806116, 0.011224215850234032, -0.027287734672427177, 0.00146578811109066, -0.04536198079586029, 0.03602340817451477, 0.045705873519182205, -0.03346393257379532, 0.01871148869395256, -0.020258452743291855, 0.034544773399829865, 0.02086874283850193, -0.021342920139431953, -0.003947001416236162, 0.03595203161239624, -0.025897599756717682, 0.04742797464132309, -0.00564448582008481, 0.005944791715592146, 0.04161077365279198, -0.004933863878250122, 0.008356795646250248, 0.0061828261241316795, -0.06179863214492798, -0.04361487179994583, 0.00964006781578064, 0.1369311809539795, 0.04777729883790016, -0.008279457688331604, 0.021503346040844917, -0.004612318705767393, 0.008847774937748909, 0.025432920083403587, 0.009731961414217949, -0.02142137661576271, -0.06018728390336037, -0.014309296384453773, -0.02963629551231861, -0.03930354490876198, -0.011117466725409031, 0.027450935915112495, 0.013643479906022549, 0.018508290871977806, 0.04227513074874878, 0.04167966917157173, -0.021340668201446533, -0.008142584003508091, 0.04993334040045738, 0.020231759175658226, -0.00011564127635210752, -0.01574634574353695, -0.621021032333374, 0.040001031011343, -0.043905794620513916, -0.015691019594669342, -0.0251646526157856, 0.01534182857722044, -0.0794510543346405, -0.01195281557738781, -0.008749076165258884, 0.0042149219661951065, -0.03861187398433685, 0.05262107029557228, 0.008635023608803749, 0.018481669947504997, -0.006629360374063253, -0.00685871159657836, 0.006457057781517506, -0.010026504285633564, -0.06379789859056473, -0.036195993423461914, 0.014398057945072651, -0.008033603429794312, -0.03191348910331726, -0.017432797700166702, 0.05110803246498108, -0.04373210296034813, 0.05598368123173714, 0.009433439932763577, 0.030310921370983124, 0.019305208697915077, 0.029925866052508354, 0.02422495000064373, -0.06907182931900024, -0.028764450922608376, 0.0005327906110323966, 0.006649465300142765, 0.0028469909448176622, 0.053201403468847275, 0.00947684608399868, 0.026516027748584747, -0.0009588529355823994, 0.08520457148551941, 0.01413881778717041, 0.0004228672478348017, 0.014933076687157154, -0.0022252958733588457, -0.03937438130378723, 0.005399186164140701, -0.009581143967807293, -0.07278437912464142, 0.037980832159519196, 0.009915678761899471, -0.020830154418945312, 0.01936667039990425, -0.040945738554000854, -0.060735780745744705, 0.010682272724807262, 0.0042112525552511215, -0.02334831841289997, 0.01828884519636631, 0.014468653127551079, -0.016005778685212135, 0.009217019192874432, 0.03796429932117462, -0.0138132618740201, 0.004957802593708038, 0.033899933099746704, 0.04915212094783783, 0.014756560325622559, -0.04670952260494232, -0.030279098078608513, -0.01864270120859146, 0.003793166484683752, -0.0327310711145401, -0.02692868374288082, 0.008560744114220142, 0.013055315241217613, 0.033353570848703384, 0.019443830475211143, 0.038807403296232224, 0.012810810469090939, -0.013980680145323277, -0.02113383449614048, -0.001558263087645173, -0.12111683189868927, 0.0020602650474756956, 0.0018212143331766129, 0.023831000551581383, -0.016243213787674904, 0.022750746458768845, -0.005930778104811907, -0.0389670729637146, -0.0178951695561409, 0.016644587740302086, 0.010352709330618382, 0.010275788605213165, -0.024579528719186783, 0.02879609540104866, 0.008551663719117641, -0.01779712364077568, -0.00607359129935503, 0.03683662414550781, -0.04397379606962204, 0.024008847773075104, 0.015733392909169197, -0.017295464873313904, -0.10471583157777786, 0.006363540887832642, 0.02775220200419426, 0.01837092824280262, 0.013636958785355091, 0.06687462329864502, 0.03525017574429512, 0.04012253135442734, 0.007015942130237818, -0.016702348366379738, 0.02988358587026596, -0.02781744673848152, -0.03244554251432419, 0.014934232458472252, 0.04858457297086716, 0.019109204411506653, -0.037100084125995636, 0.026970544829964638, 0.05130869522690773, 0.02166016213595867, 0.0798380896449089, -0.027979379519820213, 0.001156636979430914, 0.07180023193359375, -0.002932296833023429, -0.028886405751109123, -0.006608081981539726, 0.003978762309998274, 0.011746804229915142, -0.007978350855410099, 0.042558204382658005, 0.04787227138876915, -0.01757097989320755, 0.02758054807782173, 0.025309016928076744, 0.06571569293737411, 0.026680203154683113, -0.0014642567839473486, 0.012775260955095291, 0.013010889291763306, -0.020489875227212906, -0.01188575942069292, 0.016669338569045067, 0.021797509863972664, 0.04832833632826805, -0.06554309278726578, -0.05151153355836868, 0.06716577708721161, 0.02472635917365551, -0.028548618778586388, -0.04445462301373482, 0.019109297543764114, 0.0029341219924390316, 0.009867268614470959, 0.021327925845980644, -0.033886875957250595, 0.004963995888829231, 0.014928069896996021, -0.04008089751005173, -0.011865360662341118, 0.09886031597852707, 0.05836271122097969, 0.002373750787228346, 0.0056767575442790985, 0.013026706874370575, 0.035554517060518265, 0.003271433524787426, -0.015268825925886631, 0.005850838031619787, -0.04947495087981224, 0.0368826799094677, -0.016989750787615776, -0.01929199881851673, 0.0021462352015078068, 0.006168699357658625, 0.030855797231197357, 0.019294776022434235, 0.016972001641988754, 0.018451934680342674, -0.01693662814795971, 0.006961089093238115, 0.0011328122345730662, 0.04423300176858902, 0.004831014666706324, -0.0022923180367797613, -0.04197137430310249, 0.030960924923419952, -0.015541627071797848, -0.07354678213596344, -0.06964543461799622, -0.021999238058924675, 0.0010102769592776895, -0.02505066618323326, 0.030222391709685326, 0.0003601715434342623, 0.02720475383102894, -0.025336947292089462, -0.0042691719718277454, 0.12487617880105972, -0.014893642626702785, 0.0035609095357358456, -0.045774850994348526, -0.0052681355737149715, 0.021982725709676743, -0.047712672501802444, -7.622912562510464e-06, 0.005919431336224079, 0.022084157913923264, 0.03456231951713562, 0.04534227028489113, 0.059787772595882416, -0.019358010962605476, 0.013928571715950966, -0.001912220730446279, 0.08504130691289902, -0.027953902259469032, 0.015753159299492836, 0.01767711713910103, -0.005937654059380293, 0.05614602938294411, -0.01598372496664524, -0.00017061972175724804, 0.0003595768357627094, 0.0792662724852562, -0.005069477949291468, -0.03483405336737633, 0.008907917886972427, -0.022777708247303963, 0.0423428900539875, -0.005511540453881025, 0.02072254940867424, -0.004258032888174057, 0.01601552963256836, 0.022281495854258537, -0.018671467900276184, -0.054798904806375504, 0.022925980389118195, -0.029379526153206825, -0.00601518340408802, 0.02251979522407055, -0.06293240934610367, -0.022053414955735207, -0.025127537548542023, 0.0018721120432019234, -0.009640464559197426, -0.012386073358356953, -0.02487032301723957, -0.006913412362337112, -0.016770649701356888, 0.0029322709888219833, 0.01194346509873867, 0.04100543260574341, -0.048949290066957474, -0.007915587164461613, 0.03691086545586586, -0.015711072832345963, -0.04334587603807449, -0.025796199217438698, 0.005967303644865751, -0.06728502362966537, -0.015438276343047619, -0.011304531246423721, 0.05811246111989021, -0.0037625713739544153, -0.015450136736035347, 0.017624035477638245, -0.10690614581108093, -0.00478917732834816, -0.01056087575852871, -0.0049204290844500065, -0.0760340765118599, -0.02489330619573593, 0.003943821415305138, 0.03098933771252632, -0.008886551484465599, 9.04706321307458e-05, 0.00041959132067859173, 0.04257596656680107, 0.15113264322280884, -0.0005041692056693137, -0.0033906486351042986, -0.006971412338316441, 0.02561020664870739, -0.05549198016524315, -0.005721832625567913, -0.008459942415356636, -0.023906035348773003, 0.03183353692293167, 0.03956587612628937, 0.014156059361994267, 0.008150886744260788, -0.009525598026812077, 0.014314282685518265, -0.0489138700067997, 0.015975382179021835, 0.02180495299398899, 0.051304589956998825, -0.026473600417375565, 0.004643203224986792, 0.027138330042362213, -0.057331062853336334, -0.05368080362677574, -0.0036476855166256428, -0.010816661641001701, -0.013353820890188217, 0.0247514545917511, -0.012577651999890804, 0.007764778565615416, -0.01516164280474186, -0.03037957288324833, 0.06664614379405975, -0.04511122405529022, 0.07160715758800507, 0.022016270086169243, -0.007810744922608137, 0.03803742676973343, -0.026305465027689934, -0.0356159470975399, -0.011406984180212021, -0.007755813654512167, 0.02748204953968525, -0.06367973238229752, -0.021422183141112328, -0.016895325854420662, 0.03711109608411789, 0.04644044116139412, 0.02892385609447956, -0.03879084810614586, -0.03893154114484787, -0.024188579991459846, 0.04020022228360176, -0.006805042736232281, -0.05648346245288849, 0.07503875344991684, 0.03687898814678192, -0.0007885093218646944, -0.07978823035955429, -0.02577330730855465, 0.0019928140100091696, -0.0036544841714203358, -0.012200187891721725, 0.0035786572843790054, 0.019908016547560692, -0.018890460953116417, -0.015184353105723858, -0.007774358615279198, 0.0004793646221514791, 0.001424551708623767, -0.016923854127526283, -0.028643948957324028, 0.03277038782835007, 0.016597842797636986, -0.04836472123861313, -0.027230791747570038, 0.012478883378207684, 0.026750968769192696, 0.03216274827718735, 0.015547633171081543, 0.08117257058620453, -0.01775563694536686, -0.011301737278699875, 0.059663672000169754, 0.00891698058694601, 0.037963952869176865, 0.0587073490023613, -0.0024787718430161476, 0.023012034595012665, 0.00394695159047842, -0.05197254568338394, -0.028204001486301422, -0.004110760521143675, -0.08213061094284058, 0.07325940579175949, -0.030137555673718452, -0.010301494970917702, -0.03319292888045311, -0.006097021047025919, -0.05362690985202789, -0.05187639594078064, -0.021525783464312553, 0.026772532612085342, -0.03905909135937691, 0.011821218766272068, -0.008593340404331684, 0.06404108554124832, 0.015938779339194298, 0.012038414366543293, 0.024459578096866608, 0.01457035169005394, 0.023777013644576073, 0.0007940896903164685, -0.05946706607937813, 0.010767647996544838, -0.009800156578421593, 0.044264160096645355, -0.04847414791584015, 0.018688656389713287, 0.03183367848396301, -0.0176016166806221, 0.0264433566480875, -0.0012181282509118319, -0.004881307017058134, -0.012472165748476982, 0.03298955410718918, 0.04431137815117836, 2.8087906684959307e-05, -0.00983045157045126, -0.10814218968153, 0.010541410185396671, 0.020378245040774345, -0.01630924455821514, 0.051472872495651245, -0.002070377115160227, 0.021989189088344574]" ./train/lion/n02129165_12949.JPEG,lion,"[-0.004073196090757847, 0.004134711809456348, -0.017992956563830376, -0.02435702085494995, 0.009067525155842304, -0.025758858770132065, 0.008629103191196918, 0.026945266872644424, -0.003281000070273876, -0.020774925127625465, 0.013065649196505547, -0.010070576332509518, 0.009439813904464245, -0.055592745542526245, -0.0038033276796340942, -0.03403063490986824, -0.015238506719470024, 0.025798825547099113, 0.016359398141503334, 0.012578167021274567, -0.05235377326607704, 0.015759652480483055, 0.02483346313238144, -0.03480897843837738, -0.024434542283415794, 0.019440414384007454, -0.051684193313121796, 0.008087988942861557, -0.009681934490799904, -0.03527441248297691, 0.02154487371444702, -0.02279159054160118, -0.004063181113451719, 0.020907161757349968, -0.020947040989995003, 0.0055136121809482574, 0.006004077382385731, 0.05071856081485748, -0.013335691764950752, 0.14384429156780243, 0.009359464980661869, 0.02441323921084404, 0.009198191575706005, -0.028668740764260292, -0.002000961685553193, 0.04320119693875313, -0.004290499724447727, 0.014858574606478214, -0.030623920261859894, -0.019782952964305878, 0.0210991483181715, 0.03714051470160484, 0.007931449450552464, -0.03250352665781975, 0.007894907146692276, 0.03536781296133995, 0.021335488185286522, 0.022928766906261444, -0.00782439112663269, 0.0011125669116154313, 0.04819481074810028, 0.004959117155522108, -0.02626727893948555, 0.01106890756636858, -0.021574215963482857, -0.03424474596977234, 0.00343142868950963, 0.10225910693407059, 0.009291442111134529, -0.00697458628565073, 0.010912441648542881, 0.026987304911017418, 0.019988292828202248, -0.014721307903528214, 0.015008822083473206, -0.0036367387510836124, -0.028499187901616096, -0.011293372139334679, -0.060239870101213455, -0.02574816718697548, -0.03408067300915718, 0.03906724229454994, -0.025325173512101173, -0.007061843294650316, 0.04795636981725693, 0.018146421760320663, 0.024838784709572792, -0.009646923281252384, 0.03306375443935394, 0.014641898684203625, -0.008632468990981579, 0.014421428553760052, -0.6738771796226501, 0.037746578454971313, -0.02074572443962097, 0.012346569448709488, -0.001599948271177709, 0.03014935553073883, -0.08454915136098862, -0.02234606072306633, -0.0299561507999897, 0.009933353401720524, -0.04259267821907997, 0.036490291357040405, 0.007924006320536137, -0.005396532826125622, -0.005417149513959885, 0.009321585297584534, -0.011746319010853767, -0.0362607017159462, -0.030728809535503387, -0.00741893844678998, -0.0008225215715356171, 0.01966610550880432, -0.022235436365008354, -0.04857209697365761, 0.05482533946633339, -0.02062266692519188, 0.05757462978363037, -0.016508307307958603, 0.019775500521063805, 0.05063183978199959, 0.0537862628698349, 0.04316947981715202, -0.05686125159263611, -0.03779533877968788, 0.01632336527109146, -0.006458913441747427, 0.005597810726612806, 0.024759456515312195, 0.0045136623084545135, 0.004125323612242937, -0.03544262424111366, 0.08744841814041138, 0.01920503005385399, 0.002191566163673997, 0.011421619914472103, 0.01432382594794035, -0.0010869919788092375, -0.02040172927081585, -0.02311822772026062, -0.05306568369269371, -0.0035394083242863417, -0.009300334379076958, -0.019377870485186577, -0.01824779063463211, -0.007374405395239592, -0.042599260807037354, -0.005923580378293991, 0.027308503165841103, -0.010102162137627602, 0.017196273431181908, 0.002022454049438238, -0.022260034456849098, -0.013022538274526596, 0.011928156949579716, 0.00992915965616703, 0.017687084153294563, 0.031448863446712494, 0.018316784873604774, -0.0004815848951693624, -0.004265630152076483, 0.008540634997189045, 0.02365906350314617, 0.004568182863295078, -0.054765716195106506, -0.06140367314219475, 0.021905286237597466, -0.020685305818915367, 0.009328527376055717, 0.010229140520095825, 0.028483539819717407, -0.007366806268692017, -0.03206556290388107, -0.02692398615181446, 0.0042359428480267525, -0.09569185227155685, 0.03479905426502228, -0.015212874859571457, 0.01730683259665966, 0.018478035926818848, 0.015201312489807606, 0.027678143233060837, -0.0352148674428463, -0.04595233500003815, -0.0025893973652273417, 0.025257525965571404, 0.0004299323190934956, -0.03766528144478798, 0.021351594477891922, -0.013445348478853703, -0.011274234391748905, -0.0030571904499083757, 0.005611283238977194, -0.039404358714818954, 0.007686323020607233, 0.029474299401044846, -0.045186106115579605, -0.0812472254037857, 0.006371780764311552, 0.018185295164585114, 0.0455840565264225, -0.0016713920049369335, 0.07786484062671661, 0.030864447355270386, 0.009915802627801895, 0.019727379083633423, -0.04573671892285347, 0.0469897985458374, -0.0022415791172534227, -0.03864514082670212, 0.04705607146024704, 0.05089578405022621, 0.043742842972278595, -0.02935810759663582, 0.020563071593642235, 0.020799145102500916, -0.011935082264244556, 0.07742702215909958, -0.03252958133816719, -0.0019927939865738153, 0.0463772751390934, -0.005133313592523336, 0.002921366598457098, 0.009813958778977394, -0.03242214396595955, 0.002247150056064129, -0.011457887478172779, 0.02800077572464943, 0.02044219709932804, -0.021640583872795105, 0.0063062505796551704, 0.07458098232746124, 0.03791123628616333, 0.012870963662862778, -0.04891200736165047, 0.00811668299138546, 0.01161491870880127, -0.0020462386310100555, -0.016593603417277336, 0.016349025070667267, 0.018355410546064377, 0.04178069159388542, -0.05731062963604927, 0.017351334914565086, 0.052304212003946304, 0.03406226634979248, -0.06338906288146973, -0.05334163457155228, 0.00012808346946258098, 0.03187556937336922, -0.018908502534031868, -0.0013632733607664704, -0.019472170621156693, -0.004388575442135334, 0.02196541242301464, -0.03755975514650345, -0.0010823037009686232, 0.0740315169095993, 0.021897630766034126, 0.0005568892229348421, -0.009930103085935116, 0.003317589173093438, 0.06659034639596939, 0.012435635551810265, -0.01465726736932993, -0.010601270943880081, 0.01319172978401184, 0.02514372020959854, -0.01538630947470665, -0.044008657336235046, 0.006673372816294432, 0.02236090414226055, 0.0006962004699744284, 0.017580963671207428, -0.028194746002554893, 0.016191931441426277, 0.012653972022235394, -0.01616060361266136, 0.031226566061377525, 0.02828179858624935, 0.03324008360505104, -0.026760870590806007, -0.03544855862855911, 0.01395578496158123, -0.01230304129421711, -0.10443452000617981, -0.016878589987754822, -0.013086652383208275, 0.00044200295815244317, -0.012869799509644508, 0.017027078196406364, 0.028541121631860733, 0.005643448326736689, 0.0005796863697469234, -0.012693126685917377, 0.09455545246601105, 0.02786952257156372, 0.024061407893896103, -0.00912700779736042, 0.035847071558237076, 0.023202355951070786, -0.040646057575941086, -0.005170420277863741, 0.006971126887947321, 0.025322923436760902, 0.002736054128035903, 0.0725613534450531, 0.008559802547097206, 0.007283611223101616, 0.005212955176830292, -0.01947617344558239, 0.087335966527462, -0.016421036794781685, 0.031334288418293, -0.01982525736093521, 0.017285656183958054, 0.03479180485010147, -0.02097220905125141, -0.043792907148599625, 0.03347405046224594, 0.07176203280687332, 0.015847904607653618, -0.012084802612662315, 0.012383589521050453, -0.013035712763667107, 0.06281715631484985, 0.030772659927606583, 0.028094913810491562, 0.01787710376083851, 0.006771780550479889, 0.036149438470602036, -0.034852754324674606, -0.037856731563806534, 0.006441893521696329, 0.004353084601461887, 0.0186785776168108, -0.015489800833165646, -0.030108802020549774, -0.026536500081419945, -0.016167985275387764, -0.014019559137523174, -0.004766968544572592, -0.02770267240703106, -0.013422767631709576, 0.003730607219040394, -0.011694330722093582, 0.015642624348402023, -0.008512084372341633, 0.001081803347915411, -0.05918258801102638, -0.017584513872861862, 0.04898245260119438, 0.010412354953587055, -0.015986153855919838, -0.028378818184137344, -0.002309525851160288, -0.08652851730585098, 0.018501421436667442, -0.017415186390280724, 0.053543224930763245, 0.009698576293885708, -0.06507060676813126, -0.006079325918108225, -0.04119601100683212, -0.017283689230680466, -0.01914251782000065, -0.02794843353331089, -0.05762791633605957, -0.0056152609176933765, 0.009090367704629898, 0.045022159814834595, 0.004177218768745661, -0.011393476277589798, 0.02178695984184742, 0.00532030314207077, 0.12525920569896698, 0.0294959656894207, -0.06868379563093185, -0.005131136626005173, 0.005369500257074833, -0.049579083919525146, -0.009310850873589516, -0.029959816485643387, -0.0006632289732806385, 0.024214595556259155, -0.015584191307425499, 0.0004938599886372685, -0.0026971912011504173, -0.02509874291718006, 0.01633496582508087, -0.048741329461336136, -0.02063637040555477, 0.054404839873313904, 0.026876695454120636, -0.030115798115730286, 0.026265552267432213, 0.025747258216142654, -0.07620209455490112, -0.07333983480930328, -0.00660718185827136, -0.007535045966506004, 0.0012819134863093495, 0.030085770413279533, 0.004917922895401716, -0.004332408774644136, -0.00448654918000102, -0.03410593047738075, 0.1107664629817009, -0.01956632360816002, 0.08467776328325272, 0.012104976922273636, -0.007893151603639126, 0.022456182166934013, -0.0358925461769104, -0.04318574443459511, 0.011278011836111546, 0.022210385650396347, 0.00786308292299509, -0.1006176769733429, -0.036742184311151505, -0.013352448120713234, 0.00418343348428607, 0.05425802245736122, 0.03786800429224968, -0.007813703268766403, 0.013198470696806908, 0.019261334091424942, -0.03920994699001312, -0.01856674626469612, -0.03811879828572273, 0.04101547598838806, -0.05332353711128235, 0.02385617420077324, -0.09450125694274902, -0.03872779384255409, 0.021357426419854164, 0.025418439880013466, -0.022885553538799286, 0.017204882577061653, -0.006596978288143873, 0.012815508060157299, -0.017914116382598877, -0.014759646728634834, -0.02634051814675331, -0.008031768724322319, 0.005907001439481974, -0.0027110588271170855, 0.03199129179120064, -0.004384968895465136, -0.02917858213186264, -0.02031414769589901, 0.014566697180271149, 0.008487256243824959, 0.01830756478011608, 0.002705071121454239, 0.061351511627435684, -0.020733287557959557, -0.011427451856434345, 0.052734434604644775, 0.0149563979357481, 0.0432610884308815, 0.049406178295612335, -0.023066885769367218, 0.020836064592003822, -0.01202971488237381, -0.05857827514410019, 0.0047955699265003204, -0.01938270963728428, -0.047329023480415344, 0.030941402539610863, -0.024297239258885384, -0.03557566553354263, -0.045176904648542404, -0.006353226490318775, -0.06175701692700386, -0.030186057090759277, -0.016474252566695213, -0.01427222415804863, -0.04139823094010353, 0.01935603655874729, -0.006855559069663286, 0.005827915854752064, 0.028351247310638428, -0.003491633338853717, 0.03185448423027992, -0.02092394046485424, 0.003804585197940469, 0.0019110515713691711, -0.0211115051060915, 0.0017214243998751044, -0.0493011400103569, 0.04833720996975899, -0.02308332547545433, 0.013761778362095356, 0.019882090389728546, 0.005775141529738903, 0.04388849064707756, 0.02654610015451908, 0.015691634267568588, -0.0194555651396513, 0.05500096082687378, 0.050373297184705734, -0.017166804522275925, -0.032443005591630936, -0.052564311772584915, -0.012266031466424465, -0.010815923102200031, 0.0005208713700994849, 0.0521700382232666, -0.008589006029069424, -0.024256642907857895]" ./train/lion/n02129165_19953.JPEG,lion,"[-0.01985444873571396, -0.0419306755065918, 0.016095420345664024, -0.023244377225637436, -0.02423933707177639, -0.016884682700037956, 0.03057282790541649, -0.009586168453097343, 0.03237447142601013, 0.041234634816646576, 0.014897282235324383, -0.031775135546922684, 0.003354178974404931, -0.012981900945305824, -0.029670018702745438, -0.03146824240684509, 0.09190534055233002, -0.0038564582355320454, 0.03242234140634537, 0.013567852787673473, -0.01566891185939312, 0.017568819224834442, 0.021594591438770294, -0.05560079962015152, -0.013602400198578835, 0.03291963040828705, -0.0005844678380526602, 0.017634142190217972, 0.03937531262636185, -0.010608880780637264, -0.0015427118632942438, -0.009397356770932674, 0.01638832688331604, 0.021506045013666153, -0.003026484977453947, 0.00767536461353302, 0.00410433579236269, 0.03771211579442024, -0.022402912378311157, 0.23022308945655823, -0.010438214056193829, -0.024996256455779076, 0.02056911215186119, -0.038611430674791336, -0.007328440435230732, 0.014740419574081898, 0.04826054722070694, 0.06184021756052971, -0.04802551120519638, -0.0161166712641716, -0.022555874660611153, 0.02732301689684391, 0.02637920156121254, -0.024050336331129074, -0.025994310155510902, 0.03606397658586502, 0.019356947392225266, 0.018107997253537178, 0.002639187965542078, 0.0021971173118799925, 0.10330120474100113, -0.00034417377901263535, -0.01653691753745079, 0.0076485504396259785, -0.00681176595389843, -0.02263953723013401, 0.021140078082680702, 0.06366561353206635, -0.014171311631798744, -0.029346751049160957, -0.005045647732913494, -0.014369895681738853, 0.019907169044017792, -0.016862662509083748, -0.0015166349476203322, -0.01438953261822462, -0.05867329612374306, -0.0014340219786390662, -0.020863279700279236, -0.010459057986736298, 0.003224644809961319, 0.00998805370181799, -0.01440277136862278, 0.013795527629554272, 0.07009641081094742, 0.005281995516270399, -0.024822650477290154, -0.03240308538079262, 0.07369288802146912, 0.002976242220029235, 0.014964522793889046, 0.0022244127467274666, -0.6063840389251709, -0.007166673429310322, -0.06433818489313126, 0.004870215430855751, -0.020968681201338768, -0.04108484089374542, -0.10103964060544968, 0.0010549930157139897, -0.015445503406226635, -0.0016294477973133326, -0.031043855473399162, 0.055171407759189606, 0.024924300611019135, 0.04236197844147682, -0.05571281537413597, -0.01079891063272953, 0.01520206592977047, -0.0037919925525784492, -0.029772035777568817, -0.020872952416539192, 0.0412297286093235, 0.011773219332098961, -0.045172665268182755, -0.02400033548474312, 0.049168914556503296, -0.04535852000117302, 0.015907397493720055, 0.019256072118878365, 0.005900538060814142, 0.03902944549918175, 0.019985785707831383, -0.006799608003348112, -0.018435943871736526, -0.03441740199923515, -0.011903404258191586, 0.02671172097325325, 0.004950106143951416, 0.024099523201584816, 0.004883084911853075, -0.012735883705317974, -0.009546836838126183, 0.08396725356578827, 0.019115334376692772, -0.028666893020272255, -0.03313663601875305, -0.01689736172556877, -0.0054330783896148205, -0.00038559225504286587, -0.025816017761826515, -0.059528764337301254, -0.0043732598423957825, 0.04943382367491722, -0.01999104954302311, -0.007976356893777847, -0.004671160597354174, 0.006574585568159819, -0.03369656205177307, -0.0018672961741685867, -0.0031208451837301254, 0.040407631546258926, 0.005390297155827284, -0.04154808446764946, -0.004547884222120047, 0.04776559770107269, 0.02695438824594021, 0.03632622957229614, 0.010722062550485134, 0.033119458705186844, -0.017622871324419975, -0.03877653554081917, -0.0007187810842879117, -0.019819416105747223, 0.01474844105541706, -0.05255809426307678, 0.00774737074971199, 0.009805562905967236, 0.03380035609006882, 0.02999144233763218, -0.008934840559959412, 0.049584172666072845, -0.025149503722786903, -0.016567232087254524, -0.02607910893857479, -0.0014701003674417734, -0.0788739025592804, -0.02389327436685562, 0.0012352514313533902, -0.014451364055275917, 0.013392032124102116, 0.0059200492687523365, 0.014689905568957329, -0.002019372070208192, -0.00029212574008852243, -0.002128235762938857, 0.03776411712169647, 0.02277068980038166, -0.004427589476108551, 0.04007051885128021, -0.01294771395623684, -0.028540007770061493, 0.013643552549183369, 0.0460711307823658, -0.018753809854388237, 0.04519302025437355, 0.0012856445973739028, -0.043052222579717636, -0.10105710476636887, 0.01606089621782303, 0.04378693178296089, 0.002958763623610139, -0.00760303158313036, 0.07679536193609238, 0.039053529500961304, 0.029439669102430344, 0.03345630690455437, 0.002894157776609063, 0.03352485969662666, -0.049301955848932266, -0.06911564618349075, 0.0013125846162438393, 0.0119545953348279, 0.014228186570107937, -0.037339624017477036, 0.012693810276687145, 0.018617136403918266, 0.03541068360209465, 0.09726331382989883, -0.0049397312104702, 0.03022873029112816, 0.03360233083367348, 0.01338537409901619, -0.007931733503937721, -0.05241578072309494, 0.022359173744916916, -0.004178267903625965, 0.02398025244474411, 0.018774883821606636, 0.011020075529813766, -0.008511857129633427, -0.010507477447390556, 0.026612414047122, 0.0727153867483139, 0.014970689080655575, -0.023524513468146324, -0.0012857186375185847, 0.009785978123545647, -0.050654854625463486, -0.03649163991212845, 0.03243868052959442, 0.03296812251210213, 0.042908910661935806, -0.04407576099038124, -0.028163883835077286, 0.0659562274813652, 0.01821562461555004, -0.07725434005260468, -0.06178463622927666, 0.0048072682693600655, 0.020445045083761215, 0.01282093022018671, 0.05675673857331276, -0.00680146599188447, 0.025326473638415337, -0.013614529743790627, -0.04723116010427475, 0.013569453731179237, 0.12023938447237015, 0.046364013105630875, -0.029132748022675514, 0.003689009230583906, 0.002816582564264536, -0.02011522650718689, 0.00040814740350469947, -0.019693968817591667, 0.039455294609069824, -0.012865528464317322, 0.04357747361063957, 0.0005996566032990813, -0.05595357343554497, -0.012294379062950611, 0.022306250408291817, 0.03958002105355263, 0.006381109356880188, -0.062178123742341995, 0.03385890647768974, -0.018743367865681648, -0.010098682716488838, -0.045985374599695206, 0.023184455931186676, 0.0012777590891346335, -0.050244852900505066, -0.026230212301015854, -0.015797656029462814, 0.026347653940320015, -0.06670773774385452, -0.06348633021116257, -0.04835041984915733, 0.004663222935050726, -0.008933760225772858, 0.020013097673654556, 0.018989605829119682, 0.007116269785910845, -0.007441430352628231, -0.02012087032198906, 0.06447630375623703, 0.03188998997211456, 0.04589298740029335, -0.008028618060052395, -0.0044133965857326984, 0.013735639862716198, -0.002824899274855852, 0.01438430231064558, 0.007092865649610758, -0.025575507432222366, 0.0051122503355145454, 0.05561532452702522, 0.07293631136417389, -0.043151967227458954, 0.023916330188512802, -0.019328229129314423, 0.08375490456819534, -0.03879748657345772, 0.026553073897957802, 0.034178704023361206, -0.025876443833112717, 0.032680805772542953, -0.010542728938162327, -0.04720507562160492, 0.03610066697001457, 0.043919313699007034, 0.01077098585665226, -0.016947561874985695, 0.04680252447724342, 0.0028757641557604074, 0.00971377082169056, 0.005214960779994726, 0.025094859302043915, 0.004818658344447613, 0.03428226336836815, -0.00897187925875187, -0.029298298060894012, -0.013751115649938583, -0.007903807796537876, 0.0034046212676912546, -0.011556101962924004, 0.029566634446382523, -0.031173696741461754, -0.020531874150037766, -0.006066714413464069, -0.014882035553455353, -0.014152300544083118, -0.0003693362814374268, 0.020484600216150284, -0.011341753415763378, -0.003885018639266491, 0.001467402558773756, 0.014548308216035366, -0.006674745120108128, -0.022441772744059563, 0.009644058533012867, 0.03150325268507004, -0.019853739067912102, -0.02334972470998764, -0.009405362419784069, -0.0017620156286284328, -0.03707551211118698, -0.043469324707984924, -0.01460517942905426, 0.07385580986738205, -0.006330323405563831, -9.622977813705802e-05, -0.005196394398808479, -0.05251406133174896, -0.050086550414562225, -0.008371210657060146, -0.025118155404925346, -0.08393584191799164, -0.0005972333601675928, -0.004582185298204422, 0.04244516044855118, -0.004898144863545895, 0.0202809926122427, -0.012109876610338688, 0.0454089380800724, 0.1073717400431633, 0.022697990760207176, -0.019234396517276764, 0.009151356294751167, 0.03869466483592987, -0.036842748522758484, -0.0006478271679952741, -0.006043701432645321, -0.011846326291561127, 0.060356177389621735, 0.016402199864387512, 0.025415854528546333, -0.03628738597035408, -0.035484444350004196, 0.021638421341776848, -0.025914741680026054, 0.03170938789844513, 0.0055128950625658035, 0.05759028345346451, -0.018591057509183884, 0.029683727771043777, 0.01708887331187725, -0.07058510929346085, -0.052992865443229675, -0.00515360152348876, -0.02962641231715679, -0.01703176088631153, 0.07474485039710999, -0.0078111193142831326, -0.03072233311831951, -0.009503391571342945, -0.05545420944690704, 0.06939958781003952, -0.011520068161189556, 0.06369848549365997, 0.006232869811356068, -0.011688625440001488, 0.04615244269371033, -0.023535089567303658, -0.05774187669157982, -0.04159269854426384, -0.0024222792126238346, 0.04338980093598366, -0.075606569647789, -0.0018858009716495872, -0.036545392125844955, 0.0690336599946022, 0.04427419602870941, 0.004400139208883047, -0.02914184145629406, -0.03145435079932213, -0.004177225288003683, 0.07764501869678497, -0.012581124901771545, -0.04023868963122368, 0.06515030562877655, 0.0283905528485775, -0.00020573283836711198, -0.01624823920428753, -0.01679290272295475, 0.015522868372499943, 0.011502296663820744, -0.010487278923392296, -0.025777896866202354, -0.010739817284047604, 0.009158240631222725, -0.04438383877277374, 0.016946179792284966, 0.026024457067251205, 0.0007288606720976532, -0.04137871414422989, -0.012693469412624836, 0.006702971179038286, 0.017626525834202766, -0.03417259827256203, -0.03950008749961853, 0.012103487737476826, 0.041136715561151505, 0.03531857207417488, -0.013444704003632069, 0.04060244560241699, 0.01644693687558174, 0.016391364857554436, 0.030570266768336296, 0.04558812826871872, 0.0620187483727932, 0.05715474113821983, 0.02419011853635311, 0.03705134242773056, 0.016912512481212616, -0.05945481359958649, -0.010608947835862637, 0.008850513957440853, -0.03701148182153702, 0.07989546656608582, -0.043199051171541214, 0.004433746449649334, -0.03347010910511017, 0.014888620935380459, -0.055504076182842255, -0.013881569728255272, -0.04201347380876541, 0.014592825435101986, -0.05453072488307953, 0.04204440861940384, -0.03268503397703171, 0.02098989300429821, 0.011214395053684711, -0.017544686794281006, 0.0240979865193367, 0.014438973739743233, -0.011447432450950146, -0.007937312126159668, -0.020393645390868187, -0.01381600834429264, -0.02248551696538925, 0.06293327361345291, -0.05099409073591232, 0.042177796363830566, 0.05607188120484352, -0.013037499040365219, 0.03760470822453499, 0.014663033187389374, 0.008437510579824448, -0.06400208920240402, 0.029158450663089752, -0.003786488203331828, -0.026729166507720947, 0.02592380903661251, -0.06229156255722046, 0.01237469632178545, -0.028086915612220764, 0.0008758127805776894, 0.05510391294956207, 0.0071428376249969006, 0.019167520105838776]" ./train/lion/n02129165_5845.JPEG,lion,"[-0.01812000200152397, 0.0004171301843598485, -0.01638803258538246, -0.02826460264623165, 0.02030589058995247, 0.019621970131993294, 0.0251294132322073, -0.006090368144214153, 0.03122187778353691, -0.016306085512042046, 0.0128710912540555, -0.0034657411742955446, 0.037293773144483566, -0.049419716000556946, -0.030116233974695206, -0.035833314061164856, 0.00991833582520485, 0.037655558437108994, 0.0018587762024253607, 0.054251790046691895, -0.0177169106900692, -0.017229361459612846, 0.04758597910404205, -0.06421760469675064, 0.003107755444943905, 0.021823253482580185, -0.012880802154541016, -0.023912224918603897, -0.016606658697128296, -0.02809354104101658, 0.014324272982776165, 0.006099962629377842, 0.01334103848785162, -0.0023006461560726166, -0.014954577200114727, 0.009533329866826534, 0.008573184721171856, 0.025832952931523323, -0.04401747137308121, 0.163783460855484, -0.01997639238834381, 0.012090418487787247, 0.011176934465765953, -0.04082720726728439, 0.006814662832766771, -0.06802008301019669, 0.023600587621331215, 0.049494460225105286, -0.02611570619046688, -0.016439825296401978, 0.02720378339290619, 0.02311547100543976, 0.010076180100440979, -0.025772688910365105, -0.048313871026039124, 0.044677477329969406, 0.02973198890686035, 0.03540048375725746, -0.01914554089307785, -0.0003288731095381081, 0.03768927603960037, 0.013922931626439095, -0.050741471350193024, 0.03283726051449776, -0.024944055825471878, -0.05835431069135666, 0.028822973370552063, 0.056330014020204544, 0.010419859550893307, 0.0030686308164149523, -0.0025018679443746805, 0.00042412555194459856, 0.03294936567544937, -0.02954174019396305, 0.007063689641654491, -0.04281046614050865, -0.04650866612792015, -0.002192264422774315, -0.05998699739575386, -0.002473419765010476, -0.03736226260662079, 0.05159856006503105, 0.00853123888373375, 0.025359751656651497, 0.07775791734457016, 0.028697757050395012, 0.023827187716960907, -0.020324256271123886, 0.09763815253973007, -0.009687221609055996, -0.003811826230958104, -0.008247232995927334, -0.609915554523468, -0.025770341977477074, -0.04578322172164917, -0.00027510663494467735, -0.016238894313573837, -0.019937710836529732, -0.06918312609195709, 0.0033355450723320246, -0.0039298078045248985, 0.01839863881468773, -0.02738088183104992, 0.05711489915847778, 0.0028749199118465185, 0.03407171741127968, -0.09400990605354309, 0.0179094560444355, 0.0248833317309618, -0.01996319182217121, -0.035336337983608246, -0.030460724607110023, -0.005067033227533102, 0.003170054405927658, -0.016415586695075035, -0.009125715121626854, 0.06957504898309708, -0.020141001790761948, 0.048974428325891495, 0.03329010680317879, 0.03695214167237282, 0.04673606902360916, 0.035407841205596924, 0.03333711996674538, -0.030712353065609932, -0.031227344647049904, 0.03786749020218849, 0.010901587083935738, 0.011267580091953278, -0.00656264740973711, 0.011197289451956749, -0.03987870365381241, -0.03112102672457695, 0.08083035796880722, 0.022913910448551178, 0.003678136272355914, 0.015106039121747017, -0.027732305228710175, 0.003379824571311474, -0.016235286369919777, -0.005799741484224796, -0.07435915619134903, -0.02489079162478447, 0.020444268360733986, -0.014788154512643814, 0.01641140505671501, -0.02735992707312107, 0.0014680108288303018, -0.011414955370128155, 0.014751626178622246, 0.009448765777051449, 0.024354973807930946, -0.03751033544540405, -0.040817003697156906, 0.03790781646966934, -0.005133261904120445, 0.019520433619618416, 0.0247028935700655, 0.011629228480160236, 0.05089224874973297, -0.04195661470293999, -0.017431264743208885, -0.0015988126397132874, -0.007525211200118065, 0.010958974249660969, -0.044301073998212814, -0.02122661843895912, 0.012789634056389332, -0.015822792425751686, 0.02023795247077942, 0.02209463343024254, 0.04330448806285858, -0.02069658227264881, -0.04168113321065903, -0.04166540876030922, -0.019622500985860825, -0.07777392864227295, 0.0007640595431439579, -0.016960814595222473, 0.02157682180404663, 0.04090878739953041, 0.02153978869318962, -0.016268670558929443, 0.006424922961741686, -0.0009199438500218093, 0.004474245477467775, 0.03172268718481064, 0.017879437655210495, -0.005698576103895903, 0.02056456357240677, 0.021076994016766548, -0.006585846655070782, 0.003329205559566617, 0.038856618106365204, -0.07465644925832748, 0.002565456321462989, -0.03330297768115997, -0.04953570291399956, -0.059217605739831924, -0.022229481488466263, -0.005940425209701061, -0.000685462262481451, -0.015111446380615234, 0.07244755327701569, 0.013250487856566906, 0.021011706441640854, 0.0038900687359273434, -0.03532169759273529, 0.027318496257066727, -0.039627693593502045, -0.07850824296474457, 0.032354533672332764, 0.04202509671449661, 0.02161129005253315, -0.03200644999742508, -0.012049984186887741, 0.03143579140305519, 0.010375631973147392, 0.08935900032520294, 0.011355625465512276, 0.03351451829075813, 0.04140670970082283, 0.005018796771764755, -0.015580953098833561, -0.04342561960220337, -0.0015010711504146457, -0.008358671329915524, 0.008311420679092407, 0.0005123377195559442, 0.020584067329764366, -0.04505583643913269, 0.0019722669385373592, 0.06859958916902542, 0.043031465262174606, 0.014075729995965958, -0.08479894697666168, 0.018771527335047722, 0.022905973717570305, -0.01769549399614334, -0.021124642342329025, -0.017556965351104736, 0.013503769412636757, 0.03438986837863922, -0.04421934485435486, -0.009274330921471119, 0.033516380935907364, 0.014817656949162483, -0.06972689181566238, -0.01930077373981476, 0.03864840790629387, -0.034771453589200974, 0.047448836266994476, 0.026904935017228127, -0.015997419133782387, 0.012192510068416595, 0.01014014519751072, -0.04130956158041954, -0.021727092564105988, 0.1546885371208191, 0.05261579900979996, -0.007426520809531212, 0.007597612217068672, -0.007924013771116734, 0.023078234866261482, 0.006183439400047064, -0.02249317243695259, 0.01555564720183611, 0.0003665430995170027, 0.027356905862689018, -0.0030820779502391815, -0.039356671273708344, -0.010347951203584671, 0.03639325499534607, 0.03266537934541702, 0.03084605559706688, -0.03173983469605446, -0.007360702380537987, 0.006043815053999424, -0.0011030695168301463, 0.003473745658993721, 0.056904446333646774, 0.0036286574322730303, -0.013129670172929764, -0.043079618364572525, -0.006232036743313074, 0.032643094658851624, -0.05459921807050705, -0.027292605489492416, -0.022532811388373375, -0.008759256452322006, -0.027472184970974922, -0.010926776565611362, 0.020287463441491127, -0.03235343098640442, -0.0024897323455661535, -0.011803648434579372, 0.1103556901216507, 0.04010305553674698, -0.007532845251262188, -0.016463203355669975, 0.029871845617890358, 0.030456002801656723, -0.013112124986946583, -0.02241794392466545, -0.0063485694117844105, -0.009832133539021015, 0.005363659467548132, 0.041519928723573685, 0.052840493619441986, -0.022661633789539337, 0.009354587644338608, -0.0094949034973979, 0.08065793663263321, -0.028131159022450447, 0.011341553181409836, -0.029642632231116295, -0.014001392759382725, 0.030243005603551865, 0.007263046223670244, -0.05124073475599289, 0.04136146232485771, 0.039580218493938446, -0.027137108147144318, -0.03718879446387291, 0.03418068587779999, -0.031920772045850754, 0.04289963096380234, 0.00618315301835537, 0.02139018476009369, -0.011063369922339916, 0.016464514657855034, 0.0027622117195278406, -0.03137805312871933, -0.004114780109375715, 0.011942594312131405, 0.013662951067090034, -0.007953197695314884, 0.02605307660996914, -0.035781532526016235, -0.023905381560325623, -0.026506030932068825, -0.011486150324344635, -0.035945773124694824, -0.006847359240055084, -0.011955691501498222, 8.110572525765747e-05, -0.018646618351340294, -0.0032191218342632055, -0.0037708475720137358, -0.02605380304157734, -0.03982444107532501, -0.002068540081381798, 0.019082102924585342, 0.0031029358506202698, -0.02276080660521984, 0.0030887143220752478, 0.006158307660371065, -0.09895628690719604, -0.015571464784443378, 0.001802258426323533, 0.09651508927345276, 0.006112127099186182, -0.01481774915009737, 0.0082781333476305, -0.026248708367347717, -0.014329833909869194, 0.005990102421492338, -0.07433822751045227, -0.04227060452103615, 0.013186577707529068, 0.0037743085995316505, 0.031044457107782364, 0.0077843498438596725, -0.006619636435061693, 0.023457171395421028, 0.028676163405179977, 0.10188188403844833, 0.043858952820301056, -0.05775517597794533, -0.010211759246885777, 0.05553083494305611, -0.022489026188850403, -0.024835845455527306, -0.026666712015867233, 0.02434510737657547, 0.08363933861255646, -0.0007515100296586752, -0.0212471392005682, -0.00700888829305768, 0.005095105152577162, -0.003382208524271846, -0.02582993544638157, 0.020638152956962585, 0.040646281093358994, 0.03594807907938957, -0.04939821735024452, 0.050707098096609116, -0.017645496875047684, -0.10081611573696136, -0.09247993677854538, 0.018636099994182587, -0.02529802918434143, -0.01699991337954998, 0.049509115517139435, -0.013050383888185024, -0.0036786855198442936, -0.0024310436565428972, -0.04420504719018936, 0.09704643487930298, -0.0467878058552742, 0.07427392154932022, 0.0112178735435009, -0.015359963290393353, 0.021506955847144127, -0.058871831744909286, -0.05158480629324913, -0.03155480697751045, -0.002095282543450594, 0.028480764478445053, -0.06446664780378342, -0.017851008102297783, 0.014801064506173134, 0.03494500368833542, 0.03599972277879715, 0.026209430769085884, -0.02649432234466076, 0.004017827566713095, 0.012765754014253616, 0.01942470110952854, 0.026656631380319595, -0.035699713975191116, 0.05302209034562111, 0.009191210381686687, -0.025411179289221764, -0.08109860122203827, -0.025638725608587265, 0.05006353184580803, 0.000225394222070463, 0.02321678400039673, -0.02131740190088749, 0.040692608803510666, -0.018658043816685677, -0.05300052464008331, -0.013779742643237114, 0.020016537979245186, 0.002341845305636525, -0.0033905250020325184, -0.015183009207248688, 0.021421216428279877, -0.00030323321698233485, 0.009244851768016815, -0.013316166587173939, -0.03874463215470314, 0.019762570038437843, 0.026419635862112045, 0.025910906493663788, 0.0713433176279068, -0.017225319519639015, 0.012880707159638405, 0.04570900276303291, 0.02165086381137371, 0.06203329190611839, 0.038338448852300644, -0.020222065970301628, 0.0673237070441246, -0.014864979311823845, -0.053325407207012177, -0.0233968123793602, 0.04093612730503082, -0.03587498515844345, 0.05713186040520668, 0.02932826429605484, -0.05967254564166069, -0.042223457247018814, 0.027377421036362648, -0.04435724765062332, -0.027773775160312653, -0.006911894306540489, -0.008520500734448433, -0.04514942318201065, 0.024725085124373436, -0.021342255175113678, 0.03975061699748039, 0.030048012733459473, -0.006432599388062954, 0.006418728269636631, -0.0016627282602712512, 0.0066882590763270855, -0.04689018428325653, -0.0538439117372036, -0.009090308099985123, -0.016846096143126488, 0.02725672535598278, -0.015032825991511345, 0.02609291858971119, 0.03370055928826332, 0.013642621226608753, 0.02699805237352848, 0.007614536210894585, -0.004146399907767773, -0.029757540673017502, 0.038469698280096054, 0.05036189407110214, 0.01187354139983654, 0.012900443747639656, -0.05984826385974884, 0.017599403858184814, -0.03030192106962204, -0.004667137749493122, 0.053402453660964966, -0.044245969504117966, 0.03658051788806915]" ./train/lion/n02129165_1142.JPEG,lion,"[-0.0188800897449255, -0.0039058399852365255, 0.015755098313093185, 0.03119366616010666, 0.017219703644514084, -0.004301745910197496, 0.028958037495613098, -0.023418311029672623, 0.004327863454818726, -0.016970539465546608, 0.013027909211814404, -0.019213182851672173, -0.016053929924964905, -0.014298747293651104, 0.0025763697922229767, -0.02761346474289894, -0.021745413541793823, 0.005345183424651623, -0.0029573924839496613, 0.023335009813308716, -0.023169895634055138, -0.016727807000279427, 0.04534435644745827, -0.05600699037313461, -0.03191635385155678, 0.027936648577451706, -0.0068687256425619125, 0.024641577154397964, -0.021800367161631584, -0.008567862212657928, 0.0014363849768415093, -5.4509437177330256e-05, 0.010168254375457764, -0.00020430701260920614, -0.0004592656623572111, -0.008542614988982677, 0.014927360229194164, 0.049046292901039124, -0.025811167433857918, 0.16894520819187164, 0.0011896826326847076, -0.008940208703279495, 0.019429588690400124, -0.025572724640369415, -0.015446341596543789, 0.011079907417297363, 0.029027463868260384, 0.04118630290031433, 0.003928657621145248, -0.02589377760887146, -0.00538560701534152, 0.053369469940662384, -0.0030121258459985256, -0.0021953219547867775, -0.026449333876371384, 0.035974979400634766, 0.039446014910936356, 0.03586910292506218, 0.002217275556176901, 0.017527995631098747, 0.06916487216949463, 0.029463056474924088, -0.0006659713690169156, 0.05151529610157013, -0.014322823844850063, -0.05635932832956314, 0.0365147702395916, 0.147960364818573, -0.006700705271214247, 0.019397763535380363, 0.00027266034157946706, -0.021992068737745285, 0.023664506152272224, -0.03974047303199768, 0.0216357484459877, -0.009804487228393555, -0.04801682382822037, -0.012812002561986446, -0.06161126866936684, -0.01614149659872055, -0.014757047407329082, 0.0039756521582603455, -0.020736290141940117, -0.01888013817369938, 0.08127898722887039, 0.016926920041441917, -0.0002309678093297407, -0.02752995491027832, 0.06324222683906555, 0.002481807954609394, 0.027715707197785378, -0.0027669460978358984, -0.6080963611602783, 0.01590498723089695, -0.05145125836133957, -0.01568606123328209, 0.016477644443511963, -0.020205682143568993, -0.11074789613485336, 0.03996799513697624, -0.019803611561655998, 0.009714175947010517, -0.03581003472208977, 0.024697648361325264, 0.03648859262466431, -0.019742341712117195, -0.038381244987249374, 0.0027721647638827562, 0.006825943943113089, -0.023025352507829666, -0.035673242062330246, -0.011167970485985279, -0.004875393584370613, -0.006779101677238941, -0.0245407372713089, 0.0007279463461600244, 0.006393710151314735, -0.022802840918302536, 0.058838628232479095, 0.0037270267494022846, 0.019648388028144836, 0.031106911599636078, 0.01646464504301548, -0.015715468674898148, -0.04347026348114014, -0.05481794849038124, 0.01659507118165493, -0.0008010169258341193, 0.029947932809591293, 0.051554642617702484, -0.012809180654585361, -0.022719893604516983, -0.0019180196104571223, 0.08382172882556915, 0.024874716997146606, 0.00463076401501894, 0.01207931712269783, -0.06418174505233765, -0.037243619561195374, 0.005885113961994648, -0.038452956825494766, -0.03354939445853233, -0.021150868386030197, 0.018896663561463356, -0.04026525095105171, 0.02883455716073513, -0.04803980514407158, -0.035290807485580444, -0.024134881794452667, 0.0377667210996151, -0.001456105848774314, -0.00473884167149663, -0.020711058750748634, -0.026227114722132683, 0.014271929860115051, 0.021863145753741264, 0.013655003160238266, 0.014968489296734333, 0.03407339006662369, 0.0031267893500626087, -0.00821796152740717, -0.033714231103658676, -0.009369797073304653, 0.022057896479964256, -0.010415799915790558, -0.028678471222519875, -0.02642432227730751, 0.020735478028655052, 0.013502384535968304, 0.05280938744544983, 0.005499308463186026, 0.04480819031596184, 0.007352224085479975, -0.025415511801838875, -0.009160677902400494, -0.0023650710936635733, -0.03875059634447098, -0.00015932701353449374, -0.050692349672317505, 0.017674757167696953, 0.028222793713212013, 0.030562981963157654, -0.028335420414805412, -0.01891905441880226, -0.013228021562099457, 0.014593278989195824, 0.016771133989095688, 0.008219029754400253, -0.01399565301835537, 0.006706055253744125, -0.016808727756142616, 0.011377216316759586, -0.003351704217493534, 0.04844880476593971, -0.09899859130382538, 0.029027169570326805, -0.005057063419371843, -0.04963688924908638, -0.09302308410406113, -0.01384493988007307, 0.0059131719172000885, 0.01849975995719433, -0.008656974881887436, 0.06287586688995361, 0.046807337552309036, 0.007896714843809605, -0.009194305166602135, 0.013359315693378448, 0.002785502700135112, -0.003018517279997468, -0.06712634861469269, 0.0265249814838171, 0.0570438876748085, 0.005019273143261671, -0.030428986996412277, 0.02275446057319641, 0.028922148048877716, 0.03112412616610527, 0.080734483897686, 0.007344796787947416, 0.027645433321595192, 0.0730154737830162, -0.02420773170888424, 0.0013560258084908128, -0.014141355641186237, 0.0012116276193410158, -0.01814178004860878, -0.009609472937881947, 0.022883417084813118, 0.023108135908842087, -0.040038641542196274, 0.008556690998375416, 0.02471451833844185, 0.011544463224709034, 0.0252962876111269, -0.025684775784611702, -0.036412667483091354, -0.05066175013780594, -0.003442227141931653, -0.03628413379192352, -0.002755798166617751, 0.028265945613384247, 0.034477028995752335, -0.03504166752099991, -0.03969164192676544, 0.07302512228488922, 0.0470682755112648, -0.06946568936109543, -0.03975445032119751, 0.03608950600028038, 0.007916813716292381, 0.01456638053059578, 0.028773628175258636, -0.004874915350228548, 0.01831650175154209, 0.02404942363500595, -0.027963265776634216, -0.0068319919519126415, 0.1755146086215973, 0.0438406877219677, -0.00406735809519887, -0.007188401184976101, 0.0131453862413764, 0.047538209706544876, 0.002549394266679883, -0.011996667832136154, -0.029917417094111443, -0.00892010610550642, 0.048753414303064346, -0.011277278885245323, -0.06301197409629822, 0.016547558829188347, -0.0020648662466555834, 0.02774021588265896, 0.046885810792446136, -0.03347206488251686, 0.011951955035328865, 0.0309060700237751, -0.005843415390700102, 0.0018348917365074158, 0.03625956177711487, -0.015423238277435303, -0.0505964457988739, -0.03347812592983246, 0.0023186556063592434, 0.005098535213619471, -0.08141626417636871, -0.025127964094281197, -0.020823227241635323, -0.023055559024214745, -0.03968900442123413, 0.023522354662418365, -0.014623538590967655, 0.00821580458432436, -0.004060645122081041, 0.01094003301113844, 0.15394806861877441, 0.0358571894466877, 0.010279353708028793, -0.013756576925516129, -0.014736104756593704, 0.006379333790391684, -0.051700495183467865, -0.0066194296814501286, 0.01590665616095066, 0.004172442015260458, -0.031037122011184692, 0.042210254818201065, 0.03258347511291504, -0.028189554810523987, 0.02516610361635685, 0.011533530429005623, 0.08370476961135864, -0.00936557725071907, 0.01122322864830494, 0.003157595172524452, 0.040239837020635605, 0.05193062499165535, -0.019592422991991043, -0.054149627685546875, 0.022464649751782417, 0.0919506773352623, -0.0029223021119832993, 0.0025772161316126585, 0.04762426018714905, 0.0020152449142187834, 0.04524905979633331, -0.0021085855551064014, 0.014494422823190689, -0.003944667521864176, -0.0037460187450051308, -0.01412330660969019, 0.01628260500729084, -0.0314876064658165, 0.02049308270215988, -0.030892610549926758, 0.007615736685693264, 0.03319618105888367, -0.03918416425585747, -0.06441844254732132, -0.03570949286222458, 0.010246353223919868, -0.013667220249772072, -0.02762839011847973, -0.010968032293021679, 0.016313066706061363, -0.014481304213404655, 0.00920829363167286, 0.0022513694129884243, 0.013245158828794956, 0.01541413739323616, -0.006609126925468445, 0.03378782793879509, 0.007281507831066847, -0.01884099468588829, -0.044721152633428574, 0.017485912889242172, -0.04791124165058136, 0.0020350718405097723, -0.029618220403790474, 0.03648236393928528, -0.01731773652136326, -0.0148314218968153, 0.04912000149488449, -0.05561860650777817, -0.03245622292160988, 0.014664028771221638, -0.04244672507047653, -0.029653683304786682, 0.008427690714597702, -0.006362244486808777, 0.00844296719878912, -0.01607949286699295, 0.02833915874361992, 0.006444415543228388, 0.0726742297410965, 0.1521071046590805, -0.004555525723844767, -0.03228086978197098, 0.023075716570019722, 0.041731707751750946, -0.004437985364347696, -0.01832369714975357, 0.005721048451960087, 0.01574462465941906, 0.043417856097221375, 0.021552395075559616, 0.014580567367374897, -0.010491916909813881, 0.0360683910548687, -0.028111128136515617, -0.04880357161164284, 0.023075871169567108, 0.02205614000558853, 0.014186466112732887, -0.03828749805688858, 0.03109665773808956, 0.01460101269185543, -0.0994396060705185, -0.059305589646101, 0.00475228950381279, -0.04437878355383873, -0.025630606338381767, 0.05665918439626694, 0.01539009902626276, -0.02165108732879162, -0.035210270434617996, -0.023106668144464493, 0.07370861619710922, -0.0573730506002903, 0.05519420653581619, 0.021759293973445892, 0.005341736134141684, 0.024486370384693146, -0.030910884961485863, -0.04346911609172821, -0.005806423258036375, 0.014468620531260967, -0.0011166103649884462, -0.07938447594642639, -0.02814910188317299, 0.004279199056327343, 0.04659333825111389, 0.0500791110098362, 0.038024287670850754, 0.0038135885260999203, -0.03864685073494911, -0.018976721912622452, -0.004047686234116554, -0.0006086435751058161, -0.024896539747714996, 0.03190122917294502, 0.010633246973156929, -0.016169756650924683, -0.0215467419475317, -0.0035540403332561255, -0.023927947506308556, -0.01502592209726572, 0.009395185858011246, 0.002072528935968876, 0.03682088479399681, 0.01812521182000637, -0.026785803958773613, -0.004410683177411556, 0.0042550330981612206, 0.01817563734948635, -0.023052264004945755, -0.018123827874660492, 0.0313308946788311, 1.2032071936118882e-05, -0.03653785213828087, 0.004631448071449995, 0.002833362203091383, 0.012770740315318108, 0.018119188025593758, 0.010322686284780502, 0.07005304843187332, -0.0075157866813242435, 0.0019493353320285678, 0.04679735749959946, 0.006868365686386824, 0.03464523330330849, 0.0491483248770237, -0.024080920964479446, 0.029247725382447243, 0.02923911064863205, -0.051948804408311844, -0.0024255970492959023, -0.020327864214777946, -0.07906713336706161, 0.07951199263334274, -0.026502015069127083, -0.026650408282876015, -0.029690595343708992, 0.0012450219364836812, -0.06838546693325043, -0.025519484654068947, 0.016628803685307503, -0.015720902010798454, -0.04128091037273407, -0.002028197515755892, -0.032052330672740936, 0.037568822503089905, -0.005699212197214365, 0.007466228678822517, 0.027986297383904457, -0.023225784301757812, 0.009606800973415375, -0.005458205007016659, -0.03265443071722984, 0.005281555932015181, -0.009649365209043026, 0.035814207047224045, -0.022787433117628098, 0.04162018001079559, 0.021101877093315125, -0.03711758553981781, 0.036456525325775146, -0.009143311530351639, -0.003727928502485156, -0.06233411282300949, 0.02162012830376625, 0.02745671384036541, -0.007213531527668238, 0.02502921223640442, -0.07545062899589539, -0.008819512091577053, -0.00869128666818142, 0.014680608175694942, 0.059780992567539215, -0.039354145526885986, 0.02843937650322914]" ./train/lion/n02129165_11278.JPEG,lion,"[0.027720868587493896, -0.03112315759062767, 0.02119213342666626, 0.05293130874633789, 0.003068554913625121, 0.03991324082016945, 0.05622570589184761, -0.0009417220717296004, 0.02491329051554203, 0.0305812768638134, -0.0024977324064821005, 0.011069439351558685, -0.01007205992937088, -0.02760128118097782, 0.004596144426614046, -0.021540692076086998, -0.014678866602480412, 0.008176727220416069, -0.01550260093063116, 0.06128174811601639, -0.023005999624729156, 0.021859657019376755, 0.03115883655846119, -0.0370834618806839, -0.016412438824772835, -0.00035867971018888056, 0.00029355587321333587, 0.007880044169723988, -0.02659936062991619, -0.06770582497119904, 0.015570137649774551, -0.010230175219476223, 0.013823872432112694, -0.004850146826356649, -0.007871256209909916, -0.02674124762415886, 0.0024150912649929523, 0.05230697616934776, -0.022808406502008438, 0.12044854462146759, 0.04803479090332985, 0.034273602068424225, -0.0031616694759577513, -0.011433118022978306, 0.002440704731270671, -0.028103288263082504, 0.05497073009610176, -0.0010546183912083507, 0.02410314232110977, -0.024268053472042084, -0.03696732223033905, 0.01224704273045063, 0.03612000495195389, 0.0035871255677193403, -0.05137575790286064, 0.0747678130865097, 0.04865964129567146, 0.07861140370368958, 0.04823807254433632, -0.0011697510490193963, -0.013202216476202011, 0.0364939421415329, -0.00989946536719799, 0.07182248681783676, -0.002951182657852769, -0.04372354596853256, -0.02665073610842228, 0.12685230374336243, -0.011857382953166962, -0.011334192007780075, 0.006620364263653755, -0.02523864433169365, 0.011801159009337425, 0.015200289897620678, -0.005929430015385151, -0.00904229935258627, -0.025173474103212357, -0.015104612335562706, -0.029958469793200493, -8.005607378436252e-05, -0.0030342889949679375, 0.025963183492422104, -0.05336770787835121, -0.010953905060887337, 0.04132195562124252, 0.0022525712847709656, -0.046244796365499496, -0.0469965897500515, 0.10628978908061981, 0.01406208984553814, 0.008553378283977509, 0.0030862523708492517, -0.5768846273422241, 0.025022104382514954, -0.07783740013837814, -0.005399649031460285, 0.0025743197184056044, 0.029063044115900993, -0.06576360017061234, -0.017647402361035347, -0.003915640525519848, -0.05903027579188347, -0.03141188621520996, -0.0009314425988122821, -0.008165405131876469, 0.023628564551472664, -0.0934368148446083, 0.008905771188437939, 0.007387196645140648, -0.025316426530480385, -0.035696905106306076, -0.020840225741267204, 0.028310008347034454, -0.0058853053487837315, 0.036077793687582016, 0.017941445112228394, 0.018591931089758873, -0.019183725118637085, 0.05968482792377472, -0.011652318760752678, -0.02408868819475174, 0.013952663168311119, 0.017365233972668648, 0.005445526447147131, -0.06371930986642838, -0.0664178878068924, 0.021341487765312195, -0.007509599439799786, 0.026436537504196167, 0.008858051151037216, -0.008629385381937027, -0.07038294523954391, 0.0040323855355381966, 0.08178436756134033, 0.010286628268659115, -0.028897300362586975, 0.010799193754792213, -0.02025124430656433, 0.011014124378561974, -0.0001771248789737001, -0.04273609071969986, -0.027822691947221756, -0.01564636267721653, 0.005436983425170183, -0.045123130083084106, 0.011725892312824726, -0.012408580631017685, -0.025031963363289833, -0.014391875825822353, 0.0005237517179921269, -0.007552647031843662, 0.014203714206814766, 0.019795866683125496, 0.006132535636425018, 0.006916978396475315, 0.061000850051641464, 0.0031586247496306896, 0.015154429711401463, 0.07264771312475204, -0.020399363711476326, -0.03416920825839043, -0.02844182401895523, -0.017037849873304367, 0.00588136026635766, -0.013404525816440582, 0.004801913630217314, -0.03181706368923187, -0.0029981702100485563, 0.019069040194153786, 0.012336375191807747, 0.0032719047740101814, 0.05494881793856621, -0.018321050330996513, -0.025103967636823654, 0.0015286963898688555, 0.011332310736179352, -0.11753598600625992, 0.033881425857543945, -0.03679575026035309, -0.007321073208004236, 0.004903669469058514, -0.012371166609227657, 0.038980793207883835, -0.04129781574010849, -0.036905158311128616, -0.007860077545046806, 0.008925015106797218, 0.025928476825356483, 0.0055743432603776455, 0.019518591463565826, 0.005225127562880516, 0.03740864247083664, 0.038870666176080704, 0.03630085662007332, -0.12005046755075455, 0.008153920993208885, -0.007806276436895132, 0.007090716622769833, -0.022080007940530777, -0.005043040961027145, -0.023730916902422905, 0.012800936587154865, 0.016007298603653908, 0.05769811570644379, 0.03371746465563774, 0.00838830042630434, -0.013711183331906796, 0.010991182178258896, 0.026250427588820457, -0.008851449936628342, -0.08892111480236053, -0.0013849609531462193, 0.015693530440330505, 0.036580268293619156, 0.004834957420825958, -0.005148897413164377, 0.035956528037786484, 0.06215286627411842, 0.02078850008547306, -0.01565556973218918, 0.01932200789451599, 0.058062341064214706, 0.026772279292345047, 0.017325209453701973, -0.01180137600749731, -0.005223346408456564, -0.03843090683221817, -0.00949169509112835, 0.020982319489121437, 0.00702547375112772, -0.04304240643978119, 0.022870169952511787, 0.019267389550805092, 0.05230766534805298, 0.04010968282818794, -0.057861294597387314, 0.007966037839651108, -0.003880596486851573, -0.025335071608424187, -0.00893554836511612, -0.022674983367323875, 0.021635551005601883, 0.0018057090928778052, -0.018387531861662865, -0.0004601499531418085, 0.05212535336613655, -0.0019193192711099982, -0.03835910186171532, -0.016423208639025688, 0.06905562430620193, -0.018349701538681984, 0.02073037438094616, 0.011212775483727455, -0.00807100534439087, -0.014232825487852097, -0.011301351711153984, -0.013198908418416977, 0.01824279874563217, 0.21386712789535522, 0.06058830767869949, 0.0027441680431365967, 0.002402237616479397, -0.0003823910665232688, 0.05819181725382805, 0.02707386016845703, 0.009198637679219246, 0.028101174160838127, 0.00888979621231556, 0.015225936658680439, 0.024963518604636192, -0.03832799568772316, 0.033695533871650696, 0.005313710775226355, 0.005280341487377882, 0.023531382903456688, 0.0006943808402866125, -0.015613230876624584, 0.03132692351937294, -0.008383539505302906, -0.014684589579701424, 0.054146576672792435, 0.025509042665362358, -0.01875447854399681, -0.040181178599596024, 0.007573261857032776, 0.0015296151395887136, -0.03913171589374542, -0.053984493017196655, -0.040011342614889145, -0.00881707202643156, 0.00652166036888957, -0.02337099425494671, -0.02827112004160881, 0.000292386015644297, 0.03585410490632057, -0.021492403000593185, 0.1651022881269455, 0.0355096273124218, 0.004584496840834618, -0.013576856814324856, -0.02214389108121395, -0.030473792925477028, -0.034040965139865875, -0.01464217621833086, -0.0015067807398736477, 0.018057288601994514, -0.0021627945825457573, 0.031247658655047417, 0.01608125865459442, 0.0008770305430516601, -0.0011072615161538124, -0.005429149139672518, 0.08164958655834198, -0.03832823038101196, -0.003623795695602894, -0.0003213543095625937, -0.0016113078454509377, 0.035230230540037155, -0.03228010982275009, -0.018896527588367462, 0.01151367463171482, 0.10869559645652771, -0.003314701374620199, -0.03507274016737938, 0.01572434790432453, -0.012613409198820591, 0.025329191237688065, -0.020232515409588814, 0.054755110293626785, -0.02350727468729019, 0.036473579704761505, -0.015969684347510338, -0.013333556242287159, -0.020102499052882195, -0.008517156355082989, -0.0444021113216877, 0.020747089758515358, 0.05614438280463219, -0.040049172937870026, -0.015364579856395721, -0.02599378488957882, 0.025938203558325768, -0.018132928758859634, -0.013015019707381725, -0.008743678219616413, 0.011685523204505444, -0.03397756814956665, -0.030873291194438934, -0.0028872215189039707, 0.0029625967144966125, 0.04997686296701431, 0.013703102245926857, 0.02199726179242134, 0.02883635088801384, -0.026955902576446533, -0.02619428187608719, -0.043848633766174316, -0.1166500374674797, -0.013445433229207993, 0.014134902507066727, 0.0741787850856781, 0.010302035138010979, -0.004199794493615627, 0.04115438833832741, -0.07445989549160004, 0.012174115516245365, 0.016559993848204613, -0.0322667695581913, 0.0025361725129187107, 0.01391033548861742, 0.0011789072304964066, -0.012637956067919731, -0.012513313442468643, 0.00695695960894227, 0.017562365159392357, 0.01848026178777218, 0.07628364115953445, -0.001986013725399971, -0.03330254927277565, 0.020905444398522377, 0.042716704308986664, -0.01609272137284279, -0.019696542993187904, 0.0030723190866410732, -0.017774131149053574, 0.02154257521033287, 0.02497197687625885, 0.02458910271525383, -0.023935891687870026, 0.0075058178044855595, -0.04423079267144203, -0.05898255854845047, 0.020925017073750496, 0.024797024205327034, 0.021395640447735786, -0.04436853900551796, 0.006704137194901705, 0.06398346275091171, -0.11814271658658981, -0.07229974120855331, -0.008815190754830837, -0.0013736203545704484, -0.08471553027629852, 0.03974471241235733, 0.00599880563095212, 0.03502926602959633, -0.050889160484075546, -0.03727439045906067, 0.05016670748591423, 0.025236327201128006, 0.09458271414041519, 0.040275558829307556, 0.0006856881664134562, 0.013196906074881554, -0.014492950402200222, -0.007971241138875484, -0.014481849037110806, 0.01557705458253622, 0.03535274788737297, -0.0826549381017685, -0.03921316936612129, -0.009378784336149693, 0.010120963677763939, 0.06389869004487991, 0.047251638025045395, -0.027115676552057266, -0.008852771483361721, -0.01742902584373951, 0.015209367498755455, 0.02908838540315628, -0.06197228655219078, 0.017196174710989, 0.006925392430275679, -0.0109128812327981, -0.030241485685110092, -0.03295563906431198, -0.00976195465773344, -0.02522606961429119, 0.006592170335352421, -0.02444647066295147, 0.0017004073597490788, -0.001181162428110838, -0.011864691972732544, -0.019018761813640594, -0.0007517557241953909, 0.006368696223944426, -0.013248373754322529, 0.032920584082603455, 0.045654650777578354, -0.009416494518518448, -0.06651680171489716, -0.0022453477140516043, -0.04584615305066109, -0.011959360912442207, 0.05661161243915558, -0.00972781702876091, 0.1093510240316391, -0.010823516175150871, -0.02083970233798027, 0.026279455050826073, 0.014645743183791637, 0.026334399357438087, 0.06947693973779678, 0.049083445221185684, 0.0067495605908334255, 0.018147557973861694, -0.04070340842008591, 0.0014498657546937466, 0.019165990874171257, -0.01980450749397278, 0.04155801236629486, -0.004958437290042639, -0.007235430181026459, -0.04045741632580757, 0.013195943087339401, -0.07715768367052078, -0.020016362890601158, 0.014442992396652699, 0.017385492101311684, -0.0001251088106073439, -0.009660681709647179, -0.03757716715335846, 0.007043186109513044, 0.0241787638515234, 0.0232502780854702, 0.05840856954455376, 0.01901598833501339, -0.024276824668049812, 0.04102344810962677, -0.031047571450471878, -0.008584040217101574, -0.006855722051113844, 0.05774635449051857, -0.01690291240811348, 0.026019098237156868, -0.0068365284241735935, 0.019511260092258453, 0.039894577115774155, 0.012726865708827972, 0.014246605336666107, -0.02758072502911091, 0.016823282465338707, 0.014582936652004719, -0.004527232609689236, -0.01194904837757349, -0.07183641195297241, 0.04349539428949356, -0.006847174372524023, -0.0032196661923080683, 0.046342432498931885, 0.010265014134347439, -0.009069586172699928]" ./train/lion/n02129165_17028.JPEG,lion,"[-0.0016733187949284911, -0.007414494175463915, -0.010953789576888084, -0.0007948431884869933, 0.004333468619734049, -0.04632987827062607, 0.010749412700533867, -0.022653723135590553, 0.036011915653944016, 0.007126430980861187, 0.046801406890153885, -0.020253770053386688, 0.040561020374298096, -0.029062684625387192, -0.006556367035955191, -0.026095423847436905, 0.10533559322357178, 0.006800788454711437, 0.004849935416132212, 0.026697730645537376, -0.034742653369903564, 0.007631713058799505, 0.04375386983156204, -0.059627749025821686, -0.03076517954468727, 0.023986389860510826, -0.02727358601987362, -0.019588317722082138, 0.018752919510006905, -0.023894160985946655, 0.022991841658949852, -0.014938213862478733, 0.01294037327170372, -0.0003678560897242278, -0.038882944732904434, 0.00847122073173523, 0.033103011548519135, 0.06298210471868515, -0.021265996620059013, 0.12819725275039673, -0.014204412698745728, 0.007950409315526485, -0.001541660400107503, -0.02237735688686371, 0.002972529735416174, 0.045993417501449585, 0.043412357568740845, 0.030776536092162132, -0.03641660884022713, -0.0035427771508693695, -0.01480037346482277, 0.048690710216760635, 0.016948852688074112, -0.022588372230529785, -0.0089667197316885, 0.04166426137089729, 0.02696804702281952, 0.009539647027850151, 0.01492025051265955, -0.002717382274568081, 0.07568270713090897, 0.028224095702171326, -0.0073971194215118885, 0.01424519531428814, 0.017941107973456383, -0.02034418098628521, 0.0018223170191049576, 0.05332734063267708, -0.02358848787844181, -0.01563502848148346, -0.008481885306537151, -0.014537254348397255, 0.03416936472058296, -0.0008291636477224529, -1.8168813767260872e-05, -0.02035856619477272, -0.04441087320446968, -0.04169174283742905, -0.06949218362569809, 0.014276353642344475, -0.008568702265620232, 0.04413987696170807, -0.0019917914178222418, -0.02325705997645855, 0.09367752820253372, 0.017361318692564964, -0.06315797567367554, -0.02536003664135933, 0.02084842137992382, 0.01757272146642208, 0.007951180450618267, 0.014621276408433914, -0.6615018248558044, 0.0012146744411438704, -0.05076105520129204, 0.007433563936501741, -0.007657364942133427, -0.03601707145571709, -0.10385917127132416, -0.02592858485877514, -0.013645949773490429, -0.007474364712834358, -0.025713827461004257, 0.04957221820950508, 0.03948602452874184, 0.01147617120295763, -0.03942108154296875, 0.001713292091153562, 0.002623789943754673, -0.0025034823920577765, -0.028032006695866585, -0.03099151886999607, 0.02387106604874134, -0.0037929872050881386, -0.016654521226882935, 0.0012627087999135256, 0.06569550931453705, -0.013512207195162773, 0.03996889665722847, 0.02194303087890148, -0.010732021182775497, 0.0389711819589138, 0.026655012741684914, -0.011459597386419773, -0.027584059163928032, -0.02654571831226349, 0.003436514874920249, -0.03181994706392288, -0.01881105825304985, 0.02493000403046608, -0.0017830564174801111, -0.010408461093902588, -0.03327738493680954, 0.08733534812927246, 0.02954682521522045, -0.01883806847035885, -0.03159486502408981, 0.012989446520805359, -0.004769803024828434, 0.006478305906057358, -0.01737910881638527, -0.05114622786641121, -0.04517316445708275, 0.02372683957219124, -0.012405941262841225, 0.000610817049164325, -0.016699787229299545, 0.03853177651762962, -0.032369598746299744, -0.015090920962393284, -0.003552976530045271, 0.012379548512399197, 0.028732946142554283, -0.024251801893115044, -0.006920863874256611, 0.0327332504093647, 0.02937575988471508, 0.02542521245777607, 0.009462915360927582, 0.0307368915528059, -0.03530855104327202, -0.02341218665242195, -0.008118834346532822, -0.034454040229320526, 0.028627222403883934, -0.013998827897012234, -0.02132900431752205, 0.005456825252622366, 0.012316872365772724, 0.03182876482605934, -0.02249382995069027, 0.044261664152145386, -0.05877797305583954, -0.012504689395427704, -0.04205126315355301, 0.005289753898978233, -0.047501496970653534, 0.013881159014999866, 0.010614128783345222, 0.005683093331754208, 0.024871399626135826, -0.005603480618447065, 0.023408429697155952, -0.02582843042910099, -0.005907813087105751, 0.0031277649104595184, 0.03387971967458725, 0.0056329574435949326, -0.017038865014910698, 0.008411199785768986, -0.013062402606010437, -0.015382466837763786, -0.001943720504641533, 0.01760226860642433, -0.03285771235823631, 0.029527001082897186, 0.011585187166929245, -0.06353616714477539, -0.06957120448350906, -0.015292350202798843, 0.04305553808808327, 0.0026673278771340847, -0.0248477254062891, 0.0703066885471344, 0.02539982460439205, 0.00283052702434361, 0.005471373908221722, -0.01398902852088213, 0.04176401346921921, -0.02663971297442913, -0.07567568123340607, 0.006107719615101814, 0.02931276522576809, 0.034853823482990265, -0.019805854186415672, 0.01930646039545536, 0.02629745379090309, 0.0386878103017807, 0.09298865497112274, -0.002422780031338334, 0.04055139049887657, 0.015232542529702187, 0.0013374434784054756, -0.022383708506822586, -0.041219186037778854, -0.01518925279378891, -0.015282656066119671, 0.020473958924412727, 0.036435239017009735, 0.03364130109548569, -0.0027796700596809387, 0.008457683958113194, 0.03602467104792595, 0.02461281046271324, 0.04493384435772896, -0.029292479157447815, -0.0005434839986264706, 0.006925345864146948, -0.05534417927265167, -0.017380710691213608, -0.011516164988279343, 0.035156626254320145, 0.02608199045062065, -0.024818411096930504, -0.008712207898497581, 0.0193621963262558, 0.02219969592988491, -0.06843731552362442, -0.04077615216374397, 0.020065665245056152, 0.0034763754811137915, 0.03566832095384598, 0.02118908241391182, -0.024775270372629166, 0.025189289823174477, -0.0067292749881744385, -0.03515811264514923, -0.012674732133746147, 0.14038404822349548, 0.027144955471158028, -0.03642676770687103, 0.003185796085745096, -0.015412379987537861, 0.04368321970105171, 0.021945688873529434, -0.002718344796448946, 0.010258355177938938, -0.000994616188108921, 0.05553891137242317, -0.007028816733509302, -0.04025400057435036, 0.015121137723326683, 0.03437458351254463, 0.03741462901234627, 0.028665313497185707, -0.03516140952706337, 0.02829427272081375, -0.009167693555355072, -0.0235182773321867, -0.04600892961025238, 0.04068809747695923, 0.012152708135545254, -0.0058471024967730045, -0.020885951817035675, 0.0004665638552978635, 0.012157002463936806, -0.00958960596472025, -0.02543754316866398, -0.05707200989127159, -0.014669952914118767, -0.003330797189846635, -0.00023693613184150308, -0.004504866432398558, 0.01194554939866066, 0.0020449517760425806, -0.016310054808855057, 0.0710880309343338, 0.026912333443760872, 0.026620637625455856, -0.0033330058213323355, -0.021254822611808777, -0.00395613070577383, -0.02030596137046814, 0.03208113834261894, 0.020630985498428345, -0.03678804636001587, 0.0052850195206701756, 0.04286261275410652, 0.03802080452442169, -0.020253241062164307, -0.001390544231981039, -0.02593708038330078, 0.0872311145067215, -0.016958555206656456, 0.05189734324812889, -0.036730196326971054, 0.01007268950343132, 0.015231245197355747, -0.01056827511638403, -0.0680377408862114, 0.05236496403813362, 0.06241254135966301, 0.03960214927792549, -0.046262290328741074, 0.025939008221030235, 0.005511799827218056, 0.03151337057352066, -0.014635001309216022, 0.030474495142698288, 0.009853558614850044, 0.035617999732494354, 0.02089061215519905, -0.013901738449931145, -0.013619926758110523, 0.015395527705550194, 0.005329154431819916, -0.003488890128210187, 0.013141628354787827, -0.011578407138586044, -0.018427476286888123, -0.004315204918384552, 0.005018490366637707, -0.017890015617012978, 0.014147765934467316, 0.01719074137508869, 0.01799987629055977, -0.013299813494086266, 0.014577227644622326, 0.021579597145318985, -0.013458454981446266, -0.00933604035526514, -0.01232407707720995, 0.022083789110183716, 0.007069384213536978, -0.017658211290836334, -0.025697965174913406, -0.024026131257414818, -0.09299459308385849, -0.037585631012916565, -0.018078763037919998, 0.07516999542713165, 0.0021040625870227814, -0.0038089146837592125, -0.02612696774303913, -0.04335891827940941, -0.008129925467073917, 0.01653308793902397, -0.010883870534598827, -0.05564475059509277, 0.01588445156812668, -0.003148498712107539, 0.027495920658111572, -0.006431879010051489, -0.002940912265330553, -0.0028239982202649117, 0.03832196071743965, 0.09632822871208191, 0.006627417169511318, -0.027986744418740273, 0.015929818153381348, 0.027231426909565926, -0.05263547971844673, -0.010500536300241947, -0.04324088990688324, 0.002477505709975958, 0.06743016093969345, 0.024006370455026627, 0.01006986666470766, -0.0381622314453125, 0.012931316159665585, 0.030081944540143013, -0.06660444289445877, 0.01832561008632183, 0.014807739295065403, 0.0527443028986454, -0.037683941423892975, 0.04237258434295654, -0.00036385588464327157, -0.06432931870222092, -0.08978711813688278, -0.02185710519552231, -0.014586244709789753, 0.019264565780758858, 0.06287481635808945, 0.010906530544161797, -0.02749692089855671, -0.0419946163892746, -0.04269559681415558, 0.07441448420286179, -0.00757860392332077, 0.08520374447107315, 0.009516934864223003, -0.005850282032042742, 0.03440166264772415, -0.05325155705213547, -0.04569922760128975, -0.011007968336343765, 0.01730664074420929, 0.010348649695515633, -0.06994938105344772, -0.029584286734461784, -0.01581244170665741, 0.06070218235254288, 0.04638192430138588, 0.024822577834129333, -0.013269065879285336, 0.014280921779572964, 0.006817040033638477, -0.05652080848813057, 0.005487748887389898, -0.05116590857505798, 0.052973728626966476, 0.023314494639635086, 0.005358534399420023, -0.012752721086144447, -0.02116497978568077, 0.027047213166952133, -0.0016625688876956701, -0.017268028110265732, -0.01160709373652935, -0.011771679855883121, 0.04288280010223389, -0.055369336158037186, -0.01664888672530651, 0.012373695150017738, 0.026913238689303398, -0.007341164629906416, -0.01792588271200657, 0.016725091263651848, 0.020688729360699654, -0.023745039477944374, -0.03184074908494949, -0.022432450205087662, -0.005402002017945051, 0.024354053661227226, -0.01277073472738266, 0.08507348597049713, -0.006767109967768192, -0.013276038691401482, 0.033449675887823105, 0.013314654119312763, 0.051977772265672684, 0.06970150023698807, 0.01969997026026249, 0.018149051815271378, -0.0020221134182065725, -0.043357964605093, -0.014515123330056667, -0.0014447257854044437, -0.005660087335854769, 0.05809865891933441, -0.031439244747161865, 0.010300246998667717, -0.047855526208877563, 0.03616330400109291, -0.07092857360839844, -0.004706230014562607, -0.033917393535375595, 0.00390220177359879, -0.05508601665496826, 0.03533913195133209, -0.0031432209070771933, 0.00949207041412592, 0.037921883165836334, -0.003637200454249978, 0.02596689760684967, -0.017044099047780037, -0.009475193917751312, -0.007045468781143427, -0.018250301480293274, -0.027222461998462677, -0.024601997807621956, 0.057916734367609024, -0.03824184089899063, 0.0061165764927864075, 0.04456603527069092, -0.01178231555968523, 0.01202463824301958, 0.022723492234945297, -0.010322525165975094, -0.02217053435742855, 0.04275517165660858, 0.005851565860211849, -0.002234387444332242, 0.03224063664674759, -0.05762740224599838, 0.026538530364632607, -0.03707423061132431, -0.01836371421813965, 0.08395829796791077, 0.026502639055252075, 0.0038202672731131315]" ./train/lion/n02129165_19310.JPEG,lion,"[-0.02637297846376896, -0.027417652308940887, -0.0265577994287014, -0.015082130208611488, -0.018655352294445038, -0.015533871948719025, 0.018824050202965736, 0.030572090297937393, 0.024245228618383408, 0.015710871666669846, 0.035878926515579224, -0.016527462750673294, 0.03383662551641464, 0.007530334871262312, -0.017005955800414085, 0.013055295683443546, 0.0333230197429657, -0.0057413773611187935, 0.027634715661406517, 0.03429269418120384, -0.013910037465393543, 0.024650195613503456, 0.017832450568675995, -0.06324576586484909, -0.028682399541139603, 0.030196473002433777, 0.018152689561247826, 0.018922435119748116, -0.004595350008457899, 0.009344768710434437, 0.016898538917303085, -0.026442233473062515, 0.007194978650659323, 0.004761913325637579, -0.06187177449464798, 0.02612951025366783, 0.01255470234900713, 0.06445994228124619, -0.021942943334579468, 0.1588646024465561, -0.02902502939105034, 0.007601399905979633, 0.000705293903592974, 8.594235987402499e-05, -0.01249321736395359, 0.05868171900510788, 0.028702041134238243, 0.04265753552317619, -0.01504590269178152, -0.009550562128424644, 0.001532108522951603, 0.020822172984480858, 0.009783048182725906, 0.032368216663599014, 0.008743198588490486, 0.029498549178242683, 0.019078131765127182, 0.05256885662674904, -0.029704544693231583, -0.01792481541633606, 0.04734348878264427, 0.025638042017817497, -0.025838833302259445, -0.06489647179841995, -0.013727826997637749, -0.03830092400312424, 0.0018755501369014382, 0.06592453271150589, -0.01833137683570385, -0.003626088844612241, -0.024242686107754707, 0.013211679644882679, 0.02975817769765854, -0.053761232644319534, -0.008874066174030304, -0.016683043912053108, -0.08072980493307114, -0.04763801395893097, -0.053245868533849716, -0.03575043007731438, -0.02626011334359646, 0.006434774026274681, -0.0010050855344161391, -0.059796079993247986, 0.10256518423557281, 0.011747696436941624, 0.02244977280497551, -0.02976778708398342, 0.035084426403045654, -0.00820913165807724, 0.012572266161441803, -0.014373991638422012, -0.6663265824317932, 0.01699797809123993, -0.045041490346193314, 0.010761924088001251, 0.005780309438705444, -0.04373425245285034, -0.08688168227672577, 0.021817920729517937, -0.03138519078493118, -0.02539602480828762, 0.005285273306071758, 0.025720447301864624, -0.01508418470621109, 0.07084590196609497, -0.12500408291816711, 0.010076389648020267, -0.015436576679348946, -0.018841343000531197, -0.0017845919355750084, 0.02306758426129818, 0.0320691354572773, 0.009681248106062412, -0.02699902094900608, -0.02189277485013008, 0.026025161147117615, -0.006206890568137169, 0.05238185077905655, 0.019150350242853165, -0.0020103324204683304, -0.0064314017072319984, 0.02934715524315834, 0.01297463197261095, -0.03752189874649048, -0.015931924805045128, 0.019386086612939835, -0.0023204470053315163, -0.01621272973716259, -0.0073652369901537895, 0.01070421189069748, -0.003936906810849905, -0.005988858174532652, 0.08787812292575836, 0.008162789046764374, -0.01317631360143423, -0.03200521692633629, -0.014897585846483707, -0.021074166521430016, -0.029294108971953392, 0.03562932088971138, -0.04023806378245354, 0.029059866443276405, -0.027827255427837372, -0.018513547256588936, 0.029988957569003105, -0.035001542419195175, 0.03217790275812149, -0.017789514735341072, 0.028007980436086655, -0.0055100275203585625, 0.008770706132054329, -0.04033535718917847, -0.024409234523773193, -0.004927517846226692, -0.008326014503836632, 0.03641154617071152, 0.03367932140827179, -0.0002655602584127337, 0.0005293722497299314, -0.026448458433151245, 0.0022244248539209366, -0.00022299775446299464, 0.006721014156937599, 0.05972552299499512, -0.02334062196314335, -0.06179976463317871, -0.009564603678882122, 0.016418347135186195, 0.020278261974453926, 0.004727265797555447, -0.0026133202482014894, -0.02198966033756733, 0.0014713482232764363, -0.04299900308251381, -0.01079921331256628, -0.004793867468833923, 0.013330611400306225, -0.04471484571695328, 0.024782154709100723, -0.013314328156411648, -0.015623245388269424, -0.010005548596382141, 0.01799369417130947, -0.019851472228765488, 0.001885567675344646, 0.032798197120428085, -0.005492158234119415, 0.037432312965393066, -0.002597773214802146, -0.0023828966077417135, -0.026700373739004135, 0.03723383694887161, 0.022036666050553322, 0.04009615257382393, 0.01902344636619091, -0.00408009672537446, -0.05859304964542389, -0.04687764495611191, 0.001993098994717002, 0.00851509254425764, 0.02645207569003105, 0.03169536218047142, 0.07362552732229233, 0.011314203962683678, 0.013198072090744972, -0.007263221312314272, -0.010599276050925255, 0.04323206841945648, -0.07336024194955826, -0.036262381821870804, -0.008963369764387608, 0.03655552119016647, 0.005879256408661604, -0.009309747256338596, -0.00871268194168806, 0.02910231426358223, 0.0015730233862996101, 0.10119921714067459, -0.0016971919685602188, 0.058837372809648514, 0.024810047820210457, 0.004095080774277449, -0.0009675283217802644, -0.0124038215726614, 0.0127553166821599, 0.010443420149385929, 0.01946517452597618, 0.02111479453742504, -0.007185166236013174, 0.016874661669135094, 0.03099791705608368, 0.03554521128535271, 0.031092390418052673, -0.01413305476307869, -0.010484087280929089, -0.010028294287621975, -0.01012673880904913, -0.067999467253685, -0.05854213610291481, 0.013390129432082176, -0.0007684866432100534, 0.02435573749244213, -0.006461698096245527, -0.029883380979299545, 0.008071773685514927, 0.013677750714123249, -0.04330217465758324, -0.023758787661790848, 0.019956715404987335, -0.009143018163740635, 0.019942600280046463, 0.02520761825144291, -0.017046058550477028, -0.0022208308801054955, -0.02921920083463192, -0.03551022708415985, -0.034840021282434464, 0.14296334981918335, 0.009186246432363987, -0.012971604242920876, 0.020750854164361954, 0.004593221470713615, -0.04851670190691948, 0.0015931603265926242, 0.009305120445787907, 0.014783983118832111, -0.018874727189540863, 0.0029947864823043346, 0.0072896722704172134, -0.0387849286198616, 0.0002926158194895834, -0.011129266582429409, 0.044224075973033905, 0.031122369691729546, -0.02193504385650158, 0.0363360270857811, -0.0428682342171669, -0.0052792830392718315, 0.00426796218380332, 0.019091764464974403, 0.028883814811706543, 0.020469149574637413, -0.012877648696303368, 0.01172516867518425, -0.002604351146146655, -0.1186121329665184, -0.02764967456459999, -0.01801326498389244, -0.015557737089693546, -0.03257353976368904, -0.0036292257718741894, -0.025490567088127136, 0.006854858249425888, 0.04956592991948128, -0.016376454383134842, 0.04590222239494324, -0.0067998324520885944, 0.007766601163893938, 0.005047709681093693, 0.023076603189110756, 0.011248902417719364, 0.035140201449394226, 0.017963096499443054, -0.013660771772265434, -0.03127436712384224, 0.022324183955788612, 0.007715629879385233, 0.03988552466034889, 0.0019759144634008408, -0.012785310856997967, -0.04422047361731529, 0.0877426490187645, -0.05468369275331497, 0.030308201909065247, -0.037046827375888824, -0.009368333965539932, 0.043270424008369446, 0.005184870678931475, -0.05753142386674881, 0.04572929069399834, 0.020881913602352142, 0.033601097762584686, -0.009486222639679909, 0.013470165431499481, -0.002231242600828409, 0.006747339386492968, -0.03309039771556854, 0.026016155257821083, 0.040554147213697433, -0.00419250875711441, -0.0071416874416172504, 0.003757891245186329, -0.02228819765150547, 0.009545871056616306, -0.03457308188080788, -0.011546971276402473, 0.01616688072681427, 0.01398840919137001, -0.06926603615283966, -0.001551354886032641, 0.029495516791939735, -0.005619772709906101, -0.015557865612208843, -0.014000676572322845, 0.009343358688056469, -0.015222334302961826, 0.0071595218032598495, 0.018397256731987, -0.06301677227020264, -0.05098848417401314, -0.04390376806259155, 0.034071292728185654, -0.02449975535273552, -0.012638636864721775, 0.01933133415877819, 0.0021170845720916986, -0.060070522129535675, -0.016478154808282852, 0.004207713063806295, 0.044153790920972824, 0.01134100928902626, 0.04504033923149109, -0.032398074865341187, -0.08179295808076859, -0.011797996237874031, 0.024872321635484695, -0.09453529864549637, -0.046721670776605606, 0.003613569773733616, -0.03289363160729408, 0.005429259967058897, 0.00504198158159852, 0.012684625573456287, -0.03761780261993408, 0.06996884942054749, 0.09192902594804764, -0.0038675363175570965, -0.04437791183590889, -0.0008357020560652018, 0.04470789432525635, 0.019173137843608856, -0.02589470148086548, 0.015937138348817825, -0.006773549597710371, 0.028251927345991135, -0.014639838598668575, 0.03941857069730759, -0.03749481961131096, 0.008153471164405346, -0.026710158213973045, -0.08450278639793396, 0.02208488993346691, -0.013808062300086021, 0.04716324433684349, -0.027940658852458, 0.05471781641244888, -0.0016975983744487166, -0.07818718999624252, -0.06619326770305634, -0.010366425849497318, 0.008297877386212349, 0.05217947065830231, 0.077384352684021, 0.01250725332647562, -0.03691907599568367, 2.3886814233264886e-05, -0.05334458127617836, 0.08917886763811111, -0.02404853329062462, 0.0587194487452507, 0.019723106175661087, -0.014953026548027992, 0.01989235170185566, -0.013288617134094238, -0.02657504193484783, -0.01713637262582779, -0.028027387335896492, 0.008797403424978256, -0.05625871196389198, -0.03820320963859558, -0.013127877376973629, 0.015685753896832466, 0.034454889595508575, -0.005800827872008085, 0.015935856848955154, 0.02077348344027996, -0.022766076028347015, 0.04025118798017502, 0.015060422010719776, -0.031054764986038208, 0.06066079065203667, -0.029766831547021866, -0.0021753704641014338, -0.0108182393014431, -0.01215934008359909, 0.03610680624842644, 0.004005147144198418, 0.013030110858380795, -0.03283970430493355, -0.02428380772471428, 0.013533078134059906, -0.039924684911966324, 0.004674054682254791, 0.01515172142535448, -0.014469299465417862, -0.03120584227144718, -0.0020741329062730074, 0.02554040402173996, 0.020590225234627724, -0.018165748566389084, -0.018924832344055176, 0.004511887673288584, 0.029337693005800247, 0.015318090096116066, 0.024457143619656563, 0.026110311970114708, 0.033619966357946396, 0.0018249013228341937, 0.02562742680311203, 0.005634253844618797, 0.0220884308218956, 0.039210908114910126, 0.02128499560058117, -0.00925747212022543, 0.008250443264842033, -0.054491110146045685, 0.00508491788059473, -0.012798569165170193, -0.043067436665296555, 0.06461316347122192, -0.02861817739903927, -0.008428606204688549, -0.012587709352374077, -0.007653392851352692, -0.043813273310661316, -0.009645776823163033, -0.02599007822573185, 0.005495533347129822, -0.01573937013745308, 0.02298310399055481, -0.04170442000031471, 0.014663062989711761, 0.014085708186030388, -0.027188822627067566, -0.001457573496736586, 0.017333531752228737, 0.028086381033062935, -0.010684311389923096, -0.002119923708960414, -0.017954478040337563, -0.00498765055090189, 0.01093214564025402, -0.018577056005597115, -0.02165536768734455, 0.02416951209306717, -0.030485861003398895, -0.019848657771945, 0.0021419718395918608, -0.004711546935141087, -0.0034135521855205297, 0.04272397980093956, -0.032326795160770416, -0.012044858187437057, -0.043882936239242554, -0.027394771575927734, 0.013850639574229717, -0.037260353565216064, -0.023538416251540184, 0.07413455098867416, -0.01644551008939743, 0.01576540246605873]" ./train/comic_book/n06596364_7928.JPEG,comic_book,"[-0.032561834901571274, -0.07092387229204178, -0.02006686106324196, 0.07215685397386551, -0.05578092858195305, -0.008651557378470898, 0.030218232423067093, 0.020046405494213104, -0.07559636980295181, -0.028056085109710693, 0.0049782851710915565, 0.006286062765866518, 0.06243158504366875, -0.06676967442035675, -0.0005483192508108914, -0.01996849849820137, 0.08874861896038055, 0.07373876124620438, 0.06306757032871246, 0.02063176967203617, 0.00898904912173748, 0.010974765755236149, -0.009762318804860115, -0.05735528841614723, 0.035383060574531555, 0.04347379878163338, 0.02476353384554386, -0.008529691025614738, -0.010576911270618439, -0.029552003368735313, -0.029613658785820007, 0.02524794638156891, -0.004425204824656248, -0.03036401979625225, -0.04035867005586624, 0.013589877635240555, -0.03435287997126579, 0.035751067101955414, 0.04760017246007919, 0.07697107642889023, 0.01690463349223137, -0.07955936342477798, -0.07546630501747131, 0.01380604412406683, 0.001514487899839878, -0.06033654510974884, -0.018163219094276428, -0.004788700491189957, 0.0008820343064144254, 0.04545147344470024, 0.0354798324406147, 0.044463466852903366, 0.026960479095578194, 0.03365739807486534, -0.011875497177243233, -0.015796132385730743, 0.035870261490345, -0.01457932312041521, 0.018403898924589157, -0.03099248558282852, 0.01612270250916481, 0.05093681067228317, 0.014757035300135612, 0.03999388962984085, 0.02875044383108616, 0.040084175765514374, -0.04227348044514656, 0.07320612668991089, -0.0028895807918161154, -0.00020897189097013324, -0.0008775815367698669, -0.07655750215053558, 0.0031836668495088816, -0.025302281603217125, 0.04353334382176399, 0.04059484228491783, -0.043831851333379745, -0.007233028300106525, -0.02308211475610733, 0.027532443404197693, 0.03400968760251999, 0.027355080470442772, 0.02018130198121071, -0.0012048326898366213, -0.042127057909965515, 0.0432378314435482, -0.05157756060361862, -0.009569689631462097, -0.05048356577754021, 0.004238187335431576, -0.03300749137997627, -0.0014560287818312645, -0.48233434557914734, 0.0027144071646034718, -0.0012316755019128323, 0.03596985712647438, -0.0008118848782032728, 0.01645524799823761, 0.040713950991630554, -0.017451081424951553, 0.0819687470793724, 0.02254164032638073, -0.005950999911874533, -0.028643889352679253, -0.013600251637399197, 0.0032592839561402798, -0.13164909183979034, 0.023801622912287712, -0.005265873856842518, 0.009917224757373333, -0.001922372612170875, 0.01975324936211109, 0.008830897510051727, 0.07851266860961914, -0.022613050416111946, -0.0639275312423706, -0.022975865751504898, -0.005931553430855274, 0.032096318900585175, 0.022474391385912895, 0.02086530439555645, -0.006234348751604557, -0.0063179233111441135, 0.007142060901969671, 0.024643395096063614, 0.0013018350582569838, -0.01838705874979496, 0.034451186656951904, 0.02660336345434189, -0.00017183224554173648, 0.01669660024344921, -0.02276558056473732, -0.044040873646736145, 0.08869577199220657, -0.024017300456762314, -0.015337805263698101, -0.013405724428594112, -0.037648044526576996, -0.0021149422973394394, 0.0028462079353630543, 0.012776246294379234, 0.01601181924343109, -0.0404847078025341, -0.024109557271003723, -0.014726183377206326, 0.030542373657226562, -0.00042164456681348383, -0.04527091979980469, 0.02115623652935028, -0.014498122967779636, -0.013286978006362915, 0.0009911487577483058, 0.0906604453921318, 0.0233578123152256, -0.04451223835349083, -0.00784211978316307, -0.018514981493353844, -0.043001919984817505, 0.018766725435853004, -0.011368270963430405, -0.015385040082037449, -0.040313564240932465, 0.001720896689221263, 0.021421926096081734, 0.0016459471080452204, 0.052243221551179886, -0.0011150469072163105, 0.009002095088362694, 0.019124768674373627, 0.008018167689442635, -0.0032032164745032787, -0.01272550318390131, -0.021768568083643913, -0.0697288066148758, 0.023146959021687508, -0.07138504087924957, 0.05233515799045563, -0.026888342574238777, -0.008589252829551697, 0.004434215370565653, 0.010262181982398033, -0.03254920244216919, -0.01576923578977585, 0.038571398705244064, 0.036039505153894424, 0.02317563071846962, 0.03998029604554176, -0.009558185935020447, 0.048340607434511185, -0.018174542114138603, 0.024999499320983887, 0.06439097225666046, 0.08104892075061798, 0.03834924101829529, 0.020170848816633224, 0.005485048983246088, -0.05586601793766022, -0.03583313524723053, -0.014469227753579617, 0.005954031832516193, -0.022379599511623383, -0.00690991198644042, 0.014559382572770119, -0.06569904834032059, -0.06536711752414703, 0.008307262323796749, -0.03056187927722931, 0.004905230365693569, -0.028831467032432556, 0.0014471372123807669, -0.10342520475387573, 0.030064336955547333, -0.018092134967446327, 0.03576299920678139, 0.007300377823412418, -0.02757886052131653, 0.005570323672145605, -0.0432879701256752, -0.08029980212450027, 0.01256493479013443, -0.03425225242972374, -0.0547504648566246, -0.023162055760622025, -0.07552492618560791, -0.07372927665710449, 0.017252229154109955, 0.019049497321248055, -0.010161906480789185, 0.04005422815680504, -0.07758010178804398, -0.004341690801084042, -0.05503818020224571, -0.0050415163859725, 0.012584419921040535, -0.014049286022782326, 0.007209368981420994, -0.028249748051166534, -0.025723231956362724, 0.004864373244345188, -0.001076786546036601, 0.020402686670422554, -0.009455242194235325, 0.018068956211209297, -0.009207669645547867, -0.04552941024303436, 0.01984911970794201, -0.001823608996346593, 0.035240523517131805, -0.0302803423255682, 0.011669187806546688, -0.05746738985180855, 0.028391938656568527, 0.016593890264630318, 0.012486699037253857, 0.00779673783108592, -0.010958530940115452, -0.0459003672003746, -0.020814165472984314, -0.1788066178560257, -0.08591459691524506, 0.019272511824965477, 0.014329188503324986, 0.05114898085594177, -0.0786999985575676, 0.03431573137640953, 0.008636238984763622, 0.0313437357544899, 0.037706971168518066, -0.021239379420876503, 0.010819617658853531, 0.016337720677256584, 0.016723891720175743, 0.029534462839365005, 0.006786094978451729, 0.023274095728993416, 0.05660027638077736, -0.018535276874899864, 0.010113246738910675, -0.02076537162065506, -0.021631624549627304, 0.03937745466828346, 0.04178458824753761, 0.04950804263353348, 0.03938140347599983, 0.03354121372103691, -0.0030003897845745087, -0.04342131316661835, -0.00833471491932869, 0.002028379589319229, -0.02974248304963112, -0.007616617251187563, -0.1079799011349678, 0.031567543745040894, 0.05660984665155411, 0.019166672602295876, 0.028841949999332428, 0.016505997627973557, -0.009441627189517021, -0.0016167062567546964, 0.02022128738462925, -0.016750166192650795, 0.024285439401865005, -0.04203386977314949, 0.012611965648829937, 0.02286512590944767, 0.011362207122147083, 0.04594022035598755, 0.031606268137693405, 0.005398791283369064, -0.055948082357645035, -0.030429817736148834, 0.03552455082535744, 0.08839186280965805, 0.05574356019496918, 0.006579681299626827, -0.040205806493759155, 0.002444019541144371, -0.007391083519905806, -0.041894398629665375, 0.0704263299703598, 0.009054645895957947, -0.0036714335437864065, -0.06496898829936981, -0.017517268657684326, 0.01852375455200672, 0.028940271586179733, 0.02461836487054825, 0.0074782101437449455, 0.038760486990213394, -0.04545747861266136, -0.029038719832897186, 0.013015564531087875, 0.034658320248126984, -0.0691351443529129, 0.01059639360755682, -0.008841149508953094, 0.002439682837575674, -0.022222137078642845, 0.015468561090528965, -0.008193914778530598, -0.022542020305991173, 0.043807320296764374, 0.054708197712898254, -0.0006706705316901207, -0.0016898054163902998, -0.03156190738081932, 0.026176372542977333, 0.03406839445233345, -0.007743876427412033, -0.029039083048701286, 0.08482715487480164, 0.030774790793657303, 0.0032926711719483137, 0.029339052736759186, 0.007881863042712212, 0.05875031650066376, -0.04854816570878029, 0.03489122539758682, -0.002191142411902547, -0.028493234887719154, -0.02661992982029915, -0.009246401488780975, 0.032240867614746094, -0.06348030269145966, -0.19656172394752502, 0.041029192507267, -0.00665986817330122, 0.12205418199300766, -0.03944763168692589, 0.0024181362241506577, 0.03764816373586655, 0.05879843607544899, 0.019674887880682945, -0.007992690429091454, -0.019390324130654335, 0.010501713491976261, 0.05026887729763985, -0.027264723554253578, 0.10993923246860504, 0.01741107739508152, 0.005167498718947172, -0.008234214037656784, -0.0373118594288826, -0.016493825241923332, -0.029070230200886726, 0.03178299218416214, 0.05613088235259056, 0.02964518591761589, -0.03843118995428085, 0.019044693559408188, -0.019846487790346146, -0.02257520891726017, 0.028980989009141922, 0.02019897662103176, 0.025563355535268784, -0.011900392360985279, 0.053005240857601166, 0.04253515601158142, 0.06097692623734474, -0.09296335279941559, 0.013335899449884892, -0.020572936162352562, -0.039523813873529434, -0.06291842460632324, 0.045131608843803406, 0.0020851013250648975, 0.015890831127762794, 0.03929458186030388, -0.04828491806983948, -0.00977589562535286, 0.0033537084236741066, 0.01180717907845974, 0.03441833704710007, 0.020743954926729202, 0.0058147478848695755, 0.00013236893573775887, -0.03282121196389198, -0.030041785910725594, 0.0024870075285434723, -0.03365553542971611, 0.02627755142748356, 0.01378190889954567, 0.024778492748737335, 0.036978721618652344, -0.008575579151511192, -0.02459031529724598, 0.015979206189513206, 0.017361246049404144, 0.11693528294563293, -0.006568368058651686, 0.016048535704612732, 0.035671014338731766, 0.07620884478092194, 0.007441598456352949, -0.03843152895569801, 0.002237550215795636, -0.006135561503469944, -0.03611373156309128, 0.0025314856320619583, -0.014155221171677113, -0.017454350367188454, -0.0611899308860302, -0.0246561449021101, -0.015682173892855644, 0.019667722284793854, 0.048961199820041656, 0.02419283799827099, -0.03808623179793358, -0.020121345296502113, 0.0043020062148571014, 0.017306942492723465, -0.002640352351590991, -0.028635084629058838, 0.03705911338329315, -0.015802837908267975, -0.06344426423311234, -0.012315917760133743, -0.019602762535214424, -0.00025320338318124413, -0.022367358207702637, 0.04921534284949303, 0.00487504480406642, -0.017188502475619316, -0.02200954779982567, 0.05695986747741699, -0.008697118610143661, -0.08146112412214279, 0.0037740985862910748, -0.007540709804743528, 0.02656758390367031, -0.007199795916676521, -0.03273223340511322, -0.04041630029678345, -0.05709785595536232, 0.01204500813037157, 0.011005240492522717, 0.01675564981997013, -0.008958893828094006, -0.01573004759848118, -0.007404549513012171, 0.010514471679925919, -0.002601303393021226, -0.04063374549150467, 0.03771529346704483, 0.0069868797436356544, 0.07888303697109222, 0.01420570071786642, -0.04691674932837486, 0.04215264692902565, -0.04826474189758301, 0.05374007299542427, -0.044216107577085495, 0.004433861933648586, -0.10516785085201263, -0.009232676587998867, 0.0019497859757393599, 0.08157426863908768, -0.017657000571489334, -0.0789417251944542, -0.05326351150870323, -0.0388803593814373, -0.08294281363487244, 0.02031989023089409, -0.03359473496675491, 0.023359598591923714, 0.026845768094062805, -0.0037737868260592222, 0.016503755003213882, -0.0406288281083107, -0.01454559899866581, -0.005962585564702749, -0.04084736481308937]" ./train/comic_book/n06596364_4451.JPEG,comic_book,"[-0.04052899405360222, 0.010540271177887917, 0.019549181684851646, 0.006487284321337938, 0.08661169558763504, -0.025922775268554688, -0.003944880794733763, 0.01526639237999916, -0.024012990295886993, 0.024479297921061516, -0.015004965476691723, 0.05137393996119499, 0.04123959317803383, 0.012530368752777576, -0.02311205118894577, -0.03291269764304161, 0.03721204400062561, -0.02571684867143631, 0.04290291294455528, -0.04832959175109863, -0.03487490117549896, 0.02967347390949726, -0.0023536502849310637, 0.04358351603150368, 0.010550566017627716, -0.016605298966169357, -0.017492983490228653, -0.025218354538083076, -0.04592542350292206, 0.030205920338630676, 0.017046263441443443, 0.009183339774608612, -0.03786519914865494, 0.03397837281227112, -0.027757227420806885, 0.05687740445137024, 0.017704779282212257, -0.013636026531457901, 0.03185729309916496, 0.06408965587615967, -0.025766491889953613, -0.04527590051293373, 0.01851755939424038, -0.02975478582084179, 0.04725359380245209, -0.05090196803212166, 0.022377319633960724, 0.06292998045682907, -0.01959145814180374, -0.00859791599214077, 0.08818475902080536, 0.028829053044319153, 0.011843817308545113, 0.01093611866235733, 0.014424647204577923, 0.0018060306319966912, 0.076411671936512, -0.022459032014012337, -0.005392821971327066, 0.04498188570141792, -0.0801801010966301, -0.01114948745816946, 0.010919155552983284, 0.024889260530471802, -0.045110173523426056, -0.04174114391207695, 0.036719419062137604, -0.03165603056550026, -0.012469977140426636, 0.018601318821310997, 0.028118520975112915, 0.026880834251642227, -0.034167807549238205, -0.024897491559386253, 0.06626655906438828, 0.011120573617517948, 0.01429048366844654, -0.019519474357366562, 0.014122593216598034, -0.037467315793037415, 0.02297941781580448, 0.04824554920196533, -0.06796126812696457, -0.0038945209234952927, 0.04598663002252579, 0.016783740371465683, 0.0036537176929414272, 0.03008461743593216, -0.008261066861450672, -0.015808723866939545, -0.05150444060564041, 0.03328166902065277, -0.44054898619651794, 0.02193724364042282, -0.001117003383114934, -0.04935293272137642, 0.012109276838600636, 0.03261461481451988, 0.05230610817670822, -0.10584406554698944, 0.009893229231238365, -0.043758831918239594, -0.00974276103079319, 0.07311356067657471, 0.029705459251999855, 0.028855349868535995, -0.18532997369766235, -0.03585594892501831, -0.01779686100780964, 0.038787588477134705, -0.03128960728645325, -0.04250664636492729, -0.04756631329655647, -0.04759146645665169, 0.009729634039103985, 0.02254973165690899, -0.02330363169312477, 0.03765392303466797, -0.009897267445921898, -0.020786156877875328, -0.028179045766592026, 0.03132941573858261, -0.007031535729765892, 0.01956791803240776, -0.003052227897569537, -0.015019886195659637, 0.023460078984498978, 0.034634921699762344, -0.012895924039185047, -0.02315450645983219, 0.040829773992300034, -0.01917286217212677, 0.0029350314289331436, 0.08332936465740204, -0.02043582685291767, -0.04835815727710724, 0.03240703418850899, 0.03479023277759552, -0.0157399270683527, 0.054742198437452316, -0.028664475306868553, -0.0035469273570924997, -0.06421156227588654, -0.03539494797587395, -0.01093526091426611, -0.024073582142591476, 0.03778626769781113, 0.013522111810743809, -0.0067267343401908875, -0.004645544569939375, -0.0476074293255806, -0.061639364808797836, 0.12306065857410431, -0.06462839245796204, -0.018302934244275093, -0.0491742305457592, -0.02121765725314617, 0.03234615549445152, 0.03989725187420845, -0.008581241592764854, 0.04469720274209976, -0.07050514221191406, -0.04117074981331825, 0.03852304816246033, -0.04895790293812752, -0.0035492414608597755, 0.045047394931316376, 0.010306990705430508, -0.03153771907091141, -0.045691389590501785, 0.027569038793444633, 0.06763613224029541, 0.036011550575494766, -0.0020621230360120535, -0.043213386088609695, 0.031448543071746826, 0.03367861732840538, -0.021782545372843742, -0.012186867184937, -0.02688324823975563, 0.015705276280641556, -0.025486893951892853, -0.05058412253856659, -0.0027876244857907295, 0.029536643996834755, 0.01469658873975277, -0.006826856639236212, -0.04685547202825546, 0.01530641969293356, 0.04340554028749466, -0.012980624102056026, -0.019498733803629875, 0.010053474456071854, 0.011023309081792831, -0.017006153240799904, -0.06196467578411102, -0.01388530246913433, 0.023751314729452133, -0.012438487261533737, 0.036320894956588745, 0.01877143234014511, -0.0403551310300827, 0.020541971549391747, 0.043561216443777084, -0.033388007432222366, 0.025188352912664413, -0.05031337961554527, 0.03586960956454277, -0.005488661117851734, 0.014552067033946514, -0.03797747939825058, 0.019343283027410507, -0.04535633325576782, -0.036081910133361816, 0.05541820824146271, -0.006360946223139763, -0.016783298924565315, 0.023105593398213387, -0.032215509563684464, -0.008548010140657425, -0.046849325299263, 0.009887387044727802, 0.02035965584218502, -0.01561086717993021, -0.013733240775763988, 0.013631238602101803, 0.0034531662240624428, 0.03493563458323479, -0.002862095134332776, -0.010171989910304546, -0.026599321514368057, -0.0010951700387522578, 0.02875245362520218, 0.026286063715815544, -0.02402202971279621, -0.0055226352997124195, 0.0327492393553257, -0.015824172645807266, -0.017352772876620293, 0.011009921319782734, 0.02909342758357525, 0.02454959601163864, -0.04983492195606232, -0.012197035364806652, 0.05831330642104149, -0.05934161692857742, 0.0046453955583274364, 0.0043450756929814816, -0.06066092103719711, 0.09137124568223953, 0.022514916956424713, 0.04506184533238411, -0.014055326581001282, -0.03565627336502075, -0.014110681600868702, -0.018827201798558235, 0.008449782617390156, 0.03270799294114113, -0.20513923466205597, -0.008792872540652752, 0.05317715182900429, -0.040010966360569, -0.014571759849786758, -0.19040633738040924, 0.035044264048337936, -0.009680820629000664, 0.050247978419065475, 0.011423041112720966, -0.01311239693313837, -0.014741366729140282, -0.03587988764047623, 0.036975134164094925, 0.026352612301707268, -0.014657620340585709, 0.03425922989845276, -0.03419055417180061, 0.0017441712552681565, 0.04542256146669388, -0.046486206352710724, 0.018067922443151474, 0.0017372320871800184, -0.030722539871931076, 0.02441329136490822, 0.029779383912682533, -0.016746994107961655, 0.018238937482237816, -0.09719706326723099, -0.016349254176020622, -0.04050339758396149, -0.010448263958096504, 0.00724048214033246, 0.06389591842889786, 0.07065854221582413, -0.00477807829156518, -0.0167721938341856, 0.01797701232135296, 0.021328585222363472, 0.027569593861699104, -0.017841098830103874, 0.01135170552879572, -0.026733266189694405, -0.01642581634223461, 0.007427023723721504, 0.02844141609966755, -0.048696987330913544, -0.0853869616985321, 0.00357233639806509, -0.039288230240345, 0.0478653721511364, -0.018421608954668045, -0.011912280693650246, 0.049623724073171616, 0.08296095579862595, -0.014179982244968414, 0.01411276962608099, 0.06040360778570175, -0.01762600801885128, -0.019179949536919594, -0.00917284656316042, -0.03954165801405907, -0.049895573407411575, -0.01152955461293459, -0.01870921440422535, 0.0007723778253421187, 0.015024126507341862, 0.05665189400315285, 0.014770664274692535, -0.03516794741153717, -0.005539167672395706, -0.05697236582636833, -0.03432735055685043, 0.040935736149549484, 0.04741743952035904, 0.02449796535074711, 0.02731957845389843, -0.03607865050435066, 0.03181527927517891, -0.038714971393346786, 0.02833501063287258, 0.06049162149429321, -0.006303936708718538, 0.01707352139055729, 0.05800279974937439, 0.004957173485308886, -0.05791449919342995, 0.021696826443076134, 0.016804369166493416, -0.005535392556339502, -0.015599807724356651, -0.022008579224348068, -0.051479272544384, 0.026710430160164833, -0.038012534379959106, -0.03369791433215141, 0.021738486364483833, 0.026535578072071075, -0.06523740291595459, 0.02825092524290085, -0.03785700350999832, -0.002304954221472144, -0.014857391826808453, -0.0225063506513834, 0.060745950788259506, -0.01445896364748478, -0.053140297532081604, -0.016613425686955452, 0.023741861805319786, 0.140079066157341, -0.010287510231137276, -0.013125766068696976, -0.006176983006298542, 0.03382224589586258, 0.02297319285571575, 0.036961302161216736, 0.013521813787519932, 0.02419409528374672, 0.029709670692682266, -0.033934786915779114, 0.06490706652402878, -0.0322391651570797, -0.026268383488059044, -0.009887871332466602, -0.04714604839682579, -0.06505605578422546, 0.01419287733733654, 0.03377697989344597, -0.022348443046212196, -0.013823401182889938, -0.01957557164132595, 0.11715121567249298, 0.0039436956867575645, -0.040119584649801254, -0.06694459915161133, -0.024411533027887344, -0.09997112303972244, -0.015701279044151306, 0.045591089874506, -0.0021988078951835632, -0.06852323561906815, -0.0667748898267746, 0.005499350838363171, -0.007766963914036751, -0.1488591581583023, -0.00818351935595274, -0.0027358182705938816, -0.016653981059789658, -0.03212501481175423, 0.0059772697277367115, 0.040192488580942154, -0.00517801521345973, -0.024898534640669823, 0.010918757878243923, -0.045661646872758865, 0.010408606380224228, 0.0660383328795433, -0.010050437413156033, 0.025599822402000427, 0.009193433448672295, -0.054880138486623764, 0.004277682863175869, -0.03690269961953163, 0.014959145337343216, 0.05275954306125641, 0.02300364524126053, -0.02325555682182312, -0.01684972457587719, -0.00855596549808979, -0.022726010531187057, 0.005818456411361694, 0.014563440345227718, -0.03055674582719803, 0.018124442547559738, -0.023772822692990303, 0.0010936497710645199, 0.045586083084344864, -0.030672430992126465, -0.05392199754714966, 0.024768179282546043, 0.020674172788858414, -0.050391990691423416, 0.05194426700472832, -0.001926748431287706, 0.0002645149070303887, -0.02673303708434105, -0.042378220707178116, -0.02916049212217331, 0.03710184618830681, -0.036421291530132294, 0.03544887900352478, 0.02142554707825184, -0.04500216245651245, -0.054971836507320404, -0.04051046073436737, -0.02335267700254917, 0.06096562370657921, -0.029374687001109123, 0.022894831374287605, 0.001754275057464838, -0.03406751900911331, 0.00909649021923542, -0.032763585448265076, -0.009264186955988407, -0.024947721511125565, 0.034143608063459396, 0.05336873605847359, -0.06668542325496674, -0.03344659507274628, 0.02448197826743126, -0.039443958550691605, 0.01981181465089321, 0.019187981262803078, -0.07768939435482025, -0.028297245502471924, -0.06798099726438522, 0.023414205759763718, -0.05111631378531456, -0.059037089347839355, 0.03409700095653534, -0.051724933087825775, 0.0041309804655611515, 0.01796605996787548, -0.03139953315258026, 0.034791044890880585, 0.028529856353998184, -0.04163846746087074, 0.02912267856299877, 0.023117046803236008, 0.0011176517000421882, 0.0032929235603660345, -0.02662944793701172, 0.028543388471007347, -0.007160209119319916, 0.020076854154467583, -0.10268344730138779, 0.02849067747592926, -0.01667545549571514, -0.02498258836567402, -0.024888211861252785, -0.028229890391230583, -0.07005717605352402, -0.051217518746852875, -0.012795377522706985, -0.0017683791229501367, 0.052320446819067, 0.04119196906685829, 0.029717016965150833, -0.019586237147450447, 0.00905855093151331, -0.03898387774825096, 0.05521851405501366, 0.01568138785660267, 0.0030545576009899378]" ./train/comic_book/n06596364_12832.JPEG,comic_book,"[-0.027599750086665154, -0.012195117771625519, -0.005012500565499067, -0.012808194383978844, 0.016550704836845398, 0.008998245000839233, 0.04192337766289711, 0.01577354036271572, -0.053895242512226105, -0.030675185844302177, -0.02361217327415943, 0.04418274015188217, 0.07404453307390213, -0.022595267742872238, -0.013965736143290997, -0.03251419588923454, 0.15098810195922852, 0.07221579551696777, 0.10319262742996216, -0.02453497052192688, -0.03518090024590492, -0.014613272622227669, -0.010518569499254227, -0.00777647877112031, 0.011488043703138828, -0.04881457984447479, -0.004138187039643526, 0.006706609390676022, 0.020200859755277634, 0.03497663140296936, -0.010412197560071945, 0.023427560925483704, -0.03553745895624161, -0.010116917081177235, 0.004765029530972242, 0.02403191849589348, -0.012960178777575493, 0.0021147753577679396, -0.03458603098988533, 0.1261233538389206, 0.0366358757019043, -0.026502732187509537, -0.04586677998304367, -0.007643193006515503, 0.03441125899553299, -0.02227162942290306, 0.0354338064789772, -0.010695398785173893, -0.012780366465449333, -0.027654871344566345, -0.000669805973302573, -0.024779144674539566, -0.037069130688905716, 0.019801538437604904, -0.0035616715904325247, -0.04125794395804405, -0.004199135582894087, -0.010671607218682766, 0.019331224262714386, -0.015016656368970871, 0.021387189626693726, -0.027021829038858414, 0.011277384124696255, -0.011929319240152836, -0.004576792474836111, 0.06467849761247635, -0.03306535631418228, 0.0300894808024168, 0.0481816790997982, 0.030752327293157578, 0.002562220674008131, 0.025538409128785133, 0.041280362755060196, -0.038650643080472946, 0.02749747969210148, -0.04315216466784477, -0.002701195189729333, -0.01935473084449768, 0.015445630066096783, 0.036663610488176346, 0.06330662220716476, -0.019870953634381294, 0.004825741518288851, -0.021804876625537872, -0.04293731600046158, 0.03168829157948494, -0.025598889216780663, -0.011350053362548351, -0.03005261905491352, -0.021480733528733253, 0.009254579432308674, 0.058221638202667236, -0.5078343749046326, 0.030336495488882065, 0.005393769592046738, 0.046247199177742004, 0.014351283200085163, -0.016641607508063316, 0.01799616776406765, 0.025560854002833366, 0.041110552847385406, -0.006767007056623697, 0.01215821597725153, 0.00047794735291972756, 0.054404743015766144, -0.034634754061698914, -0.23436208069324493, -0.0440286360681057, -0.02309761941432953, 0.005254716146737337, 0.028260940685868263, 0.0863473042845726, 0.028130583465099335, -0.020815452560782433, -0.03806454688310623, -0.029110442847013474, 0.010656033642590046, -0.03523746505379677, 0.012140602804720402, -0.04537425562739372, 0.05682064965367317, -0.024313876405358315, -0.03515469655394554, 0.050747666507959366, -0.003694724291563034, -0.04772917926311493, 0.007449130993336439, 0.019903235137462616, 0.006888243369758129, -0.011741729453206062, 0.026063669472932816, -0.037340059876441956, -0.02288089320063591, 0.0742596685886383, -0.03817117586731911, 0.03265118598937988, -0.015249657444655895, -0.012540401890873909, 0.03908221423625946, 0.050588421523571014, -0.0021502363961189985, 0.017278455197811127, -0.07514472305774689, -0.0258371289819479, -0.05067905783653259, -0.0006745062419213355, 0.03311342000961304, 0.01809525303542614, 0.0440187007188797, -0.014231358654797077, -0.026323074474930763, 0.011595656163990498, -0.01578613556921482, -6.266788841458037e-05, -0.035424984991550446, -0.02876591496169567, 0.02538244239985943, -0.0027202656492590904, -0.014485349878668785, -0.00017123905126936734, 0.04579918086528778, -0.032664425671100616, 0.03783528879284859, -0.016038548201322556, 0.026623206213116646, -0.010736379772424698, -0.04733698070049286, -0.03551825135946274, 0.0120146619156003, -0.0040322295390069485, -0.006066740490496159, 0.02248622104525566, 0.03288623318076134, -0.00234338385052979, -0.00018864660523831844, -0.06042962521314621, -0.00890292413532734, 0.029197920113801956, -0.01790005899965763, 0.014759447425603867, 0.02229059673845768, 0.026370299980044365, -0.02351936511695385, -0.05072025954723358, -0.05054273083806038, 0.00525834271684289, -0.02892271988093853, 0.007803861517459154, 0.0033245307859033346, -0.03662643954157829, 0.00281539186835289, 0.0467347726225853, -0.00011349302076268941, -0.029504109174013138, 0.05132065340876579, 0.0033863435965031385, 0.055067505687475204, -0.02001797780394554, 0.09109707176685333, 0.05677057057619095, -0.00044378862367011607, -0.018754543736577034, -0.01684393174946308, -0.009996170178055763, -0.028841402381658554, -0.013541880995035172, -0.03944597393274307, -0.0019459666218608618, 0.0043517593294382095, -0.06070289388298988, 0.0002563762536738068, -0.045226264744997025, -0.0008167557534761727, -0.016429906710982323, 0.039251770824193954, -0.0987185388803482, 0.013581705279648304, -0.024032436311244965, -0.03551260009407997, 0.055530011653900146, -0.031022632494568825, -0.03409722074866295, -0.0033259317278862, -0.016668345779180527, -0.08795587718486786, 0.009504557587206364, -0.07334010303020477, -0.021385282278060913, -0.026510946452617645, -0.04245304688811302, -0.0015629847766831517, 0.012069333344697952, 0.02207397110760212, 0.02300962060689926, 0.00831450242549181, -0.017888542264699936, -0.027908669784665108, 0.013782372698187828, -0.005184840876609087, 0.001245253486558795, 0.02434982918202877, 0.02208329178392887, -0.062059588730335236, -0.007547697052359581, -0.033923376351594925, 0.006701111327856779, 0.025811299681663513, 0.01689884439110756, 0.010203368030488491, 0.02680004946887493, -0.03835833817720413, 0.00812605582177639, -0.02089882269501686, 0.03800227493047714, -0.008698177523911, 0.0095032574608922, 0.02792733535170555, -0.0124827204272151, -0.2629587948322296, -0.031172234565019608, -0.050331588834524155, -0.004245579708367586, 0.03784880414605141, -0.14846353232860565, -0.0014200221048668027, 0.0017403268720954657, -0.007454489357769489, 0.05244261398911476, -0.0734713226556778, 0.013179417699575424, 0.019273798912763596, -0.0019291366916149855, -0.0325639434158802, -0.007982371374964714, -0.056291524320840836, -0.016418486833572388, 0.025443043559789658, -0.056160978972911835, -0.011654560454189777, 0.008712736889719963, 0.03406945988535881, 0.03745933622121811, 0.020668134093284607, -0.0010096410987898707, 0.020225368440151215, -0.0035271686501801014, 0.04395356774330139, 0.04734852910041809, -0.00475073279812932, -0.02094234898686409, 0.009857205674052238, -0.027205612510442734, -0.031911805272102356, -0.009372412227094173, 0.08849261701107025, -0.021560484543442726, 0.05102071538567543, -0.02722148224711418, -0.005365361459553242, 0.0034245734568685293, 0.04732627049088478, 0.00153181585483253, 0.046622470021247864, 0.01576140895485878, 0.017969820648431778, -0.07195475697517395, -0.026335440576076508, -0.005543472245335579, 0.04170525446534157, -0.025100288912653923, -0.010072133503854275, 0.037621721625328064, 0.07402320206165314, 0.07381299138069153, 0.04122861102223396, -0.01916670985519886, 0.04351634532213211, -0.013653331436216831, -0.013121669180691242, 0.023033425211906433, -0.018604831770062447, 0.010373012162744999, 0.025153404101729393, 0.014738747850060463, 0.06829539686441422, -0.03929779678583145, -0.020106986165046692, 0.024732135236263275, 0.015387240797281265, -0.03664907440543175, -0.00669268611818552, 0.038081008940935135, 0.02040514536201954, -0.023856820538640022, 0.032739896327257156, 0.0453970767557621, 0.02206527255475521, -0.0026914156042039394, 0.030485957860946655, 0.02125958353281021, -0.0440678671002388, 0.05122397094964981, 0.06256025284528732, 0.027918843552470207, 0.02361614815890789, -0.030852563679218292, -0.029127422720193863, -0.013690748251974583, -0.0017897613579407334, -0.019107310101389885, 0.02376476116478443, 0.0057333712466061115, 0.08528405427932739, -0.04767279326915741, -0.01620493270456791, 0.04122712090611458, -0.013559217564761639, -0.0003272739122621715, -0.03254387527704239, -0.06173382326960564, 0.03081953153014183, 0.00734113110229373, 0.04484724625945091, 0.005498731043189764, -0.12073180824518204, -0.08617682009935379, -0.016849568113684654, 0.06642494350671768, -0.024136994034051895, 0.0039143869653344154, -0.008033348247408867, -0.03000548481941223, 0.019988613203167915, -0.055303268134593964, 0.014519348740577698, 0.025402162224054337, 0.05706070363521576, 0.01355495024472475, 0.052306462079286575, 0.0003350572951603681, -0.02058439515531063, 0.029028762131929398, -0.03662974014878273, 0.020276356488466263, -0.02582475170493126, 0.02329275757074356, 0.007585273124277592, 0.012482467107474804, -0.0002843539696186781, 0.0027943910099565983, -0.045476194471120834, -0.003962499555200338, -0.025212407112121582, -0.011000445112586021, 0.025034910067915916, -0.012437248602509499, 0.06467025727033615, 0.005420952569693327, 0.047753043472766876, -0.09688539803028107, -0.009121814742684364, 0.005434454884380102, -0.08335347473621368, -0.02341577410697937, -0.01442636176943779, 0.04301290214061737, -0.0020928997546434402, 0.01965927891433239, 0.0008951468043960631, -0.023414112627506256, 0.015362931415438652, 0.05788448080420494, -0.019117774441838264, 0.026061883196234703, 0.03588786721229553, 0.016627846285700798, 0.033893123269081116, -0.04653794690966606, 0.03482016175985336, -0.03402099758386612, 0.0001218114048242569, 0.037048883736133575, 0.004001489840447903, 0.08785563707351685, 0.004388656001538038, 0.039887674152851105, -0.0037767672911286354, -0.005497103091329336, 0.0847768634557724, -0.003294745460152626, 0.019813481718301773, 0.01383470930159092, 0.010755753144621849, -0.0017301237676292658, 0.03564247861504555, 0.0022533219307661057, -0.027744663879275322, 0.03535585477948189, -0.022694984450936317, -0.009700941853225231, -0.0050940061919391155, -0.0234941728413105, 0.026178881525993347, -0.021863427013158798, 0.008393614552915096, 0.01950993575155735, 0.00011283795174676925, -0.007095028180629015, 0.020392227917909622, -0.036746613681316376, 0.010846867226064205, 0.023835638538002968, 0.03821207955479622, 0.040527068078517914, 0.026483682915568352, -0.02837214060127735, 0.018986310809850693, -0.018070930615067482, -0.04428626969456673, 0.05918356403708458, -0.04053070768713951, 0.011998644098639488, -0.06325355172157288, 0.06893462687730789, -0.00557424733415246, -0.04155106097459793, -0.05446038022637367, 0.004183282144367695, -0.022621767595410347, 0.005161387380212545, 0.004222968593239784, -0.05189201980829239, -0.01455235481262207, -0.006231469567865133, 0.018587760627269745, -0.011449462734162807, 0.044087085872888565, -0.028044139966368675, 0.032911546528339386, -0.03468640148639679, -0.013257657177746296, -0.03707781434059143, -0.0025978954508900642, -0.009877541102468967, 0.018924398347735405, 0.019885580986738205, 0.010592532344162464, 0.027798287570476532, 0.058628618717193604, -0.03501976653933525, 0.04559086263179779, -0.00019290333148092031, -0.022825511172413826, -0.016066856682300568, 0.015303250402212143, 0.0016240505501627922, 0.04422733560204506, -0.009265934117138386, -0.022896241396665573, 0.005381283350288868, -0.007959814742207527, 0.01737227477133274, 0.01861858181655407, 0.024874014779925346, 0.03780949488282204, -0.049069419503211975, -0.0014750059926882386, 0.0009984199423342943, 0.00903350580483675, 0.01162103284150362, -0.03078754059970379, 0.010933428071439266]" ./train/comic_book/n06596364_12588.JPEG,comic_book,"[0.004931816831231117, -0.02859817072749138, 0.003255938645452261, 0.00744270533323288, -0.025659725069999695, -0.011467525735497475, -0.0012150189140811563, -0.019383085891604424, -0.01820129156112671, -0.058647118508815765, 0.01120760478079319, -0.0008791277068667114, 0.04641047865152359, -0.02114018425345421, -0.04975512623786926, -0.027810348197817802, 0.05857887864112854, 0.010088040493428707, 0.03269962966442108, -0.016026008874177933, -0.03981829434633255, -0.030749153345823288, 0.00584885198622942, 0.006024784408509731, 0.06018785387277603, 0.010881088674068451, 0.0033808955922722816, -0.014482245780527592, -0.0062897042371332645, 0.008613264188170433, -0.003064115531742573, 0.03038524091243744, 0.005629555322229862, 0.0034974704030901194, -0.013083222322165966, 0.028025075793266296, 0.016254067420959473, 0.024068180471658707, -0.03083241730928421, 0.12431693077087402, 0.03369303047657013, -0.05934424698352814, -0.02262105792760849, 0.0023401426151394844, 0.05740158632397652, 0.037924010306596756, 0.018526768311858177, 0.03424394503235817, 0.014688416384160519, 0.01914680004119873, -0.007965892553329468, -0.01823219284415245, 0.004724566359072924, -0.005819681566208601, -0.021789342164993286, 0.0011371684959158301, -0.0021963745821267366, -0.06780216842889786, -0.00518074631690979, 0.0012069499352946877, -0.0033298751804977655, -0.007950296625494957, -0.011383899487555027, -0.002162428107112646, 0.047131091356277466, 0.037026964128017426, -0.011161488480865955, 0.03232407197356224, -0.017321990802884102, 0.03348451480269432, 0.03849633038043976, -0.003971081227064133, -0.016580304130911827, 0.0028998875059187412, 0.020153364166617393, 0.011378712020814419, -0.027817897498607635, 0.005146675743162632, -0.011665473692119122, 0.012621548026800156, 0.023548010736703873, 0.014174696058034897, -0.000866321730427444, -0.007208609953522682, 0.0007771263481117785, 0.055606432259082794, -0.05778155475854874, 0.03416357934474945, -0.004445163533091545, -0.03182898834347725, 0.002541400957852602, 0.05097189545631409, -0.47722628712654114, 0.0464925579726696, -0.02323700673878193, 0.0223226435482502, 0.02704785205423832, 0.03979591652750969, -0.009370909072458744, 0.00814109668135643, 0.10177379101514816, -0.05438142269849777, 0.011479263193905354, -0.02893885225057602, 0.0504215843975544, -0.026432521641254425, -0.27297526597976685, -0.028694726526737213, -1.0479468073754106e-05, 0.05144885182380676, -0.03219720348715782, 0.013643071055412292, 0.02419414557516575, 0.008404968306422234, -0.00861798319965601, 0.0016032970743253827, 0.007941285148262978, 0.012513034977018833, 0.029658911749720573, 0.050266772508621216, 0.031163016334176064, -0.0469009168446064, -0.0009501971071586013, -0.0025326895993202925, -0.0019318254198879004, -0.04212816804647446, 0.0379924550652504, 0.026843827217817307, 0.0032229332718998194, -0.03562501445412636, -0.008791249245405197, -0.03222273290157318, -0.05094728246331215, 0.0753677487373352, -0.048264652490615845, 0.05314822494983673, -0.009454312734305859, -0.05102395638823509, 0.007621174678206444, 0.06706500798463821, -0.0401579812169075, 0.017785049974918365, -0.1116163432598114, 0.008835848420858383, -0.04903484880924225, -0.002944453852251172, -0.03319839388132095, -0.06289897114038467, 0.04396809637546539, 0.02211591601371765, -0.01288253627717495, 0.024474674835801125, -0.03719690442085266, 0.016595209017395973, -0.022325467318296432, -0.014368720352649689, 0.01463902648538351, -0.035297784954309464, 0.007233877666294575, -0.045910343527793884, 0.03319543972611427, 0.00284697231836617, 0.015342576429247856, 0.011243639513850212, -0.055259089916944504, 0.01606529951095581, -0.047834042459726334, -0.031857822090387344, 0.025774657726287842, -0.03988270089030266, -0.06374841928482056, 0.00439688004553318, -0.014055220410227776, 0.043187420815229416, 0.002519723493605852, -0.07177291065454483, -0.11720805615186691, -0.01910378783941269, -0.023428328335285187, 0.006207393016666174, 0.0383448600769043, -0.0369601845741272, 0.0291184913367033, 0.030088797211647034, 0.018739724531769753, 0.01638886332511902, 0.019291916862130165, 0.02721613273024559, -0.010333741083741188, -0.046979207545518875, 0.009726546704769135, 0.02299417182803154, 0.020650532096624374, -0.014821870252490044, -0.0022343238815665245, -0.017156129702925682, 0.035368043929338455, -0.033811673521995544, 0.07211847603321075, 0.027260249480605125, -0.02503693290054798, 0.024861842393875122, -0.06646741926670074, -0.040793146938085556, -0.04536985605955124, -0.03565426543354988, -0.0014616025146096945, -0.03281451761722565, -0.009373769164085388, 0.008379623293876648, -0.00413904432207346, 0.053368207067251205, 0.022110959514975548, -0.0559021532535553, 0.01571372151374817, -0.07791969180107117, -0.031237998977303505, -0.005051709711551666, -0.013012188486754894, 0.0413435660302639, 0.015299078077077866, -0.06647935509681702, -0.0728849396109581, -0.019032958894968033, -0.02355988323688507, 0.011045848950743675, -0.00424843979999423, 0.013889732770621777, 0.04355333745479584, -0.05864235386252403, -0.04834892973303795, -0.0370720736682415, 0.02447633072733879, 0.05344069376587868, 0.002287599490955472, -0.022265836596488953, -0.022511901333928108, -0.0150090791285038, 0.0018731853924691677, -0.0008156932308338583, -0.005586444400250912, -0.016595127061009407, 0.029695916920900345, -0.015973513945937157, -0.05327862501144409, -0.011995943263173103, 0.016126452013850212, -0.001796576427295804, -0.041344959288835526, 0.010185237042605877, -0.0302948746830225, -0.02455124445259571, -0.00482475059106946, 0.050447016954422, -0.025243278592824936, 0.0013066602405160666, 0.011196211911737919, 0.012520229443907738, -0.20194362103939056, -0.04784471169114113, -0.0061177341267466545, -0.01398399192839861, 0.042255159467458725, -0.2053692638874054, 0.0471525564789772, -0.019985560327768326, -0.009194101206958294, 0.03730650991201401, -0.057834576815366745, 0.029514018446207047, 0.01462258119136095, -0.013653389178216457, 0.009199374355375767, -0.0452641099691391, 0.011574742384254932, -0.046619758009910583, 0.005994171369820833, -0.03722018003463745, -0.0041557541117072105, -0.014376338571310043, 0.0064619919285178185, 0.031521912664175034, 0.03632050380110741, 0.012018782086670399, 0.03867349401116371, -0.014569500461220741, 0.05554254725575447, 0.02803737297654152, -0.02243911102414131, 0.021273618564009666, -0.004253436345607042, -0.020226361230015755, 0.01297865528613329, 0.019156958907842636, 0.06919611990451813, 0.015338592231273651, 0.05283026769757271, 0.005300668068230152, 0.022570161148905754, 0.03142781928181648, -0.006015986204147339, -0.05938303843140602, -0.010195082053542137, 0.009784577414393425, 0.024668298661708832, -0.032920751720666885, -0.02977818064391613, 0.011113292537629604, 0.10433826595544815, -0.06198744475841522, -0.004487211350351572, 0.07291340082883835, 0.07510343939065933, 0.047100555151700974, 0.003900695126503706, -0.02402174472808838, 0.006609577219933271, -0.04102078080177307, -0.0141553720459342, 0.0005478694220073521, 0.03489723056554794, 0.04762544482946396, 0.0016573198372498155, -0.03282347694039345, 6.170321285026148e-05, -0.008987999521195889, 0.004136266186833382, 0.04542524367570877, 0.03203342482447624, -0.06426133960485458, 0.005171012599021196, -0.03186437860131264, 0.008953612297773361, -0.026731662452220917, 0.034837473183870316, 0.03867403417825699, 0.03581572324037552, 0.07504748553037643, 0.0487494058907032, 0.052009742707014084, -0.01927642710506916, 0.02570212446153164, 0.02500518411397934, 0.008639385923743248, 0.013458749279379845, 0.0023763375356793404, 0.009835906326770782, -0.0007755712140351534, 0.008151206187903881, 0.057011812925338745, 0.07286855578422546, 0.03270391374826431, 0.0353580005466938, -0.043856944888830185, 0.014348515309393406, 0.04224300757050514, -0.02689521200954914, -0.017645513638854027, -0.041082385927438736, -0.06097911298274994, -0.03223318234086037, -0.0023182444274425507, 0.0250784270465374, -0.01999896578490734, -0.14264486730098724, 0.009839781560003757, 0.01476739626377821, 0.05004327744245529, -0.013109171763062477, 0.03447381407022476, -0.02455412968993187, -0.04022557660937309, 0.018323831260204315, -0.011314920149743557, -0.013921785168349743, -0.012263196520507336, -0.025694867596030235, -0.013447836972773075, 0.050070762634277344, 0.00688284682109952, -0.007595014292746782, -0.006076824385672808, -0.004413803573697805, -0.029670681804418564, -0.05507813021540642, -0.03027833253145218, 0.05534329265356064, -0.01150891650468111, -0.06081826612353325, 0.03648202866315842, 0.009594999253749847, 0.0020481969695538282, 0.0027953179087489843, -0.017459191381931305, -0.004750674124807119, -0.018183885142207146, 0.06823946535587311, 0.008218792267143726, 0.0956929624080658, -0.11733265966176987, -0.0002693825226742774, -0.007334169000387192, -0.12414206564426422, -0.04247772693634033, 0.03032844141125679, 0.0011692336993291974, -0.005729045253247023, 0.015568750910460949, 0.04883429780602455, -0.028232844546437263, 0.01164593268185854, 0.006026354618370533, -0.010863793082535267, -0.007599367294460535, 0.017361070960760117, 0.007707636803388596, 0.014469052664935589, -0.03147101774811745, 0.017073364928364754, -0.005906041245907545, 0.0029912726022303104, -0.004067642148584127, 0.04520206153392792, 0.07218277454376221, 0.02471109852194786, 0.031931404024362564, 0.012340598739683628, 0.021425843238830566, 0.10228937864303589, 0.05064624175429344, -0.022938577458262444, 0.06234391778707504, -0.027988789603114128, 0.001456897589378059, 0.05596520006656647, -0.03486233949661255, -0.003249266417697072, -0.0014186815824359655, -0.007880487479269505, 0.017278186976909637, -0.009081830270588398, -0.02805357053875923, 0.012114925310015678, -0.015910187736153603, -0.03426450490951538, 0.03758687525987625, 0.004483862780034542, -0.03608832135796547, -0.02239859290421009, 0.03351956978440285, -0.007093566004186869, -0.00817650556564331, -0.02213945798575878, 0.026554539799690247, 0.017251210287213326, -0.014158833771944046, -0.009935213252902031, -0.04263656958937645, -0.0066611310467123985, 0.028096983209252357, -0.022630415856838226, -0.0400870218873024, -0.005348867271095514, -0.013756794854998589, 0.04401624575257301, -0.02033573016524315, -0.028941310942173004, -0.039611686021089554, 0.00952070765197277, 0.011517747305333614, 0.01732444390654564, -0.04394024237990379, -0.012088662944734097, -0.004718178883194923, 0.03521142899990082, -0.02271660976111889, 0.012789538130164146, -0.033808838576078415, 0.03287537768483162, -0.004659154452383518, -0.01978553645312786, -0.007606968283653259, 0.0043222056701779366, 0.004778807517141104, 0.08811614662408829, -0.02082114852964878, 0.03751403093338013, 0.02506311796605587, 0.02628518082201481, -0.07329928129911423, 0.0457923598587513, -0.010358847677707672, -0.0034904207568615675, -0.05456434190273285, 0.0011741137132048607, 0.023297317326068878, 0.06524404883384705, 0.04252506420016289, -0.026958849281072617, 0.013401788659393787, -0.008717279881238937, 0.007465665694326162, -0.011762927286326885, 0.006893610581755638, 0.04753943905234337, 0.010865218937397003, -0.046172674745321274, 0.029053231701254845, -0.021909834817051888, 0.035792842507362366, 0.010843866504728794, 0.0037493936251848936]" ./train/comic_book/n06596364_19168.JPEG,comic_book,"[-0.0075734080746769905, -0.0392167791724205, -0.04132494702935219, 0.023410480469465256, 0.00016574349137954414, -0.0027471587527543306, -0.0035665566101670265, 0.03417639434337616, -0.05594239383935928, 0.017458369955420494, -0.008145160973072052, -0.012836030684411526, 0.11851397901773453, -0.011058046482503414, -0.014767964370548725, 0.008747266605496407, 0.07753923535346985, 0.042428433895111084, 0.05838151276111603, -0.005722957197576761, -0.07393591105937958, 0.03438454866409302, -0.013704538345336914, 0.012943617068231106, 0.06782633811235428, -0.028905432671308517, 0.001646250719204545, 0.0008185331826098263, 0.010168886743485928, 0.013217110186815262, 0.08201102167367935, -0.00965879950672388, -0.022715380415320396, 0.01958799734711647, -0.005862009711563587, 0.038072433322668076, -0.03374621272087097, 0.03551426902413368, -0.035367175936698914, 0.17856721580028534, -0.02856491506099701, -0.00980484951287508, -0.021925490349531174, -0.02285880781710148, 0.03570614010095596, 0.0110423369333148, 0.033159468322992325, 0.021958520635962486, -0.02881052903831005, -0.01496418472379446, 0.027398662641644478, -0.023359067738056183, 0.02825198322534561, 0.03248613700270653, 0.015906941145658493, -0.05100079998373985, -0.03510664030909538, -0.03309972211718559, -0.011302693746984005, -0.0010863529751077294, -0.0075725894421339035, -0.013834170997142792, 0.026760587468743324, -0.006753207184374332, -0.011586280539631844, 0.0238933265209198, -0.015560652129352093, 0.046165015548467636, 0.0063017383217811584, -0.05021258816123009, 0.026515759527683258, -0.02673783153295517, -0.013804708607494831, -0.010734404437243938, -0.014171748422086239, -0.015290548093616962, 0.007457904517650604, -0.006143766921013594, -0.05172930285334587, -0.018461192026734352, 0.06632277369499207, 0.04219800606369972, -0.026599649339914322, -0.016742704436182976, 0.005502703599631786, 0.02354520559310913, -0.07354196906089783, 0.0005569406785070896, -0.06576526165008545, -0.008987780660390854, -0.012210462242364883, 0.051564715802669525, -0.4594579339027405, 0.026996517553925514, -0.03275524824857712, 0.04413954168558121, 0.009807380847632885, 0.013988158665597439, -0.013664454221725464, -0.05161372572183609, 0.06826822459697723, 0.019576990976929665, 0.016271615400910378, -0.02709389291703701, 0.032068882137537, -0.006424213293939829, -0.22442983090877533, -0.023081351071596146, -0.018110791221261024, -0.0016214445931836963, 0.021107438951730728, 0.06086551025509834, 0.015317639335989952, -0.020506955683231354, -0.016025053337216377, -0.03336731344461441, 0.019683070480823517, -0.006416674237698317, 0.023131487891077995, 0.01890714466571808, 0.007759772706776857, -0.05716891586780548, -0.01532353088259697, 0.031321872025728226, 0.007227846886962652, -0.010645183734595776, -0.026920028030872345, -0.002922080922871828, 0.006512350402772427, -0.0542304627597332, -0.029435889795422554, 0.01753770187497139, 0.014389324933290482, 0.08699657768011093, -0.07601958513259888, 0.02308681234717369, -0.03625568374991417, -0.002757937414571643, 0.0369609072804451, 0.012999986298382282, -0.015646614134311676, 0.008844630792737007, -0.0056491633877158165, -0.004279054701328278, 0.0024635992012917995, 0.005552672781050205, 0.050691522657871246, 0.03207721933722496, 0.03834272921085358, -0.01855647936463356, 0.038941506296396255, -0.0050940015353262424, -0.01439655665308237, -0.02147984877228737, -0.016463011503219604, 0.025190573185682297, 0.015292520634829998, 0.021708503365516663, -0.03896411880850792, -0.03146336227655411, 0.07554953545331955, -0.006362029351294041, 0.040365707129240036, 0.033612094819545746, 0.002664538798853755, 0.007311857771128416, -0.06899598240852356, 0.016228819265961647, 0.005449802614748478, -0.021115250885486603, -0.01914854161441326, 0.04227157682180405, 0.002735067391768098, 0.07921504229307175, 0.024774370715022087, -0.0447922945022583, -0.0369349829852581, -0.012068838812410831, -0.020212851464748383, -0.007282736711204052, 0.057906609028577805, 0.027469409629702568, 0.02908303216099739, 0.05647832527756691, 0.03677837550640106, 0.02679288201034069, 0.008923279121518135, -0.00947318784892559, -0.0013617142103612423, -0.04378087818622589, 0.03242333605885506, 0.02970820851624012, 0.022952117025852203, -0.01949300430715084, 0.02459503896534443, -0.059429217129945755, 0.009670652449131012, -0.007791103795170784, 0.05697007477283478, 0.03655119985342026, 0.02185755968093872, 0.07630835473537445, -0.007512602489441633, -0.1347581297159195, 0.0016068307450041175, -0.0268265251070261, -0.08389827609062195, 0.009901942685246468, -0.012721702456474304, 0.016907133162021637, 0.021986838430166245, 0.03370637819170952, 0.019617918878793716, 0.012830451130867004, 0.027644308283925056, -0.0205331239849329, 0.017366211861371994, 0.028820522129535675, -0.04307626560330391, -0.0036121257580816746, 0.0013430523686110973, -0.07256285101175308, 0.028639020398259163, 0.011452548205852509, 0.010649437084794044, 0.021181397140026093, 0.01410327386111021, -0.035547420382499695, -0.0187531691044569, -0.030336814001202583, -0.026294782757759094, -0.045217059552669525, 0.029289761558175087, 0.04676266014575958, 0.015036755241453648, -0.018853049725294113, -0.010737280361354351, 0.01091296412050724, 0.010447352193295956, -0.0331960991024971, 0.06609708070755005, -0.05072068050503731, 0.008154155686497688, -0.054035916924476624, -0.03831494599580765, -0.004982492886483669, 0.0008753910078667104, 0.0016726707108318806, 0.0022097211331129074, -0.0009035435505211353, -0.062130190432071686, -0.004675821401178837, -0.021493561565876007, -0.02210238017141819, 0.006340498104691505, -0.02080574631690979, 0.0037600852083414793, 0.026568077504634857, -0.13163919746875763, -0.028474560007452965, 0.0449010394513607, -0.016717514023184776, 0.03509128466248512, -0.0550919733941555, 0.002284076064825058, 0.020519372075796127, 0.042797524482011795, 0.014658850617706776, -0.016117537394165993, 0.03412177786231041, -0.010177915915846825, -0.005183536093682051, 0.02616143226623535, -0.04820292070508003, 0.007954759523272514, -0.03319525718688965, 0.008008357137441635, -0.045347440987825394, 0.012069438584148884, -0.026247473433613777, -0.00445032911375165, -0.046037692576646805, 0.017604107037186623, -0.036204468458890915, 0.027137596160173416, 0.016120756044983864, -0.011142757721245289, 0.03860881179571152, -0.021853161975741386, 0.02478606626391411, -0.04376220703125, -0.009301256388425827, 0.02342597395181656, -0.01971152238547802, 0.011474060826003551, -0.05305765941739082, 0.09551487118005753, -0.02188589610159397, -0.0027068029157817364, 0.0059955487959086895, 0.0562373548746109, -0.05862226337194443, -0.022487418726086617, -0.03693397343158722, 0.02266579680144787, -0.020822832360863686, 0.02275739051401615, -0.0021053259260952473, 0.05378914624452591, -0.02736339159309864, 0.020321130752563477, 0.052415139973163605, 0.08678495138883591, 0.015936071053147316, 0.020498231053352356, -0.051562149077653885, 0.0017211491940543056, -0.018631264567375183, -0.010595398023724556, 0.04121182858943939, -0.017528332769870758, -0.025485482066869736, 0.04138513281941414, -0.01815594732761383, 0.08002492785453796, -0.016945013776421547, 0.03217742219567299, 0.042553771287202835, 0.03521663323044777, -0.040476515889167786, -0.035155005753040314, 0.015413020737469196, 0.04568425193428993, -0.06831325590610504, 0.0037467312067747116, 0.032359492033720016, 0.06140461191534996, -0.005122253205627203, -0.026910748332738876, 0.059425435960292816, -0.029675433412194252, 0.023066719993948936, 0.0537591315805912, 0.019537607207894325, -0.03664856404066086, -0.03431200981140137, -0.02665676549077034, -0.007972653955221176, 0.014143443666398525, -0.029382919892668724, 0.027431752532720566, -0.00975112896412611, 0.05503304675221443, -0.02783159352838993, -0.018238769844174385, 0.11558832228183746, -0.00045904237776994705, -0.0037434932310134172, -0.03137222304940224, -0.06168602034449577, 0.003506455337628722, -0.0069327945820987225, 0.06135741248726845, -0.00582179706543684, -0.22980622947216034, 0.053045980632305145, -0.004516909830272198, 0.013611790724098682, -0.00520988367497921, -0.018432265147566795, -0.013029349967837334, 0.026859376579523087, 0.03368169441819191, -0.01397622935473919, 0.010612254031002522, -0.015372800640761852, 0.015191562473773956, -0.04811127483844757, 0.018309827893972397, -0.01851436123251915, -0.011044555343687534, -0.038285382091999054, -0.015433327294886112, -0.032734937965869904, -0.04102730005979538, -0.002493573585525155, -0.012299197725951672, -0.024362713098526, -0.03828776627779007, 0.007892425172030926, -0.06685607880353928, 0.004724751226603985, -0.05827952176332474, -0.0110542057082057, 0.004417048767209053, 0.00279973610304296, -0.0003323811979498714, 0.022047122940421104, 0.009315314702689648, -0.07979660481214523, -0.06017865240573883, -0.042863186448812485, -0.18405818939208984, -0.029232265427708626, 0.00973661057651043, 0.02522432431578636, -0.02125784568488598, 0.039705295115709305, 0.013724413700401783, -0.02493116445839405, -0.013614698313176632, 0.05149345472455025, 0.013519324362277985, 0.06738252937793732, 0.023952865973114967, 0.0020527669694274664, 0.02537829987704754, -0.03482840955257416, -0.011011532507836819, -0.017587510868906975, -0.00732528418302536, 0.02273298054933548, 0.0018716335762292147, -0.017248881980776787, 0.0540875680744648, 0.01979297399520874, 0.0006701254169456661, 0.033342279493808746, 0.15464341640472412, 0.02440178394317627, 0.0080115320160985, 0.044511083513498306, 0.003749311435967684, -0.018762929365038872, 0.07367789000272751, -0.024637112393975258, -0.08144330978393555, 0.00448834802955389, 0.0183805413544178, -0.022198038175702095, -0.02874043583869934, -0.048229627311229706, 0.02261461317539215, -0.04846847057342529, 0.005849774461239576, 0.04208004102110863, 0.035263922065496445, -0.0075289704836905, 0.068028025329113, 0.03226681053638458, -0.016161570325493813, -0.009602437727153301, -0.032184768468141556, 0.0002310315758222714, -0.0032920404337346554, -0.06833364814519882, 0.03222832828760147, -0.006238406524062157, -0.01863509975373745, 0.06572136282920837, -0.03365364670753479, -0.015542871318757534, -0.002266793278977275, 0.022595005109906197, -0.026809334754943848, -0.016274409368634224, 0.017918333411216736, 0.027088450267910957, -0.022721966728568077, 0.04030464589595795, 0.023891087621450424, -0.03406323865056038, -0.024646585807204247, -0.016666455194354057, 0.01760444976389408, -0.040237151086330414, 0.01127343438565731, -0.020510796457529068, 0.012942001223564148, -0.011081291362643242, 0.0012012169463559985, -0.013068404980003834, -0.04879707470536232, 0.027917735278606415, 0.04280540719628334, 0.01975301466882229, 0.0031783226877450943, 0.008129515685141087, 0.011539943516254425, -0.0356949046254158, 0.02718474715948105, 0.018909873440861702, 0.06716960668563843, -0.07683948427438736, 0.0038562326226383448, 0.037503380328416824, 0.011514843441545963, 0.005139329470694065, -0.04159645736217499, 0.034766484051942825, 0.014494855888187885, 0.0283579733222723, -0.007645134814083576, 0.043914925307035446, 0.047681815922260284, -0.015695415437221527, 0.003333093598484993, -0.02720281295478344, -0.03136717900633812, 0.043579716235399246, 0.04132308438420296, 0.025464104488492012]" ./train/comic_book/n06596364_11921.JPEG,comic_book,"[-0.03232068195939064, 0.04956108704209328, 0.012767831794917583, 0.002983315149322152, 0.0177906583994627, 0.008335416205227375, 0.01659708470106125, -0.020597822964191437, -0.0670865848660469, 0.0036641834303736687, 0.018850000575184822, 0.03586186096072197, 0.1396111249923706, 0.02426804229617119, 0.03889600932598114, -0.03481167182326317, 0.05104054883122444, -0.04916470870375633, 0.01518381666392088, 0.00071333086816594, 0.014371675439178944, -0.024413738399744034, -0.014695615507662296, 0.04938628897070885, 0.04163359850645065, -0.019263386726379395, 0.0584687739610672, -0.016062481328845024, -0.026488546282052994, -0.021827222779393196, 0.019978482276201248, 0.019510386511683464, -0.021380722522735596, -0.021903691813349724, -0.020835522562265396, 0.028007857501506805, 0.01618075557053089, 0.011170879937708378, 0.010420710779726505, -0.05325399711728096, 0.03299431875348091, -8.229853119701147e-05, -0.008249162696301937, -0.051642123609781265, -0.008455393835902214, 0.08334510773420334, 0.0024272596929222345, 0.09046302735805511, -0.033838484436273575, 0.033624615520238876, -0.013896177522838116, 0.03877773880958557, -0.024970227852463722, 0.004368877504020929, -0.02397081069648266, -0.027393655851483345, -0.0023518395610153675, -0.010848219506442547, -0.06560560315847397, 0.01736992970108986, 0.06644467264413834, -0.007299103308469057, 0.040345095098018646, -0.002089054323732853, -0.0002608828363008797, 0.030113810673356056, -0.006439268589019775, -0.006003697402775288, -0.0396762415766716, 0.011478189378976822, 0.0033089187927544117, -0.039766792207956314, 0.04372672736644745, -0.044506337493658066, 0.019214019179344177, -0.010381308384239674, 0.014700216241180897, -0.0037491414695978165, -0.03588271513581276, -0.02064378932118416, 0.025706229731440544, -0.0037730480544269085, -0.006170461419969797, -0.041656482964754105, 0.03608817979693413, 0.04933605343103409, -0.022316601127386093, -0.006474996916949749, -0.08384421467781067, -0.022508978843688965, -0.04175947234034538, 0.031373120844364166, -0.549049437046051, 0.00935344398021698, 0.030962325632572174, 0.020846452564001083, 0.010029959492385387, -0.01795807294547558, 0.1105162650346756, 0.012127751484513283, 0.0313420332968235, 0.022326597943902016, 0.024427464231848717, -0.013746379874646664, 0.07110211998224258, -0.004424179904162884, -0.14168806374073029, -0.014955775812268257, 0.023671256378293037, 0.008171511813998222, 0.014067542739212513, -0.09136513620615005, -0.04720297455787659, 0.030500389635562897, 0.013046057894825935, -0.032354459166526794, 0.0041374205611646175, -0.039429496973752975, -0.02349419891834259, -0.005885253194719553, 0.013266654685139656, 0.06782074272632599, 0.006242695264518261, 0.02417212724685669, -0.011139710433781147, -0.020834818482398987, -0.0009208667324855924, 0.012535395100712776, -0.031276073306798935, -0.054778359830379486, 0.025922631844878197, 0.025941884145140648, -0.014931704849004745, 0.0852932259440422, 0.0037072766572237015, -0.0032733601983636618, 0.01807916723191738, -0.008815614506602287, -0.01926628313958645, 0.01183316670358181, 0.013648897409439087, 0.025947697460651398, -0.045996155589818954, 0.023658987134695053, -0.0202046949416399, 0.03636067733168602, -0.01536272931843996, -0.000390736066037789, -0.018245525658130646, -0.011943557299673557, 0.0007557233329862356, -0.0025695792865008116, 0.04303089901804924, -0.014892157167196274, -0.05795429274439812, -0.040836963802576065, 0.0019087130203843117, 0.027668612077832222, 0.026663878932595253, 0.020947659388184547, -0.016861191019415855, -0.04778502136468887, -0.02091146819293499, 0.0062612262554466724, -0.032018229365348816, -0.01977863535284996, -0.0740428939461708, 0.05694124475121498, -0.0386534221470356, -0.05892620235681534, 0.017412694171071053, 0.018700655549764633, 0.004314462188631296, -0.02868293784558773, -0.00606580451130867, -0.037424467504024506, -0.03830115124583244, 0.010902938432991505, -0.020619362592697144, 0.04055191949009895, 0.03607654571533203, -0.04420160502195358, 0.010777791030704975, -0.010949727147817612, 0.024939127266407013, 0.03484020754694939, 0.016617154702544212, -0.05851126089692116, -0.016743363812565804, -0.02506381832063198, 0.011546192690730095, 0.02572309598326683, 0.016819242388010025, 0.04545747488737106, 0.01052597165107727, -0.001836981624364853, 0.0015324781415984035, -0.006306140683591366, 0.04942717403173447, 0.02944069355726242, -0.045897334814071655, -0.03366975858807564, 0.019986890256404877, -0.0020919758826494217, 0.0006107314256951213, -0.04346640035510063, -0.05809415131807327, 0.007558623794466257, 0.06977660953998566, -0.017504911869764328, -0.09509623050689697, 0.03853999823331833, 0.0011781764915212989, -0.011735495179891586, 0.009448863565921783, 0.009858004748821259, -0.013999314047396183, 0.021618252620100975, 0.007758726365864277, -0.039113759994506836, -8.006072312127799e-05, -0.00887925922870636, -0.008396260440349579, -0.021650370210409164, -0.019696764647960663, 0.04295269027352333, 0.01987178809940815, -0.018025623634457588, 0.01460298802703619, -0.03231678903102875, -0.01560299377888441, -0.014891570433974266, 0.02557831071317196, 0.02855803072452545, 0.011129839345812798, 0.07520196586847305, -0.010534466244280338, -0.01976204477250576, -0.013388220220804214, 0.0011737431632354856, 0.0073147607035934925, 0.009996172040700912, -0.05524289608001709, -0.005681383423507214, 0.014160593040287495, -0.0032290504314005375, -0.003674074076116085, 0.009566395543515682, -0.04286990687251091, 0.047831784933805466, 0.0081739891320467, 0.019033508375287056, 0.020037231966853142, -0.008490338921546936, -0.0393507219851017, 0.004563183523714542, -0.029564039781689644, -0.03833097219467163, -0.3156992793083191, -0.010689235292375088, 0.0012397738173604012, -0.028119487687945366, 0.0073957787826657295, -0.12537935376167297, -0.008124224841594696, 0.010365375317633152, 0.05741528794169426, -0.020669808611273766, -0.010602698661386967, 0.004875809419900179, -0.0020566831808537245, -0.001266778097487986, 0.03923844173550606, -0.02689410001039505, -0.03353652358055115, -0.012016610242426395, -0.06027912348508835, 0.022156359627842903, -0.012886014766991138, 0.06128821521997452, 0.04621761292219162, 0.003992833197116852, -0.039688706398010254, -0.04946453496813774, -0.02783685363829136, 0.05649834871292114, 0.0007562093087472022, -0.009294223040342331, 0.017305148765444756, 0.00410872045904398, -0.04113508388400078, -0.044170182198286057, 0.023203229531645775, 0.011877157725393772, -0.007471295539289713, -0.01244940422475338, 0.03559368476271629, 0.017464054748415947, -0.022294849157333374, 0.013562030158936977, -0.03920765221118927, -0.03113618679344654, -0.007316425908356905, 0.01026378944516182, -0.0019757638219743967, -0.006704545579850674, 0.02570950612425804, 0.013312830589711666, 0.054464191198349, -0.040961019694805145, -0.0056104836985468864, 0.019837064668536186, 0.08507773280143738, 0.039067793637514114, -0.025385474786162376, 0.04806004837155342, 0.012676644138991833, 0.0384460873901844, -0.0590655617415905, 0.036507800221443176, -0.01139881368726492, 0.017646344378590584, -0.010138341225683689, -0.0012460307916626334, 0.03095211274921894, 0.018643194809556007, 0.03191753476858139, 0.03052544966340065, -0.005591428838670254, -0.05739075317978859, -0.007270326372236013, 0.016727406531572342, 0.009799680672585964, 0.007855354808270931, 0.022044481709599495, 0.035215236246585846, -0.018842903897166252, -0.0034511862322688103, 0.0011958248214796185, 0.03806191682815552, -0.012267031706869602, -0.01256926916539669, 0.0154263935983181, -0.03732415661215782, 0.021824149414896965, -0.008039494976401329, -0.04596323147416115, 0.03551415354013443, 0.011838329955935478, -0.030573753640055656, -0.028212813660502434, 0.007030196022242308, 0.030415326356887817, -0.021831804886460304, -0.016284476965665817, 0.018220707774162292, 0.011206373572349548, 0.014423203654587269, 0.002270875498652458, 0.007203103508800268, -0.061856627464294434, 0.03571416437625885, 0.012098309583961964, -0.018818166106939316, -0.13451822102069855, -0.02258358523249626, 0.013261170126497746, -0.023532412946224213, -0.006340009160339832, 0.0038522982504218817, -0.03225841373205185, 0.028977680951356888, 0.012086416594684124, 0.004097979050129652, 0.050753992050886154, -0.022453216835856438, 0.0320918895304203, 0.026947595179080963, 0.021974584087729454, -0.025221897289156914, 0.020923424512147903, -0.08332322537899017, 0.01669861003756523, -0.02268913947045803, 0.01704886369407177, -0.006434114184230566, 0.014833184890449047, 0.0349283404648304, -0.03682472184300423, 0.05763688683509827, 0.025961918756365776, -0.040277302265167236, 0.007165597751736641, -0.02899496629834175, -0.007545645348727703, 0.04182932525873184, 0.01133184414356947, 0.017767542973160744, 0.08364102244377136, -0.04065375402569771, -0.03511786460876465, -0.0024710434954613447, -0.09370478987693787, -0.029377222061157227, 0.04137848690152168, 0.03454265370965004, 0.06226016581058502, -0.0009863018058240414, 0.0108136972412467, -0.04854787513613701, -0.11582808941602707, 0.04261518642306328, -0.037113893777132034, -0.04193579778075218, 0.007281975354999304, -0.011610638350248337, 0.03259940445423126, -0.03998546674847603, -0.009789172559976578, -0.03381789103150368, 0.000979651347734034, 0.0346074141561985, 0.045819297432899475, -0.03970647603273392, 0.0041396282613277435, -0.0012465758481994271, -0.047906845808029175, 0.025790775194764137, 0.06941398233175278, 0.025041824206709862, 0.003499888814985752, 0.050889939069747925, -0.04094206914305687, -0.03493139520287514, -0.004680401645600796, -0.013349032029509544, -0.03242543712258339, 0.03607277572154999, 0.006170730572193861, -0.008081612177193165, -0.0313500352203846, -0.0257753636687994, -0.0677691251039505, -0.03334993124008179, -0.055012308061122894, 0.0008164698374457657, 0.03424447774887085, -0.06889718770980835, 0.02791079506278038, 0.04569172114133835, -0.03225386142730713, -0.020045829936861992, -0.010171812027692795, 0.03538394719362259, -0.017090830951929092, 0.0009246793342754245, 0.04525257274508476, -0.010464047081768513, 0.011841956526041031, -0.021144971251487732, 0.016126012429594994, -0.002585738431662321, -0.04086786508560181, -0.020659925416111946, -0.018161967396736145, -0.0002799364156089723, -0.03535152226686478, -0.007982254959642887, -0.03258195519447327, 0.0011930150212720037, 0.013936466537415981, -0.04103502258658409, 0.042885199189186096, -0.05580713599920273, 0.033446405082941055, 0.004378157667815685, 0.014184714294970036, 0.03130289912223816, 0.018764860928058624, -0.024045061320066452, 0.003926090896129608, -0.058460962027311325, -0.02153114229440689, 0.03351990133523941, -0.0015933167887851596, 0.04257223382592201, 0.03646661713719368, -0.008291310630738735, -0.007516488898545504, -0.07958962768316269, -0.0038862526416778564, -0.03381534665822983, -0.004672825802117586, -0.04385823383927345, 0.0035916052293032408, -0.05716463923454285, 0.04208603873848915, 0.0165113378316164, -0.0007561254897154868, 0.015587211586534977, -0.0011662394972518086, -0.03637225553393364, 0.028556210920214653, 0.016908682882785797, 0.038787227123975754, 0.022731008008122444, -0.02066146768629551, 0.014838074333965778, 0.00243680109269917, 0.008595569059252739, 0.02990896999835968, -0.008287778124213219]" ./train/comic_book/n06596364_5634.JPEG,comic_book,"[0.02278291806578636, 0.010714109055697918, -0.007715551648288965, 0.03828369081020355, 0.0012191582936793566, -0.03754296153783798, 0.05995146930217743, 0.012168927118182182, -0.008397017605602741, -0.019560523331165314, -0.011979893781244755, 0.007870838046073914, 0.00934806652367115, -0.00875258632004261, -0.012873221188783646, -0.021808398887515068, 0.07974550127983093, 0.016022250056266785, 0.03372178226709366, -0.01871766336262226, -0.06041751801967621, 0.004808047786355019, -0.00036612851545214653, -0.02763430029153824, 0.003616967936977744, 0.09133343398571014, 0.022943787276744843, -0.005903317127376795, 0.016074908897280693, 0.013646207749843597, 0.023790394887328148, -0.022470129653811455, 0.006703434977680445, 0.015226799063384533, 0.026322966441512108, 0.04130081087350845, 0.023535231128335, 0.05430537089705467, -0.0052252160385251045, 0.10867944359779358, -0.006949513219296932, -0.08054181188344955, -0.01724589243531227, 0.017206314951181412, 0.01819230057299137, -0.07866297662258148, -0.03848070278763771, 0.0299333818256855, 0.011056139133870602, 0.03784354776144028, 0.02636932022869587, 0.038600921630859375, 0.02678055875003338, 0.03374382480978966, -0.02835686318576336, 0.04035278782248497, 0.015378148294985294, -0.020100949332118034, -0.013088441453874111, -0.04290587082505226, 0.00918983481824398, -0.00903104804456234, 0.040680497884750366, 0.018144089728593826, -0.009133013896644115, 0.04936623200774193, -0.008774586021900177, 0.05293499305844307, 0.01457623764872551, -0.024413835257291794, 0.03129655122756958, -0.05172611400485039, -0.0018229641718789935, -0.02335902862250805, 0.046630632132291794, -0.04491804540157318, 0.005267675034701824, 0.005902173928916454, -0.01433439552783966, -0.00456735584884882, 0.027894647791981697, 0.046616923063993454, -0.0021088982466608286, -0.023509306833148003, -0.027938835322856903, 0.023330172523856163, -0.026756247505545616, -0.0034090266562998295, -0.06662896275520325, -0.013127986341714859, 0.020520225167274475, 0.04972388967871666, -0.5536361336708069, -0.00588957779109478, 0.0009106057696044445, 0.02062578871846199, 0.0494198314845562, -0.004584417212754488, 0.005967416800558567, -0.014547722414135933, 0.0470973439514637, 0.005532069131731987, -0.0234108567237854, 0.010397589765489101, 0.04281345754861832, -0.03512053191661835, -0.18994149565696716, -0.05110408738255501, -0.00107298931106925, 0.03486483916640282, -0.008669828064739704, -0.01620328053832054, -0.0002888506860472262, 0.009608771651983261, -0.0026158939581364393, -0.010582796297967434, 0.03939966484904289, 0.01876845397055149, 0.05712221935391426, 0.012293538078665733, 0.019348790869116783, -0.016274256631731987, -0.003655781736597419, 0.018534788861870766, 0.005486813373863697, -0.038687463849782944, 0.04249228164553642, -0.01849854551255703, 0.027259577065706253, -0.0276618804782629, 0.02758091874420643, -0.05322888493537903, -0.019207637757062912, 0.08241502195596695, -0.05092253535985947, -0.021502669900655746, -0.020146053284406662, -0.057139068841934204, 0.030238430947065353, 0.05848051235079765, -0.012962104752659798, 0.0177494827657938, -0.06895634531974792, 0.04871572554111481, -0.005735326092690229, 0.002349921502172947, 0.001362595590762794, -0.07918131351470947, 0.039441853761672974, 0.0038835620507597923, 0.010740515775978565, 0.01764899305999279, -0.07083335518836975, -0.0066147735342383385, 0.005338068585842848, -0.02687201090157032, 0.014885837212204933, -0.05326645076274872, -0.007685713469982147, -0.017291363328695297, 0.07766877859830856, -0.04978622868657112, -0.0021909731440246105, 0.008041639812290668, -0.031209181994199753, 0.01779673621058464, -0.0033875852823257446, 0.010362516157329082, -0.012577086687088013, -0.021643927320837975, -0.0702449381351471, 0.01895967125892639, -0.04406481608748436, -0.0021553761325776577, -0.0094309626147151, -0.02920720726251602, -0.021516896784305573, 0.020225657150149345, -0.04060838371515274, -0.011357653886079788, 0.0172604750841856, -0.026021819561719894, -0.017999401316046715, 0.025532275438308716, 0.014483407139778137, -0.005916651338338852, -0.003760470077395439, 0.01857871003448963, -0.01199154369533062, -0.033317629247903824, 0.015916066244244576, -0.02604486420750618, 0.0267083328217268, 0.003955301828682423, -0.023992685601115227, 0.014414217323064804, 0.03479933738708496, -0.009492500685155392, 0.06959349662065506, 0.025977205485105515, -0.0302964486181736, 0.06493722647428513, 0.021518182009458542, -0.03227981925010681, -0.023518143221735954, -0.012472824193537235, -0.022502202540636063, -0.0038656906690448523, -0.003180701984092593, -0.013826972804963589, -0.018830152228474617, -0.004732377827167511, 0.005410610698163509, -0.004609653260558844, 0.04866495728492737, -0.047304917126894, -0.021408207714557648, 0.006491207052022219, -0.00809047743678093, 0.000389875698601827, 0.012829430401325226, -0.07793435454368591, -0.060267459601163864, 0.001528856111690402, 0.01888248883187771, 0.02926034666597843, -0.010016805492341518, -0.038043517619371414, -0.043071359395980835, -0.007596050854772329, -0.05300319939851761, -0.03595402464270592, 0.049444254487752914, 0.026446551084518433, 0.01850086823105812, -0.02565792202949524, -0.016764797270298004, -0.02967236563563347, -0.015627870336174965, 0.02046816423535347, 0.03836417570710182, 0.0028193434700369835, -0.02092665620148182, 0.0493210032582283, -0.01011436153203249, 0.027660002931952477, -0.004180897027254105, -0.002731241751462221, -0.006145032588392496, 0.046546757221221924, -0.036257728934288025, 0.06669924408197403, -0.03575420752167702, 0.023379269987344742, -0.03930774703621864, 0.020719246938824654, -0.025794742628932, 0.0274630319327116, -0.17890805006027222, -0.08119736611843109, 0.009368526749312878, 9.815386147238314e-05, 0.008274816907942295, -0.10486447811126709, 0.04205513745546341, -0.02323857694864273, 0.033532049506902695, 0.04720637947320938, -0.0020564435981214046, 0.021161647513508797, 0.002652551978826523, -0.005670380778610706, 0.009848512709140778, 0.005461185704916716, -0.01979818567633629, -0.022967655211687088, 0.0030060075223445892, -0.024041322991251945, -0.004997418727725744, 0.023216640576720238, 0.017163407057523727, 0.024849429726600647, 0.07371532917022705, 0.02655448019504547, 0.01281013060361147, -0.03592744842171669, -0.04460083320736885, -0.004432355985045433, -0.07374929636716843, 0.012140396982431412, -0.02574395388364792, -0.0007491694996133447, 0.016913525760173798, -0.003550079185515642, 0.09013833850622177, 0.020799119025468826, 0.06269139051437378, 0.029389724135398865, -0.002857875544577837, -0.0146228838711977, 0.00649100448936224, -0.017054865136742592, -0.035581301897764206, -0.002207280835136771, 0.014727170579135418, 0.02736670710146427, 0.009736601263284683, 0.025650830939412117, 0.04245918244123459, -0.004061925690621138, -0.013017923571169376, 0.08277630805969238, 0.08219960331916809, 0.06848441809415817, 0.006421186961233616, -0.04557408392429352, -0.00473087327554822, 0.014448052272200584, 0.009408286772668362, 0.0046000052243471146, -0.008186235092580318, 0.014530734159052372, 0.017121676355600357, -0.013911719433963299, 0.07877053320407867, 0.018779240548610687, -0.019050445407629013, 0.03515903279185295, 0.006436478346586227, -0.02788049541413784, 0.013045504689216614, -0.03803861513733864, -0.013140290975570679, -0.05955791100859642, 7.227725291159004e-05, 0.0031095100566744804, 0.02082495391368866, 0.02894035167992115, 0.013729581609368324, 0.06511018425226212, -0.05382349714636803, -0.019542330875992775, 0.02763984724879265, -0.015885327011346817, -0.052600495517253876, -0.013629847206175327, 0.029057268053293228, 0.03548717871308327, 0.004804663360118866, -0.002178249880671501, 0.06726887077093124, 0.006244539748877287, 0.02046012319624424, -0.029066933318972588, 0.01247150544077158, 0.02930375561118126, -0.055427100509405136, 0.10180946439504623, -0.05175447463989258, -0.010070965625345707, -0.05409272760152817, 0.015288016758859158, 0.005455006845295429, -0.06596335768699646, -0.13794751465320587, 0.04496874660253525, -0.02909564971923828, 0.09915053099393845, -0.05265616625547409, 0.017380569130182266, 0.005808207672089338, 0.040670644491910934, 0.018570436164736748, 0.007142285816371441, -0.010743306018412113, 0.012212134897708893, 0.07403355836868286, -0.010044898837804794, 0.04811261221766472, -0.007340068928897381, -0.008506747893989086, -0.03794119507074356, -0.01807250641286373, -0.025089383125305176, -0.06518004089593887, 0.02453671582043171, 0.025171304121613503, 0.014221870340406895, -0.03981944918632507, -0.009126214310526848, -0.029314246028661728, 0.027066675946116447, 0.014764755964279175, -0.010035325773060322, 0.010537996888160706, 0.007214149460196495, 0.09993812441825867, -0.020444355905056, 0.028240714222192764, -0.07495491951704025, 0.048921555280685425, -0.048306576907634735, -0.1544017791748047, -0.07183020561933517, -0.004375177435576916, -0.003332160646095872, 0.009136302396655083, -0.020409319549798965, 0.010898321866989136, -0.013926369138062, 0.06752203404903412, 0.015703225508332253, 0.023227693513035774, 0.009561080485582352, 0.01244531199336052, 0.03678577393293381, -0.010002863593399525, -0.04733531177043915, 0.030079929158091545, -0.02792486734688282, -0.07453355193138123, 0.008455480448901653, 0.04300127178430557, 0.05636512488126755, 0.02713395655155182, 0.025184469297528267, 0.03525901213288307, 0.051724623888731, 0.013680039905011654, 0.02234935574233532, 0.03831316903233528, 0.0032312648836523294, 0.008735999464988708, -0.060450322926044464, 0.04457836225628853, -0.017685428261756897, -0.059938348829746246, 0.010068574920296669, 0.03385264798998833, 0.013108567334711552, -0.012754715979099274, -0.01596805267035961, 0.006510739680379629, -0.00030026890453882515, -0.025988975539803505, 0.04257623851299286, -0.002357305260375142, -0.008150085806846619, -0.02173924632370472, -0.01635204255580902, -0.04664109647274017, -0.05180521681904793, 0.008866100572049618, 0.01984943263232708, -0.0058786519803106785, -0.01442826259881258, 0.001324211247265339, -0.011135472916066647, -0.010659541934728622, 0.015667514875531197, -0.017710523679852486, -0.012718301266431808, -0.00924527458846569, -0.025702254846692085, 0.014953539706766605, -0.068095862865448, -0.07496732473373413, 0.006601117551326752, 0.0033879890106618404, -0.01821688935160637, 0.010452289134263992, -0.00332230725325644, 0.006698247045278549, -0.0352042019367218, 0.02461949735879898, -0.0366690419614315, 0.033147238194942474, -0.023327836766839027, -0.019010409712791443, -0.01163498591631651, -0.034806571900844574, 0.001692434772849083, -0.036857347935438156, 0.04849425330758095, 0.05124053359031677, -0.012332125566899776, -0.0046265264973044395, 0.02602471597492695, 0.02381916344165802, -0.025155017152428627, 0.05584115907549858, -0.018049178645014763, 0.033852048218250275, -0.07316042482852936, 0.016361849382519722, 0.04377460107207298, 0.05410135164856911, 0.0005553173832595348, -0.03796594589948654, 0.0016691554337739944, 0.03609655797481537, 0.024317869916558266, 0.0027603746857494116, 0.011666038073599339, 0.012349972501397133, 0.00015984050696715713, -0.026040634140372276, 0.010473539121448994, -0.07067051529884338, 0.02291511744260788, -0.02319248951971531, 0.031416378915309906]" ./train/comic_book/n06596364_4445.JPEG,comic_book,"[-0.03537631779909134, 0.04721193388104439, 0.03460888937115669, -0.00247542024590075, 0.019422806799411774, -0.011496305465698242, 0.026869909837841988, 0.04199838638305664, 0.013398301787674427, -0.03311457484960556, 0.05084237828850746, 0.012944589368999004, 0.022482506930828094, -0.010272319428622723, 0.0033241298515349627, 0.005655850283801556, 0.08605723828077316, 0.05736646056175232, 0.033034391701221466, -0.008324113674461842, -0.03701192885637283, -0.0027696695178747177, 0.004108042921870947, -0.021287519484758377, -0.05175251141190529, 0.07951352000236511, 0.03494158387184143, 0.02432052232325077, -0.0008706781081855297, 0.057866599410772324, 0.0051901754923164845, -0.01801198162138462, -0.0018662640359252691, 0.017831221222877502, -0.04119974374771118, -0.0032413206063210964, -0.018426688387989998, -0.0005230117822065949, -0.03677074983716011, 0.04293183237314224, -0.02920365519821644, -0.04405488818883896, -0.03427812457084656, 0.01751715876162052, 0.03486669436097145, -0.05520132556557655, 0.0029069241136312485, 0.03348192200064659, 0.05686148628592491, 0.012560986913740635, 0.005322106648236513, -0.005792947951704264, -0.017330802977085114, 0.040254462510347366, 0.008177565410733223, -0.018801134079694748, 0.03238498792052269, 0.004388326313346624, 0.010713119059801102, 0.02323206700384617, -0.028048837557435036, -0.036847297102212906, 0.023708783090114594, -0.02272919751703739, 0.0005524437874555588, 0.021668875589966774, -0.007481752894818783, 0.0092579685151577, 0.0019740459974855185, 0.006351891905069351, 0.02912638522684574, -0.029343733564019203, -0.018886128440499306, -0.04123132675886154, 0.04639718681573868, 0.0054942285642027855, -0.023462926968932152, -0.04313664510846138, -0.009701459668576717, 0.0035370367113500834, 0.003934245090931654, -0.013689221814274788, 0.02291582152247429, -0.025918876752257347, -0.02825998142361641, 0.01414834801107645, -0.06480560451745987, -0.054998524487018585, -0.0342462919652462, -0.026745101436972618, -0.008134199306368828, 0.006961944047361612, -0.545232892036438, 0.07048211991786957, 0.01676141284406185, -0.006476788315922022, 0.04396457597613335, 0.030887220054864883, 0.05493328720331192, 0.03712977096438408, 0.0257679782807827, 0.0034507603850215673, -0.019963199272751808, -0.03279603645205498, -0.017604993656277657, 0.023087624460458755, -0.19855690002441406, -0.013430694118142128, 0.021830381825566292, 0.05402400717139244, 0.03475412726402283, -0.024762485176324844, 0.05697287991642952, -0.0012863145675510168, -0.019896680489182472, -0.018004225566983223, 0.03156251832842827, 0.05851076915860176, 0.012504803016781807, -0.04125058650970459, 0.018422000110149384, 0.00836305133998394, 0.028168801218271255, 0.033768873661756516, 0.03278131037950516, -0.013082905672490597, -0.003539069788530469, -0.013996805995702744, 0.007546551991254091, -0.039707597345113754, -0.009206317365169525, -0.02166464366018772, -0.011472471058368683, 0.08178301900625229, -0.02722250483930111, 0.03009076416492462, 0.01916966773569584, -0.0224654208868742, 0.060991205275058746, 0.021725688129663467, -0.024334093555808067, 0.011890973895788193, -0.013402373529970646, 0.015672624111175537, 0.022813070565462112, 0.06623299419879913, -0.009659896604716778, -0.03237055987119675, 0.02980037033557892, 0.013760755769908428, 0.008693750016391277, 0.0037703183479607105, -0.06242748349905014, -0.0027284894604235888, -0.01564033329486847, 5.638337825075723e-05, 0.012974505312740803, -0.028618577867746353, 0.04121456667780876, -0.010379976592957973, 0.030397795140743256, -0.034636951982975006, 0.011304467916488647, 0.03163678199052811, 0.008950907737016678, 0.00760679692029953, -0.046741362661123276, 0.004914832301437855, 0.00784908514469862, -0.01931334286928177, 0.001226070336997509, -0.008829297497868538, -0.057437073439359665, 0.0077536143362522125, -0.03671308979392052, -0.05665623024106026, 0.07618199288845062, 0.0373518168926239, -0.024586908519268036, 0.026812421157956123, -0.010069639421999454, -0.031336281448602676, -0.011000394821166992, -0.023058941587805748, 0.026807421818375587, 0.023416999727487564, -0.0014485721476376057, 0.00531307328492403, 0.006515896413475275, -0.0400901734828949, 0.020151689648628235, -0.036268435418605804, -0.004223746247589588, -0.04106368497014046, 0.002882009372115135, -0.03082883730530739, 0.006847965996712446, -0.03847340866923332, 0.045947011560201645, 0.013417955487966537, 0.010104941204190254, 0.021033281460404396, 0.02120537869632244, -0.03309553116559982, -0.047716330736875534, -0.01722997985780239, -0.032222796231508255, -0.025791794061660767, 0.038874827325344086, -0.05300474911928177, -0.017024215310811996, -0.03606994077563286, 0.009303338825702667, -0.018019545823335648, 0.025534233078360558, -0.01630048267543316, -0.02529435232281685, -0.011416942812502384, 0.015591839328408241, -0.01620500721037388, 0.016015715897083282, -0.03312250226736069, 0.004991405177861452, -0.04028669744729996, 0.04522809758782387, 0.014166970737278461, -0.018000716343522072, -0.037549253553152084, -0.02676665410399437, -0.054778799414634705, -0.0346207432448864, 0.005038178525865078, -0.015264172106981277, 0.004040750674903393, 0.03802113980054855, -0.027884285897016525, -0.04486324265599251, -0.021161286160349846, -0.02073037251830101, -0.01135482918471098, 0.006044704932719469, -0.013007261790335178, -0.011120769195258617, -0.029822176322340965, -0.04054015129804611, -0.029853571206331253, 0.04319758713245392, 0.025446375831961632, 0.0396217443048954, 0.0018867447506636381, -0.04374804347753525, 0.008201006799936295, 0.02640656940639019, 0.006227842066437006, -0.014255838468670845, -0.003515841905027628, -0.013195117935538292, 0.07139953970909119, -0.18414568901062012, -0.06409422308206558, -0.005450227297842503, -0.02631138265132904, 0.0405983030796051, -0.1297324001789093, 0.015151151455938816, -0.02296392247080803, 0.013143501244485378, 0.028875920921564102, -0.04141950234770775, 0.03796223923563957, 0.002108067274093628, -0.016453377902507782, -0.00462385406717658, -0.042524900287389755, -0.0034418953582644463, 0.001979404827579856, 0.03460315614938736, -0.01862283982336521, -0.036074891686439514, 0.06490186601877213, 0.039989158511161804, 0.016064636409282684, 0.0608399361371994, 0.009385937824845314, 0.022813871502876282, -0.0005786807741969824, 0.0662379339337349, 0.018234048038721085, -0.029602546244859695, 0.007530051749199629, 0.00853284914046526, -0.03412877395749092, 0.017184598371386528, 0.04762422665953636, 0.03413499891757965, 0.008850334212183952, 0.0018308559665456414, -0.0007278090342879295, 0.006826998200267553, 0.006163016892969608, 0.0005765499081462622, 0.014607330784201622, 0.03142781928181648, -0.05532176420092583, -0.005028828512877226, 0.005612468812614679, 0.025072375312447548, -0.0013992233434692025, 0.057935718446969986, 0.04251180589199066, 0.013269119895994663, 0.05031741037964821, 0.08157997578382492, 0.033119700849056244, -0.006168389227241278, -0.029248878359794617, 0.03220978006720543, 0.033170875161886215, -0.016092298552393913, 0.06367992609739304, -0.04460841789841652, 0.004535777028650045, 0.02073446288704872, 0.03086034581065178, 0.05521118640899658, 0.0255671888589859, 0.03351978585124016, 0.0054356371983885765, 0.022546779364347458, -0.01703547313809395, 0.01909921132028103, -0.026828138157725334, -0.00663103349506855, -0.020689409226179123, 0.050948966294527054, -0.04893801361322403, 0.01731184870004654, 0.04526989161968231, -0.006964183412492275, -0.024913381785154343, -0.009478049352765083, 0.00858667865395546, 0.0316869392991066, 0.0036325007677078247, 0.004822565242648125, 0.016430554911494255, 0.02584567852318287, 0.023057278245687485, 0.016119612380862236, -0.00912242941558361, 0.044310927391052246, -0.012158617377281189, 0.03015269711613655, 3.835631287074648e-05, -0.04017578065395355, 0.02529202587902546, -0.08205912262201309, 0.08735394477844238, -0.07088837027549744, -0.026186546310782433, -0.034666042774915695, -0.006284791976213455, 0.037004586309194565, -0.07322868704795837, -0.204271599650383, 0.02092866599559784, 0.021851884201169014, 0.12395032495260239, -0.019654784351587296, 0.025786135345697403, 0.008141756057739258, 0.03757196664810181, -0.0016326429322361946, -0.03166600316762924, 0.01576683670282364, 0.01219184324145317, 0.04965358227491379, 0.038798436522483826, 0.08432009816169739, 0.004344771150499582, -0.056110769510269165, 0.021476248279213905, -0.001160395797342062, 0.01969645917415619, -0.06379828602075577, 0.044330496340990067, 0.020726770162582397, -0.014037583954632282, 0.00205223448574543, -0.006639471743255854, -0.055822309106588364, 0.029991962015628815, 0.013438534922897816, -0.0009317806689068675, 0.012148280628025532, 0.03473483398556709, 0.025689948350191116, -0.026550699025392532, 0.056340958923101425, -0.0279109925031662, -0.004078668076545, -0.036623746156692505, -0.14008557796478271, -0.03772442787885666, -0.011695001274347305, -0.014389324933290482, -0.009210840798914433, -0.0044777472503483295, 0.004356862977147102, -0.033695172518491745, 0.055875666439533234, 0.005808375775814056, 0.021673524752259254, 0.03470565378665924, 0.012103143148124218, 0.09700342267751694, 0.013018063269555569, -0.036997660994529724, -0.02608182094991207, -0.06820785999298096, -0.05528265982866287, 0.027861975133419037, 0.009105506353080273, 0.07617665827274323, 0.022981513291597366, -0.01954789273440838, 0.0273257065564394, 0.04695514962077141, -0.0005731959245167673, -0.004828731529414654, 0.021529732272028923, 0.010087943635880947, 0.00875789113342762, -0.06524033844470978, 0.02371830679476261, 0.0026044745463877916, -0.09046803414821625, -0.019632749259471893, 0.05051395297050476, 0.03395916894078255, -0.0013899576151743531, -0.061898984014987946, -0.0014376823091879487, 0.004282444249838591, -0.006952457595616579, 0.027653243392705917, -0.012465246021747589, -0.0490097850561142, 0.0020678548607975245, -0.022138796746730804, -0.0020471522584557533, -0.009821321815252304, -0.01357760839164257, 0.03642481565475464, -0.012081380002200603, 0.020119376480579376, -0.05869149789214134, 0.033401068300008774, -0.02241538278758526, -0.016249720007181168, -0.03345103561878204, -0.03260452300310135, -0.005201470106840134, -0.08583112806081772, -0.022704441100358963, -0.009427941404283047, -0.087849460542202, 0.011541851796209812, -0.027116628363728523, 0.02502499707043171, 0.040306657552719116, -0.01758456975221634, 0.023742036893963814, -0.0026687243953347206, 0.004292686935514212, -0.010865672491490841, 0.034045711159706116, -0.05959368869662285, 0.015404381789267063, -0.008883502334356308, 0.004658407066017389, -0.058416880667209625, -0.001626214012503624, 0.018659057095646858, -0.0011033671908080578, 0.04122801497578621, 0.017742399126291275, -0.007787731941789389, 0.05361778289079666, -0.048610322177410126, 0.05763492360711098, 0.01975666545331478, 0.04679698869585991, -0.08848973363637924, -0.02359691821038723, 0.013489574193954468, 0.050606876611709595, -0.037045370787382126, -0.01864796131849289, -0.031322233378887177, 0.009274047799408436, 0.0024029952473938465, -0.039217956364154816, -0.010443290695548058, 0.009600155986845493, 0.024134626612067223, -0.010368646122515202, -0.019933192059397697, -0.08255918323993683, 0.02355664037168026, -0.012519080191850662, 0.016003496944904327]" ./train/comic_book/n06596364_3314.JPEG,comic_book,"[0.00048223070916719735, 0.016062816604971886, -0.026674877852201462, 0.031034277752041817, 0.011942307464778423, 0.007878518663346767, 0.03196389228105545, -0.03796366602182388, -0.0368252657353878, 0.005101602990180254, 0.019760236144065857, 0.009786240756511688, -0.03478330373764038, -0.014811583794653416, -0.0245496965944767, -0.05279737710952759, 0.07562194019556046, -0.004606257658451796, 0.054034274071455, -0.02999323606491089, -0.03084663860499859, -0.016313128173351288, 0.0223536416888237, 0.01018571201711893, 0.04326261579990387, 0.02782393991947174, 0.031752049922943115, 0.04391278326511383, 0.030481193214654922, 0.029436374083161354, -0.0019377670250833035, 0.005390646867454052, -0.007709282450377941, 0.02691030688583851, -0.010262387804687023, 0.04182574898004532, 0.026308709755539894, 0.001571841654367745, -0.00467982841655612, 0.028882859274744987, 0.009219221770763397, -0.05284489318728447, -0.030049307271838188, -0.03910108655691147, -0.0130937984213233, -0.0405377522110939, -0.0023461985401809216, 0.028453178703784943, -0.014520513825118542, 0.07680334895849228, 0.026032796129584312, -0.019009016454219818, -0.0011045404244214296, 0.0010219627292826772, -0.01150489691644907, 0.000566066475585103, 0.037063103169202805, -0.02551601454615593, -0.010875812731683254, -0.01307957898825407, -0.05932806432247162, 0.027862370014190674, -0.025660106912255287, 0.02775016985833645, -0.036432988941669464, 0.05266253650188446, -0.018330439925193787, 0.04774143919348717, -0.018264289945364, -0.03133357688784599, 0.0026812402065843344, -0.0283901859074831, -0.034247804433107376, -0.03495080769062042, -0.005102869123220444, -0.018765948712825775, -0.003224917920306325, 0.03253001347184181, 0.020343845710158348, 0.001539903343655169, 0.0029385543894022703, 0.010648967698216438, -0.016962716355919838, 0.010531940497457981, -0.06892674416303635, 0.026665832847356796, -0.02349168434739113, 0.005715801380574703, -0.0334477461874485, -0.0050357552245259285, -0.005005193408578634, 0.040209975093603134, -0.4726827144622803, -0.016780128702521324, 0.00475613446906209, -0.011122854426503181, -0.0009554193820804358, 0.021779298782348633, 0.02324046939611435, 0.035984303802251816, 0.03809015452861786, 0.037047237157821655, -0.005623518954962492, 0.010258011519908905, 0.019046736881136894, -0.013316787779331207, -0.18297971785068512, -0.036085933446884155, -0.020915323868393898, 0.032691583037376404, -0.038053568452596664, -0.023021014407277107, -0.0038685468025505543, -0.03517158329486847, -0.01706165447831154, -0.022406723350286484, 0.020962493494153023, 0.05569078400731087, 0.012541938573122025, 0.0021070106886327267, 0.024737123399972916, -0.046995095908641815, -0.0017939963145181537, 0.027114903554320335, 0.034452661871910095, -0.023420359939336777, 0.03751624375581741, -0.03810635209083557, -0.004708539694547653, -0.06637302786111832, -0.019043439999222755, -0.035201288759708405, -0.058186762034893036, 0.07982764393091202, -0.0003096702857874334, 0.020493149757385254, 0.006898316089063883, -0.03429911658167839, 0.01971638761460781, 0.029439637437462807, -0.04754336178302765, 0.005937100853770971, -0.0477367639541626, 0.033804040402173996, 0.006441077683120966, 0.04345294088125229, -0.016966359689831734, -0.07078176736831665, 0.03135136142373085, 0.05229080468416214, -0.011429524049162865, 0.028057599440217018, -0.13090038299560547, 0.03127676621079445, -0.005190989933907986, -0.029693223536014557, -0.027562245726585388, -0.05168800801038742, 0.0035234030801802874, -0.02214655466377735, 0.04189171642065048, -0.03761201351881027, 0.0023341691121459007, 0.05601935461163521, 0.031199662014842033, 0.03852630406618118, 0.04244180768728256, 0.048502832651138306, 0.028981097042560577, -0.04264507442712784, -0.01993396505713463, 0.044040825217962265, -0.0451938770711422, 0.0037090855184942484, -0.03512958064675331, -0.03345101326704025, 0.016593240201473236, 0.018871594220399857, 0.0011167626362293959, -0.014268767088651657, -0.029756879433989525, -0.06687147915363312, 0.016329148784279823, 0.04944790527224541, 0.0031870161183178425, 0.01126049179583788, -0.01428617537021637, 0.009124466218054295, -0.008968443609774113, -0.023321568965911865, 0.02973981387913227, -0.03164653852581978, 0.01490821037441492, 0.018651839345693588, -0.03430279716849327, 0.014264277182519436, 0.02863370254635811, -0.040689896792173386, 0.12203492969274521, 0.010015315376222134, -0.02688007615506649, 0.012582369148731232, -0.0032902380917221308, -0.05370505899190903, -0.03794324770569801, -0.05149565637111664, -0.02058618701994419, -0.001325185876339674, -0.02272278256714344, -0.05472610890865326, -0.09170015156269073, -0.009514129720628262, -0.03568032383918762, -0.030336812138557434, 0.023880429565906525, -0.023000607267022133, -0.02724137157201767, 0.0006254558102227747, 0.06870540976524353, 0.005296922288835049, -0.00930735468864441, -0.020189573988318443, -0.08541148900985718, -0.00771714560687542, 0.012100202962756157, 0.0020028329454362392, -0.010583360679447651, -0.008092040196061134, -0.020439837127923965, -0.02638515830039978, -0.03006310574710369, -0.010400490835309029, 0.02470337599515915, 0.02529330551624298, 0.03472818061709404, -0.027828359976410866, -0.061035312712192535, -0.023535452783107758, -0.03442780300974846, -0.0061518424190580845, 0.012301132082939148, 0.004932788200676441, 0.004235442727804184, 0.0009009473724290729, -0.03651551902294159, 0.017986373975872993, 0.0049505154602229595, 0.05385364592075348, -0.005236985627561808, 0.047755323350429535, -0.05031069368124008, 0.05704611912369728, -0.004066738300025463, 0.052922189235687256, 0.0015850707422941923, 0.01281652133911848, -0.0050948867574334145, 0.023147452622652054, -0.19017352163791656, -0.05167632922530174, 0.02412671037018299, -0.014135157689452171, 0.016107555478811264, -0.19109030067920685, 0.03201998025178909, 0.005016823764890432, 0.04271065443754196, 0.030681414529681206, -0.027453428134322166, 0.01428240817040205, -0.013148120604455471, -0.013437860645353794, 0.012624621391296387, -0.04331117495894432, -0.009066417813301086, -0.018094781786203384, 0.003917318768799305, -0.0017988492036238313, 0.029036326333880424, 0.003892846405506134, 0.03293883800506592, -0.005903515033423901, 0.015521145425736904, 0.022213928401470184, 0.026865312829613686, -0.02009863406419754, 0.10178595036268234, -0.008674985729157925, -0.04884171485900879, 0.0060442350804805756, -0.01214777585119009, 0.003022316377609968, 0.01920352689921856, -0.004639908671379089, 0.04636341333389282, 0.015321891754865646, 0.016008995473384857, 0.06897404044866562, -0.017562871798872948, -0.02503621205687523, 0.0025446105282753706, -0.021191859617829323, 0.0038789857644587755, -0.02806570567190647, 0.02217600867152214, 0.027169320732355118, 0.01568591222167015, 0.009752461686730385, 0.042298149317502975, -0.012097269296646118, 0.011219624429941177, 0.06903629750013351, 0.07955105602741241, 0.03676587715744972, 0.02651359513401985, -0.028021477162837982, -0.036360692232847214, 0.048128288239240646, -0.019779616966843605, 0.05574638396501541, -0.0597858652472496, 0.05645265430212021, -0.05513829365372658, -0.008880991488695145, 0.06834005564451218, 0.0032260846346616745, -0.007401836104691029, 0.024403169751167297, 0.04972635954618454, -0.04952536150813103, 0.002416811650618911, -0.03723643720149994, 0.021484293043613434, -0.006550994701683521, -0.010300357826054096, -0.009437746368348598, 0.04222322627902031, 0.08336730301380157, -0.047760579735040665, 0.051572199910879135, -0.03846557438373566, 0.04696148261427879, -0.008010419085621834, -0.0013573981123045087, -0.01622757688164711, -0.002098360098898411, 0.010275166481733322, 0.01584070362150669, 0.015847884118556976, -0.0032573507633060217, 0.04880720004439354, 0.005117344204336405, 0.05549497902393341, 0.02627507597208023, 0.003209878923371434, 0.0006478027789853513, -0.05608660355210304, 0.12452889233827591, -0.06705448776483536, -0.011794138699769974, -0.0871662124991417, 0.015063900500535965, 0.04818275198340416, -0.07706062495708466, -0.15652835369110107, 0.019998429343104362, -0.011516512371599674, 0.13049550354480743, -0.03429240733385086, -0.016998786479234695, 0.06396519392728806, 0.051119476556777954, -0.007632155437022448, -0.02327718213200569, -0.024397999048233032, -0.022600697353482246, -0.010683071799576283, 0.02259102836251259, 0.05943751707673073, 0.029429877176880836, -0.06322141736745834, -0.005549185909330845, 0.0022317320108413696, -0.004875131417065859, -0.003987606149166822, 0.07333051413297653, 0.008687183260917664, -0.018830232322216034, -0.0667923092842102, -0.02043427899479866, 0.01330704614520073, -0.03047213889658451, 0.01099514588713646, 0.004339444916695356, -0.06193863973021507, -0.01169153768569231, 0.05464547500014305, -0.011425860226154327, 0.05263349041342735, 0.0011455577332526445, -0.03320878744125366, -0.05586789548397064, -0.08700527250766754, -0.03046245500445366, 0.011053689755499363, 0.017637815326452255, 0.003973070066422224, 0.00791313499212265, -0.0077284048311412334, -0.008139271289110184, -0.02902778796851635, 0.042286038398742676, -0.004874392878264189, -0.004404726438224316, 0.016486240550875664, 0.02182009443640709, -0.03207947686314583, -0.07226809114217758, 0.016746176406741142, -0.06110215187072754, -0.03566470369696617, -0.004989172797650099, 0.007931683212518692, 0.12157705426216125, 0.025326654314994812, -0.006592185702174902, 0.023534955456852913, 0.01926690712571144, 0.09510047733783722, 0.028141118586063385, 0.044845398515462875, -0.006269385572522879, 0.05751745402812958, -0.06010252982378006, 0.02346072532236576, -0.0007897607865743339, -0.047355830669403076, -0.024411868304014206, 0.034017112106084824, -0.04339839890599251, 0.022038117051124573, -0.052884407341480255, 0.010198164731264114, -0.010306445881724358, -0.03408676013350487, 0.07754172384738922, 0.050027646124362946, 0.0038447973784059286, -0.042201489210128784, 0.010948416776955128, -0.027153654024004936, -0.04087769612669945, -0.008762700483202934, 0.09688270837068558, -0.0023244295734912157, 0.008266097865998745, -0.040624842047691345, -0.0015238448977470398, -0.02661166526377201, 0.013831104151904583, -0.011847642250359058, -0.05692334473133087, 0.03896722197532654, -0.029988382011651993, 0.044480253010988235, -0.018247785046696663, -0.08296960592269897, -0.007998107001185417, 0.025997722521424294, 0.021638061851263046, 0.005799173843115568, -0.012657618150115013, -0.009292319416999817, 0.008101527579128742, 0.00245346175506711, -0.021654747426509857, -0.008752990514039993, 0.014850746840238571, -0.016294831410050392, 0.004297423642128706, 0.007113492116332054, -0.034216005355119705, 0.023264922201633453, 0.06246291846036911, 0.013066571205854416, 0.021961331367492676, 0.018457379192113876, -0.0027533378452062607, 0.009492535144090652, -0.06620770692825317, 0.02080659009516239, -0.005010222550481558, 0.03705203905701637, -0.042180661112070084, -0.018283935263752937, 0.022459523752331734, 0.09592176228761673, 0.03803517669439316, -0.06340279430150986, -0.020896727219223976, 0.01565837673842907, -0.03055373579263687, -0.008995198644697666, 0.023593973368406296, 0.031623996794223785, 0.016666583716869354, -0.00967620313167572, 0.024550482630729675, -0.021552182734012604, 0.05068753659725189, 0.03639890253543854, -0.017714347690343857]" ./train/comic_book/n06596364_4083.JPEG,comic_book,"[-0.06507235765457153, 0.06915464997291565, -0.010260378941893578, 0.013939792290329933, 0.03816591575741768, -0.011960374191403389, 0.03165862336754799, -0.02499578334391117, -0.01681627705693245, -0.03177754580974579, 0.044383034110069275, -0.009788036346435547, 0.08497275412082672, 0.0016244243597611785, -0.03554270416498184, -0.011998114176094532, -0.03280247747898102, -0.022965213283896446, -0.00573821272701025, -0.033127665519714355, -0.04367588460445404, -0.030193781480193138, 0.028521809726953506, 0.05554657056927681, -0.0044221943244338036, 0.01551212090998888, 0.05884404480457306, 0.01124307420104742, -0.001975099788978696, 0.045121628791093826, -0.0240811575204134, 0.014050858095288277, -0.009452350437641144, -0.026825187727808952, 0.03319048881530762, 0.038057368248701096, 0.007814996875822544, 0.04999940097332001, 0.009688777849078178, -0.006766915321350098, 0.014686130918562412, -0.054583366960287094, -0.02209301106631756, -0.02687019109725952, 0.02125271037220955, 0.14385484158992767, 0.017549874261021614, -0.02633325196802616, -0.045765530318021774, 0.01269171480089426, 0.037266459316015244, -0.01713162288069725, 0.00039776175981387496, -0.04073764756321907, 0.007527888286858797, -0.00521476473659277, 0.023960908874869347, 0.0153884869068861, -0.009432630613446236, 0.005558628588914871, -0.021253511309623718, 0.0327829010784626, 0.04305851459503174, -0.02582201547920704, 0.005616112146526575, 0.007140271365642548, 0.017139548435807228, -0.03172186017036438, -0.026756174862384796, 0.0179081279784441, 0.006902136839926243, -0.00475816847756505, -0.023287802934646606, -0.018466493114829063, -0.013589264824986458, -0.004424594808369875, -0.005219616461545229, -0.00905644241720438, -0.006424885243177414, -0.021088913083076477, 0.031371843069791794, 0.005960019305348396, -0.03367527574300766, 0.08100637048482895, 0.00475305737927556, 0.001200004480779171, -0.007485457696020603, 0.011456793174147606, -0.06668242812156677, 0.019124187529087067, -0.003598395735025406, 0.019709475338459015, -0.6092899441719055, 0.06827912479639053, -0.003044660435989499, 0.009935216046869755, 0.003998791333287954, 0.0007486293325200677, 0.07195564359426498, -0.01799687184393406, 0.044617872685194016, -0.00040356232784688473, 0.012501458637416363, -0.019267994910478592, 0.015799710527062416, -0.033370763063430786, -0.10416236519813538, -0.008747676387429237, -0.00442876061424613, -0.020221877843141556, 0.05480261519551277, -0.01105284970253706, -0.02186150848865509, 0.014708539471030235, 0.0038683097809553146, 0.011198737658560276, -0.005324528552591801, -0.0073984782211482525, 0.03908110037446022, -0.025438107550144196, 0.03676344454288483, -0.006257625296711922, 0.02349221333861351, -0.014938544481992722, 0.024798696860671043, -0.07112379372119904, 0.01750362478196621, 0.014057126827538013, -0.051583945751190186, -0.021756336092948914, -0.02224832773208618, 0.028605613857507706, 0.005731307435780764, 0.07737637311220169, -0.002931203693151474, -0.015323993749916553, -0.029739905148744583, -0.0016331052174791694, -0.046533167362213135, 0.01704423874616623, -0.012448658235371113, -0.0251507256180048, -0.00505339540541172, -0.007208176422864199, 0.011409152299165726, 0.019908644258975983, -0.012433418072760105, -0.0016980580985546112, 0.026180054992437363, -0.007296802010387182, -0.061156265437603, 0.016770370304584503, -0.044993381947278976, -0.04127022251486778, -0.04039463400840759, -0.041251178830862045, 0.0051259249448776245, -0.00312764011323452, 0.027749711647629738, -0.02961731143295765, -0.008222359232604504, -0.017112571746110916, 0.010204697027802467, 0.034885112196207047, 0.0063439300283789635, 0.051393136382102966, -0.05069157853722572, -0.003623001277446747, -0.017301281914114952, -0.011348001658916473, 0.019635070115327835, 0.02331031858921051, -0.01775817759335041, -0.000669033033773303, 0.035408224910497665, -0.03608328476548195, -0.029441921040415764, 0.0031550221610814333, -0.0451471172273159, 0.009270722977817059, 0.06286315619945526, -0.0009298152872361243, -0.03168335184454918, -0.00011955852824030444, 0.022895021364092827, 0.008567621000111103, 0.03298433497548103, -0.017745472490787506, -0.029152605682611465, 0.0005365739925764501, 0.014715075492858887, 0.018332259729504585, -0.0070486064068973064, -0.03050338476896286, -0.06554321944713593, -0.007779429666697979, 0.029031381011009216, -0.02399943582713604, 0.021069208160042763, -0.015141738578677177, -0.0037702140398323536, 0.013951381668448448, 0.01956174336373806, 0.029439566656947136, -0.019942088052630424, -0.009436608292162418, -0.03667980805039406, 0.0010721258586272597, -0.0067786602303385735, -0.033084169030189514, -0.0026384724769741297, 0.0068367584608495235, 0.009003620594739914, -0.05032995343208313, -0.02175232023000717, 0.00036016356898471713, 0.0322895385324955, 0.005974013824015856, 0.05966438725590706, -0.02054506726562977, 0.06403552740812302, -0.037034254521131516, -0.009466753341257572, 0.04415298253297806, 0.000740581308491528, -0.003063587937504053, 0.017955435439944267, -0.01885887421667576, -0.006472620647400618, 0.029034055769443512, -0.006982559338212013, -0.04659104719758034, 0.038437824696302414, -0.001238243654370308, 0.03407697007060051, 0.025451958179473877, -0.0006203497759997845, -0.003324356162920594, -0.013483203016221523, -0.026211882010102272, -0.06244006007909775, -0.003103447612375021, 0.0024886492174118757, 0.023504046723246574, -0.01833696849644184, -0.004793665837496519, -0.03404420241713524, 0.02878258191049099, -0.06653007864952087, 0.00905743520706892, 0.01897112838923931, -0.0012056563282385468, -0.04261530190706253, 0.025605574250221252, 0.030159257352352142, 0.006514666136354208, -0.002565853064879775, 0.07644578814506531, -0.18455004692077637, 0.03245372325181961, -0.009240278042852879, -0.024843381717801094, 0.004996778443455696, -0.2170943021774292, -0.007161828223615885, -0.005730158183723688, 0.009670974686741829, 0.06136156991124153, 0.0009724029223434627, -0.013864217326045036, -0.026857299730181694, -0.029422976076602936, 0.02075708843767643, 0.006929447408765554, -0.016388701274991035, -0.008607633411884308, 0.0032459970097988844, -0.014078567735850811, -0.018603738397359848, 0.011920178309082985, 0.03593067452311516, -0.034492556005716324, -0.0042524877935647964, -0.019819654524326324, -0.06442155689001083, 0.029880918562412262, -0.0038398453034460545, 0.019996395334601402, -0.005174674093723297, -0.019586950540542603, 0.007733872160315514, -0.02641396038234234, 0.0018523131730034947, 0.06003092974424362, -0.021443607285618782, 0.019652731716632843, 0.07851722836494446, 0.031427353620529175, 0.002464394783601165, 0.007741711568087339, -0.02655061148107052, -0.03131214529275894, -0.010500438511371613, 0.01690840907394886, 0.008391456678509712, -0.04839365556836128, 0.009087580256164074, 0.045550305396318436, 0.06994366645812988, 0.00601394847035408, 0.002125266008079052, 0.055501583963632584, 0.0771084725856781, 0.029372965916991234, 0.005446230061352253, -0.024807948619127274, 0.0161996241658926, 0.014765259809792042, 0.01365701574832201, 0.046287912875413895, -0.033975549042224884, 0.020109718665480614, -0.047608766704797745, -0.009587776847183704, 0.0038836519233882427, 0.00974216777831316, 0.030368654057383537, -0.014487357810139656, 0.0008564210729673505, -0.03113473393023014, 0.0064470767974853516, 0.007879713550209999, 0.03667376935482025, -0.01325664296746254, -0.004776928573846817, 0.0008877848158590496, -0.004823595285415649, -0.02518007531762123, 0.06307937949895859, 0.0547223724424839, -0.02548123523592949, 0.005203538108617067, 0.01681767962872982, -0.007490170653909445, 0.04878192022442818, 0.02763003669679165, 0.060193467885255814, 0.009363397024571896, 0.0351102314889431, 0.03471629321575165, 0.050476524978876114, 0.007302519865334034, 0.015549065545201302, -0.04441523551940918, 0.00647606560960412, -0.011895539239048958, -0.007022895850241184, -0.016318833455443382, 0.0026108594611287117, -0.004983691498637199, 0.009413746185600758, 0.02740546315908432, 0.006042154040187597, -0.0028934793081134558, -0.10915309190750122, 0.00668933754786849, 0.005119328387081623, -0.03111574985086918, -0.03282874822616577, 0.020264122635126114, 0.020361237227916718, 0.024027109146118164, 0.011715116910636425, -0.043428935110569, 0.019572991877794266, 0.02818131633102894, 0.0030962922610342503, 0.016134290024638176, 0.0033920644782483578, 0.014171555638313293, 0.006078291218727827, -0.03803965449333191, -0.020728401839733124, -0.025358475744724274, 0.009207947179675102, 0.02985936403274536, 0.024295300245285034, 0.011322793550789356, -0.036661166697740555, 0.07234738767147064, 0.03223045542836189, 0.024399565532803535, 0.03385268151760101, 0.03017430566251278, -0.05056564882397652, 0.026180259883403778, 0.019197847694158554, -0.009082582779228687, 0.06466285139322281, 0.021117307245731354, -0.023359430953860283, -0.02562962844967842, -0.09470248222351074, -0.05509470775723457, 0.048767395317554474, -0.0206260085105896, 0.02476096898317337, -0.010143405757844448, 0.013352076523005962, -0.03018694557249546, -0.03591972962021828, 0.06884190440177917, 0.004991193301975727, 0.018206903710961342, 0.03422461077570915, 0.06992803514003754, 0.005835727322846651, -0.02012610249221325, -0.03973272070288658, -0.028603022918105125, 0.019600646570324898, 0.012017341330647469, 0.016071738675236702, 0.06425859779119492, -0.034044258296489716, 0.014030068181455135, 0.001673889230005443, 0.02343778870999813, 0.18144026398658752, -0.021059589460492134, -0.030113643035292625, 0.030967410653829575, -0.1101364716887474, -0.04166486859321594, 0.04890712350606918, -0.025618242099881172, -0.0789712592959404, -0.02008521556854248, 0.0476154200732708, -0.013927764259278774, 0.002806885400786996, 0.02165934629738331, -0.02263081632554531, -0.03465764597058296, -0.018881650641560555, 0.052113622426986694, 0.04296441376209259, -0.010135470889508724, 0.014096044935286045, 0.033611200749874115, -0.025018785148859024, 0.007342144846916199, -0.009979824535548687, 0.055197883397340775, 0.012040055356919765, -0.018680693581700325, -0.01691579818725586, 0.003219827078282833, -0.028631437569856644, -0.006050508469343185, 0.004304663278162479, -0.02166179195046425, 0.016531534492969513, -0.021032989025115967, -0.01724628545343876, -0.011368393898010254, 0.019077200442552567, -0.0009407447651028633, -0.04734854772686958, 0.011434663087129593, 0.0008276691078208387, 0.058433856815099716, 0.012930965051054955, 0.012211665511131287, -0.021031096577644348, -0.05891888588666916, 0.028568865731358528, 0.007871218025684357, 0.034007709473371506, -0.009983798488974571, 0.006089212838560343, 0.004185925703495741, 0.0019386454951018095, 0.02513706684112549, -0.0011598338605836034, 0.004954191856086254, -0.008423959836363792, -0.012901827692985535, 0.006521073170006275, -0.03992011398077011, 0.04665016382932663, -0.006044683512300253, 0.0853244811296463, -0.01789352111518383, 0.0449800007045269, -0.03182028979063034, 0.07054264098405838, 0.0178686510771513, 0.0037655243650078773, 0.00742792384698987, -0.014853792265057564, 0.022101083770394325, -0.028535468503832817, 0.03099771775305271, 0.09223101288080215, -0.004620613530278206, 0.009264086373150349, -0.0047596534714102745, 0.019821271300315857, 0.07656778395175934, 0.02258126810193062, 0.007908839732408524]" ./train/dugong/n02074367_11389.JPEG,dugong,"[0.04187963530421257, -0.02784755825996399, -0.03435322269797325, 0.010907022282481194, 0.004497974645346403, -0.051744237542152405, 0.05493674427270889, -0.01843683421611786, 0.03887369483709335, 0.015586365014314651, -0.02034982480108738, 0.012034771032631397, 0.05020212382078171, -0.007306803949177265, 0.004527280107140541, -0.004900005180388689, 0.0008341613574884832, 0.0849902480840683, 0.018893983215093613, -0.004775349982082844, -0.08396311849355698, 0.032406192272901535, 0.026371583342552185, -0.045956943184137344, -0.03648616373538971, -0.017390167340636253, -0.04369477927684784, -0.025339869782328606, 0.022951100021600723, -0.021745046600699425, 0.02588440291583538, 0.004809197038412094, 0.0032239085994660854, -0.039845626801252365, 0.012227973900735378, -0.015418225899338722, 0.02973254956305027, 0.0083860382437706, 0.02979724481701851, 0.16117770969867706, 0.003250164445489645, 0.0443195104598999, 0.0024065105244517326, 0.011903892271220684, 0.0006864806055091321, -0.05836838483810425, 0.0032225342001765966, 0.019437920302152634, 0.0059144990518689156, 0.001707262359559536, -0.027842378243803978, 0.0002961317077279091, -0.02030782401561737, -0.00932189542800188, -0.018659504130482674, 0.03245764970779419, -0.026958316564559937, -0.0026090107858181, 0.005686769727617502, -0.005443735048174858, 0.06629365682601929, -0.017759352922439575, -0.008258717134594917, 0.022516652941703796, -0.025825615972280502, -0.03169503062963486, -0.025975586846470833, 0.08612237125635147, 0.007264653220772743, 0.02019089087843895, 0.03648833930492401, -0.033707160502672195, 0.0019233491038903594, -0.021411897614598274, 0.0009154970175586641, -0.05425328016281128, 0.02249360829591751, -0.014367821626365185, 0.009006405249238014, -0.013294988311827183, 0.01974586397409439, 0.024137236177921295, -0.03835348039865494, -0.04746735095977783, 0.02870325557887554, 0.03738893195986748, 0.08641946315765381, -0.043522533029317856, -0.007818857207894325, 0.025362994521856308, 0.032616592943668365, -0.0073521374724805355, -0.6084029674530029, 0.04401464760303497, -0.025505349040031433, 0.009775240905582905, 0.058275047689676285, 0.026929592713713646, -0.054813966155052185, -0.058665141463279724, -0.045344650745391846, -0.0011504078283905983, -0.06737372279167175, -0.021091196686029434, 0.027448393404483795, 0.016686733812093735, -0.13612739741802216, 0.0027966811321675777, 0.017748963087797165, -0.0053021046333014965, 0.018863758072257042, -0.020921260118484497, -0.00997104961425066, 0.015562486834824085, 0.008098885416984558, -0.048147402703762054, 0.028787780553102493, -0.03460171818733215, 0.040222667157649994, 0.01843411475419998, -0.0028639042284339666, 0.03947876766324043, -0.022581474855542183, 0.0067296442575752735, -0.017196660861372948, 0.03791142255067825, -0.017984984442591667, 0.009701675735414028, 0.02558126114308834, -0.04783213138580322, 0.02568354643881321, 0.001010343199595809, -0.033634815365076065, 0.07595562189817429, 0.030089041218161583, 0.006794256158173084, -0.018495753407478333, -0.016175901517271996, 0.03838058188557625, -0.04856023192405701, -0.00930383987724781, -0.03932373970746994, -0.021250350400805473, 0.041013702750205994, -0.007990093901753426, -0.06292688101530075, -0.0016821841709315777, 0.04437103495001793, -0.000509285950101912, -0.021592477336525917, 0.021175241097807884, 0.01772124506533146, -0.02682945504784584, -0.028335673734545708, -0.007302526850253344, 0.0015428387559950352, -0.0006226152763701975, -0.037793826311826706, 0.01946285553276539, 0.010603804141283035, -0.011029977351427078, -0.02593284659087658, 0.0035226193722337484, 0.0192432701587677, 0.039129842072725296, -0.03999659791588783, -0.00037687894655391574, 0.011254051700234413, -0.009530412033200264, 0.023842455819249153, 0.02662140503525734, 0.04572732746601105, 0.001798543962650001, -0.00027426352608017623, -0.001087636686861515, 0.026325877755880356, -0.1220608502626419, -0.005790038034319878, -0.06715035438537598, 0.025664905086159706, 0.0852745845913887, 0.00409968476742506, 0.024759748950600624, -0.017971176654100418, -0.0013349932851269841, -0.017561692744493484, 0.017057256773114204, -0.017332641407847404, -0.06564761698246002, -0.012935238890349865, 0.002865286311134696, -0.006311201956123114, -0.002418257063254714, 0.0016379734734073281, -0.011673139408230782, -0.00960774626582861, 0.024772487580776215, 0.016066106036305428, -0.0021289540454745293, -0.01217202004045248, 0.013944975100457668, -0.012048446573317051, -0.04129644110798836, 0.06587830930948257, 0.014795086346566677, 0.026820873841643333, 0.02547135204076767, -0.029851630330085754, 0.04276964068412781, 0.04552918300032616, -0.003266955027356744, 0.02757267653942108, 0.005010257940739393, -0.02019202522933483, 0.005184641107916832, 0.040976911783218384, 0.028557073324918747, -0.016836771741509438, 0.007302963174879551, -0.04671873897314072, 0.023798907175660133, 0.06710156798362732, -0.006059391424059868, -0.014388441108167171, 0.04197090119123459, -0.020588189363479614, -0.021659845486283302, 0.03478972986340523, 0.0036870792973786592, 0.03375811502337456, -0.028815900906920433, -0.013004563748836517, 0.04480869323015213, 0.006236463785171509, 0.0017047252040356398, -0.06736227124929428, 0.04154567793011665, 0.03262769803404808, 0.007332291454076767, 0.01353488676249981, -0.009381522424519062, 0.042153116315603256, 0.010574553161859512, -0.03342453017830849, 0.03263859823346138, 0.009185693226754665, 0.0327509380877018, 0.012699276208877563, 0.006512640044093132, 0.026561064645648003, 0.0034016836434602737, 0.047158095985651016, 0.05100144445896149, -0.0005992227233946323, -0.04132296144962311, 0.05201701074838638, 0.007184585556387901, 0.026554161682724953, 0.02643931843340397, 0.0004667982866521925, 0.01925918459892273, -0.008880019187927246, -0.033025097101926804, -0.004720549564808607, 0.024933334439992905, 0.020115381106734276, 0.04270634055137634, 0.02046342007815838, 0.005043485201895237, -0.02300265058875084, -0.02534232847392559, 0.017889492213726044, -0.007049473002552986, 0.04951260983943939, 0.06596498191356659, -0.01710795983672142, -0.04333269223570824, 0.05226609855890274, 0.004261032212525606, -0.012931711040437222, 0.012071613222360611, 0.0002578301355242729, 0.004186045378446579, 0.0063806865364313126, 0.012733887881040573, -0.018076060339808464, -0.13295188546180725, -0.06470110267400742, -0.040040262043476105, -0.009839111007750034, 0.017321398481726646, 0.009803722612559795, -0.01720382645726204, 0.010480266995728016, -0.020050078630447388, -0.011640817858278751, 0.1289367377758026, 0.024473562836647034, 0.048093654215335846, 0.033227354288101196, 0.007818542420864105, -0.04835861921310425, 0.00710988650098443, -0.0034552132710814476, 0.01677033305168152, -0.010361877270042896, 0.020358970388770103, 0.05717604607343674, -0.01223301887512207, -0.0073448591865599155, -0.02259751968085766, -0.028960708528757095, 0.07587389647960663, 0.021736999973654747, 0.06065153330564499, -0.03640885651111603, 0.013914592564105988, 0.054764725267887115, -0.025476161390542984, -0.05818270146846771, 0.015180349349975586, 0.1411391794681549, -0.06597185879945755, -0.04943414777517319, 0.03898615390062332, -0.053500037640333176, 0.021168485283851624, 0.01944720558822155, -0.030745819211006165, -0.004952895455062389, 0.001492259674705565, -0.009299958124756813, 0.006371844094246626, 0.00020468074944801629, 0.010881119407713413, -0.0030905273742973804, -0.010240525007247925, 0.0008870110032148659, -0.03342161700129509, 0.01050147321075201, -0.020758867263793945, -0.0034125521779060364, -0.015187417156994343, -0.03327484056353569, 0.03135089948773384, -0.01278639119118452, -0.0473966971039772, -0.013638618402183056, 0.00352210714481771, 0.048461154103279114, 0.014767488464713097, 0.015828212723135948, 0.020539728924632072, 0.03326338157057762, 0.027235262095928192, -0.001578348339535296, 0.00983963068574667, -0.01728719286620617, 0.03239401802420616, -0.0056567108258605, 0.060894206166267395, -0.013853400014340878, -0.03176048398017883, 0.05560914799571037, -0.0580315887928009, 0.021319082006812096, 0.013582166284322739, -0.09047820419073105, -0.00695404689759016, -0.0040170312859117985, 0.036354925483465195, 0.05380583927035332, 0.043497126549482346, 0.032876089215278625, 0.05796879902482033, 0.04597175493836403, 0.09254644066095352, 0.04623245447874069, -0.09797751903533936, -0.016473714262247086, 0.034646619111299515, -0.021949373185634613, 0.0460190586745739, -0.017297592014074326, 0.02794964425265789, 0.006999312434345484, 0.0034821992740035057, -0.01901053823530674, -0.026249853894114494, -0.017070498317480087, -0.020283974707126617, -0.026541225612163544, 0.0075542195700109005, 0.016998786479234695, -0.005909384228289127, -0.04184606671333313, -0.023980887606739998, 0.00794986356049776, -0.09649211913347244, -0.07271891832351685, -0.024047905579209328, 0.028907127678394318, -0.049975890666246414, -0.048009391874074936, 0.016761252656579018, -0.008103719912469387, -0.013482600450515747, -0.044813115149736404, 0.018877966329455376, -0.06901312619447708, 0.1093556135892868, 0.009048969484865665, 0.014846579171717167, -0.008435303345322609, 0.0035313705448061228, -0.0537581741809845, 0.06172087416052818, 0.00108293816447258, -0.013184776529669762, -0.019050728529691696, 0.011619572527706623, 0.02391085959970951, 0.03093899041414261, -0.041185520589351654, 0.01713118515908718, -0.04247014597058296, -0.03568459302186966, 0.0006334821227937937, 0.00016752917144913226, -0.013782151974737644, 0.012682363390922546, -0.013449928723275661, 0.031194964423775673, -0.038297321647405624, -0.0006543259369209409, -0.03560522571206093, -0.0010694676311686635, 0.012799691408872604, 0.0026768518146127462, -0.004958688747137785, -0.03158325329422951, 0.041890110820531845, -0.019010087475180626, 0.010132504627108574, -0.03628634288907051, 0.019395790994167328, 0.01904766820371151, -0.03574472665786743, -0.032741472125053406, 0.05745191127061844, -0.011771151795983315, -0.018653985112905502, 0.008069606497883797, -0.06893066316843033, 0.039822593331336975, -0.03477445989847183, 0.06582573801279068, -0.0034020671155303717, 0.04783123359084129, -0.007097576279193163, 0.07772661745548248, 0.004932286683470011, 0.01939203031361103, -0.00962606631219387, -0.007775331847369671, 0.0062805842608213425, 0.001402663765475154, 0.008452353999018669, -0.02119121514260769, -0.020961841568350792, -0.0006211450090631843, -0.016174567863345146, 0.03561578691005707, -0.03986778110265732, 0.012754225172102451, -0.04442431405186653, -0.06437414884567261, -0.046677373349666595, -0.012565641663968563, -0.016696950420737267, 0.024177031591534615, -0.015776876360177994, -0.04857983440160751, -0.02794402465224266, 0.00026660607545636594, 0.0009405695600435138, -0.03433198481798172, -0.0013551580486819148, -0.05019700899720192, 0.025371264666318893, -0.0056916289031505585, -0.004538343288004398, 0.03508654609322548, -0.05517946183681488, 0.0034507550299167633, -0.017240656539797783, 0.015856938436627388, 0.019484784454107285, -0.0020880347583442926, -0.027161015197634697, -0.006873970851302147, 0.02223101258277893, -0.04640699177980423, -0.009574509225785732, 0.0025398433208465576, -0.04774671420454979, -0.021505624055862427, 0.014999534003436565, 0.017235083505511284, 0.04217977821826935, -0.000576150487177074, -0.002612772397696972]" ./train/dugong/n02074367_6343.JPEG,dugong,"[0.01506405882537365, -0.033886492252349854, 0.000528908334672451, 0.012121462263166904, 0.036893319338560104, -0.06187145784497261, 0.016536511480808258, -0.036139264702796936, 0.0647759735584259, 0.0015493768732994795, -0.01947718858718872, 0.019102582708001137, 0.06596162170171738, -0.0012969525996595621, -0.011985288932919502, -0.009964018128812313, 0.04065140336751938, 0.050764329731464386, 0.003166683716699481, 0.06443935632705688, -0.13761983811855316, 0.01600320264697075, 0.036707695573568344, -0.035157639533281326, -0.027510540559887886, 0.004156790673732758, 0.013620156794786453, -0.012054813094437122, 0.027675403282046318, -0.02227005921304226, 0.026188666000962257, 0.021050160750746727, 0.0008094289223663509, -0.002376890042796731, -0.04372897371649742, -0.005180062260478735, -0.017120588570833206, 0.006572397891432047, -0.006782484240829945, 0.1353444904088974, -0.04540453851222992, 0.00042265281081199646, -0.008845638483762741, 0.018820226192474365, 0.016840601339936256, -0.007613164372742176, 0.01883048377931118, 0.050959136337041855, 0.004054076969623566, -0.018353015184402466, -0.03584069013595581, 0.026922687888145447, -0.0011999333510175347, 0.007927974686026573, -0.009861632250249386, 0.019685430452227592, -0.06924334168434143, 0.03253726661205292, -0.007788758724927902, -0.022642213851213455, 0.06855693459510803, 0.010183705948293209, -0.028446203097701073, -0.05677567049860954, -0.026193901896476746, -0.054030194878578186, 0.010529736988246441, 0.058011870831251144, 0.02573704905807972, 0.013868603855371475, 0.044789914041757584, -0.05225183069705963, -0.023923657834529877, -0.014826551079750061, -0.002016301266849041, 0.007087054196745157, -0.013747659511864185, -0.06276573240756989, 0.040773533284664154, 0.014816147275269032, -0.008199765346944332, 0.02112008072435856, -0.00637296587228775, -0.08944857865571976, 0.06520672142505646, 0.027508968487381935, 0.09257025271654129, -0.014566524885594845, -0.028734814375638962, 0.006348140072077513, 0.0072690630331635475, -0.011349418200552464, -0.6686784029006958, 0.022632310166954994, -0.01290903054177761, -0.01416981965303421, 0.03607490286231041, -0.012165839783847332, -0.07130913436412811, -0.02188977412879467, -0.015728630125522614, -0.0221926998347044, -0.06759363412857056, -0.021345920860767365, 0.02791082113981247, 0.030557170510292053, -0.08723204582929611, -0.03393237665295601, -0.006780421826988459, -0.013184839859604836, 0.02629127725958824, -0.02648135833442211, 0.03192527964711189, -0.02719196490943432, 0.0010324164759367704, 0.002253131940960884, -0.0057969242334365845, -0.026178142055869102, 0.023592792451381683, 0.029194189235568047, 0.0035860142670571804, 0.022006606683135033, 0.03001021035015583, -0.007139159832149744, -0.02710837498307228, 0.0020057575311511755, -0.0462171696126461, -0.005190735217183828, 0.04697616770863533, -0.033743470907211304, 0.04095632582902908, 0.02977144345641136, -0.005159568972885609, 0.08254280686378479, -0.02545228600502014, 0.019214967265725136, 0.006368218455463648, -0.0047348178923130035, 0.0008322428911924362, -0.032847948372364044, 0.026263024657964706, -0.045298777520656586, -0.015814321115612984, 0.015224461443722248, -0.020478608086705208, 0.03601815924048424, -0.0008079977123998106, 0.0769256204366684, -0.02436659298837185, -0.010598432272672653, 0.0446702316403389, -0.019483666867017746, -0.023765072226524353, -0.020797714591026306, -0.018821867182850838, 0.03307656943798065, -0.0019691663328558207, -0.0203657578676939, -0.006784175988286734, 0.03071078658103943, -0.004885950591415167, -0.02364366315305233, -0.030803633853793144, -0.028075607493519783, 0.06775685399770737, 0.011069388128817081, -0.07236147671937943, -0.038124728947877884, 0.027629781514406204, 0.03720494359731674, -0.02635352872312069, 0.016882456839084625, 0.016058364883065224, 0.018700437620282173, -0.021546563133597374, 0.016972005367279053, -0.0314737893640995, 0.015124107711017132, -0.010608218610286713, 0.0502706803381443, 0.01925840973854065, -0.00472846906632185, 0.0008183337631635368, -0.021623719483613968, 0.009174304082989693, -0.007957995869219303, -0.0065046651288867, -0.02052583359181881, -0.015405668877065182, 0.006319496314972639, 0.009036874398589134, -0.0015967460349202156, 0.01988130994141102, -0.010288374498486519, 0.020634179934859276, 0.004352307878434658, 0.016691869124770164, -0.014569345861673355, -0.05485374107956886, -0.022303789854049683, 0.034280359745025635, 0.0004928685957565904, -0.03127654641866684, 0.04598315805196762, -0.0062043028883636, 0.007751096971333027, 0.016245173290371895, -0.03644058480858803, 0.009384972974658012, -0.015137477777898312, 0.024864278733730316, 0.07803858816623688, 0.018962783738970757, 0.017632875591516495, 0.010487725026905537, 0.026926793158054352, -0.023821106180548668, -0.005072391126304865, 0.046660758554935455, -0.0019944391679018736, 0.0585949569940567, -0.01550676953047514, 0.025977207347750664, -0.0011136491084471345, 0.026676122099161148, -0.018229825422167778, 0.025737294927239418, -0.008940771222114563, 0.028034230694174767, 0.02842647023499012, 0.012610887177288532, -0.006814038380980492, 0.0037758543621748686, 0.04838672652840614, 0.025048421695828438, -0.04109449312090874, 0.022276919335126877, 0.017744041979312897, -0.0005722327041439712, 0.01434603612869978, 0.03273041918873787, 0.03781288117170334, 0.04613029584288597, 0.004660831298679113, 0.028572436422109604, 0.011326353065669537, -0.021394647657871246, 0.035512104630470276, -0.01854122430086136, 0.039891887456178665, 0.028193138539791107, 0.04210875928401947, 0.03369741886854172, -0.006585337221622467, -0.014812852256000042, 0.04218657314777374, -0.017043784260749817, 0.018450962379574776, 0.0887310653924942, -0.012820142321288586, 0.021975480020046234, -0.010867176577448845, -0.01466529630124569, -0.010230205953121185, 0.013385449536144733, 0.039844900369644165, 0.01297182310372591, -0.016662457957863808, 0.03164754435420036, -0.040055934339761734, 0.0020527199376374483, -0.012106399051845074, 0.006990851368755102, 0.05378572642803192, 0.0611514188349247, -0.008546636439859867, -0.0019643553532660007, 0.04318642243742943, -0.006601148284971714, -0.015274601988494396, -0.003179923165589571, -0.011541206389665604, -0.00852729007601738, -0.013466345146298409, -0.013664904050529003, -0.015437284484505653, -0.09785070270299911, -0.026032626628875732, -0.017963990569114685, 0.02630305476486683, 0.017003081738948822, 0.012265929952263832, -0.009070325642824173, -0.012226584367454052, 0.01981944777071476, 0.03257278352975845, 0.10159792006015778, 0.02000012993812561, 0.02917008474469185, 0.028009600937366486, 0.026738213375210762, -0.03828059136867523, 0.028883755207061768, 0.017291584983468056, 0.007635348476469517, -0.020748384296894073, 0.027668971568346024, 0.015378132462501526, 0.03198201209306717, 0.003867398714646697, 0.0013276402605697513, -0.03831891342997551, 0.08252542465925217, 0.025556156411767006, 0.03931412845849991, 0.0009539513848721981, 0.04427999258041382, 0.07177093625068665, -0.005614896304905415, -0.06261252611875534, 0.004346612840890884, 0.0988590270280838, -0.002394914161413908, -0.026918649673461914, 0.01528471801429987, -0.06377752125263214, -0.018589908257126808, 0.0172212366014719, -0.018732482567429543, 0.020947864279150963, -0.018144698813557625, -0.004044719040393829, 0.0216539204120636, -0.032803017646074295, -0.008693191222846508, 0.015653247013688087, -0.0414612777531147, -0.0033734317403286695, -0.019713232293725014, -0.014721943996846676, -0.01746845431625843, 0.01107525173574686, 0.005435445345938206, -0.0330614410340786, 0.009031428024172783, -0.010245735757052898, -0.0007648334722034633, 0.016083501279354095, 0.04067443683743477, 0.03945988044142723, 0.01584574766457081, 0.00969638116657734, 0.04928809031844139, 0.005274681374430656, 0.0037189943250268698, 0.023779142647981644, -0.010666660033166409, -0.025782231241464615, 0.004525734577327967, -0.010564946569502354, 0.07407412678003311, -0.011173688806593418, 0.00995947141200304, -0.014949562028050423, -0.1420525312423706, 0.021646231412887573, 0.022496724501252174, -0.08437363803386688, -0.0497589074075222, -0.009621649980545044, 0.01647108979523182, 0.06821879744529724, 0.015117840841412544, 0.03597003221511841, 0.01176421158015728, 0.02206583507359028, 0.051947031170129776, 0.030432000756263733, -0.07360324263572693, -0.01651747338473797, 0.059667620807886124, -0.0053519755601882935, 0.01920768804848194, 0.02378036640584469, -0.00863425899296999, 0.026489417999982834, -0.01313230860978365, -0.039848633110523224, 0.026225799694657326, -0.06868013739585876, -0.0015177599852904677, -0.03790876269340515, 0.04052669182419777, -0.029705209657549858, -0.004305860958993435, -0.0278293639421463, -0.0019320623250678182, -0.03162539750337601, -0.09608449041843414, -0.03538517653942108, -0.016762185841798782, 0.008008483797311783, 0.01138670276850462, -0.024207349866628647, -0.020671246573328972, -0.041176557540893555, 0.010203921236097813, -0.022209133952856064, 0.013758780434727669, -0.06472792476415634, 0.05852128937840462, 0.0067892842926084995, -0.02343546785414219, 0.016433745622634888, 0.008745916187763214, -0.02020982839167118, 0.0420413538813591, -0.008402579464018345, -0.01340040098875761, -0.03937654569745064, -0.0008050196338444948, -0.01095578633248806, 0.0015065877232700586, -0.020023997873067856, -0.022091824561357498, -0.01624310202896595, -0.04819032922387123, 0.004166198428720236, -0.0042655435390770435, -0.0289621502161026, 0.03384017571806908, -0.000620304374024272, 0.03458945080637932, -0.022580213844776154, 0.009474118240177631, -0.012584910728037357, 0.02835020236670971, 0.029917292296886444, 0.0027544868644326925, -0.04946235194802284, -0.033925753086805344, 0.051302120089530945, -0.030867496505379677, 0.003951546270400286, -0.02135941945016384, -0.00029802985955029726, 0.0015383497811853886, -0.028565341606736183, -0.03620942309498787, 0.018688710406422615, -0.0029219244606792927, -0.02372082509100437, 0.02241886593401432, 1.875776615634095e-05, 0.0297116469591856, -0.0028359703719615936, 0.0214989073574543, -0.014438844285905361, 0.009973593056201935, -0.020204491913318634, 0.08354096859693527, 0.02802003175020218, 0.02560051903128624, 0.022113025188446045, -0.021387511864304543, 0.014814711175858974, 0.032879721373319626, 0.01024769339710474, 0.0312851220369339, -0.015128295868635178, 0.028681736439466476, -0.03483866527676582, 0.030339570716023445, -0.0037290439940989017, 0.008498120121657848, -0.02991308644413948, -0.04261617362499237, -0.024746622890233994, 0.0032213053200393915, -0.017093122005462646, -0.0015333573101088405, 0.0014076657826080918, 0.02007192000746727, -0.025968115776777267, -0.004178686998784542, 0.008448481559753418, -0.022632263600826263, 0.010116307064890862, -0.013930569402873516, 0.0370376780629158, -0.048421747982501984, 0.001635274151340127, 0.016231337562203407, -0.039601873606443405, -7.594258931931108e-05, -0.018823808059096336, -0.017432844266295433, 0.014685534872114658, 0.019774412736296654, -0.0444491021335125, 0.006353823468089104, 0.03894561901688576, -0.035083964467048645, 0.02588197961449623, 0.014959987252950668, -0.069910429418087, 0.0004117760981898755, 0.014510431326925755, -0.010933308862149715, 0.07284467667341232, 0.011955232359468937, 0.002527352888137102]" ./train/dugong/n02074367_11823.JPEG,dugong,"[0.01680789701640606, -0.039930570870637894, 0.0005551370559260249, -0.0029791519045829773, -0.005976652726531029, -0.025581859052181244, 0.039540618658065796, -0.0015961498720571399, 0.017730489373207092, 0.01753830909729004, -0.025037245824933052, -0.03626348450779915, 0.049444444477558136, 0.02896924875676632, -0.007230881601572037, -0.027457373216748238, -0.007426478434354067, 0.038529831916093826, 0.007832560688257217, 0.03900892660021782, -0.07398829609155655, 0.0379386804997921, 0.019318440929055214, -0.022012079134583473, -0.0575355589389801, 0.008779173716902733, -0.010619313456118107, 0.0026110494509339333, 0.012567717581987381, -0.004634080920368433, 0.019442958757281303, 0.015870537608861923, -0.004784690216183662, 0.012522183358669281, -0.012629708275198936, 0.011089484207332134, -0.01805119775235653, 0.04120221734046936, -0.005603713449090719, 0.138532817363739, -0.04927489534020424, -0.008389955386519432, 0.014994241297245026, 0.007082644384354353, 0.01443648524582386, -0.0207150150090456, 0.022801965475082397, 0.04905703663825989, 0.0024540373124182224, -0.025355635210871696, -0.006872254423797131, 0.020235728472471237, 0.004344843793660402, 0.013275070115923882, -0.02373027242720127, 0.058443691581487656, -0.057251401245594025, 0.026014473289251328, -0.021821409463882446, -0.047420743852853775, 0.10781309008598328, -0.0012410628842189908, -0.008093388751149178, -0.040517766028642654, -0.06445067375898361, -0.016519447788596153, 0.00603761151432991, 0.0627838671207428, 0.022943247109651566, -0.0013826725771650672, 0.02751757763326168, -0.05706610903143883, -0.02193828672170639, -0.04140419885516167, 0.007255985401570797, -0.021494384855031967, 0.004216286353766918, -0.05529696121811867, 0.022307921200990677, -0.012939720414578915, 0.04065169766545296, 0.03264133259654045, -0.025232283398509026, -0.02004793845117092, 0.036589693278074265, 0.03596106916666031, 0.09564607590436935, -0.039314739406108856, -0.019175445660948753, 0.008935514837503433, 0.027689339593052864, 0.00815307442098856, -0.6562022566795349, 0.014057135209441185, -0.02378867007791996, 0.01741674356162548, 0.04235843941569328, -0.02096613310277462, -0.05500592291355133, -0.036122195422649384, -0.009710467420518398, -0.02721589244902134, -0.06466573476791382, -0.009775725193321705, 0.027491575106978416, 0.008114946074783802, -0.0126419086009264, -0.028764374554157257, -0.02488558180630207, -0.004302621819078922, -0.005497501697391272, -0.031191036105155945, 0.006975341588258743, -0.038555409759283066, -0.02610865980386734, -0.02143784426152706, 0.0042534456588327885, -0.027908239513635635, 0.03515271469950676, 0.009293712675571442, 0.03132474049925804, 0.03187446668744087, -0.01104640495032072, -0.004700202029198408, -0.016311464831233025, -0.007489372044801712, -0.049449946731328964, 0.02246391959488392, 0.0054812366142869, -0.01543806679546833, 0.02770685777068138, 0.01589016430079937, 0.003002424957230687, 0.08407746255397797, -0.0128079354763031, 0.03405135124921799, -0.020570669323205948, -0.05372627452015877, -0.019024474546313286, -0.03944500908255577, 0.0021360930986702442, -0.03874872252345085, -0.027289656922221184, 0.04425254836678505, -0.016799001023173332, 0.006657476536929607, -0.015388024970889091, 0.043183598667383194, 0.0020397475454956293, -0.018549801781773567, 0.020165495574474335, -0.010620418936014175, -0.044540174305438995, -0.041328683495521545, -0.010792028158903122, 0.0018218092154711485, 0.0015396662056446075, -0.03826671466231346, -0.023526707664132118, 0.03339584171772003, 0.003738266881555319, -0.03561745211482048, -0.016330206766724586, 0.00630038371309638, 0.030047805979847908, -0.026409512385725975, -0.01940849795937538, -0.008969939313828945, 0.03457989543676376, 0.03324536234140396, 0.016261190176010132, 0.016375066712498665, 0.010265585035085678, -0.002227233489975333, 0.00450223358348012, 0.015729976817965508, -0.11966578662395477, 0.008869465440511703, -0.031138258054852486, 0.029261238873004913, 0.025385256856679916, -0.033529166132211685, -0.002277245046570897, 0.00711031723767519, -0.020643915981054306, -0.02223476581275463, 0.009030602872371674, -0.013719563372433186, -0.013112052343785763, 0.0321488119661808, 0.025208672508597374, -0.032788898795843124, 0.021439213305711746, 0.013650992885231972, 0.010376013815402985, -0.009174344129860401, 0.02216080017387867, -0.024153264239430428, -0.059432972222566605, -0.003276645205914974, 0.04956391826272011, -0.033459607511758804, 0.0036952451337128878, 0.061245713382959366, 0.030745163559913635, 0.03304127976298332, 0.03888075053691864, -0.042250022292137146, 0.018542055040597916, 0.02489725686609745, 0.051432810723781586, 0.07062947750091553, 0.0066129243932664394, 0.017595199868083, 0.027590041980147362, 0.023865386843681335, -0.00942899938672781, 0.003109597135335207, 0.03035850077867508, -3.45783555530943e-05, 0.05986327305436134, -0.00476960651576519, 0.005444509908556938, -0.013622197322547436, 0.010277601890265942, 0.004317141603678465, 0.017873117700219154, 0.030686574056744576, 0.01375648844987154, 0.023287424817681313, 0.0058517553843557835, 0.005646106321364641, 0.045704085379838943, 0.03417767211794853, 0.023136168718338013, -0.006721783429384232, 0.017161622643470764, 0.02168036252260208, 0.00875786691904068, 0.03148525208234787, 0.03403794765472412, 0.05348726361989975, 0.062038030475378036, -0.010986105538904667, 0.009670673869550228, 0.026832638308405876, 0.0034214474726468325, 0.034207891672849655, 0.0014518651878461242, 0.022080207243561745, 0.01585416868329048, 0.04598725214600563, 0.04047812148928642, -0.011506241746246815, -0.007165465969592333, 0.05906152352690697, -0.0484059602022171, 0.020652467384934425, 0.05548270791769028, 0.057967543601989746, 0.04570214822888374, -0.036738138645887375, -0.014245512895286083, -0.010070218704640865, 0.03178369998931885, 0.022573281079530716, 0.0333184115588665, -0.036495059728622437, 0.02383136749267578, -0.038684457540512085, -0.003064917866140604, -0.004905821289867163, -0.015870442613959312, 0.03572232276201248, 0.0641956627368927, -0.026903249323368073, -0.030594194307923317, 0.04021495208144188, 0.010514643974602222, -0.00196646386757493, 0.020347293466329575, -0.026249781250953674, 0.002923611318692565, -0.022322967648506165, -0.0007708027842454612, 0.016839416697621346, -0.09263619035482407, -0.06832766532897949, -0.04686727747321129, 0.010110900737345219, 0.017958668991923332, 0.002598648890852928, 0.008487953804433346, -0.014006474055349827, -0.009476689621806145, 0.008288118056952953, 0.07643898576498032, -0.009969614446163177, -0.0048829419538378716, 0.008268226869404316, 0.046370457857847214, -0.04225638881325722, 0.0012040826259180903, 0.015978796407580376, 0.021241415292024612, -0.0023258798755705357, -0.007911184802651405, 0.03772039711475372, 0.02777530439198017, -0.02681959606707096, -0.008614183403551579, -0.0020661617163568735, 0.08392951637506485, 0.034946851432323456, 0.030450230464339256, 0.0016819280572235584, 0.012688074260950089, 0.06319628655910492, -0.027326710522174835, -0.025521589443087578, 0.010061328299343586, 0.16856975853443146, -0.022784866392612457, -0.009839235804975033, -0.013145600445568562, -0.0707382932305336, -0.011300664395093918, -0.006161742378026247, -0.03232536092400551, 0.028642963618040085, -0.0169728621840477, 0.006444073282182217, 0.007584386970847845, -0.027579905465245247, 0.00018019007984548807, 0.030456623062491417, -0.03860698640346527, 0.01714477501809597, -0.0428750216960907, -0.027486372739076614, -0.024495938792824745, -0.0044001806527376175, 0.012061169371008873, -0.01758745312690735, -0.012760540470480919, -0.017613818868994713, -0.008754799142479897, 0.004342427011579275, 0.03716094419360161, 0.03042922355234623, -0.027157878503203392, 0.02396756410598755, 0.028313057497143745, -0.023512333631515503, -0.013113298453390598, 0.035712819546461105, 0.03135376051068306, 0.036825332790613174, -0.012318759225308895, 0.03382829576730728, 0.07378149777650833, -0.03448006138205528, -0.006779983174055815, 0.029911840334534645, -0.011259018443524837, 0.018510673195123672, 0.0019242333946749568, -0.08283349871635437, -0.05985347181558609, -0.008532468229532242, 0.05360674858093262, 0.05330723151564598, 0.043524451553821564, 0.03876056522130966, 0.04071067273616791, 0.015750853344798088, 0.06360503286123276, 0.03621345013380051, -0.13169755041599274, -0.01846102811396122, 0.06176574528217316, -0.0381850004196167, 0.039281293749809265, 0.03426506742835045, 0.013878002762794495, 0.021749448031187057, -0.003855125280097127, -0.03674096241593361, -0.016463708132505417, -0.026017051190137863, 0.02682710438966751, -0.06050427258014679, 0.06159991770982742, -0.029174020513892174, -0.00165608711540699, -0.02430342137813568, -0.03250148519873619, -0.0011755786836147308, -0.09527941048145294, -0.03585842624306679, -0.04253390058875084, -0.013982561416924, 0.00877782516181469, -0.029982756823301315, -0.0022291194181889296, -0.03260689973831177, 0.013078552670776844, -0.030819809064269066, 0.01955331303179264, -0.07084526866674423, 0.06987105309963226, -0.00040995035669766366, -0.014907659962773323, 0.013260622508823872, -0.019219184294342995, -0.0579359345138073, 0.060950446873903275, 0.008854919113218784, -0.014356994070112705, -0.040628161281347275, 0.009603295475244522, -0.013999911025166512, 0.032809823751449585, -0.041022758930921555, -0.033867355436086655, -0.00060767907416448, -0.01734369993209839, 0.007818270474672318, 0.09344249963760376, -0.0033103032037615776, 0.011281331069767475, 0.013694616965949535, 0.0006333891651593149, -0.0028881377074867487, -0.02432090789079666, 0.0070868427865207195, 0.03354903310537338, 0.011979217641055584, 0.003992704674601555, -0.027796607464551926, -0.023147640749812126, 0.050573788583278656, -0.010938082821667194, 0.012987760826945305, -0.019953347742557526, 0.012910994701087475, -0.0008635318954475224, -0.026900144293904305, -0.0640803650021553, 0.015079811215400696, -0.024234341457486153, -0.06606008112430573, 0.024969108402729034, -0.0002554974635131657, 0.027151597663760185, -0.0034682496916502714, 0.02022349275648594, -0.006541742477566004, 0.0009463499300181866, -0.013393345288932323, 0.050512876361608505, 0.03455095365643501, 0.028697211295366287, -0.010553586296737194, -0.034474536776542664, 0.03142683207988739, 0.02796170487999916, 0.015100066550076008, -0.006786168087273836, -0.02625715732574463, -0.008665063418447971, -0.03309549018740654, 0.007885398343205452, -0.0491512268781662, 0.007973428815603256, -0.029892995953559875, -0.03528319671750069, -0.01202689204365015, 0.03985198587179184, -0.04427254572510719, -0.0174452755600214, -0.009451610967516899, -0.022366082295775414, -0.015190844424068928, -0.02189878188073635, -0.014750289730727673, -0.015274522826075554, -0.019742105156183243, -0.04481922462582588, 0.014551146887242794, -0.01146834809333086, -0.005978591740131378, 0.0033774971961975098, -0.04800480604171753, 0.019551310688257217, -0.029830005019903183, 0.00883132591843605, 0.029188092797994614, 0.0007549509755335748, -0.018821435049176216, -0.031513944268226624, 0.019312037155032158, -0.025032589212059975, -0.006404435727745295, 0.0425427071750164, -0.06335669755935669, 0.003315103705972433, 0.01579863764345646, 0.015926439315080643, 0.009068632498383522, 0.02293263003230095, 0.006966236978769302]" ./train/dugong/n02074367_15261.JPEG,dugong,"[0.0207271259278059, -0.015942184254527092, 0.009717571549117565, 0.0023249355144798756, -0.010859997011721134, -0.014937746338546276, 0.0357091948390007, 0.012473471462726593, 0.036426085978746414, 0.03215797618031502, -0.02557162195444107, -0.009165411815047264, 0.04899916052818298, 0.018861932680010796, -0.030740221962332726, -0.04326245188713074, 0.01026064157485962, 0.059911154210567474, -0.025202404707670212, -0.005498099140822887, -0.114258773624897, 0.014883162453770638, -0.024047095328569412, -0.003759225131943822, -0.033452462404966354, 0.02161279134452343, -0.03427853807806969, -0.013018820434808731, 0.019658301025629044, 0.005754409357905388, 0.035030800849199295, 0.0031476549338549376, -0.018771955743432045, 0.006920020096004009, 0.017560100182890892, 0.015630949288606644, -0.004225292708724737, 0.027821741998195648, 0.0030058356933295727, 0.22200024127960205, -0.012089740484952927, -0.002549129771068692, -0.003028460778295994, 0.015319827944040298, -0.03271561861038208, 0.023456906899809837, 0.046784549951553345, 0.04349932819604874, -0.009655104950070381, -0.011965611018240452, -0.06078086048364639, 0.013141836039721966, -0.041045092046260834, -0.01139482855796814, -0.006091523915529251, 0.034399714320898056, -0.08135688304901123, -0.0016931424615904689, -0.025505397468805313, -0.025926902890205383, 0.0964885950088501, 0.00691514927893877, -0.00849267840385437, -0.01767631620168686, -0.03944285213947296, 0.0033678999170660973, -0.02888990193605423, 0.12126483023166656, 0.04936645179986954, -0.006456123664975166, 0.055373772978782654, -0.0770535096526146, -0.006720623001456261, -0.042287811636924744, -0.0047359773889184, -0.022823458537459373, -0.014808105304837227, -0.008158457465469837, 0.021227989345788956, -0.024812065064907074, 0.005982446018606424, 0.041977111250162125, -0.04594886302947998, -0.019385244697332382, 0.04058437421917915, 0.03261938691139221, 0.06276703625917435, -0.03614291548728943, 6.777151429560035e-05, 0.008927153423428535, 0.026851441711187363, -0.007413063198328018, -0.6051619052886963, 0.0019400472519919276, -0.02629963308572769, 0.008674527518451214, 0.022601418197155, -0.03775510564446449, -0.0561290979385376, -0.04071555286645889, 0.011773498728871346, -0.009132510982453823, -0.06484291702508926, 0.010116003453731537, 0.011480689980089664, 0.024406930431723595, -0.05326012521982193, -0.03906913474202156, 0.0019084566738456488, -0.011900858953595161, -0.01466037891805172, -0.03957387059926987, 0.004174572881311178, -0.029185663908720016, -0.0218970887362957, -0.040768738836050034, 0.021932391449809074, -0.04047362133860588, 0.016705231741070747, 0.00635779183357954, 0.03590280935168266, 0.040007103234529495, -0.00799649115651846, 0.012023527175188065, -0.04067334905266762, 0.023757273331284523, -0.02502843737602234, 0.05269623547792435, 0.04523371160030365, -0.002644612453877926, 0.02233288064599037, -0.03215831518173218, -0.03484748676419258, 0.08360716700553894, -0.03059699758887291, 0.03880865499377251, -0.050951696932315826, -0.04753952473402023, -0.0004985951236449182, -0.03380622714757919, -0.007255973294377327, -0.03316254913806915, -0.024692310020327568, 0.01704910397529602, 0.00020822045917157084, 0.007159342058002949, -0.041012778878211975, 0.014063959941267967, -0.02831483818590641, 0.017198631539940834, 0.005282487720251083, 0.010410203598439693, -0.03012239746749401, -0.020290199667215347, -0.0024375433567911386, 0.00789127591997385, 0.012729478068649769, -0.051876138895750046, 0.00917600467801094, 0.03223424777388573, 0.0028478228487074375, -0.04357464611530304, -0.01859470270574093, 0.010419723577797413, -0.0018590338295325637, -0.03240155801177025, -0.014066708274185658, 0.013669599778950214, 0.0397430844604969, 0.03190760314464569, 0.008854233659803867, 0.03684963658452034, 0.017695920541882515, -0.01556339394301176, 0.014931529760360718, 0.00969855859875679, -0.14462077617645264, -0.011169258505105972, -0.02139214240014553, 0.035170797258615494, 0.02133074589073658, -0.05254991352558136, 0.005578592419624329, -0.0057190484367311, 0.00669100834056735, 0.0027943241875618696, 0.01416291669011116, -0.02362689934670925, -0.03074103407561779, 0.009838223457336426, 0.03039637953042984, -0.058766696602106094, 0.0006674905307590961, -0.003935670014470816, 0.049683962017297745, 0.016886219382286072, 0.02878149226307869, 0.01705208420753479, -0.04400000348687172, 0.017166391015052795, 0.014032295905053616, -0.025830939412117004, -0.0309133417904377, 0.05270368978381157, 0.02740798331797123, 0.038550473749637604, 0.037614718079566956, -0.05338862165808678, -0.017610713839530945, 0.025012340396642685, 0.04032459855079651, 0.033633142709732056, 0.008317583240568638, 0.019673064351081848, 0.025512224063277245, 0.04303552210330963, -0.01820862479507923, -0.0006662841187790036, 0.004921148996800184, -0.008632952347397804, 0.05771874263882637, 0.03606075793504715, -0.001576894661411643, -0.04928091913461685, 0.012296071276068687, 0.0025177288334816694, 0.004698184784501791, 0.04328807815909386, 0.006083591375499964, 0.024347279220819473, -0.01602621003985405, -0.017907215282320976, 0.005103456787765026, 0.03753422573208809, 0.021137673407793045, -0.06636615842580795, 0.03433326259255409, -0.002106868661940098, 0.001984951552003622, 0.0004775706329382956, 0.03646519035100937, 0.04888876900076866, 0.03500620275735855, -0.01997275836765766, -0.004115220159292221, 0.04910445585846901, 0.021150115877389908, 0.017255164682865143, 0.0006885247421450913, 0.05219502002000809, 0.027211396023631096, 0.05146293714642525, 0.0368712954223156, -0.02207910269498825, -0.021820668131113052, 0.048192866146564484, -0.016432417556643486, 0.029531197622418404, 0.047279998660087585, 0.05127998813986778, 0.00958287063986063, -0.0308099202811718, -0.04734475910663605, -0.021290775388479233, 0.007613194175064564, 0.013183746486902237, 0.03818776085972786, -0.00852843839675188, 0.007415648549795151, -0.020848719403147697, -0.022880274802446365, -0.021738877519965172, -0.004270258825272322, 0.05516086891293526, 0.06513962149620056, -0.03894422575831413, -0.03808660805225372, 0.014963273890316486, -0.004913125652819872, 0.017775464802980423, 0.008524728938937187, -0.012481633573770523, -0.012787684798240662, -0.006449989974498749, 0.009985401295125484, 0.012003027833998203, -0.09265150129795074, -0.05039030686020851, -0.027235981076955795, 0.0016814033733680844, 0.0033403001725673676, 0.020010776817798615, 0.029268912971019745, 0.0022303981240838766, -0.023274892941117287, 0.020997019484639168, 0.06004989892244339, 0.0016603529220446944, 0.06717279553413391, -0.009347466751933098, 7.5131979428988416e-06, -0.04731175675988197, 0.006062842905521393, 0.019396070390939713, -0.0018131585093215108, 0.0013812052784487605, 0.021984485909342766, 0.04362524300813675, 0.03814753144979477, -0.03409946337342262, 0.001639614230953157, 0.00016133331519085914, 0.08346594125032425, 0.015334993600845337, 0.056384067982435226, 0.01535522285848856, 0.004664862062782049, 0.032563671469688416, -0.020848872140049934, -0.02303379401564598, -0.009779703803360462, 0.14078395068645477, -0.05646822229027748, -0.016635190695524216, 0.01687975414097309, -0.07478882372379303, -0.029758621007204056, 0.007870721630752087, -0.003769038477912545, 9.208298433804885e-05, 0.0180527213960886, 0.013274768367409706, 0.010579729452729225, 0.0019136418122798204, -0.006344400811940432, -0.006673014257103205, -0.06318267434835434, 0.008457571268081665, -0.05631330981850624, -0.01700577139854431, -0.013061643578112125, -0.018258363008499146, 0.02153993584215641, -0.014433715492486954, 0.015608700923621655, -0.02045438066124916, -0.010484724305570126, 0.007231494877487421, 0.035461701452732086, 0.022504378110170364, 0.005355764180421829, 0.029053466394543648, -0.0036754265893250704, -0.005990064237266779, 0.005759282503277063, -0.011526526883244514, 0.03653582185506821, 0.01619698293507099, -0.006519355345517397, 0.017177565023303032, 0.0740542858839035, -0.030489766970276833, -0.04350850358605385, -0.00936140213161707, -0.03283102065324783, 0.0037631250452250242, -0.010254914872348309, -0.11447303742170334, -0.03897601738572121, 0.015429295599460602, 0.03523976355791092, 0.02928379736840725, 0.01638026162981987, 0.030433356761932373, 0.03142436593770981, 0.049254968762397766, 0.11000113189220428, 0.04525437578558922, -0.08406030386686325, -0.006476254668086767, 0.0570707805454731, -0.052644360810518265, 0.05353537201881409, -0.0021658064797520638, -0.01738005317747593, 0.03463985025882721, 0.0087467385455966, -0.04737138748168945, -0.020304491743445396, -0.08391320705413818, 0.0018413958605378866, -0.027291791513562202, 0.010011994279921055, -0.008484955877065659, 0.008150791749358177, -0.017193056643009186, -0.0305210892111063, 0.02014121226966381, -0.11248704046010971, -0.027931107208132744, -0.019812993705272675, -0.024427955970168114, -0.018361814320087433, -0.007646034937351942, 0.008514804765582085, -0.04924755170941353, 0.007794591132551432, -0.020684024319052696, 0.001028892700560391, -0.040838152170181274, 0.08701682835817337, -0.010342152789235115, 0.005983363837003708, -0.0010304893366992474, -0.022115558385849, -0.07938217371702194, 0.057470180094242096, 0.004881791304796934, 0.020432567223906517, -0.010946792550384998, -0.015467816963791847, -0.020662009716033936, 0.06889661401510239, -0.04577108100056648, -0.008761418052017689, -0.022586245089769363, -0.007988945581018925, 0.009876718744635582, 0.07271647453308105, -0.011128737591207027, 0.02022235468029976, -0.0013162221293896437, 0.027677180245518684, -0.0018901149742305279, -0.013406846672296524, -0.0006300209206528962, 0.017868420109152794, -0.002628427231684327, -0.009505162015557289, -0.025008579716086388, -0.02800077199935913, 0.02298397198319435, 0.0004866181989200413, -0.01628221943974495, -0.014254986308515072, 0.025975463911890984, -0.00656495476141572, -0.057996395975351334, -0.013157524168491364, 0.03876687213778496, -0.023390529677271843, -0.06221231073141098, 0.019506296142935753, 0.020693551748991013, 0.047203000634908676, 0.0035790554247796535, 0.007246971596032381, -0.024910319596529007, 0.04215308651328087, 0.0010575884953141212, 0.06711799651384354, 0.03747154399752617, 0.02214960940182209, -0.020902182906866074, 0.0025725567247718573, 0.0316665954887867, 0.012577904388308525, 0.02302229404449463, -0.0011287821689620614, -0.059289731085300446, -0.0014269587118178606, -0.03658584877848625, 0.022548099979758263, -0.04993470013141632, 0.003740524873137474, -0.05498260259628296, -0.06817565113306046, -0.03174550458788872, 0.014421003870666027, -0.039702896028757095, -0.00854587648063898, -0.03294352814555168, -0.003332028165459633, 0.004053478129208088, -0.005945512093603611, -0.025655215606093407, -0.04714053496718407, -0.016784589737653732, -0.03228212520480156, 0.03529227524995804, -0.011765184812247753, -0.0059154583141207695, 0.01888466812670231, -0.04379947483539581, 0.004574175924062729, -0.009735760278999805, -0.006679548881947994, 0.03320314362645149, -0.0034898805897682905, -0.0028550028800964355, -0.033065974712371826, 0.006997750140726566, -0.023069974035024643, 0.0054725161753594875, 0.019640136510133743, -0.0693543553352356, 0.0029013785533607006, -0.009836608543992043, -0.014186039566993713, 0.03759987652301788, 0.03281625732779503, 0.0059160515666007996]" ./train/dugong/n02074367_3178.JPEG,dugong,"[0.03390597924590111, -0.040185682475566864, 0.02659055031836033, -0.03299739956855774, -0.0008204036857932806, -0.040648944675922394, 0.018401464447379112, -0.010664818808436394, 0.07378926128149033, 0.05154155194759369, -0.004682326689362526, 0.028169050812721252, 0.035506341606378555, -0.0006751297623850405, 0.01171283982694149, 0.018237411975860596, 0.052500128746032715, 0.07476554811000824, -0.010410567745566368, 0.011885123327374458, -0.13307097554206848, 0.05690810829401016, 0.008915658108890057, -0.026935985311865807, -0.04874921962618828, 0.015382070094347, 0.027419762685894966, -0.02494543418288231, 0.0070120710879564285, 0.012729935348033905, 0.06060183048248291, 0.0021041317377239466, 0.017283422872424126, -0.020833570510149002, -0.048596929758787155, -0.018766509369015694, -0.005541450809687376, 0.04312121495604515, -0.028664136305451393, 0.16080257296562195, 0.007515918463468552, 0.04534771665930748, 0.0001967884018085897, 0.038020387291908264, 0.0032133683562278748, -0.025902485474944115, -0.008278591558337212, 0.0387108139693737, 0.020051516592502594, -0.01725013740360737, -0.015924202278256416, 0.039880964905023575, -0.016778720542788506, 0.004487158264964819, -0.005263813771307468, -0.019904449582099915, -0.06119658425450325, 0.03175128251314163, -0.035788197070360184, -0.02546919696033001, 0.08728501945734024, 0.048956047743558884, -0.011487274430692196, -0.0264274999499321, -0.0029096147045493126, -0.05015072599053383, -0.049302052706480026, 0.07444798201322556, 0.00023891936871223152, 0.018818169832229614, 0.018524479120969772, -0.016609691083431244, -0.0007111193845048547, -0.042423173785209656, 0.0008326788665726781, -0.012426828034222126, -0.008693421259522438, -0.04072471708059311, -0.010317454114556313, 0.008936856873333454, -0.014671897515654564, 0.025070631876587868, -0.014036535285413265, -0.09280578792095184, 0.07088541239500046, 0.00780439144000411, 0.07406763732433319, 0.00013267422036733478, -0.06226513534784317, -0.012093187309801579, -0.011624421924352646, 0.0030555827543139458, -0.6259869337081909, 0.043830059468746185, -0.0007039058837108314, -0.004209829494357109, 0.016061140224337578, -0.031137922778725624, -0.06357277929782867, -0.036730315536260605, -0.030179863795638084, -0.049370329827070236, -0.06180797889828682, -0.04712443798780441, 0.03601180762052536, 0.04825660586357117, -0.06742502748966217, -0.013753143139183521, -0.020441193133592606, -0.03631787374615669, 0.033643871545791626, -0.035350654274225235, 0.04426979273557663, -0.019859710708260536, -0.0035229974891990423, -0.00822607520967722, 0.05415360629558563, -0.04039165750145912, 0.03463643789291382, 0.0052177864126861095, -0.035647060722112656, -0.017895810306072235, 0.011590087786316872, 0.01676890067756176, -0.016311686486005783, -0.012618356384336948, -0.010871904902160168, 0.01737106591463089, 0.028647802770137787, -0.023311208933591843, 0.07449893653392792, -0.019144756719470024, -0.019832728430628777, 0.08450237661600113, -0.011156021617352962, 0.04442771524190903, 0.004830388817936182, 0.0027531981468200684, 0.033858079463243484, -0.015849320217967033, 0.022753145545721054, -0.02093849517405033, -0.03590979054570198, 0.019909825176000595, 0.015513982623815536, 0.0010059218620881438, -0.024242954328656197, 0.06318551301956177, -0.041594166308641434, 0.00693522859364748, 0.0373096689581871, -0.023490237072110176, -0.010799353942275047, -0.0035722125321626663, -0.045524802058935165, 0.04675121605396271, -0.004026268143206835, -0.012217935174703598, -0.010604041628539562, 0.03092578984797001, -0.015404910780489445, -0.04343492165207863, -0.0006527961231768131, 0.002779622096568346, 0.03765752166509628, -0.024002302438020706, -0.05297308415174484, -0.007373660337179899, 0.009020766243338585, 0.03945718705654144, 0.029697487130761147, -0.007594313472509384, 0.005262457765638828, 0.010207508690655231, -0.027477236464619637, 0.015790125355124474, -0.07551117986440659, 0.027012744918465614, 0.01355977077037096, 0.017042171210050583, 0.04847341030836105, -0.02173631265759468, 0.03790602087974548, 0.005301735829561949, -0.020525282248854637, -0.024586612358689308, -0.0012715747579932213, -0.07273919880390167, -0.06538835912942886, 0.0011006237473338842, -0.0017703853081911802, -0.04673385992646217, 0.00768129900097847, -0.0485970564186573, 0.043473273515701294, 0.022503284737467766, 0.04851749911904335, -0.010756319388747215, -0.014828079380095005, 0.0056001185439527035, 0.008251545019447803, -0.022342242300510406, -0.003812516573816538, 0.052387822419404984, 0.035220254212617874, 0.012079252861440182, 0.053629908710718155, -0.040011778473854065, 0.059882912784814835, 0.005548859015107155, -0.0068537285551428795, 0.0423637218773365, -0.017042111605405807, 0.03189671412110329, 0.02487838640809059, 0.01906793750822544, -0.00891693402081728, 1.339420305157546e-05, 0.029190734028816223, -0.009090032428503036, 0.10041479021310806, 0.06320660561323166, 0.016062451526522636, -0.003686926793307066, 0.04916422441601753, -0.01856955885887146, 0.009462971240282059, 0.03172292187809944, 0.0003011515364050865, 0.04798813536763191, 0.020720599219202995, -0.002316111931577325, -0.0065767839550971985, 0.025207409635186195, 0.001813280745409429, -0.06254113465547562, 0.0132947051897645, -0.033305421471595764, -0.038281697779893875, -0.033059682697057724, -0.021095043048262596, 0.05968732014298439, 0.020816704258322716, -0.016947362571954727, 0.04566517844796181, 9.154700819635764e-05, -0.035589661449193954, 0.016252784058451653, 0.008700137957930565, 0.033450014889240265, 0.01576576754450798, 0.009024699218571186, 0.007275812793523073, -0.02676312066614628, -0.012055318802595139, 0.029027780517935753, 0.007494905963540077, -0.020121539011597633, 0.04220416769385338, -0.04593093320727348, 0.003737485269084573, -0.021046575158834457, -0.025441555306315422, 0.018173055723309517, -0.003644547425210476, 0.0202705767005682, 0.0468997023999691, 0.0015135806752368808, 0.01988496258854866, -0.017146244645118713, -0.005854318384081125, -0.03597145900130272, -0.011316630989313126, 0.04791250824928284, 0.038631096482276917, -0.0017485665157437325, -0.055227864533662796, 0.052864208817481995, -0.027905263006687164, 0.053683631122112274, 0.014814261347055435, -0.009125263430178165, 0.01462910883128643, -0.008874628692865372, -0.019219322130084038, -0.05581575632095337, -0.08469272404909134, -0.006640063598752022, -0.04601510986685753, -0.0014460223028436303, 0.04507282003760338, 0.03651873394846916, -0.006784687750041485, -0.021199176087975502, -0.01155086699873209, -0.025282902643084526, 0.07677894830703735, 0.014102117158472538, 0.01206862274557352, 0.03269750252366066, 0.01106723677366972, -0.02091173082590103, 0.02177678979933262, 0.0018878027331084013, -0.05577109009027481, -0.012841351330280304, -0.00722384313121438, 0.0012792785419151187, 0.029085606336593628, -0.009980647824704647, -0.033947546035051346, -0.03518521413207054, 0.08442533016204834, 0.005778496619313955, 0.02240695431828499, -0.03283844143152237, 0.019463472068309784, 0.0633222684264183, -0.034271810203790665, -0.05499320104718208, 0.021885909140110016, 0.1482381522655487, -0.020282242447137833, -0.06209259480237961, 0.03821219876408577, -0.069712795317173, 0.029286684468388557, -0.01245148479938507, 0.03285085782408714, 0.006896854378283024, 0.0018550519598647952, -0.004735364578664303, 0.019016025587916374, -0.029980972409248352, 0.017302464693784714, 0.0034997104667127132, -0.022099342197179794, -0.009898043237626553, 0.009689351543784142, -0.023997195065021515, 0.003280463395640254, 0.017375262454152107, -0.0017275976715609431, -0.013375595211982727, 0.019819652661681175, -0.009316413663327694, -0.05637182667851448, 0.007881587371230125, 0.02297401614487171, 0.05129150673747063, 0.03337200731039047, 0.0028043987695127726, 0.03622186928987503, -0.026688916608691216, 0.014687356539070606, 0.006328987423330545, -0.0125886844471097, -0.05161251127719879, -0.027738144621253014, -0.0020829655695706606, 0.07510929554700851, -0.026823686435818672, 0.026447433978319168, 0.004438778385519981, -0.09139057248830795, 0.03208545967936516, 0.022641712799668312, -0.0652824118733406, -0.020021576434373856, 0.0022040517069399357, 0.02720622345805168, 0.06377359479665756, 0.010852141305804253, 0.02784988470375538, 0.04866478964686394, -0.008754042908549309, 0.05072854459285736, 0.031380388885736465, -0.07195335626602173, 0.007055035792291164, 0.040926702320575714, -0.0024878468830138445, 0.010256346315145493, 0.02079600654542446, 0.014867586083710194, 0.01831628940999508, -0.006430349312722683, -0.011054638773202896, 0.021002205088734627, -0.03129018470644951, -0.015943439677357674, -0.005257313139736652, 0.02571975812315941, -0.019041169434785843, -0.014675667509436607, -0.022990448400378227, -0.01741826720535755, -0.036414556205272675, -0.11412344872951508, -0.03182687982916832, -0.0340617373585701, 0.007159337401390076, -0.005245983600616455, -0.008252063766121864, -0.011615484021604061, -0.025134608149528503, -0.036213748157024384, -0.0178105216473341, 0.013595514930784702, -0.025845374912023544, 0.08067060261964798, -0.01598559319972992, 0.004866732284426689, 0.024155965074896812, -0.01853303238749504, -0.004373773001134396, 0.05678946524858475, -0.013674688525497913, -0.03232221677899361, -0.047767769545316696, -0.018182862550020218, 0.01615702174603939, -0.006619610358029604, -0.0543845109641552, 0.018189717084169388, 0.017248796299099922, 0.017984138801693916, 0.022716673091053963, -0.018600305542349815, -0.0242741908878088, 0.006833757273852825, -0.026262646540999413, 0.061547085642814636, -0.02798650413751602, 0.022212065756320953, -0.003541158512234688, -0.005691767204552889, 0.014578528702259064, 0.003973905462771654, -0.03514135628938675, -0.0395311675965786, 0.04270714148879051, 0.007976910099387169, 0.016830693930387497, -0.02269386313855648, 0.029232827946543694, 0.04897181689739227, -0.024320481345057487, 0.021387308835983276, 0.012588340789079666, -0.0021775809582322836, -0.024680476635694504, 0.0049484120681881905, -0.019764378666877747, 0.010481051169335842, -0.05099891871213913, 0.0006609187112189829, -0.0021286094561219215, 0.03661024570465088, -0.041596632450819016, 0.07747963815927505, 0.02715929038822651, 0.034545253962278366, 0.04170144349336624, 0.008497635833919048, -0.0051663536578416824, 0.013522257097065449, 0.006522876676172018, 0.03548572212457657, -0.008000250905752182, 0.00996277667582035, -0.04770741984248161, 0.0011372680310159922, -0.015102428384125233, -0.017120739445090294, -0.056817904114723206, -0.04515798017382622, 0.001530544483102858, 0.005934973247349262, -0.00901765190064907, -0.004240537062287331, -0.03546254709362984, -0.021075697615742683, -0.008143055252730846, 0.015078505501151085, 0.043716415762901306, -0.012564786709845066, 0.003947304096072912, -0.00588436471298337, 0.05225619673728943, -0.021541310474276543, -0.0013228331226855516, 0.028547069057822227, -0.05021059513092041, -0.00854486133903265, -0.02452486753463745, -0.0052316999062895775, -0.0016933100996538997, 0.04252544417977333, -0.0379425473511219, 0.025051452219486237, -0.02852288819849491, -0.04074046388268471, -0.03735091909766197, 0.001939662266522646, -0.039080992341041565, 0.014428510330617428, -0.00018761375395115465, -0.002521451562643051, 0.02065838873386383, 0.015679366886615753, 0.011241658590734005]" ./train/dugong/n02074367_10112.JPEG,dugong,"[0.05160451680421829, -0.04086168110370636, -0.008824692107737064, 0.017335759475827217, -0.025010034441947937, -0.018018729984760284, 0.005813916679471731, 0.020962204784154892, 0.037379033863544464, 0.04774583876132965, -0.04256656393408775, -0.007253571879118681, 0.06428108364343643, -0.018124541267752647, -0.00029355636797845364, -0.023355582728981972, -0.03275815397500992, 0.063141830265522, -0.01974269561469555, -0.023753076791763306, -0.04614438861608505, 0.015909060835838318, -0.02187511883676052, -0.033823300153017044, -0.02458730712532997, -0.00521041639149189, -0.010169776156544685, 0.01042008027434349, 0.0450875498354435, 0.0025662097614258528, 0.0379595085978508, -0.0038094837218523026, 0.031739216297864914, -0.03561139106750488, -0.0036792943719774485, -0.009370044805109501, 0.013337895274162292, 0.015216364525258541, 0.013560355640947819, 0.12428426742553711, 0.0069666230119764805, 0.014207149855792522, -0.0006961380131542683, 0.02788676507771015, -0.015012568794190884, -0.0633755549788475, 0.05647037923336029, 0.010608267970383167, -0.022432751953601837, -0.0027799978852272034, -0.04757673665881157, 0.007638217881321907, -0.035694658756256104, -0.010145231150090694, 0.009792884811758995, 0.016227249056100845, -0.023479655385017395, 0.014773190021514893, 0.010413402691483498, -0.023584308102726936, 0.03620833531022072, -0.0015709353610873222, 0.009443681687116623, 0.026007426902651787, -0.006100625731050968, -0.0062827677465975285, -0.01838005892932415, 0.10539904236793518, 0.03189043700695038, 0.03392789140343666, 0.04581984877586365, -0.042494866997003555, -0.03078426420688629, -0.03770719841122627, -0.009123646654188633, 0.03143982216715813, -0.0017142422730103135, 0.019514253363013268, -0.009789923205971718, -0.03509794920682907, -0.020016459748148918, 0.02691776491701603, -0.009270588867366314, -0.03322784975171089, 0.07474873214960098, 0.0132371811196208, 0.05526256561279297, -0.007440666202455759, -0.02857397496700287, 0.03192919120192528, 0.028109120205044746, -0.005923941265791655, -0.6080895066261292, 0.018903741613030434, -0.031147010624408722, 0.001378058921545744, 0.020787393674254417, -0.009039619006216526, -0.015638697892427444, -0.008895108476281166, 0.016498226672410965, 0.019056031480431557, -0.08235786855220795, -0.03320744261145592, 0.03209083154797554, 0.03871845826506615, -0.1266707330942154, -0.014571561478078365, -0.003655037609860301, -0.0370664969086647, 0.03517400473356247, 0.004837567452341318, 0.024592701345682144, 0.016826236620545387, -0.014126477763056755, -0.05557318404316902, 0.02465522289276123, -0.03475016728043556, 0.012098036706447601, 0.02834186889231205, -0.016987290233373642, 0.0020655666012316942, -0.032874420285224915, 0.030234333127737045, -0.025193821638822556, 0.027276983484625816, 0.02780228853225708, 0.03473278880119324, 0.037453655153512955, -0.051660120487213135, 0.026131676509976387, -0.018348131328821182, -0.02033371478319168, 0.08475425094366074, 0.0033549524378031492, -0.0007564900442957878, -0.02941354177892208, -0.04280314967036247, -0.003082942683249712, -0.018788473680615425, 0.02581281028687954, -0.0399889200925827, 0.010381754487752914, 0.008879708126187325, -0.016494816169142723, -0.01819247379899025, -0.026053020730614662, -0.01066013053059578, -0.014464423060417175, 0.017203154042363167, -0.022612521424889565, -0.012482313439249992, -0.04883289337158203, -0.004667945671826601, -0.017570139840245247, 0.015214430168271065, 0.04561330005526543, -0.02405823953449726, 0.010660464875400066, 0.054346714168787, -0.02608032338321209, -0.027220163494348526, 0.006107282359153032, 0.04660629853606224, 0.03448040038347244, -0.035152651369571686, -0.0348142646253109, 0.02415844239294529, -0.03202635422348976, 0.004476167727261782, 0.0021983589977025986, 0.023055337369441986, 0.03229938820004463, -0.04947686567902565, 0.008939624764025211, 0.02281469665467739, -0.08171363174915314, -0.01569146104156971, -0.03227594867348671, 0.0017646999331191182, 0.06674996018409729, 0.021666526794433594, 0.023663803935050964, -0.00709898816421628, -0.020989129319787025, -0.005992967635393143, 0.009703150950372219, -0.06394337117671967, -0.044872548431158066, 0.028814826160669327, 0.025739051401615143, -0.011248554103076458, -0.0006796371308155358, 0.006192182656377554, -0.007638857234269381, -0.0028248338494449854, 0.006364832632243633, 0.037775617092847824, -0.005801841150969267, 0.03374169394373894, 0.02730434201657772, -0.00705777807161212, -0.008032704703509808, 0.03567725419998169, 0.011238720268011093, 0.04726094380021095, 0.04845176264643669, 0.021671613678336143, 0.038620296865701675, 0.00900671724230051, 0.02045261114835739, 0.03256329894065857, -0.03217754513025284, 0.0123470239341259, 0.07443542033433914, 0.028689034283161163, 0.00574561208486557, -0.019724449142813683, -0.06998006254434586, -0.009049629792571068, 0.05604660511016846, 0.014582104980945587, -0.03721914440393448, -0.021318882703781128, -0.007699406240135431, -0.03375477343797684, 0.003127851290628314, 0.06389925628900528, -0.01424878928810358, 0.011594090610742569, -0.04368065297603607, -0.00906441267579794, 0.033374443650245667, 0.023448418825864792, 0.002241108100861311, -0.1166713535785675, 0.043375179171562195, 0.03128529712557793, -0.006288192234933376, -0.011489422991871834, 0.01975460909307003, 0.04584886133670807, 0.02013232745230198, 0.0016189442249014974, -0.007441563997417688, 0.01332923211157322, -0.00010887021198868752, 0.02783796936273575, -0.010063916444778442, 0.042656365782022476, 0.037074919790029526, 0.024011969566345215, 0.02679448574781418, -0.027628500014543533, -0.04495187848806381, 0.04795040935277939, 0.04210865870118141, 0.011248346418142319, 0.13301712274551392, -0.012714953161776066, 0.008163350634276867, -0.022498715668916702, -0.03611337020993233, 0.011480581015348434, -0.011164704337716103, 0.03219455108046532, 0.03499165549874306, -0.001057451474480331, -0.013844289816915989, -0.0155659643933177, 0.008792273700237274, -0.012348702177405357, 0.017964279279112816, 0.03606880083680153, 0.0660010501742363, -0.05213823914527893, -0.027695894241333008, 0.06797286868095398, -0.04933195933699608, -0.010366607457399368, 0.009342905133962631, -0.004491318482905626, -0.007314861752092838, -0.012981039471924305, 0.033487215638160706, 0.013859943486750126, -0.019957225769758224, -0.04420648515224457, 0.014758207835257053, 0.021757476031780243, 0.00552228232845664, 0.01762271858751774, -0.017109718173742294, -0.013875063508749008, 0.0022254404611885548, -0.017223890870809555, 0.1272502988576889, 0.028188427910208702, 0.030210290104150772, 0.042839761823415756, -0.026169726625084877, -0.03465832397341728, -0.016631511971354485, 0.019464686512947083, 0.016458475962281227, -0.0031743282452225685, 0.016198914498090744, 0.05465463548898697, 0.04064123332500458, -0.03061341494321823, -0.0008861334063112736, -0.02055400051176548, 0.08456722646951675, 0.029108326882123947, 0.035341519862413406, -0.036822907626628876, 0.02600381150841713, 0.07531619071960449, -0.049922529608011246, 0.002059878082945943, -0.00016771328228060156, 0.0801275297999382, -0.037917815148830414, -0.046423688530921936, 0.06547487527132034, -0.036315035074949265, -0.014778177253901958, 0.020859370008111, 0.00418428797274828, 0.008553426712751389, 0.02091807872056961, -0.010770478285849094, 0.024304386228322983, -0.041179437190294266, 0.0023590840864926577, -0.0300913043320179, -0.012658105231821537, 0.0019929129630327225, -0.05919279903173447, 0.004616194870322943, 0.00040079274913296103, -0.019162511453032494, -0.029750995337963104, -0.039662186056375504, 0.008651785552501678, -0.004690935369580984, -0.05823895335197449, 0.006677831523120403, 0.015862489119172096, 0.049562275409698486, 0.0450994148850441, -0.02469169907271862, 0.006871426943689585, 0.006905270274728537, -0.025765346363186836, -0.006491193547844887, 0.030575349926948547, -0.02738340198993683, 0.002261343877762556, -0.04283967614173889, 0.0640963613986969, -0.05633912235498428, -0.005227311048656702, 0.01796591654419899, -0.004702837206423283, 0.02704322151839733, -0.0021661780774593353, -0.1582155078649521, -0.02442363277077675, 0.01648966409265995, 0.005737595725804567, 0.05142896994948387, 0.004350720439106226, 0.03290398418903351, 0.058380115777254105, 0.028212834149599075, 0.1321781575679779, 0.013999782502651215, -0.1020486056804657, 0.012315571308135986, 0.015065822750329971, 0.00523467967286706, 0.05244177207350731, -0.007025066297501326, 0.009392565116286278, 0.04844225198030472, 0.05360807478427887, -0.005833705421537161, -0.02429390139877796, -0.03749827668070793, -0.026624826714396477, 0.01773952879011631, -0.007553025148808956, 0.015476149506866932, -0.021560028195381165, -0.008335646241903305, -0.008667152374982834, 0.030782129615545273, -0.12228395789861679, -0.03267756849527359, -0.02914893813431263, -0.03874826058745384, -0.06357221305370331, -0.012259169481694698, 0.004586934577673674, -0.02967151440680027, -0.01227454375475645, -0.00040525413351133466, 0.0038650748319923878, -0.00721984775736928, 0.07205991446971893, -0.04353358969092369, 0.03438203036785126, -0.004816174972802401, -0.010741565376520157, -0.05412204936146736, 0.06869759410619736, -0.004004120361059904, -0.03702065721154213, -0.021567657589912415, -0.023054275661706924, -0.005241320934146643, 0.03880547732114792, -0.0013114159228280187, 0.04504216089844704, -0.03912316635251045, 0.017641354352235794, 0.030842358246445656, 0.00873951893299818, -0.02118280902504921, -0.027100849896669388, -0.009809489361941814, -0.011722330003976822, -0.02758955769240856, -0.008431161753833294, 0.004007403738796711, 0.01241758931428194, 0.034009139984846115, 0.0010948179988190532, 0.016765881329774857, -0.05563298240303993, 0.03378620743751526, -0.020655432716012, -0.007006084080785513, -0.012741120532155037, -0.010544756427407265, 0.026800839230418205, -0.02843667007982731, -0.006318201310932636, 0.047609083354473114, -0.03853844106197357, -0.07882536202669144, -0.0063654338009655476, -0.020573753863573074, 0.05158204957842827, -0.05216433107852936, 0.0024766665883362293, 0.013847507536411285, 0.05307707563042641, 0.0025612101890146732, 0.0679079219698906, 0.013238750398159027, 0.015227040275931358, 0.020092952996492386, 0.01685224287211895, -0.04499329254031181, 0.025361668318510056, 0.02876795083284378, 0.026238173246383667, -0.025886625051498413, -0.01311357133090496, -0.04549434781074524, -0.032591812312603, -0.050935689359903336, -0.007922453805804253, -0.011247367598116398, -0.003048676298931241, 0.013384605757892132, -0.027698233723640442, -0.03363297879695892, -0.0017024576663970947, -0.027585873380303383, 0.021089302375912666, -0.0028032369446009398, 0.02688066102564335, -0.00026715462445281446, -0.030961429700255394, -0.03903861343860626, -0.019655300304293633, 0.04128825664520264, -0.022879553958773613, 0.016252342611551285, 0.01041700690984726, -0.050402458757162094, 0.014318290166556835, -0.06714195013046265, 0.020165247842669487, 0.02463979460299015, 0.010213890112936497, 0.028461409732699394, -0.018618794158101082, 0.0004039831692352891, -0.056366946548223495, -0.004205186851322651, 0.004672972951084375, -0.09253831207752228, 0.007200510706752539, -0.03113856352865696, 0.016890278086066246, 0.017588235437870026, -0.014423651620745659, 0.03245682269334793]" ./train/dugong/n02074367_21374.JPEG,dugong,"[0.029417818412184715, -0.02749280259013176, 0.022397490218281746, 0.028825504705309868, -0.0320800356566906, -0.010554543696343899, 0.007654890418052673, -0.009504959918558598, -0.018527425825595856, -0.04101550206542015, -0.03332674130797386, -0.06238800287246704, 0.08258990198373795, 9.65927101788111e-05, 0.03965413197875023, 0.0072495960630476475, -0.0542621836066246, 0.016631782054901123, 0.012515001930296421, -0.01512899436056614, -0.030008234083652496, 0.0059293052181601524, 0.029269864782691002, -0.08746584504842758, -0.014181531965732574, 0.012303439900279045, -0.0421590730547905, -0.009550106711685658, -0.006651553325355053, -0.007518822327256203, 0.01041332446038723, 0.03270693123340607, 0.009184520691633224, 0.00615253672003746, 0.002176782814785838, 0.005460456479340792, -0.00588315399363637, 0.01733768917620182, 0.0017904089763760567, 0.1374228447675705, 0.0038073479663580656, -0.025336947292089462, 0.008519809693098068, -0.009466663002967834, -0.007612734567373991, -0.18199598789215088, 0.056465744972229004, 0.026391174644231796, -0.0496087372303009, 0.00013852417760062963, -0.016922688111662865, 0.07219871878623962, -0.00789366289973259, -0.019056588411331177, -0.003986358176916838, 0.03438787907361984, -0.06672853231430054, -0.003531966358423233, 0.0025776743423193693, 0.004373996984213591, -0.005000131204724312, -0.02753838151693344, 0.029151400551199913, 0.024470722302794456, -0.011121273972094059, 0.04233254864811897, 0.013020194135606289, 0.1422002613544464, 0.05222175642848015, -0.020060257986187935, 0.033531010150909424, -0.04774908348917961, -0.000528883480001241, 0.015463408082723618, -0.021920805796980858, -0.02935130149126053, 0.014148895628750324, -0.03458869829773903, 0.0046087331138551235, -0.04361594095826149, 0.0259470846503973, 0.021460648626089096, -0.04384225606918335, 0.0018539560260251164, 0.024073470383882523, -0.005513851996511221, 0.05402315780520439, -0.04239942505955696, -0.06878680735826492, 0.031239306554198265, 0.016342077404260635, -0.021081874147057533, -0.6209367513656616, 0.04314276948571205, -0.021261218935251236, -0.004862801171839237, 0.01413101889193058, -0.009893251582980156, 0.054761096835136414, -0.08576488494873047, 0.0009899422293528914, -0.030347641557455063, -0.044812705367803574, 0.013851693831384182, 0.0037319487892091274, 0.047643326222896576, -0.11760196089744568, 0.0036375713534653187, 0.02320195734500885, -0.023581238463521004, -0.0003236769116483629, -0.009361195378005505, 0.007346837315708399, -0.04224875196814537, -0.014959299005568027, -0.03506232425570488, 0.007209199946373701, -0.020557323470711708, 0.04637349769473076, 0.025886336341500282, 0.01533820852637291, 0.02394823171198368, -0.050451964139938354, 0.014941539615392685, -0.006908020004630089, 0.0278076883405447, 0.005140568129718304, 0.05297861620783806, 0.025613920763134956, -0.015309927985072136, 0.012165739201009274, 0.04273105040192604, -0.007837696932256222, 0.07549718022346497, 0.02791680209338665, -0.003720395965501666, -0.027375444769859314, -0.023985980078577995, -0.025878572836518288, 0.003493457566946745, 0.014583941549062729, -0.054407890886068344, -0.012386155314743519, 0.04626047611236572, 0.008836318738758564, 0.011336689814925194, 0.003622025717049837, -0.011442124843597412, -0.013081099838018417, 0.009065980091691017, 0.003019623691216111, 0.01283267606049776, 0.06003224477171898, -0.041858166456222534, -0.007185889407992363, -0.020207203924655914, 0.009180703200399876, -0.0714961588382721, 0.005043079610913992, 0.026284005492925644, 0.0286711398512125, -0.017516708001494408, -0.026065343990921974, 0.008775732479989529, -0.004848984070122242, -0.005863694939762354, 0.06082114577293396, 0.05103060230612755, -0.004194195382297039, -0.014960629865527153, 0.023943495005369186, 0.01970372162759304, -0.009780490770936012, -0.02466402016580105, 0.03956175595521927, 0.014601020142436028, -0.09792619198560715, -0.005657723639160395, -0.10729752480983734, 0.038089241832494736, 0.03836378827691078, -0.01482055988162756, 0.009740982204675674, 0.041373029351234436, 0.015635712072253227, 0.00017959465913008898, 0.001160361454822123, -0.010137390345335007, -0.025738263502717018, 0.03946642950177193, -0.03487008810043335, -0.03307047486305237, 0.00236518238671124, -0.015050257556140423, 0.004051392897963524, 0.035667601972818375, 0.021294068545103073, 0.019383206963539124, -0.07073071599006653, 0.025522394105792046, 0.03421971946954727, -0.02955750934779644, -0.02412760630249977, 0.02572784386575222, 0.023971032351255417, 0.04248141124844551, -0.00908823311328888, -0.033043090254068375, 0.020273538306355476, 0.025686748325824738, 0.021876821294426918, -0.021626418456435204, 0.004920066334307194, -0.013229015283286572, 0.038730040192604065, 0.032206643372774124, 0.029531214386224747, 0.0034922331105917692, -0.05353248864412308, 0.0010571159655228257, 0.05139460042119026, 0.030203858390450478, -0.01390265766531229, -0.061547379940748215, 0.06243491545319557, 0.037472523748874664, 0.004144215025007725, 0.0397803895175457, 0.009140728041529655, 0.013743107207119465, -0.015998419374227524, -0.015915922820568085, -0.0252237468957901, 0.006103598512709141, 0.005261389072984457, -0.028522158041596413, -0.008518511429429054, -0.011704760603606701, 0.009425620548427105, 0.013066261075437069, -0.004232125822454691, 0.037268493324518204, 0.017052965238690376, -0.03278902545571327, -0.023846428841352463, 0.05736786872148514, 0.016065800562500954, -0.003131476230919361, -0.008411292918026447, 0.03201732039451599, 0.011114434339106083, 0.026051754131913185, 0.029238754883408546, -0.02507649175822735, 0.007669514510780573, 0.029948214069008827, -0.00974711962044239, -0.027238231152296066, 0.10824371874332428, 0.0003513652191031724, 0.0021938313730061054, 0.02781069651246071, -0.0046499790623784065, 0.036289047449827194, 0.017950529232621193, -0.012940436601638794, 0.0352686271071434, -0.02869488298892975, 0.021022623404860497, -0.002300122519955039, 0.004564991686493158, 0.007820592261850834, 0.04150999337434769, 0.025278767570853233, -0.01804615557193756, -0.014014809392392635, -0.031216826289892197, -0.004511264618486166, -0.05137171596288681, 0.02714170515537262, 0.0008580334833823144, -0.010184051468968391, 0.02130662277340889, 0.05238805338740349, -0.03895287588238716, 0.007915490306913853, -0.037134479731321335, -0.01813940517604351, -0.012883871793746948, 0.018472746014595032, -0.028128325939178467, 0.025474868714809418, -0.006739980075508356, 0.024166837334632874, -0.009984741918742657, -0.009364102967083454, 0.11416348814964294, 0.0612252913415432, 0.043494634330272675, 0.0093082245439291, -0.013706573285162449, -0.04434814676642418, -0.028809774667024612, 0.04284803941845894, 0.05264165624976158, -0.016026033088564873, 0.024358609691262245, 0.03510449454188347, 0.05740503966808319, 0.01647922396659851, -0.03924908861517906, 0.017842380329966545, 0.07535838335752487, 0.0557144396007061, 0.04895319044589996, 0.034886691719293594, 0.020914297550916672, 0.03136637061834335, -0.03091307543218136, 0.0012416497338563204, 0.04533935710787773, 0.0932580903172493, -0.029547085985541344, -0.006479866802692413, 0.042843665927648544, -0.05149774253368378, -0.007727247662842274, -0.016009213402867317, 0.02798219583928585, -0.0149184325709939, 0.0036265149246901274, 0.011420082300901413, 0.004561426118016243, -0.024792363867163658, -0.01779654435813427, -0.037307530641555786, -0.014888930134475231, -0.007987681776285172, -0.0112842358648777, -0.04561074078083038, -0.020092343911528587, -0.016603518277406693, 0.03250911086797714, 0.003929403144866228, -0.015600045211613178, -0.041759293526411057, 0.00487375957891345, 0.034865591675043106, 0.04415924847126007, 0.06894416362047195, 0.009371920488774776, -0.010459783487021923, 0.03635893017053604, 0.053288474678993225, 0.001006492180749774, -0.07648380845785141, 0.03076210804283619, 0.09602537006139755, 0.0029140771366655827, -0.0028452565893530846, 0.019536783918738365, -0.011538166552782059, 0.018980003893375397, -0.00564920948818326, -0.014703133143484592, -0.0013113594613969326, 0.0053500887006521225, -0.10995195060968399, -0.03191779926419258, 0.011757279746234417, 0.011451761238276958, 0.029710300266742706, 0.004613833501935005, 0.0210189800709486, 0.051903460174798965, 0.025798840448260307, 0.12768134474754333, -0.001123088994063437, -0.05694901570677757, 0.0291749220341444, 0.010079417377710342, -0.05844002217054367, 0.007551990915089846, -0.030300365760922432, -0.017440635710954666, -0.02141297422349453, 0.050008054822683334, 0.009753904305398464, -0.02966182306408882, -0.0074190404266119, 0.019067969173192978, 0.037725552916526794, 0.01794479228556156, 0.04248596727848053, -0.015816684812307358, -0.00408422714099288, -0.0008088970789685845, 0.026619570329785347, -0.03901723399758339, 0.004631588701158762, -0.029091399163007736, -0.04242108762264252, -0.008750377222895622, -0.018912389874458313, 0.010358368046581745, -0.015349861234426498, 0.00913479458540678, 0.03339886665344238, 0.007861748337745667, 0.0008343594963662326, 0.0325351320207119, -0.003380443435162306, 0.003668423742055893, 0.023304017260670662, -0.015824539586901665, 0.0029201130382716656, 0.05589926615357399, 0.04761454090476036, -0.031069612130522728, -0.011194298975169659, -0.005914517678320408, 0.00012927188072353601, 0.03930213674902916, -0.04975869506597519, -0.02430667355656624, -0.016368309035897255, 0.0013171874452382326, 0.04360659420490265, 0.03499947488307953, -0.012418563477694988, 0.02960306406021118, 0.011569501832127571, 0.02082895115017891, -0.013868490234017372, 0.027164412662386894, 0.017736537382006645, -0.021161112934350967, -0.028855154290795326, -0.005872318521142006, 0.005131169687956572, -0.0007030805572867393, 0.04038823023438454, -0.0020928161684423685, 0.02660057134926319, 0.0019814693368971348, -0.03237224370241165, -0.029093684628605843, -0.050179172307252884, -0.016583086922764778, 0.013125604018568993, 0.0014187970664352179, -0.061514731496572495, 0.007128123659640551, 0.013485072180628777, 0.02050727605819702, -0.044531114399433136, -0.0016551854787394404, 0.0521816611289978, 0.01906886138021946, -0.012326284311711788, 0.004903995431959629, -0.003526776097714901, -0.012698294594883919, 0.012290777638554573, -0.031156282871961594, 0.04362259432673454, 0.015453523956239223, 0.0029430899303406477, -0.014795724302530289, -0.02527627907693386, 0.004102073609828949, -0.044211987406015396, 0.03417770192027092, -0.05969623848795891, 0.007080919109284878, -0.04080933704972267, -0.03471093997359276, 0.000520680274348706, 0.004926913417875767, -0.028403587639331818, -0.010144145227968693, 0.01416296698153019, 0.018628664314746857, -0.00334054883569479, 0.04398588091135025, 0.011833400465548038, 0.007821056991815567, -0.01725374162197113, -0.07110024243593216, 0.003627707250416279, 0.030090464279055595, -0.0053660012781620026, 0.03876768797636032, -0.08466411381959915, -0.02282056026160717, 0.023107804358005524, -0.0008345009409822524, 0.051081106066703796, -0.0022845559287816286, 0.008887168020009995, 0.010028725489974022, 0.027558399364352226, -0.008673170581459999, -0.01878313347697258, 0.055934611707925797, -0.026883751153945923, 0.030919983983039856, 0.02560657262802124, -0.026160938665270805, 0.04701783508062363, 0.025675911456346512, 0.0598909854888916]" ./train/dugong/n02074367_7060.JPEG,dugong,"[0.059262074530124664, -0.02852904051542282, 0.008200756274163723, 0.014686500653624535, -0.02833278477191925, -0.041032835841178894, 0.010218882001936436, 0.024783171713352203, 0.025357911363244057, 0.029390987008810043, -0.04594612866640091, -0.005088328383862972, 0.07132141292095184, 0.006109017878770828, 0.01691720075905323, -0.0052061863243579865, -0.03721337020397186, 0.04897482693195343, -0.02638813853263855, -0.012774444185197353, -0.07863449305295944, 0.018247418105602264, -0.03213677927851677, -0.023833028972148895, 0.010815581306815147, 0.012158602476119995, -0.023517126217484474, -0.013670193031430244, -0.011110263876616955, 0.005682935006916523, 0.0623311772942543, 0.026840899139642715, -0.003992255311459303, -0.0253131240606308, 0.026223205029964447, 0.015824677422642708, -0.01964101567864418, 0.0286979041993618, 0.03559131175279617, 0.18282034993171692, 0.007959953509271145, 0.013239317573606968, -0.009563006460666656, 0.05078337341547012, -0.0019420161843299866, -0.0035664737224578857, 0.03866293653845787, 0.0117268655449152, 0.009712600149214268, -0.03041357733309269, -0.0457601435482502, 0.006801143288612366, -0.023833593353629112, -0.022764844819903374, -0.006119104567915201, 0.017996173352003098, -0.00890494417399168, 0.0157565176486969, -0.018834253773093224, -0.008689938113093376, 0.05887743458151817, -0.0052246227860450745, -0.03061828203499317, 0.0007562513928860426, -0.006490397732704878, -0.008138459175825119, -0.010900040157139301, 0.08825558423995972, 0.036287467926740646, 0.04167041927576065, 0.036240626126527786, -0.023175785318017006, 0.0018193019786849618, 0.005226077977567911, -0.030204305425286293, 0.00015749245358165354, 0.043210469186306, 0.00032684841426089406, 0.006888877600431442, -0.028416218236088753, -0.03967981040477753, 0.006727166008204222, -0.009509474970400333, -0.08150686323642731, 0.05805136263370514, 0.004657460376620293, 0.032210659235715866, 0.016590386629104614, -0.02900782972574234, 0.031678032130002975, 0.05734040588140488, 0.005773460958153009, -0.5962400436401367, 0.03869045525789261, -0.03968418389558792, 0.005712402984499931, 0.03753836080431938, -0.027267836034297943, -0.01715620420873165, -0.037001755088567734, -0.02068488672375679, -0.021015658974647522, -0.08994781970977783, -0.01644214242696762, 0.023318681865930557, 0.06337990611791611, -0.1548517495393753, 0.0022358556743711233, 0.02262396179139614, -0.014717094600200653, 0.01334613747894764, -0.0077975159510970116, 0.017907656729221344, 0.013450133614242077, 0.004649098496884108, -0.060131002217531204, 0.007283995859324932, -0.058780256658792496, 0.02288011834025383, 0.002935508731752634, -0.0057064988650381565, -0.011654166504740715, -0.014559348113834858, 0.04473966732621193, -0.04217178747057915, 0.024114614352583885, -0.007609172258526087, 0.04133275896310806, 0.06834125518798828, -0.06600059568881989, 0.0530470535159111, 0.03172536566853523, -0.008068985305726528, 0.0807020366191864, -0.022457221522927284, 0.004014329053461552, -0.026944544166326523, -0.02866738848388195, 0.05744604393839836, -0.05212677642703056, 0.013547667302191257, -0.0334448404610157, -0.005110300611704588, 0.026500288397073746, 0.0414302758872509, -0.03563404455780983, -0.016748476773500443, -0.003730100579559803, 0.016104599460959435, 0.012211687862873077, -0.005056431517004967, -0.024120615795254707, -0.003086949000135064, -0.0180226881057024, -0.022221943363547325, 0.02693498693406582, 0.04226521775126457, -0.033780038356781006, -0.012690838426351547, 0.029256662353873253, 0.014897270128130913, -0.009423506446182728, 0.039851635694503784, 0.026840075850486755, 0.034961018711328506, -0.043057121336460114, -0.03751284256577492, 0.025018461048603058, -0.006101841572672129, 0.03379303961992264, 0.025078877806663513, 0.04977934807538986, 0.016042908653616905, 0.03263859078288078, -0.0013583173276856542, 0.0064966436475515366, -0.07644687592983246, 0.003324733814224601, -0.0019942503422498703, 0.031200049445033073, 0.08380961418151855, -0.015248735435307026, 0.02513820491731167, -0.027313224971294403, -0.022236695513129234, -0.0009092416148632765, 0.0027312140446156263, -0.053948793560266495, -0.0632040724158287, 0.03297265246510506, 0.04093404486775398, -0.028291240334510803, 0.0037792876828461885, 0.008668477647006512, 0.021189549937844276, -0.012678735889494419, 0.01709817536175251, 0.006124168634414673, 0.012508322484791279, 0.02937145158648491, -0.019429629668593407, -0.008676998317241669, -0.008337421342730522, 0.01581849716603756, 0.0005990237696096301, 0.01896466128528118, 0.0580112598836422, -0.04598260670900345, 0.017485545948147774, 0.0176051314920187, 0.03120887465775013, 0.027776507660746574, -0.02952740713953972, 0.010790310800075531, 0.06449706852436066, -0.012033598497509956, -0.01490011252462864, -0.03971342369914055, -0.0755910575389862, -0.03876061737537384, 0.05450122803449631, 0.037693288177251816, -0.017877884209156036, 0.011154522188007832, 0.01541613694280386, -0.035829078406095505, 0.025968652218580246, 0.07232753187417984, -0.018814856186509132, 0.03341452032327652, -0.028994470834732056, -0.016394836828112602, 0.03479804843664169, 0.006959754507988691, -0.005728268064558506, -0.0793437510728836, 0.061256226152181625, 0.037069302052259445, -0.0036926332395523787, 0.02611961029469967, 0.021272512152791023, 0.037278153002262115, 0.016077743843197823, -0.0026676971465349197, -0.004513401538133621, 0.03413340821862221, 0.02607492357492447, 0.021650349721312523, 0.0024244084488600492, 0.04419299215078354, 0.05472496896982193, 0.025723014026880264, 0.03370692580938339, -0.014614022336900234, -0.023267623037099838, 0.040920231491327286, 0.044652365148067474, -0.005172654055058956, 0.04051940515637398, 0.005051525309681892, 0.0010328288190066814, -0.014495707117021084, -0.008951844647526741, 0.01358195673674345, -0.005648024845868349, -0.02309538424015045, 0.004738155286759138, 0.018510911613702774, 0.010503451339900494, -0.02596328780055046, -0.0018102808389812708, -0.048946771770715714, -0.0005572776426561177, 0.05651117488741875, 0.057062845677137375, -0.017797967419028282, -0.049632951617240906, 0.06832506507635117, -0.015045874752104282, -0.006516492459923029, 0.005826087202876806, -4.219896800350398e-05, 0.020009633153676987, 0.0010830949759110808, -0.017163069918751717, -0.00935523770749569, -0.08718332648277283, -0.053389403969049454, -0.013362960889935493, 0.03188806399703026, 0.02562035620212555, -0.024922026321291924, -0.02444278821349144, -0.011501861736178398, -0.029737431555986404, 0.011725716292858124, 0.12413392961025238, 0.03958548977971077, 0.03718775138258934, 0.04773017019033432, 0.03471236675977707, -0.0659058541059494, -0.00208974233828485, 0.003397188847884536, 0.009219708852469921, 0.01702350750565529, -0.014361920766532421, 0.04600818455219269, 0.02243504486978054, -0.013060471042990685, 0.018899621441960335, -0.03378316015005112, 0.08052501082420349, 0.018714874982833862, 0.02782730758190155, -0.02843315340578556, 0.01984141580760479, 0.0489637590944767, -0.03291142359375954, -0.027719125151634216, 0.016893742606043816, 0.07846233248710632, -0.019119631499052048, -0.02706146240234375, 0.0586906336247921, -0.033547669649124146, -0.0014340062625706196, 0.021568026393651962, -0.008466796949505806, -0.01303024496883154, 0.05484374240040779, -0.03194548934698105, -0.00044585915748029947, -0.0036091480869799852, 0.005806236527860165, 0.0007106402772478759, -0.029643753543496132, 0.002650459995493293, -0.08054954558610916, -0.0029141572304069996, -0.01974749006330967, -0.02524522878229618, 0.0026464483235031366, -0.0299844853579998, 0.0362243689596653, -0.014848916791379452, -0.05107820779085159, 0.017225580289959908, 0.015199634246528149, 0.044181082397699356, 0.018404897302389145, -0.02555731125175953, 0.017524220049381256, 0.0034502320922911167, -0.006464553065598011, -0.018469849601387978, 0.030721647664904594, -0.07944873720407486, -0.008792581036686897, 0.02627483382821083, 0.030473928898572922, -0.014164134860038757, 0.00974416546523571, 0.014655494131147861, -0.005401588510721922, 0.0327644906938076, 0.010031560435891151, -0.13565580546855927, -0.0018030756618827581, -0.02201501466333866, 0.034727632999420166, 0.05327530577778816, -0.002336416393518448, 0.013015870936214924, 0.010049009695649147, 0.024126656353473663, 0.06691164523363113, 0.028738893568515778, -0.0984632596373558, -0.010201051831245422, -0.00955661479383707, -0.003013464855030179, 0.025180736556649208, -0.014921236783266068, -0.00667417049407959, 0.04205111041665077, 0.0009818710386753082, -0.030864499509334564, 0.011825074441730976, -0.13531282544136047, -0.05985011160373688, 0.0029807621613144875, -0.016545370221138, -0.011260494589805603, -0.010318874381482601, -0.017639683559536934, -0.027495242655277252, 0.010752386413514614, -0.1097666546702385, -0.029221585020422935, -0.030045941472053528, -0.021418577060103416, -0.0659475177526474, -0.02252066507935524, -0.004265727940946817, -0.037892382591962814, 0.007170052733272314, -0.005333576817065477, -0.022445011883974075, -0.03571439906954765, 0.09386730939149857, -0.022331660613417625, 0.01600784622132778, -0.00025718455435708165, -0.01385135855525732, -0.057677749544382095, 0.07939046621322632, -0.023518702015280724, -0.009020373225212097, 0.013483665883541107, -0.003691719379276037, 0.020415818318724632, 0.018296856433153152, -0.02778441086411476, 0.0036637766752392054, -0.001296229544095695, -0.0010399167658761144, 0.028768716380000114, -0.006540370173752308, 0.00414701085537672, -0.008394753560423851, -0.012821534648537636, 0.01928282529115677, -0.03558502346277237, -0.009558005258440971, -0.022615626454353333, 0.031726136803627014, 0.01907137595117092, -0.007893035188317299, 0.020429348573088646, -0.03779648244380951, 0.03299529477953911, -0.0070337955839931965, 0.0021128638181835413, -0.007394574582576752, -0.0037745656445622444, 0.03226088359951973, -0.03232015296816826, -0.012884779833257198, 0.002448933431878686, -0.017063654959201813, -0.059817615896463394, 0.018143411725759506, -0.02018689550459385, 0.02522657811641693, -0.012246957048773766, 0.03186066821217537, 0.004549513105303049, 0.04333018511533737, -0.03633994236588478, 0.08170217275619507, 0.006995723117142916, 0.00814110692590475, 0.05201481655240059, -0.01231411099433899, -0.03376278281211853, 0.04995820298790932, 0.005994840990751982, 0.007442721165716648, -0.03793623298406601, 0.00023424890241585672, -0.052689582109451294, -0.024228591471910477, -0.05654093623161316, -0.008481921628117561, -0.034136369824409485, -0.041700903326272964, -0.013220305554568768, -0.025396082550287247, -0.06590497493743896, 0.004314634948968887, -0.025014838203787804, 0.054759107530117035, -0.012063982896506786, 0.001161233871243894, -0.008183995261788368, -0.030353056266903877, -0.027185766026377678, -0.04238748922944069, 0.0466727688908577, -0.036366064101457596, -0.0026018714997917414, 0.012176497839391232, -0.04636469483375549, 0.018495900556445122, -0.04632970690727234, 0.0017186993500217795, 0.034248918294906616, -0.0009713858598843217, 0.002584039466455579, -0.039161838591098785, 0.006269150413572788, -0.0722799077630043, 0.0041846721433103085, -0.006943091284483671, -0.052184585481882095, 0.01068514958024025, -0.029934247955679893, 0.03109833225607872, 0.0023051495663821697, 0.004937383811920881, 0.016464686021208763]" ./train/dugong/n02074367_16898.JPEG,dugong,"[0.014334495179355145, -0.034492265433073044, 0.027424979954957962, -0.015586075372993946, 0.004330987576395273, -0.032203543931245804, 0.02889249473810196, -0.00760772917419672, 0.03619829937815666, 0.030153347179293633, -0.037834446877241135, -0.02101578563451767, 0.049716487526893616, 0.02289874479174614, -0.0006762125412933528, -0.023938123136758804, -0.001636283122934401, 0.05429702252149582, 0.017135262489318848, 0.020170418545603752, -0.10655242949724197, 0.021334726363420486, 0.01365929190069437, -0.025076115503907204, -0.052896492183208466, 0.007826485671103, -0.01846603862941265, -0.019659660756587982, 0.02402694895863533, -0.00912598054856062, 0.04302302375435829, 0.00643961550667882, 0.010759454220533371, 0.004474778193980455, 0.010112453252077103, 0.011984395794570446, 0.0012348184827715158, 0.050383396446704865, -0.02941036783158779, 0.20474982261657715, -0.015816891565918922, -0.005705585237592459, -0.0035538622178137302, 0.029605718329548836, -0.00933417584747076, -0.023077262565493584, 0.027044041082262993, 0.022316131740808487, -0.009276550263166428, -0.027429889887571335, -0.03851594403386116, 0.008386257104575634, -0.007568973582237959, -0.012806698679924011, 0.00038143209530971944, 0.02392507717013359, -0.06285367906093597, 0.015457860194146633, -0.011647866107523441, -0.01969192922115326, 0.08854995667934418, -0.006654298864305019, 0.012483872473239899, -0.0027761440724134445, -0.05875656381249428, -0.005299219395965338, -0.008571384474635124, 0.09893019497394562, 0.0267353355884552, -0.008800238370895386, 0.06046723574399948, -0.03251213952898979, 0.00010692638898035511, -0.05002840980887413, 0.01871112361550331, -0.014250512234866619, -0.01781594753265381, -0.039275165647268295, 0.004052140284329653, -0.026834577322006226, 5.1385351980570704e-05, 0.008629278279840946, -0.031372424215078354, -0.06046034023165703, 0.04671947658061981, 0.03377305343747139, 0.09063234180212021, -0.020391857251524925, -0.03259137645363808, -0.008059519343078136, 0.01571843959391117, 0.008799683302640915, -0.633354127407074, 0.023057667538523674, -0.02059507556259632, -0.01708158478140831, 0.024978920817375183, -0.01879926770925522, -0.04376776143908501, -0.02669459953904152, -0.0066640181466937065, -0.007272724527865648, -0.06580118834972382, 0.0004173123452346772, 0.008458970114588737, 0.03134765848517418, -0.10848832130432129, -0.04002683609724045, 0.013542630709707737, -0.0247521810233593, -0.008946952410042286, -0.05999615043401718, 0.02746371552348137, -0.028532464057207108, -0.017405720427632332, -0.047125473618507385, 0.019244903698563576, -0.023381026461720467, 0.024021217599511147, 0.0039457958191633224, 0.030999910086393356, 0.05901637673377991, 0.03468604385852814, -0.008302416652441025, -0.040952328592538834, -0.0019523758674040437, -0.02841583453118801, 0.03289851173758507, 0.06623565405607224, -0.01167207770049572, 0.03588981553912163, 0.025618329644203186, -0.03514556959271431, 0.07924777269363403, 0.0013110543368384242, 0.03299030289053917, -0.05226365104317665, -0.02051304094493389, 0.0038859043270349503, -0.03289046138525009, 0.012398566119372845, -0.034341465681791306, 0.015044319443404675, 0.019985148683190346, -0.0042169950902462006, -0.0010711865033954382, -0.02540593035519123, 0.010312964208424091, -0.015797685831785202, 0.02245526760816574, -0.019669413566589355, -0.004270089324563742, -0.014061378315091133, -0.014110328629612923, -0.0008446722640655935, 0.0008737515308894217, 0.033630095422267914, -0.05338587984442711, 0.0033553813118487597, 0.03947858512401581, -0.019452940672636032, -0.0433841198682785, -0.018375389277935028, 0.014210613444447517, 0.025559116154909134, -0.042620617896318436, -0.0010125964181497693, 0.030535373836755753, 0.01481814868748188, 0.004421154968440533, 0.030575964599847794, 0.02769736759364605, 0.008122369647026062, -0.009423479437828064, -0.010237687267363071, 0.020688103511929512, -0.10954795032739639, 0.020939776673913002, -0.031234171241521835, 0.015824075788259506, 0.051462482661008835, -0.023763809353113174, 0.003698056796565652, 0.02055094949901104, -0.005806384142488241, 3.931311221094802e-05, -0.0007337737479247153, -0.05064926669001579, -0.05715322867035866, 0.01777825318276882, -0.002526678144931793, -0.0460004061460495, -0.018884599208831787, 0.011486673727631569, 0.0336022786796093, -0.002565668197348714, 0.022117024287581444, 0.013809668831527233, -0.0832737535238266, 0.01358176488429308, 0.03117264248430729, -0.021114276722073555, -0.03428936377167702, 0.051111988723278046, 0.01944994553923607, 0.030814645811915398, 0.0383664071559906, -0.05358168110251427, 0.015722323209047318, 0.01438100915402174, 0.05225217342376709, 0.03783615306019783, -0.0017736906884238124, 0.01230273861438036, -0.007856438867747784, 0.027508428320288658, 0.0049749501049518585, 0.002245577285066247, 0.01671634614467621, -0.024416500702500343, 0.04370129480957985, 0.05991191789507866, -0.02804229035973549, -0.03205310180783272, 0.026613697409629822, 0.00861411727964878, -0.0030045663006603718, 0.03057142160832882, -0.009754525497555733, 0.026917653158307076, -0.04381454363465309, -0.02961672842502594, 0.020795762538909912, 0.02480526827275753, 0.010107259266078472, -0.030390001833438873, 0.036128394305706024, -0.007057671435177326, -0.008944809436798096, 0.016601020470261574, 0.007210517767816782, 0.04558320343494415, 0.04931957647204399, -0.01758692041039467, -0.015301811508834362, 0.03895612061023712, 0.008969113230705261, 0.020573671907186508, -0.008028958924114704, 0.045440882444381714, 0.015865487977862358, 0.04420951381325722, 0.042320456355810165, -0.04487786069512367, -0.016627255827188492, 0.054126523435115814, -0.016046207398176193, 0.00807823147624731, 0.04764687269926071, 0.027875734493136406, 0.021215515211224556, -0.02668163739144802, -0.04513256624341011, -0.0005644215852953494, 0.031306467950344086, 0.0028088807594031096, 0.019940445199608803, -0.019178833812475204, -0.007982209324836731, -0.01889258809387684, -0.029544131830334663, -0.010375365614891052, -0.014479813165962696, 0.04225391522049904, 0.06199188530445099, -0.034722164273262024, -0.03974501043558121, 0.030467716977000237, -0.004152020439505577, 0.020708225667476654, 0.013793090358376503, -0.022127697244286537, 0.0008270328398793936, -0.01188820693641901, 0.011689958162605762, -0.0059053427539765835, -0.12330147624015808, -0.056226663291454315, -0.022291650995612144, -0.0031745547894388437, 0.019062869250774384, 0.02742091566324234, 0.013026521541178226, -0.008276797831058502, -0.012406188063323498, 0.02523209899663925, 0.09783551841974258, 0.03711043298244476, 0.04318208619952202, 0.03516114503145218, 0.036296214908361435, -0.020339524373412132, -0.005015258211642504, 0.002006386173889041, 0.03839273750782013, 0.006590509787201881, 0.02881776914000511, 0.037162184715270996, 0.03383404016494751, -0.015397203154861927, -0.008961656130850315, 0.010814734734594822, 0.07911940664052963, 0.0380425862967968, 0.0542747862637043, 0.0026654584798961878, 0.013028901070356369, 0.053897660225629807, -0.01779591105878353, -0.03094480000436306, 0.011267051100730896, 0.10370690375566483, -0.03795447200536728, -0.02413557656109333, 0.031083840876817703, -0.0831611305475235, 0.011007562279701233, 0.007313715294003487, -0.017797771841287613, -0.000375597010133788, -0.008952431380748749, 0.007471286226063967, -0.002381635596975684, -0.027221310883760452, 0.005267561413347721, 0.010497158393263817, -0.04664469510316849, 0.00974646769464016, -0.032997313886880875, 0.013245887123048306, -0.025399763137102127, -0.039802756160497665, 0.009904269129037857, -0.010029472410678864, -0.0018552246037870646, -0.0051499162800610065, -0.019125228747725487, 0.009392744861543179, 0.02394992485642433, 0.03482634201645851, -0.027872325852513313, -0.003428985131904483, -0.000435311027104035, -0.0074302200227975845, -0.01291623618453741, 0.016631770879030228, 0.01982015371322632, 0.0075689456425607204, 0.013920627534389496, -0.012140847742557526, 0.0626285970211029, -0.03986744582653046, -0.026079611852765083, 0.011421135626733303, -0.0482809916138649, 0.006417668424546719, 0.005288983229547739, -0.10369419306516647, -0.03145167976617813, 0.0005720913759432733, 0.031240103766322136, 0.04375334829092026, 0.029806729406118393, 0.04074821621179581, 0.04836201295256615, 0.032743047922849655, 0.08878179639577866, 0.06080141291022301, -0.0915503203868866, -0.009531056508421898, 0.04501552879810333, -0.040355097502470016, 0.05098317563533783, 0.006451113615185022, 0.01409910898655653, 0.03024587780237198, -0.01654745452105999, -0.025724971666932106, -0.019381752237677574, -0.08346971124410629, 0.012671257369220257, -0.011566156521439552, 0.019589167088270187, -0.005893734283745289, -0.0010940474458038807, -0.020783763378858566, -0.03663674369454384, 0.008115013130009174, -0.09837569296360016, -0.024229587987065315, -0.01900356076657772, -0.018127938732504845, -0.03674088045954704, -0.011153756640851498, 0.0077055878937244415, -0.030604643747210503, 0.0049110171385109425, -0.0025087816175073385, 0.04144726321101189, -0.04492214322090149, 0.08311246335506439, -0.021970456466078758, 0.011852423660457134, 0.02284894324839115, -0.013054666109383106, -0.050693899393081665, 0.0644349679350853, -0.0054094223305583, 0.014238237403333187, -0.010433735325932503, -0.013611899688839912, -0.02137961983680725, 0.04440956935286522, -0.05993795394897461, 0.0018655727617442608, -0.03631489351391792, -0.0006292174221016467, 0.028143998235464096, -0.005245855078101158, -0.023934070020914078, -0.023729784414172173, 0.016259953379631042, 0.038545407354831696, -0.012919750064611435, -0.015974130481481552, -0.01888471283018589, 0.010444406419992447, 0.02269856259226799, -0.005156760569661856, -0.04286973923444748, -0.025838932022452354, 0.05914601311087608, -0.009559025056660175, 0.021133868023753166, -0.01778540015220642, -0.00707729859277606, -0.012623876333236694, -0.06005650758743286, -0.024813976138830185, 0.04112112522125244, 0.01255093514919281, -0.06347229331731796, 0.027877291664481163, -0.007019920740276575, 0.04705115780234337, -0.01367732509970665, 0.02585938759148121, 0.015237471088767052, 0.013019789941608906, -0.0133896479383111, 0.046741023659706116, 0.02845238335430622, 0.045537687838077545, 0.008009208366274834, -0.012814422138035297, 0.004734078422188759, -0.0005681188777089119, 0.017261451110243797, -0.009916829876601696, -0.04172268137335777, 0.002664902014657855, -0.04103245213627815, 0.00041728277574293315, -0.03729239106178284, -0.009942171163856983, -0.05453311651945114, -0.05043952912092209, -0.028992310166358948, 0.005964404437690973, -0.019935786724090576, -0.01244533620774746, -0.012990414164960384, -0.02520545944571495, -0.021805966272950172, -0.014796092174947262, -0.039020344614982605, -0.019409630447626114, -0.035027969628572464, -0.05230648070573807, 0.0431467667222023, -0.01466622669249773, -0.010528389364480972, 0.033421698957681656, -0.06029679626226425, 0.015061764977872372, -0.013051937334239483, 0.001127475406974554, 0.017302721738815308, -0.00528267165645957, 0.0026319571770727634, -0.029925981536507607, 0.029020821675658226, -0.034782931208610535, -0.014650147408246994, 0.013057835400104523, -0.06705844402313232, 0.012613525614142418, 0.00017981616838369519, -0.032591160386800766, 0.03091825731098652, 0.033722057938575745, 0.011668330989778042]" ./train/dugong/n02074367_2045.JPEG,dugong,"[0.07194062322378159, -0.05739408731460571, -0.026444265618920326, -0.011288334615528584, -0.002229457488283515, -0.06363925337791443, 0.033400509506464005, 0.02347916178405285, 0.03959059342741966, 0.031095119193196297, -0.041227757930755615, 0.0206455048173666, 0.0964638739824295, 0.001482407795265317, 0.011850645765662193, 0.014110798947513103, 0.08764038980007172, 0.06015113368630409, 0.01602417603135109, 0.014686442911624908, -0.10157907754182816, 0.017119651660323143, 0.007513341959565878, -0.05974941700696945, -0.006200331263244152, 0.02016717754304409, -0.022080475464463234, -0.03854653984308243, -0.0004482115327846259, -0.007234202232211828, 0.04327920451760292, 0.015279138460755348, 0.03334658220410347, -0.028644636273384094, 0.010664023458957672, -0.015955863520503044, -0.016626732423901558, 0.001400618813931942, -0.009673955850303173, 0.17046231031417847, -0.03995721787214279, 0.014042495749890804, 0.0035162472631782293, 0.016833655536174774, -0.03162601962685585, -0.010393115691840649, 0.036919254809617996, 0.04650839418172836, -0.002436503767967224, -0.011812703683972359, -0.057661037892103195, 0.003091038204729557, -0.01797224022448063, -0.002238948829472065, 0.02650252729654312, 0.013287948444485664, -0.05876921862363815, 0.005874525755643845, -0.028703944757580757, -0.008395847864449024, 0.08355449140071869, 0.028429998084902763, -0.04442315548658371, -0.0290455911308527, 0.015830127522349358, -0.019970932975411415, -0.014524378813803196, 0.03942190855741501, 0.01761980913579464, 0.008558174595236778, 0.017940016463398933, -0.03178773447871208, -0.018522964790463448, -0.011625676415860653, -0.003978946711868048, -0.0336310975253582, 0.004862598143517971, -0.04135352000594139, 0.005243735853582621, -0.013909618370234966, -0.011493858881294727, 0.007822810672223568, -0.03457935154438019, -0.0989481508731842, 0.05372360348701477, 0.028723502531647682, 0.04571510851383209, -0.007887699641287327, -0.0341867133975029, 0.0148747768253088, 0.03423869237303734, -0.010020147077739239, -0.651354193687439, 0.041705504059791565, -0.00865898560732603, -0.006574404891580343, 0.07010501623153687, 0.0022195340134203434, -0.0437406487762928, -0.03935430198907852, -0.011597912758588791, -0.032239947468042374, -0.06816153228282928, -0.03737471252679825, 0.034597016870975494, 0.04144058749079704, -0.14131496846675873, 0.010108398273587227, 0.04651045799255371, -0.01961459405720234, -0.02113260328769684, 0.014567370526492596, 0.024955108761787415, 0.003798216348513961, 0.015931973233819008, -0.03497490659356117, 0.012786062434315681, -0.04049650952219963, -0.004896002355962992, 0.005848958622664213, -0.00019170640734955668, 0.010636269114911556, 0.05879255756735802, 0.021202528849244118, -0.0069112153723835945, 0.041548047214746475, -0.0032339966855943203, 0.04518342763185501, 0.05059676989912987, -0.017493711784482002, 0.01587056741118431, 0.007633564993739128, -0.01978367567062378, 0.08070557564496994, -0.0012150858528912067, 0.022898763418197632, -0.016903134062886238, -0.021320994943380356, 0.02399601973593235, -0.045769739896059036, 0.030607353895902634, -0.03736754134297371, -0.023246437311172485, 0.004276578780263662, 0.035554204136133194, 0.025483042001724243, -0.014063880778849125, 0.006141405086964369, -0.013003319501876831, -0.002669020090252161, 0.03355368599295616, 0.016498390585184097, -0.03236958757042885, -0.009814907796680927, -0.019294576719403267, 0.014494387432932854, 0.0057985675521194935, -0.011089939624071121, -0.027218854054808617, -0.014423765242099762, -0.03665105625987053, -0.017709650099277496, 0.00972102303057909, 0.016339126974344254, 0.04366518557071686, -0.011505999602377415, -0.03194846585392952, -0.02487529255449772, 0.01555350050330162, 0.023461604490876198, 0.042605116963386536, 0.036484021693468094, 0.030675996094942093, -0.029360879212617874, -0.03881344944238663, 0.009553469717502594, -0.011671055108308792, 0.0021710493601858616, -0.0085176732391119, 0.019919930025935173, 0.04228907451033592, 0.004521958064287901, 0.032984957098960876, 0.021006707102060318, 0.013239809311926365, 0.014443275518715382, 0.004563555587083101, -0.04332873970270157, -0.015191678889095783, 0.006448257714509964, 0.00020979881810490042, -0.027300814166665077, -0.021476810798048973, -0.016472050920128822, 0.07672230899333954, 0.020739296451210976, 0.0314510278403759, -0.013265310786664486, 0.05697568506002426, -0.014589108526706696, 0.01699715666472912, -0.00911771971732378, -0.039180606603622437, -0.003445782931521535, -0.004648360889405012, 0.018674436956644058, 0.013142548501491547, -0.0266887117177248, 0.05249875783920288, -0.01144865620881319, 0.05307389050722122, 0.024238551035523415, -0.024147575721144676, -0.013718817383050919, -0.014265350066125393, 0.04374033212661743, -0.013236476108431816, 0.008067861199378967, 0.01701514795422554, -0.017493173480033875, 0.10233956575393677, 0.035910941660404205, 0.010690862312912941, 0.006619417108595371, 0.013135609216988087, 0.028125235810875893, 0.029312169179320335, 0.040944408625364304, 0.008444545790553093, 0.006267819553613663, 0.0012991850962862372, -0.00877236295491457, 0.0041661676950752735, 0.02708355523645878, 0.005989067256450653, -0.03837175667285919, 0.023997077718377113, 0.004948638845235109, -0.006614095531404018, 0.014312286861240864, 0.01339045725762844, 0.012468417175114155, 0.022921303287148476, 0.03048321232199669, 0.020511791110038757, 0.025428693741559982, -0.019669106230139732, -0.004339741542935371, -0.02909172512590885, 0.028800617903470993, 0.0026679530274122953, 0.05354541912674904, 0.041854750365018845, -0.037379246205091476, -0.007661917246878147, 0.006615434307605028, 0.01702992245554924, 0.02073839120566845, 0.08923935890197754, -0.026312613859772682, -0.020228689536452293, -0.04348546639084816, 0.0070650335401296616, 0.006723672617226839, -0.009447556920349598, 0.030553236603736877, 0.006814613007009029, -0.017534159123897552, 0.014798558317124844, -0.044399771839380264, 0.016461078077554703, -0.031053990125656128, 0.03395044058561325, 0.023424912244081497, 0.028261449187994003, 0.009220723062753677, 0.012221273966133595, 0.06649613380432129, -0.027747061103582382, -0.007682324852794409, 0.007220044732093811, -0.0037843319587409496, 0.03394012525677681, 0.023275531828403473, -0.0018222079379484057, -0.03675353154540062, -0.04252127930521965, -0.03256116807460785, -0.036371808499097824, 0.006331543903797865, 0.04017475247383118, 0.030166471377015114, -0.045579809695482254, 0.004196882247924805, 0.002223280956968665, 0.028653189539909363, 0.13219933211803436, 0.01255820319056511, 0.023198170587420464, 0.031841594725847244, -0.008157558739185333, -0.04578971862792969, 0.002228977158665657, 0.01250174269080162, -0.015106560662388802, 0.00845314096659422, -0.008758299052715302, 0.013509614393115044, 0.008703440427780151, 0.00993467029184103, -0.006396365351974964, -0.04559878259897232, 0.08062540739774704, 0.04632573947310448, 0.04135571047663689, -0.04448891803622246, 0.034444842487573624, 0.06345176696777344, 0.009640899486839771, -0.04422035068273544, -0.0016303955344483256, 0.08787541836500168, 0.02078763209283352, -0.030249260365962982, 0.017102064564824104, -0.04068471118807793, -0.026416165754199028, 0.005758463870733976, -0.0194855984300375, 0.025894371792674065, -0.003831523470580578, -0.02576795406639576, 0.04378242790699005, -0.023668885231018066, 0.022999640554189682, 0.013064502738416195, -0.039740242063999176, 0.023092471063137054, -0.029604291543364525, 0.01474651601165533, -0.0027329260483384132, -0.0002559974091127515, -0.04022166505455971, -0.0030510660726577044, 0.010905609466135502, -0.020309818908572197, -0.025200162082910538, 0.01216572243720293, -0.02218150720000267, 0.013890046626329422, 0.003639188362285495, -0.02207369916141033, 0.04454582929611206, -0.007214391138404608, -0.008364995010197163, 0.03449186682701111, 0.013751400634646416, -0.0843573734164238, -0.020618394017219543, 0.017513830214738846, 0.038890525698661804, -0.03767341002821922, 0.039797987788915634, 0.013674476183950901, -0.08455691486597061, 0.013337681069970131, 0.059873949736356735, -0.10999716073274612, -0.021750736981630325, -0.012779290787875652, -0.0018823618302121758, 0.05677078291773796, -0.021325524896383286, 0.029110750183463097, 0.02278207615017891, 0.018761731684207916, 0.020113255828619003, 0.047316621989011765, -0.06752302497625351, -0.012577426619827747, 0.007331622298806906, -0.0061549958772957325, 0.013419515453279018, -0.028320956975221634, -0.024102305993437767, 0.024770377203822136, -0.009493527002632618, -0.018691744655370712, 0.03449401259422302, -0.1006380245089531, -0.038801249116659164, -0.039184242486953735, 0.002791560487821698, -0.03391161188483238, 0.019279664382338524, -0.011651438660919666, 0.006236386019736528, -0.006392103619873524, -0.07038838416337967, -0.026129014790058136, -0.024988839402794838, -0.013592918403446674, -0.03185363858938217, -0.040520016103982925, -0.01364525593817234, -0.02924150787293911, 0.005810888484120369, -0.023114023730158806, 0.024028709158301353, -0.034223828464746475, 0.1041695773601532, 0.026050293818116188, 0.0050387210212647915, 0.016365453600883484, -0.004987751599401236, -0.0338798351585865, 0.033402904868125916, -0.03401044383645058, -0.00044265767792239785, -0.006489642895758152, -0.0007766003254801035, -0.006686663255095482, -0.01801760494709015, -0.023919790983200073, 0.03178119659423828, -0.019620832055807114, 0.03962361440062523, -0.012032254599034786, -0.0034999314229935408, -0.05141749978065491, -0.007862351834774017, -0.02339843288064003, 0.025177597999572754, -0.046363964676856995, 0.002243147464469075, -0.0173955075442791, 0.03302866220474243, 0.0360468327999115, -0.007639802526682615, -0.018148330971598625, -0.058110691606998444, 0.021128010004758835, -0.023662878200411797, 0.0021407827734947205, -0.009705311618745327, 0.015013615600764751, 0.02188003808259964, -0.016204606741666794, 0.022760160267353058, 0.02958664670586586, -0.011176218278706074, -0.046519678086042404, -0.015346920117735863, -0.028070326894521713, 0.023001356050372124, -0.02550446055829525, 0.034941330552101135, 0.003287711413577199, 0.03377543017268181, -0.024640655145049095, 0.06275948137044907, 0.01092746201902628, 0.0534353144466877, 0.02102750539779663, 0.004242081195116043, 0.009692980907857418, 0.011618302203714848, 0.019415056332945824, 0.0244491845369339, 0.009341106750071049, 0.0266116913408041, -0.04207374155521393, 0.05157032608985901, -0.014251615852117538, 0.04266737028956413, -0.04470793157815933, -0.02234533242881298, -0.014922617934644222, 0.01529752928763628, -0.03746187314391136, 0.027648532763123512, -0.0035776980221271515, 0.015506770461797714, -0.02657240815460682, -0.010703855194151402, 0.0001445290254196152, 0.0073676700703799725, 0.007131940685212612, -0.028353266417980194, 0.059216056019067764, -0.056130025535821915, 0.011678648181259632, 0.01838369481265545, -0.03843976557254791, 0.006335386540740728, -0.04372715204954147, -0.011647261679172516, 0.03966471552848816, 0.011076043359935284, -0.017881212756037712, -0.004791109822690487, 0.04452779144048691, -0.030568722635507584, 0.01594681106507778, -0.027008116245269775, -0.0441771075129509, 0.002814193721860647, -0.013545152731239796, -0.03343520686030388, 0.03698071837425232, 0.018673380836844444, 0.0057456050999462605]" ./train/Bouvier_des_Flandres/n02106382_2474.JPEG,Bouvier_des_Flandres,"[0.0496794618666172, -0.018465109169483185, -0.011707065626978874, 0.03344643861055374, -0.01896972954273224, -0.08264323323965073, 0.06379981338977814, -0.06125982105731964, 0.0695129856467247, 0.012703300453722477, -0.016732530668377876, 0.027071507647633553, 0.04216315969824791, 0.006029782351106405, 0.00955538172274828, 0.011079884134232998, 0.06055738404393196, -0.032896529883146286, 0.007549590896815062, -0.006008050870150328, -0.114920973777771, 0.000427702849265188, 0.026041775941848755, -0.02876785583794117, 0.00022935042215976864, -0.013606141321361065, 0.05281816050410271, 0.03400541469454765, 0.02181803248822689, -0.032127659767866135, 0.007992574013769627, 0.00015870554489083588, 0.0027231224812567234, 0.019836550578475, -0.016065126284956932, 0.02108977548778057, 0.048947952687740326, -0.02288190834224224, -0.01973511092364788, 0.09313663095235825, -0.033250175416469574, 0.014284764416515827, 0.02777012065052986, -0.024695197120308876, 0.004502511583268642, -0.04736999422311783, 0.0368003249168396, 0.019443796947598457, 0.004933389835059643, -0.015243375673890114, -0.044290799647569656, 0.035383954644203186, -0.011971700936555862, -0.009790394455194473, 0.01028494257479906, 0.029338806867599487, -0.06632186472415924, 0.0011693345149978995, 0.007915270514786243, -0.03555797040462494, 0.03388749808073044, 0.0006708340952172875, 0.06837427616119385, 0.04749448597431183, -0.014155300334095955, -0.02477540262043476, -0.025142185389995575, 0.0552135668694973, -0.03178318217396736, -0.02270992286503315, 0.015586299821734428, 0.011562874540686607, 0.04900359362363815, 0.0512530691921711, -0.007306328043341637, -0.0014100342523306608, -0.009458142332732677, -0.04414831101894379, -0.00036648695822805166, 0.013655712828040123, 0.007568159140646458, -0.02329491823911667, -0.010103212669491768, -0.046795569360256195, -0.049078743904829025, -0.05016913264989853, 0.07538022100925446, -0.05643163621425629, 0.023645050823688507, 0.016412654891610146, 0.011042297817766666, -0.07808788120746613, -0.5937735438346863, 0.031339600682258606, -0.009405973367393017, -0.014134975150227547, -0.011209159158170223, -0.014378879219293594, -0.07895510643720627, 0.13581110537052155, -0.009564090520143509, -0.022358911111950874, -0.005390767939388752, -0.003329214872792363, 0.07539434731006622, -0.0836879312992096, 0.0784493014216423, 0.019486557692289352, -0.01781526952981949, -0.024631602689623833, 0.011850456707179546, -0.05764232948422432, 0.00486059719696641, -0.03337777405977249, 0.02728918194770813, 0.008938411250710487, -0.034453023225069046, -0.050817396491765976, 0.025346990674734116, -0.025842586532235146, 0.033648282289505005, 0.006170340348035097, -0.03182889521121979, 0.027305448427796364, 0.016442399471998215, -0.044386014342308044, 0.009779275394976139, 0.0287281796336174, -0.007441911846399307, -0.008091493509709835, -0.012948852963745594, 0.012182340025901794, -0.019095052033662796, 0.07743210345506668, -0.07355846464633942, -0.009128505364060402, -0.04406091570854187, 0.0006123541970737278, 0.0064856079407036304, 0.03155575320124626, 0.008824113756418228, 0.006686870474368334, -0.018384020775556564, 0.0340014211833477, -0.01855328120291233, 0.060732804238796234, 0.04625027999281883, -0.007644726894795895, -0.007943538948893547, 0.022955944761633873, -0.010036339983344078, 0.026422889903187752, 0.005379306618124247, 0.010843314230442047, -0.004767025355249643, 0.01964990794658661, -0.01171300932765007, -0.011114126071333885, 0.026863573119044304, -0.006638902239501476, -0.02998855523765087, 0.013952638953924179, -0.004850029479712248, 0.021507503464818, 0.009223933331668377, -0.035837918519973755, -0.03787270188331604, 0.013951285742223263, -0.00036849002935923636, 0.004822141025215387, -0.013148190453648567, 0.019429050385951996, 0.027991995215415955, -0.06050930917263031, 0.00044321498717181385, 0.009410275146365166, 0.06866682320833206, 0.02031673491001129, 0.00766426557675004, -0.03436886519193649, -0.006180668715387583, 0.005526622291654348, 0.005585316568613052, -0.02079458348453045, 0.006412011571228504, -0.019282273948192596, 0.05708391219377518, 0.020715612918138504, 0.038217537105083466, 0.025911206379532814, 0.02290312759578228, -0.010253764688968658, 0.016119124367833138, -0.021685542538762093, 0.04493597894906998, 0.03246178850531578, 0.011007719673216343, -0.05184951797127724, -0.11668837070465088, -0.0026212972588837147, 0.019995316863059998, 0.04015378654003143, -0.003027004422619939, 0.010247970931231976, -0.06620287895202637, -0.10710009932518005, 0.011734229512512684, -0.00497073819860816, -0.003497925354167819, -0.02818487025797367, -0.06241002678871155, 0.01133698783814907, 0.013766927644610405, 0.025418957695364952, -0.04560837149620056, -0.010297597385942936, -0.06070047989487648, 0.021970760077238083, 0.07739569246768951, 0.01186797022819519, 0.03327122703194618, -0.0030139037407934666, -0.008293620310723782, 0.04831770062446594, -0.03460937738418579, 0.019289258867502213, -0.009644294157624245, -0.05399426817893982, 0.04834107309579849, -0.007858369499444962, 0.019827591255307198, -0.008322391659021378, -0.017900314182043076, 0.05241516977548599, 0.01728653721511364, 0.042189259082078934, -0.0209383312612772, 0.0019052978605031967, 0.014217808842658997, -0.011533376760780811, 0.01902502216398716, 0.008236070163547993, 0.007800932042300701, 0.021119626238942146, -0.0056077949702739716, 0.1039675623178482, 0.004948507063090801, -0.08081645518541336, 0.0003998773463536054, 0.06490127742290497, 0.025793706998229027, 0.004326872527599335, 0.05368759110569954, 0.03391304239630699, 0.006574797909706831, -0.002929513342678547, 0.01593245007097721, 0.06618726998567581, 0.03549628332257271, -0.009407533332705498, -0.04805814102292061, 0.012965980917215347, 0.00787603110074997, -0.024781854823231697, 0.028425736352801323, -0.014048002660274506, -0.016610683873295784, -0.03713034838438034, -0.05161818116903305, 0.020933324471116066, -0.002862815512344241, 0.03022732026875019, 0.053080879151821136, -0.014442464336752892, -0.044379737228155136, -0.013384668156504631, -0.0021201118361204863, -0.012145609594881535, -0.01626432314515114, -0.023231783881783485, -0.016057360917329788, 0.008282780647277832, -0.07843424379825592, -0.023588864132761955, -0.0455770418047905, -0.02566276118159294, 0.06159435957670212, -0.014771930873394012, -0.005790513474494219, 0.0014529138570651412, -0.007775516714900732, 0.05757049471139908, 0.005105333868414164, -0.008287329226732254, 0.00030852697091177106, 0.011425256729125977, 0.03008374385535717, -0.01406086701899767, -0.0016085788374766707, 0.029797090217471123, 0.00987439788877964, -0.013800178654491901, 0.007583183702081442, -0.003998685162514448, 0.034178536385297775, -0.011990557424724102, 0.029364457353949547, 0.04322744905948639, 0.024932192638516426, -0.002969472436234355, -0.016269365325570107, 0.07935724407434464, 0.07727238535881042, 0.00255073350854218, 0.03218691796064377, -0.008479293435811996, 0.04731522500514984, 0.06256458163261414, -0.03264981880784035, 0.027680840343236923, 0.003027449594810605, -0.0002370808069827035, 0.027524631470441818, 0.0074324537999928, 0.03381295129656792, 0.05015471577644348, -0.01383869256824255, 0.03772445395588875, -0.056209746748209, -0.017763474956154823, 0.0042152414098382, -0.016012709587812424, 0.053031716495752335, 0.02131050080060959, -0.014234626665711403, 0.011687565594911575, 0.011342853307723999, 0.018849629908800125, -0.0051225232891738415, 0.020387746393680573, 0.016456851735711098, 0.00898536667227745, -0.01394167635589838, -0.005204412620514631, 0.034272998571395874, 0.03809913620352745, -0.003049205057322979, 0.015593052841722965, -0.017083099111914635, 0.007944153621792793, 0.01725953444838524, 0.01759166084229946, 0.007429583463817835, -0.0063167475163936615, -0.0005276940064504743, 0.10386712104082108, -0.002031713956966996, -0.06713595241308212, 0.022060800343751907, -0.004527826327830553, 0.015225809998810291, -0.010996890254318714, 0.03356359526515007, -0.05539718270301819, -0.13476267457008362, 0.0018453698139637709, -0.01375729963183403, 0.024979909881949425, 0.041501034051179886, -0.01137250754982233, 0.004913555458188057, 0.006493310444056988, 0.009729539975523949, 0.018816741183400154, 0.005375624634325504, 0.012878251262009144, 0.17519409954547882, -0.008537376299500465, -0.023437799885869026, 0.04576623812317848, 0.015957064926624298, -0.04389837384223938, 0.024501586332917213, 0.030026674270629883, 0.018943550065159798, -0.02129264362156391, -0.00016376885469071567, 0.009148144163191319, 0.058042313903570175, -0.12787273526191711, -0.0624028705060482, -0.04958178848028183, 0.03198022022843361, -0.0026754429563879967, 0.010928557254374027, -0.0342746265232563, -0.029296962544322014, 0.022309882566332817, 0.03622979670763016, -0.06764008104801178, -0.01839166320860386, -0.010868912562727928, 0.023281807079911232, 0.06196923553943634, -0.013849214650690556, 0.0034708285238593817, 0.009767117910087109, -0.01868731901049614, 0.010681746527552605, -0.018742717802524567, 0.03960596024990082, 0.005418871063739061, -0.03501418977975845, 0.020045826211571693, 0.010593683458864689, -0.0008163520251400769, 0.034156087785959244, -0.027460267767310143, 0.029953239485621452, -0.0016946111572906375, 0.0064837876707315445, -0.0004810079117305577, -0.056051433086395264, 0.014386135153472424, 0.010629178956151009, -0.022085901349782944, -0.010785358026623726, 0.023717818781733513, 0.05601957440376282, -0.0011538704857230186, -0.032033856958150864, 0.004785848315805197, 0.039326827973127365, 0.005905132740736008, 0.026246342808008194, -0.021865364164114, -0.004909570794552565, 0.011930241249501705, -0.04459051042795181, -0.03486672043800354, 0.024888901039958, -0.03730258345603943, -0.013014069758355618, -0.04730574041604996, 0.019138939678668976, -0.031620852649211884, 0.013755949214100838, 0.015516501851379871, -0.0008659627637825906, -0.028759930282831192, 0.0025192706380039454, -0.044963546097278595, -0.02737770788371563, 0.013836954720318317, -0.02416153810918331, -0.03686380013823509, -0.021491240710020065, 0.04415837302803993, 0.05137210711836815, 0.04521176964044571, 0.0005252778646536171, 0.011860519647598267, -0.006812915205955505, 0.01757047511637211, 0.01197279617190361, 0.016049034893512726, -0.03722710162401199, 0.026473790407180786, -0.044036224484443665, 0.048883285373449326, 0.0498342290520668, 0.004177277907729149, -0.028078360483050346, -0.02932048588991165, -0.03231561928987503, -0.011521425098180771, -0.004688153974711895, -0.05397261306643486, -0.03193862736225128, 0.00714215449988842, 0.02926400490105152, 0.040955208241939545, -0.017717652022838593, -0.02646292932331562, 0.007122327107936144, 0.022869495674967766, 0.012534783221781254, 0.015049602836370468, 0.030871771275997162, 0.011352339759469032, -0.051779817789793015, -0.01844615861773491, -0.02122245356440544, -0.006886843591928482, 0.04975712299346924, -0.011514324694871902, 0.006115340162068605, 0.0619291327893734, -0.020654231309890747, -0.033986467868089676, 0.005483059212565422, -0.018058953806757927, -0.020337015390396118, 0.06968596577644348, -0.06480441987514496, 0.015238611958920956, -0.014125484973192215, -0.025867201387882233, -0.01486493181437254, 0.1086299866437912, 0.007169046904891729, 0.007562065962702036]" ./train/Bouvier_des_Flandres/n02106382_2705.JPEG,Bouvier_des_Flandres,"[0.02006162889301777, 0.03444470465183258, -0.0660146176815033, 0.020089689642190933, 0.016985762864351273, -0.043275050818920135, -0.024725375697016716, 0.011373573914170265, 0.04724521189928055, 0.05645564943552017, -0.021439872682094574, -0.030152518302202225, -0.008231193758547306, -0.022875990718603134, 0.04324689507484436, -0.0031455266289412975, 0.0442187562584877, -0.00545738497748971, -0.021320093423128128, -0.014012085273861885, -0.015342459082603455, 0.02766941301524639, 0.01779610849916935, -0.045439496636390686, -0.03983202204108238, 0.060213759541511536, 0.06186379864811897, -0.00781146390363574, 0.003116422798484564, 0.006610238924622536, -0.037929240614175797, 0.031835343688726425, -0.023522019386291504, -0.024522164836525917, -0.09020192176103592, 0.07930819690227509, 0.008221770636737347, -0.04249240458011627, -0.0024464379530400038, 0.04661586880683899, -0.003704823786392808, 0.011455798521637917, -0.03840995207428932, 0.013408822938799858, -0.021717527881264687, -0.026286305859684944, 0.02668062411248684, 0.00015489642100874335, 0.03480051830410957, -0.013560702092945576, -0.06269731372594833, -0.001456460915505886, 0.0027353365439921618, -0.006781408097594976, 0.0584295392036438, -0.019323375076055527, -0.013701210729777813, 0.04531720280647278, 0.0025634949561208487, -0.025981862097978592, -0.020405372604727745, -0.017763929441571236, 0.06765817850828171, 0.05164607986807823, -0.012693843804299831, -0.026158833876252174, 0.07080937922000885, 0.06974032521247864, -0.003630279563367367, -0.008558575995266438, 0.0274399034678936, -0.04020131751894951, 0.003939101472496986, 0.07802855223417282, 0.023788021877408028, -0.00726745231077075, -0.014256683178246021, -0.013916173949837685, 0.011350578628480434, 0.002296536462381482, 0.03938762843608856, -0.005499701015651226, -0.015340695157647133, -0.027221661061048508, 0.0213185865432024, 0.00998389720916748, 0.09458532929420471, -0.04496061056852341, 0.02118069864809513, -0.010908796451985836, 0.050089795142412186, -0.07370651513338089, -0.5370180010795593, 0.04282296821475029, -0.013046903535723686, -0.015068937093019485, -0.021979115903377533, 0.013383990153670311, -0.0471530482172966, 0.07179372757673264, -0.0017999270930886269, -0.04663553461432457, 0.05047633871436119, 0.014595754444599152, 0.009843469597399235, 0.003339342540130019, 0.05492599681019783, 0.013211947865784168, 0.0067656151950359344, 0.019133148714900017, -0.007306946441531181, -0.03606206178665161, -0.010183924809098244, -0.01048896461725235, 0.022621843963861465, -0.051111072301864624, -0.07094217836856842, 0.018921392038464546, -0.028258008882403374, -0.00020104747090954334, 0.05280814319849014, 0.02421034686267376, -0.014803300611674786, 0.0269827451556921, 0.021468013525009155, -0.06375587731599808, -0.019277814775705338, 0.0489954799413681, -0.015470408834517002, -0.03393935412168503, 0.046804700046777725, -0.03465016558766365, 0.04314842447638512, 0.08024763315916061, -0.0032387555111199617, -0.016155552119016647, -0.005978616885840893, -0.050548117607831955, -0.041026342660188675, -0.01692359149456024, -0.02309035137295723, 0.005192174576222897, 0.03216751664876938, 0.01922302320599556, 0.0005691712140105665, 0.0255036111921072, 0.03567791357636452, -0.03550702705979347, -0.024410566315054893, 0.023339709267020226, -0.016016505658626556, -0.02193577215075493, -0.010610406287014484, 0.05617618188261986, -0.04676061123609543, 0.017690172418951988, 0.02125675603747368, -0.04309208691120148, 0.04225938022136688, -0.001708020456135273, -0.04680965840816498, 0.02806250937283039, -0.023263074457645416, 0.03976229205727577, 0.01319882646203041, -0.01605265960097313, 0.035281453281641006, -0.002338543301448226, 0.04221585765480995, 0.01985100843012333, 0.008554473519325256, 0.016902251169085503, 0.03076649084687233, -0.05272083729505539, 0.017790554091334343, -0.03284129872918129, -0.01237462367862463, 0.008647994138300419, -2.350556314922869e-06, -0.044746316969394684, -0.021214377135038376, -0.002080873353406787, -0.00877823680639267, -0.04257648065686226, -0.011228552088141441, -0.004339019302278757, 0.047176092863082886, -0.03808444365859032, 0.05722438544034958, 0.01582651399075985, 0.024478817358613014, 0.023546798154711723, 0.03542247787117958, -0.01475288812071085, -0.0930413007736206, 0.025907067582011223, -0.010117745026946068, -0.007451470009982586, -0.11550966650247574, -0.020428605377674103, 0.0029977953527122736, 0.05733056366443634, 0.008326631970703602, 0.03520161658525467, -0.05094242841005325, -0.04374067112803459, 0.038675952702760696, -0.00861339457333088, -0.020230840891599655, 0.027155814692378044, 0.027441048994660378, 0.00026467544375918806, 0.01478795800358057, 0.02234850451350212, -0.02717023715376854, -0.061812058091163635, -0.021492991596460342, 0.05558152496814728, 0.06443814188241959, 0.007420168723911047, -0.023862643167376518, 0.009824102744460106, -0.010468115098774433, 0.00776051776483655, -0.000835048034787178, 0.010712836869060993, -0.014545372687280178, 0.01991318166255951, -0.011016538366675377, 0.0016916639870032668, -0.021910367533564568, 0.06888391077518463, -0.01123756729066372, 0.08473765850067139, -0.021422788500785828, -0.05890064686536789, -0.021662075072526932, 0.014977404847741127, 0.006934452801942825, -0.054982323199510574, 0.010158129967749119, 0.0008272917475551367, 0.007155762054026127, -0.03344328701496124, -0.06881061941385269, 0.06810138374567032, 0.04982350394129753, -0.05682580545544624, -0.0030963958706706762, 0.04893207177519798, -0.001048179343342781, 0.040864743292331696, 0.018335632979869843, -0.005158836022019386, 0.02393803372979164, 0.017375215888023376, 0.015782374888658524, -0.03235628455877304, 0.05891495198011398, 0.001503425883129239, -0.0426398329436779, -0.008003881201148033, -0.005332196597009897, 0.04142835736274719, 0.03727144002914429, 0.047144245356321335, -0.028749773278832436, -0.047053832560777664, 0.006425926461815834, 0.02707970328629017, -0.016672205179929733, -0.032118577510118484, 0.022459156811237335, 0.015165009535849094, 0.014771374873816967, 0.002863367320969701, -0.005560683086514473, 0.004446506965905428, 0.014628520235419273, 0.0038937225472182035, -0.01414030883461237, -0.016319800168275833, -0.03447040915489197, 0.016688918694853783, -0.03421218693256378, -0.0006808837642893195, 0.027543047443032265, 0.006363970227539539, 0.008121391758322716, -0.005592298693954945, 0.02593640610575676, 0.0507560633122921, 0.01599864475429058, -0.007707459386438131, 0.018751271069049835, 0.03405480086803436, 0.026347478851675987, 0.013704325072467327, 0.030354589223861694, 0.013032506220042706, 0.009224103763699532, 0.022880075499415398, 0.007650140672922134, 0.013494948856532574, 0.02421862818300724, 0.04049108922481537, -0.010065809823572636, 0.0474039725959301, 0.011454039253294468, -0.030938267707824707, -0.04000140354037285, 0.08883479982614517, 0.07995918393135071, 0.02150174230337143, 0.013804233632981777, 0.0004895117599517107, 0.01788938045501709, 0.06331560015678406, -0.049531180411577225, 0.11780182272195816, 0.0932266041636467, 0.12484864890575409, 0.0019273649668321013, -0.0038739892188459635, 0.01649993099272251, 0.017212999984622, 0.0006539902533404529, 0.02580271102488041, -0.12055592983961105, -0.05476584658026695, -0.012602335773408413, -0.03867089003324509, -0.0013689525658264756, -0.06903776526451111, -0.002462959848344326, -0.01705433428287506, 0.03856370598077774, 0.018752556294202805, -0.05117003992199898, 0.007200742606073618, 0.02677988074719906, -0.027669886127114296, 0.017592819407582283, 0.047411415725946426, 0.04050305485725403, 0.04801391810178757, 0.00576628465205431, 0.023771822452545166, -0.008620264008641243, -0.07094364613294601, -0.07170569896697998, 0.01562989130616188, 0.008413930423557758, 0.0027658184990286827, -0.005629982799291611, 0.08939818292856216, -0.0035689177457243204, -0.052840664982795715, -0.00554751418530941, 0.009312167763710022, 0.0772714912891388, -0.013142385520040989, -0.012031832709908485, -0.020414045080542564, -0.013085356913506985, -0.024338610470294952, 0.01770295575261116, -0.029056094586849213, 0.018048416823148727, 0.030812660232186317, -0.027452576905488968, 0.027221955358982086, -0.013020364567637444, 0.02665245346724987, -0.005441773217171431, 0.017994653433561325, 0.14640654623508453, -0.014220967888832092, -0.005401937291026115, 0.06638689339160919, -0.02686372585594654, -0.04635770246386528, 0.05178193375468254, 0.04821811243891716, 0.006883245427161455, -0.01733298972249031, -0.005576009396463633, -0.0391005203127861, 0.03563571721315384, -0.15826353430747986, -0.11218248307704926, -0.04415111616253853, 0.02839595638215542, -0.01337781734764576, 0.013596735894680023, -0.01595042459666729, -0.0009495260310359299, -0.002326966729015112, -0.04735448956489563, 0.01170523464679718, 0.02564593404531479, -0.011987527832388878, -0.038041844964027405, 0.05066080391407013, -0.03853800892829895, -0.0031356147956103086, -0.009619531221687794, -0.022752931341528893, -0.029090192168951035, -0.016518985852599144, 0.026436204090714455, 0.0128419054672122, 0.007030446548014879, -0.00820736214518547, 0.003858677577227354, -0.024573929607868195, -0.007379110902547836, 0.005903978366404772, 0.015639955177903175, -0.004679531790316105, -0.022961046546697617, -0.0030826108995825052, 0.025428839027881622, -0.04381668195128441, 0.042700961232185364, -0.00586670869961381, 0.01677561365067959, 0.012817892245948315, 0.1662861406803131, 0.034682560712099075, -0.04145679250359535, 0.09113416820764542, -0.07682187855243683, -0.010746069252490997, -0.027094295248389244, 0.009851785376667976, -0.06027801334857941, 0.020363669842481613, 0.003790226299315691, -0.028529802337288857, 0.012883958406746387, -0.033721935003995895, -0.010535763576626778, -0.006491785869002342, 0.031076129525899887, -0.043996360152959824, 0.008373009972274303, -0.01904124766588211, -0.03750932216644287, -0.027946513146162033, -0.03496728464961052, 0.0016426858492195606, -0.02092006430029869, 0.05260095000267029, 0.030365612357854843, -0.06113092228770256, 0.014499546028673649, 0.04285631701350212, 0.0500737801194191, 0.06626630574464798, -0.011566727422177792, 0.010001631453633308, -0.03566553071141243, -0.01723475754261017, 0.05573368817567825, 0.04763161763548851, -0.04856622591614723, 0.027948366478085518, -0.04099905118346214, 0.0034460886381566525, 0.019511403515934944, 0.007445237133651972, -0.04157967120409012, -0.03752632066607475, 0.02033953182399273, 0.002293410710990429, 5.8050725783687085e-05, 0.018933575600385666, -0.012648090720176697, 0.020102689042687416, 0.027387306094169617, -0.035620734095573425, 0.0029215416871011257, -0.010203096084296703, -0.005217169411480427, -0.04337609186768532, -0.005842810496687889, 0.028470825403928757, 0.012506797909736633, 0.00048617468564771116, -0.07758896052837372, -0.016413908451795578, -0.049881093204021454, -0.04042850807309151, 0.005767547991126776, -0.0031148798298090696, 0.021301792934536934, 0.04873821139335632, -0.04816601052880287, 0.03594041243195534, -0.012395557947456837, -0.002872853772714734, 0.007161193992942572, 0.010869050398468971, -0.020129119977355003, 0.039750222116708755, -0.0007365287747234106, -0.0267544724047184, -0.06189362704753876, 0.038718465715646744, 0.027285557240247726, -0.04188055917620659]" ./train/Bouvier_des_Flandres/n02106382_4153.JPEG,Bouvier_des_Flandres,"[-0.01321516651660204, -0.00919481460005045, 0.0017369503621011972, 0.05458272621035576, 0.07649245858192444, -0.05045256391167641, 0.05089810490608215, -0.04403504356741905, 0.02657857909798622, -0.00318490294739604, 0.004425390157848597, -0.0009306840947829187, 0.006297864951193333, 0.021806824952363968, -0.01615370251238346, 0.011795828118920326, 0.049466170370578766, -0.023034004494547844, -0.001031864550895989, -0.0008910345495678484, -0.06841286271810532, 0.06083396077156067, -0.014409659430384636, -0.03736286610364914, 0.04848192632198334, -0.01419387012720108, 0.02791574038565159, -0.02218586578965187, 0.0645245611667633, -0.010646887123584747, -0.019404137507081032, 0.044275928288698196, 0.023605870082974434, 0.017853250727057457, 0.032812681049108505, 0.008527622558176517, -0.0015044496394693851, -0.011016950942575932, 0.017750464379787445, 0.09406968951225281, -0.053256794810295105, -0.005827455315738916, 0.032003793865442276, -0.009393470361828804, 0.008685094304382801, -0.023344233632087708, 0.031078530475497246, 0.025638239458203316, -0.036652885377407074, -0.02017330937087536, -0.010638846084475517, 0.0360921174287796, 0.004957427270710468, 0.05221166834235191, 0.011865216307342052, 0.008660254068672657, -0.0019731803331524134, 0.0290425643324852, -0.02528945356607437, -0.025743117555975914, 0.1216898038983345, 0.007891492918133736, 0.05309643596410751, -0.000722709926776588, 0.009669887833297253, 0.00035441803629510105, -0.004418238531798124, 0.10243227332830429, -0.0072179632261395454, -0.02452564798295498, 0.015109912492334843, -0.0013400533935055137, -0.031022513285279274, 0.04788092523813248, -0.012382888235151768, 0.05110744386911392, -0.06152670457959175, -0.049313023686409, 0.0169726200401783, 0.0207892544567585, 0.06371156871318817, 0.05382440239191055, -0.07072821259498596, -0.005183384753763676, 0.022109709680080414, 0.016927344724535942, -0.04901888594031334, -0.013541916385293007, 0.06687219440937042, -0.002673789393156767, -0.04306039959192276, 0.014536408707499504, -0.5856348872184753, 0.05640912801027298, -0.038277678191661835, -0.013175874948501587, -0.012836094945669174, 0.013269110582768917, -0.09560409188270569, 0.15708482265472412, 0.037030018866062164, -0.0202912800014019, 0.021465787664055824, -0.03338893875479698, 0.04166644439101219, -0.028370345011353493, -0.034168630838394165, -0.03638092055916786, -0.0035995543003082275, 0.05170134827494621, 0.003609867300838232, -0.011925950646400452, -0.004730511456727982, -0.02691248059272766, 0.003645707154646516, -0.021144680678844452, 0.013424882665276527, -0.04319246858358383, -0.020549708977341652, 0.0007135438499972224, 0.026853550225496292, -0.01659078523516655, -0.011010229587554932, -0.01615184172987938, 0.040680527687072754, -0.03288941830396652, -0.017851507291197777, 0.045786283910274506, 0.004450417123734951, 0.008507140912115574, 0.0519973523914814, -0.0211710873991251, -0.031070532277226448, 0.08151619136333466, 0.006450363900512457, -0.03618920221924782, -0.02284642867743969, -0.051379889249801636, 0.033439572900533676, -0.012663601897656918, -0.057409126311540604, 0.010103537701070309, 0.03704997897148132, 0.0276095662266016, -0.04628577455878258, 0.002743935212492943, -0.004918274469673634, 0.05147412419319153, -0.04653897508978844, -0.0218913946300745, 0.05322032421827316, 0.03187057375907898, 0.09213995933532715, 0.0018036754336208105, -0.0545366033911705, 0.01983112283051014, -0.01704230159521103, 0.023190027102828026, 0.01193936262279749, -0.031633831560611725, -0.029796430841088295, -0.00520456675440073, 0.0015879783313721418, -0.012756108306348324, 0.0642385482788086, -0.044182758778333664, -0.002822265960276127, 0.040661975741386414, 0.01845579594373703, 0.025397833436727524, 0.01909232884645462, -0.005357997491955757, -0.0009210545103996992, -0.05141768231987953, 0.022703539580106735, 0.05183606967329979, 0.03265498951077461, 0.021937238052487373, -0.0034505296498537064, -0.012195131741464138, 0.009599464014172554, -0.04042084142565727, 0.03240272402763367, -0.017423855140805244, 0.04525711387395859, -0.018296919763088226, 0.033878568559885025, 0.023706303909420967, -0.01819070801138878, 0.024205679073929787, -0.028009099885821342, -0.0662362352013588, 0.01378549076616764, 0.05085064843297005, -0.11100473254919052, 0.002209110651165247, -0.006840717978775501, -0.00926419161260128, -0.043919555842876434, 0.03496634587645531, -0.003354785731062293, 0.025498908013105392, -0.0006028989446349442, 0.008122016675770283, -0.02458176016807556, 0.00508169736713171, -0.01676228828728199, 0.0027229192201048136, 0.03500770777463913, 0.018515191972255707, -0.04219349846243858, -0.0632639229297638, -0.0003587713872548193, -0.008922762237489223, -0.007550484966486692, -0.020259974524378777, 0.014774895273149014, 0.014816053211688995, 0.052257005125284195, 0.007133407983928919, -0.01657472550868988, 0.026343340054154396, 0.004261394497007132, -0.02910972200334072, -0.044040556997060776, -0.007863754406571388, -0.00859623309224844, -0.012873583473265171, 0.0071326857432723045, 0.0025283547583967447, 0.007450557313859463, 0.004397482145577669, -0.008976135402917862, 0.04819222539663315, -0.01225714199244976, 0.0041205016896128654, -0.02926734834909439, 0.015795549377799034, 0.00993190985172987, -0.04048701748251915, -0.034259140491485596, 0.009166070260107517, 0.07841583341360092, 0.004881857428699732, -0.05105148255825043, 0.09553833305835724, 0.00020798944751732051, -0.01827097311615944, -0.013734608888626099, 0.08604399859905243, 0.026925697922706604, -0.017975639551877975, 0.019020454958081245, 0.03683746978640556, 0.02631816454231739, -0.023546187207102776, 0.013189208693802357, 0.028505807742476463, -0.07670892775058746, -0.017530260607600212, -0.0778275728225708, 0.029261192306876183, 0.010468922555446625, 0.020032662898302078, 0.025817878544330597, -0.0019731216598302126, 0.0011767609976232052, 0.025213174521923065, -0.03448409587144852, 0.048140522092580795, -0.005686954129487276, 0.005827684421092272, 0.0484127514064312, -0.028224579989910126, 0.019771751016378403, 0.021149147301912308, 0.023146003484725952, 0.026986664161086082, 0.006819531321525574, -0.038480244576931, 0.005214241798967123, 0.015430644154548645, -0.06372519582509995, -0.04401404410600662, -0.009842206723988056, 0.038236577063798904, -0.020640747621655464, -0.024424344301223755, -0.04468265175819397, 0.01739325188100338, 0.019117185845971107, 0.03730866685509682, -0.025379393249750137, 0.009229765273630619, 0.028068525716662407, -0.008049721829593182, -0.009620383381843567, -0.027232564985752106, -0.00658153323456645, 0.025224223732948303, -0.033085327595472336, -0.03312893584370613, -0.0306974146515131, -0.002154488582164049, 0.03829885274171829, -0.0821598470211029, 0.054046034812927246, 0.016840221360325813, 0.026695795357227325, 0.007468046620488167, 0.012682798318564892, 0.006788394879549742, 0.0812695175409317, -0.04478370025753975, 0.04244188591837883, -0.040899354964494705, -0.0056819492019712925, 0.04223993048071861, -0.03389468416571617, 0.02522561512887478, 0.016794055700302124, 0.02801789529621601, -0.05526965484023094, 0.048164285719394684, -0.02236560545861721, 0.010866505093872547, -0.05021892860531807, 0.04538847506046295, -0.008101179264485836, -0.03763357922434807, -0.006342179607599974, -0.016154594719409943, 0.026379432529211044, 0.015783580020070076, -0.02681693248450756, -0.03009101375937462, 0.02643822692334652, 0.05321456864476204, -0.03294626623392105, -0.012939327396452427, 0.07098093628883362, -0.0041571613401174545, 0.010346450842916965, 0.01981092244386673, 0.019856980070471764, 0.020087702199816704, -0.006695806980133057, 0.0008998386329039931, 0.030994655564427376, 0.0021757865324616432, 0.03362107649445534, -0.01433584000915289, 0.038214247673749924, -0.021096132695674896, 0.0022435560822486877, 0.04205707088112831, -0.042471032589673996, -0.06694589555263519, -0.024463968351483345, 0.014929236844182014, 0.07741277664899826, -0.04861002415418625, 0.031850360333919525, -0.011455437168478966, -0.055665723979473114, 0.0012246171245351434, 0.01894761621952057, -0.06200259551405907, 0.02041628770530224, -0.012082940898835659, 0.016043636947870255, 0.037744857370853424, -0.011405416764318943, 0.0099668949842453, -0.021344581618905067, 0.005629159044474363, 0.1953207552433014, 0.01097009889781475, 0.006992545444518328, 0.019934367388486862, 0.031141143292188644, -0.035781823098659515, 0.031054353341460228, 0.015732768923044205, -0.015994388610124588, -0.030347730964422226, -0.045819442719221115, -0.03278603404760361, 0.017556041479110718, -0.052194852381944656, -0.021035563200712204, -0.01877237670123577, 0.02609226480126381, -0.0242067351937294, 0.025937693193554878, -0.008018926717340946, -0.04281539469957352, 0.04458118602633476, -0.023676788434386253, -0.06834647059440613, -0.023043323308229446, -0.02705821953713894, 0.02951251156628132, -0.0022814623080193996, -0.01124521903693676, 0.026285406202077866, 0.0060051181353628635, -0.06709892302751541, 0.0033368098083883524, -0.023010343313217163, -0.03653672710061073, -0.02298121713101864, 0.0009640506468713284, 0.004438376519829035, -0.013675197958946228, -0.018773475661873817, 0.046978648751974106, -0.00799825880676508, 0.019412148743867874, -0.04293902963399887, 0.004136263392865658, -0.04476066306233406, -0.024207450449466705, 0.026065470650792122, 0.019307322800159454, -0.06972192227840424, 0.000883016618900001, 0.006650097668170929, 0.0843888446688652, -0.021913224831223488, -0.031977180391550064, 0.027872079983353615, 0.02123175375163555, 0.024895498529076576, -0.007823995314538479, -0.027174891903996468, -0.03999989479780197, 0.050654567778110504, -0.011068994179368019, -0.008544155396521091, 0.0419391393661499, 0.08734386414289474, -0.04549092799425125, 0.008703310042619705, 0.039433740079402924, -0.02416275627911091, -0.003291038330644369, 0.07687617093324661, -0.032128892838954926, 0.011064417660236359, -0.052005525678396225, -0.016510017216205597, -0.013940253295004368, -0.014307273551821709, -0.011369065381586552, -0.05680866912007332, -0.027388975024223328, -0.011085224337875843, -0.011891272850334644, 0.04165637865662575, 0.014207975007593632, 0.07072412222623825, 0.011208160780370235, 0.03544563055038452, 0.0019872854463756084, 0.011553744785487652, -0.004934821277856827, 0.03554397076368332, -0.03770756348967552, -0.0027401032857596874, 0.028601597994565964, -0.017609627917408943, -0.002731898333877325, 0.02043972723186016, -0.01017772313207388, 0.03635185956954956, -0.020453184843063354, 0.007790983188897371, -0.02789604850113392, -0.004513379652053118, 0.0197726059705019, -0.009942254051566124, 0.004540581256151199, 0.03317395970225334, 0.0582299642264843, 0.04646740108728409, -0.01913926564157009, 0.018766866996884346, 0.025282053276896477, -0.006513084750622511, -0.07668846845626831, -0.011298381723463535, 0.027494102716445923, -0.07797146588563919, 0.0028956441674381495, -0.011243276298046112, 0.04329429939389229, 0.033934399485588074, -0.01666036620736122, 0.0023573937360197306, -0.02795184589922428, -0.025023622438311577, -0.004988754168152809, 0.022064413875341415, 0.019571594893932343, -0.07145263999700546, -0.011581679806113243, 0.0035702474415302277, -0.05113179609179497, 0.040251441299915314, 0.003213944612070918, 0.026176484301686287]" ./train/Bouvier_des_Flandres/n02106382_404.JPEG,Bouvier_des_Flandres,"[-0.00914438534528017, 0.028371794149279594, 0.027482053264975548, 0.018855439499020576, 0.032752662897109985, -0.07841399312019348, 0.0073407371528446674, -0.038688287138938904, 0.00533393444493413, -0.011739689856767654, 0.04980352148413658, 0.009657822549343109, 0.007291310932487249, 0.026921536773443222, -0.02297748252749443, 0.04023651033639908, 0.0026892737951129675, -0.007239961996674538, -0.016218602657318115, -0.042156219482421875, -0.04677591472864151, 0.02919919043779373, -0.02725355140864849, -0.09495717287063599, 0.0013799709267914295, 0.048639457672834396, 0.00833189208060503, 0.002059918362647295, -0.003069699974730611, 0.012717073783278465, -0.007389258127659559, 0.012159372679889202, 0.012831350788474083, -0.019180988892912865, -0.009538006968796253, -0.005055704619735479, -0.015122968703508377, 0.012592896819114685, -0.030210193246603012, 0.007558595854789019, -0.023555539548397064, 0.021144794300198555, -0.009899851866066456, -0.011411507613956928, -0.0034056464210152626, -0.10332359373569489, 0.038125693798065186, -0.017957748845219612, -0.021815059706568718, -0.030891939997673035, -0.03228018432855606, 0.007864166982471943, 0.02402181178331375, 0.047081947326660156, 0.025188272818922997, 0.029580440372228622, 0.004578814376145601, 0.07389757037162781, 0.03215953707695007, -0.025099093094468117, 0.018426449969410896, -0.01202974934130907, 0.010044438764452934, 0.012164334766566753, -0.019636882469058037, -0.005143281072378159, -0.01300947554409504, 0.13632892072200775, -0.03386891260743141, -0.012530805543065071, -0.00427346071228385, -0.03509035333991051, 0.02517969347536564, 0.012856896966695786, -0.031208747997879982, -0.0019072011345997453, -0.08331957459449768, -0.03125295415520668, -0.06424764543771744, -0.007057847920805216, -0.0029135383665561676, 0.012053269892930984, 0.019331511110067368, -0.07184473425149918, 0.039313267916440964, 0.03972823917865753, 0.03462642431259155, -0.031043849885463715, -0.03758461773395538, 0.030108412727713585, -0.005932887550443411, -0.008761524222791195, -0.5997380614280701, 0.010502897202968597, 0.01898805983364582, -0.014762777835130692, -0.014376247301697731, -0.00512652238830924, -0.0640815943479538, -0.09049291163682938, 0.013892042450606823, 0.01968749240040779, -0.015163227915763855, 0.05712354928255081, 3.531796392053366e-05, 0.01388015691190958, -0.03149925172328949, 0.010452588088810444, -0.0663599744439125, -0.011151487939059734, 0.04102892801165581, -0.07355929911136627, -0.03236295282840729, -0.03191278129816055, -0.017487337812781334, 0.006817228626459837, 0.013968189246952534, -0.06531017273664474, 0.005834505893290043, 0.02516409382224083, -0.03601009026169777, -0.08839350193738937, 0.013872899115085602, 0.005545498803257942, -0.0010589601006358862, -0.01769387535750866, 0.04390889033675194, -0.006509253289550543, -0.010387727059423923, 0.02282920479774475, 0.02439185604453087, 0.029168149456381798, -0.019297221675515175, 0.0892627015709877, -0.0328964926302433, -0.03390388935804367, 0.008165748789906502, 0.03700517490506172, 6.599399785045534e-05, 0.009011952206492424, 0.015429964289069176, 0.0016026584198698401, -0.04293876886367798, 0.009014803916215897, -0.01958812028169632, 0.03362764045596123, 0.010804307647049427, 0.045381177216768265, -0.026657013222575188, -0.01711171492934227, -0.004064586013555527, 0.012583144940435886, 0.02759896218776703, 0.03146946802735329, 0.011691557243466377, 0.014359698630869389, 0.02290777675807476, 0.013209056109189987, -0.026233140379190445, -0.0147056570276618, -0.02374962344765663, -0.013034485280513763, -0.03599365055561066, -0.020480351522564888, -0.0028476135339587927, -0.013797789812088013, -0.05162007734179497, -0.008498615585267544, 0.03337104618549347, 0.03633981943130493, 0.012120192870497704, -0.0149613032117486, 0.004657386802136898, -0.04114833474159241, 0.00585227832198143, -0.03849872946739197, 0.08368664234876633, 0.042845629155635834, 0.04251516982913017, -0.0030013283248990774, 0.020872516557574272, -0.010826893150806427, 0.03145521879196167, -0.004813987761735916, -0.006687740329653025, -0.027640830725431442, -0.003939859103411436, 0.013719516806304455, -0.01347027812153101, 0.007341729011386633, -0.030189234763383865, -0.02156553976237774, 0.044240087270736694, 0.01191400270909071, -0.06546369940042496, 0.013426430523395538, -0.007166759110987186, -0.06611482053995132, 0.016556624323129654, -0.006184447556734085, 0.04077758267521858, 0.028808915987610817, 0.05193575471639633, -0.0024735035840421915, 0.0017011873424053192, 0.021231571212410927, -0.036274828016757965, -0.06861770898103714, 0.0315081961452961, -0.010659164749085903, -0.02466563880443573, -0.05117373913526535, 0.05586063861846924, 0.04717586934566498, 0.010016166605055332, 0.02568066120147705, 0.05142499506473541, 0.010249079205095768, -0.015057161450386047, -0.007252272218465805, 0.05307610332965851, -0.06213540583848953, 0.002196378307417035, -0.00757910730317235, -0.023156167939305305, 0.006219350267201662, 0.008989560417830944, 0.04151087999343872, 0.024076318368315697, 0.04189328849315643, 0.05855117365717888, 0.021309664472937584, -0.0037769454065710306, -0.022153595462441444, 0.013342657126486301, -0.04754244536161423, 0.021417073905467987, -0.018237318843603134, 0.0005674267304129899, -0.006490398198366165, 0.0028547539841383696, 0.045586392283439636, 0.0073565831407904625, -0.004626067355275154, -0.013701577670872211, 0.013765323907136917, 0.0019386588828638196, 0.027325619012117386, -0.021647077053785324, 0.014308667741715908, 0.029207758605480194, 0.025612086057662964, -0.00645203422755003, 0.0031038341112434864, 0.010339329950511456, -0.03154692426323891, -0.025438010692596436, -0.03756795451045036, 0.02345971390604973, -0.013666898012161255, 0.02513284608721733, -0.01248457096517086, 0.03465471789240837, 0.05618590861558914, 0.047531358897686005, 0.004436163697391748, -0.014026664197444916, -0.016061434522271156, 0.015078726224601269, 0.006989051587879658, 0.07249585539102554, -0.011588181369006634, 0.07736305892467499, -0.000818133179564029, 0.0024914955720305443, 0.036346759647130966, -0.001923806848935783, -0.01416695024818182, -0.036297332495450974, 0.008525052107870579, -0.01479334942996502, 0.04089345782995224, -0.018468400463461876, 0.001846550265327096, 0.014794616959989071, 0.0033482194412499666, -0.0432756245136261, -0.002050391398370266, -0.044791802763938904, -0.0055068302899599075, -0.004639407619833946, -0.013006090186536312, -0.04502115026116371, 0.01916179060935974, -0.016748061403632164, -0.03801148757338524, 0.0769343450665474, -0.06280092149972916, -0.027082987129688263, 0.009721823036670685, -0.029910452663898468, -0.00957623589783907, 0.010578788816928864, -0.0009483961621299386, 0.0232806708663702, -0.022981081157922745, 0.07671146094799042, -0.018397105857729912, 0.018522607162594795, -0.001532560563646257, -0.01226253341883421, 0.008581362664699554, 0.08911491930484772, 0.036615192890167236, 0.007926253601908684, -0.07314250618219376, -0.0062919496558606625, 0.04583119973540306, -0.024206617847085, 0.01592877134680748, 0.020720498636364937, 0.0699436292052269, -0.028977038338780403, -0.011259645223617554, -0.0018617530586197972, 0.016672559082508087, -0.023827804252505302, 0.020379403606057167, -0.01707151159644127, -0.01618669554591179, -0.01612887531518936, -0.03793306276202202, 0.028787117451429367, -0.0339379720389843, -0.029361067339777946, -0.051113154739141464, 0.012721506878733635, 0.02355778217315674, 0.006681020371615887, -0.00854299496859312, -0.005024834536015987, 0.04748427867889404, -0.02253095805644989, 0.03756815567612648, -0.007172334473580122, 0.008199195377528667, 0.006544733420014381, 0.06981934607028961, -0.005519254133105278, -0.004662238992750645, 0.061413880437612534, 0.014359187334775925, 0.03282271325588226, -0.025551728904247284, 0.03881877660751343, 0.09999813884496689, 0.0030594603158533573, -0.07682681083679199, -0.0072331903502345085, -0.019308418035507202, 0.1467890441417694, -0.044298384338617325, 0.030667699873447418, 0.04079899191856384, -0.06399659067392349, 0.021648814901709557, 0.028867553919553757, -0.0362660251557827, 0.01715737208724022, -0.003117774613201618, -0.011732297949492931, 0.0027579120360314846, -0.03354073688387871, 0.03679122030735016, -0.0176524855196476, 0.029529420658946037, 0.14071139693260193, -0.03320637717843056, -0.016446271911263466, 0.0393822118639946, 0.025568749755620956, -0.013909435831010342, -0.031588613986968994, -0.02284122258424759, -0.025911254808306694, -0.01236784178763628, -0.028134753927588463, -0.011057762429118156, 0.029649725183844566, -0.07826309651136398, -0.1233886256814003, -0.08338228613138199, 0.03822120279073715, 0.020417215302586555, 0.044664543122053146, -0.04162520170211792, -0.005111703183501959, -0.022641252726316452, 0.026110410690307617, -0.004950392059981823, -0.027887726202607155, 0.0034240814857184887, 0.11876953393220901, 0.028178701177239418, 0.032254017889499664, 0.003944768570363522, -0.0026481591630727053, -0.00931570678949356, -0.046632613986730576, -0.03442662954330444, 0.051587603986263275, 0.04973381757736206, -0.025272946804761887, 0.04006725549697876, -0.036213669925928116, 0.03045210801064968, 0.03369862213730812, -0.07420831173658371, -0.007636009715497494, 0.011762337759137154, -0.016204971820116043, 0.015394991263747215, -0.01485921535640955, 0.00696394219994545, 0.03194207698106766, -2.15245017898269e-05, 0.033126574009656906, 0.044474370777606964, 0.20396125316619873, -0.013017307035624981, 0.021156806498765945, 0.011389805004000664, 0.023095551878213882, -0.02473040670156479, -0.023082587867975235, 0.0035271623637527227, -0.03770028054714203, 0.006512980442494154, -0.021107371896505356, 0.011732262559235096, -0.010917579755187035, 0.042417097836732864, -0.043786756694316864, -0.013716169632971287, -0.012327740900218487, -0.018446236848831177, 0.0014983046567067504, 0.019037846475839615, 0.027818085625767708, 0.019772367551922798, -0.036486558616161346, 0.01364012062549591, -0.04556753858923912, -0.052441731095314026, -0.01018533669412136, -0.04535238817334175, 0.0602584183216095, -0.014724805019795895, -0.03110455349087715, 0.024198809638619423, 0.011473042890429497, 0.0367407351732254, -0.002715613692998886, -0.02566683292388916, 0.02044503763318062, -0.0005826998385600746, -0.043325331062078476, -0.004507766105234623, -0.023652350530028343, 0.004622753709554672, 0.027106445282697678, -0.020491575822234154, 0.01219844724982977, -0.04948021098971367, 0.018961142748594284, 0.009427816607058048, -0.014881530776619911, -0.00610159058123827, 0.009452116675674915, 0.02285764180123806, -0.003079780377447605, 0.01718353107571602, 0.026078427210450172, 0.0036280632484704256, 0.004944652784615755, 0.06858045607805252, -0.009698798879981041, 0.047317393124103546, -0.0016213192138820887, 0.02371235005557537, -0.006373228505253792, -0.0003242998500354588, 0.044838838279247284, -0.047496773302555084, -0.03308452293276787, -0.033181436359882355, 0.013331558555364609, -0.024634193629026413, -0.010878004133701324, 0.01116026472300291, -0.00020698268781416118, 0.014354035258293152, -0.033901479095220566, -0.002007810864597559, 0.04399891197681427, -0.0023575592786073685, -0.013189216144382954, -0.014780736528337002, -0.003515299642458558, 0.06448626518249512, 0.008519073016941547, 0.016509369015693665]" ./train/Bouvier_des_Flandres/n02106382_9318.JPEG,Bouvier_des_Flandres,"[0.02711942233145237, 0.0365133211016655, -0.05073995143175125, 0.034066714346408844, 0.03508860617876053, -0.0366823785007, -0.004748659674078226, -0.0061109294183552265, 0.040240827947854996, -0.009604081511497498, -0.018933594226837158, -0.00795199628919363, 0.012441574595868587, -0.011138827539980412, -0.04300370439887047, 0.0074120815843343735, 0.060046955943107605, 0.03637266904115677, -0.008369186893105507, -0.039027802646160126, -0.053007714450359344, -0.00020777646568603814, 0.024685338139533997, 0.00041833246359601617, 0.010541988536715508, 0.017323732376098633, 0.029304657131433487, -0.028258463367819786, -0.006996951997280121, -0.04756778106093407, -0.0017354158917441964, 0.04921437427401543, -0.03325262293219566, -0.0005386327975429595, 0.04560927301645279, 0.010440015234053135, 0.010871193371713161, -0.0369209423661232, -0.011899123899638653, 0.09259245544672012, -0.04815920814871788, 0.02953256480395794, 0.03513698652386665, -0.03183953836560249, 0.02004162035882473, 0.012696503661572933, 0.00874030590057373, 0.01593853160738945, -0.017521703615784645, 0.02253829315304756, 0.03896874561905861, 0.015323703177273273, -0.0002639968297444284, 0.04794047027826309, 0.013936405070126057, 0.004626764450222254, 0.0147474966943264, -0.012508631683886051, -0.031512267887592316, -0.020999526605010033, 0.03761650621891022, -0.00915063638240099, 0.01764904148876667, 0.06028623506426811, -0.0020447850693017244, 0.007251402363181114, 0.028776835650205612, 0.09434527903795242, 0.00932155828922987, -0.005916961934417486, 0.042192038148641586, 0.03734306991100311, 0.013783920556306839, 0.05519720911979675, 0.04678332805633545, 0.02121053636074066, 0.02216995880007744, -0.05260607227683067, -0.00403024023398757, -0.0024085799232125282, 0.013579578138887882, -0.014518235810101032, -0.052879322320222855, 0.0014342692447826266, -0.018764033913612366, -0.012819843366742134, 0.11589883267879486, -0.02450011856853962, 0.032085057348012924, -0.001895475434139371, -0.011445507407188416, -0.03913651406764984, -0.6451879739761353, -0.01923791505396366, 0.008372134529054165, 0.041403379291296005, 0.025479068979620934, 0.027367206290364265, -0.03649561107158661, 0.03186074271798134, 0.017510777339339256, -0.013584955595433712, 0.02195700816810131, 0.006648858077824116, 0.04402163624763489, -0.026782317087054253, 0.06839269399642944, 0.03245962783694267, -0.008261380717158318, -0.04869500920176506, -0.029333041980862617, -0.08037323504686356, -0.024135159328579903, -0.02771761268377304, 0.007032705936580896, -0.04340890422463417, -0.018099676817655563, -0.04636073112487793, 0.05433722212910652, -0.020240655168890953, 0.05309583619236946, -0.05340009927749634, 0.00975048542022705, 0.023937677964568138, 0.006627809721976519, -0.06905647367238998, -0.040165502578020096, 0.035679496824741364, 0.02091260254383087, -0.0061623165383934975, 0.02097330242395401, -0.041154470294713974, -0.043363552540540695, 0.0829407349228859, -0.06507977843284607, -0.030619459226727486, 0.0128936767578125, -0.012021207250654697, 0.015832699835300446, 0.059157583862543106, -0.013408530503511429, -0.013755463063716888, 0.003995704464614391, 0.004511076956987381, -0.050156593322753906, 0.04477677494287491, 0.019909672439098358, -0.03981952369213104, -0.019663596525788307, -0.024668239057064056, -0.016109835356473923, 0.049084197729825974, -0.058122243732213974, -0.03137936443090439, 0.00612115440890193, -0.009250952862203121, 0.001799260382540524, -0.0007653453503735363, 0.040461380034685135, -0.005818930454552174, -0.016502412036061287, -0.004307480063289404, 0.029065677896142006, 0.026252569630742073, 0.03483786806464195, -0.0381041094660759, -0.022646501660346985, 0.03843390569090843, -0.012635616585612297, 0.019010573625564575, -0.01793774403631687, 0.004043601918965578, 0.03159552812576294, -0.03263142332434654, -0.005508047062903643, -0.03784603998064995, 0.05679779499769211, -0.0008150577777996659, 0.04553753882646561, 0.010262089781463146, -0.008200605399906635, 0.04838428646326065, 0.01944221742451191, -0.04815027117729187, -0.012121506035327911, -0.006865832023322582, 0.0684245303273201, -0.017862673848867416, 0.0300320852547884, -0.00339188938960433, 0.03465442359447479, 0.01269362960010767, -0.039223428815603256, -0.01120644249022007, 0.013061066158115864, -0.0116866584867239, 0.022512132301926613, -0.05596394091844559, -0.10541756451129913, -0.04102558270096779, -0.010762845166027546, 0.040759019553661346, -0.003521519945934415, 0.041598912328481674, -0.030509013682603836, -0.01729251816868782, -0.024217385798692703, -0.019697468727827072, 0.0012705925619229674, 0.04404955357313156, -0.04494743049144745, 0.07708153873682022, 0.004959677346050739, 0.0267015490680933, -0.03941238299012184, -0.04788701608777046, 0.012551095336675644, -0.029333528131246567, 0.09106168150901794, -0.012940097600221634, 0.030053220689296722, 0.06607387959957123, 0.0022168110590428114, 0.009168536402285099, -0.009954196400940418, 0.010807140730321407, -0.001309140003286302, -0.0457538478076458, 0.042430516332387924, -0.0044351425021886826, -0.0057537448592484, -0.015058504417538643, 0.012330280616879463, 0.031880415976047516, -0.007913406938314438, -0.05761479213833809, -0.04225153848528862, -0.009424304589629173, 0.026696771383285522, -0.016094105318188667, 0.008032092824578285, 0.029132774099707603, 0.02461753413081169, 0.01608474738895893, 0.0033050975762307644, 0.07980795949697495, 0.05213586986064911, -0.05829637870192528, -0.0019362512975931168, 0.042679160833358765, 0.01372349914163351, 0.018457118421792984, -0.0016662711277604103, 0.035366352647542953, 0.007051303517073393, 0.019893314689397812, -0.009246118366718292, 0.02976745367050171, 8.610506483819336e-05, -0.02643483132123947, -0.019514616578817368, 0.0022468522656708956, 0.023121001198887825, 0.03098728321492672, 0.022105371579527855, -0.03503081575036049, -0.0002228713856311515, 0.02599533088505268, -0.025917449966073036, 0.0069150421768426895, -0.0021026944741606712, 0.029998326674103737, 0.02302500233054161, 0.018377691507339478, 0.0005921918782405555, -0.0016315783141180873, 0.033603593707084656, -0.002904267283156514, -0.020007561892271042, 0.018181921914219856, 0.012567303143441677, -0.002518327906727791, -0.056489601731300354, -0.00929082091897726, 0.007147719617933035, -0.041021715849637985, -0.031007984653115273, -0.014028683304786682, 0.03629592806100845, -0.005084506701678038, -0.032564885914325714, 0.029478436335921288, 0.03664327785372734, 0.0283924862742424, -0.010673191398382187, 0.026416800916194916, -0.0023948904126882553, -0.011023765429854393, -0.005052933003753424, -0.006080628372728825, -0.020669089630246162, 0.0016575567424297333, -0.02276293933391571, 0.023368384689092636, 0.0013814076082780957, -0.01382724940776825, -0.03132205083966255, 0.05948357656598091, -0.0078424122184515, -0.004285937640815973, 0.00199690368026495, 0.07096463441848755, 0.0828840434551239, 0.02614145539700985, 0.01267577800899744, 0.0041517517529428005, 0.08831380307674408, 0.05495021492242813, -0.005541922990232706, -0.03653845191001892, 0.02372771129012108, 0.1326567381620407, -0.013079231604933739, 0.0010173249756917357, 0.016484292224049568, 0.026530945673584938, -0.0229948703199625, 0.021851858124136925, -0.01261183712631464, 0.0004024588270112872, -0.015009589493274689, 0.005169002339243889, -0.0013514208840206265, -0.061533305794000626, -0.005823417566716671, 0.05091273784637451, 0.003013732610270381, 0.014953924342989922, 0.008519431576132774, 0.033520884811878204, 0.0011023830156773329, -0.0045167687349021435, 0.003453100100159645, -0.0057905265130102634, 0.06521731615066528, 0.01731998659670353, 0.028665553778409958, 0.029951009899377823, -0.020776107907295227, -0.007224856875836849, 0.011621586978435516, 0.004436907358467579, 0.01197734847664833, 0.004685301333665848, 0.007613247726112604, 0.08550301939249039, -0.0031792372465133667, -0.07229848951101303, -0.003063451498746872, 0.051569584757089615, 0.011377491056919098, -0.033073075115680695, -0.010219943709671497, -0.025729846209287643, -0.04779553413391113, 0.0019174586050212383, -0.017811525613069534, -0.03637919947504997, 0.018249908462166786, -0.021637503057718277, -0.01310217659920454, 0.014795122668147087, 0.017394209280610085, 0.024577055126428604, 0.04879652336239815, -0.009349554777145386, 0.08366730064153671, 0.02267376333475113, -0.05973636731505394, 0.03945871815085411, -0.021589886397123337, -0.02211190015077591, 0.02483791671693325, 0.020216485485434532, 0.0025629594456404448, -0.06763414293527603, 0.0029714112170040607, -0.02116379328072071, 0.07849070429801941, -0.13269375264644623, -0.0629047229886055, -0.071799136698246, -0.015907173976302147, 0.010270786471664906, 0.01578378677368164, -0.004225030075758696, 0.01981750875711441, 0.003102341201156378, -0.00014065622235648334, -0.015592806972563267, 0.00106391916051507, 0.009709110483527184, 0.06037396192550659, -0.015601708553731441, -0.010655037127435207, -0.026784591376781464, 0.012815584428608418, -0.019557861611247063, 0.015233230777084827, -0.017095187678933144, 0.07606632262468338, 0.0025417678989470005, -0.024433357641100883, 0.029151881113648415, 0.012410813942551613, -0.029012106359004974, 0.0026243249885737896, -0.01236105989664793, 0.034754492342472076, -0.05878349393606186, 0.03373881056904793, 0.043375059962272644, -0.01763784885406494, 0.047065120190382004, 0.05439478158950806, -0.046697162091732025, -0.02622821554541588, 0.015313387848436832, 0.0857880488038063, -0.003312482498586178, -0.03527761250734329, 0.01840137504041195, -0.02643737383186817, -0.0026951651088893414, 0.0034594719763845205, 0.008365090005099773, -0.026040270924568176, 0.040464434772729874, -0.0019265208393335342, -0.018259217962622643, 0.0020820624195039272, -0.013797743245959282, -0.021763823926448822, -0.050255805253982544, -0.022877203300595284, -0.034727562218904495, -0.003143815090879798, -0.01648682728409767, -0.023612460121512413, -0.04075953736901283, -0.014845235273241997, -0.028074514120817184, -0.04518101364374161, 0.055877119302749634, -0.009259534068405628, -0.03466592729091644, 0.02884933352470398, 0.02523963898420334, 0.012354242615401745, 0.06517133116722107, 0.003404676914215088, -0.013137582689523697, 0.007033378817141056, -0.047339845448732376, 0.04892575740814209, 0.04025464504957199, -0.06771914660930634, -0.017179565504193306, -0.018424062058329582, 0.00927536841481924, 0.016839994117617607, -0.036261845380067825, -0.015552322380244732, -0.016347039490938187, -0.02629273198544979, 0.016101161018013954, 0.013151828199625015, -0.011296764016151428, -0.042834408581256866, -0.0397283099591732, 0.03256569802761078, -0.028324883431196213, 0.0035945645067840815, 0.017051203176379204, 0.0037215452175587416, 0.014796794392168522, -0.03423595055937767, 0.0033539696596562862, -0.014831497333943844, -0.0015980524476617575, -0.040410365909338, -0.055268544703722, 0.034249197691679, -0.04853124916553497, 0.03197252377867699, -0.0274763535708189, 0.03833777457475662, 0.039223987609148026, -0.04769372195005417, -0.003849578555673361, -0.03983548656105995, -0.008111478760838509, -0.014292171224951744, 0.010675477795302868, 0.004968392662703991, 0.04419000819325447, -0.03374034911394119, 0.004912977572530508, 0.01107749156653881, 0.07175023853778839, -0.003204696113243699, 0.008696076460182667]" ./train/Bouvier_des_Flandres/n02106382_5429.JPEG,Bouvier_des_Flandres,"[0.01130271703004837, -0.03404175862669945, 0.00556627893820405, 0.04118825122714043, 0.005897114984691143, -0.038794390857219696, 0.08445731550455093, -0.007636172231286764, -0.02101428247988224, 0.03299020603299141, -0.00756384851410985, -0.030467435717582703, 0.029726313427090645, 0.017353642731904984, 0.0032655498944222927, -0.007378853857517242, -0.03774309903383255, -0.0440649688243866, -0.006777104921638966, -0.020263180136680603, -0.06985986977815628, 0.01999916322529316, 0.0025085543747991323, -0.07406964898109436, 0.01791982911527157, 0.020393025130033493, 0.03702559694647789, -0.0339825302362442, 0.01915733516216278, -0.03098108246922493, -0.02620224468410015, 0.007921582087874413, 0.009674733504652977, -0.02289757877588272, 0.005426294170320034, 0.04820926859974861, 0.05330991744995117, 0.013873165473341942, -0.03106677159667015, 0.033712662756443024, -0.038918524980545044, 0.012785743921995163, 0.019443904981017113, -0.006965535692870617, 0.015448668971657753, -0.1788223534822464, -0.009669508785009384, -0.00172432663384825, 0.009673215448856354, -0.014898715540766716, 0.049739789217710495, -0.005503227934241295, 0.034708742052316666, 0.013945563696324825, 0.011619697324931622, 0.04833527281880379, -0.016330955550074577, 0.02627575770020485, 0.0026318072341382504, -0.004201260395348072, 0.004789107944816351, -0.013746448792517185, 0.0563276931643486, 0.02704778127372265, -0.016227584332227707, 0.006389444228261709, -0.008797026239335537, 0.0856708437204361, 0.003572868648916483, -0.00020151810895185918, 0.042170919477939606, -0.01227695494890213, -0.014226602390408516, -0.007250722032040358, -0.012405253946781158, 0.014529548585414886, -0.062069665640592575, -0.026544848456978798, -0.01771419495344162, -0.0030061642173677683, 0.03532185032963753, 0.037880878895521164, -0.03419283404946327, -0.10727477073669434, 0.024042420089244843, -0.007975474931299686, -0.049555521458387375, -0.012099023908376694, 0.07516101002693176, -0.0020883192773908377, -0.008297935128211975, -0.017783718183636665, -0.5791770815849304, 0.007173364516347647, -0.033332459628582, -0.031575947999954224, -0.006969849579036236, -0.002907433547079563, -0.03605659678578377, 0.1068822592496872, 0.053379300981760025, -0.02651279792189598, 0.031535569578409195, -0.0019817680586129427, -0.01008958276361227, 0.010288760997354984, -0.07138336449861526, 0.007962595671415329, -0.015037285163998604, 0.021949468180537224, -0.007831395603716373, -0.06999576836824417, -0.012831253930926323, -0.024405723437666893, -0.006836011074483395, -0.024276800453662872, -0.016029655933380127, -0.06217283010482788, -0.03464099392294884, 0.015258923172950745, 0.009665176272392273, 0.005742659326642752, -0.00964394211769104, 0.0007125735282897949, 0.0037109164986759424, -0.03073078766465187, -0.02144748903810978, 0.02530733309686184, -0.006049443036317825, -0.021966489031910896, 0.04867503419518471, 0.00017891907191369683, -0.0057460106909275055, 0.07991014420986176, -0.019330576062202454, 0.016424397006630898, -0.027994953095912933, -0.056768856942653656, -0.017473723739385605, 0.007416732609272003, -0.018434710800647736, 0.024382639676332474, 0.019602477550506592, 0.011425462551414967, -0.05951341614127159, 0.008760093711316586, 0.025834187865257263, -0.013556232675909996, -0.025966007262468338, -0.03296666964888573, 0.019968369975686073, 0.030056554824113846, 0.01296958327293396, 0.011530851013958454, -0.03040499985218048, -0.0032372616697102785, -0.009387719444930553, -0.042262088507413864, -0.021841267123818398, 0.008838542737066746, 0.008059951476752758, -0.01635303907096386, -7.266507600434124e-05, -0.014180800877511501, 0.08090091496706009, -0.056024596095085144, -0.018822915852069855, 0.00957022700458765, -0.04618312045931816, -0.0006566634401679039, -0.005651760846376419, -0.017192764207720757, 0.02341482602059841, -0.024687353521585464, 0.00017673647380433977, -0.026427259668707848, 0.03456734120845795, -0.06886392086744308, 0.0111510269343853, -0.03571152314543724, 0.014326918870210648, -0.027997730299830437, 0.02938280813395977, 0.018022220581769943, 0.0076459236443042755, -0.043043605983257294, 0.008946114219725132, -0.0019294924568384886, -0.02705414965748787, 0.00015024369349703193, 0.027280965819954872, -0.026256386190652847, 0.028560496866703033, 0.020458845421671867, -0.11067605018615723, -0.001541447127237916, 0.025951499119400978, -0.011548868380486965, 0.009998302906751633, -0.04110702872276306, -0.020662356168031693, 0.004936424549669027, 0.026255439966917038, 0.012976715341210365, -0.009306266903877258, -0.0038029153365641832, -0.026890713721513748, -0.01938607543706894, 0.008102048188447952, -0.0006030343938618898, -0.012057628482580185, -0.08492644131183624, 0.008970897644758224, 0.05530228465795517, -0.017407452687621117, -0.034671708941459656, 0.031657736748456955, 0.03361543267965317, 0.06845302134752274, -0.027080629020929337, 0.03489914536476135, 0.053124479949474335, 0.0025321487337350845, -0.0008349152049049735, -0.03777535632252693, -0.02162063680589199, -0.013533441349864006, 0.0013283956795930862, -0.03664726763963699, 0.003601999953389168, 0.005747830495238304, 0.02266714721918106, -0.021443776786327362, 0.047947779297828674, 0.007182664703577757, 0.013791937381029129, 0.00685034180060029, -0.04035229608416557, 0.032921548932790756, -0.02280178852379322, -0.011386530473828316, 0.019676752388477325, 0.045337382704019547, -0.01085330918431282, -0.029740160331130028, 0.09894546121358871, -0.0061460332944989204, -0.0038922475650906563, 0.005078423302620649, 0.06420040130615234, 0.014456663280725479, -0.013265863992273808, 0.02047734148800373, 0.07667888700962067, 0.03503499925136566, -0.03684527054429054, -0.022014949470758438, 0.03669355437159538, 0.04303111508488655, -0.048983316868543625, -0.0581786148250103, 0.06295793503522873, 0.027269583195447922, -0.04638028144836426, -0.023946408182382584, -0.018803302198648453, 0.014648037031292915, -0.004316585138440132, -0.026751425117254257, 0.06861503422260284, 0.0025206974241882563, 0.018391693010926247, 0.07648596167564392, -0.02583719789981842, -0.045134518295526505, 0.04692531377077103, 0.012282829731702805, -0.016091613098978996, 0.007700701709836721, -0.0014353861333802342, -0.0019081387436017394, -0.029961366206407547, -0.025536226108670235, -0.035727452486753464, -0.01534621138125658, 0.03781239688396454, -0.01956036128103733, -0.060365960001945496, 0.001258159289136529, -0.0027610326651483774, -0.028594503179192543, 0.027179911732673645, -0.007890935987234116, 0.01885189116001129, 0.015441282652318478, -0.004399730358272791, 0.039409343153238297, -0.030799314379692078, -0.02400481142103672, 0.03756626322865486, -0.005386115983128548, 0.004411458969116211, -0.02225607819855213, -0.005242111161351204, 0.02514573186635971, -0.024206262081861496, 0.03203815594315529, 0.047721534967422485, 0.07933638244867325, -0.013582523912191391, -0.012375212274491787, 0.11127854138612747, 0.07968265563249588, -0.060369040817022324, 0.01755523309111595, -0.039285607635974884, 0.024263937026262283, 0.026813913136720657, -0.05073224753141403, 0.0268627367913723, 0.026936082169413567, -0.024588709697127342, -0.018393507227301598, 0.043947454541921616, -0.017067691311240196, 0.008042758330702782, -0.005440270062536001, 0.006885812152177095, -0.015090478584170341, -0.04795136675238609, 0.026882711797952652, -0.026685163378715515, 0.0008123472216539085, -0.008074674755334854, -0.049758102744817734, -0.025759343057870865, 0.0005841928068548441, 0.048702072352170944, -0.012285870499908924, -0.027738839387893677, 0.016205014660954475, -0.011718878522515297, 0.0012888925848528743, -0.01012422051280737, 0.007495447061955929, 0.020688166841864586, -0.026977451518177986, -0.008294029161334038, 0.029478326439857483, 0.02147311344742775, -0.03164247050881386, -0.01830383576452732, 0.034845974296331406, -0.03631800413131714, -0.02120927721261978, 0.09679578244686127, 0.004499297589063644, -0.12130069732666016, -0.0064425403252244, -0.012635896913707256, 0.05907486751675606, -0.042190078645944595, 0.013245776295661926, -0.024754390120506287, -0.0718565285205841, -0.0009478835272602737, 0.028593506664037704, -0.07226340472698212, 0.008446432650089264, 0.01561123225837946, -0.04048812389373779, 0.008429048582911491, 0.038361676037311554, 0.02993977814912796, 0.027632810175418854, 0.016532249748706818, 0.20761968195438385, -0.0234453696757555, -0.049484968185424805, 0.04609885439276695, 0.044652387499809265, -0.06249906122684479, 0.016184618696570396, 0.03361131250858307, -0.015323320403695107, -0.029886355623602867, -0.03357904404401779, 0.00238313851878047, 0.043590348213911057, -0.032475925981998444, -0.06834588199853897, -0.02427939511835575, 0.02341928519308567, -0.006530506536364555, 0.017906054854393005, 0.014308732002973557, -0.04762926697731018, 0.025410763919353485, -0.0468767024576664, -0.014696387574076653, -0.005707981064915657, -0.036302004009485245, 0.022663909941911697, 0.011542683467268944, 0.014345514588057995, -0.01081134658306837, 0.02426830492913723, -0.05941591039299965, 0.016563329845666885, -0.021556885913014412, -0.0073854667134583, -0.047495365142822266, -0.04705363139510155, 0.007330771069973707, -0.03566625341773033, 0.014948873780667782, 0.011840197257697582, -0.025826020166277885, 0.03910398483276367, -0.00477052666246891, -0.025290628895163536, -0.03805254027247429, 0.0008034248603507876, -0.06742288917303085, 0.004949510097503662, -0.0879795029759407, 0.004117302596569061, 0.046814125031232834, 0.07204775512218475, -0.022954242303967476, -0.038120731711387634, 0.11456610262393951, 0.09340886771678925, 0.008457287214696407, -0.005670662969350815, 0.0007185260765254498, -0.03164042532444, 0.0154264559969306, 0.008933156728744507, -0.023204736411571503, 0.021257692947983742, 0.016600903123617172, -0.053930941969156265, 0.00596873601898551, -0.0005399035289883614, -0.014262224547564983, -0.029940487816929817, 0.01280953362584114, -0.03814045339822769, 0.003546567400917411, -0.03602634370326996, -0.017632661387324333, -0.012191085144877434, 0.010742648504674435, -0.008942614309489727, -0.04272470250725746, 0.012411899864673615, -0.010062395595014095, 0.008561797440052032, -0.0038840246852487326, -0.019101830199360847, 0.05765464901924133, -0.03434368222951889, 0.018170949071645737, 0.04607841372489929, 0.004123170860111713, -0.031415313482284546, -0.03408174589276314, -0.028294354677200317, 0.02196773886680603, 0.0385834164917469, -0.021605707705020905, 0.00966059509664774, -0.01537427119910717, 0.008370933122932911, 0.039705488830804825, -0.030374621972441673, -0.015109706670045853, -0.03155342489480972, -0.04574676603078842, 0.055509328842163086, -0.004303314257413149, 0.029587313532829285, -0.0017169315833598375, -0.021450340747833252, 0.02339870110154152, 0.002706343773752451, 0.006406398955732584, -0.013402329757809639, -0.03569132089614868, -0.07725204527378082, -0.027803735807538033, 0.02736774832010269, -0.08700130134820938, 0.02319427952170372, -0.038338229060173035, 0.04192477464675903, 0.05553972348570824, 0.0009578922181390226, 0.008788518607616425, -0.019798342138528824, -0.01502959243953228, 0.016247183084487915, 0.030247388407588005, 0.004240803420543671, -0.020501967519521713, -0.009651158936321735, -0.04081360995769501, -0.045504890382289886, 0.026186993345618248, 0.02077716775238514, 0.016702262684702873]" ./train/Bouvier_des_Flandres/n02106382_8906.JPEG,Bouvier_des_Flandres,"[-0.002547287382185459, -0.012301451526582241, -0.04059918224811554, 0.029854791238904, 0.017663855105638504, -0.02271731197834015, 0.07867152988910675, -0.012368474155664444, 0.03297265246510506, 0.017734477296471596, 0.011619810946285725, 0.0226497333496809, -0.030190765857696533, 0.008388818241655827, -0.007553949952125549, 0.04445584490895271, 0.07826027274131775, 0.006973139476031065, 0.02134496346116066, -0.023186227306723595, 0.006782277021557093, 0.001812877831980586, 0.04883933439850807, -0.04561956599354744, -0.022083068266510963, 0.00605465192347765, 0.025342604145407677, -0.01168813370168209, 0.0037238625809550285, -0.03833160921931267, -0.008479743264615536, 0.04322059825062752, 0.016479114070534706, 0.004241407383233309, 0.0412709042429924, 0.019871603697538376, 0.01386808417737484, -0.040509987622499466, -0.011394083499908447, 0.1365445852279663, -0.055026017129421234, 0.012574140913784504, 0.025240348652005196, -0.03243112936615944, 0.0413258895277977, -0.11884436011314392, -0.004285878036171198, 0.04099791869521141, -0.016596157103776932, -0.017971809953451157, 0.005144583061337471, 0.034640971571207047, -0.006565074436366558, 0.008845610544085503, 0.0024000408593565226, 0.002778691006824374, 0.019095169380307198, 0.03016820177435875, -0.0068438295274972916, -0.011747756972908974, 0.08911255747079849, -0.011213170364499092, 0.01913396269083023, 0.023513974621891975, -0.00947963260114193, -0.04615605250000954, 0.027738574892282486, -0.021939193829894066, -0.011371477507054806, 0.004441970959305763, 0.023521525785326958, -0.0012887583579868078, 0.003918876871466637, 0.004665756598114967, -0.014891230501234531, -0.003483414649963379, -0.024127397686243057, -0.06649380922317505, 0.013851441442966461, -0.008070627227425575, 0.04913347214460373, 0.029832011088728905, -0.01833571121096611, -0.06089206784963608, 0.014686491340398788, -0.0005461908876895905, 0.06821656227111816, -0.0473589263856411, 0.10842794179916382, -0.019005388021469116, -0.02080729976296425, -0.061094019562006, -0.6128964424133301, 0.022059600800275803, -0.010008886456489563, 0.017618894577026367, -0.02027995139360428, 0.010994615033268929, -0.050797585397958755, 0.022322511300444603, 0.023428549990057945, -0.022016773000359535, 0.03048492968082428, -0.006161041092127562, 0.043301746249198914, -0.039883654564619064, -0.0220019668340683, 0.033856894820928574, 0.0031873532570898533, 0.010239177383482456, 0.015039944089949131, -0.07940365374088287, -0.026062918826937675, -0.028211092576384544, 0.01399316918104887, 0.0123832318931818, -0.03278810903429985, -0.026842812076210976, 0.007458996493369341, 0.004894818179309368, 0.06721789389848709, -0.003419018117710948, -0.015522126108407974, -0.016244813799858093, 0.022824110463261604, -0.05728711932897568, -0.03485265374183655, 0.06359287351369858, 0.016963528469204903, 0.018929235637187958, 0.03305956721305847, -0.052529651671648026, -0.007130688522011042, 0.0799630880355835, -0.06625080853700638, -0.0002649387752171606, -0.0076303379610180855, -0.04920877888798714, -0.0009723915718495846, -0.000869273382704705, -0.00696200504899025, -0.019352206960320473, 0.040638960897922516, -0.011746338568627834, 0.011229432187974453, 0.04381703585386276, 0.03285296633839607, 0.019441576674580574, -0.031955935060977936, -0.03141627088189125, -0.0031707158777862787, 0.019601771607995033, 0.007303466089069843, -0.028089206665754318, -0.0009439633577130735, 0.04938023164868355, -0.012266037054359913, -0.034849029034376144, 0.026905199512839317, -0.005305720027536154, -0.05214680731296539, 0.012218696996569633, -0.0053718783892691135, 0.011300241574645042, 0.041087787598371506, -0.021907594054937363, 0.00486934557557106, 0.015490601770579815, 0.011508218012750149, 0.016137413680553436, -0.005212601274251938, -0.01144638005644083, -0.011550866067409515, -0.04070416837930679, -0.003354866523295641, -0.037752483040094376, 0.06126044690608978, 0.00048070892808027565, 0.055781252682209015, -0.03589559718966484, -0.03616337105631828, 0.0037317832466214895, -0.0005338535411283374, -0.02654595673084259, 0.047512974590063095, -0.018360821530222893, 0.0447721928358078, -0.022585272789001465, 0.013786882162094116, 0.005409139208495617, 0.03069240413606167, 0.0079561872407794, 0.03617910295724869, 0.015692103654146194, -0.07395241409540176, -0.010473542846739292, -0.010782614350318909, -0.0022751789074391127, -0.040822796523571014, -0.03194804489612579, -0.011484741233289242, 0.016319191083312035, 0.0017962476704269648, 0.022620312869548798, -0.029642216861248016, -0.006743719335645437, -0.05703842267394066, -0.03354346752166748, 0.035305701196193695, 0.025674784556031227, -0.03766380250453949, -0.011580239050090313, 0.002878757193684578, 0.03166547045111656, -0.023285407572984695, -0.024035315960645676, 0.01454570610076189, 0.011787871830165386, 0.15045969188213348, 0.025723546743392944, 0.06517063826322556, 0.06334588676691055, -0.018373478204011917, -0.007773620542138815, -0.028262261301279068, 0.0178829375654459, -0.03046419844031334, -0.003032329957932234, 0.023477787151932716, -0.01891159452497959, 0.016104087233543396, -0.006186327431350946, 0.003940047230571508, 0.053444597870111465, -0.015628669410943985, -0.010602795518934727, -0.02614773064851761, -0.005114928353577852, 0.00993775948882103, -0.023480847477912903, 0.011686327867209911, 0.01004910096526146, 0.04603629559278488, -0.03312419354915619, -0.024814128875732422, 0.05398862063884735, -0.011698003858327866, -0.025622140616178513, 0.007254863157868385, 0.048637617379426956, -0.006054234690964222, 0.026391109451651573, 0.040179088711738586, 0.006484552286565304, 0.030996758490800858, 0.004100830294191837, -0.020335644483566284, 0.022601433098316193, 0.08341490477323532, 0.026398418471217155, -0.02639377862215042, 0.024968747049570084, -0.006070347502827644, -0.07495898753404617, 0.013673168607056141, -0.028847631067037582, 0.030585240572690964, -0.01297791488468647, 0.018084635958075523, 0.040205419063568115, -0.02744128368794918, -0.006734087131917477, 0.06727919727563858, 0.03145354241132736, 0.004001217428594828, -0.02090323716402054, 0.005286967847496271, -0.023155340924859047, -0.024312833324074745, -0.021023161709308624, -0.015950709581375122, -0.01000223308801651, -0.053050603717565536, 0.0014972907956689596, 0.00013123742246534675, 0.043270621448755264, 0.03568080812692642, -0.012288306839764118, -0.008131764829158783, 0.007244606502354145, -0.018319422379136086, 0.010380649007856846, 0.02062215283513069, -0.02953258343040943, -0.006165570579469204, 0.021714570000767708, 0.04550286754965782, -0.021805936470627785, 0.002067571273073554, -0.010908037424087524, 0.019592823460698128, 0.013606023974716663, -0.0007623184355907142, 0.0044435602612793446, 0.010163716040551662, -0.06817492097616196, 0.009174519218504429, 0.047433190047740936, 0.08059749007225037, 0.029336174950003624, 0.0011947017628699541, 0.04968500882387161, 0.07973340153694153, -0.012163978070020676, 0.007879674434661865, 0.019493136554956436, 0.01685802824795246, 0.025691181421279907, -0.0007938090129755437, -0.08255556225776672, 0.05173007771372795, 0.10495174676179886, -0.019507471472024918, -0.013390395790338516, 0.02404065616428852, 0.023945121094584465, -0.02267390303313732, -0.005023185629397631, -0.05243051424622536, -0.01821245439350605, 0.0028706081211566925, -0.007394400425255299, 0.026060612872242928, -0.01684686914086342, -0.02934553101658821, -0.010665027424693108, 0.019411878660321236, 0.06450258940458298, -0.011983359232544899, 0.006164893042296171, 0.003745327005162835, -0.02460968866944313, -0.030771451070904732, 0.03801264241337776, 0.03373267129063606, 0.03947349637746811, 0.018739569932222366, -0.0027086858171969652, -0.03782542049884796, 0.001490438706241548, -0.03978385403752327, 0.0008010927704162896, 0.03416617959737778, 0.014175358228385448, 0.029311740770936012, 0.13262943923473358, 0.028721600770950317, -0.15098387002944946, 0.0031816812697798014, 0.02535937912762165, 0.0820562094449997, -0.02175627090036869, 0.025387458503246307, 0.008211386390030384, -0.07436145097017288, -0.0159525815397501, 0.024532515555620193, -0.04271756857633591, -0.007453401107341051, -0.006227520294487476, -0.023365648463368416, 0.017979703843593597, -0.005325761623680592, 0.02671227790415287, 0.008792062290012836, 0.001073772320523858, 0.1016431674361229, -0.0008721423801034689, -0.05838543549180031, 0.031618501991033554, 0.0010846179211512208, -0.0466587208211422, -0.004931040108203888, 0.005039777606725693, -0.008878607302904129, 0.026713285595178604, -0.023597661405801773, 0.004235240630805492, 0.05810390040278435, -0.11812110990285873, -0.0834367498755455, -0.089957095682621, -0.0019395030103623867, -0.019173288717865944, -0.008604849688708782, -0.025396669283509254, 0.005898689851164818, 0.02019072137773037, -0.029225004836916924, -0.03830026462674141, -0.026841076090931892, -0.011676364578306675, 0.0015287958085536957, 0.02573668584227562, 0.017887666821479797, 0.01469674613326788, 0.016733773052692413, -0.037000928074121475, 0.03826497495174408, -0.034560661762952805, 0.057413071393966675, -0.021131448447704315, -0.030900288373231888, 0.0547800175845623, -0.021216562017798424, 0.02207951433956623, 0.015553034842014313, -0.03632519394159317, 0.04229763150215149, -0.036754265427589417, 0.03658359870314598, -0.00547582795843482, 0.016391512006521225, -0.041209496557712555, 0.05013861507177353, -0.041834451258182526, -0.04871227592229843, 0.025160077959299088, 0.07259249687194824, -0.004941966850310564, 0.0030456818640232086, 0.020665496587753296, 0.01416358444839716, -0.009301872923970222, -0.013538786210119724, 0.0014706089859828353, -0.03890683129429817, 0.033119313418865204, 0.02072267234325409, -0.018352609127759933, 0.016432983800768852, -0.020010409876704216, -0.02502078376710415, -0.043766237795352936, 0.005196637939661741, -0.04294256493449211, -0.018384728580713272, 0.009767343290150166, -0.0039868708699941635, -0.0004960543592460454, -0.031158413738012314, -0.039900559931993484, -0.018199266865849495, 0.01836542785167694, -0.029913516715168953, -0.008557610213756561, 0.012204030528664589, -0.006283358670771122, 0.05019822716712952, 0.029250703752040863, -0.020554013550281525, 0.02238374389708042, -0.007366363890469074, -0.00490226736292243, 0.05654808506369591, 0.013932104222476482, -0.04084596037864685, -0.02471870742738247, 0.00017286081856582314, 0.019069047644734383, 0.05975537747144699, -0.01879093237221241, -0.016931112855672836, -0.007809956092387438, -0.009465230628848076, 0.01985284686088562, 0.015514486469328403, -0.004501682240515947, -0.0264004897326231, -0.02584916539490223, 0.0031077282037585974, -0.028078826144337654, -0.010366342961788177, 0.03606140986084938, -0.018192745745182037, 0.020915241912007332, 0.0013473837170749903, 0.03275309503078461, -0.011627251282334328, -0.03539026901125908, -0.061577338725328445, -6.600484630325809e-05, 0.036278851330280304, -0.06607889384031296, 0.03513624891638756, -0.010863547213375568, 0.03799000382423401, 0.03887571766972542, -0.021091697737574577, -0.006704139523208141, -0.044137898832559586, -0.007103111129254103, 0.0024361945688724518, 0.05505874380469322, 0.07842206954956055, 0.03690339997410774, -0.02311011590063572, -0.0075658769346773624, -0.009081912226974964, 0.04844661429524422, 0.02205980010330677, 0.026387805119156837]" ./train/Bouvier_des_Flandres/n02106382_2872.JPEG,Bouvier_des_Flandres,"[-0.011029976420104504, 0.0196671262383461, -0.00575852720066905, -0.013818243518471718, 0.03651050850749016, -0.0635773092508316, 0.08181782811880112, 0.012794475071132183, 0.04443230479955673, 0.00954008474946022, -0.014433376491069794, 0.04075329378247261, -0.016799593344330788, -0.004183883313089609, -0.009469905868172646, 0.049728214740753174, 0.11489987373352051, -0.021464256569743156, 0.032350458204746246, 0.017772268503904343, -0.02264278382062912, 0.05527876317501068, 0.015900570899248123, -0.030835049226880074, 0.007454200182110071, 0.013083785772323608, 0.024025605991482735, -0.02694990672171116, -0.016057070344686508, -0.008266507647931576, 0.031333595514297485, 0.013317850418388844, 0.006645180284976959, -0.0311569944024086, 0.010360856540501118, -0.004887481220066547, 0.00011992136569460854, -0.04722828418016434, -0.04763172194361687, 0.17934459447860718, -0.0632442757487297, 0.0006643545930273831, 0.008524377830326557, 0.006273931358009577, 0.02438328042626381, -0.11555489152669907, -0.043720874935388565, 0.04159241169691086, 0.04105890542268753, 0.0017798260087147355, -0.003777218982577324, 0.01608947664499283, 0.010356221348047256, 0.02330983243882656, 0.01753576658666134, 0.012000461108982563, 0.018464796245098114, 0.06010102480649948, -0.018954290077090263, -0.05625063180923462, 0.09934519231319427, -0.025388451293110847, 0.020845802500844002, -0.02893274463713169, -0.006330160424113274, -0.0013334305258467793, -0.03481495752930641, 0.01124912966042757, -0.03977736085653305, 0.013996109366416931, 0.009667200036346912, -0.001776169752702117, 0.018230479210615158, -0.027746951207518578, -0.010051079094409943, -0.013376589864492416, -0.06222188472747803, -0.06675786525011063, 0.0061941142193973064, 0.0018259556964039803, 0.019239895045757294, 0.036955930292606354, -0.0009183827787637711, -0.07532636821269989, 0.025032024830579758, -0.03189697861671448, 0.0725783035159111, -0.028049062937498093, 0.02688654698431492, 0.033093955367803574, -0.033475566655397415, -0.07051291316747665, -0.6102434396743774, 0.07623286545276642, -0.02992378920316696, -0.0011876209173351526, 0.001901599345728755, 0.020985202863812447, -0.08445213735103607, 0.07316946983337402, 0.01459197886288166, -0.014502201229333878, 0.04615577310323715, -0.021966153755784035, 0.04152557626366615, 0.02352892793715, -0.03141087666153908, 0.03715656325221062, -0.0439947172999382, -0.023097960278391838, 0.030023440718650818, -0.03958119451999664, 0.009581699036061764, 0.009679478593170643, -0.01794344186782837, 0.014651290141046047, 0.0037920637987554073, -0.0678538903594017, 0.016378479078412056, -0.0047792657278478146, 0.049757327884435654, -0.05267668142914772, 0.009768625721335411, -0.018555495887994766, 0.009292800910770893, -0.02049659751355648, -0.00983340386301279, 0.02912103570997715, -0.003922468051314354, -0.0411694310605526, 0.05480552092194557, -0.05227931961417198, -0.05138709768652916, 0.08292589336633682, -0.03039349429309368, 0.00025229042512364686, 0.0549495667219162, -0.0221512783318758, 0.020828669890761375, -0.0036447267048060894, -0.001361480331979692, 0.01456049457192421, -0.023861508816480637, 0.00867821741849184, -0.06863782554864883, 0.0051157125271856785, -0.0018394187791272998, 0.030731111764907837, -0.026081852614879608, 0.001426752540282905, -0.012811942957341671, -0.003014321206137538, -0.026418745517730713, -0.0029748098459094763, -0.07134323567152023, 0.014226223342120647, -0.029291223734617233, -0.010637610219419003, -0.01936965622007847, 0.008046368137001991, -0.056543584913015366, -0.01208153273910284, -0.014980930835008621, -0.0041002328507602215, 0.028674213215708733, -0.05588779225945473, -0.015618669800460339, -0.034974604845047, 0.04000483825802803, 0.007570532616227865, 0.016192447394132614, -0.009294690564274788, -9.915274858940393e-05, -0.03614943102002144, -0.0013466618256643414, 0.0001822893973439932, 0.08451102674007416, -0.0011485717259347439, 0.022509485483169556, -0.03692379966378212, -0.0022553340531885624, 0.017606083303689957, 0.03478313982486725, 0.0018249006243422627, 0.005863710772246122, -0.03348775580525398, 0.02669374831020832, -0.033668432384729385, -0.008475330658257008, -0.011120891198515892, -0.013451043516397476, 0.0006157683674246073, 0.04295842722058296, -0.014915629290044308, -0.002934633055701852, 0.02133980020880699, 0.027737168595194817, 0.008894197642803192, -0.08463047444820404, -0.029810763895511627, -0.011243728920817375, 0.024683363735675812, 0.0017274165293201804, 0.016778413206338882, -0.053957417607307434, -0.011777067556977272, -0.02990693971514702, -0.04143882915377617, 0.009464382193982601, 0.010089248418807983, -0.05585633963346481, -0.004997649230062962, 0.004681994207203388, 0.012617102824151516, 0.006957496050745249, 0.010863147675991058, 0.009740384295582771, 0.009327558800578117, 0.08399255573749542, -0.019343188032507896, 0.08227647840976715, 0.07106110453605652, 0.019620539620518684, -0.025460487231612206, -0.02781287021934986, -0.023904865607619286, -0.038990724831819534, -0.00754014914855361, 0.016632048413157463, -0.011037059128284454, 0.036109454929828644, 0.023761220276355743, -0.0023138311225920916, 0.03826427832245827, -0.007801910862326622, 0.016107425093650818, 0.02996671199798584, -0.04143945872783661, -0.020958349108695984, -0.05939851328730583, 0.011556846089661121, -0.005460917484015226, 0.02919445000588894, 0.005630096420645714, -0.012447054497897625, 0.05064453184604645, 0.018061993643641472, -0.061116453260183334, 0.011040402576327324, 0.050989627838134766, -0.011769882403314114, 0.026585685089230537, 0.045158568769693375, -0.007609711494296789, 0.02881942316889763, 0.01689009554684162, -0.009679223410785198, -0.017507513985037804, -0.02224271558225155, -0.0449276901781559, -0.010974432341754436, 0.036614641547203064, 0.02976841665804386, -0.049534011632204056, 0.0164970550686121, 0.01181954424828291, 0.001610702951438725, -0.0005184297333471477, 0.0171752218157053, 0.030461382120847702, -0.008499030023813248, 0.003359415102750063, 0.04020635783672333, 0.02868157997727394, 0.025973305106163025, 0.027020001783967018, 0.020563215017318726, -0.01759493350982666, -0.022668803110718727, 0.004658814985305071, -0.027746889740228653, -0.017109205946326256, -0.006264749448746443, -0.05714904144406319, 0.047785885632038116, -0.007272879593074322, 0.07081017643213272, 0.01635291799902916, -0.018914418295025826, 0.006445097737014294, -0.003590428503230214, -0.012003814801573753, -0.01761709898710251, 0.010130277834832668, -0.032392021268606186, 0.043966732919216156, 0.037831585854291916, 0.0019581469241529703, -0.0015654839808121324, 0.006538181100040674, -0.027941837906837463, 0.010823388583958149, 0.015125584788620472, -0.02697032503783703, 0.005331872031092644, -0.037059884518384933, -0.019637905061244965, 0.012255148962140083, 0.04094579070806503, -0.012596883811056614, -0.014144960790872574, 0.015264724381268024, 0.08271429687738419, -0.018957527354359627, 0.0017765042139217257, -0.015602833591401577, 0.03519674763083458, 0.030059732496738434, -0.004640231840312481, -0.06311628967523575, 0.0898255780339241, 0.10788226127624512, -0.030393607914447784, -0.00893637165427208, 0.03902055323123932, 0.005303083918988705, 0.024606844410300255, 0.01347382552921772, -0.024048620834946632, 0.003922066651284695, 0.016047373414039612, -0.03715195506811142, 0.018210699781775475, -0.04110853001475334, 0.002557368716225028, -0.011638218536973, 0.007077950052917004, 0.04186250641942024, 0.03841226547956467, -0.025315916165709496, 0.03983788564801216, 0.011116907000541687, -0.0348743200302124, 0.014661611057817936, 0.008601263165473938, 0.056277085095644, 0.05173565819859505, -0.014491492882370949, 0.003658224130049348, -0.004209257196635008, 0.001650820835493505, 0.006408678833395243, 0.031225280836224556, -0.00946319941431284, 0.016805468127131462, 0.0499010868370533, -0.00978359766304493, -0.09712184965610504, 0.002689523156732321, -0.030795646831393242, 0.08875395357608795, -0.05433601513504982, -0.006916319020092487, -0.01719566248357296, -0.1291009485721588, 0.047338299453258514, 0.015660766512155533, -0.05520785599946976, -0.0281528253108263, -0.00016108201816678047, -0.024347538128495216, 0.007589244749397039, 0.009851422160863876, 0.025528941303491592, 0.0034802532754838467, -0.034768007695674896, 0.11749161779880524, 0.0023313460405915976, -0.016443319618701935, 0.01661202497780323, 0.025275204330682755, 0.011626210995018482, 0.0026573236100375652, 0.04559989273548126, -0.010101107880473137, -0.029872436076402664, -0.03815010190010071, 0.013039980083703995, 0.030952196568250656, -0.05122455954551697, -0.041930846869945526, -0.09763546288013458, 0.010328473523259163, -0.017935145646333694, 0.0002901263942476362, -0.025498680770397186, 0.004373341798782349, 0.0013202278641983867, -0.06700308620929718, -0.0656576156616211, -0.02304736338555813, 0.02372407354414463, 0.03924839198589325, 0.05389265716075897, 0.0033551612868905067, -0.02391091175377369, 0.01460866816341877, -0.03857964649796486, 0.035656705498695374, -0.04508562758564949, 0.09205102175474167, -0.020062992349267006, 0.006876256316900253, 0.014701847918331623, -0.030588114634156227, 0.021611958742141724, 0.005758393090218306, -0.02001826837658882, -0.03151078149676323, -0.0005079000839032233, 0.044384222477674484, 0.01812397874891758, -0.011228194460272789, -0.03832561522722244, 0.013284175656735897, 0.002338903257623315, -0.0019305634777992964, 0.024492407217621803, -0.019300583750009537, -0.0013343066675588489, -0.04062284529209137, 0.03845428302884102, 0.08409343659877777, -0.028614629060029984, -0.021477334201335907, -0.03091350384056568, -0.057281699031591415, 0.033668164163827896, 0.05271456018090248, -0.028369983658194542, 0.008771589957177639, -0.009695553220808506, -0.04204479232430458, -0.001409224234521389, 0.01725209504365921, -0.006756308954209089, 0.008565385825932026, 0.010303896851837635, 0.006860204506665468, 0.04162225499749184, 0.00633070757612586, 0.006361766252666712, -0.009373202919960022, -0.002881530672311783, -0.0050710514187812805, -0.004257526248693466, 0.043558306992053986, 0.03460625559091568, -0.002351202303543687, 0.011611059308052063, 0.009565710090100765, 0.04969821497797966, -0.005887807346880436, 0.02350207231938839, 0.04368580877780914, 0.013937710784375668, -0.056856658309698105, -0.02735440991818905, -0.03193998336791992, 0.002770564518868923, 0.06332547217607498, -0.0549142025411129, -0.03530186042189598, -0.053177088499069214, 0.010834462009370327, 0.001094155479222536, 0.005349035374820232, 0.00857228972017765, 0.010889684781432152, -0.01844535395503044, -0.0056176334619522095, -0.03616432473063469, 0.011944225057959557, 0.00897583644837141, 0.02007145993411541, 0.03921465575695038, 0.018879801034927368, 0.04493284597992897, 0.018320195376873016, -0.017987128347158432, -0.041490957140922546, -0.02869160659611225, 0.027175946161150932, -0.060450635850429535, 0.00322232348844409, -0.022203389555215836, 0.04128442704677582, 0.018537871539592743, 0.013224839232861996, -0.0008389930007979274, 0.00976591557264328, -0.02071436308324337, -0.014898357912898064, -0.014353684149682522, 0.028263511136174202, 0.0043078879825770855, -0.009509137831628323, -0.01693938858807087, -0.032617297023534775, 0.04622947424650192, 0.029403073713183403, -0.0057190945371985435]" ./train/Bouvier_des_Flandres/n02106382_6290.JPEG,Bouvier_des_Flandres,"[-0.014855955727398396, -0.015777841210365295, -0.027891041710972786, 0.04627906158566475, 0.016026120632886887, -0.03223896771669388, 0.05861099809408188, -0.005456206388771534, 0.0751563161611557, 0.02810431271791458, -0.007441517896950245, 0.002579802181571722, 0.013311623595654964, 0.005967248696833849, 0.01559888944029808, 0.007224827539175749, 0.16012036800384521, 0.017207909375429153, 0.009292805567383766, -0.053368814289569855, 0.010059600695967674, 0.02826516702771187, 0.02868388406932354, -0.04075118899345398, -0.007263446692377329, -0.017991218715906143, 0.06463348865509033, -0.029723992571234703, -0.0018817600794136524, -0.02905455231666565, -0.00581891555339098, 0.06501954793930054, -0.0012173594441264868, -0.01718313619494438, 0.056846339255571365, 0.042460501194000244, 0.031823430210351944, -0.012117477133870125, -0.009495427832007408, 0.15535204112529755, -0.07368966937065125, -0.004679081495851278, 0.0076089282520115376, -0.027777191251516342, 0.009931960143148899, -0.13208292424678802, 0.01874765194952488, 0.021178344264626503, -0.011045566760003567, 0.02760758250951767, 0.005348143167793751, 0.05251021310687065, -0.02475172095000744, 0.02464381419122219, 0.02816508710384369, 0.016086706891655922, 0.008848495781421661, 0.006026779767125845, 0.015022275038063526, -0.007706836797297001, 0.18189920485019684, 0.016197578981518745, 0.05453503131866455, 0.0419686958193779, -0.01122954674065113, 0.007519887760281563, 0.024120528250932693, 0.02458195574581623, -0.02882533334195614, -0.00048798968782648444, 0.03995567932724953, -0.021116720512509346, 0.043977998197078705, 0.010763105005025864, -0.003023905446752906, -0.004629515577107668, -0.025822989642620087, -0.046619951725006104, -0.021729005500674248, 0.019251925870776176, 0.04406613111495972, 0.0073983813636004925, -0.06620073318481445, -0.0455428846180439, 0.023787399753928185, -0.029062870889902115, 0.02127295732498169, -0.038896311074495316, 0.02475895918905735, -0.008669501170516014, 0.010446678847074509, -0.05878010764718056, -0.5612645149230957, 0.020728174597024918, -0.03980739042162895, 0.013484002090990543, 0.025501441210508347, 0.003993934020400047, -0.0964006781578064, 0.09212402254343033, 0.020393263548612595, -0.038133420050144196, -0.011123216710984707, -0.0186855997890234, 7.595081115141511e-05, -0.016197245568037033, 0.06321606040000916, 0.010558683425188065, -0.02990141324698925, 0.01810554414987564, 0.011172342114150524, -0.08166990429162979, 0.004062208812683821, -0.04532277211546898, 0.019896725192666054, -0.04141711816191673, -0.014061486348509789, -0.012132594361901283, 0.033298149704933167, -0.017632635310292244, 0.05276622995734215, -0.033624179661273956, -0.03758096322417259, -0.020579615607857704, 0.033651843667030334, -0.05423598363995552, -0.035358887165784836, 0.044394806027412415, 0.012582394294440746, 0.012841401621699333, 0.00187101517803967, -0.045583341270685196, -0.0501413568854332, 0.07317725569009781, -0.046774622052907944, 0.007997245527803898, -0.03816838562488556, -0.06590364128351212, -0.006820749957114458, -0.0054823183454573154, -0.020045572891831398, -0.01532081700861454, 0.016299834474921227, 0.01678416319191456, -0.027044961228966713, 0.047874461859464645, 0.04154492914676666, 0.010997628793120384, -0.01352421659976244, -0.008876531384885311, 0.005561919882893562, 0.03274949640035629, -0.028601404279470444, 0.0007527486886829138, -0.016985751688480377, 0.012043284252285957, -0.009593449532985687, -0.042656317353248596, -0.013666272163391113, -0.011643105186522007, -0.05331578478217125, -0.010199464857578278, 0.00869401078671217, 0.044140007346868515, 0.015139519236981869, -0.02685791626572609, -0.017664723098278046, 0.03215482831001282, -0.008103931322693825, 0.025437723845243454, -0.013642853125929832, 0.0025062919594347477, 0.003067728830501437, -0.02605324052274227, 0.01963385008275509, -0.04171422868967056, 0.18406394124031067, -0.010732353664934635, 0.053697820752859116, -0.014839953742921352, -0.012160206213593483, -0.002857336075976491, 0.011667074635624886, 0.00358836492523551, 0.001902007614262402, -0.010232286527752876, 0.042160697281360626, -0.02861965447664261, 0.02549448050558567, 0.00012676921323873103, 0.026887856423854828, 0.003986579831689596, 0.05080561339855194, 0.016029117628932, 0.022847335785627365, 0.030033349990844727, 0.027065064758062363, -0.024205118417739868, -0.07328056544065475, -0.006922958418726921, -0.009228017181158066, 0.035439666360616684, 0.022791976109147072, -0.0017237254651263356, -0.04462171345949173, -0.027768384665250778, -0.03688668832182884, 0.005601286888122559, 0.0023757538292557, 0.032598577439785004, -0.025484934449195862, 0.009158564731478691, -0.01891055889427662, 0.03595082089304924, -0.04212197661399841, -0.032193101942539215, -0.00861441157758236, 0.02290445566177368, 0.12030276656150818, -0.01680956408381462, 0.0873996689915657, 0.02698008343577385, 0.011495784856379032, 0.01396748423576355, -0.05366695299744606, 0.018643423914909363, -0.022567128762602806, -0.007004675455391407, 0.014966396614909172, 0.00022360560251399875, 0.015114128589630127, -0.003566357307136059, 0.008149148896336555, 0.048590753227472305, -0.03942529112100601, 0.03868826851248741, -0.05159258842468262, -0.022809192538261414, -0.03930393233895302, -0.03824829310178757, -0.007148249540477991, 0.01070247869938612, 0.01080458052456379, 0.0058372956700623035, -0.02691974863409996, 0.05736612528562546, 0.031295374035835266, -0.08915513008832932, 0.030868465080857277, 0.08151870965957642, 0.040692828595638275, 0.010615003295242786, 0.004095051903277636, -0.009635723195970058, 0.041021641343832016, 0.01611226797103882, -0.012689548544585705, 0.03528286889195442, 0.030701803043484688, 0.017019910737872124, -0.002176193054765463, 0.052523110061883926, 0.0015831791097298265, -0.019647570326924324, 0.01582205481827259, -0.018278704956173897, 0.03850916400551796, -0.01403249055147171, -0.01212876196950674, 0.04849652200937271, -0.017565304413437843, 0.017886970192193985, 0.05355655774474144, 0.00913297664374113, -0.007068652659654617, -0.016297344118356705, 0.03883151337504387, -0.0020180726423859596, -0.008395728655159473, -0.022938575595617294, -0.004505066201090813, 0.0017485321732237935, -0.030593877658247948, -0.04655606299638748, -0.03131218999624252, -0.022278860211372375, 0.06739097088575363, -0.013601639308035374, -0.01702762395143509, -0.0014775360468775034, 0.008973108604550362, -0.0021556937135756016, 0.01968497782945633, -0.017157794907689095, -0.008032932877540588, 0.014700484462082386, 0.020298028364777565, 0.020371979102492332, 0.013876643031835556, 0.01195607241243124, -0.02763621136546135, -0.02269190549850464, -0.007908734492957592, 0.00787252839654684, 0.010424867272377014, -0.030506784096360207, -0.0018323709955438972, 0.03324102982878685, 0.03783732280135155, 0.008523437194526196, 0.029902499169111252, 0.059464745223522186, 0.07294333726167679, -0.017931900918483734, 0.024920674040913582, 0.008268158882856369, 0.030023735016584396, 0.02749684453010559, -0.020876815542578697, -0.04470520094037056, 0.06011457368731499, 0.050940316170454025, -0.01925969496369362, 0.010819475166499615, -0.004603451583534479, 0.06189555302262306, -0.02824045903980732, -0.009529964067041874, -0.018843375146389008, -0.03133773058652878, 0.0075177475810050964, -0.002205953700467944, 0.040025871247053146, 0.007066360209137201, -0.026180438697338104, -0.022071251645684242, 0.005704610142856836, 0.04086967557668686, -0.018497154116630554, -0.03224492073059082, 0.007829765789210796, -0.030964555218815804, -0.039005156606435776, 0.04411919042468071, 0.07499906420707703, 0.01912606880068779, 0.020036563277244568, 0.01164931058883667, 0.014512093737721443, -0.052778612822294235, -0.01439070887863636, 0.018785951659083366, 0.01789286360144615, 0.02775914967060089, 0.01756378263235092, 0.08114497363567352, 0.004341347608715296, -0.09679120779037476, 0.005003283265978098, -0.024100352078676224, 0.069707490503788, -0.035465024411678314, -0.0069784433580935, -0.004966139793395996, -0.09428434073925018, 0.011345199309289455, 0.013640213757753372, -0.03744080290198326, 0.022759463638067245, -0.0015342062106356025, -0.021642163395881653, -0.006761884316802025, 0.018706105649471283, 0.021483300253748894, -0.01019691489636898, -0.0016735675744712353, 0.1597650945186615, -0.03703448921442032, -0.06153365224599838, 0.02637004852294922, 0.011949252337217331, -0.07588118314743042, 0.01484591793268919, 0.030621226876974106, -0.021964088082313538, -0.02736259065568447, -0.00526136439293623, 0.01894567720592022, 0.062083274126052856, -0.11448352783918381, -0.07167728990316391, -0.08790285885334015, 0.008279849775135517, -0.020224183797836304, 0.019578270614147186, 0.011749697849154472, -0.001311135827563703, 0.006354151293635368, -0.020018136128783226, -0.04041551053524017, -0.018420685082674026, -0.009034759365022182, -0.012477127835154533, -0.0006399389822036028, -7.084758544806391e-05, -0.0072737024165689945, 0.001866502920165658, -0.030349157750606537, 0.05651320517063141, -0.013467317447066307, 0.09112387150526047, -0.01986248977482319, -0.010131110437214375, 0.019088556990027428, -0.018691999837756157, -0.023402683436870575, 0.020109789445996284, -0.029724320396780968, 0.024547100067138672, -0.030052749440073967, 0.04544717073440552, 0.022192107513546944, 0.01679597608745098, -0.021229250356554985, 0.05076148733496666, -0.023283589631319046, -0.013374270871281624, -0.0029049133881926537, 0.06439078599214554, 0.012122266925871372, -0.010758262127637863, 0.009113670326769352, 0.003626872319728136, -0.014567091129720211, 0.017360171303153038, -0.02627401240170002, -0.05039438605308533, 0.030057229101657867, 0.0005899920943193138, 0.005482893902808428, 0.025600461289286613, -0.01457617711275816, -0.01856864057481289, -0.052732277661561966, -0.0013830502284690738, -0.04645624756813049, -0.02771921642124653, -0.023527715355157852, -0.02496682107448578, -0.021475952118635178, -0.00032764876959845424, -0.03962411731481552, -0.01655668579041958, 0.02331780456006527, -0.00116536277346313, 0.0015300805680453777, 0.010154458694159985, 0.020434487611055374, 0.028660381212830544, 0.037259090691804886, -0.00023518827219959348, 0.04146356135606766, 0.002651255577802658, -0.02804679051041603, 0.05733168125152588, 0.027158018201589584, -0.04874458909034729, -0.010234344750642776, -0.02789127267897129, 0.03599059581756592, 0.03243926167488098, -0.025215059518814087, -0.01668565161526203, -0.02263176627457142, -0.02958774007856846, 0.04356934130191803, -0.0015102585311979055, 0.0041308957152068615, -0.010826313868165016, -0.004949817433953285, 0.03295884653925896, -0.030704034492373466, 0.030566317960619926, 0.00795308593660593, -0.022834278643131256, -0.004591120406985283, -0.009158818982541561, -0.002906834241002798, 0.022922096773982048, -0.003950517158955336, -0.08324819803237915, -0.0007551107555627823, 0.034371841698884964, -0.03889422118663788, 0.03860536217689514, -0.01731661893427372, 0.01906689815223217, 0.028112446889281273, -0.02504412829875946, -0.012597731314599514, -0.0033343161921948195, -0.011648247018456459, 0.011448070406913757, 0.030431943014264107, 0.004245550837367773, 0.013025455176830292, -0.011714923195540905, 0.004765561316162348, -0.01239315327256918, 0.0524376779794693, -0.004318115767091513, 0.002698204480111599]" ./train/Bouvier_des_Flandres/n02106382_6653.JPEG,Bouvier_des_Flandres,"[0.026646660640835762, 0.0008752293069846928, -0.039263270795345306, 0.03548053652048111, 0.01938203163444996, -0.05976187810301781, 0.03382565826177597, 0.002912496216595173, 0.041559066623449326, -0.0002731116837821901, -0.008179916068911552, 0.011906187981367111, 0.011081980541348457, 0.027291923761367798, 0.027602143585681915, 0.016476379707455635, 0.10987234115600586, 0.0023790078703314066, 0.0004874039732385427, -0.0788387730717659, -0.007954197004437447, 0.037966858595609665, 0.054686471819877625, -0.041870273649692535, -0.007171145640313625, 0.03227146714925766, 0.04041992872953415, -0.03179701045155525, -0.019302384927868843, 0.010638564825057983, -0.02754557691514492, 0.03819312900304794, -0.02343636006116867, -0.009623819030821323, 0.024297118186950684, 0.03182627633213997, 0.0327254943549633, -0.020248135551810265, -0.0176413431763649, 0.13044291734695435, -0.06367769092321396, -0.0060876584611833096, 0.015794865787029266, -0.006189839914441109, 0.02973230928182602, -0.11137188971042633, 0.005086624063551426, 0.0382966510951519, -0.019027242437005043, 0.01311175525188446, 0.04233565181493759, 0.022575071081519127, 0.007768989074975252, 0.016048748046159744, 0.023692702874541283, -0.013760237023234367, 0.03081907331943512, 0.023620158433914185, 0.011463255621492863, -0.02173418365418911, 0.11335314810276031, 0.02667059190571308, 0.0383051261305809, 0.0113928047940135, -0.019161442294716835, -0.006685033440589905, 0.032170262187719345, 0.08193930983543396, -0.022752545773983, -0.008873231709003448, 0.04275106266140938, -0.00968034379184246, 0.03635779768228531, 0.0024384967982769012, 0.005865686573088169, -0.009738602675497532, 0.017227891832590103, -0.055489152669906616, -0.006325745023787022, 0.01893940009176731, -0.00033746074768714607, -0.03253254294395447, -0.0079314224421978, -0.031987037509679794, 0.026173369958996773, -0.03370760753750801, 0.07719117403030396, -0.047827500849962234, 0.031034808605909348, -0.03801213204860687, 0.0031626520212739706, -0.08379627019166946, -0.621613621711731, 0.043918102979660034, 0.012457435019314289, 0.02241034246981144, 0.025220748037099838, -0.0183279849588871, -0.0634017139673233, 0.09172460436820984, 0.03290603309869766, -0.01906820572912693, 0.022717326879501343, -0.013185080140829086, 0.03160012885928154, -0.014823629520833492, 0.026491064578294754, 0.032712146639823914, -0.012788960710167885, -0.011149325408041477, -0.0038325802888721228, -0.08625771105289459, -0.00845421850681305, -0.028424998745322227, 0.004954569973051548, -0.019195273518562317, -0.019942061975598335, -0.01856200583279133, 0.04012295976281166, -0.03570256009697914, 0.06346704810857773, -0.010564125142991543, -0.013188967481255531, 0.006058280356228352, 0.04740530997514725, -0.030575009062886238, -0.05269083008170128, 0.03268904983997345, 0.0005725760711356997, -0.018778063356876373, 0.03958143666386604, -0.0041171712800860405, -0.027662888169288635, 0.08012712001800537, -0.06285388022661209, 0.014930699951946735, -0.027482831850647926, -0.06547520309686661, 0.020682930946350098, 0.012077219784259796, 0.010218274779617786, 0.036982256919145584, -0.019364017993211746, 0.029110828414559364, -0.023312730714678764, 0.051214542239904404, 0.027230899780988693, 0.005447822622954845, -0.026812149211764336, 0.0034368522465229034, 0.005880225449800491, 0.027940746396780014, -0.008280035108327866, -0.013810456730425358, -0.029551545158028603, -0.0036334118340164423, -0.027782948687672615, -0.04093453288078308, -0.02737014926970005, 0.02498321421444416, -0.05373939126729965, -0.008478781208395958, 0.00728655606508255, 0.016759628430008888, 0.03303191810846329, -0.03353086858987808, 0.0215293075889349, 0.0546974278986454, -0.000987281440757215, 0.024025633931159973, 0.005308961030095816, 0.00030314389732666314, 0.006994954776018858, -0.02344703860580921, -0.0019014886347576976, -0.04155437648296356, 0.10744375735521317, -0.0009175705490633845, 0.055975139141082764, -0.004818751942366362, 0.007411849219352007, 0.004490523599088192, 0.002070407150313258, -0.04679618030786514, 0.012486695311963558, -0.012761087156832218, 0.04596542567014694, -0.04071319103240967, 0.014748109504580498, 0.00747779943048954, 0.033277519047260284, 0.007784961722791195, 0.01842239312827587, -0.0001628903264645487, 0.028121482580900192, -0.000924408552236855, 0.028709091246128082, -0.057194869965314865, -0.09727808833122253, -0.006745229009538889, 0.030530214309692383, 0.006652356591075659, -0.01533172931522131, 0.053574975579977036, -0.031174473464488983, -0.06010317802429199, -0.02019720897078514, -0.0014705967623740435, -0.0004766093916259706, 0.02368447557091713, -0.02516724169254303, -0.008730429224669933, -0.014594294130802155, 0.03428974375128746, -0.014900869689881802, -0.02125357836484909, -0.016463620588183403, 0.048227641731500626, 0.08555835485458374, -0.032832007855176926, 0.07559806108474731, 0.017701933160424232, -0.0016297890106216073, 0.00896582193672657, -0.0485827662050724, 0.032072022557258606, -0.03913174942135811, -0.0057081799022853374, 0.03834522143006325, 0.002464336808770895, -0.007063806522637606, 0.008102820254862309, 0.0051643275655806065, 0.03492139279842377, -0.014087075367569923, -0.02381907030940056, -0.03909827023744583, -0.005364793818444014, -0.0055048768408596516, -0.04573764279484749, -0.0024138514418154955, 0.02137630246579647, 0.007775136269629002, 0.023936185985803604, -0.0015006293542683125, 0.06782418489456177, 0.044336773455142975, -0.040783580392599106, 0.011519186198711395, 0.029659239575266838, -0.002725874772295356, 0.03301544860005379, 0.037557151168584824, 0.025757841765880585, 0.039183009415864944, 0.048076462000608444, -0.0016879907343536615, 0.039598219096660614, 0.030976446345448494, -0.013103821314871311, -0.002890518866479397, 0.032368626445531845, 0.007544851861894131, -0.07838713377714157, 0.02631043642759323, -0.018131131306290627, 0.032868579030036926, -0.012289745733141899, -0.014004579745233059, 0.038160540163517, 0.0016887492965906858, -0.004072591662406921, 0.08660735934972763, 0.012689821422100067, -0.004678598139435053, -0.006504169665277004, 0.018165897578001022, -0.04158347472548485, -0.00675842585042119, -0.01171952486038208, 0.0025710100308060646, 0.019069211557507515, -0.08300528675317764, -0.024678755551576614, -0.019928645342588425, 0.02423119731247425, -0.005311455577611923, 0.004460558295249939, -0.001316946349106729, -0.015475798398256302, -0.006068225484341383, 0.010935486294329166, -0.006959828548133373, 0.02098374255001545, -0.03252309188246727, 0.009068013168871403, 0.035203199833631516, 0.01718710921704769, 0.001677904394455254, 0.010427827015519142, 0.010429291985929012, 0.014940725639462471, -0.012986795045435429, 0.037044692784547806, 0.004719842225313187, -0.009742313995957375, 0.017663337290287018, 0.05300469696521759, 0.03831084817647934, 0.006779704708606005, -0.015106527134776115, 0.09765683114528656, 0.08004117757081985, 0.0002592308446764946, -7.634810754097998e-05, 0.018572427332401276, 0.036287821829319, 0.027620920911431313, -0.03050464391708374, -7.434750295942649e-05, 0.07030769437551498, 0.053527723997831345, -0.0371805764734745, 0.022471293807029724, 0.027947863563895226, 0.025254495441913605, -0.024772021919488907, 0.019810574129223824, -0.03195536509156227, -0.0008053038036450744, 0.011623025871813297, -0.013318939134478569, 0.03160810470581055, -0.028143908828496933, -0.014803800731897354, 0.030108490958809853, 0.007227449212223291, -0.004465969279408455, 0.013781941495835781, -0.027130743488669395, -0.002222377108410001, -0.04395921900868416, -0.007542964071035385, 0.009342711418867111, 0.07045633345842361, 0.02099410630762577, -0.010930197313427925, 0.03576366975903511, 0.03854421153664589, -0.023846663534641266, -0.06719580292701721, 0.009617004543542862, 0.017567181959748268, 0.005597418639808893, 0.005990058183670044, 0.0915290042757988, -0.020227886736392975, -0.031704872846603394, 0.0024985801428556442, 0.014614447951316833, 0.07520688325166702, -0.01213807798922062, -0.017003314569592476, 0.00859066192060709, -0.048851676285266876, 0.01342807337641716, 0.004157691728323698, -0.04537903890013695, 0.01576010137796402, -0.017201008275151253, -0.025061460211873055, 0.004972462542355061, 0.03350071609020233, 0.021053742617368698, 0.005272446665912867, -0.003042125143110752, 0.10496918857097626, -0.012965241447091103, -0.04114266112446785, 0.02541327476501465, 0.010926004499197006, -0.05708794295787811, 0.020879605785012245, 0.006724646780639887, 0.013175313360989094, -0.03083123080432415, -0.03441973403096199, -0.017792094498872757, 0.05439480021595955, -0.10755541920661926, -0.08605484664440155, -0.08288975059986115, 0.004826841410249472, -0.019797323271632195, 0.022366749122738838, 0.0023365081287920475, -0.00670208316296339, 0.010471988469362259, 0.019006120041012764, -0.03672134503722191, -0.019765622913837433, 0.02608366310596466, 0.03050949238240719, 0.022369956597685814, -0.005147530697286129, -0.02097630873322487, -0.0015161603223532438, -0.04276391491293907, 0.06965667009353638, -0.047118254005908966, 0.05398133397102356, -0.038526978343725204, -0.008835862390697002, 0.000982948113232851, -0.011178651824593544, -0.03863026574254036, 0.013073205947875977, -0.04888290911912918, 0.020853329449892044, -0.03684407100081444, 0.05275176092982292, -0.008260824717581272, -0.00910678319633007, -0.036947086453437805, 0.03804996609687805, -0.02924766205251217, -0.006129257380962372, 0.008578160777688026, 0.06740450114011765, 0.016036702319979668, -0.01580948196351528, 0.0338134840130806, 0.04166177287697792, -0.010912732221186161, 0.02184327132999897, -0.014240472577512264, -0.05064921826124191, 0.02908657118678093, 0.0002835487248376012, -0.03959266096353531, 0.0195130817592144, 0.011611143127083778, -0.03561857342720032, -0.06139150261878967, 0.04718683287501335, -0.030253298580646515, -0.0010602115653455257, -0.017908290028572083, -0.024608811363577843, -0.006151393987238407, -0.023357834666967392, -0.03374723717570305, -0.030317407101392746, 0.06275968253612518, -0.027461588382720947, -0.04548612982034683, 0.021106474101543427, 0.008608682081103325, 0.01564689539372921, 0.031672220677137375, -0.006999721750617027, 0.016208449378609657, -0.043898917734622955, -0.005824690219014883, 0.05049712583422661, 0.03183373063802719, -0.03824540600180626, -0.004069481045007706, -0.019360963255167007, 0.013514203019440174, 0.03873922675848007, -0.02553846500813961, -0.021124934777617455, -0.025298189371824265, -0.016016678884625435, 0.015425234101712704, 0.006121821701526642, 0.00046682305401191115, -0.02520987018942833, -0.0004206066660117358, 0.00768557284027338, -0.028057079762220383, 0.008525831624865532, -0.023737462237477303, -0.006159046199172735, 0.016467636451125145, 0.00859884638339281, -0.01238448079675436, 0.02527397871017456, 0.03356923907995224, -0.05298352614045143, -0.013671936467289925, 0.026417680084705353, -0.06980810314416885, 0.03106299787759781, -0.02368166111409664, 0.020041899755597115, 0.006971489638090134, -0.05375108867883682, 0.004240857902914286, -0.02921922132372856, -0.02207661047577858, -0.02857240103185177, 0.049629151821136475, 0.05172787606716156, 0.02102244272828102, -0.03884565085172653, -0.006186930928379297, -0.049769602715969086, 0.09874702990055084, -0.006112928502261639, 0.009424751624464989]" ================================================ FILE: tests/milvus_lite/test_milvus_lite_close.py ================================================ import pytest import numpy as np from base.client_base import TestcaseBase from common.common_type import CaseLabel, CheckTasks from common import common_func as cf from common import common_type as ct from base.high_level_api_wrapper import HighLevelApiWrapper client_w = HighLevelApiWrapper() prefix = "milvus_local_api_collection" default_dim = ct.default_dim default_primary_key_field_name = "id" default_float_field_name = ct.default_float_field_name default_vector_field_name = "vector" default_limit = ct.default_limit default_nb = ct.default_nb default_search_exp = "id >= 0" exp_res = "exp_res" default_string_field_name = ct.default_string_field_name class TestMilvusLocalCloseAPI(TestcaseBase): """ Add milvus local unique case """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2", "IP"]) def metric_type(self, request): yield request.param @pytest.fixture(scope="function", params=["TRIE", "STL_SORT", "AUTOINDEX"]) def scalar_index(self, request): yield request.param @pytest.mark.tags(CaseLabel.L1) def test_milvus_local_reconnect(self, enable_milvus_local_api): client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) result = client_w.has_collection(client, collection_name)[0] assert result == True client.close() client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) result = client_w.has_collection(client, collection_name)[0] assert result == True @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("index, params", zip(ct.all_index_types[:7], ct.default_index_params[:7])) def test_milvus_client_index_with_params(self, enable_milvus_local_api, index, params, metric_type): """ target: reconnect search normal case method: create connection, collection, insert, close and search expected: search successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") res = client_w.list_indexes(client, collection_name)[0] assert res == [] # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name="vector", index_type=index, params=params, metric_type=metric_type) # 3. create index client_w.create_index(client, collection_name, index_params) # 4. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 5. load collection client_w.load_collection(client, collection_name) client_w.release_collection(client, collection_name) # 6. close and reconnect client.close() client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) # 7. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) client_w.drop_collection(client, collection_name) class TestMilvusLocalCloseInvalid(TestcaseBase): @pytest.mark.tags(CaseLabel.L2) def test_milvus_local_close_multiple(self, enable_milvus_local_api): client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) client_w.create_collection(client, collection_name, default_dim) client.close() client.close() client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) result = client_w.has_collection(client, collection_name)[0] assert result == True c_name = collection_name + "_2" client_w.create_collection(client, c_name, default_dim) result = client_w.has_collection(client, c_name)[0] assert result == True ================================================ FILE: tests/milvus_lite/test_milvus_lite_collection.py ================================================ import multiprocessing import numbers import random import numpy import threading import pytest import pandas as pd import decimal from decimal import Decimal, getcontext from time import sleep import heapq from pymilvus import DataType from base.client_base import TestcaseBase from utils.util_log import test_log as log from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks from utils.util_pymilvus import * from common.constants import * from pymilvus.orm.types import CONSISTENCY_STRONG, CONSISTENCY_BOUNDED, CONSISTENCY_SESSION, CONSISTENCY_EVENTUALLY from base.high_level_api_wrapper import HighLevelApiWrapper client_w = HighLevelApiWrapper() prefix = "milvus_client_api_collection" epsilon = ct.epsilon default_nb = ct.default_nb default_nb_medium = ct.default_nb_medium default_nq = ct.default_nq default_dim = ct.default_dim default_limit = ct.default_limit default_search_exp = "id >= 0" exp_res = "exp_res" default_search_string_exp = "varchar >= \"0\"" default_search_mix_exp = "int64 >= 0 && varchar >= \"0\"" default_invaild_string_exp = "varchar >= 0" default_json_search_exp = "json_field[\"number\"] >= 0" perfix_expr = 'varchar like "0%"' default_search_field = ct.default_float_vec_field_name default_search_params = ct.default_search_params default_primary_key_field_name = "id" default_vector_field_name = "vector" default_float_field_name = ct.default_float_field_name default_bool_field_name = ct.default_bool_field_name default_string_field_name = ct.default_string_field_name default_int32_array_field_name = ct.default_int32_array_field_name default_string_array_field_name = ct.default_string_array_field_name class TestMilvusClientCollectionInvalid(TestcaseBase): """ Test case of create collection interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("collection_name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_collection_invalid_collection_name(self, enable_milvus_local_api, collection_name): """ target: test fast create collection with invalid collection name method: create collection with invalid collection expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) # 1. create collection error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {collection_name}. the first character of a " f"collection name must be an underscore or letter: invalid parameter"} client_w.create_collection(client, collection_name, default_dim, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_collection_name_over_max_length(self, enable_milvus_local_api): """ target: test fast create collection with over max collection name length method: create collection with over max collection name length expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) # 1. create collection collection_name = "a".join("a" for i in range(256)) error = {ct.err_code: 1100, ct.err_msg: f"invalid dimension: {collection_name}. " f"the length of a collection name must be less than 255 characters: " f"invalid parameter"} client_w.create_collection(client, collection_name, default_dim, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_collection_name_empty(self, enable_milvus_local_api): """ target: test fast create collection name with empty method: create collection name with empty expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) # 1. create collection collection_name = " " error = {ct.err_code: 0, ct.err_msg: "collection name should not be empty: invalid parameter"} client_w.create_collection(client, collection_name, default_dim, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("dim", [ct.min_dim-1, ct.max_dim+1]) def test_milvus_client_collection_invalid_dim(self, enable_milvus_local_api, dim): """ target: test fast create collection name with invalid dim method: create collection name with invalid dim expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection error = {ct.err_code: 65535, ct.err_msg: f"invalid dimension: {dim}. should be in range 2 ~ 32768"} client_w.create_collection(client, collection_name, dim, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_collection_invalid_primary_field(self, enable_milvus_local_api): """ target: test fast create collection name with invalid primary field method: create collection name with invalid primary field expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection error = {ct.err_code: 1, ct.err_msg: f"Param id_type must be int or string"} client_w.create_collection(client, collection_name, default_dim, id_type="invalid", check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_collection_string_auto_id(self, enable_milvus_local_api): """ target: test fast create collection without max_length for string primary key method: create collection name with invalid primary field expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection error = {ct.err_code: 65535, ct.err_msg: f"type param(max_length) should be specified for varChar " f"field of collection {collection_name}"} client_w.create_collection(client, collection_name, default_dim, id_type="string", auto_id=True, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_create_same_collection_different_params(self, enable_milvus_local_api): """ target: test create same collection with different params method: create same collection with different params expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. create collection with same params client_w.create_collection(client, collection_name, default_dim) # 3. create collection with same name and different params error = {ct.err_code: 1, ct.err_msg: f"create duplicate collection with different parameters, " f"collection: {collection_name}"} client_w.create_collection(client, collection_name, default_dim+1, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("metric_type", [1, " ", "invalid"]) def test_milvus_client_collection_invalid_metric_type(self, enable_milvus_local_api, metric_type): """ target: test create same collection with invalid metric type method: create same collection with invalid metric type expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection error = {ct.err_code: 65535, ct.err_msg: "metric type not found or not supported, supported: [L2 IP COSINE HAMMING JACCARD]"} client_w.create_collection(client, collection_name, default_dim, metric_type=metric_type, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_collection_invalid_schema_field_name(self, enable_milvus_local_api): """ target: test create collection with invalid schema field name method: create collection with invalid schema field name expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) schema = client_w.create_schema(client, enable_dynamic_field=False)[0] schema.add_field("%$#", DataType.VARCHAR, max_length=64, is_primary=True, auto_id = False) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=128) # 1. create collection error = {ct.err_code: 65535, ct.err_msg: "metric type not found or not supported, supported: [L2 IP COSINE HAMMING JACCARD]"} client_w.create_collection(client, collection_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) class TestMilvusClientCollectionValid(TestcaseBase): """ Test case of create collection interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2", "IP"]) def metric_type(self, request): yield request.param @pytest.fixture(scope="function", params=["int", "string"]) def id_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L0) @pytest.mark.xfail(reason="pymilvus issue 1871") @pytest.mark.parametrize("dim", [ct.min_dim, default_dim, ct.max_dim]) def test_milvus_client_collection_fast_creation_default(self, enable_milvus_local_api, dim): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) client_w.using_database(client, "default") # 1. create collection client_w.create_collection(client, collection_name, dim) collections = client_w.list_collections(client)[0] assert collection_name in collections client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": dim, "consistency_level": 0}) index = client_w.list_indexes(client, collection_name)[0] assert index == ['vector'] # load_state = client_w.get_load_state(collection_name)[0] client_w.load_partitions(client, collection_name, "_default") client_w.release_partitions(client, collection_name, "_default") if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("dim", [ct.min_dim, default_dim, ct.max_dim]) def test_milvus_client_collection_fast_creation_all_params(self, enable_milvus_local_api, dim, metric_type, id_type, auto_id): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) max_length = 100 # 1. create collection client_w.create_collection(client, collection_name, dim, id_type=id_type, metric_type=metric_type, auto_id=auto_id, max_length=max_length) collections = client_w.list_collections(client)[0] assert collection_name in collections client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": dim, "consistency_level": 0}) index = client_w.list_indexes(client, collection_name)[0] assert index == ['vector'] # load_state = client_w.get_load_state(collection_name)[0] client_w.release_collection(client, collection_name) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L0) def test_milvus_client_collection_self_creation_default(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection schema = client_w.create_schema(client, enable_dynamic_field=False)[0] schema.add_field("id_string", DataType.VARCHAR, max_length=64, is_primary=True, auto_id = False) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=128) schema.add_field("title", DataType.VARCHAR, max_length=64, is_partition_key=True) schema.add_field("array_field", DataType.Array, max_capacity=12, element_type_params={"type": DataType.VARCHAR, "max_length": 64}) index_params = client_w.prepare_index_params() index_params.add_index("embeddings", metric_type="cosine") index_params.add_index("title") client_w.create_collection(client, collection_name, schema=schema, index_params=index_params) collections = client_w.list_collections(client)[0] assert collection_name in collections client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": 128, "consistency_level": 0}) index = client_w.list_indexes(client, collection_name)[0] assert index == ['vector'] # load_state = client_w.get_load_state(collection_name)[0] if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_array_insert_search(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") collections = client_w.list_collections(client)[0] assert collection_name in collections # 2. insert rng = np.random.default_rng(seed=19530) rows = [{ default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_int32_array_field_name: [i, i+1, i+2], default_string_array_field_name: [str(i), str(i + 1), str(i + 2)] } for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_search_query_string(self, enable_milvus_local_api): """ target: test search (high level api) for string primary key method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, id_type="string", max_length=ct.default_length) client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": default_dim, "auto_id": auto_id}) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: str(i), default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) client_w.flush(client, collection_name) assert client_w.num_entities(client, collection_name)[0] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "limit": default_limit}) # 4. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_search_different_metric_types_not_specifying_in_search_params(self, enable_milvus_local_api, metric_type, auto_id): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search successfully with limit(topK) """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, metric_type=metric_type, auto_id=auto_id, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] if auto_id: for row in rows: row.pop(default_primary_key_field_name) client_w.insert(client, collection_name, rows) # 3. search vectors_to_search = rng.random((1, default_dim)) # search_params = {"metric_type": metric_type} client_w.search(client, collection_name, vectors_to_search, limit=default_limit, output_fields=[default_primary_key_field_name], check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "limit": default_limit}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_search_different_metric_types_specifying_in_search_params(self, enable_milvus_local_api, metric_type, auto_id): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search successfully with limit(topK) """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, metric_type=metric_type, auto_id=auto_id, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] if auto_id: for row in rows: row.pop(default_primary_key_field_name) client_w.insert(client, collection_name, rows) # 3. search vectors_to_search = rng.random((1, default_dim)) search_params = {"metric_type": metric_type} client_w.search(client, collection_name, vectors_to_search, limit=default_limit, search_params=search_params, output_fields=[default_primary_key_field_name], check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "limit": default_limit}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_ids(self, enable_milvus_local_api): """ target: test delete (high level api) method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] pks = client_w.insert(client, collection_name, rows)[0] # 3. delete delete_num = 3 client_w.delete(client, collection_name, ids=[i for i in range(delete_num)]) # 4. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] for insert_id in range(delete_num): if insert_id in insert_ids: insert_ids.remove(insert_id) limit = default_nb - delete_num client_w.search(client, collection_name, vectors_to_search, limit=default_nb, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": limit}) # 5. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[delete_num:], "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_filters(self, enable_milvus_local_api): """ target: test delete (high level api) method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] pks = client_w.insert(client, collection_name, rows)[0] # 3. delete delete_num = 3 client_w.delete(client, collection_name, filter=f"id < {delete_num}") # 4. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] for insert_id in range(delete_num): if insert_id in insert_ids: insert_ids.remove(insert_id) limit = default_nb - delete_num client_w.search(client, collection_name, vectors_to_search, limit=default_nb, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": limit}) # 5. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[delete_num:], "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_collection_rename_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) collections = client_w.list_collections(client)[0] assert collection_name in collections old_name = collection_name new_name = collection_name + "new" client_w.rename_collection(client, old_name, new_name) collections = client_w.list_collections(client)[0] assert new_name in collections assert old_name not in collections client_w.describe_collection(client, new_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": new_name, "dim": default_dim, "consistency_level": 0}) index = client_w.list_indexes(client, new_name)[0] assert index == ['vector'] # load_state = client_w.get_load_state(collection_name)[0] error = {ct.err_code: 100, ct.err_msg: f"collection not found"} client_w.load_partitions(client, old_name, "_default", check_task=CheckTasks.err_res, check_items=error) client_w.load_partitions(client, new_name, "_default") client_w.release_partitions(client, new_name, "_default") if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, new_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip(reason="db not ready") def test_milvus_client_collection_rename_collection_target_db(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) collections = client_w.list_collections(client)[0] assert collection_name in collections db_name = "new_db" client_w.use_database(client, db_name) old_name = collection_name new_name = collection_name + "new" client_w.rename_collection(client, old_name, new_name, target_db=db_name) collections = client_w.list_collections(client)[0] assert new_name in collections assert old_name not in collections client_w.describe_collection(client, new_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": new_name, "dim": default_dim, "consistency_level": 0}) index = client_w.list_indexes(client, new_name)[0] assert index == ['vector'] # load_state = client_w.get_load_state(collection_name)[0] error = {ct.err_code: 100, ct.err_msg: f"collection not found"} client_w.load_partitions(client, old_name, "_default", check_task=CheckTasks.err_res, check_items=error) client_w.load_partitions(client, new_name, "_default") client_w.release_partitions(client, new_name, "_default") if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, new_name) class TestMilvusClientDropCollectionInvalid(TestcaseBase): """ Test case of drop collection interface """ """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_drop_collection_invalid_collection_name(self, enable_milvus_local_api, name): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {name}. collection name can only " f"contain numbers, letters and underscores: invalid parameter"} client_w.drop_collection(client, name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_drop_collection_not_existed(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str("nonexisted") client_w.drop_collection(client, collection_name) class TestMilvusClientReleaseCollectionInvalid(TestcaseBase): """ Test case of release collection interface """ """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_release_collection_invalid_collection_name(self, enable_milvus_local_api, name): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {name}. collection name can only " f"contain numbers, letters and underscores: invalid parameter"} client_w.release_collection(client, name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_release_collection_not_existed(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str("nonexisted") error = {ct.err_code: 1100, ct.err_msg: f"collection not found[database=default]" f"[collection={collection_name}]"} client_w.release_collection(client, collection_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_release_collection_name_over_max_length(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) # 1. create collection collection_name = "a".join("a" for i in range(256)) error = {ct.err_code: 1100, ct.err_msg: f"invalid dimension: {collection_name}. " f"the length of a collection name must be less than 255 characters: " f"invalid parameter"} client_w.release_collection(client, collection_name, default_dim, check_task=CheckTasks.err_res, check_items=error) class TestMilvusClientReleaseCollectionValid(TestcaseBase): """ Test case of release collection interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2", "IP"]) def metric_type(self, request): yield request.param @pytest.fixture(scope="function", params=["int", "string"]) def id_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_release_unloaded_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.release_collection(client, collection_name) client_w.release_collection(client, collection_name) if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_load_partially_loaded_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) partition_name = cf.gen_unique_str("partition") # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.create_partition(client, collection_name, partition_name) client_w.release_partitions(client, collection_name, ["_default", partition_name]) client_w.release_collection(client, collection_name) client_w.load_collection(client, collection_name) client_w.release_partitions(client, collection_name, [partition_name]) client_w.release_collection(client, collection_name) if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) class TestMilvusClientLoadCollectionInvalid(TestcaseBase): """ Test case of search interface """ """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_load_collection_invalid_collection_name(self, enable_milvus_local_api, name): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {name}. collection name can only " f"contain numbers, letters and underscores: invalid parameter"} client_w.load_collection(client, name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_load_collection_not_existed(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str("nonexisted") error = {ct.err_code: 1100, ct.err_msg: f"collection not found[database=default]" f"[collection={collection_name}]"} client_w.load_collection(client, collection_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_load_collection_over_max_length(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = "a".join("a" for i in range(256)) error = {ct.err_code: 1100, ct.err_msg: f"invalid dimension: {collection_name}. " f"the length of a collection name must be less than 255 characters: " f"invalid parameter"} client_w.load_collection(client, collection_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_load_collection_without_index(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") error = {ct.err_code: 700, ct.err_msg: f"index not found[collection={collection_name}]"} client_w.load_collection(client, collection_name, check_task=CheckTasks.err_res, check_items=error) if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) class TestMilvusClientLoadCollectionValid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2", "IP"]) def metric_type(self, request): yield request.param @pytest.fixture(scope="function", params=["int", "string"]) def id_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_load_loaded_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.load_collection(client, collection_name) if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_load_partially_loaded_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) partition_name = cf.gen_unique_str("partition") # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.create_partition(client, collection_name, partition_name) client_w.release_collection(client, collection_name) client_w.load_partitions(client, collection_name, [partition_name]) client_w.load_collection(client, collection_name) client_w.release_collection(client, collection_name) client_w.load_partitions(client, collection_name, ["_default", partition_name]) client_w.load_collection(client, collection_name) if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) class TestMilvusClientDescribeCollectionInvalid(TestcaseBase): """ Test case of search interface """ """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_describe_collection_invalid_collection_name(self, enable_milvus_local_api, name): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {name}. collection name can only " f"contain numbers, letters and underscores: invalid parameter"} client_w.describe_collection(client, name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_describe_collection_not_existed(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = "nonexisted" error = {ct.err_code: 100, ct.err_msg: f"can't find collection collection not " f"found[database=default][collection=nonexisted]"} client_w.describe_collection(client, collection_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_describe_collection_deleted_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.drop_collection(client, collection_name) error = {ct.err_code: 100, ct.err_msg: f"can't find collection collection not " f"found[database=default]"} client_w.describe_collection(client, collection_name, check_task=CheckTasks.err_res, check_items=error) class TestMilvusClientHasCollectionInvalid(TestcaseBase): """ Test case of search interface """ """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_has_collection_invalid_collection_name(self, enable_milvus_local_api, name): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {name}. collection name can only " f"contain numbers, letters and underscores: invalid parameter"} client_w.has_collection(client, name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_has_collection_not_existed(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = "nonexisted" result = client_w.has_collection(client, collection_name)[0] assert result == False @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_has_collection_deleted_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.drop_collection(client, collection_name) result = client_w.has_collection(client, collection_name)[0] assert result == False class TestMilvusClientRenameCollectionInValid(TestcaseBase): """ Test case of rename collection interface """ """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_rename_collection_invalid_collection_name(self, enable_milvus_local_api, name): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) error = {ct.err_code: 100, ct.err_msg: f"collection not found[database=1][collection={name}]"} client_w.rename_collection(client, name, "new_collection", check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_rename_collection_not_existed_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = "nonexisted" error = {ct.err_code: 100, ct.err_msg: f"collection not found[database=1][collection={collection_name}]"} client_w.rename_collection(client, collection_name, "new_collection", check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_rename_collection_duplicated_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) error = {ct.err_code: 65535, ct.err_msg: f"duplicated new collection name default:{collection_name}" f"with other collection name or alias"} client_w.rename_collection(client, collection_name, collection_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_rename_deleted_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.drop_collection(client, collection_name) error = {ct.err_code: 100, ct.err_msg: f"can't find collection collection not " f"found[database=default]"} client_w.rename_collection(client, collection_name, "new_collection", check_task=CheckTasks.err_res, check_items=error) class TestMilvusClientRenameCollectionValid(TestcaseBase): """ Test case of rename collection interface """ """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_rename_collection_multiple_times(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 2. rename with invalid new_name new_name = "new_name_rename" client_w.create_collection(client, collection_name, default_dim) times = 3 for _ in range(times): client_w.rename_collection(client, collection_name, new_name) client_w.rename_collection(client, new_name, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_rename_collection_deleted_collection(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) another_collection_name = cf.gen_unique_str("another_collection") # 1. create 2 collections client_w.create_collection(client, collection_name, default_dim) client_w.create_collection(client, another_collection_name, default_dim) # 2. drop one collection client_w.drop_collection(client, another_collection_name) # 3. rename to dropped collection client_w.rename_collection(client, collection_name, another_collection_name) class TestMilvusClientUsingDatabaseInvalid(TestcaseBase): """ Test case of using database interface """ """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.xfail(reason="pymilvus issue 1900") @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_using_database_invalid_db_name(self, enable_milvus_local_api, name): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) error = {ct.err_code: 800, ct.err_msg: f"Invalid collection name: {name}. collection name can only " f"contain numbers, letters and underscores: invalid parameter"} client_w.using_database(client, name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_using_database_not_exist_db_name(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) db_name = cf.gen_unique_str("nonexisted") error = {ct.err_code: 800, ct.err_msg: f"database not found[database=non-default]"} client_w.using_database(client, db_name, check_task=CheckTasks.err_res, check_items=error)[0] @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="pymilvus issue 1900") def test_milvus_client_using_database_db_name_over_max_length(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: drop successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) db_name = "a".join("a" for i in range(256)) error = {ct.err_code: 1100, ct.err_msg: f"invalid dimension: {db_name}. " f"the length of a collection name must be less than 255 characters: " f"invalid parameter"} client_w.using_database(client, db_name, check_task=CheckTasks.err_res, check_items=error)[0] ================================================ FILE: tests/milvus_lite/test_milvus_lite_delete.py ================================================ import multiprocessing import numbers import random import numpy import threading import pytest import pandas as pd import decimal from decimal import Decimal, getcontext from time import sleep import heapq from base.client_base import TestcaseBase from utils.util_log import test_log as log from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks from utils.util_pymilvus import * from common.constants import * from pymilvus.orm.types import CONSISTENCY_STRONG, CONSISTENCY_BOUNDED, CONSISTENCY_SESSION, CONSISTENCY_EVENTUALLY from base.high_level_api_wrapper import HighLevelApiWrapper client_w = HighLevelApiWrapper() prefix = "milvus_client_api_delete" epsilon = ct.epsilon default_nb = ct.default_nb default_nb_medium = ct.default_nb_medium default_nq = ct.default_nq default_dim = ct.default_dim default_limit = ct.default_limit default_search_exp = "id >= 0" exp_res = "exp_res" default_search_string_exp = "varchar >= \"0\"" default_search_mix_exp = "int64 >= 0 && varchar >= \"0\"" default_invaild_string_exp = "varchar >= 0" default_json_search_exp = "json_field[\"number\"] >= 0" perfix_expr = 'varchar like "0%"' default_search_field = ct.default_float_vec_field_name default_search_params = ct.default_search_params default_primary_key_field_name = "id" default_vector_field_name = "vector" default_float_field_name = ct.default_float_field_name default_bool_field_name = ct.default_bool_field_name default_string_field_name = ct.default_string_field_name default_int32_array_field_name = ct.default_int32_array_field_name default_string_array_field_name = ct.default_string_array_field_name class TestMilvusClientDeleteInvalid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_filters_and_ids(self, enable_milvus_local_api): """ target: test delete (high level api) with ids and filters method: create connection, collection, insert, delete, and search expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] pks = client_w.insert(client, collection_name, rows)[0] # 3. delete delete_num = 3 client_w.delete(client, collection_name, ids=[i for i in range(delete_num)], filter=f"id < {delete_num}", check_task=CheckTasks.err_res, check_items={"err_code": 1, "err_msg": "Ambiguous filter parameter, " "only one deletion condition can be specified."}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_invalid_id_type(self, enable_milvus_local_api): """ target: test delete (high level api) method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. delete client_w.delete(client, collection_name, ids=0, check_task=CheckTasks.err_res, check_items={"err_code": 1, "err_msg": "expr cannot be empty"}) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_not_all_required_params(self, enable_milvus_local_api): """ target: test delete (high level api) method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. delete client_w.delete(client, collection_name, check_task=CheckTasks.err_res, check_items={"err_code": 1, "err_msg": "expr cannot be empty"}) class TestMilvusClientDeleteValid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_ids(self, enable_milvus_local_api): """ target: test delete (high level api) method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] pks = client_w.insert(client, collection_name, rows)[0] # 3. delete delete_num = 3 client_w.delete(client, collection_name, ids=[i for i in range(delete_num)]) # 4. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] for insert_id in range(delete_num): if insert_id in insert_ids: insert_ids.remove(insert_id) limit = default_nb - delete_num client_w.search(client, collection_name, vectors_to_search, limit=default_nb, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": limit}) # 5. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[delete_num:], "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_filters(self, enable_milvus_local_api): """ target: test delete (high level api) method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] pks = client_w.insert(client, collection_name, rows)[0] # 3. delete delete_num = 3 client_w.delete(client, collection_name, filter=f"id < {delete_num}") # 4. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] for insert_id in range(delete_num): if insert_id in insert_ids: insert_ids.remove(insert_id) limit = default_nb - delete_num client_w.search(client, collection_name, vectors_to_search, limit=default_nb, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": limit}) # 5. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[delete_num:], "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_filters_partition(self, enable_milvus_local_api): """ target: test delete (high level api) method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] pks = client_w.insert(client, collection_name, rows)[0] # 3. get partition lists partition_names = client_w.list_partitions(client, collection_name) # 4. delete delete_num = 3 client_w.delete(client, collection_name, filter=f"id < {delete_num}", partition_names=partition_names) # 5. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] for insert_id in range(delete_num): if insert_id in insert_ids: insert_ids.remove(insert_id) limit = default_nb - delete_num client_w.search(client, collection_name, vectors_to_search, limit=default_nb, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": limit}) # 6. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[delete_num:], "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) ================================================ FILE: tests/milvus_lite/test_milvus_lite_index.py ================================================ import multiprocessing import numbers import random import numpy import threading import pytest import pandas as pd import decimal from decimal import Decimal, getcontext from time import sleep import heapq from base.client_base import TestcaseBase from utils.util_log import test_log as log from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks from utils.util_pymilvus import * from common.constants import * from pymilvus.orm.types import CONSISTENCY_STRONG, CONSISTENCY_BOUNDED, CONSISTENCY_SESSION, CONSISTENCY_EVENTUALLY from base.high_level_api_wrapper import HighLevelApiWrapper client_w = HighLevelApiWrapper() prefix = "milvus_client_api_index" epsilon = ct.epsilon default_nb = ct.default_nb default_nb_medium = ct.default_nb_medium default_nq = ct.default_nq default_dim = ct.default_dim default_limit = ct.default_limit default_search_exp = "id >= 0" exp_res = "exp_res" default_search_string_exp = "varchar >= \"0\"" default_search_mix_exp = "int64 >= 0 && varchar >= \"0\"" default_invaild_string_exp = "varchar >= 0" default_json_search_exp = "json_field[\"number\"] >= 0" perfix_expr = 'varchar like "0%"' default_search_field = ct.default_float_vec_field_name default_search_params = ct.default_search_params default_primary_key_field_name = "id" default_vector_field_name = "vector" default_multiple_vector_field_name = "vector_new" default_float_field_name = ct.default_float_field_name default_bool_field_name = ct.default_bool_field_name default_string_field_name = ct.default_string_field_name default_int32_array_field_name = ct.default_int32_array_field_name default_string_array_field_name = ct.default_string_array_field_name class TestMilvusClientIndexInvalid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_index_invalid_collection_name(self, name, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector") # 3. create index error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {name}. the first character of a collection " f"name must be an underscore or letter: invalid parameter"} client_w.create_index(client, name, index_params, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("name", ["a".join("a" for i in range(256))]) def test_milvus_client_index_collection_name_over_max_length(self, enable_milvus_local_api, name): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector") # 3. create index error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {name}. the length of a collection name " f"must be less than 255 characters: invalid parameter"} client_w.create_index(client, name, index_params, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_index_not_exist_collection_name(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) not_existed_collection_name = cf.gen_unique_str("not_existed_collection") # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector") # 3. create index error = {ct.err_code: 100, ct.err_msg: f"can't find collection collection not " f"found[database=default][collection=not_existed]"} client_w.create_index(client, not_existed_collection_name, index_params, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("index", ["12-s", "12 s", "(mn)", "中文", "%$#", "a".join("a" for i in range(256))]) def test_milvus_client_index_invalid_index_type(self, enable_milvus_local_api, index): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector", index_type=index) # 3. create index error = {ct.err_code: 100, ct.err_msg: f"can't find collection collection not " f"found[database=default][collection=not_existed]"} client_w.create_index(client, collection_name, index_params, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("metric", ["12-s", "12 s", "(mn)", "中文", "%$#", "a".join("a" for i in range(256))]) def test_milvus_client_index_invalid_metric_type(self, enable_milvus_local_api, metric): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector", metric_type = metric) # 3. create index error = {ct.err_code: 100, ct.err_msg: f"can't find collection collection not " f"found[database=default][collection=not_existed]"} client_w.create_index(client, collection_name, index_params, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_index_drop_index_before_release(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") error = {ct.err_code: 65535, ct.err_msg: f"index cannot be dropped, collection is loaded, " f"please release it first"} client_w.drop_index(client, collection_name, "vector", check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip(reason="pymilvus issue 1886") def test_milvus_client_index_multiple_indexes_one_field(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector", index_type="HNSW", metric_type="IP") # 3. create index client_w.create_index(client, collection_name, index_params) # 4. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2") error = {ct.err_code: 1100, ct.err_msg: f""} # 5. create another index client_w.create_index(client, collection_name, index_params, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip(reason="pymilvus issue 1886") def test_milvus_client_create_diff_index_without_release(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector", index_type="HNSW", metric_type="L2") # 3. create index client_w.create_index(client, collection_name, index_params) client_w.drop_collection(client, collection_name) class TestMilvusClientIndexValid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2", "IP"]) def metric_type(self, request): yield request.param @pytest.fixture(scope="function", params=["TRIE", "STL_SORT", "AUTOINDEX"]) def scalar_index(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip("https://github.com/milvus-io/pymilvus/issues/1886") @pytest.mark.parametrize("index, params", zip(ct.all_index_types[:7], ct.default_index_params[:7])) def test_milvus_client_index_default(self, enable_milvus_local_api, index, params, metric_type): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") res = client_w.list_indexes(client, collection_name)[0] assert res == [] # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name="vector", index_type=index, metric_type=metric_type) # 3. create index client_w.create_index(client, collection_name, index_params) # 4. create same index twice client_w.create_index(client, collection_name, index_params) # 5. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 6. load collection client_w.load_collection(client, collection_name) # 7. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 8. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("index, params", zip(ct.all_index_types[:5], ct.default_index_params[:5])) def test_milvus_client_index_with_params(self, enable_milvus_local_api, index, params, metric_type): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") res = client_w.list_indexes(client, collection_name)[0] assert res == [] # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector", index_type=index, params=params,metric_type = metric_type) # 3. create index client_w.create_index(client, collection_name, index_params) # 4. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 5. load collection client_w.load_collection(client, collection_name) # 6. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 7. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("wait for modification") @pytest.mark.parametrize("index, params", zip(ct.all_index_types[:7], ct.default_index_params[:7])) def test_milvus_client_index_after_insert(self, enable_milvus_local_api, index, params, metric_type): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 3. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector", index_type=index, metric_type = metric_type) # 4. create index client_w.create_index(client, collection_name, index_params) # 5. load collection client_w.load_collection(client, collection_name) # 5. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 4. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip("wait for modification") def test_milvus_client_index_auto_index(self, enable_milvus_local_api, scalar_index, metric_type): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") res = client_w.list_indexes(client, collection_name)[0] assert res == [] # 2. prepare index params index = "AUTOINDEX" index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector", index_type=index, metric_type = metric_type) index_params.add_index(field_name="id", index_type=scalar_index, metric_type=metric_type) # 3. create index client_w.create_index(client, collection_name, index_params) # 4. drop index client_w.drop_index(client, collection_name, "vector") client_w.drop_index(client, collection_name, "id") # 5. create index client_w.create_index(client, collection_name, index_params) # 6. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 7. load collection client_w.load_collection(client, collection_name) # 8. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 9. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("wait for modification") def test_milvus_client_index_multiple_vectors(self, enable_milvus_local_api, scalar_index, metric_type): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") res = client_w.list_indexes(client, collection_name)[0] assert res == [] # 2. prepare index params index = "AUTOINDEX" index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector", index_type=index, metric_type = metric_type) index_params.add_index(field_name="id", index_type=scalar_index, metric_type=metric_type) # 3. create index client_w.create_index(client, collection_name, index_params) # 4. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i), default_multiple_vector_field_name: list(rng.random((1, default_dim))[0])} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 5. load collection client_w.load_collection(client, collection_name) # 6. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 7. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("wait for modification") @pytest.mark.parametrize("index, params", zip(ct.all_index_types[:7], ct.default_index_params[:7])) def test_milvus_client_index_drop_create_same_index(self, enable_milvus_local_api, index, params, metric_type): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") res = client_w.list_indexes(client, collection_name)[0] assert res == [] # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name = "vector", index_type=index, metric_type = metric_type) # 3. create index client_w.create_index(client, collection_name, index_params) # 4. drop index client_w.drop_index(client, collection_name, "vector") # 4. create same index twice client_w.create_index(client, collection_name, index_params) # 5. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 6. load collection client_w.load_collection(client, collection_name) # 7. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 8. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("wait for modification") @pytest.mark.parametrize("index, params", zip(ct.all_index_types[:7], ct.default_index_params[:7])) def test_milvus_client_index_drop_create_different_index(self, enable_milvus_local_api, index, params, metric_type): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") client_w.release_collection(client, collection_name) client_w.drop_index(client, collection_name, "vector") res = client_w.list_indexes(client, collection_name)[0] assert res == [] # 2. prepare index params index_params = client_w.prepare_index_params(client)[0] index_params.add_index(field_name="vector", metric_type=metric_type) # 3. create index client_w.create_index(client, collection_name, index_params) # 4. drop index client_w.drop_index(client, collection_name, "vector") # 4. create different index index_params.add_index(field_name="vector", index_type=index, metric_type=metric_type) client_w.create_index(client, collection_name, index_params) # 5. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 6. load collection client_w.load_collection(client, collection_name) # 7. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 8. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) ================================================ FILE: tests/milvus_lite/test_milvus_lite_init.py ================================================ import pytest import numpy as np from base.client_base import TestcaseBase from common.common_type import CaseLabel, CheckTasks from common import common_func as cf from common import common_type as ct from base.high_level_api_wrapper import HighLevelApiWrapper client_w = HighLevelApiWrapper() default_primary_key_field_name = "id" default_vector_field_name = "vector" default_dim = ct.default_dim prefix = "milvus_lite_api_collection" default_float_field_name = ct.default_float_field_name default_string_field_name = ct.default_string_field_name default_limit = ct.default_limit default_nb = ct.default_nb class TestMilvusLocalFilePath(TestcaseBase): @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("file_path", ["./local1.db", "file", "/root/file1.db", "../../file.docx", "/file.db"]) def test_milvus_local_file_path(self, file_path): client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=file_path) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] results = client_w.insert(client, collection_name, rows)[0] assert results['insert_count'] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="illegal init") @pytest.mark.parametrize("file_path", ["/", "/cc/cc/cc/cc.db", " ", "/dir ", 0]) def test_milvus_local_invalid_file_path(self, file_path): self._connect(enable_milvus_client_api=True, enable_milvus_local_api=file_path) ================================================ FILE: tests/milvus_lite/test_milvus_lite_insert.py ================================================ import multiprocessing import numbers import random import numpy import threading import pytest import pandas as pd import decimal from decimal import Decimal, getcontext from time import sleep import heapq from base.client_base import TestcaseBase from utils.util_log import test_log as log from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks from utils.util_pymilvus import * from common.constants import * from pymilvus.orm.types import CONSISTENCY_STRONG, CONSISTENCY_BOUNDED, CONSISTENCY_SESSION, CONSISTENCY_EVENTUALLY from base.high_level_api_wrapper import HighLevelApiWrapper client_w = HighLevelApiWrapper() prefix = "milvus_client_api_insert" epsilon = ct.epsilon default_nb = ct.default_nb default_nb_medium = ct.default_nb_medium default_nq = ct.default_nq default_dim = ct.default_dim default_limit = ct.default_limit default_search_exp = "id >= 0" exp_res = "exp_res" default_search_string_exp = "varchar >= \"0\"" default_search_mix_exp = "int64 >= 0 && varchar >= \"0\"" default_invaild_string_exp = "varchar >= 0" default_json_search_exp = "json_field[\"number\"] >= 0" perfix_expr = 'varchar like "0%"' default_search_field = ct.default_float_vec_field_name default_search_params = ct.default_search_params default_primary_key_field_name = "id" default_vector_field_name = "vector" default_float_field_name = ct.default_float_field_name default_bool_field_name = ct.default_bool_field_name default_string_field_name = ct.default_string_field_name default_int32_array_field_name = ct.default_int32_array_field_name default_string_array_field_name = ct.default_string_array_field_name class TestMilvusClientInsertInvalid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_column_data(self, enable_milvus_local_api): """ target: test insert column data method: create connection, collection, insert and search expected: raise error """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert vectors = [[random.random() for _ in range(default_dim)] for _ in range(default_nb)] data = [[i for i in range(default_nb)], vectors] error = {ct.err_code: 1, ct.err_msg: "Unexpected error, message=<'list' object has no attribute 'items'"} client_w.insert(client, collection_name, data, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_empty_collection_name(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = "" rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"`collection_name` value {collection_name} is illegal"} client_w.insert(client, collection_name, rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("collection_name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_insert_invalid_collection_name(self, enable_milvus_local_api, collection_name): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {collection_name}. the first character of a " f"collection name must be an underscore or letter: invalid parameter"} client_w.insert(client, collection_name, rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_collection_name_over_max_length(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = "a".join("a" for i in range(256)) rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1100, ct.err_msg: f"invalid dimension: {collection_name}. " f"the length of a collection name must be less than 255 characters: " f"invalid parameter"} client_w.insert(client, collection_name, rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_not_exist_collection_name(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str("insert_not_exist") rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 100, ct.err_msg: f"can't find collection collection not found" f"[database=default][collection={collection_name}]"} client_w.insert(client, collection_name, rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("data", ["12-s", "12 s", "(mn)", "中文", "%$#", " "]) def test_milvus_client_insert_data_invalid_type(self, enable_milvus_local_api, data): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert error = {ct.err_code: 1, ct.err_msg: f"None rows, please provide valid row data."} client_w.insert(client, collection_name, data, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_data_empty(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert error = {ct.err_code: 1, ct.err_msg: f"None rows, please provide valid row data."} client_w.insert(client, collection_name, data="") @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_data_vector_field_missing(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"Field vector don't match in entities[0]"} client_w.insert(client, collection_name, data=rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_data_id_field_missing(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"Field id don't match in entities[0]"} client_w.insert(client, collection_name, data=rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_data_extra_field(self, enable_milvus_local_api): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, enable_dynamic_field=False) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"Attempt to insert an unexpected field " f"to collection without enabling dynamic field"} client_w.insert(client, collection_name, data=rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_data_dim_not_match(self, enable_milvus_local_api): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [ {default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim + 1))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 65536, ct.err_msg: f"of float data should divide the dim({default_dim})"} client_w.insert(client, collection_name, data=rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_not_matched_data(self, enable_milvus_local_api): """ target: test milvus client: insert not matched data then defined method: insert string to int primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [ {default_primary_key_field_name: str(i), default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"The Input data type is inconsistent with defined schema, " f"please check it."} client_w.insert(client, collection_name, data=rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("partition_name", ["12-s", "12 s", "(mn)", "中文", "%$#", " "]) def test_milvus_client_insert_invalid_partition_name(self, enable_milvus_local_api, partition_name): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 65535, ct.err_msg: f"Invalid partition name: {partition_name}. The first character of " f"a partition name must be an underscore or letter."} client_w.insert(client, collection_name, data=rows, partition_name=partition_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_not_exist_partition_name(self, enable_milvus_local_api): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] partition_name = cf.gen_unique_str("partition_not_exist") error = {ct.err_code: 200, ct.err_msg: f"partition not found[partition={partition_name}]"} client_w.insert(client, collection_name, data=rows, partition_name=partition_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_insert_collection_partition_not_match(self, enable_milvus_local_api): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) another_collection_name = cf.gen_unique_str(prefix + "another") partition_name = cf.gen_unique_str("partition") # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.create_collection(client, another_collection_name, default_dim) client_w.create_partition(client, another_collection_name, partition_name) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 200, ct.err_msg: f"partition not found[partition={partition_name}]"} client_w.insert(client, collection_name, data=rows, partition_name=partition_name, check_task=CheckTasks.err_res, check_items=error) class TestMilvusClientInsertValid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L0) def test_milvus_client_insert_default(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") collections = client_w.list_collections(client)[0] assert collection_name in collections client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": default_dim, "consistency_level": 0}) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] results = client_w.insert(client, collection_name, rows)[0] assert results['insert_count'] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 4. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.release_collection(client, collection_name) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_insert_different_fields(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") collections = client_w.list_collections(client)[0] assert collection_name in collections client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": default_dim, "consistency_level": 0}) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] results = client_w.insert(client, collection_name, rows)[0] assert results['insert_count'] == default_nb # 3. insert diff fields rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, "new_diff_str_field": str(i)} for i in range(default_nb)] results = client_w.insert(client, collection_name, rows)[0] assert results['insert_count'] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_insert_empty_data(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert rows = [] results = client_w.insert(client, collection_name, rows)[0] assert results['insert_count'] == 0 # 3. search rng = np.random.default_rng(seed=19530) vectors_to_search = rng.random((1, default_dim)) client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": [], "limit": 0}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_partition(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) partition_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. create partition client_w.create_partition(client, collection_name, partition_name) partitions = client_w.list_partitions(client, collection_name)[0] assert partition_name in partitions index = client_w.list_indexes(client, collection_name)[0] assert index == ['vector'] # load_state = client_w.get_load_state(collection_name)[0] # 3. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] results = client_w.insert(client, collection_name, rows, partition_name=partition_name)[0] assert results['insert_count'] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # partition_number = client_w.get_partition_stats(client, collection_name, "_default")[0] # assert partition_number == default_nb # partition_number = client_w.get_partition_stats(client, collection_name, partition_name)[0] # assert partition_number[0]['value'] == 0 if client_w.has_partition(client, collection_name, partition_name)[0]: client_w.release_partitions(client, collection_name, partition_name) client_w.drop_partition(client, collection_name, partition_name) if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) class TestMilvusClientUpsertInvalid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_column_data(self, enable_milvus_local_api): """ target: test insert column data method: create connection, collection, insert and search expected: raise error """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert vectors = [[random.random() for _ in range(default_dim)] for _ in range(default_nb)] data = [[i for i in range(default_nb)], vectors] error = {ct.err_code: 1, ct.err_msg: "Unexpected error, message=<'list' object has no attribute 'items'"} client_w.upsert(client, collection_name, data, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_empty_collection_name(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = "" rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"`collection_name` value {collection_name} is illegal"} client_w.upsert(client, collection_name, rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("collection_name", ["12-s", "12 s", "(mn)", "中文", "%$#"]) def test_milvus_client_upsert_invalid_collection_name(self, collection_name, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name: {collection_name}. the first character of a " f"collection name must be an underscore or letter: invalid parameter"} client_w.upsert(client, collection_name, rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_collection_name_over_max_length(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = "a".join("a" for i in range(256)) rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1100, ct.err_msg: f"invalid dimension: {collection_name}. " f"the length of a collection name must be less than 255 characters: " f"invalid parameter"} client_w.upsert(client, collection_name, rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_not_exist_collection_name(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str("insert_not_exist") rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 100, ct.err_msg: f"can't find collection collection not found" f"[database=default][collection={collection_name}]"} client_w.upsert(client, collection_name, rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("data", ["12-s", "12 s", "(mn)", "中文", "%$#", " "]) def test_milvus_client_upsert_data_invalid_type(self, data, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert error = {ct.err_code: 1, ct.err_msg: f"None rows, please provide valid row data."} client_w.upsert(client, collection_name, data, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_data_empty(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert error = {ct.err_code: 1, ct.err_msg: f"None rows, please provide valid row data."} client_w.upsert(client, collection_name, data= "") @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_data_vector_field_missing(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"Field vector don't match in entities[0]"} client_w.upsert(client, collection_name, data= rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_data_id_field_missing(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"Field id don't match in entities[0]"} client_w.upsert(client, collection_name, data=rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_data_extra_field(self, enable_milvus_local_api): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, enable_dynamic_field=False) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"Attempt to insert an unexpected field " f"to collection without enabling dynamic field"} client_w.upsert(client, collection_name, data=rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_data_dim_not_match(self, enable_milvus_local_api): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [ {default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim + 1))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 65536, ct.err_msg: f"of float data should divide the dim({default_dim})"} client_w.upsert(client, collection_name, data=rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_not_matched_data(self, enable_milvus_local_api): """ target: test milvus client: insert not matched data then defined method: insert string to int primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [ {default_primary_key_field_name: str(i), default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 1, ct.err_msg: f"The Input data type is inconsistent with defined schema, " f"please check it."} client_w.upsert(client, collection_name, data=rows, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("partition_name", ["12-s", "12 s", "(mn)", "中文", "%$#", " "]) def test_milvus_client_upsert_invalid_partition_name(self, partition_name): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 65535, ct.err_msg: f"Invalid partition name: {partition_name}. The first character of " f"a partition name must be an underscore or letter."} client_w.upsert(client, collection_name, data=rows, partition_name=partition_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_upsert_not_exist_partition_name(self, enable_milvus_local_api): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] partition_name = cf.gen_unique_str("partition_not_exist") error = {ct.err_code: 200, ct.err_msg: f"partition not found[partition={partition_name}]"} client_w.upsert(client, collection_name, data=rows, partition_name=partition_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_upsert_collection_partition_not_match(self, enable_milvus_local_api): """ target: test milvus client: insert extra field than schema method: insert extra field than schema when enable_dynamic_field is False expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) another_collection_name = cf.gen_unique_str(prefix + "another") partition_name = cf.gen_unique_str("partition") # 1. create collection client_w.create_collection(client, collection_name, default_dim) client_w.create_collection(client, another_collection_name, default_dim) client_w.create_partition(client, another_collection_name, partition_name) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] error = {ct.err_code: 200, ct.err_msg: f"partition not found[partition={partition_name}]"} client_w.upsert(client, collection_name, data=rows, partition_name=partition_name, check_task=CheckTasks.err_res, check_items=error) class TestMilvusClientUpsertValid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L0) def test_milvus_client_upsert_default(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") collections = client_w.list_collections(client)[0] assert collection_name in collections client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": default_dim, "consistency_level": 0}) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] results = client_w.upsert(client, collection_name, rows)[0] assert results['upsert_count'] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 4. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.release_collection(client, collection_name) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_upsert_empty_data(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert rows = [] results = client_w.upsert(client, collection_name, rows)[0] assert results['upsert_count'] == 0 # 3. search rng = np.random.default_rng(seed=19530) vectors_to_search = rng.random((1, default_dim)) client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": [], "limit": 0}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_upsert_partition(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) partition_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. create partition client_w.create_partition(client, collection_name, partition_name) partitions = client_w.list_partitions(client, collection_name)[0] assert partition_name in partitions index = client_w.list_indexes(client, collection_name)[0] assert index == ['vector'] # load_state = client_w.get_load_state(collection_name)[0] rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] # 3. upsert to default partition results = client_w.upsert(client, collection_name, rows, partition_name=partitions[0])[0] assert results['upsert_count'] == default_nb # 4. upsert to non-default partition results = client_w.upsert(client, collection_name, rows, partition_name=partition_name)[0] assert results['upsert_count'] == default_nb # 5. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # partition_number = client_w.get_partition_stats(client, collection_name, "_default")[0] # assert partition_number == default_nb # partition_number = client_w.get_partition_stats(client, collection_name, partition_name)[0] # assert partition_number[0]['value'] == 0 if client_w.has_partition(client, collection_name, partition_name)[0]: client_w.release_partitions(client, collection_name, partition_name) client_w.drop_partition(client, collection_name, partition_name) if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_insert_upsert(self, enable_milvus_local_api): """ target: test fast create collection normal case method: create collection expected: create collection with default schema, index, and load successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) partition_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. create partition client_w.create_partition(client, collection_name, partition_name) partitions = client_w.list_partitions(client, collection_name)[0] assert partition_name in partitions index = client_w.list_indexes(client, collection_name)[0] assert index == ['vector'] # load_state = client_w.get_load_state(collection_name)[0] # 3. insert and upsert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] results = client_w.insert(client, collection_name, rows, partition_name=partition_name)[0] assert results['insert_count'] == default_nb rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, "new_diff_str_field": str(i)} for i in range(default_nb)] results = client_w.upsert(client, collection_name, rows, partition_name=partition_name)[0] assert results['upsert_count'] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) if client_w.has_partition(client, collection_name, partition_name)[0]: client_w.release_partitions(client, collection_name, partition_name) client_w.drop_partition(client, collection_name, partition_name) if client_w.has_collection(client, collection_name)[0]: client_w.drop_collection(client, collection_name) ================================================ FILE: tests/milvus_lite/test_milvus_lite_migrate.py ================================================ import json import random import time from multiprocessing import Process import numpy as np from pymilvus import ( connections, utility, FieldSchema, CollectionSchema, DataType, Collection, ) from pymilvus.client.types import LoadState import pytest import os from base.client_base import TestcaseBase from common.common_type import CaseLabel, CheckTasks from base.high_level_api_wrapper import HighLevelApiWrapper from common import common_type as ct client_w = HighLevelApiWrapper() prefix = "milvus_lite_migrate" default_dim = ct.default_dim default_primary_key_field_name = "id" default_vector_field_name = "vector" default_float_field_name = ct.default_float_field_name default_bool_field_name = ct.default_bool_field_name # default_nb = ct.default_nb default_limit = ct.default_limit default_nq = ct.default_nq default_string_field_name = ct.default_string_field_name default_int32_array_field_name = ct.default_int32_array_field_name c_name = "coll_migrate_1" d_file = f"local_migrate_case_test.db" class TestMilvusLiteMigrate(TestcaseBase): """ 1. create collection for data preparation after normal search 2. dump to json file 3. verify that the key in the generated json file matches the schema """ @pytest.mark.tags(CaseLabel.L2) def test_milvus_lite_migrate_json_file(self): num_entities, dim = 3000, 8 connections.connect("default", uri=d_file) fields = [ FieldSchema(name="random", dtype=DataType.DOUBLE), FieldSchema(name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=False, max_length=100), FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim) ] schema = CollectionSchema(fields, "collection is the simplest demo to introduce the APIs") hello_milvus = Collection(c_name, schema) rng = np.random.default_rng(seed=19530) entities = [ # provide the pk field because `auto_id` is set to False rng.random(num_entities).tolist(), # field random, only supports list [str(i) for i in range(num_entities)], rng.random((num_entities, dim)), # field embeddings, supports numpy.ndarray and list ] insert_result = hello_milvus.insert(entities) index = { "index_type": "FLAT", "metric_type": "L2", "params": {"nlist": 128}, } hello_milvus.create_index("embeddings", index) hello_milvus.load() assert utility.load_state(c_name) == LoadState.Loaded vectors_to_search = entities[-1][-2:] search_params = { "metric_type": "L2", "params": {"nprobe": 10}, } result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3, output_fields=["random"]) for hits in result: for hit in hits: print(f"hit: {hit}, random field: {hit.entity.get('random')}") result = hello_milvus.query(expr="random > 0.5", output_fields=["random", "embeddings"]) r1 = hello_milvus.query(expr="random > 0.5", limit=4, output_fields=["random"]) r2 = hello_milvus.query(expr="random > 0.5", offset=1, limit=3, output_fields=["random"]) result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3, expr="random > 0.5", output_fields=["random"]) ids = insert_result.primary_keys expr = f'pk in ["{ids[0]}" , "{ids[1]}"]' result = hello_milvus.query(expr=expr, output_fields=["random", "embeddings"]) @pytest.mark.tags(CaseLabel.L2) def test_check_json_file_key(self): """ pytest test_milvus_lite_migrate.py::TestMilvusLiteMigrate::test_check_json_file_key -s To check whether the data export is working properly using the above command, start a new command line """ command = f"milvus-lite dump -d ./{d_file} -c {c_name} -p ./data_json" os.system(command) time.sleep(3) dir = os.popen("ls data_json/").read() dir = dir.replace("\n", "") with open(f'data_json/{dir}/1.json') as user_file: file_contents = user_file.read() parsed_json = json.loads(file_contents) os.popen("rm -rf data_json") keys = parsed_json["rows"][0].keys() assert list(keys) == ['random', 'pk', 'embeddings'] ================================================ FILE: tests/milvus_lite/test_milvus_lite_query.py ================================================ import multiprocessing import numbers import random import numpy import threading import pytest import pandas as pd import decimal from decimal import Decimal, getcontext from time import sleep import heapq from base.client_base import TestcaseBase from utils.util_log import test_log as log from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks from utils.util_pymilvus import * from common.constants import * from pymilvus.orm.types import CONSISTENCY_STRONG, CONSISTENCY_BOUNDED, CONSISTENCY_SESSION, CONSISTENCY_EVENTUALLY from base.high_level_api_wrapper import HighLevelApiWrapper client_w = HighLevelApiWrapper() prefix = "milvus_client_api_query" epsilon = ct.epsilon default_nb = ct.default_nb default_nb_medium = ct.default_nb_medium default_nq = ct.default_nq default_dim = ct.default_dim default_limit = ct.default_limit default_search_exp = "id >= 0" exp_res = "exp_res" default_search_string_exp = "varchar >= \"0\"" default_search_mix_exp = "int64 >= 0 && varchar >= \"0\"" default_invaild_string_exp = "varchar >= 0" default_json_search_exp = "json_field[\"number\"] >= 0" perfix_expr = 'varchar like "0%"' default_search_field = ct.default_float_vec_field_name default_search_params = ct.default_search_params default_primary_key_field_name = "id" default_vector_field_name = "vector" default_float_field_name = ct.default_float_field_name default_bool_field_name = ct.default_bool_field_name default_string_field_name = ct.default_string_field_name default_int32_array_field_name = ct.default_int32_array_field_name default_string_array_field_name = ct.default_string_array_field_name class TestMilvusClientQueryInvalid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_query_not_all_required_params(self, enable_milvus_local_api): """ target: test query (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") collections = client_w.list_collections(client)[0] assert collection_name in collections client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": default_dim, "consistency_level": 0}) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 3. query using ids error = {ct.err_code: 65535, ct.err_msg: f"empty expression should be used with limit"} client_w.query(client, collection_name, check_task=CheckTasks.err_res, check_items=error) class TestMilvusClientQueryValid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_query_default(self, enable_milvus_local_api): """ target: test query (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 3. query using ids client_w.query(client, collection_name, ids=[i for i in range(default_nb)], check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) # 4. query using filter client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_query_output_fields(self, enable_milvus_local_api): """ target: test query (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 3. query using ids client_w.query(client, collection_name, ids=[i for i in range(default_nb)], check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) # 4. query using filter res = client_w.query(client, collection_name, filter=default_search_exp, output_fields=[default_primary_key_field_name, default_float_field_name, default_string_field_name, default_vector_field_name], check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name})[0] assert set(res[0].keys()) == {default_primary_key_field_name, default_vector_field_name, default_float_field_name, default_string_field_name} client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_query_output_fields_all(self, enable_milvus_local_api): """ target: test query (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 3. query using ids client_w.query(client, collection_name, ids=[i for i in range(default_nb)], check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) # 4. query using filter res = client_w.query(client, collection_name, filter=default_search_exp, output_fields=["*"], check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name})[0] assert set(res[0].keys()) == {default_primary_key_field_name, default_vector_field_name, default_float_field_name, default_string_field_name} client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_query_limit(self, enable_milvus_local_api): """ target: test query (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 3. query using ids limit = 5 client_w.query(client, collection_name, ids=[i for i in range(default_nb)], limit=limit, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[:limit], "with_vec": True, "primary_field": default_primary_key_field_name[:limit]}) # 4. query using filter client_w.query(client, collection_name, filter=default_search_exp, limit=limit, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[:limit], "with_vec": True, "primary_field": default_primary_key_field_name[:limit]})[0] client_w.drop_collection(client, collection_name) class TestMilvusClientGetInvalid(TestcaseBase): """ Test case of search interface """ """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#", "".join("a" for i in range(ct.max_name_length + 1))]) def test_milvus_client_get_invalid_collection_name(self, name, enable_milvus_local_api): """ target: test get interface invalid cases method: invalid collection name expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows)[0] pks = [i for i in range(default_nb)] # 3. get first primary key error = {ct.err_code: 1100, ct.err_msg: f"Invalid collection name"} client_w.get(client, name, ids=pks[0:1], check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_get_not_exist_collection_name(self, enable_milvus_local_api): """ target: test get interface invalid cases method: invalid collection name expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows)[0] pks = [i for i in range(default_nb)] # 3. get first primary key name = "invalid" error = {ct.err_code: 100, ct.err_msg: f"can't find collection[database=default][collection={name}]"} client_w.get(client, name, ids=pks[0:1], check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("invalid_ids",["中文", "%$#"]) def test_milvus_client_get_invalid_ids(self, invalid_ids, enable_milvus_local_api): """ target: test get interface invalid cases method: invalid collection name expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows)[0] # 3. get first primary key error = {ct.err_code: 1100, ct.err_msg: f"cannot parse expression"} client_w.get(client, collection_name, ids=invalid_ids, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) class TestMilvusClientGetValid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_get_normal(self, enable_milvus_local_api): """ target: test get interface method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows)[0] pks = [i for i in range(default_nb)] # 3. get first primary key first_pk_data = client_w.get(client, collection_name, ids=pks[0:1])[0] assert len(first_pk_data) == len(pks[0:1]) first_pk_data_1 = client_w.get(client, collection_name, ids=0)[0] assert first_pk_data == first_pk_data_1 client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_get_output_fields(self, enable_milvus_local_api): """ target: test get interface with output fields method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows)[0] pks = [i for i in range(default_nb)] # 3. get first primary key output_fields_array = [default_primary_key_field_name, default_vector_field_name, default_float_field_name, default_string_field_name] first_pk_data = client_w.get(client, collection_name, ids=pks[0:1], output_fields=output_fields_array)[0] assert len(first_pk_data) == len(pks[0:1]) assert len(first_pk_data[0]) == len(output_fields_array) first_pk_data_1 = client_w.get(client, collection_name, ids=0, output_fields=output_fields_array)[0] assert first_pk_data == first_pk_data_1 assert len(first_pk_data_1[0]) == len(output_fields_array) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip(reason="pymilvus issue 2056") def test_milvus_client_get_normal_string(self, enable_milvus_local_api): """ target: test get interface for string field method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, id_type="string", max_length=ct.default_length) # 2. insert rng = np.random.default_rng(seed=19530) rows = [ {default_primary_key_field_name: str(i), default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows)[0] pks = [str(i) for i in range(default_nb)] # 3. get first primary key first_pk_data = client_w.get(client, collection_name, ids=pks[0:1])[0] assert len(first_pk_data) == len(pks[0:1]) first_pk_data_1 = client_w.get(client, collection_name, ids="0")[0] assert first_pk_data == first_pk_data_1 client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip(reason="pymilvus issue 2056") def test_milvus_client_get_normal_string_output_fields(self, enable_milvus_local_api): """ target: test get interface for string field method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, id_type="string", max_length=ct.default_length) # 2. insert rng = np.random.default_rng(seed=19530) rows = [ {default_primary_key_field_name: str(i), default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows)[0] pks = [str(i) for i in range(default_nb)] # 3. get first primary key output_fields_array = [default_primary_key_field_name, default_vector_field_name, default_float_field_name, default_string_field_name] first_pk_data = client_w.get(client, collection_name, ids=pks[0:1], output_fields=output_fields_array)[0] assert len(first_pk_data) == len(pks[0:1]) assert len(first_pk_data[0]) == len(output_fields_array) first_pk_data_1 = client_w.get(client, collection_name, ids="0", output_fields=output_fields_array)[0] assert first_pk_data == first_pk_data_1 assert len(first_pk_data_1[0]) == len(output_fields_array) client_w.drop_collection(client, collection_name) ================================================ FILE: tests/milvus_lite/test_milvus_lite_search.py ================================================ import math import multiprocessing import numbers import random import numpy import threading import numpy as np import pytest import pandas as pd import decimal from decimal import Decimal, getcontext from time import sleep import heapq from base.client_base import TestcaseBase from utils.util_log import test_log as log from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks from utils.util_pymilvus import * from common.constants import * from pymilvus.orm.types import CONSISTENCY_STRONG, CONSISTENCY_BOUNDED, CONSISTENCY_SESSION, CONSISTENCY_EVENTUALLY from base.high_level_api_wrapper import HighLevelApiWrapper from pymilvus import AnnSearchRequest, RRFRanker, WeightedRanker prefix = "milvus_client_api_search" epsilon = ct.epsilon default_nb = ct.default_nb default_nb_medium = ct.default_nb_medium default_nq = ct.default_nq default_dim = ct.default_dim default_limit = ct.default_limit default_search_exp = "id >= 0" default_expr = "int64 >= 0" exp_res = "exp_res" default_search_string_exp = "varchar >= \"0\"" default_search_mix_exp = "int64 >= 0 && varchar >= \"0\"" default_invaild_string_exp = "varchar >= 0" default_json_search_exp = "json_field[\"number\"] >= 0" perfix_expr = 'varchar like "0%"' default_search_field = ct.default_float_vec_field_name default_search_params = ct.default_search_params default_primary_key_field_name = "id" default_vector_field_name = "vector" default_float_field_name = ct.default_float_field_name default_bool_field_name = ct.default_bool_field_name default_string_field_name = ct.default_string_field_name default_int32_array_field_name = ct.default_int32_array_field_name default_string_array_field_name = ct.default_string_array_field_name default_int64_field_name = ct.default_int64_field_name max_hybrid_search_req_num = ct.max_hybrid_search_req_num default_json_field_name = ct.default_json_field_name hybrid_search_epsilon = 0.01 nq = 1 min_dim = ct.min_dim max_limit = ct.max_limit client_w = HighLevelApiWrapper() class TestMilvusClientSearchInvalid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_collection_invalid_primary_field(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with invalid primary field expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection error = {ct.err_code: 1, ct.err_msg: f"Param id_type must be int or string"} client_w.create_collection(client, collection_name, default_dim, id_type="invalid", check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_collection_string_auto_id(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with auto id on string primary key expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection error = {ct.err_code: 65535, ct.err_msg: f"type param(max_length) should be specified for varChar " f"field of collection {collection_name}"} client_w.create_collection(client, collection_name, default_dim, id_type="string", auto_id=True, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_create_same_collection_different_params(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create expected: 1. Successfully to create collection with same params 2. Report errors for creating collection with same name and different params """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. create collection with same params client_w.create_collection(client, collection_name, default_dim) # 3. create collection with same name and different params error = {ct.err_code: 1, ct.err_msg: f"create duplicate collection with different parameters, " f"collection: {collection_name}"} client_w.create_collection(client, collection_name, default_dim + 1, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_collection_invalid_metric_type(self, enable_milvus_local_api): """ target: test high level api: client.create_collection method: create collection with auto id on string primary key expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection error = {ct.err_code: 1100, ct.err_msg: "metric type not found or not supported, supported: [L2 IP COSINE HAMMING JACCARD]"} client_w.create_collection(client, collection_name, default_dim, metric_type="invalid", check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("https://github.com/milvus-io/milvus/issues/29880") def test_milvus_client_search_not_consistent_metric_type(self, enable_milvus_local_api, metric_type): """ target: test search with inconsistent metric type (default is IP) with that of index method: create connection, collection, insert and search with not consistent metric type expected: Raise exception """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. search rng = np.random.default_rng(seed=19530) vectors_to_search = rng.random((1, 8)) search_params = {"metric_type": metric_type} error = {ct.err_code: 1100, ct.err_msg: f"metric type not match: invalid parameter[expected=IP][actual={metric_type}]"} client_w.search(client, collection_name, vectors_to_search, limit=default_limit, search_params=search_params, check_task=CheckTasks.err_res, check_items=error) client_w.drop_collection(client, collection_name) class TestMilvusClientSearchValid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=["COSINE", "L2"]) def metric_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_search_query_default(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) client_w.using_database(client, "default") # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") collections = client_w.list_collections(client)[0] assert collection_name in collections client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": default_dim, "consistency_level": 0}) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) # client_w.flush(client, collection_name) # assert client_w.num_entities(client, collection_name)[0] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 4. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.release_collection(client, collection_name) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_rename_search_query_default(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") collections = client_w.list_collections(client)[0] assert collection_name in collections client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": default_dim, "consistency_level": 0}) old_name = collection_name new_name = collection_name + "new" client_w.rename_collection(client, old_name, new_name) # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, new_name, rows) # client_w.flush(client, collection_name) # assert client_w.num_entities(client, collection_name)[0] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, new_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) # 4. query client_w.query(client, new_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.release_collection(client, new_name) client_w.drop_collection(client, new_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_array_insert_search(self, enable_milvus_local_api): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") collections = client_w.list_collections(client)[0] assert collection_name in collections # 2. insert rng = np.random.default_rng(seed=19530) rows = [{ default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_int32_array_field_name: [i, i + 1, i + 2], default_string_array_field_name: [str(i), str(i + 1), str(i + 2)] } for i in range(default_nb)] client_w.insert(client, collection_name, rows) # 3. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_search_query_string(self, enable_milvus_local_api): """ target: test search (high level api) for string primary key method: create connection, collection, insert and search expected: search/query successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, id_type="string", max_length=ct.default_length) client_w.describe_collection(client, collection_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": collection_name, "dim": default_dim, "auto_id": auto_id}) # 2. insert rng = np.random.default_rng(seed=19530) rows = [ {default_primary_key_field_name: str(i), default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] client_w.insert(client, collection_name, rows) client_w.flush(client, collection_name) assert client_w.num_entities(client, collection_name)[0] == default_nb # 3. search vectors_to_search = rng.random((1, default_dim)) client_w.search(client, collection_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "limit": default_limit}) # 4. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows, "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_search_different_metric_types_not_specifying_in_search_params(self, enable_milvus_local_api, metric_type, auto_id): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search successfully with limit(topK) """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, metric_type=metric_type, auto_id=auto_id, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] if auto_id: for row in rows: row.pop(default_primary_key_field_name) client_w.insert(client, collection_name, rows) # 3. search vectors_to_search = rng.random((1, default_dim)) # search_params = {"metric_type": metric_type} client_w.search(client, collection_name, vectors_to_search, limit=default_limit, output_fields=[default_primary_key_field_name], check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "limit": default_limit}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L2) def test_milvus_client_search_different_metric_types_specifying_in_search_params(self, enable_milvus_local_api, metric_type, auto_id): """ target: test search (high level api) normal case method: create connection, collection, insert and search expected: search successfully with limit(topK) """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, metric_type=metric_type, auto_id=auto_id, consistency_level="Strong") # 2. insert rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] if auto_id: for row in rows: row.pop(default_primary_key_field_name) client_w.insert(client, collection_name, rows) # 3. search vectors_to_search = rng.random((1, default_dim)) search_params = {"metric_type": metric_type} client_w.search(client, collection_name, vectors_to_search, limit=default_limit, search_params=search_params, output_fields=[default_primary_key_field_name], check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "limit": default_limit}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_ids(self, enable_milvus_local_api): """ target: test delete (high level api) method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] pks = client_w.insert(client, collection_name, rows)[0] # 3. delete delete_num = 3 client_w.delete(client, collection_name, ids=[i for i in range(delete_num)]) # 4. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] for insert_id in range(delete_num): if insert_id in insert_ids: insert_ids.remove(insert_id) limit = default_nb - delete_num client_w.search(client, collection_name, vectors_to_search, limit=default_nb, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": limit}) # 5. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[delete_num:], "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_delete_with_filters(self, enable_milvus_local_api): """ target: test delete (high level api) method: create connection, collection, insert delete, and search expected: search/query successfully without deleted data """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim, consistency_level="Strong") # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] pks = client_w.insert(client, collection_name, rows)[0] # 3. delete delete_num = 3 client_w.delete(client, collection_name, filter=f"id < {delete_num}") # 4. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] for insert_id in range(delete_num): if insert_id in insert_ids: insert_ids.remove(insert_id) limit = default_nb - delete_num client_w.search(client, collection_name, vectors_to_search, limit=default_nb, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": limit}) # 5. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[delete_num:], "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) class TestCollectionHybridSearchValid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=[1, 10]) def nq(self, request): yield request.param @pytest.fixture(scope="function", params=[default_nb_medium]) def nb(self, request): yield request.param @pytest.fixture(scope="function", params=[32, 128]) def dim(self, request): yield request.param @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.fixture(scope="function", params=[False, True]) def _async(self, request): yield request.param @pytest.fixture(scope="function", params=["JACCARD", "HAMMING"]) def metrics(self, request): yield request.param @pytest.fixture(scope="function", params=[False, True]) def is_flush(self, request): yield request.param @pytest.fixture(scope="function", params=[True, False]) def enable_dynamic_field(self, request): yield request.param @pytest.fixture(scope="function", params=["IP", "COSINE", "L2"]) def metric_type(self, request): yield request.param @pytest.fixture(scope="function", params=[True, False]) def random_primary_key(self, request): yield request.param @pytest.fixture(scope="function", params=["FLOAT_VECTOR", "FLOAT16_VECTOR", "BFLOAT16_VECTOR"]) def vector_data_type(self, request): yield request.param """ ****************************************************************** # The following are valid base cases for hybrid_search ****************************************************************** """ @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("nq", [16384]) def test_hybrid_search_normal_max_nq(self, nq, enable_milvus_local_api): """ target: test hybrid search normal case method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = self.init_collection_general(prefix, True)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [1] vectors = cf.gen_vectors_based_on_vector_type(nq, default_dim, "FLOAT_VECTOR") # 4. get hybrid search req list for i in range(len(vector_name_list)): search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 5. hybrid search hybrid_res = collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip(reason="issue 32288") @pytest.mark.parametrize("nq", [0, 16385]) def test_hybrid_search_normal_over_max_nq(self, nq): """ target: test hybrid search normal case method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data collection_w = self.init_collection_general(prefix, True)[0] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [1] vectors = cf.gen_vectors_based_on_vector_type(nq, default_dim, "FLOAT_VECTOR") # 4. get hybrid search req list for i in range(len(vector_name_list)): search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 5. hybrid search err_msg = "nq (number of search vector per search request) should be in range [1, 16384]" collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit, check_task=CheckTasks.err_res, check_items={"err_code": 65535, "err_msg": err_msg}) @pytest.mark.tags(CaseLabel.L1) def test_hybrid_search_no_limit(self): """ target: test hybrid search with no limit method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data multiple_dim_array = [default_dim, default_dim] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params vectors = cf.gen_vectors_based_on_vector_type(nq, default_dim, "FLOAT_VECTOR") # get hybrid search req list search_param = { "data": vectors, "anns_field": vector_name_list[0], "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_WeightedRanker_empty_reqs(self, primary_field): """ target: test hybrid search normal case method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, primary_field=primary_field, multiple_dim_array=[default_dim, default_dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. hybrid search with empty reqs collection_w.hybrid_search([], WeightedRanker(), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": 0}) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip(reason="issue 29839") @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_as_search(self, nq, primary_field, is_flush): """ target: test hybrid search to search as the original search interface method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK), and the result should be equal to search """ # 1. initialize collection with data dim = 3 collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_flush=is_flush, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=[dim, dim])[0:5] vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) vectors = [[random.random() for _ in range(dim)] for _ in range(nq)] for search_field in vector_name_list: # 2. prepare search params req_list = [] search_param = { "data": vectors, "anns_field": search_field, "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 3. hybrid search hybrid_res = collection_w.hybrid_search(req_list, WeightedRanker(1), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] search_res = collection_w.search(vectors[:nq], search_field, default_search_params, default_limit, default_search_exp, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] # 4. the effect of hybrid search to one field should equal to search log.info("The distance list is:\n") for i in range(nq): log.info(hybrid_res[0].distances) log.info(search_res[0].distances) assert hybrid_res[i].ids == search_res[i].ids @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_different_metric_type(self, nq, primary_field, is_flush, metric_type): """ target: test hybrid search for fields with different metric type method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 128 collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_flush=is_flush, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=[dim, dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] for vector_name in vector_name_list: search_param = { "data": [[random.random() for _ in range(dim)] for _ in range(nq)], "anns_field": vector_name, "param": {"metric_type": metric_type, "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9, 1), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_different_metric_type_each_field(self, nq, primary_field, is_flush, metric_type): """ target: test hybrid search for fields with different metric type method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 91 collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_flush=is_flush, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=[dim, dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": "L2"} collection_w.create_index(vector_name_list[0], flat_index) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": "IP"} collection_w.create_index(vector_name_list[1], flat_index) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": "COSINE"} collection_w.create_index(vector_name_list[2], flat_index) collection_w.load() # 3. prepare search params req_list = [] search_param = { "data": [[random.random() for _ in range(dim)] for _ in range(nq)], "anns_field": vector_name_list[0], "param": {"metric_type": "L2", "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) search_param = { "data": [[random.random() for _ in range(dim)] for _ in range(nq)], "anns_field": vector_name_list[1], "param": {"metric_type": "IP", "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) search_param = { "data": [[random.random() for _ in range(dim)] for _ in range(nq)], "anns_field": vector_name_list[2], "param": {"metric_type": "COSINE", "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search hybrid_search = collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9, 1), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_different_dim(self, nq, primary_field, metric_type): """ target: test hybrid search for fields with different dim method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ default_limit = 100 # 1. initialize collection with data dim = 121 multiple_dim_array = [dim + dim, dim - 10] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] for i in range(len(vector_name_list)): search_param = { "data": [[random.random() for _ in range(multiple_dim_array[i])] for _ in range(nq)], "anns_field": vector_name_list[i], "param": {"metric_type": metric_type, "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search hybrid_search_0 = collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] hybrid_search_1 = collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] for i in range(nq): assert hybrid_search_0[i].ids == hybrid_search_1[i].ids assert hybrid_search_0[i].distances == hybrid_search_1[i].distances @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_overall_limit_larger_sum_each_limit(self, nq, primary_field, metric_type): """ target: test hybrid search: overall limit which is larger than sum of each limit method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 200 multiple_dim_array = [dim + dim, dim - 10] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] id_list_nq = [] vectors = [] default_search_params = {"metric_type": metric_type, "offset": 0} for i in range(len(vector_name_list)): vectors.append([]) for i in range(nq): id_list_nq.append([]) for k in range(nq): for i in range(len(vector_name_list)): vectors_search = [random.random() for _ in range(multiple_dim_array[i])] vectors[i].append(vectors_search) default_search_exp = "int64 >= 0" # 4. search for the comparision for hybrid search for i in range(len(vector_name_list)): search_res = collection_w.search(vectors[i], vector_name_list[i], default_search_params, default_limit, default_search_exp, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] for k in range(nq): id_list_nq[k].extend(search_res[k].ids) # 5. prepare hybrid search params for i in range(len(vector_name_list)): search_param = { "data": vectors[i], "anns_field": vector_name_list[i], "param": default_search_params, "limit": default_limit, "expr": default_search_exp} req = AnnSearchRequest(**search_param) req_list.append(req) # 6. hybrid search hybrid_search = \ collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9), default_limit * len(req_list) + 1)[0] assert len(hybrid_search) == nq for i in range(nq): assert len(hybrid_search[i].ids) == len(list(set(id_list_nq[i]))) assert set(hybrid_search[i].ids) == set(id_list_nq[i]) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_overall_different_limit(self, primary_field, metric_type): """ target: test hybrid search with different limit params method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 100 multiple_dim_array = [dim + dim, dim - 10] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] for i in range(len(vector_name_list)): search_param = { "data": [[random.random() for _ in range(multiple_dim_array[i])] for _ in range(nq)], "anns_field": vector_name_list[i], "param": {"metric_type": metric_type, "offset": 0}, "limit": default_limit - i, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_min_limit(self, primary_field, metric_type): """ target: test hybrid search with minimum limit params method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 99 multiple_dim_array = [dim + dim, dim - 10] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] id_list = [] for i in range(len(vector_name_list)): vectors = [[random.random() for _ in range(multiple_dim_array[i])] for _ in range(1)] search_params = {"metric_type": metric_type, "offset": 0} search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": search_params, "limit": min_dim, "expr": default_expr} req = AnnSearchRequest(**search_param) req_list.append(req) search_res = collection_w.search(vectors[:1], vector_name_list[i], search_params, min_dim, default_expr, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": min_dim})[0] id_list.extend(search_res[0].ids) # 4. hybrid search hybrid_search = collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9), default_limit)[0] assert len(hybrid_search) == 1 assert len(hybrid_search[0].ids) == len(list(set(id_list))) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_max_limit(self, primary_field, metric_type): """ target: test hybrid search with maximum limit params method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 66 multiple_dim_array = [dim + dim, dim - 10] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] for i in range(len(vector_name_list)): search_param = { "data": [[random.random() for _ in range(multiple_dim_array[i])] for _ in range(nq)], "anns_field": vector_name_list[i], "param": {"metric_type": metric_type}, "limit": 16384, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_max_min_limit(self, primary_field, metric_type): """ target: test hybrid search with maximum and minimum limit params method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 66 multiple_dim_array = [dim + dim, dim - 10] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] for i in range(len(vector_name_list)): limit = max_limit if i == 1: limit = 1 search_param = { "data": [[random.random() for _ in range(multiple_dim_array[i])] for _ in range(nq)], "anns_field": vector_name_list[i], "param": {"metric_type": metric_type}, "limit": limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_same_anns_field(self, primary_field, metric_type): """ target: test hybrid search: multiple search on same anns field method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 55 multiple_dim_array = [dim, dim] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] for i in range(len(vector_name_list)): search_param = { "data": [[random.random() for _ in range(multiple_dim_array[i])] for _ in range(nq)], "anns_field": vector_name_list[0], "param": {"metric_type": metric_type, "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_different_offset_single_field(self, primary_field, is_flush, metric_type): """ target: test hybrid search for fields with different offset method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 100 collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, auto_id=False, dim=dim, is_flush=is_flush, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=[dim, dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] for i in range(len(vector_name_list)): search_param = { "data": [[random.random() for _ in range(dim)] for _ in range(nq)], "anns_field": vector_name_list[i], "param": {"metric_type": metric_type, "offset": i}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search collection_w.hybrid_search(req_list, WeightedRanker(0.1, 0.9, 1), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_max_reqs_num(self, primary_field): """ target: test hybrid search with maximum reqs number method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 128 multiple_dim_array = [dim, dim] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=dim, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": "COSINE"} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() reqs_max_num = max_hybrid_search_req_num # 3. prepare search params req_list = [] for i in range(reqs_max_num): search_param = { "data": [[random.random() for _ in range(dim)] for _ in range(1)], "anns_field": default_search_field, "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) weights = [random.random() for _ in range(len(req_list))] log.info(weights) # 4. hybrid search collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_WeightedRanker_different_parameters(self, primary_field, is_flush, metric_type): """ target: test hybrid search for fields with different offset method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data dim = 63 collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, auto_id=True, dim=dim, is_flush=is_flush, is_index=False, primary_field=primary_field, enable_dynamic_field=False, multiple_dim_array=[dim, dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": metric_type} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.load() # 3. prepare search params req_list = [] for i in range(len(vector_name_list)): search_param = { "data": [[random.random() for _ in range(dim)] for _ in range(1)], "anns_field": vector_name_list[i], "param": {"metric_type": metric_type, "offset": i}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search collection_w.hybrid_search(req_list, WeightedRanker(0.2, 0.03, 0.9), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) def test_hybrid_search_invalid_WeightedRanker_params(self): """ target: test hybrid search with invalid params type to WeightedRanker method: create connection, collection, insert and search expected: raise exception """ # 1. initialize collection with data multiple_dim_array = [default_dim, default_dim] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=default_dim, is_index=False, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": "COSINE"} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() reqs_num = 2 # 3. prepare search params req_list = [] for i in range(reqs_num): search_param = { "data": [[random.random() for _ in range(default_dim)] for _ in range(1)], "anns_field": default_search_field, "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search with list in WeightedRanker error = {"err_code": 1100, "err_msg": "The type of rank param weight should be float: invalid parameter"} collection_w.hybrid_search(req_list, WeightedRanker([0.9, 0.1]), default_limit, check_task=CheckTasks.err_res, check_items=error) # @pytest.mark.tags(CaseLabel.L2) # def test_hybrid_search_over_maximum_reqs_num(self): # """ # target: test hybrid search over maximum reqs number # method: create connection, collection, insert and search # expected: raise exception # """ # # 1. initialize collection with data # multiple_dim_array = [default_dim, default_dim] # collection_w, _, _, insert_ids, time_stamp = \ # self.init_collection_general(prefix, True, dim=default_dim, is_index=False, # multiple_dim_array=multiple_dim_array)[0:5] # # 2. extract vector field name # vector_name_list = cf.extract_vector_field_name_list(collection_w) # flat_index = {"index_type": "FLAT", "params": {}, "metric_type": "COSINE"} # for vector_name in vector_name_list: # collection_w.create_index(vector_name, flat_index) # collection_w.create_index(ct.default_float_vec_field_name, flat_index) # collection_w.load() # reqs_max_num = max_hybrid_search_req_num + 1 # # 3. prepare search params # req_list = [] # for i in range(reqs_max_num): # search_param = { # "data": [[random.random() for _ in range(default_dim)] for _ in range(1)], # "anns_field": default_search_field, # "param": {"metric_type": "COSINE"}, # "limit": default_limit, # "expr": "int64 > 0"} # req = AnnSearchRequest(**search_param) # req_list.append(req) # weights = [random.random() for _ in range(len(req_list))] # log.info(weights) # # 4. hybrid search # collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit,) # # check_task=CheckTasks.err_res, # # check_items={"err_code": 65535, # # "err_msg": 'maximum of ann search requests is 1024'}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_with_range_search(self, primary_field): """ target: test hybrid search with range search method: create connection, collection, insert and search expected: raise exception (not support yet) """ # 1. initialize collection with data multiple_dim_array = [default_dim, default_dim] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=default_dim, is_index=False, primary_field=primary_field, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) flat_index = {"index_type": "FLAT", "params": {}, "metric_type": "COSINE"} for vector_name in vector_name_list: collection_w.create_index(vector_name, flat_index) collection_w.create_index(ct.default_float_vec_field_name, flat_index) collection_w.load() reqs_max_num = 2 # 3. prepare search params req_list = [] for i in range(reqs_max_num): search_param = { "data": [[random.random() for _ in range(default_dim)] for _ in range(1)], "anns_field": default_search_field, "param": {"metric_type": "COSINE", "params": {"radius": 0, "range_filter": 1000}}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) weights = [random.random() for _ in range(len(req_list))] log.info(weights) # 4. hybrid search collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_RRFRanker_default_parameter(self, primary_field): """ target: test hybrid search with default value to RRFRanker method: create connection, collection, insert and search. Note: here the result check is through comparing the score, the ids could not be compared because the high probability of the same score, then the id is not fixed in the range of the same score expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=default_dim, primary_field=primary_field, multiple_dim_array=[default_dim, default_dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params for each vector field req_list = [] search_res_dict_array = [] for i in range(len(vector_name_list)): vectors = [[random.random() for _ in range(default_dim)] for _ in range(1)] search_res_dict = {} search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE", "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # search for get the base line of hybrid_search search_res = collection_w.search(vectors[:1], vector_name_list[i], default_search_params, default_limit, default_expr, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit})[0] ids = search_res[0].ids for j in range(len(ids)): search_res_dict[ids[j]] = 1 / (j + 60 + 1) search_res_dict_array.append(search_res_dict) # 4. calculate hybrid search base line for RRFRanker ids_answer, score_answer = cf.get_hybrid_search_base_results_rrf(search_res_dict_array) # 5. hybrid search hybrid_search_0 = collection_w.hybrid_search(req_list, RRFRanker(), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit})[0] # 6. compare results through the re-calculated distances for i in range(len(score_answer[:default_limit])): assert score_answer[i] - hybrid_search_0[0].distances[i] < hybrid_search_epsilon # 7. run hybrid search with the same parameters twice, and compare the results hybrid_search_1 = collection_w.hybrid_search(req_list, RRFRanker(), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit})[0] assert hybrid_search_0[0].ids == hybrid_search_1[0].ids assert hybrid_search_0[0].distances == hybrid_search_1[0].distances # @pytest.mark.tags(CaseLabel.L2) # @pytest.mark.parametrize("k", [1, 60, 1000, 16383]) # @pytest.mark.parametrize("offset", [0, 1, 5]) # @pytest.mark.skip("https://github.com/milvus-io/milvus/issues/32650") # def test_hybrid_search_RRFRanker_different_k(self, is_flush, k, offset): # """ # target: test hybrid search normal case # method: create connection, collection, insert and search. # Note: here the result check is through comparing the score, the ids could not be compared # because the high probability of the same score, then the id is not fixed in the range of # the same score # expected: hybrid search successfully with limit(topK) # """ # # 1. initialize collection with data # dim = 200 # collection_w, _, _, insert_ids, time_stamp = \ # self.init_collection_general(prefix, True, auto_id=False, dim=dim, is_flush=is_flush, # enable_dynamic_field=False, multiple_dim_array=[dim, dim])[0:5] # # 2. extract vector field name # vector_name_list = cf.extract_vector_field_name_list(collection_w) # vector_name_list.append(ct.default_float_vec_field_name) # # 3. prepare search params for each vector field # req_list = [] # search_res_dict_array = [] # for i in range(len(vector_name_list)): # vectors = [[random.random() for _ in range(dim)] for _ in range(1)] # search_res_dict = {} # search_param = { # "data": vectors, # "anns_field": vector_name_list[i], # "param": {"metric_type": "COSINE"}, # "limit": default_limit, # "expr": "int64 > 0"} # req = AnnSearchRequest(**search_param) # req_list.append(req) # # search for get the baseline of hybrid_search # search_res = collection_w.search(vectors[:1], vector_name_list[i], # default_search_params, default_limit, # default_search_exp, offset=0, # check_task=CheckTasks.check_search_results, # check_items={"nq": 1, # "ids": insert_ids, # "limit": default_limit})[0] # ids = search_res[0].ids # for j in range(len(ids)): # search_res_dict[ids[j]] = 1 / (j + k + 1) # search_res_dict_array.append(search_res_dict) # # 4. calculate hybrid search baseline for RRFRanker # ids_answer, score_answer = cf.get_hybrid_search_base_results_rrf(search_res_dict_array) # # 5. hybrid search # hybrid_res = collection_w.hybrid_search(req_list, RRFRanker(k), default_limit, # offset=offset, # check_task=CheckTasks.check_search_results, # check_items={"nq": 1, # "ids": insert_ids, # "limit": default_limit})[0] # # 6. compare results through the re-calculated distances # for i in range(len(score_answer[:default_limit])): # assert score_answer[i] - hybrid_res[0].distances[i] < hybrid_search_epsilon @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("offset", [0, 1, 5]) @pytest.mark.parametrize("rerank", [RRFRanker(), WeightedRanker(0.1, 0.9, 1)]) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_offset_inside_outside_params(self, primary_field, offset, rerank): """ target: test hybrid search with offset inside and outside params method: create connection, collection, insert and search. Note: here the result check is through comparing the score, the ids could not be compared because the high probability of the same score, then the id is not fixed in the range of the same score expected: hybrid search successfully with limit(topK), and the result should be the same """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, primary_field=primary_field, multiple_dim_array=[default_dim, default_dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) req_list = [] vectors_list = [] # 3. generate vectors for i in range(len(vector_name_list)): vectors = [[random.random() for _ in range(default_dim)] for _ in range(1)] vectors_list.append(vectors) # 4. prepare search params for each vector field for i in range(len(vector_name_list)): search_param = { "data": vectors_list[i], "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE", "offset": offset}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search with offset inside the params hybrid_res_inside = collection_w.hybrid_search(req_list, rerank, default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit})[0] # 5. hybrid search with offset parameter req_list = [] for i in range(len(vector_name_list)): search_param = { "data": vectors_list[i], "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) hybrid_res = collection_w.hybrid_search(req_list, rerank, default_limit - offset, offset=offset, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit - offset})[0] assert hybrid_res_inside[0].distances[offset:] == hybrid_res[0].distances @pytest.mark.tags(CaseLabel.L2) def test_hybrid_search_RRFRanker_empty_reqs(self): """ target: test hybrid search normal case method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, multiple_dim_array=[default_dim, default_dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. hybrid search with empty reqs collection_w.hybrid_search([], RRFRanker(), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": 0}) # @pytest.mark.tags(CaseLabel.L1) # @pytest.mark.parametrize("k", [0, 16385]) # @pytest.mark.skip(reason="issue #29867") # def test_hybrid_search_RRFRanker_k_out_of_range(self, k): # """ # target: test hybrid search with default value to RRFRanker # method: create connection, collection, insert and search. # Note: here the result check is through comparing the score, the ids could not be compared # because the high probability of the same score, then the id is not fixed in the range of # the same score # expected: hybrid search successfully with limit(topK) # """ # # 1. initialize collection with data # collection_w, _, _, insert_ids, time_stamp = \ # self.init_collection_general(prefix, True, dim=default_dim, # multiple_dim_array=[default_dim, default_dim])[0:5] # # 2. extract vector field name # vector_name_list = cf.extract_vector_field_name_list(collection_w) # vector_name_list.append(ct.default_float_vec_field_name) # # 3. prepare search params for each vector field # req_list = [] # search_res_dict_array = [] # for i in range(len(vector_name_list)): # vectors = [[random.random() for _ in range(default_dim)] for _ in range(1)] # search_res_dict = {} # search_param = { # "data": vectors, # "anns_field": vector_name_list[i], # "param": {"metric_type": "COSINE", "offset": 0}, # "limit": default_limit, # "expr": "int64 > 0"} # req = AnnSearchRequest(**search_param) # req_list.append(req) # # search for get the base line of hybrid_search # search_res = collection_w.search(vectors[:1], vector_name_list[i], # default_search_params, default_limit, # default_search_exp, # check_task=CheckTasks.check_search_results, # check_items={"nq": 1, # "ids": insert_ids, # "limit": default_limit})[0] # ids = search_res[0].ids # for j in range(len(ids)): # search_res_dict[ids[j]] = 1 / (j + k + 1) # search_res_dict_array.append(search_res_dict) # # 4. calculate hybrid search base line for RRFRanker # ids_answer, score_answer = cf.get_hybrid_search_base_results_rrf(search_res_dict_array) # # 5. hybrid search # hybrid_res = collection_w.hybrid_search(req_list, RRFRanker(k), default_limit, # check_task=CheckTasks.check_search_results, # check_items={"nq": 1, # "ids": insert_ids, # "limit": default_limit})[0] # # 6. compare results through the re-calculated distances # for i in range(len(score_answer[:default_limit])): # delta = math.fabs(score_answer[i] - hybrid_res[0].distances[i]) # assert delta < hybrid_search_epsilon @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("limit", [1, 100, 16384]) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_different_limit_round_decimal(self, primary_field, limit): """ target: test hybrid search with different valid limit and round decimal method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, primary_field=primary_field, multiple_dim_array=[default_dim, default_dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [0.2, 0.3, 0.5] search_res_dict_array = [] if limit > default_nb: limit = default_limit metrics = [] for i in range(len(vector_name_list)): vectors = [[random.random() for _ in range(default_dim)] for _ in range(1)] search_res_dict = {} search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE", "offset": 0}, "limit": limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) metrics.append("COSINE") # search to get the base line of hybrid_search search_res = collection_w.search(vectors[:1], vector_name_list[i], default_search_params, limit, default_expr, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": limit})[0] ids = search_res[0].ids distance_array = search_res[0].distances for j in range(len(ids)): search_res_dict[ids[j]] = distance_array[j] search_res_dict_array.append(search_res_dict) # 4. calculate hybrid search base line ids_answer, score_answer = cf.get_hybrid_search_base_results(search_res_dict_array, weights, metrics) # 5. hybrid search hybrid_res = collection_w.hybrid_search(req_list, WeightedRanker(*weights), limit, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": limit})[0] # 6. compare results through the re-calculated distances for i in range(len(score_answer[:limit])): delta = math.fabs(score_answer[i] - hybrid_res[0].distances[i]) assert delta < hybrid_search_epsilon @pytest.mark.tags(CaseLabel.L1) def test_hybrid_search_limit_out_of_range_max(self): """ target: test hybrid search with over maximum limit method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, multiple_dim_array=[default_dim, default_dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [0.2, 0.3, 0.5] for i in range(len(vector_name_list)): vectors = [[random.random() for _ in range(default_dim)] for _ in range(1)] search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE", "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search with over maximum limit limit = 16385 error = {ct.err_code: 1100, ct.err_msg: "invalid max query result window, (offset+limit) " "should be in range [1, 16384], but got %d" % limit} collection_w.hybrid_search(req_list, WeightedRanker(*weights), limit, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_hybrid_search_limit_out_of_range_min(self): """ target: test hybrid search with over minimum limit method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, multiple_dim_array=[default_dim, default_dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [0.2, 0.3, 0.5] for i in range(len(vector_name_list)): vectors = [[random.random() for _ in range(default_dim)] for _ in range(1)] search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE", "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search with over maximum limit limit = 0 error = {ct.err_code: 1, ct.err_msg: "`limit` value 0 is illegal"} collection_w.hybrid_search(req_list, WeightedRanker(*weights), limit, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_with_output_fields(self, nq, dim, auto_id, is_flush, enable_dynamic_field, primary_field, vector_data_type): """ target: test hybrid search normal case method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data nq = 10 multiple_dim_array = [dim, dim] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, auto_id=auto_id, dim=dim, is_flush=is_flush, primary_field=primary_field, enable_dynamic_field=enable_dynamic_field, multiple_dim_array=multiple_dim_array, vector_data_type=vector_data_type)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [0.2, 0.3, 0.5] metrics = [] search_res_dict_array = [] search_res_dict_array_nq = [] vectors = cf.gen_vectors_based_on_vector_type(nq, dim, vector_data_type) # get hybrid search req list for i in range(len(vector_name_list)): search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) metrics.append("COSINE") # get the result of search with the same params of the following hybrid search single_search_param = {"metric_type": "COSINE", "params": {"nprobe": 10}} for k in range(nq): for i in range(len(vector_name_list)): search_res_dict = {} search_res_dict_array = [] vectors_search = vectors[k] # 5. search to get the base line of hybrid_search search_res = collection_w.search([vectors_search], vector_name_list[i], single_search_param, default_limit, default_expr, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit})[0] ids = search_res[0].ids distance_array = search_res[0].distances for j in range(len(ids)): search_res_dict[ids[j]] = distance_array[j] search_res_dict_array.append(search_res_dict) search_res_dict_array_nq.append(search_res_dict_array) # 6. calculate hybrid search base line score_answer_nq = [] for k in range(nq): ids_answer, score_answer = cf.get_hybrid_search_base_results(search_res_dict_array_nq[k], weights, metrics) score_answer_nq.append(score_answer) # 7. hybrid search output_fields = [ct.default_int64_field_name] hybrid_res = collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit, output_fields=output_fields, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] # 8. compare results through the re-calculated distances for k in range(len(score_answer_nq)): for i in range(len(score_answer_nq[k][:default_limit])): assert score_answer_nq[k][i] - hybrid_res[k].distances[i] < hybrid_search_epsilon @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_with_output_fields_all_fields(self, nq, dim, auto_id, is_flush, enable_dynamic_field, primary_field, vector_data_type): """ target: test hybrid search normal case method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data nq = 10 multiple_dim_array = [dim, dim] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, auto_id=auto_id, dim=dim, is_flush=is_flush, primary_field=primary_field, enable_dynamic_field=enable_dynamic_field, multiple_dim_array=multiple_dim_array, vector_data_type=vector_data_type)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [0.2, 0.3, 0.5] metrics = [] search_res_dict_array = [] search_res_dict_array_nq = [] vectors = cf.gen_vectors_based_on_vector_type(nq, dim, vector_data_type) # get hybrid search req list for i in range(len(vector_name_list)): search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) metrics.append("COSINE") # get the result of search with the same params of the following hybrid search single_search_param = {"metric_type": "COSINE", "params": {"nprobe": 10}} for k in range(nq): for i in range(len(vector_name_list)): search_res_dict = {} search_res_dict_array = [] vectors_search = vectors[k] # 5. search to get the base line of hybrid_search search_res = collection_w.search([vectors_search], vector_name_list[i], single_search_param, default_limit, default_search_exp, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit})[0] ids = search_res[0].ids distance_array = search_res[0].distances for j in range(len(ids)): search_res_dict[ids[j]] = distance_array[j] search_res_dict_array.append(search_res_dict) search_res_dict_array_nq.append(search_res_dict_array) # 6. calculate hybrid search base line score_answer_nq = [] for k in range(nq): ids_answer, score_answer = cf.get_hybrid_search_base_results(search_res_dict_array_nq[k], weights, metrics) score_answer_nq.append(score_answer) # 7. hybrid search output_fields = [default_int64_field_name, default_float_field_name, default_string_field_name, default_json_field_name] output_fields = output_fields + vector_name_list hybrid_res = collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit, output_fields=output_fields, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] # 8. compare results through the re-calculated distances for k in range(len(score_answer_nq)): for i in range(len(score_answer_nq[k][:default_limit])): assert score_answer_nq[k][i] - hybrid_res[k].distances[i] < hybrid_search_epsilon @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_with_output_fields_all_fields(self, nq, dim, auto_id, is_flush, enable_dynamic_field, primary_field, vector_data_type): """ target: test hybrid search normal case method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data nq = 10 multiple_dim_array = [dim, dim] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, auto_id=auto_id, dim=dim, is_flush=is_flush, primary_field=primary_field, enable_dynamic_field=enable_dynamic_field, multiple_dim_array=multiple_dim_array, vector_data_type=vector_data_type)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [0.2, 0.3, 0.5] metrics = [] search_res_dict_array = [] search_res_dict_array_nq = [] vectors = cf.gen_vectors_based_on_vector_type(nq, dim, vector_data_type) # get hybrid search req list for i in range(len(vector_name_list)): search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) metrics.append("COSINE") # get the result of search with the same params of the following hybrid search single_search_param = {"metric_type": "COSINE", "params": {"nprobe": 10}} for k in range(nq): for i in range(len(vector_name_list)): search_res_dict = {} search_res_dict_array = [] vectors_search = vectors[k] # 5. search to get the base line of hybrid_search search_res = collection_w.search([vectors_search], vector_name_list[i], single_search_param, default_limit, default_search_exp, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit})[0] ids = search_res[0].ids distance_array = search_res[0].distances for j in range(len(ids)): search_res_dict[ids[j]] = distance_array[j] search_res_dict_array.append(search_res_dict) search_res_dict_array_nq.append(search_res_dict_array) # 6. calculate hybrid search base line score_answer_nq = [] for k in range(nq): ids_answer, score_answer = cf.get_hybrid_search_base_results(search_res_dict_array_nq[k], weights, metrics) score_answer_nq.append(score_answer) # 7. hybrid search hybrid_res = collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit, output_fields=["*"], check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit})[0] # 8. compare results through the re-calculated distances for k in range(len(score_answer_nq)): for i in range(len(score_answer_nq[k][:default_limit])): assert score_answer_nq[k][i] - hybrid_res[k].distances[i] < hybrid_search_epsilon @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("output_fields", [[default_search_field], [default_search_field, default_int64_field_name]]) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_hybrid_search_with_output_fields_sync_async(self, nq, primary_field, output_fields, _async): """ target: test hybrid search normal case method: create connection, collection, insert and search expected: hybrid search successfully with limit(topK) """ # 1. initialize collection with data multiple_dim_array = [default_dim, default_dim] collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, dim=default_dim, primary_field=primary_field, multiple_dim_array=multiple_dim_array)[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [0.2, 0.3, 0.5] metrics = [] search_res_dict_array = [] search_res_dict_array_nq = [] vectors = cf.gen_vectors_based_on_vector_type(nq, default_dim, "FLOAT_VECTOR") # get hybrid search req list for i in range(len(vector_name_list)): search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE"}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) metrics.append("COSINE") # get the result of search with the same params of the following hybrid search single_search_param = {"metric_type": "COSINE", "params": {"nprobe": 10}} for k in range(nq): for i in range(len(vector_name_list)): search_res_dict = {} search_res_dict_array = [] vectors_search = vectors[k] # 5. search to get the base line of hybrid_search search_res = collection_w.search([vectors_search], vector_name_list[i], single_search_param, default_limit, default_expr, _async=_async, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit, "_async": _async})[0] if _async: search_res.done() search_res = search_res.result() ids = search_res[0].ids distance_array = search_res[0].distances for j in range(len(ids)): search_res_dict[ids[j]] = distance_array[j] search_res_dict_array.append(search_res_dict) search_res_dict_array_nq.append(search_res_dict_array) # 6. calculate hybrid search base line score_answer_nq = [] for k in range(nq): ids_answer, score_answer = cf.get_hybrid_search_base_results(search_res_dict_array_nq[k], weights, metrics) score_answer_nq.append(score_answer) # 7. hybrid search hybrid_res = collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit, output_fields=output_fields, _async=_async, check_task=CheckTasks.check_search_results, check_items={"nq": nq, "ids": insert_ids, "limit": default_limit, "_async": _async})[0] if _async: hybrid_res.done() hybrid_res = hybrid_res.result() # 8. compare results through the re-calculated distances for k in range(len(score_answer_nq)): for i in range(len(score_answer_nq[k][:default_limit])): assert score_answer_nq[k][i] - hybrid_res[k].distances[i] < hybrid_search_epsilon @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("rerank", [RRFRanker(), WeightedRanker(0.1, 0.9, 1)]) def test_hybrid_search_offset_both_inside_outside_params(self, rerank): """ target: test hybrid search with offset inside and outside params method: create connection, collection, insert and search. Note: here the result check is through comparing the score, the ids could not be compared because the high probability of the same score, then the id is not fixed in the range of the same score expected: Raise exception """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, multiple_dim_array=[default_dim, default_dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) req_list = [] vectors_list = [] # 3. generate vectors for i in range(len(vector_name_list)): vectors = [[random.random() for _ in range(default_dim)] for _ in range(1)] vectors_list.append(vectors) # 4. prepare search params for each vector field for i in range(len(vector_name_list)): search_param = { "data": vectors_list[i], "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE", "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search with offset inside the params error = {ct.err_code: 1, ct.err_msg: "Provide offset both in kwargs and param, expect just one"} collection_w.hybrid_search(req_list, rerank, default_limit, offset=2, check_task=CheckTasks.err_res, check_items=error) # @pytest.mark.tags(CaseLabel.L2) # @pytest.mark.parametrize("limit", [1, 100, 16384]) # @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) # def test_hybrid_search_is_partition_key(self, nq, primary_field, limit, vector_data_type): # """ # target: test hybrid search with different valid limit and round decimal # method: create connection, collection, insert and search # expected: hybrid search successfully with limit(topK) # """ # # 1. initialize collection with data # collection_w, _, _, insert_ids, time_stamp = \ # self.init_collection_general(prefix, True, primary_field=primary_field, # multiple_dim_array=[default_dim, default_dim], # vector_data_type=vector_data_type, # is_partition_key=ct.default_float_field_name)[0:5] # # 2. extract vector field name # vector_name_list = cf.extract_vector_field_name_list(collection_w) # vector_name_list.append(ct.default_float_vec_field_name) # # 3. prepare search params # req_list = [] # weights = [0.2, 0.3, 0.5] # metrics = [] # search_res_dict_array = [] # search_res_dict_array_nq = [] # vectors = cf.gen_vectors_based_on_vector_type(nq, default_dim, vector_data_type) # # # get hybrid search req list # for i in range(len(vector_name_list)): # search_param = { # "data": vectors, # "anns_field": vector_name_list[i], # "param": {"metric_type": "COSINE"}, # "limit": default_limit, # "expr": "int64 > 0"} # req = AnnSearchRequest(**search_param) # req_list.append(req) # metrics.append("COSINE") # # # get the result of search with the same params of the following hybrid search # single_search_param = {"metric_type": "COSINE", "params": {"nprobe": 10}} # for k in range(nq): # for i in range(len(vector_name_list)): # search_res_dict = {} # search_res_dict_array = [] # vectors_search = vectors[k] # # 5. search to get the base line of hybrid_search # search_res = collection_w.search([vectors_search], vector_name_list[i], # single_search_param, default_limit, # default_search_exp, # check_task=CheckTasks.check_search_results, # check_items={"nq": 1, # "ids": insert_ids, # "limit": default_limit})[0] # ids = search_res[0].ids # distance_array = search_res[0].distances # for j in range(len(ids)): # search_res_dict[ids[j]] = distance_array[j] # search_res_dict_array.append(search_res_dict) # search_res_dict_array_nq.append(search_res_dict_array) # # # 6. calculate hybrid search base line # score_answer_nq = [] # for k in range(nq): # ids_answer, score_answer = cf.get_hybrid_search_base_results(search_res_dict_array_nq[k], weights, metrics) # score_answer_nq.append(score_answer) # # 7. hybrid search # hybrid_res = collection_w.hybrid_search(req_list, WeightedRanker(*weights), default_limit, # check_task=CheckTasks.check_search_results, # check_items={"nq": nq, # "ids": insert_ids, # "limit": default_limit})[0] # # 8. compare results through the re-calculated distances # for k in range(len(score_answer_nq)): # for i in range(len(score_answer_nq[k][:default_limit])): # assert score_answer_nq[k][i] - hybrid_res[k].distances[i] < hybrid_search_epsilon @pytest.mark.tags(CaseLabel.L1) def test_hybrid_search_result_order(self, nq): """ target: test hybrid search result having correct order for cosine distance method: create connection, collection, insert and search expected: hybrid search successfully and result order is correct """ # 1. initialize collection with data collection_w, _, _, insert_ids, time_stamp = \ self.init_collection_general(prefix, True, multiple_dim_array=[default_dim, default_dim])[0:5] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) vector_name_list.append(ct.default_float_vec_field_name) # 3. prepare search params req_list = [] weights = [0.2, 0.3, 0.5] for i in range(len(vector_name_list)): vectors = [[random.random() for _ in range(default_dim)] for _ in range(nq)] search_param = { "data": vectors, "anns_field": vector_name_list[i], "param": {"metric_type": "COSINE", "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # 4. hybrid search res = collection_w.hybrid_search(req_list, WeightedRanker(*weights), 10)[0] is_sorted_descend = lambda lst: all(lst[i] >= lst[i + 1] for i in range(len(lst) - 1)) for i in range(nq): assert is_sorted_descend(res[i].distances) @pytest.mark.tags(CaseLabel.L2) def test_hybrid_search_sparse_normal(self): """ target: test hybrid search after loading sparse vectors method: Test hybrid search after loading sparse vectors expected: hybrid search successfully with limit(topK) """ nb, auto_id, dim, enable_dynamic_field = 20000, False, 768, False # 1. init collection collection_w, insert_vectors, _, insert_ids = self.init_collection_general(prefix, True, nb=nb, multiple_dim_array=[dim, dim * 2], with_json=False, vector_data_type="SPARSE_FLOAT_VECTOR")[ 0:4] # 2. extract vector field name vector_name_list = cf.extract_vector_field_name_list(collection_w) # 3. prepare search params req_list = [] search_res_dict_array = [] k = 60 search_params = {'params': {'nprobe': 32}} for i in range(len(vector_name_list)): # vector = cf.gen_sparse_vectors(1, dim) vector = insert_vectors[0][i + 3][-1:] search_res_dict = {} search_param = { "data": vector, "anns_field": vector_name_list[i], "param": {"metric_type": "IP", "offset": 0}, "limit": default_limit, "expr": "int64 > 0"} req = AnnSearchRequest(**search_param) req_list.append(req) # search for get the base line of hybrid_search search_res = collection_w.search(vector, vector_name_list[i], search_params, default_limit, default_expr, )[0] ids = search_res[0].ids for j in range(len(ids)): search_res_dict[ids[j]] = 1 / (j + k + 1) search_res_dict_array.append(search_res_dict) # 4. calculate hybrid search base line for RRFRanker ids_answer, score_answer = cf.get_hybrid_search_base_results_rrf(search_res_dict_array) # 5. hybrid search hybrid_res = collection_w.hybrid_search(req_list, RRFRanker(k), default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": 1, "ids": insert_ids, "limit": default_limit})[0] # 6. compare results through the re-calculated distances for i in range(len(score_answer[:default_limit])): delta = math.fabs(score_answer[i] - hybrid_res[0].distances[i]) assert delta < hybrid_search_epsilon @pytest.mark.tags(CaseLabel.L1) def test_milvus_lite_delete_search(self, enable_milvus_local_api): client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) # 2. insert default_nb = 1000 rng = np.random.default_rng(seed=19530) rows = [{default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, default_dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} for i in range(default_nb)] pks = client_w.insert(client, collection_name, rows)[0] # 3. delete delete_num = 3 client_w.delete(client, collection_name, filter=f"id < {delete_num}") # 4. search vectors_to_search = rng.random((1, default_dim)) insert_ids = [i for i in range(default_nb)] for insert_id in range(delete_num): if insert_id in insert_ids: insert_ids.remove(insert_id) limit = default_nb - delete_num client_w.search(client, collection_name, vectors_to_search, limit=default_nb, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "ids": insert_ids, "limit": limit}) # 5. query client_w.query(client, collection_name, filter=default_search_exp, check_task=CheckTasks.check_query_results, check_items={exp_res: rows[delete_num:], "with_vec": True, "primary_field": default_primary_key_field_name}) client_w.drop_collection(client, collection_name) ================================================ FILE: tests/milvus_lite/test_milvus_lite_sparse.py ================================================ import time import pytest from base.client_base import TestcaseBase from common.common_type import CaseLabel, CheckTasks from common import common_func as cf from common import common_type as ct from base.high_level_api_wrapper import HighLevelApiWrapper client_w = HighLevelApiWrapper() prefix = "milvus_local_api_collection" default_dim = ct.default_dim default_primary_key_field_name = "id" default_float_field_name = ct.default_float_field_name default_vector_field_name = "vector" default_limit = ct.default_limit default_nb = ct.default_nb default_search_exp = "id >= 0" exp_res = "exp_res" default_nq = ct.default_nq default_string_field_name = ct.default_string_field_name class TestMilvusLocalSparse(TestcaseBase): @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("index, index_params", zip(ct.all_index_types[9:11], ct.default_index_params[9:11])) def test_milvus_local_sparse_search(self, index, index_params, enable_milvus_local_api): client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) collection_name = cf.gen_unique_str(prefix) # 1. create collection client_w.create_collection(client, collection_name, default_dim) params = {"index_type": index, "metric_type": "IP", "params": index_params} client_w.create_index(ct.default_sparse_vec_field_name, params, index_name=index) data = cf.gen_default_list_sparse_data() client_w.load() client_w.search(data[-1][-1:], ct.default_sparse_vec_field_name, ct.default_sparse_search_params, default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": default_nq, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("index, index_params", zip(ct.all_index_types[9:11], ct.default_index_params[9:11])) @pytest.mark.parametrize("dim", [ct.min_sparse_vector_dim, 32768, ct.max_sparse_vector_dim]) def test_milvus_lcoal_sparse_index_dim(self, index, index_params, dim, enable_milvus_local_api): """ target: validating the sparse index in different dimensions method: create connection, collection, insert and hybrid search expected: search successfully """ client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) c_name = cf.gen_unique_str(prefix) schema = cf.gen_default_sparse_schema(auto_id=False) client_w.create_collection(client, c_name, schema=schema, sparse=True) data = cf.gen_default_list_sparse_data(dim=dim) client_w.insert(data) params = {"index_type": index, "metric_type": "IP", "params": index_params} client_w.create_index(ct.default_sparse_vec_field_name, params, index_name=index) client_w.load() client_w.search(data[-1][-1:], ct.default_sparse_vec_field_name, ct.default_sparse_search_params, default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": default_nq, "limit": default_limit}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("index, index_params", zip(ct.all_index_types[9:11], ct.default_index_params[9:11])) @pytest.mark.parametrize("dim", [ct.min_sparse_vector_dim - 1, 0.5, ct.max_sparse_vector_dim + 2]) def test_sparse_index_invalid_dim(self, index, index_params, dim, enable_milvus_local_api): client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=enable_milvus_local_api) c_name = cf.gen_unique_str(prefix) schema = cf.gen_default_sparse_schema(auto_id=False) client_w.create_collection(client, c_name, schema=schema, sparse=True) data = cf.gen_default_list_sparse_data(dim=dim) client_w.insert(data) params = {"index_type": index, "metric_type": "IP", "params": index_params} client_w.create_index(ct.default_sparse_vec_field_name, params, index_name=index) client_w.load() client_w.search(data[-1][-1:], ct.default_sparse_vec_field_name, ct.default_sparse_search_params, default_limit, check_task=CheckTasks.check_search_results, check_items={"nq": default_nq, "limit": default_limit}) ================================================ FILE: tests/milvus_lite/test_milvus_lite_stability.py ================================================ import logging import random import string import time import numpy as np import pytest from base.client_base import TestcaseBase from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks from utils.thread_util import ConcurrencyObj from common.constants import * from base.high_level_api_wrapper import HighLevelApiWrapper client_w = HighLevelApiWrapper() prefix = "milvus_local_stability" default_dim = ct.default_dim default_primary_key_field_name = "id" default_nb = ct.default_nb default_search_exp = "id in ['1','9','90', '900', '9000']" # default_search_exp = "varchar < 500.0" default_float_field_name = ct.default_float_field_name default_vector_field_name = "vector" default_string_field_name = ct.default_string_field_name default_limit = ct.default_limit exp_res = "exp_res" class TestMilvusLocalStability(TestcaseBase): @pytest.mark.tags(CaseLabel.L3) def test_milvus_local_stability(self): timeout = 3600 s_name = ''.join(random.sample(string.ascii_letters + string.digits, 4)) file_name = "./milvus_lite_stab" + s_name + ".db" file = cf.gen_unique_str(file_name) client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=file) c_name = cf.gen_unique_str(prefix) nb, dim = 500000, 768 client_w.create_collection(client, c_name, dim) collections = client_w.list_collections(client)[0] assert c_name in collections client_w.describe_collection(client, c_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": c_name, "dim": dim}) # 2. insert rng = np.random.default_rng(seed=19530) rows, row = [], [] count, num_c = 0, 0 for i in range(nb): r = {default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} row = [r] count += 1 if count == 1000: num_c += 1 client_w.insert(client, c_name, row) count = 0 row.clear() rows.append(r) sta = time.time() client_w.load_collection(client, c_name) end = time.time() def scene_search_query(): vectors_to_search = rng.random((1, dim)) client_w.search(client, c_name, vectors_to_search, check_task=CheckTasks.check_search_results, check_items={"enable_milvus_client_api": True, "nq": len(vectors_to_search), "limit": default_limit}) # # client_w.query(client, c_name, filter=default_search_exp, # check_task=CheckTasks.check_query_results, # check_items={exp_res: rows, # "with_vec": True, # "primary_field": default_primary_key_field_name}) logging.info(f"scene_search_query for collection={c_name}") current = ConcurrencyObj(func_obj=scene_search_query, interval=1) current.multi_func(num=20) time.sleep(timeout) current.set_stop_flag() @pytest.mark.tags(CaseLabel.L3) def test_milvus_local_hnsw_serial_performance(self): s_name = ''.join(random.sample(string.ascii_letters + string.digits, 4)) file_name = "./milvus_lite_stab" + s_name + ".db" client = self._connect(enable_milvus_client_api=True, enable_milvus_local_api=file_name) c_name = cf.gen_unique_str(prefix) nb, dim = 500000, 768 client_w.create_collection(client, c_name, dim) collections = client_w.list_collections(client)[0] assert c_name in collections client_w.describe_collection(client, c_name, check_task=CheckTasks.check_describe_collection_property, check_items={"collection_name": c_name, "dim": dim}) # 2. insert rng = np.random.default_rng(seed=19530) rows, row = [], [] count, num_c = 0, 0 insert_start = time.time() for i in range(nb): r = {default_primary_key_field_name: i, default_vector_field_name: list(rng.random((1, dim))[0]), default_float_field_name: i * 1.0, default_string_field_name: str(i)} row = [r] count += 1 if count == 10000: num_c += 1 client_w.insert(client, c_name, row) count = 0 row.clear() rows.append(r) insert_time = round(time.time() - insert_start, 2) logging.info(f"insert done. insert time: {insert_time}") client_w.release_collection(client, c_name) client_w.load_collection(client, c_name) response_time = [] for i in range(500): vectors_to_search = rng.random((1, dim)) # insert_ids = [i for i in range(nb)] start = time.time() client_w.search(client, c_name, vectors_to_search) rt = time.time() - start response_time.append(rt * 1000) logging.info(f"search response time : {rt} s") logging.info("------- end ------ ") logging.info(f"avg response time : {sum(response_time)/len(response_time)}") ================================================ FILE: tests/pytest.ini ================================================ [pytest] addopts = --host localhost --html=/tmp/ci_logs/report.html --self-contained-html -v # python3 -W ignore -m pytest log_format = [%(asctime)s - %(levelname)s - %(name)s]: %(message)s (%(filename)s:%(lineno)s) log_date_format = %Y-%m-%d %H:%M:%S filterwarnings = ignore::DeprecationWarning ================================================ FILE: tests/requirements.txt ================================================ --extra-index-url https://test.pypi.org/simple/ pytest-cov==2.8.1 requests==2.26.0 scikit-learn==1.1.3 timeout_decorator==0.5.0 ujson==5.5.0 pytest==7.2.0 pytest-assume==2.4.3 pytest-timeout==1.3.3 pytest-repeat==0.8.0 allure-pytest==2.7.0 pytest-print==0.2.1 pytest-level==0.1.1 pytest-xdist==2.5.0 pymilvus==2.4.4 pytest-rerunfailures==9.1.1 git+https://github.com/Projectplace/pytest-tags ndg-httpsclient pyopenssl pyasn1 pytest-html==3.1.1 delayed-assert==0.3.5 kubernetes==17.17.0 PyYAML==6.0 pytest-sugar==0.9.5 pytest-parallel pytest-random-order # for customize config test python-benedict==0.24.3 timeout-decorator==0.5.0 # for bulk insert test minio==7.1.5 npy-append-array==0.9.15 Faker==19.2.0 # for benchmark h5py==3.8.0 # for log loguru==0.7.0 # util psutil==5.9.4 pandas==1.5.3 tenacity==8.1.0 # for standby test etcd-sdk-python==0.0.4 deepdiff==6.7.1 # for test result anaylszer prettytable==3.8.0 pyarrow==14.0.1 fastparquet==2023.7.0 # for bf16 datatype jax==0.4.13 jaxlib==0.4.13 tensorflow==2.13.1 ================================================ FILE: tests/run.sh ================================================ #/bin/bash pytest . $@ ================================================ FILE: tests/test_bm25.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import unittest from pymilvus import MilvusClient, DataType, Function, FunctionType, AnnSearchRequest, RRFRanker class TestBM25(unittest.TestCase): def test_single_function(self): collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema() schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False) schema.add_field( "document_content", DataType.VARCHAR, max_length=9000, enable_analyzer=True ) schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR) bm25_function = Function( name="bm25_fn", input_field_names=["document_content"], output_field_names="sparse_vector", function_type=FunctionType.BM25, ) schema.add_function(bm25_function) index_params = milvus_client.prepare_index_params() index_params.add_index( field_name="sparse_vector", index_name="sparse_inverted_index", index_type="SPARSE_INVERTED_INDEX", metric_type="BM25", params={"bm25_k1": 1.2, "bm25_b": 0.75}, ) milvus_client.create_collection( collection_name, schema=schema, index_params=index_params, consistency_level="Strong", ) rows = [ {"id": 1, "document_content": "hello world"}, {"id": 2, "document_content": "hello milvus"}, {"id": 3, "document_content": "hello zilliz"}, ] insert_result = milvus_client.insert(collection_name, rows, progress_bar=True) texts_to_search = ["hello"] search_params = {"metric_type": "BM25"} result = milvus_client.search( collection_name, texts_to_search, limit=3, output_fields=["document_content"], search_params=search_params, ) scores = [hit['distance'] for hit in result[0]] self.assertAlmostEqual(scores, [0.133531391620636, 0.133531391620636, 0.133531391620636]) texts_to_search = ["hello", "hello, zilliz"] search_params = {"metric_type": "BM25"} result = milvus_client.search( collection_name, texts_to_search, limit=3, output_fields=["document_content"], search_params=search_params, ) scores1 = [hit['distance'] for hit in result[0]] self.assertAlmostEqual(scores1, [0.133531391620636, 0.133531391620636, 0.133531391620636]) scores2 = [hit['distance'] for hit in result[1]] self.assertAlmostEqual(scores2, [1.1143605709075928, 0.133531391620636, 0.133531391620636]) def test_multi_functions(self): collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema() schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False) schema.add_field( "document_content", DataType.VARCHAR, max_length=9000, enable_analyzer=True ) schema.add_field("sparse_vector_1", DataType.SPARSE_FLOAT_VECTOR) schema.add_field("sparse_vector_2", DataType.SPARSE_FLOAT_VECTOR) f1 = Function( name="bm25_fn", input_field_names=["document_content"], output_field_names="sparse_vector_1", function_type=FunctionType.BM25, ) schema.add_function(f1) f2 = Function( name="bm25_fn", input_field_names=["document_content"], output_field_names="sparse_vector_2", function_type=FunctionType.BM25, ) schema.add_function(f2) index_params = milvus_client.prepare_index_params() index_params.add_index( field_name="sparse_vector_1", index_name="sparse_inverted_index_1", index_type="SPARSE_INVERTED_INDEX", metric_type="BM25", params={"bm25_k1": 1.2, "bm25_b": 0.75}, ) index_params.add_index( field_name="sparse_vector_2", index_name="sparse_inverted_index_2", index_type="SPARSE_INVERTED_INDEX", metric_type="BM25", params={"bm25_k1": 1.2, "bm25_b": 0.75}, ) milvus_client.create_collection( collection_name, schema=schema, index_params=index_params, consistency_level="Strong", ) rows = [ {"id": 1, "document_content": "hello world"}, {"id": 2, "document_content": "hello milvus"}, {"id": 3, "document_content": "hello zilliz"}, ] milvus_client.insert(collection_name, rows, progress_bar=True) texts_to_search = ["hello"] search_params = {"metric_type": "BM25"} result = milvus_client.search( collection_name, texts_to_search, anns_field="sparse_vector_1", limit=3, output_fields=["document_content"], search_params=search_params, ) scores = [hit['distance'] for hit in result[0]] self.assertAlmostEqual(scores, [0.133531391620636, 0.133531391620636, 0.133531391620636]) texts_to_search = ["hello", "hello, zilliz"] search_params = {"metric_type": "BM25"} result = milvus_client.search( collection_name, texts_to_search, anns_field="sparse_vector_2", limit=3, output_fields=["document_content"], search_params=search_params, ) scores1 = [hit['distance'] for hit in result[0]] self.assertAlmostEqual(scores1, [0.133531391620636, 0.133531391620636, 0.133531391620636]) scores2 = [hit['distance'] for hit in result[1]] self.assertAlmostEqual(scores2, [1.1143605709075928, 0.133531391620636, 0.133531391620636]) def test_bm25_hybrid_search(self): collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema() schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False) schema.add_field( "document_content", DataType.VARCHAR, max_length=9000, enable_analyzer=True ) schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR) schema.add_field("sparse_vector_2", DataType.SPARSE_FLOAT_VECTOR) bm25_function = Function( name="bm25_fn", input_field_names=["document_content"], output_field_names="sparse_vector", function_type=FunctionType.BM25, ) schema.add_function(bm25_function) f2 = Function( name="bm25_fn", input_field_names=["document_content"], output_field_names="sparse_vector_2", function_type=FunctionType.BM25, ) schema.add_function(f2) index_params = milvus_client.prepare_index_params() index_params.add_index( field_name="sparse_vector", index_name="sparse_inverted_index", index_type="SPARSE_INVERTED_INDEX", metric_type="BM25", params={"bm25_k1": 1.2, "bm25_b": 0.75}, ) index_params.add_index( field_name="sparse_vector_2", index_name="sparse_inverted_index_2", index_type="SPARSE_INVERTED_INDEX", metric_type="BM25", params={"bm25_k1": 1.2, "bm25_b": 0.75}, ) milvus_client.create_collection( collection_name, schema=schema, index_params=index_params, consistency_level="Strong", ) rows = [ {"id": 1, "document_content": "hello world"}, {"id": 2, "document_content": "hello milvus"}, {"id": 3, "document_content": "hello zilliz"}, ] milvus_client.insert(collection_name, rows, progress_bar=True) texts_to_search = ["hello"] search_params = {"metric_type": "BM25"} req1 = AnnSearchRequest( texts_to_search, "sparse_vector", search_params, limit=3, ) req2 = AnnSearchRequest( texts_to_search, "sparse_vector_2", search_params, limit=3, ) reqs = [req1, req2] result = milvus_client.hybrid_search(collection_name, reqs, ranker=RRFRanker(), limit=3, output_fields=["document_content"]) print(result) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/test_delete.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import unittest from pymilvus import MilvusClient class TestDefaultSearch(unittest.TestCase): def test_delete_by_ids(self): dim = 2 collection_name = 'default' milvus_client = MilvusClient('./local_test.db') has_collection = milvus_client.has_collection(collection_name, timeout=5) if has_collection: milvus_client.drop_collection(collection_name) milvus_client.create_collection(collection_name, dim, id_type='string', max_length=1000) rows = [ {'id': '-xf%^@#$%^&***)(*/.', 'vector': [0.0, 1.0], 'a': 100}, {'id': '中文id', 'vector': [0.1, 0.9], 'a': 100}, {'id': 'Título', 'vector': [0.2, 0.8], 'a': 200}, {'id': 'Cien años de soledad', 'vector': [0.3, 0.7], 'a': 200}, ] insert_result = milvus_client.insert(collection_name, rows) self.assertEqual(insert_result['insert_count'], 4) result = milvus_client.search(collection_name, [[0.0, 1.0]], limit=3) self.assertEqual(result[0][0]['distance'], 1.0) self.assertEqual([item['id']for item in result[0]], ['-xf%^@#$%^&***)(*/.', '中文id', 'Título']) result = milvus_client.delete(collection_name, ids=['-xf%^@#$%^&***)(*/.', '中文id']) result = milvus_client.search(collection_name, [[0.0, 1.0]], limit=3) self.assertEqual([item['id']for item in result[0]], ['Título', 'Cien años de soledad']) milvus_client.release_collection(collection_name) del milvus_client local_client = MilvusClient('./local_test.db') result = local_client.search(collection_name, [[0.0, 1.0]], limit=3) self.assertEqual([item['id']for item in result[0]], ['Título', 'Cien años de soledad']) result = local_client.delete(collection_name, ids=['Cien años de soledad']) result = local_client.search(collection_name, [[0.0, 1.0]], limit=3) self.assertEqual([item['id']for item in result[0]], ['Título']) local_client.drop_collection(collection_name) def test_delete_by_filter(self): dim = 2 collection_name = 'hello_milvus' milvus_client = MilvusClient('./local_test.db') has_collection = milvus_client.has_collection(collection_name, timeout=5) if has_collection: milvus_client.drop_collection(collection_name) milvus_client.create_collection(collection_name, dim, id_type='string', max_length=1000) rows = [ {'id': '-xf%^@#$%^&***)(*/.', 'vector': [0.0, 1.0], 'a': 100, 'b': 300}, {'id': '中文id', 'vector': [0.1, 0.9], 'a': 100}, {'id': 'Título', 'vector': [0.2, 0.8], 'b': 200}, {'id': 'Cien años de soledad', 'vector': [0.3, 0.7], 'b': 200}, ] insert_result = milvus_client.insert(collection_name, rows) self.assertEqual(insert_result['insert_count'], 4) result = milvus_client.search(collection_name, [[0.0, 1.0]], limit=3) self.assertEqual(result[0][0]['distance'], 1.0) self.assertEqual([item['id']for item in result[0]], ['-xf%^@#$%^&***)(*/.', '中文id', 'Título']) result = milvus_client.delete(collection_name, filter='(a==100) && (b==300)') result = milvus_client.search(collection_name, [[0.0, 1.0]], limit=3) self.assertEqual([item['id']for item in result[0]], ['中文id', 'Título', 'Cien años de soledad']) milvus_client.release_collection(collection_name) del milvus_client local_client = MilvusClient('./local_test.db') result = local_client.search(collection_name, [[0.0, 1.0]], limit=3) self.assertEqual([item['id']for item in result[0]], ['中文id', 'Título', 'Cien años de soledad']) local_client.delete(collection_name, filter='(a==100) || (b==200)') result = local_client.search(collection_name, [[0.0, 1.0]], limit=3) self.assertEqual(result, [[]]) local_client.drop_collection(collection_name) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/test_dump_tool.py ================================================ # Copyright (C) 2019-2023 Zilliz. 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. import unittest import json import os import random import pandas as pd import numpy as np import tempfile from pymilvus import ( MilvusClient, FieldSchema, CollectionSchema, DataType ) from milvus_lite.cmdline import dump_collection DIM = 512 DATA_FILE = os.path.join(os.path.dirname(__file__), 'data', 'train_embeddings.csv') def gen_binary_vector(): raw_vector = [random.randint(0, 1) for i in range(DIM)] binary_vectors = np.packbits(raw_vector, axis=-1).tolist() return binary_vectors def gen_float_vector(): return [random.random() for _ in range(DIM)] def all_types_data(bin_vec: bool)->list: rows = [] count = 100 for i in range(count): row = { "id": i, "bool": True if i%5 == 0 else False, "int8": i%128, "int16": i%1000, "int32": i%100000, "int64": i, "float": i/3, "double": i/7, "varchar": f"varchar_{i}", "json": {"dummy": i, "ok": f"name_{i}"}, "vector": gen_binary_vector() if bin_vec else gen_float_vector(), f"dynamic_{i}": i, # bulkinsert doesn't support import npy with array field, the below values will be stored into dynamic field "array_str": [f"str_{k}" for k in range(5)], "array_int": [k for k in range(10)], } rows.append(row) return rows class TestDumpTool(unittest.TestCase): def setUp(self): self.collection_name = 'hello_milvus' self.milvus_client = MilvusClient('./local_test.db') has_collection = self.milvus_client.has_collection(self.collection_name, timeout=5) if has_collection: self.milvus_client.drop_collection(self.collection_name) def tearDown(self): # self.milvus_client.drop_collection(self.collection_name) pass @unittest.skip("") def test_simple_collection(self): has_collection = self.milvus_client.has_collection(self.collection_name) if has_collection: self.milvus_client.drop_collection(self.collection_name) fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), FieldSchema(name="path", dtype=DataType.VARCHAR, max_length=512), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=DIM), FieldSchema(name="label", dtype=DataType.VARCHAR, max_length=512), ] schema = CollectionSchema(fields=fields) index_params = self.milvus_client.prepare_index_params() index_params.add_index(field_name = "vector", metric_type="L2") self.milvus_client.create_collection(self.collection_name, schema=schema, index_params=index_params, consistency_level="Strong") csv_data = pd.read_csv(DATA_FILE) for i in range(csv_data.shape[0]): row = {} for col in csv_data.columns.values: if col == "vector": vec = json.loads(csv_data[col][i]) # convert the string format vector to List[float] row[col] = vec else: row[col] = csv_data[col][i] self.milvus_client.insert(self.collection_name, row) # dump with tempfile.TemporaryDirectory() as temp_dir: dump_collection('./local_test.db', self.collection_name, temp_dir) @unittest.skip("") def test_all_type_collection(self): has_collection = self.milvus_client.has_collection(self.collection_name) if has_collection: self.milvus_client.drop_collection(self.collection_name) fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False), FieldSchema(name="bool", dtype=DataType.BOOL), FieldSchema(name="int8", dtype=DataType.INT8), FieldSchema(name="int16", dtype=DataType.INT16), FieldSchema(name="int32", dtype=DataType.INT32), FieldSchema(name="int64", dtype=DataType.INT64), FieldSchema(name="float", dtype=DataType.FLOAT), FieldSchema(name="double", dtype=DataType.DOUBLE), FieldSchema(name="varchar", dtype=DataType.VARCHAR, max_length=512), FieldSchema(name="json", dtype=DataType.JSON), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=DIM) ] fields.append(FieldSchema(name="array_str", dtype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)) fields.append(FieldSchema(name="array_int", dtype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)) schema = CollectionSchema(fields=fields, enable_dynamic_field=True) index_params = self.milvus_client.prepare_index_params() index_params.add_index(field_name = "vector", metric_type="L2") self.milvus_client.create_collection(self.collection_name, schema=schema, index_params=index_params, consistency_level="Strong") rows = all_types_data(False) self.milvus_client.insert(self.collection_name, rows) # dump with tempfile.TemporaryDirectory() as temp_dir: dump_collection('./local_test.db', self.collection_name, temp_dir) def test_all_type_bin_vec_collection(self): has_collection = self.milvus_client.has_collection(self.collection_name) if has_collection: self.milvus_client.drop_collection(self.collection_name) fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False), FieldSchema(name="bool", dtype=DataType.BOOL), FieldSchema(name="int8", dtype=DataType.INT8), FieldSchema(name="int16", dtype=DataType.INT16), FieldSchema(name="int32", dtype=DataType.INT32), FieldSchema(name="int64", dtype=DataType.INT64), FieldSchema(name="float", dtype=DataType.FLOAT), FieldSchema(name="double", dtype=DataType.DOUBLE), FieldSchema(name="varchar", dtype=DataType.VARCHAR, max_length=512), FieldSchema(name="json", dtype=DataType.JSON), FieldSchema(name="vector", dtype=DataType.BINARY_VECTOR, dim=DIM) ] fields.append(FieldSchema(name="array_str", dtype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)) fields.append(FieldSchema(name="array_int", dtype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)) schema = CollectionSchema(fields=fields, enable_dynamic_field=True) self.milvus_client.create_collection(self.collection_name, schema=schema, consistency_level="Strong") index_params = self.milvus_client.prepare_index_params() index_params.add_index("vector", "BIN_FLAT", metric_type="HAMMING") # index_params = [{"index_type": "BIN_FLAT", "metric_type": "HAMMING"}] self.milvus_client.create_index(self.collection_name, index_params=index_params) rows = all_types_data(True) self.milvus_client.insert(self.collection_name, rows) # dump with tempfile.TemporaryDirectory() as temp_dir: dump_collection('./local_test.db', self.collection_name, temp_dir) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/test_hybrid_search.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import unittest import random from pymilvus import ( FieldSchema, CollectionSchema, DataType, utility, Collection, AnnSearchRequest, RRFRanker, connections, WeightedRanker ) from pymilvus.model.sparse import BM25EmbeddingFunction from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer connections.connect("default", uri="milvus.db") analyzer = build_default_analyzer(language="en") bm25_ef = BM25EmbeddingFunction(analyzer) class TestHybridSearch(unittest.TestCase): def test_hybrid_search(self): fields = [ FieldSchema(name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100), FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512), FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR), FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=2), ] schema = CollectionSchema(fields, "") col_name = 'hybrid_test' utility.drop_collection(col_name) col = Collection(col_name, schema, consistency_level="Strong") sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"} col.create_index("sparse_vector", sparse_index) dense_index = {"index_type": "FLAT", "metric_type": "L2"} col.create_index("dense_vector", dense_index) col.load() docs = [ "Artificial intelligence was founded as an academic discipline in 1956.", "Alan Turing was the first person to conduct substantial research in AI.", "Born in Maida Vale, London, Turing was raised in southern England.", ] query = "Who started AI research?" bm25_ef.fit(docs) docs_embeddings = bm25_ef.encode_documents(docs) entities = [docs, docs_embeddings, [[0.1, 0.9], [0.0, 1.0], [1.0, 0.0]]] k = 2 sparse_search_params = {"metric_type": "IP"} sparse_req = AnnSearchRequest(bm25_ef.encode_queries([query]), "sparse_vector", sparse_search_params, limit=k) dense_search_params = {"metric_type": "L2"} dense_req = AnnSearchRequest([[0.0, 0.1]], "dense_vector", dense_search_params, limit=k) # empty table res = col.hybrid_search([sparse_req, dense_req], rerank=RRFRanker(), limit=k, output_fields=['text']) self.assertEqual(res[0], []) ################################# nq = 1 ##################### col.insert(entities) k = 2 sparse_search_params = {"metric_type": "IP"} sparse_req = AnnSearchRequest(bm25_ef.encode_queries([query]), "sparse_vector", sparse_search_params, limit=k) dense_search_params = {"metric_type": "L2"} dense_req = AnnSearchRequest([[0.0, 0.1]], "dense_vector", dense_search_params, limit=k) res = col.hybrid_search([sparse_req, dense_req], rerank=RRFRanker(), limit=k, output_fields=['text']) print(res) self.assertEqual(len(res), 1) self.assertEqual(len(res[0]), 2) self.assertEqual(res[0][0].fields['text'], docs[1]) self.assertEqual(res[0][1].fields['text'], docs[0]) ##################### offset ######################### res = col.hybrid_search([sparse_req, dense_req], rerank=RRFRanker(), limit=k, offset=10, output_fields=['text']) self.assertEqual(res[0], []) res = col.hybrid_search([sparse_req, dense_req], rerank=RRFRanker(), limit=k, offset=1, output_fields=['text']) self.assertEqual(len(res), 1) self.assertEqual(len(res[0]), 1) self.assertEqual(res[0][0].fields['text'], docs[0]) sparse_search_params = {"metric_type": "IP"} sparse_req = AnnSearchRequest(bm25_ef.encode_queries([query]), "sparse_vector", sparse_search_params, limit=10) dense_search_params = {"metric_type": "L2"} dense_req = AnnSearchRequest([[0.0, 0.1]], "dense_vector", dense_search_params, limit=10) res = col.hybrid_search([sparse_req, dense_req], rerank=RRFRanker(), limit=k, offset=1, output_fields=['text']) self.assertEqual(len(res), 1) self.assertEqual(len(res[0]), 2) self.assertEqual(res[0][0].fields['text'], docs[0]) self.assertEqual(res[0][1].fields['text'], docs[2]) ############################### nq = 2 ################### k = 3 dense_search_params = {"metric_type": "L2"} dense_req1 = AnnSearchRequest([[0.9, 0.1], [0.1, 0.9]], "dense_vector", dense_search_params, limit=k) dense_req2 = AnnSearchRequest([[0.9, 0.1], [0.1, 0.9]], "dense_vector", dense_search_params, limit=k) res = col.hybrid_search([dense_req1, dense_req2], rerank=WeightedRanker(0.9, 0.1), limit=k, output_fields=['text']) self.assertEqual(len(res), 2) self.assertEqual(len(res[0]), 3) self.assertEqual(len(res[1]), 3) self.assertEqual(res[0][0].fields['text'], docs[2]) self.assertEqual(res[0][1].fields['text'], docs[0]) self.assertEqual(res[0][2].fields['text'], docs[1]) self.assertEqual(res[1][0].fields['text'], docs[0]) self.assertEqual(res[1][1].fields['text'], docs[1]) self.assertEqual(res[1][2].fields['text'], docs[2]) ########################## offset #################### res = col.hybrid_search([dense_req1, dense_req2], rerank=RRFRanker(), limit=k, offset=10, output_fields=['text']) self.assertEqual(res[0], []) res = col.hybrid_search([dense_req1, dense_req2], rerank=RRFRanker(), limit=k, offset=1, output_fields=['text']) self.assertEqual(len(res), 2) self.assertEqual(len(res[0]), 2) self.assertEqual(len(res[1]), 2) self.assertEqual(res[0][0].fields['text'], docs[0]) self.assertEqual(res[1][0].fields['text'], docs[1]) col.drop() def test_dynamic(self): fields = [ FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False), FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512), FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR), FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=2) ] schema = CollectionSchema(fields, "", enable_dynamic_field=True) col_name = 'hybrid_test_dynamic' utility.drop_collection(col_name) col = Collection(col_name, schema, consistency_level="Strong") sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"} col.create_index("sparse_vector", sparse_index) dense_index = {"index_type": "FLAT", "metric_type": "L2"} col.create_index("dense_vector", dense_index) col.load() docs = [ "Artificial intelligence was founded as an academic discipline in 1956.", "Alan Turing was the first person to conduct substantial research in AI.", "Born in Maida Vale, London, Turing was raised in southern England.", ] query = "Who started AI research?" bm25_ef.fit(docs) docs_embeddings = bm25_ef.encode_documents(docs) data_rows = [ {"pk": 1, "text": docs[0], "sparse_vector": docs_embeddings[0], "dense_vector": [0.1, 0.9], "a": 1, "c": 2}, {"pk": 2, "text": docs[1], "sparse_vector": docs_embeddings[1], "dense_vector": [0.0, 1.0], "a": 4, "d": 2}, {"pk": 3, "text": docs[2], "sparse_vector": docs_embeddings[2], "dense_vector": [1.0, 0.0], "d": 1, "c": 4}, ] k = 2 sparse_search_params = {"metric_type": "IP"} sparse_req = AnnSearchRequest(bm25_ef.encode_queries([query]), "sparse_vector", sparse_search_params, limit=k) dense_search_params = {"metric_type": "L2"} dense_req = AnnSearchRequest([[0.0, 0.1]], "dense_vector", dense_search_params, limit=k) # empty table res = col.hybrid_search([sparse_req, dense_req], rerank=RRFRanker(), limit=k, output_fields=['text']) self.assertEqual(res[0], []) # nq = 1 col.insert(data_rows) k = 2 sparse_search_params = {"metric_type": "IP"} sparse_req = AnnSearchRequest(bm25_ef.encode_queries([query]), "sparse_vector", sparse_search_params, limit=k) dense_search_params = {"metric_type": "L2"} dense_req = AnnSearchRequest([[0.0, 0.1]], "dense_vector", dense_search_params, limit=k) res = col.hybrid_search([sparse_req, dense_req], rerank=RRFRanker(), limit=k, output_fields=['text', 'a']) self.assertEqual(len(res), 1) self.assertEqual(len(res[0]), 2) self.assertEqual(res[0][0].fields['text'], docs[1]) self.assertEqual(res[0][0].fields['a'], 4) self.assertEqual(res[0][1].fields['text'], docs[0]) self.assertEqual(res[0][1].fields['a'], 1) # nq = 2 k = 10 dense_search_params = {"metric_type": "L2"} dense_req1 = AnnSearchRequest([[0.9, 0.1], [0.1, 0.9]], "dense_vector", dense_search_params, limit=k) dense_req2 = AnnSearchRequest([[0.9, 0.1], [0.1, 0.9]], "dense_vector", dense_search_params, limit=k) res = col.hybrid_search([dense_req1, dense_req2], rerank=WeightedRanker(0.9, 0.1), limit=k, output_fields=['text', 'c']) self.assertEqual(len(res), 2) self.assertEqual(len(res[0]), 3) self.assertEqual(len(res[1]), 3) self.assertEqual(res[0][0].fields['text'], docs[2]) self.assertEqual(res[0][0].fields['c'], 4) self.assertEqual(res[0][1].fields['text'], docs[0]) self.assertEqual(res[0][1].fields['c'], 2) self.assertEqual(res[0][2].fields['text'], docs[1]) self.assertEqual(res[0][2].fields.get('c'), None) self.assertEqual(res[1][0].fields['text'], docs[0]) self.assertEqual(res[1][0].fields['c'], 2) self.assertEqual(res[1][1].fields['text'], docs[1]) self.assertEqual(res[1][1].get('c'), None) self.assertEqual(res[1][2].fields['text'], docs[2]) self.assertEqual(res[1][2].fields.get('c'), 4) col.drop() def test_dense(self): fields = [ FieldSchema(name="film_id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="filmVector", dtype=DataType.FLOAT_VECTOR, dim=5), FieldSchema(name="posterVector", dtype=DataType.FLOAT_VECTOR, dim=5)] schema = CollectionSchema(fields=fields,enable_dynamic_field=False) collection = Collection(name="test_collection1", schema=schema) index_params = {"index_type": "FLAT", "metric_type": "L2"} collection.create_index("filmVector", index_params) collection.create_index("posterVector", index_params) entities = [] for _ in range(1000): film_id = random.randint(1, 1000) film_vector = [ random.random() for _ in range(5) ] poster_vector = [ random.random() for _ in range(5) ] entity = { "film_id": film_id, "filmVector": film_vector, "posterVector": poster_vector } entities.append(entity) collection.insert(entities) query_filmVector = [[0.8896863042430693, 0.370613100114602, 0.23779315077113428, 0.38227915951132996, 0.5997064603128835]] * 2 search_param_1 = { "data": query_filmVector, "anns_field": "filmVector", "param": { "metric_type": "L2", }, "limit": 2 } request_1 = AnnSearchRequest(**search_param_1) query_posterVector = [[0.02550758562349764, 0.006085637357292062, 0.5325251250159071, 0.7676432650114147, 0.5521074424751443]] * 2 search_param_2 = { "data": query_posterVector, "anns_field": "posterVector", "param": { "metric_type": "L2", }, "limit": 2 } request_2 = AnnSearchRequest(**search_param_2) rerank = WeightedRanker(0.8, 0.2) reqs = [request_1, request_2] collection.load() res = collection.hybrid_search( reqs, rerank, limit=2 ) self.assertEqual(len(res[0]), 2) self.assertEqual(len(res[1]), 2) res = collection.hybrid_search( reqs, rerank, limit=5 ) self.assertEqual(len(res[0]), 4) self.assertEqual(len(res[1]), 4) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/test_query.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import unittest from pymilvus import MilvusClient, DataType class TestQuery(unittest.TestCase): def setUp(self): self.dim = 2 self.collection_name = 'default' self.milvus_client = MilvusClient('./local_test.db') has_collection = self.milvus_client.has_collection(self.collection_name, timeout=5) if has_collection: self.milvus_client.drop_collection(self.collection_name) self.milvus_client.create_collection(self.collection_name, self.dim) def tearDown(self): self.milvus_client.drop_collection(self.collection_name) def test_query_empty(self): self.milvus_client.query(self.collection_name, limit=3) rows = [ {'id': 1, 'vector': [0.0, 1], 'a': 100}, ] insert_result = self.milvus_client.insert(self.collection_name, rows) self.assertEqual(insert_result['insert_count'], 1) self.milvus_client.delete(self.collection_name, ids=[1]) self.milvus_client.query(self.collection_name, limit=3) def test_query(self): rows = [ {'id': 1, 'vector': [0.0, 1], 'a': 100}, {'id': 2, 'vector': [0.1, 0.9], 'b': 200}, {'id': 3, 'vector': [0.2, 0.8], 'c': 300}, {'id': 4, 'vector': [0.3, 0.7], 'd': 400}, {'id': 5, 'vector': [0.8, 0.2], 'e': 500}, {'id': 6, 'vector': [1.0, 0.0], 'f': 600}, ] insert_result = self.milvus_client.insert(self.collection_name, rows) self.assertEqual(insert_result['insert_count'], 6) result = self.milvus_client.query(self.collection_name, filter="", limit=3) self.assertEqual(len(result), 3) self.assertEqual(result[0]['id'], 1) self.assertEqual(result[1]['id'], 2) self.assertEqual(result[2]['id'], 3) result = self.milvus_client.query(self.collection_name, filter="", limit=3, offset=5) self.assertEqual(len(result), 1) self.assertEqual(result[0]['id'], 6) result = self.milvus_client.query(self.collection_name, filter="a == 100", limit=3, offset=5) self.assertEqual(len(result), 0) result = self.milvus_client.query(self.collection_name, filter="a == 100", limit=3) self.assertEqual(len(result), 1) class TestArray(unittest.TestCase): def test_query(self): self.dim = 2 self.collection_name = 'default' self.milvus_client = MilvusClient('./local_test.db') has_collection = self.milvus_client.has_collection(self.collection_name, timeout=5) if has_collection: self.milvus_client.drop_collection(self.collection_name) schema = self.milvus_client.create_schema(enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=2) schema.add_field("array", DataType.ARRAY, element_type=DataType.INT64, max_capacity=5) self.milvus_client.create_collection(self.collection_name, self.dim) rows = [ {'id': 1, 'vector': [0.0, 1], 'array': [100, 1]}, {'id': 2, 'vector': [0.1, 0.9], 'array': [200, 2]}, {'id': 3, 'vector': [0.2, 0.8], 'array': [300, 1]}, {'id': 4, 'vector': [0.3, 0.7], 'array': [400, 3]}, {'id': 5, 'vector': [0.8, 0.2], 'array': [500]}, {'id': 6, 'vector': [1.0, 0.0], 'array': [600]}, ] insert_result = self.milvus_client.insert(self.collection_name, rows) self.assertEqual(insert_result['insert_count'], 6) result = self.milvus_client.query( collection_name="default", filter="ARRAY_CONTAINS_ANY(array, [1, 2])", output_fields=["id"], limit=3 ) self.assertEqual(len(result), 3) result = self.milvus_client.query( collection_name="default", filter="ARRAY_CONTAINS_ALL(array, [100, 1])", output_fields=["id"], limit=3 ) self.assertEqual(len(result), 1) result = self.milvus_client.query( collection_name="default", filter="ARRAY_LENGTH(array) == 2", output_fields=["id"], limit=4 ) self.assertEqual(len(result), 4) self.milvus_client.drop_collection(self.collection_name) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/test_schema.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import unittest from pymilvus import MilvusClient, MilvusException, DataType class TestDefaultSearch(unittest.TestCase): def test_schema_field_limits(self): collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema(enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=2) for i in range(62): schema.add_field('a' + str(i), DataType.INT64) index_params = milvus_client.prepare_index_params() index_params.add_index(field_name = "embeddings", metric_type="L2") milvus_client.create_collection(collection_name, schema=schema, index_params=index_params) def test_schema_field_out_limits(self): collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema(enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=2) for i in range(63): schema.add_field('a' + str(i), DataType.INT64) index_params = milvus_client.prepare_index_params() index_params.add_index(field_name = "embeddings", metric_type="L2") with self.assertRaises(MilvusException): milvus_client.create_collection(collection_name, schema=schema, index_params=index_params) def test_varchar_field_maxlen(self): collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema(enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=2) schema.add_field("string", DataType.VARCHAR, max_length=65535) index_params = milvus_client.prepare_index_params() index_params.add_index(field_name = "embeddings", metric_type="L2") milvus_client.create_collection(collection_name, schema=schema, index_params=index_params) def test_varchar_field_out_maxlen(self): collection_name = "hello_milvus" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name) if has_collection: milvus_client.drop_collection(collection_name) schema = milvus_client.create_schema(enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) schema.add_field("embeddings", DataType.FLOAT_VECTOR, dim=2) schema.add_field("string", DataType.VARCHAR, max_length=65536) index_params = milvus_client.prepare_index_params() index_params.add_index(field_name = "embeddings", metric_type="L2") with self.assertRaises(MilvusException): milvus_client.create_collection(collection_name, schema=schema, index_params=index_params) def test_collection_name(self): collection_name = "test_collection_escck" milvus_client = MilvusClient("./local_test.db") has_collection = milvus_client.has_collection(collection_name) if has_collection: milvus_client.drop_collection(collection_name) milvus_client.create_collection(collection_name, dimension=384) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/test_search.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import unittest from pymilvus import MilvusClient, MilvusException class TestDefaultSearch(unittest.TestCase): def setUp(self): self.dim = 2 self.collection_name = 'default' self.milvus_client = MilvusClient('./local_test.db') has_collection = self.milvus_client.has_collection(self.collection_name, timeout=5) if has_collection: self.milvus_client.drop_collection(self.collection_name) self.milvus_client.create_collection(self.collection_name, self.dim) def tearDown(self): self.milvus_client.drop_collection(self.collection_name) def test_index_info(self): index_info = self.milvus_client.describe_index(self.collection_name, 'vector') self.assertEqual(index_info['metric_type'], 'COSINE') self.assertEqual(int(index_info['dim']), self.dim) def test_error_metrics(self): rows = [ {'id': 1, 'vector': [0.0, 1], 'a': 100}, {'id': 2, 'vector': [0.1, 0.9], 'b': 200}, {'id': 3, 'vector': [0.2, 0.8], 'c': 300}, {'id': 4, 'vector': [0.3, 0.7], 'd': 400}, {'id': 5, 'vector': [0.8, 0.2], 'e': 500}, {'id': 6, 'vector': [1.0, 0.0], 'f': 600}, ] insert_result = self.milvus_client.insert(self.collection_name, rows) self.assertEqual(insert_result['insert_count'], 6) with self.assertRaises(MilvusException): self.milvus_client.search(self.collection_name, [[0.0, 1.0]], limit=3, search_params={'metric_type': 'IP'}, consistency_level='Strong') def test_search(self): rows = [ {'id': 1, 'vector': [0.0, 1], 'a': 100}, {'id': 2, 'vector': [0.1, 0.9], 'b': 200}, {'id': 3, 'vector': [0.2, 0.8], 'c': 300}, {'id': 4, 'vector': [0.3, 0.7], 'd': 400}, {'id': 5, 'vector': [0.8, 0.2], 'e': 500}, {'id': 6, 'vector': [1.0, 0.0], 'f': 600}, ] insert_result = self.milvus_client.insert(self.collection_name, rows) self.assertEqual(insert_result['insert_count'], 6) result = self.milvus_client.search(self.collection_name, [[0.0, 1.0]], limit=3, search_params={'metric_type': 'COSINE'}, consistency_level='Strong', output_fields=['vector']) self.assertEqual(len(result[0]), 3) self.assertEqual(result[0][0]['distance'], 1.0) self.assertEqual([item['id']for item in result[0]], [1, 2, 3]) result = self.milvus_client.search(self.collection_name, [[0.0, 1.0]], limit=2, offset=10) self.assertEqual(len(result[0]), 0) result = self.milvus_client.search(self.collection_name, [[0.0, 1.0]], limit=2, offset=5) self.assertEqual(len(result[0]), 1) self.assertEqual(result[0][0]['id'], 6) # range search result = self.milvus_client.search( self.collection_name, [[0.0, 1.0]], limit=3, search_params={ 'metric_type': 'COSINE', "params": { "radius": 0.99, "range_filter": 1.0 } } ) self.assertEqual(len(result[0]), 2) self.assertTrue(0.99 <= result[0][0]['distance'] <= 1.0) self.assertTrue(0.99 <= result[0][1]['distance'] <= 1.0) # range search result = self.milvus_client.search( self.collection_name, [[0.0, 1.0]], limit=3, search_params={ 'metric_type': 'COSINE', "params": { "radius": 0.9, "range_filter": 1.0 } } ) self.assertEqual(len(result[0]), 3) self.assertTrue(0.9 <= result[0][0]['distance'] <= 1.0) self.assertTrue(0.9 <= result[0][1]['distance'] <= 1.0) self.assertTrue(0.9 <= result[0][2]['distance'] <= 1.0) def test_multi_search(self): rows = [ {'id': 1, 'vector': [0.0, 1], 'a': 100}, {'id': 2, 'vector': [0.1, 0.9], 'b': 200}, {'id': 3, 'vector': [0.2, 0.8], 'c': 300}, {'id': 4, 'vector': [0.3, 0.7], 'd': 400}, {'id': 5, 'vector': [0.8, 0.2], 'e': 500}, {'id': 6, 'vector': [1.0, 0.0], 'f': 600}, ] insert_result = self.milvus_client.insert(self.collection_name, rows) self.assertEqual(insert_result['insert_count'], 6) result = self.milvus_client.search(self.collection_name, [[0.0, 1.0], [1.0, 0.0]], limit=3, search_params={'metric_type': 'COSINE'}, consistency_level='Strong') self.assertEqual(len(result), 2) self.assertEqual(result[0][0]['distance'], 1.0) self.assertEqual([item['id']for item in result[0]], [1, 2, 3]) self.assertEqual(result[1][0]['distance'], 1.0) self.assertEqual([item['id']for item in result[1]], [6, 5, 4]) result = self.milvus_client.search(self.collection_name, [[0.0, 1.0], [1.0, 0.0]], consistency_level='Strong') self.assertEqual(len(result), 2) self.assertEqual([item['id']for item in result[0]], [1, 2, 3, 4, 5, 6]) self.assertEqual([item['id']for item in result[1]], [6, 5, 4, 3, 2, 1]) class TestIndexMetric(unittest.TestCase): def setUp(self): self.dim = 2 self.collection_name = 'hello_milvus' self.milvus_client = MilvusClient('./local_test.db') has_collection = self.milvus_client.has_collection(self.collection_name, timeout=5) if has_collection: self.milvus_client.drop_collection(self.collection_name) def tearDown(self): self.milvus_client.drop_collection(self.collection_name) def test_L2(self): self.milvus_client.create_collection(self.collection_name, self.dim, metric_type="L2") index_info = self.milvus_client.describe_index(self.collection_name, 'vector') self.assertEqual(index_info['metric_type'], 'L2') self.assertEqual(int(index_info['dim']), self.dim) rows = [ {'id': 1, 'vector': [0.0, 1], 'a': 100}, {'id': 2, 'vector': [0.1, 0.9], 'b': 200}, {'id': 3, 'vector': [0.2, 0.8], 'c': 300}, {'id': 4, 'vector': [0.3, 0.7], 'd': 400}, {'id': 5, 'vector': [0.8, 0.2], 'e': 500}, {'id': 6, 'vector': [1.0, 0.0], 'f': 600}, ] insert_result = self.milvus_client.insert(self.collection_name, rows) self.assertEqual(insert_result['insert_count'], 6) result = self.milvus_client.search(self.collection_name, [[0.0, 1.0], [1.0, 0.0]], limit=3, search_params={'metric_type': 'L2'}, consistency_level='Strong') self.assertEqual(len(result), 2) self.assertEqual(result[0][0]['distance'], 0.0) self.assertEqual([item['id']for item in result[0]], [1, 2, 3]) self.assertEqual(result[1][0]['distance'], 0.0) self.assertEqual([item['id']for item in result[1]], [6, 5, 4]) result = self.milvus_client.search(self.collection_name, [[0.0, 1.0], [1.0, 0.0]], consistency_level='Strong') self.assertEqual(len(result), 2) self.assertEqual([item['id']for item in result[0]], [1, 2, 3, 4, 5, 6]) self.assertEqual([item['id']for item in result[1]], [6, 5, 4, 3, 2, 1]) def test_IP(self): self.milvus_client.create_collection(self.collection_name, self.dim, metric_type="IP") index_info = self.milvus_client.describe_index(self.collection_name, 'vector') self.assertEqual(index_info['metric_type'], 'IP') self.assertEqual(int(index_info['dim']), self.dim) rows = [ {'id': 1, 'vector': [0.0, 1], 'a': 100}, {'id': 2, 'vector': [0.1, 0.9], 'b': 200}, {'id': 3, 'vector': [0.2, 0.8], 'c': 300}, {'id': 4, 'vector': [0.3, 0.7], 'd': 400}, {'id': 5, 'vector': [0.8, 0.2], 'e': 500}, {'id': 6, 'vector': [1.0, 0.0], 'f': 600}, ] insert_result = self.milvus_client.insert(self.collection_name, rows) self.assertEqual(insert_result['insert_count'], 6) result = self.milvus_client.search(self.collection_name, [[0.0, 1.0], [1.0, 0.0]], limit=3, search_params={'metric_type': 'IP'}, consistency_level='Strong') self.assertEqual(len(result), 2) self.assertEqual(result[0][0]['distance'], 1.0) self.assertEqual([item['id']for item in result[0]], [1, 2, 3]) self.assertEqual(result[1][0]['distance'], 1.0) self.assertEqual([item['id']for item in result[1]], [6, 5, 4]) result = self.milvus_client.search(self.collection_name, [[0.0, 1.0], [1.0, 0.0]], consistency_level='Strong') self.assertEqual(len(result), 2) self.assertEqual([item['id']for item in result[0]], [1, 2, 3, 4, 5, 6]) self.assertEqual([item['id']for item in result[1]], [6, 5, 4, 3, 2, 1]) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/test_sparse.py ================================================ # Copyright (C) 2019-2024 Zilliz. 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. import unittest from pymilvus import MilvusClient, MilvusException, FieldSchema, CollectionSchema, DataType from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer from pymilvus.model.sparse import BM25EmbeddingFunction def csr_to_dict(csr): coo = csr.tocoo() ret = {} for i, j, v in zip(coo.row, coo.col, coo.data): ret[j] = v return ret class TestSparse(unittest.TestCase): def setUp(self): self.dim = 2 self.collection_name = 'hello_milvus' self.milvus_client = MilvusClient('./local_test.db') has_collection = self.milvus_client.has_collection(self.collection_name, timeout=5) if has_collection: self.milvus_client.drop_collection(self.collection_name) fields = [ FieldSchema(name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100), FieldSchema(name="num", dtype=DataType.INT64), FieldSchema(name="embeddings", dtype=DataType.SPARSE_FLOAT_VECTOR), ] schema = CollectionSchema( fields, "demo for using sparse float vector with milvus client") index_params = self.milvus_client.prepare_index_params() index_params.add_index(field_name="embeddings", index_name="sparse_inverted_index", index_type="SPARSE_INVERTED_INDEX", metric_type="IP", params={"drop_ratio_build": 0.2}) self.milvus_client.create_collection(self.collection_name, schema=schema, index_params=index_params, timeout=5, consistency_level="Strong") def compare(self, crs, sparse_return): src = csr_to_dict(crs) for index, score in sparse_return.items(): self.assertAlmostEqual(score, src[index]) def tearDown(self): self.milvus_client.drop_collection(self.collection_name) def test_query(self): analyzer = build_default_analyzer(language="en") corpus = [ "Artificial intelligence was founded as an academic discipline in 1956.", "Alan Turing was the first person to conduct substantial research in AI.", "Born in Maida Vale, London, Turing was raised in southern England. Artificial intelligence", ] bm25_ef = BM25EmbeddingFunction(analyzer) bm25_ef.fit(corpus) rows = [{"num": i, "embeddings": bm25_ef.encode_documents([corpus[i]])} for i in range(len(corpus))] insert_result = self.milvus_client.insert(self.collection_name, rows, progress_bar=True) self.assertEqual(insert_result['insert_count'], 3) query_results = self.milvus_client.query(self.collection_name, filter="num <= 1") self.assertEqual([item['num'] for item in query_results], [0, 1]) for i in range(len(query_results)): self.compare(rows[i]['embeddings'], query_results[i]['embeddings']) query_results = self.milvus_client.query(self.collection_name, filter="num <= 2", offset=1) self.assertEqual([item['num'] for item in query_results], [1, 2]) for i in range(len(query_results)): self.compare(rows[i+1]['embeddings'], query_results[i]['embeddings']) query_results = self.milvus_client.query(self.collection_name, filter="num <= 100") self.assertEqual([item['num'] for item in query_results], [0, 1, 2]) for i in range(len(query_results)): self.compare(rows[i]['embeddings'], query_results[i]['embeddings']) query_results = self.milvus_client.query(self.collection_name, filter="num <= 100", offset=10) self.assertEqual([item['num'] for item in query_results], []) def test_search(self): analyzer = build_default_analyzer(language="en") corpus = [ "Artificial intelligence was founded as an academic discipline in 1956.", "Alan Turing was the first person to conduct substantial research in AI.", "Born in Maida Vale, London, Turing was raised in southern England. Artificial intelligence", ] bm25_ef = BM25EmbeddingFunction(analyzer) bm25_ef.fit(corpus) rows = [{"num": i, "embeddings": bm25_ef.encode_documents([corpus[i]])} for i in range(len(corpus))] insert_result = self.milvus_client.insert(self.collection_name, rows, progress_bar=True) self.assertEqual(insert_result['insert_count'], 3) # single search vectors_to_search = bm25_ef.encode_queries([corpus[0]]) search_params = { "metric_type": "IP", "params": { "drop_ratio_search": 0.0, } } result = self.milvus_client.search(self.collection_name, vectors_to_search, limit=3, output_fields=[ "pk", "num", "embeddings"], search_params=search_params) self.assertEqual(len(result[0]), 2) self.assertEqual([item['entity']['num'] for item in result[0]], [0, 2]) self.assertEqual([item['distance'] for item in result[0]], [2.507876396179199, 0.16398896276950836]) result_rows = [rows[0], rows[2]] for i in range(len(result[0])): self.compare(result_rows[i]['embeddings'], result[0][i]['entity']['embeddings']) # multi search vectors_to_search = bm25_ef.encode_queries(corpus) search_params = { "metric_type": "IP", "params": { "drop_ratio_search": 0.0, } } result = self.milvus_client.search(self.collection_name, vectors_to_search, limit=3, output_fields=[ "pk", "num", "embeddings"], search_params=search_params) index = 0 self.assertEqual(len(result[index]), 2) self.assertEqual([item['entity']['num'] for item in result[index]], [0, 2]) self.assertEqual([item['distance'] for item in result[index]], [2.507876396179199, 0.16398896276950836]) result_rows = [rows[0], rows[2]] for i in range(len(result[index])): self.compare(result_rows[i]['embeddings'], result[index][i]['entity']['embeddings']) index = 1 self.assertEqual(len(result[index]), 2) self.assertEqual([item['entity']['num'] for item in result[index]], [1, 2]) self.assertEqual([item['distance'] for item in result[index]], [3.6669983863830566, 0.08199448138475418]) result_rows = [rows[1], rows[2]] for i in range(len(result[index])): self.compare(result_rows[i]['embeddings'], result[index][i]['entity']['embeddings']) index = 2 self.assertEqual(len(result[index]), 3) self.assertEqual([item['entity']['num'] for item in result[index]], [2, 0, 1]) self.assertEqual([item['distance'] for item in result[index]], [3.460167407989502, 0.20556363463401794, 0.09121885895729065]) result_rows = [rows[2], rows[0], rows[1]] for i in range(len(result[index])): self.compare(result_rows[i]['embeddings'], result[index][i]['entity']['embeddings']) result = self.milvus_client.search(self.collection_name, vectors_to_search, limit=3, output_fields=[ "pk", "num", "embeddings"], search_params=search_params, offset=2) self.assertEqual(len(result[0]), 0) self.assertEqual(len(result[1]), 0) index = 2 self.assertEqual(len(result[index]), 1) self.assertEqual([item['entity']['num'] for item in result[index]], [1]) self.assertEqual([item['distance'] for item in result[index]], [0.09121885895729065]) result_rows = [rows[1]] for i in range(len(result[index])): self.compare(result_rows[i]['embeddings'], result[index][i]['entity']['embeddings']) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/testcases/test_collection.py ================================================ import random import numpy import pandas as pd import pytest from pymilvus import DataType from base.client_base import TestcaseBase from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks from utils.util_pymilvus import * from utils.util_log import test_log as log from base.high_level_api_wrapper import HighLevelApiWrapper prefix = "collection" exp_name = "name" exp_schema = "schema" exp_num = "num_entities" exp_primary = "primary" exp_shards_num = "shards_num" default_term_expr = f'{ct.default_int64_field_name} in [0, 1]' default_schema = cf.gen_default_collection_schema() default_binary_schema = cf.gen_default_binary_collection_schema() default_shards_num = 1 uid_count = "collection_count" tag = "collection_count_tag" uid_stats = "get_collection_stats" uid_create = "create_collection" uid_describe = "describe_collection" uid_drop = "drop_collection" uid_has = "has_collection" uid_list = "list_collections" uid_load = "load_collection" partition1 = 'partition1' partition2 = 'partition2' field_name = default_float_vec_field_name default_single_query = { "data": gen_vectors(1, default_dim), "anns_field": default_float_vec_field_name, "param": {"metric_type": "L2", "params": {"nprobe": 10}}, "limit": default_top_k, } default_index_params = {"index_type": "HNSW", "metric_type": "L2", "params": {"M": 48, "efConstruction": 500}} default_binary_index_params = {"index_type": "BIN_FLAT", "metric_type": "JACCARD", "params": {"nlist": 64}} default_nq = ct.default_nq default_search_exp = "int64 >= 0" default_limit = ct.default_limit vectors = [[random.random() for _ in range(default_dim)] for _ in range(default_nq)] default_search_field = ct.default_float_vec_field_name default_search_params = ct.default_search_params max_vector_field_num = ct.max_vector_field_num sparse_vector_data_type = "SPARSE_FLOAT_VECTOR" client_w = HighLevelApiWrapper() default_dim = ct.default_dim class TestCollectionParams(TestcaseBase): """ Test case of collection interface """ @pytest.fixture(scope="function", params=ct.get_invalid_strs) def get_none_removed_invalid_strings(self, request): if request.param is None: pytest.skip("None schema is valid") yield request.param @pytest.fixture(scope="function", params=ct.get_invalid_type_fields) def get_invalid_type_fields(self, request): if isinstance(request.param, list): pytest.skip("list is valid fields") yield request.param @pytest.fixture(scope="function", params=cf.gen_all_type_fields()) def get_unsupported_primary_field(self, request): if request.param.dtype == DataType.INT64 or request.param.dtype == DataType.VARCHAR: pytest.skip("int64 type is valid primary key") yield request.param @pytest.fixture(scope="function", params=ct.get_invalid_strs) def get_invalid_dim(self, request): if request.param == 1: pytest.skip("1 is valid dim") yield request.param @pytest.mark.tags(CaseLabel.L0) def test_collection(self, enable_milvus_local_api): """ target: test collection with default schema method: create collection with default schema expected: assert collection property """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) self.collection_wrap.init_collection(c_name, schema=default_schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema, exp_num: 0, exp_primary: ct.default_int64_field_name}) assert c_name in self.utility_wrap.list_collections()[0] @pytest.mark.tags(CaseLabel.L2) def test_collection_empty_name(self, enable_milvus_local_api): """ target: test collection with empty name method: create collection with an empty name expected: raise exception """ client = self._connect(enable_milvus_local_api=enable_milvus_local_api) c_name = "" error = {ct.err_code: 1, ct.err_msg: f'`collection_name` value is illegal'} client_w.create_collection(client, c_name, default_dim, schema=default_schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("name", [[], 1, [1, "2", 3], (1,), {1: 1}, "qw$_o90", "1ns_", None]) def test_collection_illegal_name(self, name, enable_milvus_local_api): """ target: test collection with illegal name method: create collection with illegal name expected: raise exception """ client = self._connect(enable_milvus_local_api=enable_milvus_local_api) error1 = {ct.err_code: 1, ct.err_msg: "`collection_name` value {} is illegal".format(name)} error2 = {ct.err_code: 1100, ct.err_msg: "Invalid collection name: 1ns_. the first character of a" " collection name must be an underscore or letter: invalid" " parameter".format(name)} error = error1 if name not in ["1ns_", "qw$_o90"] else error2 client_w.create_collection(client, name, default_dim, schema=default_schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("name", ["_co11ection", "co11_ection"]) def test_collection_naming_rules(self, name, enable_milvus_local_api): """ target: test collection with valid name method: 1. connect milvus 2. Create a field with a name which uses all the supported elements in the naming rules 3. Create a collection with a name which uses all the supported elements in the naming rules expected: Collection created successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) fields = [cf.gen_int64_field(), cf.gen_int64_field("_1nt"), cf.gen_float_vec_field("f10at_")] schema = cf.gen_collection_schema(fields=fields, primary_field=ct.default_int64_field_name) self.collection_wrap.init_collection(name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#", "".join("a" for i in range(ct.max_name_length + 1))]) def test_collection_invalid_name(self, name, enable_milvus_local_api): """ target: test collection with invalid name method: create collection with invalid name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 1, ct.err_msg: "Invalid collection name: {}".format(name)} self.collection_wrap.init_collection(name, schema=default_schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L0) def test_collection_dup_name(self, enable_milvus_local_api): """ target: test collection with dup name method: create collection with dup name and none schema and data expected: collection properties consistent """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) self.collection_wrap.init_collection(collection_w.name) assert collection_w.name == self.collection_wrap.name assert collection_w.schema == self.collection_wrap.schema assert collection_w.num_entities == self.collection_wrap.num_entities assert collection_w.name in self.utility_wrap.list_collections()[0] @pytest.mark.tags(CaseLabel.L2) def test_collection_dup_name_with_desc(self, enable_milvus_local_api): """ target: test collection with dup name method: 1. default schema with desc 2. dup name collection expected: desc consistent """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) schema = cf.gen_default_collection_schema(description=ct.collection_desc) collection_w = self.init_collection_wrap(name=c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) self.collection_wrap.init_collection(c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) assert collection_w.description == self.collection_wrap.description @pytest.mark.tags(CaseLabel.L1) def test_collection_dup_name_new_schema(self, enable_milvus_local_api): """ target: test collection with dup name and new schema method: 1.create collection with default schema 2. collection with dup name and new schema expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) self.init_collection_wrap(name=c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) fields = [cf.gen_int64_field(is_primary=True)] schema = cf.gen_collection_schema(fields=fields) error = {ct.err_code: 0, ct.err_msg: "The collection already exist, but the schema is not the same as the " "schema passed in."} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_dup_name_new_primary(self,enable_milvus_local_api): """ target: test collection with dup name and new primary_field schema method: 1.collection with default schema 2. collection with same fields and new primary_field schema expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_field_one = cf.gen_int64_field() int_field_two = cf.gen_int64_field(name="int2") fields = [int_field_one, int_field_two, cf.gen_float_vec_field()] schema = cf.gen_collection_schema(fields, primary_field=int_field_one.name) collection_w = self.init_collection_wrap(name=c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema, exp_primary: int_field_one.name}) new_schema = cf.gen_collection_schema(fields, primary_field=int_field_two.name) error = {ct.err_code: 0, ct.err_msg: "The collection already exist, but the schema is not the same as the " "schema passed in."} self.collection_wrap.init_collection(c_name, schema=new_schema, check_task=CheckTasks.err_res, check_items=error) assert collection_w.primary_field.name == int_field_one.name @pytest.mark.tags(CaseLabel.L1) def test_collection_dup_name_new_dim(self, enable_milvus_local_api): """ target: test collection with dup name and new dim schema method: 1. default schema 2. schema with new dim expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) new_dim = 120 c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) schema = cf.gen_default_collection_schema() new_fields = cf.gen_float_vec_field(dim=new_dim) schema.fields[-1] = new_fields error = {ct.err_code: 0, ct.err_msg: "The collection already exist, but the schema is not the same as the " "schema passed in."} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) dim = collection_w.schema.fields[-1].params['dim'] assert dim == ct.default_dim @pytest.mark.tags(CaseLabel.L2) def test_collection_dup_name_invalid_schema_type(self, get_none_removed_invalid_strings, enable_milvus_local_api): """ target: test collection with dup name and invalid schema method: 1. default schema 2. invalid schema expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) error = {ct.err_code: 0, ct.err_msg: "Schema type must be schema.CollectionSchema"} schema = get_none_removed_invalid_strings self.collection_wrap.init_collection(collection_w.name, schema=schema, check_task=CheckTasks.err_res, check_items=error) assert collection_w.name == c_name @pytest.mark.tags(CaseLabel.L1) def test_collection_dup_name_same_schema(self, enable_milvus_local_api): """ target: test collection with dup name and same schema method: dup name and same schema expected: two collection object is available """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, schema=default_schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) self.collection_wrap.init_collection(name=c_name, schema=default_schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) assert collection_w.name == self.collection_wrap.name @pytest.mark.tags(CaseLabel.L2) def test_collection_none_schema(self, enable_milvus_local_api): """ target: test collection with none schema method: create collection with none schema expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) error = {ct.err_code: 1, ct.err_msg: "Collection '%s' not exist, or you can pass in schema to create one."} self.collection_wrap.init_collection(c_name, schema=None, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_invalid_type_schema(self, get_none_removed_invalid_strings, enable_milvus_local_api): """ target: test collection with invalid schema method: create collection with non-CollectionSchema type schema expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) error = {ct.err_code: 0, ct.err_msg: "Schema type must be schema.CollectionSchema"} self.collection_wrap.init_collection(c_name, schema=get_none_removed_invalid_strings, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_invalid_type_fields(self, get_invalid_type_fields, enable_milvus_local_api): """ target: test collection with invalid fields type, non-list method: create collection schema with non-list invalid fields expected: exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) fields = get_invalid_type_fields error = {ct.err_code: 1, ct.err_msg: "The fields of schema must be type list."} self.collection_schema_wrap.init_collection_schema(fields=fields, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_with_unknown_type(self, enable_milvus_local_api): """ target: test collection with unknown type method: create with DataType.UNKNOWN expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 1, ct.err_msg: "Field dtype must be of DataType"} self.field_schema_wrap.init_field_schema(name="unknown", dtype=DataType.UNKNOWN, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("name", [[], 1, (1,), {1: 1}, "12-s"]) @pytest.mark.xfail(reason="incorrect error code: 1701 - 1100") def test_collection_invalid_type_field(self, name, enable_milvus_local_api): """ target: test collection with invalid field name method: invalid string name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) field, _ = self.field_schema_wrap.init_field_schema(name=name, dtype=5, is_primary=True) vec_field = cf.gen_float_vec_field() schema = cf.gen_collection_schema(fields=[field, vec_field]) error = {ct.err_code: 1701, ct.err_msg: f"bad argument type for built-in"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#", "a".join("a" for i in range(256))]) def test_collection_invalid_field_name(self, name, enable_milvus_local_api): """ target: test collection with invalid field name method: invalid string name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) field, _ = self.field_schema_wrap.init_field_schema(name=name, dtype=DataType.INT64, is_primary=True) vec_field = cf.gen_float_vec_field() schema = cf.gen_collection_schema(fields=[field, vec_field]) error = {ct.err_code: 1, ct.err_msg: "Invalid field name"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="incorrect error code: 1701 - 1100") def test_collection_none_field_name(self, enable_milvus_local_api): """ target: test field schema with None name method: None field name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) field, _ = self.field_schema_wrap.init_field_schema(name=None, dtype=DataType.INT64, is_primary=True) schema = cf.gen_collection_schema(fields=[field, cf.gen_float_vec_field()]) error = {ct.err_code: 1701, ct.err_msg: "field name should not be empty"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("dtype", [6, [[]], {}, (), "", "a"]) def test_collection_invalid_field_type(self, dtype, enable_milvus_local_api): """ target: test collection with invalid field type method: invalid DataType expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 0, ct.err_msg: "Field dtype must be of DataType"} self.field_schema_wrap.init_field_schema(name="test", dtype=dtype, is_primary=True, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="incorrect error message") def test_collection_field_dtype_float_value(self, enable_milvus_local_api): """ target: test collection with float type method: create field with float type expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) field, _ = self.field_schema_wrap.init_field_schema(name=ct.default_int64_field_name, dtype=5.0, is_primary=True) schema = cf.gen_collection_schema(fields=[field, cf.gen_float_vec_field()]) error = {ct.err_code: 0, ct.err_msg: "Field type must be of DataType!"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_empty_fields(self, enable_milvus_local_api): """ target: test collection with empty fields method: create collection with fields = [] expected: exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 1, ct.err_msg: "Schema must have a primary key field."} self.collection_schema_wrap.init_collection_schema(fields=[], primary_field=ct.default_int64_field_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.xfail(reason="incorrect error code:1100") def test_collection_dup_field(self, enable_milvus_local_api): """ target: test collection with dup field name method: Two FieldSchema have same name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) field_one = cf.gen_int64_field(is_primary=True) field_two = cf.gen_int64_field() schema = cf.gen_collection_schema(fields=[field_one, field_two, cf.gen_float_vec_field()]) error = {ct.err_code: 1, ct.err_msg: "duplicated field name"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) assert not self.utility_wrap.has_collection(c_name)[0] @pytest.mark.tags(CaseLabel.L0) @pytest.mark.parametrize("field", [cf.gen_float_vec_field(), cf.gen_binary_vec_field()]) def test_collection_only_vector_field(self, field, enable_milvus_local_api): """ target: test collection just with vec field method: create with float-vec fields expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 1, ct.err_msg: "Schema must have a primary key field."} self.collection_schema_wrap.init_collection_schema([field], check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_multi_float_vectors(self, enable_milvus_local_api): """ target: test collection with multi float vectors method: create collection with two float-vec fields expected: Collection created successfully """ # 1. connect self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # 2. create collection with multiple vectors c_name = cf.gen_unique_str(prefix) fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(), cf.gen_float_vec_field(dim=default_dim), cf.gen_float_vec_field(name="tmp", dim=default_dim)] schema = cf.gen_collection_schema(fields=fields) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L1) def test_collection_mix_vectors(self, enable_milvus_local_api): """ target: test collection with mix vectors method: create with float and binary vec expected: Collection created successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_vec_field(), cf.gen_binary_vec_field()] schema = cf.gen_collection_schema(fields=fields, auto_id=True) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L0) def test_collection_without_vectors(self, enable_milvus_local_api): """ target: test collection without vectors method: create collection only with int field expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) schema = cf.gen_collection_schema([cf.gen_int64_field(is_primary=True)]) error = {ct.err_code: 0, ct.err_msg: "No vector field is found."} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_collection_without_primary_field(self, enable_milvus_local_api): """ target: test collection without primary field method: no primary field specified in collection schema and fields expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) int_fields, _ = self.field_schema_wrap.init_field_schema(name=ct.default_int64_field_name, dtype=DataType.INT64) vec_fields, _ = self.field_schema_wrap.init_field_schema(name=ct.default_float_vec_field_name, dtype=DataType.FLOAT_VECTOR, dim=ct.default_dim) error = {ct.err_code: 1, ct.err_msg: "Schema must have a primary key field."} self.collection_schema_wrap.init_collection_schema([int_fields, vec_fields], check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_is_primary_false(self, enable_milvus_local_api): """ target: test collection with all is_primary false method: set all fields if_primary false expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) fields = [cf.gen_int64_field(is_primary=False), cf.gen_float_field(is_primary=False), cf.gen_float_vec_field(is_primary=False)] error = {ct.err_code: 1, ct.err_msg: "Schema must have a primary key field."} self.collection_schema_wrap.init_collection_schema(fields, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("is_primary", ct.get_invalid_strs) def test_collection_invalid_is_primary(self, is_primary, enable_milvus_local_api): """ target: test collection with invalid primary method: define field with is_primary=non-bool expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) name = cf.gen_unique_str(prefix) error = {ct.err_code: 0, ct.err_msg: "Param is_primary must be bool type"} self.field_schema_wrap.init_field_schema(name=name, dtype=DataType.INT64, is_primary=is_primary, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", ["12-s", "12 s", "(mn)", "中文", "%$#", "a".join("a" for i in range(256))]) def test_collection_invalid_primary_field(self, primary_field, enable_milvus_local_api): """ target: test collection with invalid primary_field method: specify invalid string primary_field in collection schema expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) fields = [cf.gen_int64_field(), cf.gen_float_vec_field()] error = {ct.err_code: 1, ct.err_msg: "Schema must have a primary key field."} self.collection_schema_wrap.init_collection_schema(fields=fields, primary_field=primary_field, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [[], 1, [1, "2", 3], (1,), {1: 1}, None]) def test_collection_non_string_primary_field(self, primary_field, enable_milvus_local_api): """ target: test collection with non-string primary_field method: primary_field type is not string expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) fields = [cf.gen_int64_field(), cf.gen_float_vec_field()] error = {ct.err_code: 1, ct.err_msg: "Param primary_field must be str type."} self.collection_schema_wrap.init_collection_schema(fields, primary_field=primary_field, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_not_existed_primary_field(self, enable_milvus_local_api): """ target: test collection with not exist primary field method: specify not existed field as primary_field expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) fake_field = cf.gen_unique_str() fields = [cf.gen_int64_field(), cf.gen_float_vec_field()] error = {ct.err_code: 1, ct.err_msg: "Schema must have a primary key field."} self.collection_schema_wrap.init_collection_schema(fields, primary_field=fake_field, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L0) def test_collection_primary_in_schema(self, enable_milvus_local_api): """ target: test collection with primary field method: specify primary field in CollectionSchema expected: collection.primary_field """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) schema = cf.gen_default_collection_schema(primary_field=ct.default_int64_field_name) self.collection_wrap.init_collection(c_name, schema=schema) assert self.collection_wrap.primary_field.name == ct.default_int64_field_name @pytest.mark.tags(CaseLabel.L0) def test_collection_primary_in_field(self, enable_milvus_local_api): """ target: test collection with primary field method: specify primary field in FieldSchema expected: collection.primary_field """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(), cf.gen_float_vec_field()] schema, _ = self.collection_schema_wrap.init_collection_schema(fields) self.collection_wrap.init_collection(cf.gen_unique_str(prefix), schema=schema) assert self.collection_wrap.primary_field.name == ct.default_int64_field_name @pytest.mark.tags(CaseLabel.L2) def test_collection_unsupported_primary_field(self, get_unsupported_primary_field, enable_milvus_local_api): """ target: test collection with unsupported primary field type method: specify non-int64 as primary field expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) field = get_unsupported_primary_field vec_field = cf.gen_float_vec_field(name="vec") error = {ct.err_code: 1, ct.err_msg: "Primary key type must be DataType.INT64 or DataType.VARCHAR."} self.collection_schema_wrap.init_collection_schema(fields=[field, vec_field], primary_field=field.name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_collection_multi_primary_fields(self, enable_milvus_local_api): """ target: test collection with multi primary method: collection with two primary fields expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) int_field_one = cf.gen_int64_field(is_primary=True) int_field_two = cf.gen_int64_field(name="int2", is_primary=True) error = {ct.err_code: 0, ct.err_msg: "Expected only one primary key field"} self.collection_schema_wrap.init_collection_schema( fields=[int_field_one, int_field_two, cf.gen_float_vec_field()], check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_primary_inconsistent(self, enable_milvus_local_api): """ target: test collection with different primary field setting method: 1. set A field is_primary 2. set primary_field is B expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) int_field_one = cf.gen_int64_field(is_primary=True) int_field_two = cf.gen_int64_field(name="int2") fields = [int_field_one, int_field_two, cf.gen_float_vec_field()] error = {ct.err_code: 1, ct.err_msg: "Expected only one primary key field"} self.collection_schema_wrap.init_collection_schema(fields, primary_field=int_field_two.name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_collection_primary_consistent(self, enable_milvus_local_api): """ target: test collection with both collection schema and field schema method: 1. set A field is_primary 2.set primary_field is A expected: verify primary field """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_field_one = cf.gen_int64_field(is_primary=True) schema = cf.gen_collection_schema(fields=[int_field_one, cf.gen_float_vec_field()], primary_field=int_field_one.name) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L0) @pytest.mark.parametrize("auto_id", [True, False]) def test_collection_auto_id_in_field_schema(self, auto_id, enable_milvus_local_api): """ target: test collection with auto_id in field schema method: specify auto_id True in field schema expected: verify schema's auto_id """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_field = cf.gen_int64_field(is_primary=True, auto_id=auto_id) vec_field = cf.gen_float_vec_field(name='vec') schema, _ = self.collection_schema_wrap.init_collection_schema([int_field, vec_field]) assert schema.auto_id == auto_id self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L0) @pytest.mark.parametrize("auto_id", [True, False]) def test_collection_auto_id_in_collection_schema(self, auto_id, enable_milvus_local_api): """ target: test collection with auto_id in collection schema method: specify auto_id True in collection schema expected: verify schema auto_id and collection schema """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field(name='vec') schema, _ = self.collection_schema_wrap.init_collection_schema([int_field, vec_field], auto_id=auto_id) assert schema.auto_id == auto_id self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) def test_collection_auto_id_non_primary_field(self, enable_milvus_local_api): """ target: test collection set auto_id in non-primary field method: set auto_id=True in non-primary field expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 0, ct.err_msg: "auto_id can only be specified on the primary key field"} self.field_schema_wrap.init_field_schema(name=ct.default_int64_field_name, dtype=DataType.INT64, auto_id=True, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_auto_id_false_non_primary(self, enable_milvus_local_api): """ target: test collection set auto_id in non-primary field method: set auto_id=True in non-primary field expected: verify schema auto_id is False """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) int_field_one = cf.gen_int64_field(is_primary=True) int_field_two = cf.gen_int64_field(name='int2', auto_id=False) fields = [int_field_one, int_field_two, cf.gen_float_vec_field()] schema, _ = self.collection_schema_wrap.init_collection_schema(fields) assert not schema.auto_id @pytest.mark.tags(CaseLabel.L2) def test_collection_auto_id_inconsistent(self, enable_milvus_local_api): """ target: test collection auto_id with both collection schema and field schema method: 1.set primary field auto_id=True in field schema 2.set auto_id=False in collection schema expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) int_field = cf.gen_int64_field(is_primary=True, auto_id=True) vec_field = cf.gen_float_vec_field(name='vec') schema, _ = self.collection_schema_wrap.init_collection_schema([int_field, vec_field], auto_id=False) assert schema.auto_id @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("auto_id", [True, False]) def test_collection_auto_id_consistent(self, auto_id, enable_milvus_local_api): """ target: test collection auto_id with both collection schema and field schema method: set auto_id=True/False both field and schema expected: verify auto_id """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) int_field = cf.gen_int64_field(is_primary=True, auto_id=auto_id) vec_field = cf.gen_float_vec_field(name='vec') schema, _ = self.collection_schema_wrap.init_collection_schema([int_field, vec_field], auto_id=auto_id) assert schema.auto_id == auto_id @pytest.mark.tags(CaseLabel.L2) def test_collection_auto_id_none_in_field(self, enable_milvus_local_api): """ target: test collection with auto_id is None method: set auto_id=None expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 0, ct.err_msg: "Param auto_id must be bool type"} self.field_schema_wrap.init_field_schema(name=ct.default_int64_field_name, dtype=DataType.INT64, is_primary=True, auto_id=None, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("auto_id", ct.get_invalid_strs) def test_collection_invalid_auto_id(self, auto_id, enable_milvus_local_api): """ target: test collection with invalid auto_id method: define field with auto_id=non-bool expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field(name='vec') error = {ct.err_code: 0, ct.err_msg: "Param auto_id must be bool type"} self.collection_schema_wrap.init_collection_schema([int_field, vec_field], auto_id=auto_id, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_multi_fields_auto_id(self, enable_milvus_local_api): """ target: test collection auto_id with multi fields method: specify auto_id=True for multi int64 fields expected: todo raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 0, ct.err_msg: "auto_id can only be specified on the primary key field"} cf.gen_int64_field(is_primary=True, auto_id=True) self.field_schema_wrap.init_field_schema(name="int", dtype=DataType.INT64, auto_id=True, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("dtype", [DataType.FLOAT_VECTOR, DataType.BINARY_VECTOR]) @pytest.mark.xfail(reason="incorrect error code") def test_collection_vector_without_dim(self, dtype, enable_milvus_local_api): """ target: test collection without dimension method: define vector field without dim expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) float_vec_field, _ = self.field_schema_wrap.init_field_schema(name="vec", dtype=dtype) schema = cf.gen_collection_schema(fields=[cf.gen_int64_field(is_primary=True), float_vec_field]) error = {ct.err_code: 1, ct.err_msg: "dimension is not defined in field type params"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="issue #29796") def test_collection_vector_invalid_dim(self, get_invalid_dim, enable_milvus_local_api): """ target: test collection with invalid dimension method: define float-vec field with invalid dimension expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) float_vec_field = cf.gen_float_vec_field(dim=get_invalid_dim) schema = cf.gen_collection_schema(fields=[cf.gen_int64_field(is_primary=True), float_vec_field]) error = {ct.err_code: 65535, ct.err_msg: "strconv.ParseInt: parsing \"[]\": invalid syntax"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("dim", [-1, 0, 32769]) @pytest.mark.xfail(reason="milvus lite no exception thrown") def test_collection_vector_out_bounds_dim(self, dim, enable_milvus_local_api): """ target: test collection with out of bounds dim method: invalid dim -1 and 32759 expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) float_vec_field = cf.gen_float_vec_field(dim=dim) schema = cf.gen_collection_schema(fields=[cf.gen_int64_field(is_primary=True), float_vec_field]) error = {ct.err_code: 65535, ct.err_msg: "invalid dimension: {}.".format(dim)} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_collection_non_vector_field_dim(self, enable_milvus_local_api): """ target: test collection with dim for non-vector field method: define int64 field with dim expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_field, _ = self.field_schema_wrap.init_field_schema(name=ct.default_int64_field_name, dtype=DataType.INT64, dim=ct.default_dim) float_vec_field = cf.gen_float_vec_field() schema = cf.gen_collection_schema(fields=[int_field, float_vec_field], primary_field=ct.default_int64_field_name) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L1) def test_collection_desc(self, enable_milvus_local_api): """ target: test collection with description method: create with description expected: assert default description """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) schema = cf.gen_default_collection_schema(description=ct.collection_desc) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) def test_collection_none_desc(self, enable_milvus_local_api): """ target: test collection with none description method: create with none description expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) schema = cf.gen_default_collection_schema(description=None) error = {ct.err_code: 1, ct.err_msg: "None has type NoneType, but expected one of: bytes, unicode"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_long_desc(self, enable_milvus_local_api): """ target: test collection with long desc method: create with long desc expected: """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) desc = "a".join("a" for _ in range(256)) schema = cf.gen_default_collection_schema(description=desc) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L0) def test_collection_binary(self, enable_milvus_local_api): """ target: test collection with binary-vec method: create collection with binary field expected: assert binary field """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) self.collection_wrap.init_collection(c_name, schema=default_binary_schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_binary_schema}) assert c_name in self.utility_wrap.list_collections()[0] @pytest.mark.tags(CaseLabel.L0) def test_collection_shards_num_with_default_value(self, enable_milvus_local_api): """ target:test collection with shards_num method:create collection with shards_num expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) self.collection_wrap.init_collection(c_name, schema=default_schema, shards_num=default_shards_num, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_shards_num: default_shards_num}) assert c_name in self.utility_wrap.list_collections()[0] @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("shards_num", [-256, 0, ct.max_shards_num // 2, ct.max_shards_num]) def test_collection_shards_num_with_not_default_value(self, shards_num, enable_milvus_local_api): """ target:test collection with shards_num method:create collection with not default shards_num expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) self.collection_wrap.init_collection(c_name, schema=default_schema, shards_num=shards_num, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_shards_num: shards_num}) assert c_name in self.utility_wrap.list_collections()[0] @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("shards_num", [ct.max_shards_num + 1, 257]) def test_collection_shards_num_invalid(self, shards_num, enable_milvus_local_api): """ target:test collection with invalid shards_num method:create collection with shards_num out of [1, 16] expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) error = {ct.err_code: 1, ct.err_msg: f"maximum shards's number should be limited to {ct.max_shards_num}"} self.collection_wrap.init_collection(c_name, schema=default_schema, shards_num=shards_num, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("error_type_shards_num", [1.0, "2"]) @pytest.mark.xfail(reason="milvus lite no exception thrown") def test_collection_shards_num_with_error_type(self, error_type_shards_num, enable_milvus_local_api): """ target:test collection with error type shards_num method:create collection with error type shards_num expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) error = {ct.err_code: 1, ct.err_msg: f"expected one of: int, long"} self.collection_wrap.init_collection(c_name, schema=default_schema, shards_num=error_type_shards_num, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_create_collection_maximum_fields(self, enable_milvus_local_api): """ target: test create collection with maximum fields method: create collection with maximum field number expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] limit_num = ct.max_field_num - 2 for i in range(limit_num): int_field_name = cf.gen_unique_str("field_name") field = cf.gen_int64_field(name=int_field_name) int_fields.append(field) int_fields.append(cf.gen_float_vec_field()) int_fields.append(cf.gen_int64_field(is_primary=True)) schema = cf.gen_collection_schema(fields=int_fields) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L1) def test_create_collection_maximum_vector_fields(self, enable_milvus_local_api): """ target: Test create collection with the maximum vector fields (default is 4) method: create collection with the maximum vector field number expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] limit_num = max_vector_field_num for i in range(limit_num): vector_field_name = cf.gen_unique_str("vector_field_name") field = cf.gen_float_vec_field(name=vector_field_name) int_fields.append(field) int_fields.append(cf.gen_int64_field(is_primary=True)) schema = cf.gen_collection_schema(fields=int_fields) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_key", [cf.gen_int64_field(is_primary=True), cf.gen_string_field(is_primary=True)]) def test_create_collection_multiple_vector_and_maximum_fields(self, primary_key, enable_milvus_local_api): """ target: test create collection with multiple vector fields and maximum fields method: create collection with multiple vector fields and maximum fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] vector_limit_num = max_vector_field_num - 2 limit_num = ct.max_field_num - 2 # add maximum vector fields for i in range(vector_limit_num): int_field_name = cf.gen_unique_str("field_name") field = cf.gen_int64_field(name=int_field_name) int_fields.append(field) # add other vector fields to maximum fields num for i in range(limit_num - 2): int_field_name = cf.gen_unique_str("field_name") field = cf.gen_int64_field(name=int_field_name) int_fields.append(field) int_fields.append(cf.gen_float_vec_field()) int_fields.append(primary_key) schema = cf.gen_collection_schema(fields=int_fields) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_key", [cf.gen_int64_field(is_primary=True), cf.gen_string_field(is_primary=True)]) def test_create_collection_maximum_vector_and_all_fields(self, primary_key, enable_milvus_local_api): """ target: test create collection with maximum vector fields and maximum fields method: create collection with maximum vector fields and maximum fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] vector_limit_num = max_vector_field_num limit_num = ct.max_field_num - 2 # add maximum vector fields for i in range(vector_limit_num): int_field_name = cf.gen_unique_str("field_name") field = cf.gen_int64_field(name=int_field_name) int_fields.append(field) # add other vector fields to maximum fields num for i in range(limit_num - 4): int_field_name = cf.gen_unique_str("field_name") field = cf.gen_int64_field(name=int_field_name) int_fields.append(field) int_fields.append(cf.gen_float_vec_field()) int_fields.append(primary_key) schema = cf.gen_collection_schema(fields=int_fields) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) def test_create_collection_over_maximum_fields(self, enable_milvus_local_api): """ target: Test create collection with more than the maximum fields method: create collection with more than the maximum field number expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] limit_num = ct.max_field_num for i in range(limit_num): int_field_name = cf.gen_unique_str("field_name") field = cf.gen_int64_field(name=int_field_name) int_fields.append(field) int_fields.append(cf.gen_float_vec_field()) int_fields.append(cf.gen_int64_field(is_primary=True)) schema = cf.gen_collection_schema(fields=int_fields) error = {ct.err_code: 1, ct.err_msg: "maximum field's number should be limited to 64"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite no exception thrown") def test_create_collection_over_maximum_vector_fields(self, enable_milvus_local_api): """ target: Test create collection with more than the maximum vector fields (default is 4) method: create collection with more than the maximum vector field number expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] limit_num = max_vector_field_num for i in range(limit_num + 1): vector_field_name = cf.gen_unique_str("vector_field_name") field = cf.gen_float_vec_field(name=vector_field_name) int_fields.append(field) int_fields.append(cf.gen_int64_field(is_primary=True)) schema = cf.gen_collection_schema(fields=int_fields) error = {ct.err_code: 65535, ct.err_msg: "maximum vector field's number should be limited to 4"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_create_collection_multiple_vector_and_over_maximum_all_fields(self, enable_milvus_local_api): """ target: test create collection with multiple vector fields and over maximum fields method: create collection with multiple vector fields and over maximum fields expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] vector_limit_num = max_vector_field_num - 2 limit_num = ct.max_field_num # add multiple vector fields for i in range(vector_limit_num): vector_field_name = cf.gen_unique_str("field_name") field = cf.gen_float_vec_field(name=vector_field_name) int_fields.append(field) # add other vector fields to maximum fields num for i in range(limit_num): int_field_name = cf.gen_unique_str("field_name") field = cf.gen_int64_field(name=int_field_name) int_fields.append(field) int_fields.append(cf.gen_int64_field(is_primary=True)) log.debug(len(int_fields)) schema = cf.gen_collection_schema(fields=int_fields) error = {ct.err_code: 65535, ct.err_msg: "maximum field's number should be limited to 64"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite no exception thrown") def test_create_collection_over_maximum_vector_and_all_fields(self, enable_milvus_local_api): """ target: test create collection with over maximum vector fields and maximum fields method: create collection with over maximum vector fields and maximum fields expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] vector_limit_num = max_vector_field_num limit_num = ct.max_field_num - 2 # add maximum vector fields for i in range(vector_limit_num + 1): vector_field_name = cf.gen_unique_str("field_name") field = cf.gen_float_vec_field(name=vector_field_name) int_fields.append(field) # add other vector fields to maximum fields num for i in range(limit_num - 4): int_field_name = cf.gen_unique_str("field_name") field = cf.gen_int64_field(name=int_field_name) int_fields.append(field) int_fields.append(cf.gen_float_vec_field()) int_fields.append(cf.gen_int64_field(is_primary=True)) schema = cf.gen_collection_schema(fields=int_fields) error = {ct.err_code: 65535, ct.err_msg: "maximum field's number should be limited to 64"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_collection_multi_sparse_vectors(self, enable_milvus_local_api): """ target: Test multiple sparse vectors in a collection method: create 2 sparse vectors in a collection expected: successful creation of a collection """ # 1. connect self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # 2. create collection with multiple vectors c_name = cf.gen_unique_str(prefix) fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(), cf.gen_float_vec_field(vector_data_type=sparse_vector_data_type), cf.gen_float_vec_field(name="tmp", vector_data_type=sparse_vector_data_type)] schema = cf.gen_collection_schema(fields=fields) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) class TestCollectionOperation(TestcaseBase): """ ****************************************************************** The following cases are used to test collection interface operations ****************************************************************** """ @pytest.mark.tags(CaseLabel.L2) def test_collection_without_connection(self, enable_milvus_local_api): """ target: test collection without connection method: 1.create collection after connection removed expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) self.connection_wrap.remove_connection(ct.default_alias) res_list, _ = self.connection_wrap.list_connections() assert ct.default_alias not in res_list error = {ct.err_code: 1, ct.err_msg: 'should create connect first'} self.collection_wrap.init_collection(c_name, schema=default_schema, check_task=CheckTasks.err_res, check_items=error) assert self.collection_wrap.collection is None @pytest.mark.tags(CaseLabel.L1) def test_collection_multi_create_drop(self, enable_milvus_local_api): """ target: test cycle creation and deletion of multiple collections method: in a loop, collections are created and deleted sequentially expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_num = 20 for _ in range(c_num): c_name = cf.gen_unique_str(prefix) self.collection_wrap.init_collection(c_name, schema=default_schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) self.collection_wrap.drop() assert c_name not in self.utility_wrap.list_collections()[0] @pytest.mark.tags(CaseLabel.L1) @pytest.mark.xfail(reason="incorrect error msg") def test_collection_dup_name_drop(self, enable_milvus_local_api): """ target: test collection with dup name, and drop method: 1. two dup name collection object 2. one object drop collection expected: collection dropped """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) self.collection_wrap.init_collection(c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) self.collection_wrap.drop() assert not self.utility_wrap.has_collection(c_name)[0] error = {ct.err_code: 4, ct.err_msg: 'collection not found'} collection_w.has_partition("p", check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_collection_after_drop(self, enable_milvus_local_api): """ target: test create collection after create and drop method: 1. create a 2. drop a 3, re-create a expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) collection_w.drop() assert not self.utility_wrap.has_collection(collection_w.name)[0] self.init_collection_wrap(name=c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) assert self.utility_wrap.has_collection(c_name)[0] @pytest.mark.tags(CaseLabel.L1) def test_collection_all_datatype_fields(self, enable_milvus_local_api): """ target: test create collection with all dataType fields method: create collection with all dataType schema expected: create successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) fields = [] for k, v in DataType.__members__.items(): if v and v != DataType.UNKNOWN and v != DataType.STRING \ and v != DataType.VARCHAR and v != DataType.FLOAT_VECTOR \ and v != DataType.BINARY_VECTOR and v != DataType.ARRAY \ and v != DataType.FLOAT16_VECTOR and v != DataType.BFLOAT16_VECTOR: field, _ = self.field_schema_wrap.init_field_schema(name=k.lower(), dtype=v) fields.append(field) fields.append(cf.gen_float_vec_field()) schema, _ = self.collection_schema_wrap.init_collection_schema(fields, primary_field=ct.default_int64_field_name) log.info(schema) c_name = cf.gen_unique_str(prefix) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support partition") def test_load_collection_after_load_partition(self, enable_milvus_local_api): """ target: test release the partition after load collection method: load collection and load the partition expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_wrap() partition_w1 = self.init_partition_wrap(collection_w) partition_w1.insert(cf.gen_default_list_data()) collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load() partition_w1.load() @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support partition") def test_load_collection_release_partition(self, enable_milvus_local_api): """ target: test release the partition after load collection method: load collection and release the partition expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_wrap() partition_w1 = self.init_partition_wrap(collection_w) partition_w1.insert(cf.gen_default_list_data()) collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load() partition_w1.release() @pytest.mark.tags(CaseLabel.L2) def test_load_collection_after_release_collection(self, enable_milvus_local_api): """ target: test release the collection after load collection method: load collection and release the collection expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) # nb = 2000 fail , nb = 1000 success collection_w.insert(cf.gen_default_list_data(nb=1000)) collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load() collection_w.release() class TestCollectionDataframe(TestcaseBase): """ ****************************************************************** The following cases are used to test construct_from_dataframe ****************************************************************** """ @pytest.fixture(scope="function", params=ct.get_invalid_strs) def get_non_df(self, request): if request.param is None: pytest.skip("skip None") yield request.param @pytest.mark.tags(CaseLabel.L0) def test_construct_from_dataframe(self, enable_milvus_local_api): """ target: test collection with dataframe data method: create collection and insert with dataframe expected: collection num entities equal to nb """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = cf.gen_default_dataframe_data(ct.default_nb) self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) # flush assert self.collection_wrap.num_entities == ct.default_nb @pytest.mark.tags(CaseLabel.L0) def test_construct_from_binary_dataframe(self, enable_milvus_local_api): """ target: test binary collection with dataframe method: create binary collection with dataframe expected: collection num entities equal to nb """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df, _ = cf.gen_default_binary_dataframe_data(nb=ct.default_nb) self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_binary_schema}) assert self.collection_wrap.num_entities == ct.default_nb @pytest.mark.tags(CaseLabel.L2) def test_construct_from_none_dataframe(self, enable_milvus_local_api): """ target: test create collection by empty dataframe method: invalid dataframe type create collection expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) error = {ct.err_code: 1, ct.err_msg: "Dataframe can not be None."} self.collection_wrap.construct_from_dataframe(c_name, None, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_construct_from_dataframe_only_column(self, enable_milvus_local_api): """ target: test collection with dataframe only columns method: dataframe only has columns expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = pd.DataFrame(columns=[ct.default_int64_field_name, ct.default_float_vec_field_name]) error = {ct.err_code: 0, ct.err_msg: "Cannot infer schema from empty dataframe"} self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_construct_from_inconsistent_dataframe(self, enable_milvus_local_api): """ target: test collection with data inconsistent method: create and insert with inconsistent data expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) # one field different type df mix_data = [(1, 2., [0.1, 0.2]), (2, 3., 4)] df = pd.DataFrame(data=mix_data, columns=list("ABC")) error = {ct.err_code: 1, ct.err_msg: "The Input data type is inconsistent with defined schema, please check it."} self.collection_wrap.construct_from_dataframe(c_name, df, primary_field='A', check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_construct_from_non_dataframe(self, get_non_df, enable_milvus_local_api): """ target: test create collection by invalid dataframe method: non-dataframe type create collection expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) error = {ct.err_code: 0, ct.err_msg: "Data type must be pandas.DataFrame."} df = get_non_df self.collection_wrap.construct_from_dataframe(c_name, df, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_construct_from_data_type_dataframe(self, enable_milvus_local_api): """ target: test collection with invalid dataframe method: create with invalid dataframe expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = pd.DataFrame({"date": pd.date_range('20210101', periods=3), ct.default_int64_field_name: [1, 2, 3]}) error = {ct.err_code: 0, ct.err_msg: "Cannot infer schema from empty dataframe."} self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_construct_from_invalid_field_name(self, enable_milvus_local_api): """ target: test collection with invalid field name method: create with invalid field name dataframe expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = pd.DataFrame({'%$#': cf.gen_vectors(3, 2), ct.default_int64_field_name: [1, 2, 3]}) error = {ct.err_code: 1, ct.err_msg: "Invalid field name"} self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_construct_none_primary_field(self, enable_milvus_local_api): """ target: test collection with none primary field method: primary_field is none expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = cf.gen_default_dataframe_data(ct.default_nb) error = {ct.err_code: 0, ct.err_msg: "Schema must have a primary key field."} self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=None, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_construct_not_existed_primary_field(self, enable_milvus_local_api): """ target: test collection with not existed primary field method: primary field not existed expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = cf.gen_default_dataframe_data(ct.default_nb) error = {ct.err_code: 0, ct.err_msg: "Primary field must in dataframe."} self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=c_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_construct_with_none_auto_id(self, enable_milvus_local_api): """ target: test construct with non-int64 as primary field method: non-int64 as primary field expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = cf.gen_default_dataframe_data(ct.default_nb) error = {ct.err_code: 0, ct.err_msg: "Param auto_id must be bool type"} self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, auto_id=None, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_construct_auto_id_true_insert(self, enable_milvus_local_api): """ target: test construct with true auto_id method: auto_id=True and insert values expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = cf.gen_default_dataframe_data(nb=100) error = {ct.err_code: 0, ct.err_msg: "Auto_id is True, primary field should not have data."} self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, auto_id=True, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_construct_auto_id_true_no_insert(self, enable_milvus_local_api): """ target: test construct with true auto_id method: auto_id=True and not insert ids(primary fields all values are None) expected: verify num entities """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = cf.gen_default_dataframe_data() # df.drop(ct.default_int64_field_name, axis=1, inplace=True) df[ct.default_int64_field_name] = None self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, auto_id=True) assert self.collection_wrap.num_entities == ct.default_nb @pytest.mark.tags(CaseLabel.L2) def test_construct_none_value_auto_id_true(self, enable_milvus_local_api): """ target: test construct with none value, auto_id method: df primary field with none value, auto_id=true expected: todo """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) nb = 100 df = cf.gen_default_dataframe_data(nb) df.iloc[:, 0] = numpy.NaN res, _ = self.collection_wrap.construct_from_dataframe(cf.gen_unique_str(prefix), df, primary_field=ct.default_int64_field_name, auto_id=True) mutation_res = res[1] assert cf._check_primary_keys(mutation_res.primary_keys, 100) assert self.collection_wrap.num_entities == nb @pytest.mark.tags(CaseLabel.L1) def test_construct_auto_id_false(self, enable_milvus_local_api): """ target: test construct with false auto_id method: auto_id=False, primary_field correct expected: verify auto_id """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) df = cf.gen_default_dataframe_data(ct.default_nb) self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, auto_id=False) assert not self.collection_wrap.schema.auto_id assert self.collection_wrap.num_entities == ct.default_nb @pytest.mark.tags(CaseLabel.L2) def test_construct_none_value_auto_id_false(self, enable_milvus_local_api): """ target: test construct with none value, auto_id method: df primary field with none value, auto_id=false expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) nb = 100 df = cf.gen_default_dataframe_data(nb) df.iloc[:, 0] = numpy.NaN error = {ct.err_code: 0, ct.err_msg: "Primary key type must be DataType.INT64"} self.collection_wrap.construct_from_dataframe(cf.gen_unique_str(prefix), df, primary_field=ct.default_int64_field_name, auto_id=False, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_construct_auto_id_false_same_values(self, enable_milvus_local_api): """ target: test construct with false auto_id and same value method: auto_id=False, primary field same values expected: verify num entities """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) nb = 100 df = cf.gen_default_dataframe_data(nb) df.iloc[1:, 0] = 1 res, _ = self.collection_wrap.construct_from_dataframe(cf.gen_unique_str(prefix), df, primary_field=ct.default_int64_field_name, auto_id=False) collection_w = res[0] collection_w.flush() assert collection_w.num_entities == nb mutation_res = res[1] assert mutation_res.primary_keys == df[ct.default_int64_field_name].values.tolist() @pytest.mark.tags(CaseLabel.L1) def test_construct_auto_id_false_negative_values(self, enable_milvus_local_api): """ target: test construct with negative values method: auto_id=False, primary field values is negative expected: verify num entities """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) nb = 100 df = cf.gen_default_dataframe_data(nb) new_values = pd.Series(data=[i for i in range(0, -nb, -1)]) df[ct.default_int64_field_name] = new_values self.collection_wrap.construct_from_dataframe(cf.gen_unique_str(prefix), df, primary_field=ct.default_int64_field_name, auto_id=False) assert self.collection_wrap.num_entities == nb @pytest.mark.tags(CaseLabel.L1) def test_construct_from_dataframe_dup_name(self, enable_milvus_local_api): """ target: test collection with dup name and insert dataframe method: create collection with dup name, none schema, dataframe expected: two collection object is correct """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, primary_field=ct.default_int64_field_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) df = cf.gen_default_dataframe_data(ct.default_nb) self.collection_wrap.construct_from_dataframe(c_name, df, primary_field=ct.default_int64_field_name, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: default_schema}) # flush assert collection_w.num_entities == ct.default_nb assert collection_w.num_entities == self.collection_wrap.num_entities class TestCollectionCount(TestcaseBase): @pytest.mark.tags(CaseLabel.L2) def test_collection_count_no_vectors(self, enable_milvus_local_api): """ target: test collection rows_count is correct or not, if collection is empty method: create collection and no vectors in it, assert the value returned by num_entities attribute is equal to 0 expected: the count is equal to 0 """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_wrap() assert collection_w.num_entities == 0 class TestCollectionCountIP(TestcaseBase): """ params means different nb, the nb value may trigger merge, or not """ @pytest.fixture( scope="function", params=[ 1, 1000 ], ) def insert_count(self, request): yield request.param @pytest.mark.tags(CaseLabel.L1) def test_collection_count_after_index_created(self, insert_count, enable_milvus_local_api): """ target: test count_entities, after index have been created method: add vectors in db, and create index, then calling num_entities with correct params expected: count_entities raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_wrap() data = cf.gen_default_list_data(insert_count, ct.default_dim) collection_w.insert(data) collection_w.create_index(ct.default_float_vec_field_name, default_index_params, index_name=ct.default_index_name) assert collection_w.num_entities == insert_count class TestCollectionCountBinary(TestcaseBase): """ params means different nb, the nb value may trigger merge, or not """ @pytest.fixture( scope="function", params=[ 8, 1000, 2001 ], ) def insert_count(self, request): yield request.param # TODO: need to update and enable @pytest.mark.tags(CaseLabel.L1) def test_collection_count_after_index_created_binary(self, insert_count, enable_milvus_local_api): """ target: test num_entities, after index have been created method: add vectors in db, and create binary index, then calling num_entities with correct params expected: num_entities equals entities count just inserted """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, schema=default_binary_schema) df, _ = cf.gen_default_binary_dataframe_data(insert_count) mutation_res, _ = collection_w.insert(data=df) collection_w.create_index(ct.default_binary_vec_field_name, default_binary_index_params) assert collection_w.num_entities == insert_count @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("auto_id", [True, False]) @pytest.mark.xfail(reason="incorrect error code: 2000") def test_binary_collection_with_min_dim(self, auto_id, enable_milvus_local_api): """ target: test binary collection when dim=1 method: creat collection and set dim=1 expected: check error message successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) dim = ct.min_dim c_schema = cf.gen_default_binary_collection_schema(auto_id=auto_id, dim=dim) collection_w = self.init_collection_wrap(schema=c_schema, check_task=CheckTasks.err_res, check_items={"err_code": 1, "err_msg": f"invalid dimension: {dim}. binary vector dimension should be multiple of 8."}) @pytest.mark.tags(CaseLabel.L2) def test_collection_count_no_entities(self, enable_milvus_local_api): """ target: test collection num_entities is correct or not, if collection is empty method: create collection and no vectors in it, assert the value returned by num_entities method is equal to 0 expected: the count is equal to 0 """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, schema=default_binary_schema) assert collection_w.num_entities == 0 class TestCollectionMultiCollections(TestcaseBase): """ params means different nb, the nb value may trigger merge, or not """ @pytest.fixture( scope="function", params=[ 1, 1000, 2001 ], ) def insert_count(self, request): yield request.param @pytest.mark.tags(CaseLabel.L0) def test_collection_count_multi_collections_l2(self, insert_count, enable_milvus_local_api): """ target: test collection rows_count is correct or not with multiple collections of L2 method: create collection and add entities in it, assert the value returned by num_entities is equal to length of entities expected: the count is equal to the length of entities """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) data = cf.gen_default_list_data(insert_count) collection_list = [] collection_num = 10 for i in range(collection_num): collection_name = gen_unique_str(uid_count) collection_w = self.init_collection_wrap(name=collection_name) collection_w.insert(data) collection_list.append(collection_name) for i in range(collection_num): res, _ = self.collection_wrap.init_collection(collection_list[i]) assert self.collection_wrap.num_entities == insert_count @pytest.mark.tags(CaseLabel.L2) def test_collection_count_multi_collections_binary(self, insert_count, enable_milvus_local_api): """ target: test collection rows_count is correct or not with multiple collections of JACCARD method: create collection and add entities in it, assert the value returned by count_entities method is equal to length of entities expected: the count is equal to the length of entities """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) df, _ = cf.gen_default_binary_dataframe_data(insert_count) collection_list = [] collection_num = 20 for i in range(collection_num): c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, schema=default_binary_schema) mutation_res, _ = collection_w.insert(data=df) collection_list.append(c_name) for i in range(collection_num): res, _ = self.collection_wrap.init_collection(collection_list[i]) assert self.collection_wrap.num_entities == insert_count @pytest.mark.tags(CaseLabel.L2) def test_collection_count_multi_collections_mix(self, enable_milvus_local_api): """ target: test collection rows_count is correct or not with multiple collections of method: create collection and add entities in it, assert the value returned by count_entities method is equal to length of entities expected: the count is equal to the length of entities """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_list = [] collection_num = 20 data = cf.gen_default_list_data() df, _ = cf.gen_default_binary_dataframe_data(ct.default_nb) for i in range(0, int(collection_num / 2)): collection_name = gen_unique_str(uid_count) collection_w = self.init_collection_wrap(name=collection_name) collection_w.insert(data) collection_list.append(collection_name) for i in range(int(collection_num / 2), collection_num): c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, schema=default_binary_schema) mutation_res, _ = collection_w.insert(data=df) collection_list.append(c_name) for i in range(collection_num): res, _ = self.collection_wrap.init_collection(collection_list[i]) assert self.collection_wrap.num_entities == ct.default_nb class TestCreateCollection(TestcaseBase): @pytest.fixture(scope="function", params=[False, True]) def auto_id(self, request): yield request.param @pytest.mark.tags(CaseLabel.L1) def test_create_collection_multithread(self, enable_milvus_local_api): """ target: test create collection with multi-thread method: create collection using multi-thread, expected: collections are created """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) threads_num = 8 threads = [] collection_names = [] def create(): collection_name = gen_unique_str(uid_create) collection_names.append(collection_name) self.init_collection_wrap(name=collection_name) for i in range(threads_num): t = MyThread(target=create, args=()) threads.append(t) t.start() time.sleep(0.2) for t in threads: t.join() for item in collection_names: assert item in self.utility_wrap.list_collections()[0] @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip("not support default_value now") def test_create_collection_using_default_value(self, auto_id): """ target: test create collection with default_value method: create a schema with all fields using default value expected: collections are created """ fields = [ cf.gen_int64_field(name='pk', is_primary=True), cf.gen_float_vec_field(), cf.gen_int8_field(default_value=numpy.int8(8)), cf.gen_int16_field(default_value=numpy.int16(16)), cf.gen_int32_field(default_value=numpy.int32(32)), cf.gen_int64_field(default_value=numpy.int64(64)), cf.gen_float_field(default_value=numpy.float32(3.14)), cf.gen_double_field(default_value=numpy.double(3.1415)), cf.gen_bool_field(default_value=False), cf.gen_string_field(default_value="abc") ] schema = cf.gen_collection_schema(fields, auto_id=auto_id) self.init_collection_wrap(schema=schema, check_task=CheckTasks.check_collection_property, check_items={"schema": schema}) class TestCreateCollectionInvalid(TestcaseBase): """ Test creating collections with invalid params """ @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite no exception thrown") def test_create_collection_limit_fields(self, enable_milvus_local_api): """ target: test create collection with maximum fields method: create collection with maximum field number expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) limit_num = ct.max_field_num field_schema_list = [] field_pr = cf.gen_int64_field(ct.default_int64_field_name, is_primary=True) field_v = cf.gen_float_vec_field(ct.default_float_vec_field_name) field_schema_list.append(field_pr) field_schema_list.append(field_v) for i in range(limit_num): field_name_tmp = gen_unique_str("field_name") field_schema_temp = cf.gen_int64_field(field_name_tmp) field_schema_list.append(field_schema_temp) error = {ct.err_code: 65535, ct.err_msg: "maximum field's number should be limited to 64"} schema, _ = self.collection_schema_wrap.init_collection_schema(fields=field_schema_list) self.init_collection_wrap(name=c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("invalid_name", ["中文", "español", "عربي", "हिंदी", "Русский"]) def test_create_schema_with_different_language(self, invalid_name): """ target: test create collection with maximum fields method: create collection with maximum field number expected: raise exception """ fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_vec_field(), cf.gen_string_field(name=invalid_name)] schema = cf.gen_collection_schema(fields) self.init_collection_wrap(schema=schema, check_task=CheckTasks.err_res, check_items={ct.err_code: 1701, ct.err_msg: "Invalid field name: %s" % invalid_name}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("invalid_name", ["中文", "español", "عربي", "हिंदी", "Русский"]) @pytest.mark.xfail(reason="error msg") def test_create_collection_with_different_language(self, invalid_name): """ target: test create collection with maximum fields method: create collection with maximum field number expected: raise exception """ schema = cf.gen_default_collection_schema() self.init_collection_wrap(name=invalid_name, schema=schema, check_task=CheckTasks.err_res, check_items={ct.err_code: 1100, ct.err_msg: "Invalid collection name: %s" % invalid_name}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("default_value", ["abc"]) @pytest.mark.skip(reason="issue #24634") def test_create_collection_with_invalid_default_value_string(self, default_value): """ target: test create collection with maximum fields method: create collection with maximum field number expected: raise exception """ fields = [ cf.gen_int64_field(name='pk', is_primary=True), cf.gen_float_vec_field(), cf.gen_string_field(max_length=2, default_value=default_value) ] schema = cf.gen_collection_schema(fields) self.init_collection_wrap(schema=schema, check_task=CheckTasks.check_collection_property, check_items={"schema": schema}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("not support default_value now") @pytest.mark.parametrize("default_value", ["abc", 9.09, 1, False]) def test_create_collection_with_invalid_default_value_float(self, default_value): """ target: test create collection with maximum fields method: create collection with maximum field number expected: raise exception """ fields = [ cf.gen_int64_field(name='pk', is_primary=True), cf.gen_float_vec_field(), cf.gen_float_field(default_value=default_value) ] schema = cf.gen_collection_schema(fields) self.init_collection_wrap(schema=schema, check_task=CheckTasks.err_res, check_items={ct.err_code: 1, ct.err_msg: "default value type mismatches field schema type"}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("not support default_value now") @pytest.mark.parametrize("default_value", ["abc", 9.09, 1, False]) def test_create_collection_with_invalid_default_value_int8(self, default_value): """ target: test create collection with maximum fields method: create collection with maximum field number expected: raise exception """ fields = [ cf.gen_int64_field(name='pk', is_primary=True), cf.gen_float_vec_field(), cf.gen_int8_field(default_value=default_value) ] schema = cf.gen_collection_schema(fields) self.init_collection_wrap(schema=schema, check_task=CheckTasks.err_res, check_items={ct.err_code: 1, ct.err_msg: "default value type mismatches field schema type"}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("not support default_value now") def test_create_collection_with_pk_field_using_default_value(self, enable_milvus_local_api): """ target: test create collection with pk field using default value method: create a pk field and set default value expected: report error """ # 1. pk int64 fields = [ cf.gen_int64_field(name='pk', is_primary=True, default_value=np.int64(1)), cf.gen_float_vec_field(), cf.gen_string_field(max_length=2) ] schema = cf.gen_collection_schema(fields) collection_w = self.init_collection_wrap(schema=schema) collection_w.insert([[], [vectors[0]], ["a"]], check_task=CheckTasks.err_res, check_items={ct.err_code: 1, ct.err_msg: "pk field schema can not set default value"}) # 2. pk string fields = [ cf.gen_string_field(name='pk', is_primary=True, default_value="a"), cf.gen_float_vec_field(), cf.gen_string_field(max_length=2) ] schema = cf.gen_collection_schema(fields) collection_w = self.init_collection_wrap(schema=schema) collection_w.insert([[], [vectors[0]], ["a"]], check_task=CheckTasks.err_res, check_items={ct.err_code: 1, ct.err_msg: "pk field schema can not set default value"}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("not support default_value now") def test_create_collection_with_json_field_using_default_value(self, enable_milvus_local_api): """ target: test create collection with json field using default value method: create a json field and set default value expected: report error """ json_default_value = {"number": 1, "float": 2.0, "string": "abc", "bool": True, "list": [i for i in range(5)]} cf.gen_json_field(default_value=json_default_value, check_task=CheckTasks.err_res, check_items={ct.err_code: 1, ct.err_msg: "Default value unsupported data type: 999"}) class TestDropCollection(TestcaseBase): """ ****************************************************************** The following cases are used to test `drop_collection` function ****************************************************************** """ @pytest.mark.tags(CaseLabel.L0) def test_drop_collection_A(self, enable_milvus_local_api): """ target: test delete collection created with correct params method: create collection and then delete, assert the value returned by delete method expected: status ok, and no collection in collections """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str() collection_wr = self.init_collection_wrap(name=c_name) collection_wr.drop() assert not self.utility_wrap.has_collection(c_name)[0] @pytest.mark.tags(CaseLabel.L2) def test_drop_collection_without_connection(self, enable_milvus_local_api): """ target: test describe collection, without connection method: drop collection with correct params, with a disconnected instance expected: drop raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_wr = self.init_collection_wrap(c_name) self.connection_wrap.remove_connection(ct.default_alias) res_list, _ = self.connection_wrap.list_connections() assert ct.default_alias not in res_list error = {ct.err_code: 1, ct.err_msg: 'should create connect first'} collection_wr.drop(check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_drop_collection_not_existed(self, enable_milvus_local_api): """ target: test if collection not created method: random a collection name, which not existed in db, assert the exception raised returned by drp_collection method expected: False """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str() self.init_collection_wrap(name=c_name) c_name_2 = cf.gen_unique_str() # error = {ct.err_code: 0, ct.err_msg: 'DescribeCollection failed: collection not found: %s' % c_name_2} # self.utility_wrap.drop_collection(c_name_2, check_task=CheckTasks.err_res, check_items=error) # @longjiquan: dropping collection should be idempotent. self.utility_wrap.drop_collection(c_name_2) @pytest.mark.tags(CaseLabel.L1) def test_create_drop_collection_multithread(self, enable_milvus_local_api): """ target: test create and drop collection with multi-thread method: create and drop collection using multi-thread, expected: collections are created, and dropped """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) threads_num = 8 threads = [] collection_names = [] def create(): c_name = cf.gen_unique_str() collection_names.append(c_name) collection_wr = self.init_collection_wrap(name=c_name) collection_wr.drop() for i in range(threads_num): t = MyThread(target=create, args=()) threads.append(t) t.start() time.sleep(0.2) for t in threads: t.join() for item in collection_names: assert not self.utility_wrap.has_collection(item)[0] class TestDropCollectionInvalid(TestcaseBase): """ Test drop collection with invalid params """ @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#", "a".join("a" for i in range(256))]) def test_drop_collection_with_invalid_collection_name(self, name, enable_milvus_local_api): """ target: test drop invalid collection method: drop collection with invalid collection name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 1, ct.err_msg: "Invalid collection name: {}".format(name)} self.utility_wrap.drop_collection(name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_drop_collection_with_empty_or_None_collection_name(self, enable_milvus_local_api): """ target: test drop invalid collection method: drop collection with empty or None collection name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: -1, ct.err_msg: '`collection_name` value is illegal'} self.utility_wrap.drop_collection('', check_task=CheckTasks.err_res, check_items=error) error_none = {ct.err_code: -1, ct.err_msg: '`collection_name` value None is illegal'} self.utility_wrap.drop_collection(None, check_task=CheckTasks.err_res, check_items=error_none) class TestHasCollection(TestcaseBase): """ ****************************************************************** The following cases are used to test `has_collection` function ****************************************************************** """ @pytest.mark.tags(CaseLabel.L2) def test_has_collection_without_connection(self, enable_milvus_local_api): """ target: test has collection, without connection method: calling has collection with correct params, with a disconnected instance expected: has collection raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) self.init_collection_wrap(c_name) self.connection_wrap.remove_connection(ct.default_alias) res_list, _ = self.connection_wrap.list_connections() assert ct.default_alias not in res_list error = {ct.err_code: 1, ct.err_msg: 'should create connect first'} self.utility_wrap.has_collection(c_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_has_collection_not_existed(self, enable_milvus_local_api): """ target: test if collection not created method: random a collection name, create this collection then drop it, assert the value returned by has_collection method expected: False """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str() collection_wr = self.init_collection_wrap(name=c_name) collection_wr.drop() assert not self.utility_wrap.has_collection(c_name)[0] @pytest.mark.tags(CaseLabel.L2) def test_has_collection_multithread(self, enable_milvus_local_api): """ target: test create collection with multi-thread method: create collection using multi-thread, expected: collections are created """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) threads_num = 4 threads = [] c_name = cf.gen_unique_str() self.init_collection_wrap(name=c_name) def has(): assert self.utility_wrap.has_collection(c_name) # assert not assert_collection(connect, collection_name) for i in range(threads_num): t = MyThread(target=has, args=()) threads.append(t) t.start() time.sleep(0.2) for t in threads: t.join() class TestHasCollectionInvalid(TestcaseBase): @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("name", ["12-s", "12 s", "(mn)", "中文", "%$#", "a".join("a" for i in range(256))]) def test_has_collection_with_invalid_collection_name(self, name, enable_milvus_local_api): """ target: test list collections with invalid scenario method: show collection with invalid collection name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: 1, ct.err_msg: "Invalid collection name: {}".format(name)} self.utility_wrap.has_collection(name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_has_collection_with_empty_collection_name(self, enable_milvus_local_api): """ target: test list collections with invalid scenario method: show collection with empty collection name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: -1, ct.err_msg: '`collection_name` value is illegal'} self.utility_wrap.has_collection('', check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_has_collection_with_none_collection_name(self, enable_milvus_local_api): """ target: test list collections with invalid scenario method: show collection with no collection name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) error = {ct.err_code: -1, ct.err_msg: '`collection_name` value None is illegal'} self.utility_wrap.has_collection(None, check_task=CheckTasks.err_res, check_items=error) class TestListCollections(TestcaseBase): """ ****************************************************************** The following cases are used to test `utility.list_collections()` function ****************************************************************** """ @pytest.mark.tags(CaseLabel.L0) def test_list_collections_multi_collections(self, enable_milvus_local_api): """ target: test list collections method: create collection, assert the value returned by list_collections method expected: True """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_num = 50 collection_names = [] for i in range(collection_num): collection_name = cf.gen_unique_str() collection_names.append(collection_name) self.init_collection_wrap(name=collection_name) for i in range(collection_num): assert collection_names[i] in self.utility_wrap.list_collections()[0] self.utility_wrap.drop_collection(collection_names[i]) @pytest.mark.tags(CaseLabel.L2) def test_list_collections_without_connection(self, enable_milvus_local_api): """ target: test list collections, without connection method: calling list collections with correct params, with a disconnected instance expected: list collections raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) self.connection_wrap.remove_connection(ct.default_alias) res_list, _ = self.connection_wrap.list_connections() assert ct.default_alias not in res_list error = {ct.err_code: 1, ct.err_msg: 'should create connect first'} self.utility_wrap.list_collections(check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_list_collections_multithread(self, enable_milvus_local_api): """ target: test list collection with multi-threads method: list collection using multi-threads expected: list collections correctly """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) threads_num = 10 threads = [] collection_name = cf.gen_unique_str() self.init_collection_wrap(name=collection_name) def _list(): assert collection_name in self.utility_wrap.list_collections()[0] for i in range(threads_num): t = MyThread(target=_list) threads.append(t) t.start() time.sleep(0.2) for t in threads: t.join() class TestLoadCollection(TestcaseBase): """ ****************************************************************** The following cases are used to test `collection.load()` function ****************************************************************** """ @pytest.mark.tags(CaseLabel.L0) def test_load_collection_after_index(self, enable_milvus_local_api): """ target: test load collection, after index created method: insert and create index, load collection with correct params expected: no error raised """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_wrap() data = cf.gen_default_list_data(nb=1000) collection_w.insert(data) collection_w.create_index(ct.default_float_vec_field_name, default_index_params, index_name=ct.default_index_name) collection_w.load() collection_w.release() @pytest.mark.tags(CaseLabel.L1) def test_load_collection_after_index_binary(self, enable_milvus_local_api): """ target: test load binary_collection, after index created method: insert and create index, load binary_collection with correct params expected: no error raised """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name, schema=default_binary_schema) df, _ = cf.gen_default_binary_dataframe_data(ct.default_nb) mutation_res, _ = collection_w.insert(data=df) collection_w.create_index(ct.default_binary_vec_field_name, default_binary_index_params) collection_w.load() collection_w.release() @pytest.mark.tags(CaseLabel.L2) def test_load_empty_collection(self, enable_milvus_local_api): """ target: test load an empty collection with no data inserted method: no entities in collection, load and release the collection expected: load and release successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_wrap() collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load() collection_w.release() @pytest.mark.tags(CaseLabel.L2) def test_load_collection_dis_connect(self, enable_milvus_local_api): """ target: test load collection, without connection method: load collection with correct params, with a disconnected instance expected: load raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_wr = self.init_collection_wrap(c_name) self.connection_wrap.remove_connection(ct.default_alias) res_list, _ = self.connection_wrap.list_connections() assert ct.default_alias not in res_list error = {ct.err_code: 1, ct.err_msg: 'should create connect first'} collection_wr.load(check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_release_collection_dis_connect(self, enable_milvus_local_api): """ target: test release collection, without connection method: release collection with correct params, with a disconnected instance expected: release raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_wr = self.init_collection_wrap(c_name) self.connection_wrap.remove_connection(ct.default_alias) res_list, _ = self.connection_wrap.list_connections() assert ct.default_alias not in res_list error = {ct.err_code: 1, ct.err_msg: 'should create connect first'} collection_wr.release(check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_load_collection_not_existed(self, enable_milvus_local_api): """ target: test load invalid collection method: load not existed collection expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str() collection_wr = self.init_collection_wrap(name=c_name) collection_wr.drop() error = {ct.err_code: 100, ct.err_msg: "collection= : collection not found"} collection_wr.load(check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="incorrect error code: 1100") def test_release_collection_not_existed(self, enable_milvus_local_api): """ target: test release a not existed collection method: release with a not existed collection name expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str() collection_wr = self.init_collection_wrap(name=c_name) collection_wr.drop() error = {ct.err_code: 100, ct.err_msg: "collection= : collection not found"} collection_wr.release(check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_release_collection_not_load(self, enable_milvus_local_api): """ target: test release collection without load method: release collection without load expected: release successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str() collection_wr = self.init_collection_wrap(name=c_name) collection_wr.release() @pytest.mark.tags(CaseLabel.L0) def test_load_collection_after_load_release(self, enable_milvus_local_api): """ target: test load collection after load and release method: 1.load and release collection after entities flushed 2.re-load collection expected: No exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_wrap() insert_data = cf.gen_default_list_data() collection_w.insert(data=insert_data) assert collection_w.num_entities == ct.default_nb collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load() collection_w.release() collection_w.load() @pytest.mark.tags(CaseLabel.L2) def test_load_collection_repeatedly(self, enable_milvus_local_api): """ target: test load collection repeatedly method: load collection twice expected: No exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_wrap() insert_data = cf.gen_default_list_data(nb=1000) collection_w.insert(data=insert_data) assert collection_w.num_entities == ct.default_nb collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load() collection_w.load() @pytest.mark.tags(CaseLabel.L1) def test_load_partitions_after_load_collection(self, enable_milvus_local_api): """ target: test load partitions after load collection method: 1. load collection 2. load partitions 3. search on one partition expected: No exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_general(prefix)[0] self.init_partition_wrap(collection_w, partition1) self.init_partition_wrap(collection_w, partition2) collection_w.load() collection_w.load(partition_names=[partition1, partition2]) res = collection_w.search(vectors, default_search_field, default_search_params, default_limit, partition_names=[partition1]) @pytest.mark.tags(CaseLabel.L2) def test_load_partitions_after_load_release_collection(self, enable_milvus_local_api): """ target: test load partitions after load release collection method: 1. load collection 2. release collection 3. load partitions 4. search on one partition expected: No exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_general(prefix)[0] self.init_partition_wrap(collection_w, partition1) self.init_partition_wrap(collection_w, partition2) collection_w.load() collection_w.release() collection_w.load(partition_names=[partition1, partition2]) collection_w.search(vectors, default_search_field, default_search_params, default_limit, partition_names=[partition1]) @pytest.mark.tags(CaseLabel.L2) def test_load_collection_after_release_collection_partition(self, enable_milvus_local_api): """ target: test load collection after release collection and partition method: 1. load collection 2. release collection 3. release one partition 4. load collection 5. search on the partition expected: No exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_general(prefix)[0] partition_w = self.init_partition_wrap(collection_w, partition1) self.init_partition_wrap(collection_w, partition2) collection_w.load() collection_w.release() partition_w.release() collection_w.load() collection_w.search(vectors, default_search_field, default_search_params, default_limit, partition_names=[partition1]) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support") def test_load_partitions_after_release_collection_partition(self, enable_milvus_local_api): """ target: test load partitions after release collection and partition method: 1. load collection 2. release collection 3. release partition 4. search on the partition and report error 5. load partitions 6. search on the partition expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() collection_w.release() partition_w1.release() collection_w.search(vectors, default_search_field, default_search_params, default_limit, partition_names=[partition1], check_task=CheckTasks.err_res, check_items={ct.err_code: 1, ct.err_msg: "not loaded"}) partition_w1.load() partition_w2.load() collection_w.search(vectors, default_search_field, default_search_params, default_limit, partition_names=[partition1]) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support") def test_load_collection_after_release_partition(self, enable_milvus_local_api): """ target: test load collection after load collection and release partition method: 1. load collection 2. release one partition 3. search on the released partition and report error 4. search on the non-released partition and raise no exception 3. load collection expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w1.release() collection_w.search(vectors, default_search_field, default_search_params, default_limit, partition_names=[partition1], check_task=CheckTasks.err_res, check_items={ct.err_code: 1, ct.err_msg: "not loaded"}) collection_w.search(vectors, default_search_field, default_search_params, default_limit, partition_names=[partition2]) collection_w.load() @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support") def test_load_partitions_after_release_partition(self, enable_milvus_local_api): """ target: test load collection after release partition and load partitions method: 1. load collection 2. release partition 3. search on the released partition and report error 4. load partitions expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w1.release() collection_w.search(vectors, default_search_field, default_search_params, default_limit, partition_names=[partition1], check_task=CheckTasks.err_res, check_items={ct.err_code: 1, ct.err_msg: "not loaded"}) partition_w1.load() partition_w2.load() @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support") def test_load_collection_after_release_partition_collection(self, enable_milvus_local_api): """ target: test load collection after release partition and collection method: 1. load collection 2. release partition 3. query on the released partition and report error 3. release collection 4. load collection expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w = self.init_partition_wrap(collection_w, partition1) self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w.release() error = {ct.err_code: 65538, ct.err_msg: 'partition not loaded'} collection_w.query(default_term_expr, partition_names=[partition1], check_task=CheckTasks.err_res, check_items=error) collection_w.release() collection_w.load() @pytest.mark.tags(CaseLabel.L2) def test_load_partitions_after_release_partition_collection(self, enable_milvus_local_api): """ target: test load partitions after release partition and collection method: 1. load collection 2. release partition 3. release collection 4. load one partition 5. query on the other partition and raise error 6. load the other partition expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w1.release() collection_w.release() partition_w1.load() error = {ct.err_code: 65538, ct.err_msg: 'partition not loaded'} collection_w.query(default_term_expr, partition_names=[partition2], check_task=CheckTasks.err_res, check_items=error) partition_w2.load() @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support") def test_load_collection_after_release_partitions(self, enable_milvus_local_api): """ target: test load collection after release partitions method: 1. load collection 2. release partitions 3. load collection expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w1.release() partition_w2.release() collection_w.load() @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support") def test_load_partitions_after_release_partitions(self, enable_milvus_local_api): """ target: test load partitions after release partitions method: 1. load collection 2. release partitions 3. load partitions expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w1.release() partition_w2.release() partition_w1.load() partition_w2.load() @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support") def test_load_collection_after_drop_partition_and_release_another(self, enable_milvus_local_api): """ target: test load collection after drop a partition and release another method: 1. load collection 2. drop a partition 3. release left partition 4. query on the left partition 5. load collection expected: No exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w1.release() partition_w1.drop() partition_w2.release() error = {ct.err_code: 65538, ct.err_msg: 'partition not loaded'} collection_w.query(default_term_expr, partition_names=[partition2], check_task=CheckTasks.err_res, check_items=error) collection_w.load() @pytest.mark.tags(CaseLabel.L2) def test_load_partition_after_drop_partition_and_release_another(self, enable_milvus_local_api): """ target: test load partition after drop a partition and release another method: 1. load collection 2. drop a partition 3. release left partition 4. load partition 5. query on the partition expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w1.release() partition_w1.drop() partition_w2.release() partition_w2.load() collection_w.query(default_term_expr, partition_names=[partition2]) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support") def test_load_another_partition_after_drop_one_partition(self, enable_milvus_local_api): """ target: test load another partition after drop a partition method: 1. load collection 2. drop a partition 3. load another partition 4. query on the partition expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w1.release() partition_w1.drop() partition_w2.load() collection_w.query(default_term_expr, partition_names=[partition2]) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support") def test_load_collection_after_drop_one_partition(self, enable_milvus_local_api): """ target: test load collection after drop a partition method: 1. load collection 2. drop a partition 3. load collection 4. query on the partition expected: No exception """ collection_w = self.init_collection_general(prefix)[0] partition_w1 = self.init_partition_wrap(collection_w, partition1) partition_w2 = self.init_partition_wrap(collection_w, partition2) collection_w.load() partition_w1.release() partition_w1.drop() collection_w.load() collection_w.query(default_term_expr, partition_names=[partition2]) @pytest.mark.tags(CaseLabel.L2) def test_load_release_collection(self, enable_milvus_local_api): """ target: test load, release non-exist collection method: 1. load, release and drop collection 2. load and release dropped collection expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str() collection_wr = self.init_collection_wrap(name=c_name) collection_wr.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_wr.load() collection_wr.release() collection_wr.drop() error = {ct.err_code: 100, ct.err_msg: "collection not found"} collection_wr.load(check_task=CheckTasks.err_res, check_items=error) collection_wr.release(check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) def test_release_collection_after_drop(self, enable_milvus_local_api): """ target: test release collection after drop method: insert and flush, then release collection after load and drop expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str() collection_wr = self.init_collection_wrap(name=c_name) collection_wr.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_wr.load() collection_wr.drop() error = {ct.err_code: 100, ct.err_msg: "collection not found"} collection_wr.release(check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.xfail(reason="milvus lite not support") def test_load_partition_names_empty(self, enable_milvus_local_api): """ target: test query another partition method: 1. insert entities into two partitions 2.query on one partition and query result empty expected: query result is empty """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_wrap(name=cf.gen_unique_str(prefix)) partition_w = self.init_partition_wrap(collection_wrap=collection_w) # insert [0, half) into partition_w half = ct.default_nb // 2 df_partition = cf.gen_default_dataframe_data(nb=half) partition_w.insert(df_partition) # insert [half, nb) into _default df_default = cf.gen_default_dataframe_data(nb=half, start=half) collection_w.insert(df_default) # flush collection_w.num_entities collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) # load error = {ct.err_code: 0, ct.err_msg: "due to no partition specified"} collection_w.load(partition_names=[], check_task=CheckTasks.err_res, check_items=error) @pytest.fixture(scope="function", params=ct.get_invalid_strs) def get_non_number_replicas(self, request): if request.param == 1: pytest.skip("1 is valid replica number") if request.param is None: pytest.skip("None is valid replica number") yield request.param @pytest.mark.tags(CaseLabel.L2) def test_load_replica_non_number(self, get_non_number_replicas): """ target: test load collection with non-number replicas method: load with non-number replicas expected: raise exceptions """ # create, insert collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix)) df = cf.gen_default_dataframe_data() insert_res, _ = collection_w.insert(df) assert collection_w.num_entities == ct.default_nb collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) # load with non-number replicas error = {ct.err_code: 0, ct.err_msg: f"but expected one of: int, long"} collection_w.load(replica_number=get_non_number_replicas, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("replicas", [-1, 0]) @pytest.mark.xfail(reason="milvus lite not support partition") def test_load_replica_invalid_number(self, replicas): """ target: test load partition with invalid replica number method: load with invalid replica number expected: load successfully as replica = 1 """ # create, insert collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix)) df = cf.gen_default_dataframe_data() insert_res, _ = collection_w.insert(df) assert collection_w.num_entities == ct.default_nb collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load(replica_number=replicas) replicas = collection_w.get_replicas()[0] groups = replicas.groups assert len(groups) == 1 assert len(groups[0].shards) == 1 @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("replicas", [None]) def test_load_replica_number_none(self, replicas): """ target: test load partition with replica number none method: load with replica number=None expected: raise exceptions """ # create, insert collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix)) df = cf.gen_default_dataframe_data(nb=1000) insert_res, _ = collection_w.insert(df) assert collection_w.num_entities == ct.default_nb collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load(replica_number=replicas, check_task=CheckTasks.err_res, check_items={"err_code": 1, "err_msg": "`replica_number` value None is illegal"}) @pytest.mark.tags(CaseLabel.L2) def test_load_replica_greater_than_querynodes(self, enable_milvus_local_api): """ target: test load with replicas that greater than querynodes method: load with 3 replicas (2 querynode) expected: Raise exception """ # create, insert collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix)) df = cf.gen_default_dataframe_data() insert_res, _ = collection_w.insert(df) assert collection_w.num_entities == ct.default_nb collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) error = {ct.err_code: 65535, ct.err_msg: "failed to load collection: failed to spawn replica for collection: nodes not enough"} collection_w.load(replica_number=3, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.ClusterOnly) def test_load_replica_change(self, enable_milvus_local_api): """ target: test load replica change method: 1.load with replica 1 2.load with a new replica number 3.release collection 4.load with a new replica 5.create index is a must because get_query_segment_info could only return indexed and loaded segment expected: The second time successfully loaded with a new replica number """ # create, insert collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix)) df = cf.gen_default_dataframe_data() insert_res, _ = collection_w.insert(df) assert collection_w.num_entities == ct.default_nb collection_w.create_index(ct.default_float_vec_field_name, ct.default_index) collection_w.load(replica_number=1) for seg in self.utility_wrap.get_query_segment_info(collection_w.name)[0]: assert len(seg.nodeIds) == 1 collection_w.query(expr=f"{ct.default_int64_field_name} in [0]") loading_progress, _ = self.utility_wrap.loading_progress(collection_w.name) assert loading_progress == {'loading_progress': '100%'} # verify load different replicas thrown an exception error = {ct.err_code: 1100, ct.err_msg: "failed to load collection: can't change the replica number for " "loaded collection: expected=1, actual=2: invalid parameter"} collection_w.load(replica_number=2, check_task=CheckTasks.err_res, check_items=error) one_replica, _ = collection_w.get_replicas() assert len(one_replica.groups) == 1 collection_w.release() collection_w.load(replica_number=2) # replicas is not yet reflected in loading progress loading_progress, _ = self.utility_wrap.loading_progress(collection_w.name) assert loading_progress == {'loading_progress': '100%'} two_replicas, _ = collection_w.get_replicas() assert len(two_replicas.groups) == 2 collection_w.query(expr=f"{ct.default_int64_field_name} in [0]", check_task=CheckTasks.check_query_results, check_items={'exp_res': [{'int64': 0}]}) # verify loaded segments included 2 replicas and twice num entities seg_info = self.utility_wrap.get_query_segment_info(collection_w.name)[0] num_entities = 0 for seg in seg_info: assert len(seg.nodeIds) == 2 num_entities += seg.num_rows assert num_entities == ct.default_nb @pytest.mark.tags(CaseLabel.ClusterOnly) def test_load_replica_multi(self, enable_milvus_local_api): """ target: test load with multiple replicas method: 1.create collection with one shards 2.insert multiple segments 3.load with multiple replicas 4.query and search expected: Query and search successfully """ # create, insert collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix), shards_num=1) tmp_nb = 1000 replica_number = 2 for i in range(replica_number): df = cf.gen_default_dataframe_data(nb=tmp_nb, start=i * tmp_nb) insert_res, _ = collection_w.insert(df) assert collection_w.num_entities == (i + 1) * tmp_nb collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load(replica_number=replica_number) replicas = collection_w.get_replicas()[0] assert len(replicas.groups) == replica_number for seg in self.utility_wrap.get_query_segment_info(collection_w.name)[0]: assert len(seg.nodeIds) == replica_number query_res, _ = collection_w.query(expr=f"{ct.default_int64_field_name} in [0, {tmp_nb}]") assert len(query_res) == 2 search_res, _ = collection_w.search(vectors, default_search_field, default_search_params, default_limit) assert len(search_res[0]) == ct.default_limit @pytest.mark.tags(CaseLabel.ClusterOnly) def test_load_replica_partitions(self, enable_milvus_local_api): """ target: test load replica with partitions method: 1.Create collection and one partition 2.Insert data into collection and partition 3.Load multi replicas with partition 4.Query expected: Verify query result """ collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix)) df_1 = cf.gen_default_dataframe_data(nb=ct.default_nb) df_2 = cf.gen_default_dataframe_data(nb=ct.default_nb, start=ct.default_nb) collection_w.insert(df_1) partition_w = self.init_partition_wrap(collection_w, ct.default_tag) partition_w.insert(df_2) assert collection_w.num_entities == ct.default_nb * 2 collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load([partition_w.name], replica_number=2) for seg in self.utility_wrap.get_query_segment_info(collection_w.name)[0]: assert len(seg.nodeIds) == 2 # default tag query 0 empty collection_w.query(expr=f"{ct.default_int64_field_name} in [0]", partition_names=[ct.default_tag], check_tasks=CheckTasks.check_query_empty) # default query 0 empty collection_w.query(expr=f"{ct.default_int64_field_name} in [2000]", check_task=CheckTasks.check_query_results, check_items={'exp_res': df_2.iloc[:1, :1].to_dict('records')}) error = {ct.err_code: 65538, ct.err_msg: "partition not loaded"} collection_w.query(expr=f"{ct.default_int64_field_name} in [0]", partition_names=[ct.default_partition_name, ct.default_tag], check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L3) def test_load_replica_non_shard_leader(self, enable_milvus_local_api): """ target: test replica groups which one of QN is not shard leader method: 1.deploy cluster with 5 QNs 2.create collection with 2 shards 3.insert and flush 4.load with 2 replica number 5.insert growing data 6.search and query expected: Verify search and query results """ # create and insert entities collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix), shards_num=2) df = cf.gen_default_dataframe_data() collection_w.insert(df) assert collection_w.num_entities == ct.default_nb collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) # load with multi replica and insert growing data collection_w.load(replica_number=2) df_growing = cf.gen_default_dataframe_data(100, start=ct.default_nb) collection_w.insert(df_growing) replicas = collection_w.get_replicas()[0] # verify there are 2 groups (2 replicas) assert len(replicas.groups) == 2 log.debug(replicas) all_group_nodes = [] for group in replicas.groups: # verify each group have 3 shards assert len(group.shards) == 2 all_group_nodes.extend(group.group_nodes) # verify all groups has 5 querynodes assert len(all_group_nodes) == 5 # Verify 2 replicas segments loaded seg_info, _ = self.utility_wrap.get_query_segment_info(collection_w.name) for seg in seg_info: assert len(seg.nodeIds) == 2 # verify search successfully res, _ = collection_w.search(vectors, default_search_field, default_search_params, default_limit) assert len(res[0]) == ct.default_limit # verify query sealed and growing data successfully collection_w.query(expr=f"{ct.default_int64_field_name} in [0, {ct.default_nb}]", check_task=CheckTasks.check_query_results, check_items={'exp_res': [{'int64': 0}, {'int64': 3000}]}) @pytest.mark.tags(CaseLabel.L3) def test_load_replica_multiple_shard_leader(self, enable_milvus_local_api): """ target: test replica groups which one of QN is shard leader of multiple shards method: 1.deploy cluster with 5 QNs 2.create collection with 3 shards 3.insert and flush 4.load with 2 replica number 5.insert growng data 6.search and query expected: Verify search and query results """ # craete and insert collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix), shards_num=3) df = cf.gen_default_dataframe_data() collection_w.insert(df) assert collection_w.num_entities == ct.default_nb collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) # load with multi replicas and insert growing data collection_w.load(replica_number=2) df_growing = cf.gen_default_dataframe_data(100, start=ct.default_nb) collection_w.insert(df_growing) # verify replica infos replicas, _ = collection_w.get_replicas() log.debug(replicas) assert len(replicas.groups) == 2 all_group_nodes = [] for group in replicas.groups: # verify each group have 3 shards assert len(group.shards) == 3 all_group_nodes.extend(group.group_nodes) # verify all groups has 5 querynodes assert len(all_group_nodes) == 5 # Verify 2 replicas segments loaded seg_info, _ = self.utility_wrap.get_query_segment_info(collection_w.name) for seg in seg_info: assert len(seg.nodeIds) == 2 # Verify search successfully res, _ = collection_w.search(vectors, default_search_field, default_search_params, default_limit) assert len(res[0]) == ct.default_limit # Verify query sealed and growing entities successfully collection_w.query(expr=f"{ct.default_int64_field_name} in [0, {ct.default_nb}]", check_task=CheckTasks.check_query_results, check_items={'exp_res': [{'int64': 0}, {'int64': 3000}]}) @pytest.mark.tags(CaseLabel.L3) def test_load_replica_sq_count_balance(self, enable_milvus_local_api): """ target: test load with multi replicas, and sq request load balance cross replicas method: 1.Deploy milvus with multi querynodes 2.Insert entities and load with replicas 3.Do query req many times 4.Verify the querynode sq_req_count metrics expected: Infer whether the query request is load balanced. """ from utils.util_k8s import get_metrics_querynode_sq_req_count collection_w = self.init_collection_wrap(name=cf.gen_unique_str(prefix)) df = cf.gen_default_dataframe_data(nb=5000) mutation_res, _ = collection_w.insert(df) assert collection_w.num_entities == 5000 total_sq_count = 20 collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load(replica_number=3) for i in range(total_sq_count): ids = [random.randint(0, 100) for _ in range(5)] collection_w.query(f"{ct.default_int64_field_name} in {ids}") replicas, _ = collection_w.get_replicas() log.debug(replicas) sq_req_count = get_metrics_querynode_sq_req_count() for group in replicas.groups: group_nodes = group.group_nodes group_sq_req_count = 0 for node in group_nodes: group_sq_req_count += sq_req_count[node] log.debug(f"Group nodes {group_nodes} with total sq_req_count {group_sq_req_count}") @pytest.mark.tags(CaseLabel.L2) def test_get_collection_replicas_not_loaded(self, enable_milvus_local_api): """ target: test get replicas of not loaded collection method: not loaded collection and get replicas expected: raise an exception """ # create, insert collection_w = self.init_collection_wrap(cf.gen_unique_str(prefix)) df = cf.gen_default_dataframe_data() insert_res, _ = collection_w.insert(df) assert collection_w.num_entities == ct.default_nb res, _ = collection_w.get_replicas() assert len(res.groups) == 0 @pytest.mark.tags(CaseLabel.L3) def test_count_multi_replicas(self, enable_milvus_local_api): """ target: test count multi replicas method: 1. load data with multi replicas 2. count expected: verify count """ # create -> insert -> flush collection_w = self.init_collection_wrap(name=cf.gen_unique_str(prefix)) df = cf.gen_default_dataframe_data() collection_w.insert(df) collection_w.flush() # index -> load replicas collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_w.load(replica_number=2) # count collection_w.query(expr=f'{ct.default_int64_field_name} >= 0', output_fields=[ct.default_count_output], check_task=CheckTasks.check_query_results, check_items={'exp_res': [{"count(*)": ct.default_nb}]}) @pytest.mark.tags(CaseLabel.L1) def test_load_collection_without_creating_index(self, enable_milvus_local_api): """ target: test drop index after load without release method: create a collection without index, then load expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) collection_w = self.init_collection_general(prefix, True, is_index=False)[0] collection_w.load(check_task=CheckTasks.err_res, check_items={"err_code": 1, "err_msg": "index not found"}) class TestDescribeCollection(TestcaseBase): """ ****************************************************************** The following cases are used to test `collection.describe` function ****************************************************************** """ @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support partition > partition number ") def test_collection_describe(self, enable_milvus_local_api): """ target: test describe collection method: create a collection and check its information when describe expected: return correct information """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) collection_w = self.init_collection_wrap(name=c_name) collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) description = \ {'collection_name': c_name, 'auto_id': False, 'num_shards': ct.default_shards_num, 'description': '', 'fields': [ {'field_id': 100, 'name': 'int64', 'description': '', 'type': 5, 'params': {}, 'is_primary': True}, {'field_id': 101, 'name': 'float', 'description': '', 'type': 10, 'params': {}}, {'field_id': 102, 'name': 'varchar', 'description': '', 'type': 21, 'params': {'max_length': 65535}}, {'field_id': 103, 'name': 'json_field', 'description': '', 'type': 23, 'params': {}}, {'field_id': 104, 'name': 'float_vector', 'description': '', 'type': 101, 'params': {'dim': 128}} ], 'aliases': [], 'consistency_level': 0, 'properties': {}, 'num_partitions': 1, 'enable_dynamic_field': False} res = collection_w.describe()[0] del res['collection_id'] log.info(res) assert description == res class TestReleaseAdvanced(TestcaseBase): @pytest.mark.tags(CaseLabel.L0) def test_release_collection_during_searching(self, enable_milvus_local_api): """ target: test release collection during searching method: insert entities into collection, flush and load collection, release collection during searching expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) data = cf.gen_default_list_data() c_name = cf.gen_unique_str() collection_wr = self.init_collection_wrap(name=c_name) collection_wr.insert(data=data) assert collection_wr.num_entities == ct.default_nb collection_wr.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) collection_wr.load() search_res, _ = collection_wr.search(vectors, default_search_field, default_search_params, default_limit, _async=True) collection_wr.release() error = {ct.err_code: 65535, ct.err_msg: "collection not loaded"} collection_wr.search(vectors, default_search_field, default_search_params, default_limit, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.xfail(reason="milvus lite not support partition") def test_release_partition_during_searching(self, enable_milvus_local_api): """ target: test release partition during searching method: insert entities into partition, flush and load partition, release partition during searching expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) partition_num = 1 collection_w = self.init_collection_general(prefix, True, 10, partition_num, is_index=False)[0] collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) par = collection_w.partitions par_name = par[partition_num].name par[partition_num].load() limit = 10 collection_w.search(vectors, default_search_field, default_search_params, limit, default_search_exp, [par_name]) par[partition_num].release() collection_w.search(vectors, default_search_field, default_search_params, limit, default_search_exp, [par_name], check_task=CheckTasks.err_res, check_items={"err_code": 65535, "err_msg": "collection not loaded"}) @pytest.mark.tags(CaseLabel.L0) @pytest.mark.xfail(reason="milvus lite not support partition") def test_release_indexed_collection_during_searching(self, enable_milvus_local_api): """ target: test release indexed collection during searching method: insert entities into partition, flush and load partition, release collection during searching expected: raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) partition_num = 1 collection_w = self.init_collection_general(prefix, True, 10, partition_num, is_index=False)[0] collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) par = collection_w.partitions par_name = par[partition_num].name par[partition_num].load() limit = 10 collection_w.search(vectors, default_search_field, default_search_params, limit, default_search_exp, [par_name], _async=True) collection_w.release() error = {ct.err_code: 65535, ct.err_msg: "collection not loaded"} collection_w.search(vectors, default_search_field, default_search_params, limit, default_search_exp, [par_name], check_task=CheckTasks.err_res, check_items=error) # class TestLoadPartition(TestcaseBase): # """ # ****************************************************************** # The following cases are used to test `load_collection` function # ****************************************************************** # """ # # @pytest.fixture( # scope="function", # params=gen_simple_index() # ) # def get_simple_index(self, request, connect): # return request.param # # @pytest.fixture( # scope="function", # params=gen_binary_index() # ) # def get_binary_index(self, request): # log.info(request.param) # if request.param["index_type"] in ct.binary_support: # return request.param # else: # pytest.skip("Skip index Temporary") # # @pytest.mark.tags(CaseLabel.L0) # @pytest.mark.parametrize('binary_index', gen_binary_index()) # @pytest.mark.parametrize('metric_type', ct.binary_metrics) # def test_load_partition_after_index_binary(self, binary_index, metric_type, enable_milvus_local_api): # """ # target: test load binary_collection, after index created # method: insert and create index, load binary_collection with correct params # expected: no error raised # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # partition_num = 1 # collection_w = self.init_collection_general(prefix, True, ct.default_nb, partition_num, # is_binary=True, is_index=False)[0] # # # for metric_type in ct.binary_metrics: # binary_index["metric_type"] = metric_type # if binary_index["index_type"] == "BIN_IVF_FLAT" and metric_type in ct.structure_metrics: # error = {ct.err_code: 65535, # ct.err_msg: f"metric type {metric_type} not found or not supported, supported: [HAMMING JACCARD]"} # collection_w.create_index(ct.default_binary_vec_field_name, binary_index, # check_task=CheckTasks.err_res, check_items=error) # collection_w.create_index(ct.default_binary_vec_field_name, ct.default_bin_flat_index) # else: # collection_w.create_index(ct.default_binary_vec_field_name, binary_index) # par = collection_w.partitions # par[partition_num].load() # # @pytest.mark.tags(CaseLabel.L2) # def test_load_partition_dis_connect(self, enable_milvus_local_api): # """ # target: test load partition, without connection # method: load partition with correct params, with a disconnected instance # expected: load raise exception # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # collection_w = self.init_collection_wrap() # partition_name = cf.gen_unique_str(prefix) # description = cf.gen_unique_str("desc_") # partition_w = self.init_partition_wrap(collection_w, partition_name, # description=description, # check_task=CheckTasks.check_partition_property, # check_items={"name": partition_name, "description": description, # "is_empty": True, "num_entities": 0} # ) # collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) # partition_w.load() # self.connection_wrap.remove_connection(ct.default_alias) # res_list, _ = self.connection_wrap.list_connections() # assert ct.default_alias not in res_list # error = {ct.err_code: 1, ct.err_msg: 'should create connect first.'} # partition_w.load(check_task=CheckTasks.err_res, check_items=error) # # @pytest.mark.tags(CaseLabel.L2) # def test_release_partition_dis_connect(self, enable_milvus_local_api): # """ # target: test release collection, without connection # method: release collection with correct params, with a disconnected instance # expected: release raise exception # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # collection_w = self.init_collection_wrap() # partition_name = cf.gen_unique_str(prefix) # description = cf.gen_unique_str("desc_") # partition_w = self.init_partition_wrap(collection_w, partition_name, # description=description, # check_task=CheckTasks.check_partition_property, # check_items={"name": partition_name, "description": description, # "is_empty": True, "num_entities": 0} # ) # collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) # partition_w.load() # self.connection_wrap.remove_connection(ct.default_alias) # res_list, _ = self.connection_wrap.list_connections() # assert ct.default_alias not in res_list # error = {ct.err_code: 1, ct.err_msg: 'should create connect first.'} # partition_w.release(check_task=CheckTasks.err_res, check_items=error) # # @pytest.mark.tags(CaseLabel.L2) # def test_load_partition_not_existed(self, enable_milvus_local_api): # """ # target: test load partition for invalid scenario # method: load not existed partition # expected: raise exception and report the error # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # collection_w = self.init_collection_wrap() # partition_name = cf.gen_unique_str(prefix) # description = cf.gen_unique_str("desc_") # partition_w = self.init_partition_wrap(collection_w, partition_name, # description=description, # check_task=CheckTasks.check_partition_property, # check_items={"name": partition_name, "description": description, # "is_empty": True, "num_entities": 0}) # collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index) # partition_w.drop() # error = {ct.err_code: 200, ct.err_msg: 'partition not found[partition=%s]' % partition_name} # partition_w.load(check_task=CheckTasks.err_res, check_items=error) # # @pytest.mark.tags(CaseLabel.L0) # def test_release_partition_not_load(self, enable_milvus_local_api): # """ # target: test release partition without load # method: release partition without load # expected: release success # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # collection_w = self.init_collection_wrap() # partition_name = cf.gen_unique_str(prefix) # description = cf.gen_unique_str("desc_") # partition_w = self.init_partition_wrap(collection_w, partition_name, # description=description, # check_task=CheckTasks.check_partition_property, # check_items={"name": partition_name, "description": description, # "is_empty": True, "num_entities": 0}) # partition_w.release() # # @pytest.mark.tags(CaseLabel.L2) # def test_load_release_after_drop(self, enable_milvus_local_api): # """ # target: test load and release partition after drop # method: drop partition and then load and release it # expected: raise exception # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # collection_w = self.init_collection_wrap() # partition_name = cf.gen_unique_str(prefix) # description = cf.gen_unique_str("desc_") # partition_w = self.init_partition_wrap(collection_w, partition_name, # description=description, # check_task=CheckTasks.check_partition_property, # check_items={"name": partition_name, "description": description, # "is_empty": True, "num_entities": 0}) # partition_w.drop() # collection_w.create_index(ct.default_float_vec_field_name) # error = {ct.err_code: 200, ct.err_msg: 'partition not found[partition=%s]' % partition_name} # partition_w.load(check_task=CheckTasks.err_res, check_items=error) # partition_w.release(check_task=CheckTasks.err_res, check_items=error) # # @pytest.mark.tags(CaseLabel.L0) # def test_release_partition_after_drop(self, enable_milvus_local_api): # """ # target: test release collection after drop # method: insert and flush, then release collection after load and drop # expected: raise exception # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # collection_w = self.init_collection_wrap() # partition_name = cf.gen_unique_str(prefix) # description = cf.gen_unique_str("desc_") # partition_w = self.init_partition_wrap(collection_w, partition_name, # description=description, # check_task=CheckTasks.check_partition_property, # check_items={"name": partition_name, "description": description, # "is_empty": True, "num_entities": 0}) # partition_w.drop() # error = {ct.err_code: 200, ct.err_msg: 'partition not found[partition=%s]' % partition_name} # partition_w.release(check_task=CheckTasks.err_res, check_items=error) # # @pytest.mark.tags(CaseLabel.L0) # def test_load_release_after_collection_drop(self, enable_milvus_local_api): # """ # target: test release collection after drop # method: insert and flush, then release collection after load and drop # expected: raise exception # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # collection_w = self.init_collection_wrap() # name = collection_w.name # partition_name = cf.gen_unique_str(prefix) # description = cf.gen_unique_str("desc_") # partition_w = self.init_partition_wrap(collection_w, partition_name, # description=description, # check_task=CheckTasks.check_partition_property, # check_items={"name": partition_name, "description": description, # "is_empty": True, "num_entities": 0}) # collection_w.drop() # error = {ct.err_code: 0, ct.err_msg: "collection not found"} # partition_w.load(check_task=CheckTasks.err_res, check_items=error) # partition_w.release(check_task=CheckTasks.err_res, check_items=error) # # @pytest.mark.tags(CaseLabel.L2) # def test_load_collection_after_load_loaded_partition(self, enable_milvus_local_api): # """ # target: test load partition after load partition # method: 1. load partition # 2. load the partition again # 3. query on the non-loaded partition # 4. load collection # expected: No exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w1.load() # error = {ct.err_code: 65538, ct.err_msg: 'partition not loaded'} # collection_w.query(default_term_expr, partition_names=[partition2], # check_task=CheckTasks.err_res, check_items=error) # collection_w.load() # # @pytest.mark.tags(CaseLabel.L2) # def test_load_collection_after_load_unloaded_partition(self, enable_milvus_local_api): # """ # target: test load partition after load an unloaded partition # method: 1. load partition # 2. load another partition # 3. query on the collection # 4. load collection # expected: No exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w2.load() # collection_w.query(default_term_expr) # collection_w.load() # # @pytest.mark.tags(CaseLabel.L2) # def test_load_collection_after_load_one_partition(self, enable_milvus_local_api): # """ # target: test load partition after load partition # method: 1. load partition # 2. load collection # 3. query on the partitions # expected: No exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # collection_w.load() # collection_w.query(default_term_expr, partition_names=[partition1, partition2]) # # @pytest.mark.tags(CaseLabel.L0) # def test_load_partitions_release_collection(self, enable_milvus_local_api): # """ # target: test release collection after load partitions # method: 1. load partition # 2. release collection # 3. query on the partition # 4. load partitions # 5. query on the collection # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # collection_w.release() # error = {ct.err_code: 65535, ct.err_msg: "collection not loaded"} # collection_w.query(default_term_expr, partition_names=[partition1], # check_task=CheckTasks.err_res, check_items=error) # partition_w1.load() # partition_w2.load() # collection_w.query(default_term_expr) # # @pytest.mark.tags(CaseLabel.L2) # def test_load_collection_release_collection(self, enable_milvus_local_api): # """ # target: test load collection after load partitions # method: 1. load partition # 2. release collection # 3. load collection # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # collection_w.release() # collection_w.load() # # @pytest.mark.tags(CaseLabel.L2) # def test_load_partitions_after_load_release_partition(self, enable_milvus_local_api): # """ # target: test load partitions after load and release partition # method: 1. load partition # 2. release partition # 3. query on the partition # 4. load partitions(include released partition and non-released partition) # 5. query on the collection # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w1.release() # error = {ct.err_code: 65535, # ct.err_msg: 'collection not loaded'} # collection_w.query(default_term_expr, partition_names=[partition1], # check_task=CheckTasks.err_res, check_items=error) # partition_w1.load() # partition_w2.load() # collection_w.query(default_term_expr) # # @pytest.mark.tags(CaseLabel.L2) # def test_load_collection_after_load_release_partition(self, enable_milvus_local_api): # """ # target: test load collection after load and release partition # method: 1. load partition # 2. release partition # 3. load collection # 4. search on the collection # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w1.release() # collection_w.load() # collection_w.search(vectors, default_search_field, default_search_params, # default_limit, partition_names=[partition1, partition2]) # # @pytest.mark.tags(CaseLabel.L2) # def test_load_partitions_after_load_partition_release_partitions(self, enable_milvus_local_api): # """ # target: test load partitions after load partition and release partitions # method: 1. load partition # 2. release partitions # 3. load partitions # 4. query on the partitions # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w1.release() # partition_w2.release() # partition_w1.load() # partition_w2.load() # collection_w.query(default_term_expr, partition_names=[partition1, partition2]) # # @pytest.mark.tags(CaseLabel.L2) # def test_load_collection_after_load_partition_release_partitions(self, enable_milvus_local_api): # """ # target: test load collection after load partition and release partitions # method: 1. load partition # 2. release partitions # 3. query on the partitions # 4. load collection # 5. query on the partitions # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w1.release() # partition_w2.release() # error = {ct.err_code: 65535, ct.err_msg: 'collection not loaded'} # collection_w.query(default_term_expr, partition_names=[partition1, partition2], # check_task=CheckTasks.err_res, check_items=error) # collection_w.load() # collection_w.query(default_term_expr, partition_names=[partition1, partition2]) # # @pytest.mark.tags(CaseLabel.L2) # def test_load_partition_after_load_drop_partition(self, enable_milvus_local_api): # """ # target: test load partition after load and drop partition # method: 1. load partition # 2. drop the loaded partition # 3. load the left partition # 4. query on the partition # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w1.release() # partition_w1.drop() # partition_w2.load() # collection_w.query(default_term_expr, partition_names=[partition2]) # # @pytest.mark.tags(CaseLabel.L2) # def test_load_collection_after_load_drop_partition(self, enable_milvus_local_api): # """ # target: test load collection after load and drop partition # method: 1. load partition # 2. drop the loaded partition # 3. query on the partition # 4. drop another partition # 5. load collection # 6. query on the collection # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w1.release() # partition_w1.drop() # error = {ct.err_code: 65535, ct.err_msg: f'partition name {partition1} not found'} # collection_w.query(default_term_expr, partition_names=[partition1, partition2], # check_task=CheckTasks.err_res, check_items=error) # partition_w2.drop() # collection_w.load() # collection_w.query(default_term_expr) # # @pytest.mark.tags(CaseLabel.L2) # def test_release_load_partition_after_load_drop_partition(self, enable_milvus_local_api): # """ # target: test release load partition after load and drop partition # method: 1. load partition # 2. drop the loaded partition # 3. release another partition # 4. load the partition # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w1.release() # partition_w1.drop() # partition_w2.release() # partition_w2.load() # collection_w.query(default_term_expr, partition_names=[partition2]) # # @pytest.mark.tags(CaseLabel.L2) # def test_release_load_collection_after_load_drop_partition(self, enable_milvus_local_api): # """ # target: test release load partition after load and drop partition # method: 1. load partition # 2. drop the loaded partition # 3. release another partition # 4. load collection # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w1.release() # partition_w1.drop() # partition_w2.release() # collection_w.load() # collection_w.query(default_term_expr) # # @pytest.mark.tags(CaseLabel.L2) # def test_load_another_partition_after_load_drop_partition(self, enable_milvus_local_api): # """ # target: test load another collection after load and drop one partition # method: 1. load partition # 2. drop the unloaded partition # 3. load the partition again # 4. query on the partition # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w2.drop() # partition_w1.load() # collection_w.query(default_term_expr, partition_names=[partition1]) # # @pytest.mark.tags(CaseLabel.L2) # def test_release_load_partition_after_load_partition_drop_another(self, enable_milvus_local_api): # """ # target: test release load partition after load and drop partition # method: 1. load partition # 2. drop the unloaded partition # 3. release the loaded partition # 4. query on the released partition # 5. reload the partition # 6. query on the partition # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w2.drop() # partition_w1.release() # error = {ct.err_code: 65535, # ct.err_msg: 'collection not loaded'} # collection_w.query(default_term_expr, partition_names=[partition1], # check_task=CheckTasks.err_res, check_items=error) # partition_w1.load() # collection_w.query(default_term_expr, partition_names=[partition1]) # # @pytest.mark.tags(CaseLabel.L2) # def test_release_load_collection_after_load_partition_drop_another(self, enable_milvus_local_api): # """ # target: test release load partition after load and drop partition # method: 1. load partition # 2. drop the unloaded partition # 3. release the loaded partition # 4. load collection # 5. query on the collection # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w2.drop() # partition_w1.release() # collection_w.load() # collection_w.query(default_term_expr) # # @pytest.mark.tags(CaseLabel.L2) # def test_release_unloaded_partition(self, enable_milvus_local_api): # """ # target: test load collection after load and drop partition # method: 1. load partition # 2. release the other partition # 3. query on the first partition # expected: no exception # """ # collection_w = self.init_collection_general(prefix, is_index=False)[0] # collection_w.create_index(default_search_field) # partition_w1 = self.init_partition_wrap(collection_w, partition1) # partition_w2 = self.init_partition_wrap(collection_w, partition2) # partition_w1.load() # partition_w2.release() # collection_w.query(default_term_expr, partition_names=[partition1]) class TestCollectionString(TestcaseBase): """ ****************************************************************** The following cases are used to test about string ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) def test_collection_string_field_is_primary(self, enable_milvus_local_api): """ target: test create collection with string field method: 1. create collection with string field and vector field 2. set string fields is_primary=True expected: Create collection successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) schema = cf.gen_string_pk_default_collection_schema() self.collection_wrap.init_collection(name=c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L1) def test_collection_with_muti_string_fields(self, enable_milvus_local_api): """ target: test create collection with muti string fields method: 1. create collection with primary string field and not primary string field 2. string fields is_primary=True expected: Create collection successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_field = cf.gen_int64_field() vec_field = cf.gen_float_vec_field() string_field_1 = cf.gen_string_field(is_primary=True) string_field_2 = cf.gen_string_field(name=c_name) schema = cf.gen_collection_schema(fields=[int_field, string_field_1, string_field_2, vec_field]) self.collection_wrap.init_collection(name=c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L1) def test_collection_only_string_field(self, enable_milvus_local_api): """ target: test create collection with one string field method: create collection with only string field expected: Raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) string_field = cf.gen_string_field(is_primary=True) schema = cf.gen_collection_schema([string_field]) error = {ct.err_code: 0, ct.err_msg: "No vector field is found"} self.collection_wrap.init_collection(name=cf.gen_unique_str(prefix), schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_collection_string_field_with_exceed_max_len(self, enable_milvus_local_api): """ target: test create collection with string field method: 1. create collection with string field 2. String field max_length exceeds maximum expected: Raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field() max_length = 100000 string_field = cf.gen_string_field(max_length=max_length) schema = cf.gen_collection_schema([int_field, string_field, vec_field]) error = {ct.err_code: 65535, ct.err_msg: "the maximum length specified for a VarChar should be in (0, 65535]"} self.collection_wrap.init_collection(name=c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.xfail(reason="incorrect error code: 2000") def test_collection_invalid_string_field_dtype(self, enable_milvus_local_api): """ target: test create collection with string field method: create collection with string field, the string field datatype is invaild expected: Raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) string_field = self.field_schema_wrap.init_field_schema(name="string", dtype=DataType.STRING)[0] int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field() schema = cf.gen_collection_schema(fields=[int_field, string_field, vec_field]) error = {ct.err_code: 0, ct.err_msg: "string data type not supported yet, please use VarChar type instead"} self.collection_wrap.init_collection(name=cf.gen_unique_str(prefix), schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_collection_string_field_is_primary_and_auto_id(self, enable_milvus_local_api): """ target: test create collection with string field method: create collection with string field, the string field primary and auto id are true expected: Create collection successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) int_field = cf.gen_int64_field() vec_field = cf.gen_float_vec_field() string_field = cf.gen_string_field(is_primary=True, auto_id=True) fields = [int_field, string_field, vec_field] schema = self.collection_schema_wrap.init_collection_schema(fields=fields)[0] self.init_collection_wrap(schema=schema, check_task=CheckTasks.check_collection_property, check_items={"schema": schema, "primary": ct.default_string_field_name}) class TestCollectionJSON(TestcaseBase): """ ****************************************************************** The following cases are used to test about json ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("auto_id", [True, False]) def test_collection_json_field_as_primary_key(self, auto_id, enable_milvus_local_api): """ target: test create collection with JSON field as primary key method: 1. create collection with one JSON field, and vector field 2. set json field is_primary=true 3. set auto_id as true expected: Raise exception (not supported) """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) int_field = cf.gen_int64_field() vec_field = cf.gen_float_vec_field() string_field = cf.gen_string_field() # 1. create json field as primary key through field schema api error = {ct.err_code: 1, ct.err_msg: "Primary key type must be DataType.INT64 or DataType.VARCHAR"} json_field = cf.gen_json_field(is_primary=True, auto_id=auto_id) fields = [int_field, string_field, json_field, vec_field] self.collection_schema_wrap.init_collection_schema(fields=fields, check_task=CheckTasks.err_res, check_items=error) # 2. create json field as primary key through collection schema api json_field = cf.gen_json_field() fields = [int_field, string_field, json_field, vec_field] self.collection_schema_wrap.init_collection_schema(fields=fields, primary_field=ct.default_json_field_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_float_field_name, ct.default_json_field_name]) def test_collection_json_field_partition_key(self, primary_field, enable_milvus_local_api): """ target: test create collection with multiple JSON fields method: 1. create collection with multiple JSON fields, primary key field and vector field 2. set json field is_primary=false expected: Raise exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) cf.gen_unique_str(prefix) error = {ct.err_code: 1, ct.err_msg: "Partition key field type must be DataType.INT64 or DataType.VARCHAR."} cf.gen_json_default_collection_schema(primary_field=primary_field, is_partition_key=True, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L0) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_collection_json_field_supported_primary_key(self, primary_field, enable_milvus_local_api): """ target: test create collection with one JSON field method: 1. create collection with one JSON field, primary key field and vector field 2. set json field is_primary=false expected: Create collection successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) schema = cf.gen_json_default_collection_schema(primary_field=primary_field) self.collection_wrap.init_collection(name=c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_field", [ct.default_int64_field_name, ct.default_string_field_name]) def test_collection_multiple_json_fields_supported_primary_key(self, primary_field, enable_milvus_local_api): """ target: test create collection with multiple JSON fields method: 1. create collection with multiple JSON fields, primary key field and vector field 2. set json field is_primary=false expected: Create collection successfully """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) schema = cf.gen_multiple_json_default_collection_schema(primary_field=primary_field) self.collection_wrap.init_collection(name=c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) class TestCollectionARRAY(TestcaseBase): """ ****************************************************************** The following cases are used to test about array ****************************************************************** """ @pytest.mark.tags(CaseLabel.L2) def test_collection_array_field_element_type_not_exist(self, enable_milvus_local_api): """ target: test create collection with ARRAY field without element type method: create collection with one array field without element type expected: Raise exception """ int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field() array_field = cf.gen_array_field(element_type=None) array_schema = cf.gen_collection_schema([int_field, vec_field, array_field]) self.init_collection_wrap(schema=array_schema, check_task=CheckTasks.err_res, check_items={ct.err_code: 65535, ct.err_msg: "element data type None is not valid"}) @pytest.mark.tags(CaseLabel.L2) # @pytest.mark.skip("issue #27522") @pytest.mark.parametrize("element_type", [1001, 'a', [], (), {1}, DataType.BINARY_VECTOR, DataType.FLOAT_VECTOR, DataType.JSON, DataType.ARRAY]) def test_collection_array_field_element_type_invalid(self, element_type): """ target: Create a field with invalid element_type method: Create a field with invalid element_type 1. Type not in DataType: 1, 'a', ... 2. Type in DataType: binary_vector, float_vector, json_field, array_field expected: Raise exception """ int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field() array_field = cf.gen_array_field(element_type=element_type) array_schema = cf.gen_collection_schema([int_field, vec_field, array_field]) error = {ct.err_code: 65535, ct.err_msg: "element data type None is not valid"} if element_type in ['a', {1}]: error = {ct.err_code: 1, ct.err_msg: "Unexpected error"} self.init_collection_wrap(schema=array_schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("https://github.com/milvus-io/pymilvus/issues/2041") def test_collection_array_field_no_capacity(self, enable_milvus_local_api): """ target: Create a field without giving max_capacity method: Create a field without giving max_capacity expected: Raise exception """ int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field() array_field = cf.gen_array_field(max_capacity=None) array_schema = cf.gen_collection_schema([int_field, vec_field, array_field]) self.init_collection_wrap(schema=array_schema, check_task=CheckTasks.err_res, check_items={ct.err_code: 65535, ct.err_msg: "the value of max_capacity must be an integer"}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("https://github.com/milvus-io/pymilvus/issues/2041") @pytest.mark.parametrize("max_capacity", [[], 'a', (), -1, 4097]) def test_collection_array_field_invalid_capacity(self, max_capacity): """ target: Create a field with invalid max_capacity method: Create a field with invalid max_capacity 1. Type invalid: [], 'a', () 2. Value invalid: <0, >max_capacity(4096) expected: Raise exception """ int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field() array_field = cf.gen_array_field(max_capacity=max_capacity) array_schema = cf.gen_collection_schema([int_field, vec_field, array_field]) self.init_collection_wrap(schema=array_schema, check_task=CheckTasks.err_res, check_items={ct.err_code: 65535, ct.err_msg: "the maximum capacity specified for a " "Array should be in (0, 4096]"}) @pytest.mark.tags(CaseLabel.L2) def test_collection_string_array_without_max_length(self, enable_milvus_local_api): """ target: Create string array without giving max length method: Create string array without giving max length expected: Raise exception """ int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field() array_field = cf.gen_array_field(element_type=DataType.VARCHAR) array_schema = cf.gen_collection_schema([int_field, vec_field, array_field]) self.init_collection_wrap(schema=array_schema, check_task=CheckTasks.err_res, check_items={ct.err_code: 65535, ct.err_msg: "type param(max_length) should be specified for " "varChar field of collection"}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.skip("https://github.com/milvus-io/pymilvus/issues/2041") @pytest.mark.parametrize("max_length", [[], 'a', (), -1, 65536]) def test_collection_string_array_max_length_invalid(self, max_length): """ target: Create string array with invalid max length method: Create string array with invalid max length 1. Type invalid: [], 'a', () 2. Value invalid: <0, >max_length(65535) expected: Raise exception """ int_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field() array_field = cf.gen_array_field(element_type=DataType.VARCHAR, max_length=max_length) array_schema = cf.gen_collection_schema([int_field, vec_field, array_field]) self.init_collection_wrap(schema=array_schema, check_task=CheckTasks.err_res, check_items={ct.err_code: 65535, ct.err_msg: "the maximum length specified for a VarChar " "should be in (0, 65535]"}) @pytest.mark.tags(CaseLabel.L2) def test_collection_array_field_all_datatype(self, enable_milvus_local_api): """ target: test create collection with ARRAY field all data type method: 1. Create field respectively: int8, int16, int32, int64, varchar, bool, float, double 2. Insert data respectively: int8, int16, int32, int64, varchar, bool, float, double expected: Raise exception """ # Create field respectively nb = ct.default_nb pk_field = cf.gen_int64_field(is_primary=True) vec_field = cf.gen_float_vec_field() int8_array = cf.gen_array_field(name="int8_array", element_type=DataType.INT8, max_capacity=nb) int16_array = cf.gen_array_field(name="int16_array", element_type=DataType.INT16, max_capacity=nb) int32_array = cf.gen_array_field(name="int32_array", element_type=DataType.INT32, max_capacity=nb) int64_array = cf.gen_array_field(name="int64_array", element_type=DataType.INT64, max_capacity=nb) bool_array = cf.gen_array_field(name="bool_array", element_type=DataType.BOOL, max_capacity=nb) float_array = cf.gen_array_field(name="float_array", element_type=DataType.FLOAT, max_capacity=nb) double_array = cf.gen_array_field(name="double_array", element_type=DataType.DOUBLE, max_capacity=nb) string_array = cf.gen_array_field(name="string_array", element_type=DataType.VARCHAR, max_capacity=nb, max_length=100) array_schema = cf.gen_collection_schema([pk_field, vec_field, int8_array, int16_array, int32_array, int64_array, bool_array, float_array, double_array, string_array]) collection_w = self.init_collection_wrap(schema=array_schema, check_task=CheckTasks.check_collection_property, check_items={exp_schema: array_schema}) # check array in collection.describe() res = collection_w.describe()[0] log.info(res) fields = [ {"field_id": 100, "name": "int64", "description": "", "type": 5, "params": {}, "element_type": 0, "is_primary": True}, {"field_id": 101, "name": "float_vector", "description": "", "type": 101, "params": {"dim": ct.default_dim}, "element_type": 0}, {"field_id": 102, "name": "int8_array", "description": "", "type": 22, "params": {"max_capacity": 2000}, "element_type": 2}, {"field_id": 103, "name": "int16_array", "description": "", "type": 22, "params": {"max_capacity": 2000}, "element_type": 3}, {"field_id": 104, "name": "int32_array", "description": "", "type": 22, "params": {"max_capacity": 2000}, "element_type": 4}, {"field_id": 105, "name": "int64_array", "description": "", "type": 22, "params": {"max_capacity": 2000}, "element_type": 5}, {"field_id": 106, "name": "bool_array", "description": "", "type": 22, "params": {"max_capacity": 2000}, "element_type": 1}, {"field_id": 107, "name": "float_array", "description": "", "type": 22, "params": {"max_capacity": 2000}, "element_type": 10}, {"field_id": 108, "name": "double_array", "description": "", "type": 22, "params": {"max_capacity": 2000}, "element_type": 11}, {"field_id": 109, "name": "string_array", "description": "", "type": 22, "params": {"max_length": 100, "max_capacity": 2000}, "element_type": 21} ] # assert res["fields"] == fields # Insert data respectively nb = 10 pk_values = [i for i in range(nb)] float_vec = cf.gen_vectors(nb, ct.default_dim) int8_values = [[numpy.int8(j) for j in range(nb)] for i in range(nb)] int16_values = [[numpy.int16(j) for j in range(nb)] for i in range(nb)] int32_values = [[numpy.int32(j) for j in range(nb)] for i in range(nb)] int64_values = [[numpy.int64(j) for j in range(nb)] for i in range(nb)] bool_values = [[numpy.bool_(j) for j in range(nb)] for i in range(nb)] float_values = [[numpy.float32(j) for j in range(nb)] for i in range(nb)] double_values = [[numpy.double(j) for j in range(nb)] for i in range(nb)] string_values = [[str(j) for j in range(nb)] for i in range(nb)] data = [pk_values, float_vec, int8_values, int16_values, int32_values, int64_values, bool_values, float_values, double_values, string_values] collection_w.insert(data) # check insert successfully collection_w.flush() collection_w.num_entities == nb class TestCollectionMultipleVectorValid(TestcaseBase): """ ****************************************************************** # The followings are valid cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("primary_key", [cf.gen_int64_field(is_primary=True), cf.gen_string_field(is_primary=True)]) @pytest.mark.parametrize("auto_id", [True, False]) @pytest.mark.parametrize("shards_num", [1, 3]) def test_create_collection_multiple_vectors_all_supported_field_type(self, primary_key, auto_id, shards_num, enable_milvus_local_api): """ target: test create collection with multiple vector fields method: create collection with multiple vector fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] vector_limit_num = max_vector_field_num - 2 # add multiple vector fields for i in range(vector_limit_num): vector_field_name = cf.gen_unique_str("field_name") field = cf.gen_float_vec_field(name=vector_field_name) int_fields.append(field) # add other vector fields to maximum fields num int_fields.append(cf.gen_int8_field()) int_fields.append(cf.gen_int16_field()) int_fields.append(cf.gen_int32_field()) int_fields.append(cf.gen_float_field()) int_fields.append(cf.gen_double_field()) int_fields.append(cf.gen_string_field(cf.gen_unique_str("vchar_field_name"))) int_fields.append(cf.gen_json_field()) int_fields.append(cf.gen_bool_field()) int_fields.append(cf.gen_array_field()) int_fields.append(cf.gen_binary_vec_field()) int_fields.append(primary_key) schema = cf.gen_collection_schema(fields=int_fields, auto_id=auto_id, shards_num=shards_num) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_key", [ct.default_int64_field_name, ct.default_string_field_name]) @pytest.mark.parametrize("auto_id", [True, False]) @pytest.mark.parametrize("enable_dynamic_field", [True, False]) def test_create_collection_multiple_vectors_different_dim(self, primary_key, auto_id, enable_dynamic_field, enable_milvus_local_api): """ target: test create collection with multiple vector fields (different dim) method: create collection with multiple vector fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) another_dim = ct.min_dim schema = cf.gen_default_collection_schema(primary_field=primary_key, auto_id=auto_id, dim=ct.max_dim, enable_dynamic_field=enable_dynamic_field, multiple_dim_array=[another_dim]) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_key", [ct.default_int64_field_name, ct.default_string_field_name]) def test_create_collection_multiple_vectors_maximum_dim(self, primary_key, enable_milvus_local_api): """ target: test create collection with multiple vector fields method: create collection with multiple vector fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) schema = cf.gen_default_collection_schema(primary_field=primary_key, dim=ct.max_dim, multiple_dim_array=[ct.max_dim]) self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema}) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("primary_key", [cf.gen_int64_field(is_primary=True), cf.gen_string_field(is_primary=True)]) @pytest.mark.parametrize("auto_id", [True, False]) @pytest.mark.parametrize("par_key_field", [ct.default_int64_field_name, ct.default_string_field_name]) @pytest.mark.xfail(reason="milvus lite not support partition") def test_create_collection_multiple_vectors_partition_key(self, primary_key, auto_id, par_key_field, enable_milvus_local_api): """ target: test create collection with multiple vector fields method: create collection with multiple vector fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] vector_limit_num = max_vector_field_num - 2 # add multiple vector fields for i in range(vector_limit_num): vector_field_name = cf.gen_unique_str("field_name") field = cf.gen_float_vec_field(name=vector_field_name) int_fields.append(field) # add other vector fields to maximum fields num int_fields.append(cf.gen_int8_field()) int_fields.append(cf.gen_int16_field()) int_fields.append(cf.gen_int32_field()) int_fields.append(cf.gen_int64_field(cf.gen_unique_str("int_field_name"), is_partition_key=(par_key_field == ct.default_int64_field_name))) int_fields.append(cf.gen_float_field()) int_fields.append(cf.gen_double_field()) int_fields.append(cf.gen_string_field(cf.gen_unique_str("vchar_field_name"), is_partition_key=(par_key_field == ct.default_string_field_name))) int_fields.append(cf.gen_json_field()) int_fields.append(cf.gen_bool_field()) int_fields.append(cf.gen_array_field()) int_fields.append(cf.gen_binary_vec_field()) int_fields.append(primary_key) schema = cf.gen_collection_schema(fields=int_fields, auto_id=auto_id) collection_w = \ self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.check_collection_property, check_items={exp_name: c_name, exp_schema: schema})[0] assert len(collection_w.partitions) == ct.default_partition_num class TestCollectionMultipleVectorInvalid(TestcaseBase): """ Test case of search interface """ @pytest.fixture(scope="function", params=ct.get_invalid_strs) def get_invalid_dim(self, request): if request.param == 1: pytest.skip("1 is valid dim") yield request.param """ ****************************************************************** # The followings are invalid cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("primary_key", [cf.gen_int64_field(is_primary=True), cf.gen_string_field(is_primary=True)]) def test_create_collection_multiple_vectors_same_vector_field_name(self, primary_key, enable_milvus_local_api): """ target: test create collection with multiple vector fields method: create collection with multiple vector fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] vector_limit_num = max_vector_field_num - 2 # add multiple vector fields for i in range(vector_limit_num): field = cf.gen_float_vec_field() int_fields.append(field) # add other vector fields to maximum fields num int_fields.append(cf.gen_int8_field()) int_fields.append(cf.gen_int16_field()) int_fields.append(cf.gen_int32_field()) int_fields.append(cf.gen_float_field()) int_fields.append(cf.gen_double_field()) int_fields.append(cf.gen_string_field(cf.gen_unique_str("vchar_field_name"))) int_fields.append(cf.gen_json_field()) int_fields.append(cf.gen_bool_field()) int_fields.append(cf.gen_array_field()) int_fields.append(cf.gen_binary_vec_field()) int_fields.append(primary_key) schema = cf.gen_collection_schema(fields=int_fields) error = {ct.err_code: 65535, ct.err_msg: "duplicated field name"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("invalid_vector_name", ["12-s", "12 s", "(mn)", "中文", "%$#", "a".join("a" for i in range(256))]) @pytest.mark.xfail(reason="milvus lite not support partition") def test_create_collection_multiple_vectors_invalid_part_vector_field_name(self, invalid_vector_name, enable_milvus_local_api): """ target: test create collection with multiple vector fields method: create collection with multiple vector fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] # add multiple vector fields vector_field_1 = cf.gen_float_vec_field(name=invalid_vector_name) int_fields.append(vector_field_1) vector_field_2 = cf.gen_float_vec_field(name="valid_field_name") int_fields.append(vector_field_2) # add other vector fields to maximum fields num int_fields.append(cf.gen_int64_field(is_primary=True)) schema = cf.gen_collection_schema(fields=int_fields) error = {ct.err_code: 1701, ct.err_msg: "Invalid field name: %s" % invalid_vector_name} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("invalid_vector_name", ["12-s", "12 s", "(mn)", "中文", "%$#", "a".join("a" for i in range(256))]) @pytest.mark.xfail(reason="incorrect error code: 1100") def test_create_collection_multiple_vectors_invalid_all_vector_field_name(self, invalid_vector_name, enable_milvus_local_api): """ target: test create collection with multiple vector fields method: create collection with multiple vector fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] # add multiple vector fields vector_field_1 = cf.gen_float_vec_field(name=invalid_vector_name) int_fields.append(vector_field_1) vector_field_2 = cf.gen_float_vec_field(name=invalid_vector_name + " ") int_fields.append(vector_field_2) # add other vector fields to maximum fields num int_fields.append(cf.gen_int64_field(is_primary=True)) schema = cf.gen_collection_schema(fields=int_fields) error = {ct.err_code: 1701, ct.err_msg: "Invalid field name: %s" % invalid_vector_name} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip(reason="issue #29796") def test_create_collection_multiple_vectors_invalid_dim(self, get_invalid_dim, enable_milvus_local_api): """ target: test create collection with multiple vector fields method: create collection with multiple vector fields expected: no exception """ self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) c_name = cf.gen_unique_str(prefix) int_fields = [] # add multiple vector fields vector_field_1 = cf.gen_float_vec_field(dim=get_invalid_dim) int_fields.append(vector_field_1) vector_field_2 = cf.gen_float_vec_field(name="float_vec_field") int_fields.append(vector_field_2) # add other vector fields to maximum fields num int_fields.append(cf.gen_int64_field(is_primary=True)) schema = cf.gen_collection_schema(fields=int_fields) error = {ct.err_code: 65535, ct.err_msg: "Invalid dim"} self.collection_wrap.init_collection(c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) # class TestCollectionMmap(TestcaseBase): # @pytest.mark.tags(CaseLabel.L1) # def test_describe_collection_mmap(self, enable_milvus_local_api): # """ # target: enable or disable mmap in the collection # method: enable or disable mmap in the collection # expected: description information contains mmap # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # c_name = cf.gen_unique_str(prefix) # collection_w, _ = self.collection_wrap.init_collection(c_name, schema=default_schema) # collection_w.set_properties({'mmap.enabled': True}) # pro = collection_w.describe().get("properties") # assert "mmap.enabled" in pro.keys() # assert pro["mmap.enabled"] == 'True' # collection_w.set_properties({'mmap.enabled': False}) # pro = collection_w.describe().get("properties") # assert pro["mmap.enabled"] == 'False' # collection_w.set_properties({'mmap.enabled': True}) # pro = collection_w.describe().get("properties") # assert pro["mmap.enabled"] == 'True' # # @pytest.mark.tags(CaseLabel.L1) # def test_load_mmap_collection(self, enable_milvus_local_api): # """ # target: after loading, enable mmap for the collection # method: 1. data preparation and create index # 2. load collection # 3. enable mmap on collection # expected: raise exception # """ # c_name = cf.gen_unique_str(prefix) # collection_w = self.init_collection_wrap(c_name, schema=default_schema) # collection_w.insert(cf.gen_default_list_data()) # collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index, # index_name=ct.default_index_name) # collection_w.set_properties({'mmap.enabled': True}) # pro = collection_w.describe()[0].get("properties") # assert pro["mmap.enabled"] == 'True' # collection_w.load() # collection_w.set_properties({'mmap.enabled': True}, # check_task=CheckTasks.err_res, # check_items={ct.err_code: 104, # ct.err_msg: f"collection already loaded"}) # # @pytest.mark.tags(CaseLabel.L2) # def test_drop_mmap_collection(self, enable_milvus_local_api): # """ # target: set mmap on collection # method: 1. set mmap on collection # 2. drop collection # 3. describe collection # expected: description information contains mmap # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # c_name = "coll_rand" # collection_w, _ = self.collection_wrap.init_collection(c_name, schema=default_schema) # collection_w.set_properties({'mmap.enabled': True}) # collection_w.drop() # collection_w, _ = self.collection_wrap.init_collection(c_name, schema=default_schema) # pro = collection_w.describe().get("properties") # assert "mmap.enabled" not in pro.keys() # # @pytest.mark.tags(CaseLabel.L2) # def test_multiple_collections_enable_mmap(self, enable_milvus_local_api): # """ # target: enabling mmap for multiple collections in a single instance # method: enabling mmap for multiple collections in a single instance # expected: the collection description message for mmap is normal # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # c_name = "coll_1" # c_name2 = "coll_2" # c_name3 = "coll_3" # collection_w, _ = self.collection_wrap.init_collection(c_name, schema=default_schema) # collection_w2, _ = self.collection_wrap.init_collection(c_name2, schema=default_schema) # collection_w3, _ = self.collection_wrap.init_collection(c_name3, schema=default_schema) # collection_w.set_properties({'mmap.enabled': True}) # collection_w2.set_properties({'mmap.enabled': True}) # pro = collection_w.describe().get("properties") # pro2 = collection_w2.describe().get("properties") # assert pro["mmap.enabled"] == 'True' # assert pro2["mmap.enabled"] == 'True' # collection_w3.set_properties({'mmap.enabled': True}) # pro3 = collection_w3.describe().get("properties") # assert pro3["mmap.enabled"] == 'True' # # @pytest.mark.tags(CaseLabel.L2) # def test_flush_collection_mmap(self, enable_milvus_local_api): # """ # target: after flush, collection enables mmap # method: after flush, collection enables mmap # expected: the collection description message for mmap is normal # """ # self._connect(enable_milvus_local_api=enable_milvus_local_api, init_collection=True) # c_name = cf.gen_unique_str(prefix) # collection_w, _ = self.collection_wrap.init_collection(c_name, schema=default_schema) # collection_w.insert(cf.gen_default_list_data()) # collection_w.create_index(ct.default_float_vec_field_name, index_params=ct.default_flat_index, # index_name=ct.default_index_name) # collection_w.alter_index(ct.default_index_name, {'mmap.enabled': False}) # collection_w.flush() # collection_w.set_properties({'mmap.enabled': True}) # pro = collection_w.describe().get("properties") # assert pro["mmap.enabled"] == 'True' # collection_w.alter_index(ct.default_index_name, {'mmap.enabled': True}) # collection_w.load() # vectors = [[random.random() for _ in range(default_dim)] for _ in range(default_nq)] # collection_w.search(vectors[:default_nq], default_search_field, # default_search_params, default_limit, # default_search_exp, # check_task=CheckTasks.check_search_results, # check_items={"nq": default_nq, # "limit": default_limit}) # # @pytest.mark.tags(CaseLabel.L2) # def test_enable_mmap_after_drop_collection(self, enable_milvus_local_api): # """ # target: enable mmap after deleting a collection # method: enable mmap after deleting a collection # expected: raise exception # """ # collection_w = self.init_collection_general(prefix, True, is_binary=True, is_index=False)[0] # collection_w.drop() # collection_w.set_properties({'mmap.enabled': True}, check_task=CheckTasks.err_res, # check_items={ct.err_code: 100, # ct.err_msg: f"collection not found"}) ================================================ FILE: tests/utils/api_request.py ================================================ import traceback import copy import os from utils.util_log import test_log as log # enable_traceback = os.getenv('ENABLE_TRACEBACK', "True") # log.info(f"enable_traceback:{enable_traceback}") class Error: def __init__(self, error): self.code = getattr(error, 'code', -1) self.message = getattr(error, 'message', str(error)) def __str__(self): return f"Error(code={self.code}, message={self.message})" def __repr__(self): return f"Error(code={self.code}, message={self.message})" log_row_length = 300 def api_request_catch(): def wrapper(func): def inner_wrapper(*args, **kwargs): try: _kwargs = copy.deepcopy(kwargs) if "enable_traceback" in _kwargs: del _kwargs["enable_traceback"] res = func(*args, **_kwargs) # if enable_traceback == "True": if kwargs.get("enable_traceback", True): res_str = str(res) log_res = res_str[0:log_row_length] + '......' if len(res_str) > log_row_length else res_str log.debug("(api_response) : %s " % log_res) return res, True except Exception as e: e_str = str(e) log_e = e_str[0:log_row_length] + '......' if len(e_str) > log_row_length else e_str # if enable_traceback == "True": if kwargs.get("enable_traceback", True): log.error(traceback.format_exc()) log.error("(api_response) : %s" % log_e) return Error(e), False return inner_wrapper return wrapper @api_request_catch() def api_request(_list, **kwargs): if isinstance(_list, list): func = _list[0] if callable(func): arg = _list[1:] arg_str = str(arg) log_arg = arg_str[0:log_row_length] + '......' if len(arg_str) > log_row_length else arg_str # if enable_traceback == "True": if kwargs.get("enable_traceback", True): log.debug("(api_request) : [%s] args: %s, kwargs: %s" % (func.__qualname__, log_arg, str(kwargs))) return func(*arg, **kwargs) return False, False ================================================ FILE: tests/utils/thread_util.py ================================================ import logging import threading from typing import Callable class ConcurrencyObj: def __init__(self, func_obj: Callable, interval=0, stop_flag=False): self.func_obj = func_obj self.interval = interval self.stop_flag = stop_flag def set_stop_flag(self, flag=True): self.stop_flag = flag def thread_func(self, *args, **kwargs): self.func_obj(*args, **kwargs) if self.stop_flag is False: t = threading.Timer(interval=self.interval, function=self.thread_func, args=args, kwargs=kwargs) t.start() def multi_func(self, num, *args, **kwargs): logging.info(f"multi_func start ") for i in range(num): logging.info("thread number: {}".format(i)) self.thread_func(*args, **kwargs) ================================================ FILE: tests/utils/util_common.py ================================================ import glob import time from yaml import full_load import json import pandas as pd from utils.util_log import test_log as log def gen_experiment_config(yaml): """load the yaml file of chaos experiment""" with open(yaml) as f: _config = full_load(f) f.close() return _config def findkeys(node, kv): # refer to https://stackoverflow.com/questions/9807634/find-all-occurrences-of-a-key-in-nested-dictionaries-and-lists if isinstance(node, list): for i in node: for x in findkeys(i, kv): yield x elif isinstance(node, dict): if kv in node: yield node[kv] for j in node.values(): for x in findkeys(j, kv): yield x def update_key_value(node, modify_k, modify_v): # update the value of modify_k to modify_v if isinstance(node, list): for i in node: update_key_value(i, modify_k, modify_v) elif isinstance(node, dict): if modify_k in node: node[modify_k] = modify_v for j in node.values(): update_key_value(j, modify_k, modify_v) return node def update_key_name(node, modify_k, modify_k_new): # update the name of modify_k to modify_k_new if isinstance(node, list): for i in node: update_key_name(i, modify_k, modify_k_new) elif isinstance(node, dict): if modify_k in node: value_backup = node[modify_k] del node[modify_k] node[modify_k_new] = value_backup for j in node.values(): update_key_name(j, modify_k, modify_k_new) return node def get_collections(file_name="all_collections.json"): try: with open(f"/tmp/ci_logs/{file_name}", "r") as f: data = json.load(f) collections = data["all"] except Exception as e: log.error(f"get_all_collections error: {e}") return [] return collections def get_deploy_test_collections(): try: with open("/tmp/ci_logs/deploy_test_all_collections.json", "r") as f: data = json.load(f) collections = data["all"] except Exception as e: log.error(f"get_all_collections error: {e}") return [] return collections def get_chaos_test_collections(): try: with open("/tmp/ci_logs/chaos_test_all_collections.json", "r") as f: data = json.load(f) collections = data["all"] except Exception as e: log.error(f"get_all_collections error: {e}") return [] return collections def wait_signal_to_apply_chaos(): all_db_file = glob.glob("/tmp/ci_logs/event_records*.parquet") log.info(f"all files {all_db_file}") ready_apply_chaos = True timeout = 15*60 t0 = time.time() for f in all_db_file: while True and (time.time() - t0 < timeout): try: df = pd.read_parquet(f) log.debug(f"read {f}:result\n {df}") result = df[(df['event_name'] == 'init_chaos') & (df['event_status'] == 'ready')] if len(result) > 0: log.info(f"{f}: {result}") ready_apply_chaos = True break else: ready_apply_chaos = False except Exception as e: log.error(f"read_parquet error: {e}") ready_apply_chaos = False time.sleep(10) return ready_apply_chaos if __name__ == "__main__": d = { "id" : "abcde", "key1" : "blah", "key2" : "blah blah", "nestedlist" : [ { "id" : "qwerty", "nestednestedlist" : [ { "id" : "xyz", "keyA" : "blah blah blah" }, { "id" : "fghi", "keyZ" : "blah blah blah" }], "anothernestednestedlist" : [ { "id" : "asdf", "keyQ" : "blah blah" }, { "id" : "yuiop", "keyW" : "blah" }] } ] } print(list(findkeys(d, 'id'))) update_key_value(d, "none_id", "ccc") print(d) ================================================ FILE: tests/utils/util_k8s.py ================================================ import json import os.path import time import pyetcd import requests from pymilvus import connections from kubernetes import client, config from kubernetes.client.rest import ApiException from common.milvus_sys import MilvusSys from utils.util_log import test_log as log from common.common_type import in_cluster_env def init_k8s_client_config(): """ init kubernetes client config """ try: in_cluster = os.getenv(in_cluster_env, default='False') # log.debug(f"env variable IN_CLUSTER: {in_cluster}") if in_cluster.lower() == 'true': config.load_incluster_config() else: config.load_kube_config() except Exception as e: raise Exception(e) def get_current_namespace(): init_k8s_client_config() ns = config.list_kube_config_contexts()[1]["context"]["namespace"] return ns def wait_pods_ready(namespace, label_selector, expected_num=None, timeout=360): """ wait pods with label selector all ready :param namespace: the namespace where the release :type namespace: str :param label_selector: labels to restrict which pods are waiting to be ready :type label_selector: str :param expected_num: expected the minimum number of pods to be ready if not None :type expected_num: int :param timeout: limits the duration of the call :type timeout: int :example: >>> wait_pods_ready("default", "app.kubernetes.io/instance=scale-query", expected_num=9) """ init_k8s_client_config() api_instance = client.CoreV1Api() try: all_pos_ready_flag = False t0 = time.time() while not all_pos_ready_flag and time.time() - t0 < timeout: api_response = api_instance.list_namespaced_pod(namespace=namespace, label_selector=label_selector) all_pos_ready_flag = True if expected_num is not None and len(api_response.items) < expected_num: all_pos_ready_flag = False else: for item in api_response.items: if item.status.phase != 'Running': all_pos_ready_flag = False break for c in item.status.container_statuses: log.debug(f"{c.name} status is {c.ready}") if c.ready is False: all_pos_ready_flag = False break if not all_pos_ready_flag: log.debug("all pods are not ready, please wait") time.sleep(5) if all_pos_ready_flag: log.info(f"all pods in namespace {namespace} with label {label_selector} are ready") else: log.info(f"timeout for waiting all pods in namespace {namespace} with label {label_selector} ready") except ApiException as e: log.error("Exception when calling CoreV1Api->list_namespaced_pod: %s\n" % e) raise Exception(str(e)) return all_pos_ready_flag def get_pod_list(namespace, label_selector): """ get pod list with label selector :param namespace: the namespace where the release :type namespace: str :param label_selector: labels to restrict which pods to list :type label_selector: str :example: >>> get_pod_list("chaos-testing", "app.kubernetes.io/instance=test-proxy-pod-failure, component=proxy") """ init_k8s_client_config() api_instance = client.CoreV1Api() try: api_response = api_instance.list_namespaced_pod(namespace=namespace, label_selector=label_selector) return api_response.items except ApiException as e: log.error("Exception when calling CoreV1Api->list_namespaced_pod: %s\n" % e) raise Exception(str(e)) def get_pod_ip_name_pairs(namespace, label_selector): """ get pod ip name pairs with label selector :param namespace: the namespace where the release :type namespace: str :param label_selector: labels to restrict which pods to list :type label_selector: str :example: >>> get_pod_ip_name_pairs("chaos-testing", "app.kubernetes.io/instance=test-proxy-pod-failure, component=querynode") """ m = dict() items = get_pod_list(namespace, label_selector) for item in items: ip = item.status.pod_ip name = item.metadata.name m[ip] = name return m def get_querynode_id_pod_pairs(namespace, label_selector): """ get milvus node id and corresponding pod name pairs with label selector :param namespace: the namespace where the release :type namespace: str :param label_selector: labels to restrict which pods to list :type label_selector: str :example: >>> querynode_id_pod_pair = get_querynode_id_pod_pairs("chaos-testing", "app.kubernetes.io/instance=milvus-multi-querynode, component=querynode") { 5: 'milvus-multi-querynode-querynode-7b8f4b5c5-4pn42', 9: 'milvus-multi-querynode-querynode-7b8f4b5c5-99tx7', 1: 'milvus-multi-querynode-querynode-7b8f4b5c5-w9sk8', 3: 'milvus-multi-querynode-querynode-7b8f4b5c5-xx84j', 6: 'milvus-multi-querynode-querynode-7b8f4b5c5-x95dp' } """ # TODO: extend this function to other worker nodes, not only querynode querynode_ip_pod_pair = get_pod_ip_name_pairs(namespace, label_selector) querynode_id_pod_pair = {} ms = MilvusSys() for node in ms.query_nodes: ip = node["infos"]['hardware_infos']["ip"].split(":")[0] querynode_id_pod_pair[node["identifier"]] = querynode_ip_pod_pair[ip] return querynode_id_pod_pair def get_milvus_instance_name(namespace, host="127.0.0.1", port="19530", milvus_sys=None): """ get milvus instance name after connection :param namespace: the namespace where the release :type namespace: str :param host: milvus host ip :type host: str :param port: milvus port :type port: str :example: >>> milvus_instance_name = get_milvus_instance_name("chaos-testing", "10.96.250.111") "milvus-multi-querynode" """ if milvus_sys is None: connections.add_connection(_default={"host": host, "port": port}) connections.connect(alias='_default') ms = MilvusSys() else: ms = milvus_sys query_node_ip = ms.query_nodes[0]["infos"]['hardware_infos']["ip"].split(":")[0] ip_name_pairs = get_pod_ip_name_pairs(namespace, "app.kubernetes.io/name=milvus") pod_name = ip_name_pairs[query_node_ip] init_k8s_client_config() api_instance = client.CoreV1Api() try: api_response = api_instance.read_namespaced_pod(namespace=namespace, name=pod_name) except ApiException as e: log.error("Exception when calling CoreV1Api->list_namespaced_pod: %s\n" % e) raise Exception(str(e)) milvus_instance_name = api_response.metadata.labels["app.kubernetes.io/instance"] return milvus_instance_name def get_milvus_deploy_tool(namespace, milvus_sys): """ get milvus instance name after connection :param namespace: the namespace where the release :type namespace: str :param milvus_sys: milvus_sys :type namespace: MilvusSys :example: >>> deploy_tool = get_milvus_deploy_tool("chaos-testing", milvus_sys) "helm" """ ms = milvus_sys query_node_ip = ms.query_nodes[0]["infos"]['hardware_infos']["ip"].split(":")[0] ip_name_pairs = get_pod_ip_name_pairs(namespace, "app.kubernetes.io/name=milvus") pod_name = ip_name_pairs[query_node_ip] init_k8s_client_config() api_instance = client.CoreV1Api() try: api_response = api_instance.read_namespaced_pod(namespace=namespace, name=pod_name) except ApiException as e: log.error("Exception when calling CoreV1Api->list_namespaced_pod: %s\n" % e) raise Exception(str(e)) if ("app.kubernetes.io/managed-by" in api_response.metadata.labels and api_response.metadata.labels["app.kubernetes.io/managed-by"] == "milvus-operator"): deploy_tool = "milvus-operator" else: deploy_tool = "helm" return deploy_tool def export_pod_logs(namespace, label_selector, release_name=None): """ export pod logs with label selector to '/tmp/milvus' :param namespace: the namespace where the release :type namespace: str :param label_selector: labels to restrict which pods logs to export :type label_selector: str :param release_name: use the release name as server logs director name :type label_selector: str :example: >>> export_pod_logs("chaos-testing", "app.kubernetes.io/instance=mic-milvus") """ if isinstance(release_name, str): if len(release_name.strip()) == 0: raise ValueError("Got an unexpected space release_name") else: raise TypeError("Got an unexpected non-string release_name") pod_log_path = '/tmp/milvus_logs' if release_name is None else f'/tmp/milvus_logs/{release_name}' if not os.path.isdir(pod_log_path): os.makedirs(pod_log_path) # get pods and export logs items = get_pod_list(namespace, label_selector=label_selector) try: for item in items: pod_name = item.metadata.name os.system(f'kubectl logs {pod_name} > {pod_log_path}/{pod_name}.log 2>&1') except Exception as e: log.error(f"Exception when export pod {pod_name} logs: %s\n" % e) raise Exception(str(e)) def read_pod_log(namespace, label_selector, release_name): init_k8s_client_config() items = get_pod_list(namespace, label_selector=label_selector) try: # export log to /tmp/release_name path pod_log_path = f'/tmp/milvus_logs/{release_name}' if not os.path.isdir(pod_log_path): os.makedirs(pod_log_path) api_instance = client.CoreV1Api() for item in items: pod = item.metadata.name log.debug(f'Start to read {pod} log') logs = api_instance.read_namespaced_pod_log(name=pod, namespace=namespace, async_req=True) with open(f'{pod_log_path}/{pod}.log', "w") as f: f.write(logs.get()) except ApiException as e: log.error(f"Exception when read pod {pod} logs: %s\n" % e) raise Exception(str(e)) def get_metrics_querynode_sq_req_count(): """ get metric milvus_querynode_collection_num from prometheus""" PROMETHEUS = 'http://10.96.7.6:9090' query_str = 'milvus_querynode_sq_req_count{app_kubernetes_io_instance="mic-replica",' \ 'app_kubernetes_io_name="milvus",namespace="chaos-testing"}' response = requests.get(PROMETHEUS + '/api/v1/query', params={'query': query_str}) if response.status_code == 200: results = response.json()["data"]['result'] # print(results) # print(type(results)) log.debug(json.dumps(results, indent=4)) milvus_querynode_sq_req_count = {} for res in results: if res["metric"]["status"] == "total": querynode_id = res["metric"]["node_id"] # pod = res["metric"]["pod"] value = res["value"][-1] milvus_querynode_sq_req_count[int(querynode_id)] = int(value) # log.debug(milvus_querynode_sq_req_count) return milvus_querynode_sq_req_count else: raise Exception(-1, f"Failed to get metrics with status code {response.status_code}") def get_svc_ip(namespace, label_selector): """ get svc ip from svc list """ init_k8s_client_config() api_instance = client.CoreV1Api() try: api_response = api_instance.list_namespaced_service(namespace=namespace, label_selector=label_selector) except ApiException as e: log.error("Exception when calling CoreV1Api->list_namespaced_service: %s\n" % e) raise Exception(str(e)) svc_ip = api_response.items[0].spec.cluster_ip return svc_ip def parse_etcdctl_table_output(output): """ parse etcdctl table output """ output = output.split("\n") title = [] data = [] for line in output: if "ENDPOINT" in line: title = [x.strip(" ") for x in line.strip("|").split("|")] if ":" in line: data.append([x.strip(" ") for x in line.strip("|").split("|")]) return title, data def get_etcd_leader(release_name, deploy_tool="helm"): """ get etcd leader by etcdctl """ pod_list = [] if deploy_tool == "helm": label_selector = f"app.kubernetes.io/instance={release_name}-etcd, app.kubernetes.io/name=etcd" pod_list = get_pod_list("chaos-testing", label_selector) if len(pod_list) == 0: label_selector = f"app.kubernetes.io/instance={release_name}, app.kubernetes.io/name=etcd" pod_list = get_pod_list("chaos-testing", label_selector) if deploy_tool == "operator": label_selector = f"app.kubernetes.io/instance={release_name}, app.kubernetes.io/name=etcd" pod_list = get_pod_list("chaos-testing", label_selector) leader = None for pod in pod_list: endpoint = f"{pod.status.pod_ip}:2379" cmd = f"etcdctl --endpoints={endpoint} endpoint status -w table" output = os.popen(cmd).read() log.info(f"etcdctl output: {output}") title, data = parse_etcdctl_table_output(output) idx = title.index("IS LEADER") if data[0][idx] == "true": leader = pod.metadata.name log.info(f"etcd leader is {leader}") return leader def get_etcd_followers(release_name, deploy_tool="helm"): """ get etcd follower by etcdctl """ pod_list = [] if deploy_tool == "helm": label_selector = f"app.kubernetes.io/instance={release_name}-etcd, app.kubernetes.io/name=etcd" pod_list = get_pod_list("chaos-testing", label_selector) if len(pod_list) == 0: label_selector = f"app.kubernetes.io/instance={release_name}, app.kubernetes.io/name=etcd" pod_list = get_pod_list("chaos-testing", label_selector) if deploy_tool == "operator": label_selector = f"app.kubernetes.io/instance={release_name}, app.kubernetes.io/name=etcd" pod_list = get_pod_list("chaos-testing", label_selector) followers = [] for pod in pod_list: endpoint = f"{pod.status.pod_ip}:2379" cmd = f"etcdctl --endpoints={endpoint} endpoint status -w table" output = os.popen(cmd).read() log.info(f"etcdctl output: {output}") title, data = parse_etcdctl_table_output(output) idx = title.index("IS LEADER") if data[0][idx] == "false": followers.append(pod.metadata.name) log.info(f"etcd followers are {followers}") return followers def find_activate_standby_coord_pod(namespace, release_name, coord_type): init_k8s_client_config() api_instance = client.CoreV1Api() etcd_service_name = release_name + "-etcd" service = api_instance.read_namespaced_service(name=etcd_service_name, namespace=namespace) etcd_cluster_ip = service.spec.cluster_ip etcd_port = service.spec.ports[0].port etcd = pyetcd.client(host=etcd_cluster_ip, port=etcd_port) v = etcd.get(f'by-dev/meta/session/{coord_type}') log.info(f"coord_type: {coord_type}, etcd session value: {v}") activated_pod_ip = json.loads(v[0])["Address"].split(":")[0] label_selector = f'app.kubernetes.io/instance={release_name}, component={coord_type}' items = get_pod_list(namespace, label_selector=label_selector) all_pod_list = [] for item in items: pod_name = item.metadata.name all_pod_list.append(pod_name) activate_pod_list = [] standby_pod_list = [] for item in items: pod_name = item.metadata.name ip = item.status.pod_ip if ip == activated_pod_ip: activate_pod_list.append(pod_name) standby_pod_list = list(set(all_pod_list) - set(activate_pod_list)) return activate_pod_list, standby_pod_list def record_time_when_standby_activated(namespace, release_name, coord_type, timeout=360): activate_pod_list_before, standby_pod_list_before = find_activate_standby_coord_pod(namespace, release_name, coord_type) log.info(f"check standby switch: activate_pod_list_before {activate_pod_list_before}, " f"standby_pod_list_before {standby_pod_list_before}") standby_activated = False activate_pod_list_after, standby_pod_list_after = find_activate_standby_coord_pod(namespace, release_name, coord_type) start_time = time.time() end_time = time.time() while not standby_activated and end_time - start_time < timeout: try: activate_pod_list_after, standby_pod_list_after = find_activate_standby_coord_pod(namespace, release_name, coord_type) if activate_pod_list_after[0] in standby_pod_list_before: standby_activated = True log.info(f"Standby {coord_type} pod {activate_pod_list_after[0]} activated") log.info(f"check standby switch: activate_pod_list_after {activate_pod_list_after}, " f"standby_pod_list_after {standby_pod_list_after}") break except Exception as e: log.error(f"Exception when check standby switch: {e}") time.sleep(1) end_time = time.time() if standby_activated: log.info(f"Standby {coord_type} pod {activate_pod_list_after[0]} activated") else: log.info(f"Standby {coord_type} pod does not switch standby mode") if __name__ == '__main__': label = "app.kubernetes.io/name=milvus, component=querynode" instance_name = get_milvus_instance_name("chaos-testing", "10.96.250.111") res = get_pod_list("chaos-testing", label_selector=label) m = get_pod_ip_name_pairs("chaos-testing", label_selector=label) export_pod_logs(namespace='chaos-testing', label_selector=label) ================================================ FILE: tests/utils/util_log.py ================================================ import logging import sys from config.log_config import log_config class TestLog: def __init__(self, logger, log_debug, log_file, log_err, log_worker): self.logger = logger self.log_debug = log_debug self.log_file = log_file self.log_err = log_err self.log_worker = log_worker self.log = logging.getLogger(self.logger) self.log.setLevel(logging.DEBUG) try: formatter = logging.Formatter("[%(asctime)s - %(levelname)s - %(name)s]: " "%(message)s (%(filename)s:%(lineno)s)") # [%(process)s] process NO. dh = logging.FileHandler(self.log_debug) dh.setLevel(logging.DEBUG) dh.setFormatter(formatter) self.log.addHandler(dh) fh = logging.FileHandler(self.log_file) fh.setLevel(logging.INFO) fh.setFormatter(formatter) self.log.addHandler(fh) eh = logging.FileHandler(self.log_err) eh.setLevel(logging.ERROR) eh.setFormatter(formatter) self.log.addHandler(eh) if self.log_worker != "": wh = logging.FileHandler(self.log_worker) wh.setLevel(logging.DEBUG) wh.setFormatter(formatter) self.log.addHandler(wh) ch = logging.StreamHandler(sys.stdout) ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) # self.log.addHandler(ch) except Exception as e: print("Can not use %s or %s or %s to log. error : %s" % (log_debug, log_file, log_err, str(e))) """All modules share this unified log""" log_debug = log_config.log_debug log_info = log_config.log_info log_err = log_config.log_err log_worker = log_config.log_worker test_log = TestLog('ci_test', log_debug, log_info, log_err, log_worker).log ================================================ FILE: tests/utils/util_pymilvus.py ================================================ import json import random import string import threading import traceback import time import copy import numpy as np import requests from sklearn import preprocessing from pymilvus import Milvus, DataType from utils.util_log import test_log as log from utils.util_k8s import init_k8s_client_config port = 19530 epsilon = 0.000001 namespace = "milvus" default_flush_interval = 1 big_flush_interval = 1000 default_drop_interval = 3 default_dim = 128 default_nb = 3000 default_top_k = 10 max_top_k = 16384 max_partition_num = 4096 default_segment_row_limit = 1000 default_server_segment_row_limit = 1024 * 512 default_float_vec_field_name = "float_vector" default_binary_vec_field_name = "binary_vector" default_partition_name = "_default" default_tag = "1970_01_01" row_count = "row_count" # TODO: all_index_types = [ "FLAT", "IVF_FLAT", "IVF_SQ8", "IVF_PQ", "HNSW", "BIN_FLAT", "BIN_IVF_FLAT" ] default_index_params = [ {"nlist": 128}, {"nlist": 128}, {"nlist": 128}, {"nlist": 128, "m": 16, "nbits": 8}, {"M": 48, "efConstruction": 500}, {"nlist": 128}, {"nlist": 128} ] def create_target_index(index, field_name): index["field_name"] = field_name def binary_support(): return ["BIN_FLAT", "BIN_IVF_FLAT"] def binary_metrics(): return ["JACCARD", "HAMMING", "SUBSTRUCTURE", "SUPERSTRUCTURE"] def structure_metrics(): return ["SUBSTRUCTURE", "SUPERSTRUCTURE"] def l2(x, y): return np.linalg.norm(np.array(x) - np.array(y)) def ip(x, y): return np.inner(np.array(x), np.array(y)) def jaccard(x, y): x = np.asarray(x, np.bool) y = np.asarray(y, np.bool) return 1 - np.double(np.bitwise_and(x, y).sum()) / np.double(np.bitwise_or(x, y).sum()) def hamming(x, y): x = np.asarray(x, np.bool) y = np.asarray(y, np.bool) return np.bitwise_xor(x, y).sum() def tanimoto(x, y): x = np.asarray(x, np.bool) y = np.asarray(y, np.bool) return -np.log2(np.double(np.bitwise_and(x, y).sum()) / np.double(np.bitwise_or(x, y).sum())) def substructure(x, y): x = np.asarray(x, np.bool) y = np.asarray(y, np.bool) return 1 - np.double(np.bitwise_and(x, y).sum()) / np.count_nonzero(y) def superstructure(x, y): x = np.asarray(x, np.bool) y = np.asarray(y, np.bool) return 1 - np.double(np.bitwise_and(x, y).sum()) / np.count_nonzero(x) def get_milvus(host, port, uri=None, handler=None, **kwargs): if handler is None: handler = "GRPC" try_connect = kwargs.get("try_connect", True) if uri is not None: milvus = Milvus(uri=uri, handler=handler, try_connect=try_connect) else: milvus = Milvus(host=host, port=port, handler=handler, try_connect=try_connect) return milvus def reset_build_index_threshold(connect): connect.set_config("engine", "build_index_threshold", 1024) def disable_flush(connect): connect.set_config("storage", "auto_flush_interval", big_flush_interval) def enable_flush(connect): # reset auto_flush_interval=1 connect.set_config("storage", "auto_flush_interval", default_flush_interval) config_value = connect.get_config("storage", "auto_flush_interval") assert config_value == str(default_flush_interval) def gen_inaccuracy(num): return num / 255.0 def gen_vectors(num, dim, is_normal=True): vectors = [[random.random() for _ in range(dim)] for _ in range(num)] vectors = preprocessing.normalize(vectors, axis=1, norm='l2') return vectors.tolist() # def gen_vectors(num, dim, seed=np.random.RandomState(1234), is_normal=False): # xb = seed.rand(num, dim).astype("float32") # xb = preprocessing.normalize(xb, axis=1, norm='l2') # return xb.tolist() def gen_binary_vectors(num, dim): raw_vectors = [] binary_vectors = [] for i in range(num): raw_vector = [random.randint(0, 1) for i in range(dim)] raw_vectors.append(raw_vector) binary_vectors.append(bytes(np.packbits(raw_vector, axis=-1).tolist())) return raw_vectors, binary_vectors def gen_binary_sub_vectors(vectors, length): raw_vectors = [] binary_vectors = [] dim = len(vectors[0]) for i in range(length): raw_vector = [0 for i in range(dim)] vector = vectors[i] for index, j in enumerate(vector): if j == 1: raw_vector[index] = 1 raw_vectors.append(raw_vector) binary_vectors.append(bytes(np.packbits(raw_vector, axis=-1).tolist())) return raw_vectors, binary_vectors def gen_binary_super_vectors(vectors, length): raw_vectors = [] binary_vectors = [] dim = len(vectors[0]) for i in range(length): cnt_1 = np.count_nonzero(vectors[i]) # raw_vector = [0 for i in range(dim)] ??? raw_vector = [1 for i in range(dim)] raw_vectors.append(raw_vector) binary_vectors.append(bytes(np.packbits(raw_vector, axis=-1).tolist())) return raw_vectors, binary_vectors def gen_int_attr(row_num): return [random.randint(0, 255) for _ in range(row_num)] def gen_float_attr(row_num): return [random.uniform(0, 255) for _ in range(row_num)] def gen_unique_str(str_value=None): prefix = "".join(random.choice(string.ascii_letters + string.digits) for _ in range(8)) return "test_" + prefix if str_value is None else str_value + "_" + prefix def gen_primary_field(): return {"name": gen_unique_str(), "type": DataType.INT64, "is_primary": True} def gen_single_filter_fields(): fields = [] for data_type in DataType: if data_type in [DataType.INT32, DataType.INT64, DataType.FLOAT, DataType.DOUBLE]: fields.append({"name": data_type.name, "type": data_type}) return fields def gen_single_vector_fields(): fields = [] for data_type in [DataType.FLOAT_VECTOR, DataType.BINARY_VECTOR]: field = {"name": data_type.name, "type": data_type, "params": {"dim": default_dim}} fields.append(field) return fields def gen_default_fields(auto_id=True): default_fields = { "fields": [ {"name": "int64", "type": DataType.INT64, "is_primary": True}, {"name": "float", "type": DataType.FLOAT}, {"name": default_float_vec_field_name, "type": DataType.FLOAT_VECTOR, "params": {"dim": default_dim}}, ], "segment_row_limit": default_segment_row_limit, } return default_fields def gen_binary_default_fields(auto_id=True): default_fields = { "fields": [ {"name": "int64", "type": DataType.INT64, "is_primary": True}, {"name": "float", "type": DataType.FLOAT}, {"name": default_binary_vec_field_name, "type": DataType.BINARY_VECTOR, "params": {"dim": default_dim}} ], "segment_row_limit": default_segment_row_limit, "auto_id": auto_id } return default_fields def gen_entities(nb, start=0, is_normal=False): vectors = gen_vectors(nb, default_dim, is_normal) entities = [ {"name": "int64", "type": DataType.INT64, "values": [i for i in range(start, nb+start)]}, {"name": "float", "type": DataType.FLOAT, "values": [float(i) for i in range(nb)]}, {"name": default_float_vec_field_name, "type": DataType.FLOAT_VECTOR, "values": vectors} ] return entities def gen_entities_new(nb, is_normal=False): vectors = gen_vectors(nb, default_dim, is_normal) entities = [ {"name": "int64", "values": [i for i in range(nb)]}, {"name": "float", "values": [float(i) for i in range(nb)]}, {"name": default_float_vec_field_name, "values": vectors} ] return entities def gen_entities_rows(nb, is_normal=False, _id=True): vectors = gen_vectors(nb, default_dim, is_normal) entities = [] if not _id: for i in range(nb): entity = { "_id": i, "int64": i, "float": float(i), default_float_vec_field_name: vectors[i] } entities.append(entity) else: for i in range(nb): entity = { "int64": i, "float": float(i), default_float_vec_field_name: vectors[i] } entities.append(entity) return entities def gen_binary_entities(nb): raw_vectors, vectors = gen_binary_vectors(nb, default_dim) entities = [ {"name": "int64", "type": DataType.INT64, "values": [i for i in range(nb)]}, {"name": "float", "type": DataType.FLOAT, "values": [float(i) for i in range(nb)]}, {"name": default_binary_vec_field_name, "type": DataType.BINARY_VECTOR, "values": vectors} ] return raw_vectors, entities def gen_binary_entities_new(nb): raw_vectors, vectors = gen_binary_vectors(nb, default_dim) entities = [ {"name": "int64", "values": [i for i in range(nb)]}, {"name": "float", "values": [float(i) for i in range(nb)]}, {"name": default_binary_vec_field_name, "values": vectors} ] return raw_vectors, entities def gen_binary_entities_rows(nb, _id=True): raw_vectors, vectors = gen_binary_vectors(nb, default_dim) entities = [] if not _id: for i in range(nb): entity = { "_id": i, "int64": i, "float": float(i), default_binary_vec_field_name: vectors[i] } entities.append(entity) else: for i in range(nb): entity = { "int64": i, "float": float(i), default_binary_vec_field_name: vectors[i] } entities.append(entity) return raw_vectors, entities def gen_entities_by_fields(fields, nb, dim, ids=None): entities = [] for field in fields: if field.get("is_primary", False) and ids: field_value = ids elif field["type"] in [DataType.INT32, DataType.INT64]: field_value = [1 for i in range(nb)] elif field["type"] in [DataType.FLOAT, DataType.DOUBLE]: field_value = [3.0 for i in range(nb)] elif field["type"] == DataType.BINARY_VECTOR: field_value = gen_binary_vectors(nb, dim)[1] elif field["type"] == DataType.FLOAT_VECTOR: field_value = gen_vectors(nb, dim) field.update({"values": field_value}) entities.append(field) return entities def assert_equal_entity(a, b): pass def gen_search_vectors_params(field_name, entities, top_k, nq, search_params={"nprobe": 10}, rand_vector=False, metric_type="L2", replace_vecs=None): if rand_vector is True: dimension = len(entities[-1]["values"][0]) query_vectors = gen_vectors(nq, dimension) else: query_vectors = entities[-1]["values"][:nq] if replace_vecs: query_vectors = replace_vecs search_params["metric_type"] = metric_type _params = { "data": query_vectors, "anns_field": field_name, "param": copy.deepcopy(search_params), "limit": top_k, } return _params, query_vectors def update_query_expr(src_query, keep_old=True, expr=None): tmp_query = copy.deepcopy(src_query) if expr is not None: tmp_query["bool"].update(expr) if keep_old is not True: tmp_query["bool"].pop("must") return tmp_query def gen_default_vector_expr(default_query): return default_query["bool"]["must"][0] def gen_default_term_expr(keyword="term", field="int64", values=None): if values is None: values = [i for i in range(default_nb // 2)] expr = {keyword: {field: {"values": values}}} return expr def update_term_expr(src_term, terms): tmp_term = copy.deepcopy(src_term) for term in terms: tmp_term["term"].update(term) return tmp_term def gen_default_range_expr(keyword="range", field="int64", ranges=None): if ranges is None: ranges = {"GT": 1, "LT": default_nb // 2} expr = {keyword: {field: ranges}} return expr def update_range_expr(src_range, ranges): tmp_range = copy.deepcopy(src_range) for range in ranges: tmp_range["range"].update(range) return tmp_range def gen_invalid_range(): range = [ {"range": 1}, {"range": {}}, {"range": []}, {"range": {"range": {"int64": {"GT": 0, "LT": default_nb // 2}}}} ] return range def gen_valid_ranges(): ranges = [ {"GT": 0, "LT": default_nb // 2}, {"GT": default_nb // 2, "LT": default_nb * 2}, {"GT": 0}, {"LT": default_nb}, {"GT": -1, "LT": default_top_k}, ] return ranges def gen_invalid_term(): terms = [ {"term": 1}, {"term": []}, {"term": {}}, {"term": {"term": {"int64": {"values": [i for i in range(default_nb // 2)]}}}} ] return terms def add_field_default(default_fields, type=DataType.INT64, field_name=None): tmp_fields = copy.deepcopy(default_fields) if field_name is None: field_name = gen_unique_str() field = { "name": field_name, "type": type } tmp_fields["fields"].append(field) return tmp_fields def add_field(entities, field_name=None): nb = len(entities[0]["values"]) tmp_entities = copy.deepcopy(entities) if field_name is None: field_name = gen_unique_str() field = { "name": field_name, "type": DataType.INT64, "values": [i for i in range(nb)] } tmp_entities.append(field) return tmp_entities def add_vector_field(entities, is_normal=False): nb = len(entities[0]["values"]) vectors = gen_vectors(nb, default_dim, is_normal) field = { "name": gen_unique_str(), "type": DataType.FLOAT_VECTOR, "values": vectors } entities.append(field) return entities # def update_fields_metric_type(fields, metric_type): # tmp_fields = copy.deepcopy(fields) # if metric_type in ["L2", "IP"]: # tmp_fields["fields"][-1]["type"] = DataType.FLOAT_VECTOR # else: # tmp_fields["fields"][-1]["type"] = DataType.BINARY_VECTOR # tmp_fields["fields"][-1]["params"]["metric_type"] = metric_type # return tmp_fields def remove_field(entities): del entities[0] return entities def remove_vector_field(entities): del entities[-1] return entities def update_field_name(entities, old_name, new_name): tmp_entities = copy.deepcopy(entities) for item in tmp_entities: if item["name"] == old_name: item["name"] = new_name return tmp_entities def update_field_type(entities, old_name, new_name): tmp_entities = copy.deepcopy(entities) for item in tmp_entities: if item["name"] == old_name: item["type"] = new_name return tmp_entities def update_field_value(entities, old_type, new_value): tmp_entities = copy.deepcopy(entities) for item in tmp_entities: if item["type"] == old_type: for index, value in enumerate(item["values"]): item["values"][index] = new_value return tmp_entities def update_field_name_row(entities, old_name, new_name): tmp_entities = copy.deepcopy(entities) for item in tmp_entities: if old_name in item: item[new_name] = item[old_name] item.pop(old_name) else: raise Exception("Field %s not in field" % old_name) return tmp_entities def update_field_type_row(entities, old_name, new_name): tmp_entities = copy.deepcopy(entities) for item in tmp_entities: if old_name in item: item["type"] = new_name return tmp_entities def add_vector_field(nb, dimension=default_dim): field_name = gen_unique_str() field = { "name": field_name, "type": DataType.FLOAT_VECTOR, "values": gen_vectors(nb, dimension) } return field_name def gen_segment_row_limits(): sizes = [ 1024, 4096 ] return sizes def gen_invalid_ips(): ips = [ # "255.0.0.0", # "255.255.0.0", # "255.255.255.0", # "255.255.255.255", "127.0.0", # "123.0.0.2", "12-s", " ", "12 s", "BB。A", " siede ", "(mn)", "中文", "a".join("a" for _ in range(256)) ] return ips def gen_invalid_uris(): ip = None uris = [ " ", "中文", # invalid protocol # "tc://%s:%s" % (ip, port), # "tcp%s:%s" % (ip, port), # # invalid port # "tcp://%s:100000" % ip, # "tcp://%s: " % ip, # "tcp://%s:19540" % ip, # "tcp://%s:-1" % ip, # "tcp://%s:string" % ip, # invalid ip "tcp:// :19530", # "tcp://123.0.0.1:%s" % port, "tcp://127.0.0:19530", # "tcp://255.0.0.0:%s" % port, # "tcp://255.255.0.0:%s" % port, # "tcp://255.255.255.0:%s" % port, # "tcp://255.255.255.255:%s" % port, "tcp://\n:19530", ] return uris def gen_invalid_strs(): strings = [ 1, [1], None, "12-s", # " ", # "", # None, "12 s", "(mn)", "中文", "a".join("a" for i in range(256)) ] return strings def gen_invalid_field_types(): field_types = [ # 1, "=c", # 0, None, "", "a".join("a" for i in range(256)) ] return field_types def gen_invalid_metric_types(): metric_types = [ 1, "=c", 0, None, "", "a".join("a" for i in range(256)) ] return metric_types # TODO: def gen_invalid_ints(): int_values = [ # 1.0, None, [1, 2, 3], " ", "", -1, "String", "=c", "中文", "a".join("a" for i in range(256)) ] return int_values def gen_invalid_params(): params = [ 9999999999, -1, # None, [1, 2, 3], " ", "", "String", "中文" ] return params def gen_invalid_vectors(): invalid_vectors = [ "1*2", [], [1], [1, 2], [" "], ['a'], [None], None, (1, 2), {"a": 1}, " ", "", "String", " siede ", "中文", "a".join("a" for i in range(256)) ] return invalid_vectors def gen_invalid_index(): index_params = [] for index_type in gen_invalid_strs(): index_param = {"index_type": index_type, "params": {"nlist": 1024}} index_params.append(index_param) for nlist in gen_invalid_params(): index_param = {"index_type": "IVF_FLAT", "params": {"nlist": nlist}} index_params.append(index_param) for M in gen_invalid_params(): index_param = {"index_type": "HNSW", "params": {"M": M, "efConstruction": 100}} index_params.append(index_param) for efConstruction in gen_invalid_params(): index_param = {"index_type": "HNSW", "params": {"M": 16, "efConstruction": efConstruction}} index_params.append(index_param) index_params.append({"index_type": "IVF_FLAT", "params": {"invalid_key": 1024}}) index_params.append({"index_type": "HNSW", "params": {"invalid_key": 16, "efConstruction": 100}}) for invalid_n_trees in gen_invalid_params(): index_params.append({"index_type": "ANNOY", "params": {"n_trees": invalid_n_trees}}) return index_params def gen_index(): nlists = [1, 1024, 16384] pq_ms = [128, 64, 32, 16, 8, 4] Ms = [5, 24, 48] efConstructions = [100, 300, 500] index_params = [] for index_type in all_index_types: if index_type in ["FLAT", "BIN_FLAT", "BIN_IVF_FLAT"]: index_params.append({"index_type": index_type, "index_param": {"nlist": 1024}}) elif index_type in ["IVF_FLAT", "IVF_SQ8"]: ivf_params = [{"index_type": index_type, "index_param": {"nlist": nlist}} \ for nlist in nlists] index_params.extend(ivf_params) elif index_type == "IVF_PQ": IVFPQ_params = [{"index_type": index_type, "index_param": {"nlist": nlist, "m": m}} \ for nlist in nlists \ for m in pq_ms] index_params.extend(IVFPQ_params) elif index_type in ["HNSW"]: hnsw_params = [{"index_type": index_type, "index_param": {"M": M, "efConstruction": efConstruction}} \ for M in Ms \ for efConstruction in efConstructions] index_params.extend(hnsw_params) return index_params def gen_simple_index(): index_params = [] for i in range(len(all_index_types)): if all_index_types[i] in binary_support(): continue dic = {"index_type": all_index_types[i], "metric_type": "L2"} dic.update({"params": default_index_params[i]}) index_params.append(dic) return index_params def gen_binary_index(): index_params = [] for i in range(len(all_index_types)): if all_index_types[i] in binary_support(): dic = {"index_type": all_index_types[i]} dic.update({"params": default_index_params[i]}) index_params.append(dic) return index_params def gen_normal_expressions(): expressions = [ "int64 > 0", "int64 > 0 && int64 < 2021", # range "int64 == 0 || int64 == 1 || int64 == 2 || int64 == 3", # term ] return expressions def assert_equal_vector(v1, v2): if len(v1) != len(v2): assert False for i in range(len(v1)): assert abs(v1[i] - v2[i]) < epsilon def restart_server(helm_release_name): res = True timeout = 120 from kubernetes import client, config client.rest.logger.setLevel(log.WARNING) # service_name = "%s.%s.svc.cluster.local" % (helm_release_name, namespace) init_k8s_client_config() v1 = client.CoreV1Api() pod_name = None # config_map_names = v1.list_namespaced_config_map(namespace, pretty='true') # body = {"replicas": 0} pods = v1.list_namespaced_pod(namespace) for i in pods.items: if i.metadata.name.find(helm_release_name) != -1: pod_name = i.metadata.name break # v1.patch_namespaced_config_map(config_map_name, namespace, body, pretty='true') # status_res = v1.read_namespaced_service_status(helm_release_name, namespace, pretty='true') log.debug("Pod name: %s" % pod_name) if pod_name is not None: try: v1.delete_namespaced_pod(pod_name, namespace) except Exception as e: log.error(str(e)) log.error("Exception when calling CoreV1Api->delete_namespaced_pod") res = False return res log.error("Sleep 10s after pod deleted") time.sleep(10) # check if restart successfully pods = v1.list_namespaced_pod(namespace) for i in pods.items: pod_name_tmp = i.metadata.name log.error(pod_name_tmp) if pod_name_tmp == pod_name: continue elif pod_name_tmp.find(helm_release_name) == -1: continue else: status_res = v1.read_namespaced_pod_status(pod_name_tmp, namespace, pretty='true') log.error(status_res.status.phase) start_time = time.time() ready_break = False while time.time() - start_time <= timeout: log.error(time.time()) status_res = v1.read_namespaced_pod_status(pod_name_tmp, namespace, pretty='true') if status_res.status.phase == "Running": log.error("Already running") ready_break = True time.sleep(10) break else: time.sleep(1) if time.time() - start_time > timeout: log.error("Restart pod: %s timeout" % pod_name_tmp) res = False return res if ready_break: break else: raise Exception("Pod: %s not found" % pod_name) follow = True pretty = True previous = True # bool | Return previous terminated container logs. Defaults to false. (optional) since_seconds = 56 # int | A relative time in seconds before the current time from which to show logs. If this value precedes the time a pod was started, only logs since the pod start will be returned. If this value is in the future, no logs will be returned. Only one of sinceSeconds or sinceTime may be specified. (optional) timestamps = True # bool | If true, add an RFC3339 or RFC3339Nano timestamp at the beginning of every line of log output. Defaults to false. (optional) container = "milvus" # start_time = time.time() # while time.time() - start_time <= timeout: # try: # api_response = v1.read_namespaced_pod_log(pod_name_tmp, namespace, container=container, follow=follow, # pretty=pretty, previous=previous, since_seconds=since_seconds, # timestamps=timestamps) # log.error(api_response) # return res # except Exception as e: # log.error("Exception when calling CoreV1Api->read_namespaced_pod_log: %s\n" % e) # # waiting for server start # time.sleep(5) # # res = False # # return res # if time.time() - start_time > timeout: # log.error("Restart pod: %s timeout" % pod_name_tmp) # res = False return res def compare_list_elements(_first, _second): if not isinstance(_first, list) or not isinstance(_second, list) or len(_first) != len(_second): return False for ele in _first: if ele not in _second: return False return True def get_token(url): rep = requests.get(url) data = json.loads(rep.text) if 'token' in data: token = data['token'] else: token = '' print("Can not get token.") return token def get_tags(url, token): headers = {'Content-type': "application/json", "charset": "UTF-8", "Accept": "application/vnd.docker.distribution.manifest.v2+json", "Authorization": "Bearer %s" % token} try: rep = requests.get(url, headers=headers) data = json.loads(rep.text) tags = [] if 'tags' in data: tags = data["tags"] else: print("Can not get the tag list") return tags except: print("Can not get the tag list") return [] def get_master_tags(tags_list, tag_prefix="master", tag_latest="master-latest"): _list = [] if not isinstance(tags_list, list): print("tags_list is not a list.") return _list for tag in tags_list: if tag_prefix in tag and tag != tag_latest: _list.append(tag) return _list def get_config_digest(url, token): headers = {'Content-type': "application/json", "charset": "UTF-8", "Accept": "application/vnd.docker.distribution.manifest.v2+json", "Authorization": "Bearer %s" % token} try: rep = requests.get(url, headers=headers) data = json.loads(rep.text) digest = '' if 'config' in data and 'digest' in data["config"]: digest = data["config"]["digest"] else: print("Can not get the digest") return digest except: print("Can not get the digest") return "" def get_latest_tag(limit=100, tag_prefix="master", tag_latest="master-latest"): service = "registry.docker.io" repository = "milvusdb/milvus" auth_url = "https://auth.docker.io/token?service=%s&scope=repository:%s:pull" % (service, repository) tags_url = "https://index.docker.io/v2/%s/tags/list" % repository tag_url = "https://index.docker.io/v2/milvusdb/milvus/manifests/" master_latest_digest = get_config_digest(tag_url + tag_latest, get_token(auth_url)) tags = get_tags(tags_url, get_token(auth_url)) tag_list = get_master_tags(tags, tag_prefix=tag_prefix, tag_latest=tag_latest) latest_tag = "" for i in range(1, len(tag_list) + 1): tag_name = str(tag_list[-i]) tag_digest = get_config_digest(tag_url + tag_name, get_token(auth_url)) if tag_digest == master_latest_digest: latest_tag = tag_name break if i > limit: break if latest_tag == "": latest_tag = tag_latest print("Can't find the latest image name") print("The image name used is %s" % str(latest_tag)) return latest_tag class MyThread(threading.Thread): def __init__(self, target, args=()): threading.Thread.__init__(self, target=target, args=args) def run(self): self.exc = None try: super(MyThread, self).run() except BaseException as e: self.exc = e log.error(traceback.format_exc()) def join(self): super(MyThread, self).join() if self.exc: raise self.exc ================================================ FILE: tests/utils/wrapper.py ================================================ import time from datetime import datetime import functools from utils.util_log import test_log as log DEFAULT_FMT = '[{start_time}] [{elapsed:0.8f}s] {collection_name} {func_name} -> {res!r}' def trace(fmt=DEFAULT_FMT, prefix='test', flag=True): def decorate(func): @functools.wraps(func) def inner_wrapper(*args, **kwargs): # args[0] is an instance of ApiCollectionWrapper class flag = args[0].active_trace if flag: start_time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ') t0 = time.perf_counter() res, result = func(*args, **kwargs) elapsed = time.perf_counter() - t0 end_time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ') func_name = func.__name__ collection_name = args[0].collection.name # arg_lst = [repr(arg) for arg in args[1:]][:100] # arg_lst.extend(f'{k}={v!r}' for k, v in kwargs.items()) # arg_str = ', '.join(arg_lst)[:200] log_str = f"[{prefix}]" + fmt.format(**locals()) # TODO: add report function in this place, like uploading to influxdb # it is better a async way to do this, in case of blocking the request processing log.info(log_str) return res, result else: res, result = func(*args, **kwargs) return res, result return inner_wrapper return decorate def counter(func): """ count func succ rate """ def inner_wrapper(*args, **kwargs): """ inner wrapper """ result, is_succ = func(*args, **kwargs) inner_wrapper.total += 1 if is_succ: inner_wrapper.succ += 1 else: inner_wrapper.fail += 1 return result, is_succ inner_wrapper.name = func.__name__ inner_wrapper.total = 0 inner_wrapper.succ = 0 inner_wrapper.fail = 0 return inner_wrapper if __name__ == '__main__': @trace() def snooze(seconds, name='snooze'): time.sleep(seconds) return name # print(f"name: {name}") for i in range(3): res = snooze(.123, name=i) print("res:", res) ================================================ FILE: thirdparty/knowhere-android.patch ================================================ diff --git a/CMakeLists.txt b/CMakeLists.txt index bd495fcd..a46918b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -97,7 +97,7 @@ find_package(nlohmann_json REQUIRED) find_package(glog REQUIRED) find_package(prometheus-cpp REQUIRED) find_package(fmt REQUIRED) -find_package(opentelemetry-cpp REQUIRED) +# find_package(opentelemetry-cpp REQUIRED) set(CMAKE_CXX_STANDARD 17) set(CMAKE_OSX_DEPLOYMENT_TARGET @@ -171,17 +171,17 @@ if(NOT WITH_LIGHT) endif() list(APPEND KNOWHERE_LINKER_LIBS fmt::fmt-header-only) list(APPEND KNOWHERE_LINKER_LIBS Folly::folly) -if(NOT WITH_LIGHT) - list(APPEND KNOWHERE_LINKER_LIBS opentelemetry-cpp::opentelemetry_trace) - list(APPEND KNOWHERE_LINKER_LIBS - opentelemetry-cpp::opentelemetry_exporter_ostream_span) - list(APPEND KNOWHERE_LINKER_LIBS - opentelemetry-cpp::opentelemetry_exporter_jaeger_trace) - list(APPEND KNOWHERE_LINKER_LIBS - opentelemetry-cpp::opentelemetry_exporter_otlp_grpc) - list(APPEND KNOWHERE_LINKER_LIBS - opentelemetry-cpp::opentelemetry_exporter_otlp_http) -endif() +# if(NOT WITH_LIGHT) +# list(APPEND KNOWHERE_LINKER_LIBS opentelemetry-cpp::opentelemetry_trace) +# list(APPEND KNOWHERE_LINKER_LIBS +# opentelemetry-cpp::opentelemetry_exporter_ostream_span) +# list(APPEND KNOWHERE_LINKER_LIBS +# opentelemetry-cpp::opentelemetry_exporter_jaeger_trace) +# list(APPEND KNOWHERE_LINKER_LIBS +# opentelemetry-cpp::opentelemetry_exporter_otlp_grpc) +# list(APPEND KNOWHERE_LINKER_LIBS +# opentelemetry-cpp::opentelemetry_exporter_otlp_http) +# endif() add_library(knowhere SHARED ${KNOWHERE_SRCS}) add_dependencies(knowhere ${KNOWHERE_LINKER_LIBS}) diff --git a/cmake/libs/libfaiss.cmake b/cmake/libs/libfaiss.cmake index 8b77c606..9873a72a 100644 --- a/cmake/libs/libfaiss.cmake +++ b/cmake/libs/libfaiss.cmake @@ -67,9 +67,8 @@ if(APPLE) set(BLA_VENDOR Apple) endif() -find_package(BLAS REQUIRED) +find_package(OpenBLAS REQUIRED) -find_package(LAPACK REQUIRED) if(__X86_64) list(REMOVE_ITEM FAISS_SRCS ${FAISS_AVX2_SRCS}) @@ -127,7 +126,7 @@ if(__AARCH64) -Wno-strict-aliasing>) add_dependencies(faiss knowhere_utils) - target_link_libraries(faiss PUBLIC OpenMP::OpenMP_CXX ${BLAS_LIBRARIES} + target_link_libraries(faiss PUBLIC OpenMP::OpenMP_CXX OpenBLAS::OpenBLAS ${LAPACK_LIBRARIES} knowhere_utils) target_compile_definitions(faiss PRIVATE FINTEGER=int) endif() diff --git a/cmake/utils/platform_check.cmake b/cmake/utils/platform_check.cmake index afc41d07..21119186 100644 --- a/cmake/utils/platform_check.cmake +++ b/cmake/utils/platform_check.cmake @@ -1,9 +1,10 @@ include(CheckSymbolExists) macro(detect_target_arch) - check_symbol_exists(__aarch64__ "" __AARCH64) - check_symbol_exists(__x86_64__ "" __X86_64) - check_symbol_exists(__powerpc64__ "" __PPC64) + #check_symbol_exists(__aarch64__ "" __AARCH64) + #check_symbol_exists(__x86_64__ "" __X86_64) + #check_symbol_exists(__powerpc64__ "" __PPC64) + set(__AARCH64 1) if(NOT __AARCH64 AND NOT __X86_64 diff --git a/include/knowhere/comp/thread_pool.h b/include/knowhere/comp/thread_pool.h index b39bde99..6fd699f0 100644 --- a/include/knowhere/comp/thread_pool.h +++ b/include/knowhere/comp/thread_pool.h @@ -223,7 +223,7 @@ class ThreadPool { static std::shared_ptr GetGlobalSearchThreadPool() { if (search_pool_ == nullptr) { - InitGlobalSearchThreadPool(std::thread::hardware_concurrency()); + InitGlobalSearchThreadPool(4); } return search_pool_; } diff --git a/include/knowhere/tracer.h b/include/knowhere/tracer.h index 11d5681b..4065bb13 100644 --- a/include/knowhere/tracer.h +++ b/include/knowhere/tracer.h @@ -11,16 +11,42 @@ #pragma once +#include #include #include #include "knowhere/config.h" +#ifndef MILVUS_LITE #include "opentelemetry/trace/provider.h" +#endif #define TRACE_SERVICE_KNOWHERE "knowhere" namespace knowhere::tracer { +#ifdef MILVUS_LITE + +namespace trace { +class Span { + public: + void + End() { + } + void + SetAttribute(const char* a, std::any b) { + } +}; +class Tracer { + public: + static int + WithActiveSpan(std::shared_ptr& span) noexcept { + return 0; + } +}; + +}; // namespace trace +#endif + struct TraceConfig { std::string exporter; float sampleFraction; @@ -36,7 +62,10 @@ struct TraceContext { const uint8_t* spanID = nullptr; uint8_t traceFlags = 0; }; + +#ifndef MILVUS_LITE namespace trace = opentelemetry::trace; +#endif void initTelemetry(const TraceConfig& cfg); diff --git a/src/common/comp/brute_force.cc b/src/common/comp/brute_force.cc index f168a2b3..a34908c4 100644 --- a/src/common/comp/brute_force.cc +++ b/src/common/comp/brute_force.cc @@ -160,7 +160,6 @@ BruteForce::Search(const DataSetPtr base_dataset, const DataSetPtr query_dataset span->End(); } #endif - return res; } @@ -168,6 +167,7 @@ template Status BruteForce::SearchWithBuf(const DataSetPtr base_dataset, const DataSetPtr query_dataset, int64_t* ids, float* dis, const Json& config, const BitsetView& bitset) { + LOG_KNOWHERE_INFO_ << "KNOWHERE BF SEARCH START"; DataSetPtr base(base_dataset); DataSetPtr query(query_dataset); if constexpr (!std::is_same_v::type>) { @@ -280,6 +280,7 @@ BruteForce::SearchWithBuf(const DataSetPtr base_dataset, const DataSetPtr query_ } #endif + LOG_KNOWHERE_INFO_ << "KNOWHERE BF SEARCH END"; return Status::success; } diff --git a/src/common/tracer.cc b/src/common/tracer.cc index 99daf00a..9864e62d 100644 --- a/src/common/tracer.cc +++ b/src/common/tracer.cc @@ -13,10 +13,13 @@ #include #include +#include #include #include #include "knowhere/log.h" + +#ifndef MILVUS_LITE #include "opentelemetry/exporters/jaeger/jaeger_exporter_factory.h" #include "opentelemetry/exporters/ostream/span_exporter_factory.h" #include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h" @@ -29,9 +32,12 @@ #include "opentelemetry/sdk/version/version.h" #include "opentelemetry/trace/span_context.h" #include "opentelemetry/trace/span_metadata.h" +#endif namespace knowhere::tracer { +#ifndef MILVUS_LITE + namespace trace = opentelemetry::trace; namespace nostd = opentelemetry::nostd; @@ -143,6 +149,65 @@ EmptySpanID(const TraceContext* ctx) { return isEmptyID(ctx->spanID, trace::SpanId::kSize); } +tracer::TraceContext +GetTraceCtxFromCfg(const BaseConfig* cfg) { + auto trace_id = cfg->trace_id.value(); + auto span_id = cfg->span_id.value(); + auto trace_flags = cfg->trace_flags.value(); + return tracer::TraceContext{trace_id.data(), span_id.data(), (uint8_t)trace_flags}; +} +#endif + +#ifdef MILVUS_LITE +void +initTelemetry(const TraceConfig& cfg) { +} + +std::shared_ptr +GetTracer() { + return std::make_shared(); +} + +std::shared_ptr +StartSpan(const std::string& name, TraceContext* parentCtx) { + return std::make_shared(); +} + +thread_local std::shared_ptr local_span; +void +SetRootSpan(std::shared_ptr span) { +} + +void +CloseRootSpan() { +} + +void +AddEvent(const std::string& event_label) { +} + +bool +isEmptyID(const uint8_t* id, int length) { + if (id != nullptr) { + for (int i = 0; i < length; i++) { + if (id[i] != 0) { + return false; + } + } + } + return true; +} + +bool +EmptyTraceID(const TraceContext* ctx) { + return true; +} + +bool +EmptySpanID(const TraceContext* ctx) { + return true; +} + tracer::TraceContext GetTraceCtxFromCfg(const BaseConfig* cfg) { auto trace_id = cfg->trace_id.value(); @@ -151,4 +216,5 @@ GetTraceCtxFromCfg(const BaseConfig* cfg) { return tracer::TraceContext{trace_id.data(), span_id.data(), (uint8_t)trace_flags}; } +#endif } // namespace knowhere::tracer diff --git a/src/simd/distances_neon.cc b/src/simd/distances_neon.cc index eb90c9ae..0b600673 100644 --- a/src/simd/distances_neon.cc +++ b/src/simd/distances_neon.cc @@ -14,14 +14,110 @@ #include #include + +#include "simd_util.h" namespace faiss { + +// The main goal is to reduce the original precision of floats to maintain consistency with the distance result +// precision of the cardinal index. +__attribute__((always_inline)) inline float32x4_t +bf16_float_neon(float32x4_t f) { + // Convert float to integer bits + uint32x4_t bits = vreinterpretq_u32_f32(f); + + // Add rounding constant + uint32x4_t rounded_bits = vaddq_u32(bits, vdupq_n_u32(0x8000)); + + // Mask to retain only the upper 16 bits (for BF16 representation) + rounded_bits = vandq_u32(rounded_bits, vdupq_n_u32(0xFFFF0000)); + + // Convert back to float + return vreinterpretq_f32_u32(rounded_bits); +} + float fvec_inner_product_neon(const float* x, const float* y, size_t d) { - float32x4_t sum_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t sum_ = vdupq_n_f32(0.0f); + auto dim = d; + while (d >= 16) { + float32x4x4_t a = vld1q_f32_x4(x + dim - d); + float32x4x4_t b = vld1q_f32_x4(y + dim - d); + float32x4x4_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[2] = vmulq_f32(a.val[2], b.val[2]); + c.val[3] = vmulq_f32(a.val[3], b.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_ = vaddq_f32(sum_, c.val[0]); + + d -= 16; + } + + if (d >= 8) { + float32x4x2_t a = vld1q_f32_x2(x + dim - d); + float32x4x2_t b = vld1q_f32_x2(y + dim - d); + float32x4x2_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_ = vaddq_f32(sum_, c.val[0]); + d -= 8; + } + if (d >= 4) { + float32x4_t a = vld1q_f32(x + dim - d); + float32x4_t b = vld1q_f32(y + dim - d); + float32x4_t c; + c = vmulq_f32(a, b); + sum_ = vaddq_f32(sum_, c); + d -= 4; + } + + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4_t res_y = vdupq_n_f32(0.0f); + if (d >= 3) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 2); + res_y = vld1q_lane_f32(y + dim - d, res_y, 2); + d -= 1; + } + + if (d >= 2) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 1); + res_y = vld1q_lane_f32(y + dim - d, res_y, 1); + d -= 1; + } + + if (d >= 1) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 0); + res_y = vld1q_lane_f32(y + dim - d, res_y, 0); + d -= 1; + } + + sum_ = vaddq_f32(sum_, vmulq_f32(res_x, res_y)); + + return vaddvq_f32(sum_); +} + +float +fvec_inner_product_neon_bf16_patch(const float* x, const float* y, size_t d) { + float32x4_t sum_ = vdupq_n_f32(0.0f); auto dim = d; while (d >= 16) { float32x4x4_t a = vld1q_f32_x4(x + dim - d); float32x4x4_t b = vld1q_f32_x4(y + dim - d); + + a.val[0] = bf16_float_neon(a.val[0]); + a.val[1] = bf16_float_neon(a.val[1]); + a.val[2] = bf16_float_neon(a.val[2]); + a.val[3] = bf16_float_neon(a.val[3]); + + b.val[0] = bf16_float_neon(b.val[0]); + b.val[1] = bf16_float_neon(b.val[1]); + b.val[2] = bf16_float_neon(b.val[2]); + b.val[3] = bf16_float_neon(b.val[3]); float32x4x4_t c; c.val[0] = vmulq_f32(a.val[0], b.val[0]); c.val[1] = vmulq_f32(a.val[1], b.val[1]); @@ -40,6 +136,13 @@ fvec_inner_product_neon(const float* x, const float* y, size_t d) { if (d >= 8) { float32x4x2_t a = vld1q_f32_x2(x + dim - d); float32x4x2_t b = vld1q_f32_x2(y + dim - d); + + a.val[0] = bf16_float_neon(a.val[0]); + a.val[1] = bf16_float_neon(a.val[1]); + + b.val[0] = bf16_float_neon(b.val[0]); + b.val[1] = bf16_float_neon(b.val[1]); + float32x4x2_t c; c.val[0] = vmulq_f32(a.val[0], b.val[0]); c.val[1] = vmulq_f32(a.val[1], b.val[1]); @@ -50,14 +153,16 @@ fvec_inner_product_neon(const float* x, const float* y, size_t d) { if (d >= 4) { float32x4_t a = vld1q_f32(x + dim - d); float32x4_t b = vld1q_f32(y + dim - d); + a = bf16_float_neon(a); + b = bf16_float_neon(b); float32x4_t c; c = vmulq_f32(a, b); sum_ = vaddq_f32(sum_, c); d -= 4; } - float32x4_t res_x = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t res_y = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4_t res_y = vdupq_n_f32(0.0f); if (d >= 3) { res_x = vld1q_lane_f32(x + dim - d, res_x, 2); res_y = vld1q_lane_f32(y + dim - d, res_y, 2); @@ -75,20 +180,235 @@ fvec_inner_product_neon(const float* x, const float* y, size_t d) { res_y = vld1q_lane_f32(y + dim - d, res_y, 0); d -= 1; } + res_x = bf16_float_neon(res_x); + res_y = bf16_float_neon(res_y); sum_ = vaddq_f32(sum_, vmulq_f32(res_x, res_y)); return vaddvq_f32(sum_); } +float +fp16_vec_inner_product_neon(const knowhere::fp16* x, const knowhere::fp16* y, size_t d) { + float32x4x4_t res = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + while (d >= 16) { + float32x4x4_t a = vcvt4_f32_f16(vld4_f16((const __fp16*)x)); + float32x4x4_t b = vcvt4_f32_f16(vld4_f16((const __fp16*)y)); + + res.val[0] = vmlaq_f32(res.val[0], a.val[0], b.val[0]); + res.val[1] = vmlaq_f32(res.val[1], a.val[1], b.val[1]); + res.val[2] = vmlaq_f32(res.val[2], a.val[2], b.val[2]); + res.val[3] = vmlaq_f32(res.val[3], a.val[3], b.val[3]); + d -= 16; + x += 16; + y += 16; + } + res.val[0] = vaddq_f32(res.val[0], res.val[1]); + res.val[2] = vaddq_f32(res.val[2], res.val[3]); + if (d >= 8) { + float32x4x2_t a = vcvt2_f32_f16(vld2_f16((const __fp16*)x)); + float32x4x2_t b = vcvt2_f32_f16(vld2_f16((const __fp16*)y)); + res.val[0] = vmlaq_f32(res.val[0], a.val[0], b.val[0]); + res.val[2] = vmlaq_f32(res.val[2], a.val[1], b.val[1]); + d -= 8; + x += 8; + y += 8; + } + res.val[0] = vaddq_f32(res.val[0], res.val[2]); + if (d >= 4) { + float32x4_t a = vcvt_f32_f16(vld1_f16((const __fp16*)x)); + float32x4_t b = vcvt_f32_f16(vld1_f16((const __fp16*)y)); + res.val[0] = vmlaq_f32(res.val[0], a, b); + d -= 4; + x += 4; + y += 4; + } + if (d >= 0) { + float16x4_t res_x = {0.0f, 0.0f, 0.0f, 0.0f}; + float16x4_t res_y = {0.0f, 0.0f, 0.0f, 0.0f}; + switch (d) { + case 3: + res_x = vld1_lane_f16((const __fp16*)x, res_x, 2); + res_y = vld1_lane_f16((const __fp16*)y, res_y, 2); + x++; + y++; + d--; + case 2: + res_x = vld1_lane_f16((const __fp16*)x, res_x, 1); + res_y = vld1_lane_f16((const __fp16*)y, res_y, 1); + x++; + y++; + d--; + case 1: + res_x = vld1_lane_f16((const __fp16*)x, res_x, 0); + res_y = vld1_lane_f16((const __fp16*)y, res_y, 0); + x++; + y++; + d--; + } + res.val[0] = vmlaq_f32(res.val[0], vcvt_f32_f16(res_x), vcvt_f32_f16(res_y)); + } + return vaddvq_f32(res.val[0]); +} + +float +bf16_vec_inner_product_neon(const knowhere::bf16* x, const knowhere::bf16* y, size_t d) { + float32x4x4_t res = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + while (d >= 16) { + float32x4x4_t a = vcvt4_f32_half(vld4_u16((const uint16_t*)x)); + float32x4x4_t b = vcvt4_f32_half(vld4_u16((const uint16_t*)y)); + + res.val[0] = vmlaq_f32(res.val[0], a.val[0], b.val[0]); + res.val[1] = vmlaq_f32(res.val[1], a.val[1], b.val[1]); + res.val[2] = vmlaq_f32(res.val[2], a.val[2], b.val[2]); + res.val[3] = vmlaq_f32(res.val[3], a.val[3], b.val[3]); + d -= 16; + x += 16; + y += 16; + } + res.val[0] = vaddq_f32(res.val[0], res.val[1]); + res.val[2] = vaddq_f32(res.val[2], res.val[3]); + if (d >= 8) { + float32x4x2_t a = vcvt2_f32_half(vld2_u16((const uint16_t*)x)); + float32x4x2_t b = vcvt2_f32_half(vld2_u16((const uint16_t*)y)); + res.val[0] = vmlaq_f32(res.val[0], a.val[0], b.val[0]); + res.val[2] = vmlaq_f32(res.val[2], a.val[1], b.val[1]); + d -= 8; + x += 8; + y += 8; + } + res.val[0] = vaddq_f32(res.val[0], res.val[2]); + if (d >= 4) { + float32x4_t a = vcvt_f32_half(vld1_u16((const uint16_t*)x)); + float32x4_t b = vcvt_f32_half(vld1_u16((const uint16_t*)y)); + res.val[0] = vmlaq_f32(res.val[0], a, b); + d -= 4; + x += 4; + y += 4; + } + if (d >= 0) { + uint16x4_t res_x = {0, 0, 0, 0}; + uint16x4_t res_y = {0, 0, 0, 0}; + switch (d) { + case 3: + res_x = vld1_lane_u16((const uint16_t*)x, res_x, 2); + res_y = vld1_lane_u16((const uint16_t*)y, res_y, 2); + x++; + y++; + d--; + case 2: + res_x = vld1_lane_u16((const uint16_t*)x, res_x, 1); + res_y = vld1_lane_u16((const uint16_t*)y, res_y, 1); + x++; + y++; + d--; + case 1: + res_x = vld1_lane_u16((const uint16_t*)x, res_x, 0); + res_y = vld1_lane_u16((const uint16_t*)y, res_y, 0); + x++; + y++; + d--; + } + res.val[0] = vmlaq_f32(res.val[0], vcvt_f32_half(res_x), vcvt_f32_half(res_y)); + } + return vaddvq_f32(res.val[0]); +} + float fvec_L2sqr_neon(const float* x, const float* y, size_t d) { - float32x4_t sum_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t sum_ = vdupq_n_f32(0.0f); + auto dim = d; + while (d >= 16) { + float32x4x4_t a = vld1q_f32_x4(x + dim - d); + float32x4x4_t b = vld1q_f32_x4(y + dim - d); + float32x4x4_t c; + + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + c.val[2] = vsubq_f32(a.val[2], b.val[2]); + c.val[3] = vsubq_f32(a.val[3], b.val[3]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + c.val[2] = vmulq_f32(c.val[2], c.val[2]); + c.val[3] = vmulq_f32(c.val[3], c.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_ = vaddq_f32(sum_, c.val[0]); + + d -= 16; + } + if (d >= 8) { + float32x4x2_t a = vld1q_f32_x2(x + dim - d); + float32x4x2_t b = vld1q_f32_x2(y + dim - d); + float32x4x2_t c; + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_ = vaddq_f32(sum_, c.val[0]); + d -= 8; + } + if (d >= 4) { + float32x4_t a = vld1q_f32(x + dim - d); + float32x4_t b = vld1q_f32(y + dim - d); + float32x4_t c; + c = vsubq_f32(a, b); + c = vmulq_f32(c, c); + + sum_ = vaddq_f32(sum_, c); + d -= 4; + } + + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4_t res_y = vdupq_n_f32(0.0f); + if (d >= 3) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 2); + res_y = vld1q_lane_f32(y + dim - d, res_y, 2); + d -= 1; + } + + if (d >= 2) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 1); + res_y = vld1q_lane_f32(y + dim - d, res_y, 1); + d -= 1; + } + + if (d >= 1) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 0); + res_y = vld1q_lane_f32(y + dim - d, res_y, 0); + d -= 1; + } + + sum_ = vaddq_f32(sum_, vmulq_f32(vsubq_f32(res_x, res_y), vsubq_f32(res_x, res_y))); + + return vaddvq_f32(sum_); +} + +float +fvec_L2sqr_neon_bf16_patch(const float* x, const float* y, size_t d) { + float32x4_t sum_ = vdupq_n_f32(0.0f); auto dim = d; while (d >= 16) { float32x4x4_t a = vld1q_f32_x4(x + dim - d); float32x4x4_t b = vld1q_f32_x4(y + dim - d); + a.val[0] = bf16_float_neon(a.val[0]); + a.val[1] = bf16_float_neon(a.val[1]); + a.val[2] = bf16_float_neon(a.val[2]); + a.val[3] = bf16_float_neon(a.val[3]); + + b.val[0] = bf16_float_neon(b.val[0]); + b.val[1] = bf16_float_neon(b.val[1]); + b.val[2] = bf16_float_neon(b.val[2]); + b.val[3] = bf16_float_neon(b.val[3]); + float32x4x4_t c; c.val[0] = vsubq_f32(a.val[0], b.val[0]); @@ -113,6 +433,13 @@ fvec_L2sqr_neon(const float* x, const float* y, size_t d) { if (d >= 8) { float32x4x2_t a = vld1q_f32_x2(x + dim - d); float32x4x2_t b = vld1q_f32_x2(y + dim - d); + + a.val[0] = bf16_float_neon(a.val[0]); + a.val[1] = bf16_float_neon(a.val[1]); + + b.val[0] = bf16_float_neon(b.val[0]); + b.val[1] = bf16_float_neon(b.val[1]); + float32x4x2_t c; c.val[0] = vsubq_f32(a.val[0], b.val[0]); c.val[1] = vsubq_f32(a.val[1], b.val[1]); @@ -127,6 +454,8 @@ fvec_L2sqr_neon(const float* x, const float* y, size_t d) { if (d >= 4) { float32x4_t a = vld1q_f32(x + dim - d); float32x4_t b = vld1q_f32(y + dim - d); + a = bf16_float_neon(a); + b = bf16_float_neon(b); float32x4_t c; c = vsubq_f32(a, b); c = vmulq_f32(c, c); @@ -135,8 +464,8 @@ fvec_L2sqr_neon(const float* x, const float* y, size_t d) { d -= 4; } - float32x4_t res_x = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t res_y = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4_t res_y = vdupq_n_f32(0.0f); if (d >= 3) { res_x = vld1q_lane_f32(x + dim - d, res_x, 2); res_y = vld1q_lane_f32(y + dim - d, res_y, 2); @@ -155,11 +484,159 @@ fvec_L2sqr_neon(const float* x, const float* y, size_t d) { d -= 1; } + res_x = bf16_float_neon(res_x); + res_y = bf16_float_neon(res_y); + sum_ = vaddq_f32(sum_, vmulq_f32(vsubq_f32(res_x, res_y), vsubq_f32(res_x, res_y))); return vaddvq_f32(sum_); } +float +fp16_vec_L2sqr_neon(const knowhere::fp16* x, const knowhere::fp16* y, size_t d) { + float32x4x4_t res = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + while (d >= 16) { + float32x4x4_t a = vcvt4_f32_f16(vld4_f16((const __fp16*)x)); + float32x4x4_t b = vcvt4_f32_f16(vld4_f16((const __fp16*)y)); + a.val[0] = vsubq_f32(a.val[0], b.val[0]); + a.val[1] = vsubq_f32(a.val[1], b.val[1]); + a.val[2] = vsubq_f32(a.val[2], b.val[2]); + a.val[3] = vsubq_f32(a.val[3], b.val[3]); + + res.val[0] = vmlaq_f32(res.val[0], a.val[0], a.val[0]); + res.val[1] = vmlaq_f32(res.val[1], a.val[1], a.val[1]); + res.val[2] = vmlaq_f32(res.val[2], a.val[2], a.val[2]); + res.val[3] = vmlaq_f32(res.val[3], a.val[3], a.val[3]); + d -= 16; + x += 16; + y += 16; + } + res.val[0] = vaddq_f32(res.val[0], res.val[1]); + res.val[2] = vaddq_f32(res.val[2], res.val[3]); + if (d >= 8) { + float32x4x2_t a = vcvt2_f32_f16(vld2_f16((const __fp16*)x)); + float32x4x2_t b = vcvt2_f32_f16(vld2_f16((const __fp16*)y)); + a.val[0] = vsubq_f32(a.val[0], b.val[0]); + a.val[1] = vsubq_f32(a.val[1], b.val[1]); + res.val[0] = vmlaq_f32(res.val[0], a.val[0], a.val[0]); + res.val[2] = vmlaq_f32(res.val[2], a.val[1], a.val[1]); + d -= 8; + x += 8; + y += 8; + } + res.val[0] = vaddq_f32(res.val[0], res.val[2]); + if (d >= 4) { + float32x4_t a = vcvt_f32_f16(vld1_f16((const __fp16*)x)); + float32x4_t b = vcvt_f32_f16(vld1_f16((const __fp16*)y)); + a = vsubq_f32(a, b); + res.val[0] = vmlaq_f32(res.val[0], a, a); + d -= 4; + x += 4; + y += 4; + } + if (d >= 0) { + float16x4_t res_x = vdup_n_f16(0.0f); + float16x4_t res_y = vdup_n_f16(0.0f); + switch (d) { + case 3: + res_x = vld1_lane_f16((const __fp16*)x, res_x, 2); + res_y = vld1_lane_f16((const __fp16*)y, res_y, 2); + x++; + y++; + d--; + case 2: + res_x = vld1_lane_f16((const __fp16*)x, res_x, 1); + res_y = vld1_lane_f16((const __fp16*)y, res_y, 1); + x++; + y++; + d--; + case 1: + res_x = vld1_lane_f16((const __fp16*)x, res_x, 0); + res_y = vld1_lane_f16((const __fp16*)y, res_y, 0); + x++; + y++; + d--; + } + float32x4_t diff = vsubq_f32(vcvt_f32_f16(res_x), vcvt_f32_f16(res_y)); + + res.val[0] = vmlaq_f32(res.val[0], diff, diff); + } + return vaddvq_f32(res.val[0]); +} + +float +bf16_vec_L2sqr_neon(const knowhere::bf16* x, const knowhere::bf16* y, size_t d) { + float32x4x4_t res = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + while (d >= 16) { + float32x4x4_t a = vcvt4_f32_half(vld4_u16((const uint16_t*)x)); + float32x4x4_t b = vcvt4_f32_half(vld4_u16((const uint16_t*)y)); + a.val[0] = vsubq_f32(a.val[0], b.val[0]); + a.val[1] = vsubq_f32(a.val[1], b.val[1]); + a.val[2] = vsubq_f32(a.val[2], b.val[2]); + a.val[3] = vsubq_f32(a.val[3], b.val[3]); + + res.val[0] = vmlaq_f32(res.val[0], a.val[0], a.val[0]); + res.val[1] = vmlaq_f32(res.val[1], a.val[1], a.val[1]); + res.val[2] = vmlaq_f32(res.val[2], a.val[2], a.val[2]); + res.val[3] = vmlaq_f32(res.val[3], a.val[3], a.val[3]); + d -= 16; + x += 16; + y += 16; + } + res.val[0] = vaddq_f32(res.val[0], res.val[1]); + res.val[2] = vaddq_f32(res.val[2], res.val[3]); + if (d >= 8) { + float32x4x2_t a = vcvt2_f32_half(vld2_u16((const uint16_t*)x)); + float32x4x2_t b = vcvt2_f32_half(vld2_u16((const uint16_t*)y)); + a.val[0] = vsubq_f32(a.val[0], b.val[0]); + a.val[1] = vsubq_f32(a.val[1], b.val[1]); + res.val[0] = vmlaq_f32(res.val[0], a.val[0], a.val[0]); + res.val[2] = vmlaq_f32(res.val[2], a.val[1], a.val[1]); + d -= 8; + x += 8; + y += 8; + } + res.val[0] = vaddq_f32(res.val[0], res.val[2]); + if (d >= 4) { + float32x4_t a = vcvt_f32_half(vld1_u16((const uint16_t*)x)); + float32x4_t b = vcvt_f32_half(vld1_u16((const uint16_t*)y)); + a = vsubq_f32(a, b); + res.val[0] = vmlaq_f32(res.val[0], a, a); + d -= 4; + x += 4; + y += 4; + } + if (d >= 0) { + uint16x4_t res_x = vdup_n_u16(0); + uint16x4_t res_y = vdup_n_u16(0); + switch (d) { + case 3: + res_x = vld1_lane_u16((const uint16_t*)x, res_x, 2); + res_y = vld1_lane_u16((const uint16_t*)y, res_y, 2); + x++; + y++; + d--; + case 2: + res_x = vld1_lane_u16((const uint16_t*)x, res_x, 1); + res_y = vld1_lane_u16((const uint16_t*)y, res_y, 1); + x++; + y++; + d--; + case 1: + res_x = vld1_lane_u16((const uint16_t*)x, res_x, 0); + res_y = vld1_lane_u16((const uint16_t*)y, res_y, 0); + x++; + y++; + d--; + } + + float32x4_t diff = vsubq_f32(vcvt_f32_half(res_x), vcvt_f32_half(res_y)); + + res.val[0] = vmlaq_f32(res.val[0], diff, diff); + } + return vaddvq_f32(res.val[0]); +} + float fvec_L1_neon(const float* x, const float* y, size_t d) { float32x4_t sum_ = {0.f}; @@ -214,8 +691,8 @@ fvec_L1_neon(const float* x, const float* y, size_t d) { d -= 4; } - float32x4_t res_x = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t res_y = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4_t res_y = vdupq_n_f32(0.0f); if (d >= 3) { res_x = vld1q_lane_f32(x + dim - d, res_x, 2); res_y = vld1q_lane_f32(y + dim - d, res_y, 2); @@ -241,7 +718,7 @@ fvec_L1_neon(const float* x, const float* y, size_t d) { float fvec_Linf_neon(const float* x, const float* y, size_t d) { - float32x4_t sum_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t sum_ = vdupq_n_f32(0.0f); auto dim = d; while (d >= 16) { @@ -293,8 +770,8 @@ fvec_Linf_neon(const float* x, const float* y, size_t d) { d -= 4; } - float32x4_t res_x = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t res_y = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4_t res_y = vdupq_n_f32(0.0f); if (d >= 3) { res_x = vld1q_lane_f32(x + dim - d, res_x, 2); res_y = vld1q_lane_f32(y + dim - d, res_y, 2); @@ -320,7 +797,7 @@ fvec_Linf_neon(const float* x, const float* y, size_t d) { float fvec_norm_L2sqr_neon(const float* x, size_t d) { - float32x4_t sum_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t sum_ = vdupq_n_f32(0.0f); auto dim = d; while (d >= 16) { float32x4x4_t a = vld1q_f32_x4(x + dim - d); @@ -356,7 +833,7 @@ fvec_norm_L2sqr_neon(const float* x, size_t d) { d -= 4; } - float32x4_t res_x = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t res_x = vdupq_n_f32(0.0f); if (d >= 3) { res_x = vld1q_lane_f32(x + dim - d, res_x, 2); d -= 1; @@ -377,6 +854,108 @@ fvec_norm_L2sqr_neon(const float* x, size_t d) { return vaddvq_f32(sum_); } +float +fp16_vec_norm_L2sqr_neon(const knowhere::fp16* x, size_t d) { + float32x4x4_t res = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + while (d >= 16) { + float32x4x4_t a = vcvt4_f32_f16(vld4_f16((const __fp16*)x)); + res.val[0] = vmlaq_f32(res.val[0], a.val[0], a.val[0]); + res.val[1] = vmlaq_f32(res.val[1], a.val[1], a.val[1]); + res.val[2] = vmlaq_f32(res.val[2], a.val[2], a.val[2]); + res.val[3] = vmlaq_f32(res.val[3], a.val[3], a.val[3]); + d -= 16; + x += 16; + } + res.val[0] = vaddq_f32(res.val[0], res.val[1]); + res.val[2] = vaddq_f32(res.val[2], res.val[3]); + if (d >= 8) { + float32x4x2_t a = vcvt2_f32_f16(vld2_f16((const __fp16*)x)); + res.val[0] = vmlaq_f32(res.val[0], a.val[0], a.val[0]); + res.val[2] = vmlaq_f32(res.val[2], a.val[1], a.val[1]); + d -= 8; + x += 8; + } + res.val[0] = vaddq_f32(res.val[0], res.val[2]); + if (d >= 4) { + float32x4_t a = vcvt_f32_f16(vld1_f16((const __fp16*)x)); + res.val[0] = vmlaq_f32(res.val[0], a, a); + d -= 4; + x += 4; + } + if (d >= 0) { + float16x4_t res_x = vdup_n_f16(0.0f); + switch (d) { + case 3: + res_x = vld1_lane_f16((const __fp16*)x, res_x, 2); + x++; + d--; + case 2: + res_x = vld1_lane_f16((const __fp16*)x, res_x, 1); + x++; + d--; + case 1: + res_x = vld1_lane_f16((const __fp16*)x, res_x, 0); + x++; + d--; + } + float32x4_t x_f32 = vcvt_f32_f16(res_x); + res.val[0] = vmlaq_f32(res.val[0], x_f32, x_f32); + } + return vaddvq_f32(res.val[0]); +} + +float +bf16_vec_norm_L2sqr_neon(const knowhere::bf16* x, size_t d) { + float32x4x4_t res = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + while (d >= 16) { + float32x4x4_t a = vcvt4_f32_half(vld4_u16((const uint16_t*)x)); + res.val[0] = vmlaq_f32(res.val[0], a.val[0], a.val[0]); + res.val[1] = vmlaq_f32(res.val[1], a.val[1], a.val[1]); + res.val[2] = vmlaq_f32(res.val[2], a.val[2], a.val[2]); + res.val[3] = vmlaq_f32(res.val[3], a.val[3], a.val[3]); + d -= 16; + x += 16; + } + res.val[0] = vaddq_f32(res.val[0], res.val[1]); + res.val[2] = vaddq_f32(res.val[2], res.val[3]); + if (d >= 8) { + float32x4x2_t a = vcvt2_f32_half(vld2_u16((const uint16_t*)x)); + res.val[0] = vmlaq_f32(res.val[0], a.val[0], a.val[0]); + res.val[2] = vmlaq_f32(res.val[2], a.val[1], a.val[1]); + d -= 8; + x += 8; + } + res.val[0] = vaddq_f32(res.val[0], res.val[2]); + if (d >= 4) { + float32x4_t a = vcvt_f32_half(vld1_u16((const uint16_t*)x)); + res.val[0] = vmlaq_f32(res.val[0], a, a); + d -= 4; + x += 4; + } + if (d >= 0) { + uint16x4_t res_x = vdup_n_u16(0); + switch (d) { + case 3: + res_x = vld1_lane_u16((const uint16_t*)x, res_x, 2); + x++; + d--; + case 2: + res_x = vld1_lane_u16((const uint16_t*)x, res_x, 1); + x++; + d--; + case 1: + res_x = vld1_lane_u16((const uint16_t*)x, res_x, 0); + x++; + d--; + } + + float32x4_t x_fp32 = vcvt_f32_half(res_x); + + res.val[0] = vmlaq_f32(res.val[0], x_fp32, x_fp32); + } + return vaddvq_f32(res.val[0]); +} + void fvec_L2sqr_ny_neon(float* dis, const float* x, const float* y, size_t d, size_t ny) { for (size_t i = 0; i < ny; i++) { @@ -434,8 +1013,8 @@ fvec_madd_neon(size_t n, const float* a, float bf, const float* b, float* c) { } if (n == 3) { - float32x4_t a_ = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t b_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t a_ = vdupq_n_f32(0.0f); + float32x4_t b_ = vdupq_n_f32(0.0f); a_ = vld1q_lane_f32(a + len - n + 2, a_, 2); a_ = vld1q_lane_f32(a + len - n + 1, a_, 1); @@ -450,8 +1029,8 @@ fvec_madd_neon(size_t n, const float* a, float bf, const float* b, float* c) { vst1q_lane_f32(c + len - n, c_, 0); } if (n == 2) { - float32x4_t a_ = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t b_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t a_ = vdupq_n_f32(0.0f); + float32x4_t b_ = vdupq_n_f32(0.0f); a_ = vld1q_lane_f32(a + len - n + 1, a_, 1); a_ = vld1q_lane_f32(a + len - n, a_, 0); @@ -463,8 +1042,8 @@ fvec_madd_neon(size_t n, const float* a, float bf, const float* b, float* c) { vst1q_lane_f32(c + len - n, c_, 0); } if (n == 1) { - float32x4_t a_ = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t b_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t a_ = vdupq_n_f32(0.0f); + float32x4_t b_ = vdupq_n_f32(0.0f); a_ = vld1q_lane_f32(a + len - n, a_, 0); b_ = vld1q_lane_f32(b + len - n, b_, 0); @@ -477,13 +1056,8 @@ fvec_madd_neon(size_t n, const float* a, float bf, const float* b, float* c) { int fvec_madd_and_argmin_neon(size_t n, const float* a, float bf, const float* b, float* c) { size_t len = n; - uint32x4_t ids = {0, 0, 0, 0}; - float32x4_t val = { - INFINITY, - INFINITY, - INFINITY, - INFINITY, - }; + uint32x4_t ids = vdupq_n_u32(0); + float32x4_t val = vdupq_n_f32(INFINITY); while (n >= 16) { auto a_ = vld1q_f32_x4(a + len - n); auto b_ = vld1q_f32_x4(b + len - n); @@ -566,8 +1140,8 @@ fvec_madd_and_argmin_neon(size_t n, const float* a, float bf, const float* b, fl } if (n == 3) { - float32x4_t a_ = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t b_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t a_ = vdupq_n_f32(0.0f); + float32x4_t b_ = vdupq_n_f32(0.0f); a_ = vld1q_lane_f32(a + len - n + 2, a_, 2); a_ = vld1q_lane_f32(a + len - n + 1, a_, 1); @@ -586,8 +1160,8 @@ fvec_madd_and_argmin_neon(size_t n, const float* a, float bf, const float* b, fl ids = vbslq_u32(cmp, vaddq_u32(uint32x4_t{0, 1, 2, 3}, vld1q_dup_u32(&loc)), ids); } if (n == 2) { - float32x4_t a_ = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t b_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t a_ = vdupq_n_f32(0.0f); + float32x4_t b_ = vdupq_n_f32(0.0f); a_ = vld1q_lane_f32(a + len - n + 1, a_, 1); a_ = vld1q_lane_f32(a + len - n, a_, 0); @@ -604,8 +1178,8 @@ fvec_madd_and_argmin_neon(size_t n, const float* a, float bf, const float* b, fl ids = vbslq_u32(cmp, vaddq_u32(uint32x4_t{0, 1, 2, 3}, vld1q_dup_u32(&loc)), ids); } if (n == 1) { - float32x4_t a_ = {0.0f, 0.0f, 0.0f, 0.0f}; - float32x4_t b_ = {0.0f, 0.0f, 0.0f, 0.0f}; + float32x4_t a_ = vdupq_n_f32(0.0f); + float32x4_t b_ = vdupq_n_f32(0.0f); a_ = vld1q_lane_f32(a + len - n, a_, 0); b_ = vld1q_lane_f32(b + len - n, b_, 0); @@ -658,5 +1232,863 @@ ivec_L2sqr_neon(const int8_t* x, const int8_t* y, size_t d) { return res; } +void +fvec_inner_product_batch_4_neon(const float* x, const float* y0, const float* y1, const float* y2, const float* y3, + const size_t dim, float& dis0, float& dis1, float& dis2, float& dis3) { + float32x4x4_t sum_ = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + auto d = dim; + + while (d >= 16) { + float32x4x4_t a = vld1q_f32_x4(x + dim - d); + { + float32x4x4_t b = vld1q_f32_x4(y0 + dim - d); + float32x4x4_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[2] = vmulq_f32(a.val[2], b.val[2]); + c.val[3] = vmulq_f32(a.val[3], b.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[0] = vaddq_f32(sum_.val[0], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y1 + dim - d); + float32x4x4_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[2] = vmulq_f32(a.val[2], b.val[2]); + c.val[3] = vmulq_f32(a.val[3], b.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[1] = vaddq_f32(sum_.val[1], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y2 + dim - d); + float32x4x4_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[2] = vmulq_f32(a.val[2], b.val[2]); + c.val[3] = vmulq_f32(a.val[3], b.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[2] = vaddq_f32(sum_.val[2], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y3 + dim - d); + float32x4x4_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[2] = vmulq_f32(a.val[2], b.val[2]); + c.val[3] = vmulq_f32(a.val[3], b.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[3] = vaddq_f32(sum_.val[3], c.val[0]); + } + + d -= 16; + } + + if (d >= 8) { + float32x4x2_t a = vld1q_f32_x2(x + dim - d); + + { + float32x4x2_t b = vld1q_f32_x2(y0 + dim - d); + float32x4x2_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[0] = vaddq_f32(sum_.val[0], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y1 + dim - d); + float32x4x2_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[1] = vaddq_f32(sum_.val[1], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y2 + dim - d); + float32x4x2_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[2] = vaddq_f32(sum_.val[2], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y3 + dim - d); + float32x4x2_t c; + c.val[0] = vmulq_f32(a.val[0], b.val[0]); + c.val[1] = vmulq_f32(a.val[1], b.val[1]); + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[3] = vaddq_f32(sum_.val[3], c.val[0]); + } + + d -= 8; + } + if (d >= 4) { + float32x4_t a = vld1q_f32(x + dim - d); + { + float32x4_t b = vld1q_f32(y0 + dim - d); + float32x4_t c; + c = vmulq_f32(a, b); + sum_.val[0] = vaddq_f32(sum_.val[0], c); + } + + { + float32x4_t b = vld1q_f32(y1 + dim - d); + float32x4_t c; + c = vmulq_f32(a, b); + sum_.val[1] = vaddq_f32(sum_.val[1], c); + } + + { + float32x4_t b = vld1q_f32(y2 + dim - d); + float32x4_t c; + c = vmulq_f32(a, b); + sum_.val[2] = vaddq_f32(sum_.val[2], c); + } + { + float32x4_t b = vld1q_f32(y3 + dim - d); + float32x4_t c; + c = vmulq_f32(a, b); + sum_.val[3] = vaddq_f32(sum_.val[3], c); + } + + d -= 4; + } + + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4x4_t res_y = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + if (d >= 3) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 2); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 2); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 2); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 2); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 2); + + d -= 1; + } + + if (d >= 2) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 1); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 1); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 1); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 1); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 1); + + d -= 1; + } + + if (d >= 1) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 0); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 0); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 0); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 0); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 0); + + d -= 1; + } + + sum_.val[0] = vaddq_f32(sum_.val[0], vmulq_f32(res_x, res_y.val[0])); + sum_.val[1] = vaddq_f32(sum_.val[1], vmulq_f32(res_x, res_y.val[1])); + sum_.val[2] = vaddq_f32(sum_.val[2], vmulq_f32(res_x, res_y.val[2])); + sum_.val[3] = vaddq_f32(sum_.val[3], vmulq_f32(res_x, res_y.val[3])); + + dis0 = vaddvq_f32(sum_.val[0]); + dis1 = vaddvq_f32(sum_.val[1]); + dis2 = vaddvq_f32(sum_.val[2]); + dis3 = vaddvq_f32(sum_.val[3]); +} + +void +fvec_L2sqr_batch_4_neon(const float* x, const float* y0, const float* y1, const float* y2, const float* y3, + const size_t dim, float& dis0, float& dis1, float& dis2, float& dis3) { + float32x4x4_t sum_ = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + auto d = dim; + while (d >= 16) { + float32x4x4_t a = vld1q_f32_x4(x + dim - d); + { + float32x4x4_t b = vld1q_f32_x4(y0 + dim - d); + float32x4x4_t c; + + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + c.val[2] = vsubq_f32(a.val[2], b.val[2]); + c.val[3] = vsubq_f32(a.val[3], b.val[3]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + c.val[2] = vmulq_f32(c.val[2], c.val[2]); + c.val[3] = vmulq_f32(c.val[3], c.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[0] = vaddq_f32(sum_.val[0], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y1 + dim - d); + float32x4x4_t c; + + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + c.val[2] = vsubq_f32(a.val[2], b.val[2]); + c.val[3] = vsubq_f32(a.val[3], b.val[3]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + c.val[2] = vmulq_f32(c.val[2], c.val[2]); + c.val[3] = vmulq_f32(c.val[3], c.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[1] = vaddq_f32(sum_.val[1], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y2 + dim - d); + float32x4x4_t c; + + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + c.val[2] = vsubq_f32(a.val[2], b.val[2]); + c.val[3] = vsubq_f32(a.val[3], b.val[3]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + c.val[2] = vmulq_f32(c.val[2], c.val[2]); + c.val[3] = vmulq_f32(c.val[3], c.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[2] = vaddq_f32(sum_.val[2], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y3 + dim - d); + float32x4x4_t c; + + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + c.val[2] = vsubq_f32(a.val[2], b.val[2]); + c.val[3] = vsubq_f32(a.val[3], b.val[3]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + c.val[2] = vmulq_f32(c.val[2], c.val[2]); + c.val[3] = vmulq_f32(c.val[3], c.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[3] = vaddq_f32(sum_.val[3], c.val[0]); + } + + d -= 16; + } + + if (d >= 8) { + float32x4x2_t a = vld1q_f32_x2(x + dim - d); + + { + float32x4x2_t b = vld1q_f32_x2(y0 + dim - d); + float32x4x2_t c; + + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[0] = vaddq_f32(sum_.val[0], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y1 + dim - d); + float32x4x2_t c; + + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[1] = vaddq_f32(sum_.val[1], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y2 + dim - d); + float32x4x2_t c; + + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[2] = vaddq_f32(sum_.val[2], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y3 + dim - d); + float32x4x2_t c; + + c.val[0] = vsubq_f32(a.val[0], b.val[0]); + c.val[1] = vsubq_f32(a.val[1], b.val[1]); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[3] = vaddq_f32(sum_.val[3], c.val[0]); + } + + d -= 8; + } + if (d >= 4) { + float32x4_t a = vld1q_f32(x + dim - d); + { + float32x4_t b = vld1q_f32(y0 + dim - d); + float32x4_t c; + c = vsubq_f32(a, b); + c = vmulq_f32(c, c); + sum_.val[0] = vaddq_f32(sum_.val[0], c); + } + + { + float32x4_t b = vld1q_f32(y1 + dim - d); + float32x4_t c; + c = vsubq_f32(a, b); + c = vmulq_f32(c, c); + sum_.val[1] = vaddq_f32(sum_.val[1], c); + } + + { + float32x4_t b = vld1q_f32(y2 + dim - d); + float32x4_t c; + c = vsubq_f32(a, b); + c = vmulq_f32(c, c); + sum_.val[2] = vaddq_f32(sum_.val[2], c); + } + { + float32x4_t b = vld1q_f32(y3 + dim - d); + float32x4_t c; + c = vsubq_f32(a, b); + c = vmulq_f32(c, c); + sum_.val[3] = vaddq_f32(sum_.val[3], c); + } + + d -= 4; + } + + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4x4_t res_y = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + if (d >= 3) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 2); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 2); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 2); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 2); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 2); + + d -= 1; + } + + if (d >= 2) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 1); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 1); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 1); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 1); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 1); + + d -= 1; + } + + if (d >= 1) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 0); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 0); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 0); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 0); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 0); + + d -= 1; + } + + sum_.val[0] = vaddq_f32(sum_.val[0], vmulq_f32(vsubq_f32(res_x, res_y.val[0]), vsubq_f32(res_x, res_y.val[0]))); + sum_.val[1] = vaddq_f32(sum_.val[1], vmulq_f32(vsubq_f32(res_x, res_y.val[1]), vsubq_f32(res_x, res_y.val[1]))); + sum_.val[2] = vaddq_f32(sum_.val[2], vmulq_f32(vsubq_f32(res_x, res_y.val[2]), vsubq_f32(res_x, res_y.val[2]))); + sum_.val[3] = vaddq_f32(sum_.val[3], vmulq_f32(vsubq_f32(res_x, res_y.val[3]), vsubq_f32(res_x, res_y.val[3]))); + + dis0 = vaddvq_f32(sum_.val[0]); + dis1 = vaddvq_f32(sum_.val[1]); + dis2 = vaddvq_f32(sum_.val[2]); + dis3 = vaddvq_f32(sum_.val[3]); +} + +void +fvec_inner_product_batch_4_neon_bf16_patch(const float* x, const float* y0, const float* y1, const float* y2, + const float* y3, const size_t dim, float& dis0, float& dis1, float& dis2, + float& dis3) { + float32x4x4_t sum_ = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + auto d = dim; + while (d >= 16) { + float32x4x4_t a = vld1q_f32_x4(x + dim - d); + + a.val[0] = bf16_float_neon(a.val[0]); + a.val[1] = bf16_float_neon(a.val[1]); + a.val[2] = bf16_float_neon(a.val[2]); + a.val[3] = bf16_float_neon(a.val[3]); + + { + float32x4x4_t b = vld1q_f32_x4(y0 + dim - d); + float32x4x4_t c; + c.val[0] = vmulq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vmulq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[2] = vmulq_f32(a.val[2], bf16_float_neon(b.val[2])); + c.val[3] = vmulq_f32(a.val[3], bf16_float_neon(b.val[3])); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[0] = vaddq_f32(sum_.val[0], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y1 + dim - d); + float32x4x4_t c; + c.val[0] = vmulq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vmulq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[2] = vmulq_f32(a.val[2], bf16_float_neon(b.val[2])); + c.val[3] = vmulq_f32(a.val[3], bf16_float_neon(b.val[3])); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[1] = vaddq_f32(sum_.val[1], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y2 + dim - d); + float32x4x4_t c; + c.val[0] = vmulq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vmulq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[2] = vmulq_f32(a.val[2], bf16_float_neon(b.val[2])); + c.val[3] = vmulq_f32(a.val[3], bf16_float_neon(b.val[3])); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[2] = vaddq_f32(sum_.val[2], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y3 + dim - d); + float32x4x4_t c; + c.val[0] = vmulq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vmulq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[2] = vmulq_f32(a.val[2], bf16_float_neon(b.val[2])); + c.val[3] = vmulq_f32(a.val[3], bf16_float_neon(b.val[3])); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[3] = vaddq_f32(sum_.val[3], c.val[0]); + } + + d -= 16; + } + + if (d >= 8) { + float32x4x2_t a = vld1q_f32_x2(x + dim - d); + a.val[0] = bf16_float_neon(a.val[0]); + a.val[1] = bf16_float_neon(a.val[1]); + + { + float32x4x2_t b = vld1q_f32_x2(y0 + dim - d); + float32x4x2_t c; + c.val[0] = vmulq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vmulq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[0] = vaddq_f32(sum_.val[0], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y1 + dim - d); + float32x4x2_t c; + c.val[0] = vmulq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vmulq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[1] = vaddq_f32(sum_.val[1], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y2 + dim - d); + float32x4x2_t c; + c.val[0] = vmulq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vmulq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[2] = vaddq_f32(sum_.val[2], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y3 + dim - d); + float32x4x2_t c; + c.val[0] = vmulq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vmulq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[3] = vaddq_f32(sum_.val[3], c.val[0]); + } + + d -= 8; + } + if (d >= 4) { + float32x4_t a = vld1q_f32(x + dim - d); + a = bf16_float_neon(a); + { + float32x4_t b = vld1q_f32(y0 + dim - d); + float32x4_t c; + c = vmulq_f32(a, bf16_float_neon(b)); + sum_.val[0] = vaddq_f32(sum_.val[0], c); + } + + { + float32x4_t b = vld1q_f32(y1 + dim - d); + float32x4_t c; + c = vmulq_f32(a, bf16_float_neon(b)); + sum_.val[1] = vaddq_f32(sum_.val[1], c); + } + + { + float32x4_t b = vld1q_f32(y2 + dim - d); + float32x4_t c; + c = vmulq_f32(a, bf16_float_neon(b)); + sum_.val[2] = vaddq_f32(sum_.val[2], c); + } + { + float32x4_t b = vld1q_f32(y3 + dim - d); + float32x4_t c; + c = vmulq_f32(a, bf16_float_neon(b)); + sum_.val[3] = vaddq_f32(sum_.val[3], c); + } + + d -= 4; + } + + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4x4_t res_y = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + if (d >= 3) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 2); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 2); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 2); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 2); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 2); + + d -= 1; + } + + if (d >= 2) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 1); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 1); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 1); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 1); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 1); + + d -= 1; + } + + if (d >= 1) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 0); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 0); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 0); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 0); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 0); + + d -= 1; + } + + res_x = bf16_float_neon(res_x); + res_y.val[0] = bf16_float_neon(res_y.val[0]); + res_y.val[1] = bf16_float_neon(res_y.val[1]); + res_y.val[2] = bf16_float_neon(res_y.val[2]); + res_y.val[3] = bf16_float_neon(res_y.val[3]); + + sum_.val[0] = vaddq_f32(sum_.val[0], vmulq_f32(res_x, res_y.val[0])); + sum_.val[1] = vaddq_f32(sum_.val[1], vmulq_f32(res_x, res_y.val[1])); + sum_.val[2] = vaddq_f32(sum_.val[2], vmulq_f32(res_x, res_y.val[2])); + sum_.val[3] = vaddq_f32(sum_.val[3], vmulq_f32(res_x, res_y.val[3])); + + dis0 = vaddvq_f32(sum_.val[0]); + dis1 = vaddvq_f32(sum_.val[1]); + dis2 = vaddvq_f32(sum_.val[2]); + dis3 = vaddvq_f32(sum_.val[3]); +} + +void +fvec_L2sqr_batch_4_neon_bf16_patch(const float* x, const float* y0, const float* y1, const float* y2, const float* y3, + const size_t dim, float& dis0, float& dis1, float& dis2, float& dis3) { + float32x4x4_t sum_ = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + auto d = dim; + while (d >= 16) { + float32x4x4_t a = vld1q_f32_x4(x + dim - d); + a.val[0] = bf16_float_neon(a.val[0]); + a.val[1] = bf16_float_neon(a.val[1]); + a.val[2] = bf16_float_neon(a.val[2]); + a.val[3] = bf16_float_neon(a.val[3]); + + { + float32x4x4_t b = vld1q_f32_x4(y0 + dim - d); + float32x4x4_t c; + + c.val[0] = vsubq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vsubq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[2] = vsubq_f32(a.val[2], bf16_float_neon(b.val[2])); + c.val[3] = vsubq_f32(a.val[3], bf16_float_neon(b.val[3])); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + c.val[2] = vmulq_f32(c.val[2], c.val[2]); + c.val[3] = vmulq_f32(c.val[3], c.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[0] = vaddq_f32(sum_.val[0], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y1 + dim - d); + float32x4x4_t c; + + c.val[0] = vsubq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vsubq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[2] = vsubq_f32(a.val[2], bf16_float_neon(b.val[2])); + c.val[3] = vsubq_f32(a.val[3], bf16_float_neon(b.val[3])); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + c.val[2] = vmulq_f32(c.val[2], c.val[2]); + c.val[3] = vmulq_f32(c.val[3], c.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[1] = vaddq_f32(sum_.val[1], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y2 + dim - d); + float32x4x4_t c; + + c.val[0] = vsubq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vsubq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[2] = vsubq_f32(a.val[2], bf16_float_neon(b.val[2])); + c.val[3] = vsubq_f32(a.val[3], bf16_float_neon(b.val[3])); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + c.val[2] = vmulq_f32(c.val[2], c.val[2]); + c.val[3] = vmulq_f32(c.val[3], c.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[2] = vaddq_f32(sum_.val[2], c.val[0]); + } + + { + float32x4x4_t b = vld1q_f32_x4(y3 + dim - d); + float32x4x4_t c; + + c.val[0] = vsubq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vsubq_f32(a.val[1], bf16_float_neon(b.val[1])); + c.val[2] = vsubq_f32(a.val[2], bf16_float_neon(b.val[2])); + c.val[3] = vsubq_f32(a.val[3], bf16_float_neon(b.val[3])); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + c.val[2] = vmulq_f32(c.val[2], c.val[2]); + c.val[3] = vmulq_f32(c.val[3], c.val[3]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + c.val[2] = vaddq_f32(c.val[2], c.val[3]); + c.val[0] = vaddq_f32(c.val[0], c.val[2]); + + sum_.val[3] = vaddq_f32(sum_.val[3], c.val[0]); + } + + d -= 16; + } + + if (d >= 8) { + float32x4x2_t a = vld1q_f32_x2(x + dim - d); + a.val[0] = bf16_float_neon(a.val[0]); + a.val[1] = bf16_float_neon(a.val[1]); + { + float32x4x2_t b = vld1q_f32_x2(y0 + dim - d); + float32x4x2_t c; + + c.val[0] = vsubq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vsubq_f32(a.val[1], bf16_float_neon(b.val[1])); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[0] = vaddq_f32(sum_.val[0], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y1 + dim - d); + float32x4x2_t c; + + c.val[0] = vsubq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vsubq_f32(a.val[1], bf16_float_neon(b.val[1])); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[1] = vaddq_f32(sum_.val[1], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y2 + dim - d); + float32x4x2_t c; + + c.val[0] = vsubq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vsubq_f32(a.val[1], bf16_float_neon(b.val[1])); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[2] = vaddq_f32(sum_.val[2], c.val[0]); + } + { + float32x4x2_t b = vld1q_f32_x2(y3 + dim - d); + float32x4x2_t c; + + c.val[0] = vsubq_f32(a.val[0], bf16_float_neon(b.val[0])); + c.val[1] = vsubq_f32(a.val[1], bf16_float_neon(b.val[1])); + + c.val[0] = vmulq_f32(c.val[0], c.val[0]); + c.val[1] = vmulq_f32(c.val[1], c.val[1]); + + c.val[0] = vaddq_f32(c.val[0], c.val[1]); + sum_.val[3] = vaddq_f32(sum_.val[3], c.val[0]); + } + + d -= 8; + } + if (d >= 4) { + float32x4_t a = vld1q_f32(x + dim - d); + a = bf16_float_neon(a); + { + float32x4_t b = vld1q_f32(y0 + dim - d); + float32x4_t c; + c = vsubq_f32(a, bf16_float_neon(b)); + c = vmulq_f32(c, c); + sum_.val[0] = vaddq_f32(sum_.val[0], c); + } + + { + float32x4_t b = vld1q_f32(y1 + dim - d); + float32x4_t c; + c = vsubq_f32(a, bf16_float_neon(b)); + c = vmulq_f32(c, c); + sum_.val[1] = vaddq_f32(sum_.val[1], c); + } + + { + float32x4_t b = vld1q_f32(y2 + dim - d); + float32x4_t c; + c = vsubq_f32(a, bf16_float_neon(b)); + c = vmulq_f32(c, c); + sum_.val[2] = vaddq_f32(sum_.val[2], c); + } + { + float32x4_t b = vld1q_f32(y3 + dim - d); + float32x4_t c; + c = vsubq_f32(a, bf16_float_neon(b)); + c = vmulq_f32(c, c); + sum_.val[3] = vaddq_f32(sum_.val[3], c); + } + + d -= 4; + } + + float32x4_t res_x = vdupq_n_f32(0.0f); + float32x4x4_t res_y = {vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f), vdupq_n_f32(0.0f)}; + if (d >= 3) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 2); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 2); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 2); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 2); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 2); + + d -= 1; + } + + if (d >= 2) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 1); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 1); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 1); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 1); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 1); + + d -= 1; + } + + if (d >= 1) { + res_x = vld1q_lane_f32(x + dim - d, res_x, 0); + res_y.val[0] = vld1q_lane_f32(y0 + dim - d, res_y.val[0], 0); + res_y.val[1] = vld1q_lane_f32(y1 + dim - d, res_y.val[1], 0); + res_y.val[2] = vld1q_lane_f32(y2 + dim - d, res_y.val[2], 0); + res_y.val[3] = vld1q_lane_f32(y3 + dim - d, res_y.val[3], 0); + + d -= 1; + } + + res_x = bf16_float_neon(res_x); + res_y.val[0] = bf16_float_neon(res_y.val[0]); + res_y.val[1] = bf16_float_neon(res_y.val[1]); + res_y.val[2] = bf16_float_neon(res_y.val[2]); + res_y.val[3] = bf16_float_neon(res_y.val[3]); + + sum_.val[0] = vaddq_f32(sum_.val[0], vmulq_f32(vsubq_f32(res_x, res_y.val[0]), vsubq_f32(res_x, res_y.val[0]))); + sum_.val[1] = vaddq_f32(sum_.val[1], vmulq_f32(vsubq_f32(res_x, res_y.val[1]), vsubq_f32(res_x, res_y.val[1]))); + sum_.val[2] = vaddq_f32(sum_.val[2], vmulq_f32(vsubq_f32(res_x, res_y.val[2]), vsubq_f32(res_x, res_y.val[2]))); + sum_.val[3] = vaddq_f32(sum_.val[3], vmulq_f32(vsubq_f32(res_x, res_y.val[3]), vsubq_f32(res_x, res_y.val[3]))); + + dis0 = vaddvq_f32(sum_.val[0]); + dis1 = vaddvq_f32(sum_.val[1]); + dis2 = vaddvq_f32(sum_.val[2]); + dis3 = vaddvq_f32(sum_.val[3]); +} + } // namespace faiss #endif diff --git a/src/simd/distances_neon.h b/src/simd/distances_neon.h index c3150d16..bb4fd542 100644 --- a/src/simd/distances_neon.h +++ b/src/simd/distances_neon.h @@ -15,15 +15,33 @@ #include #include +#include "knowhere/operands.h" + namespace faiss { /// Squared L2 distance between two vectors float fvec_L2sqr_neon(const float* x, const float* y, size_t d); +float +fvec_L2sqr_neon_bf16_patch(const float* x, const float* y, size_t d); + +float +fp16_vec_L2sqr_neon(const knowhere::fp16* x, const knowhere::fp16* y, size_t d); + +float +bf16_vec_L2sqr_neon(const knowhere::bf16* x, const knowhere::bf16* y, size_t d); /// inner product float fvec_inner_product_neon(const float* x, const float* y, size_t d); +float +fvec_inner_product_neon_bf16_patch(const float* x, const float* y, size_t d); + +float +fp16_vec_inner_product_neon(const knowhere::fp16* x, const knowhere::fp16* y, size_t d); + +float +bf16_vec_inner_product_neon(const knowhere::bf16* x, const knowhere::bf16* y, size_t d); /// L1 distance float @@ -37,6 +55,12 @@ fvec_Linf_neon(const float* x, const float* y, size_t d); float fvec_norm_L2sqr_neon(const float* x, size_t d); +float +fp16_vec_norm_L2sqr_neon(const knowhere::fp16* x, size_t d); + +float +bf16_vec_norm_L2sqr_neon(const knowhere::bf16* x, size_t d); + /// compute ny square L2 distance between x and a set of contiguous y vectors void fvec_L2sqr_ny_neon(float* dis, const float* x, const float* y, size_t d, size_t ny); @@ -57,6 +81,27 @@ ivec_inner_product_neon(const int8_t* x, const int8_t* y, size_t d); int32_t ivec_L2sqr_neon(const int8_t* x, const int8_t* y, size_t d); +/// Special version of inner product that computes 4 distances +/// between x and yi, which is performance oriented. +void +fvec_inner_product_batch_4_neon(const float* x, const float* y0, const float* y1, const float* y2, const float* y3, + const size_t dim, float& dis0, float& dis1, float& dis2, float& dis3); + +void +fvec_inner_product_batch_4_neon_bf16_patch(const float* x, const float* y0, const float* y1, const float* y2, + const float* y3, const size_t dim, float& dis0, float& dis1, float& dis2, + float& dis3); + +/// Special version of L2sqr that computes 4 distances +/// between x and yi, which is performance oriented. +void +fvec_L2sqr_batch_4_neon(const float* x, const float* y0, const float* y1, const float* y2, const float* y3, + const size_t dim, float& dis0, float& dis1, float& dis2, float& dis3); + +void +fvec_L2sqr_batch_4_neon_bf16_patch(const float* x, const float* y0, const float* y1, const float* y2, const float* y3, + const size_t dim, float& dis0, float& dis1, float& dis2, float& dis3); + } // namespace faiss #endif /* DISTANCES_NEON_H */ diff --git a/src/simd/hook.cc b/src/simd/hook.cc index 5e40b3f0..48ef2c43 100644 --- a/src/simd/hook.cc +++ b/src/simd/hook.cc @@ -185,6 +185,9 @@ fvec_hook(std::string& simd_type) { ivec_inner_product = ivec_inner_product_neon; ivec_L2sqr = ivec_L2sqr_neon; + fvec_inner_product_batch_4 = fvec_inner_product_batch_4_neon; + fvec_L2sqr_batch_4 = fvec_L2sqr_batch_4_neon; + simd_type = "NEON"; support_pq_fast_scan = true; diff --git a/src/simd/simd_util.h b/src/simd/simd_util.h new file mode 100644 index 00000000..4aeb4d87 --- /dev/null +++ b/src/simd/simd_util.h @@ -0,0 +1,123 @@ +// Copyright (C) 2019-2023 Zilliz. 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. + +#ifndef SIMD_UTIL_H +#define SIMD_UTIL_H +#include + +#include "knowhere/operands.h" +#if defined(__ARM_NEON) +#include +#endif + +#if defined(__x86_64__) +#include +#endif +namespace faiss { +#if defined(__x86_64__) +#define ALIGNED(x) __attribute__((aligned(x))) + +static inline __m128 +_mm_bf16_to_fp32(const __m128i& a) { + auto o = _mm_slli_epi32(_mm_cvtepu16_epi32(a), 16); + return _mm_castsi128_ps(o); +} + +static inline __m256 +_mm256_bf16_to_fp32(const __m128i& a) { + __m256i o = _mm256_slli_epi32(_mm256_cvtepu16_epi32(a), 16); + return _mm256_castsi256_ps(o); +} + +static inline __m512 +_mm512_bf16_to_fp32(const __m256i& x) { + return _mm512_castsi512_ps(_mm512_slli_epi32(_mm512_cvtepu16_epi32(x), 16)); +} + +static inline __m128i +mm_masked_read_short(int d, const uint16_t* x) { + assert(0 <= d && d < 8); + ALIGNED(16) uint16_t buf[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + switch (d) { + case 7: + buf[6] = x[6]; + case 6: + buf[5] = x[5]; + case 5: + buf[4] = x[4]; + case 4: + buf[3] = x[3]; + case 3: + buf[2] = x[2]; + case 2: + buf[1] = x[1]; + case 1: + buf[0] = x[0]; + } + return _mm_loadu_si128((__m128i*)buf); +} + +static inline float +_mm256_reduce_add_ps(const __m256 res) { + const __m128 sum = _mm_add_ps(_mm256_castps256_ps128(res), _mm256_extractf128_ps(res, 1)); + const __m128 v0 = _mm_shuffle_ps(sum, sum, _MM_SHUFFLE(0, 0, 3, 2)); + const __m128 v1 = _mm_add_ps(sum, v0); + __m128 v2 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(0, 0, 0, 1)); + const __m128 v3 = _mm_add_ps(v1, v2); + return _mm_cvtss_f32(v3); +} +#endif + +#if defined(__ARM_NEON) +static inline float32x4x4_t +vcvt4_f32_f16(const float16x4x4_t a) { + float32x4x4_t c; + c.val[0] = vcvt_f32_f16(a.val[0]); + c.val[1] = vcvt_f32_f16(a.val[1]); + c.val[2] = vcvt_f32_f16(a.val[2]); + c.val[3] = vcvt_f32_f16(a.val[3]); + return c; +} + +static inline float32x4x2_t +vcvt2_f32_f16(const float16x4x2_t a) { + float32x4x2_t c; + c.val[0] = vcvt_f32_f16(a.val[0]); + c.val[1] = vcvt_f32_f16(a.val[1]); + return c; +} + +static inline float32x4x4_t +vcvt4_f32_half(const uint16x4x4_t x) { + float32x4x4_t c; + c.val[0] = vreinterpretq_f32_u32(vshlq_n_u32(vmovl_u16(x.val[0]), 16)); + c.val[1] = vreinterpretq_f32_u32(vshlq_n_u32(vmovl_u16(x.val[1]), 16)); + c.val[2] = vreinterpretq_f32_u32(vshlq_n_u32(vmovl_u16(x.val[2]), 16)); + c.val[3] = vreinterpretq_f32_u32(vshlq_n_u32(vmovl_u16(x.val[3]), 16)); + return c; +} + +static inline float32x4x2_t +vcvt2_f32_half(const uint16x4x2_t x) { + float32x4x2_t c; + c.val[0] = vreinterpretq_f32_u32(vshlq_n_u32(vmovl_u16(x.val[0]), 16)); + c.val[1] = vreinterpretq_f32_u32(vshlq_n_u32(vmovl_u16(x.val[1]), 16)); + return c; +} + +static inline float32x4_t +vcvt_f32_half(const uint16x4_t x) { + return vreinterpretq_f32_u32(vshlq_n_u32(vmovl_u16(x), 16)); +} + +#endif +} // namespace faiss +#endif /* SIMD_UTIL_H */ ================================================ FILE: thirdparty/knowhere.patch ================================================ diff --git a/CMakeLists.txt b/CMakeLists.txt index b7870adf..0d8fc16c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,7 +139,8 @@ if(WITH_LIGHT) GLOB_RECURSE KNOWHERE_SRCS src/common/*.cc - src/index/ivf/ivf.cc + src/index/ivf/*.cc + src/index/refine/*.cc src/index/index_node_data_mock_wrapper.cc src/index/index_static.cc src/index/index.cc diff --git a/cmake/libs/libfaiss.cmake b/cmake/libs/libfaiss.cmake index 2756fb57..635358a3 100644 --- a/cmake/libs/libfaiss.cmake +++ b/cmake/libs/libfaiss.cmake @@ -113,6 +113,7 @@ endif() if(LINUX) set(BLA_VENDOR OpenBLAS) + find_path(BLAS_INCLUDE_DIRS cblas.h PATH_SUFFIXES openblas) endif() if(APPLE) @@ -168,6 +169,7 @@ if(__X86_64) faiss PUBLIC OpenMP::OpenMP_CXX ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} faiss_avx2 faiss_avx512 knowhere_utils) target_compile_definitions(faiss PRIVATE FINTEGER=int) + target_include_directories(faiss PUBLIC ${BLAS_INCLUDE_DIRS}) endif() if(__AARCH64) @@ -190,6 +192,7 @@ if(__AARCH64) target_link_libraries(faiss PUBLIC OpenMP::OpenMP_CXX ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} knowhere_utils) target_compile_definitions(faiss PRIVATE FINTEGER=int) + target_include_directories(faiss PUBLIC ${BLAS_INCLUDE_DIRS}) endif() if(__PPC64) @@ -217,4 +220,5 @@ if(__PPC64) target_link_libraries(faiss PUBLIC OpenMP::OpenMP_CXX ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} knowhere_utils) target_compile_definitions(faiss PRIVATE FINTEGER=int) + target_include_directories(faiss PUBLIC ${BLAS_INCLUDE_DIRS}) endif() ================================================ FILE: thirdparty/milvus.patch ================================================ diff --git a/internal/core/cmake/Utils.cmake b/internal/core/cmake/Utils.cmake index 8facf7cccd..f0d75bf8be 100644 --- a/internal/core/cmake/Utils.cmake +++ b/internal/core/cmake/Utils.cmake @@ -101,12 +101,32 @@ macro(create_library) target_compile_definitions(${L_TARGET} PRIVATE ${L_DEFS}) endmacro() +macro(add_source_at_current_directory) + file(GLOB SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" "*.cpp" "*.c" "*.cxx") + message(STATUS "${CMAKE_CURRENT_SOURCE_DIR} add new source files at current directory: ${SOURCE_FILES}") +endmacro() + +macro(add_source_at_current_directory_with_exclude) + file(GLOB SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" "*.cpp" "*.c" "*.cxx") + # Exclude files matching patterns + list(FILTER SOURCE_FILES EXCLUDE REGEX ".*_test\\.cc$") + list(FILTER SOURCE_FILES EXCLUDE REGEX ".*_test\\.cpp$") + list(FILTER SOURCE_FILES EXCLUDE REGEX ".*_mock\\.cc$") + list(FILTER SOURCE_FILES EXCLUDE REGEX ".*_mock\\.cpp$") + message(STATUS "${CMAKE_CURRENT_SOURCE_DIR} add new source files at current directory: ${SOURCE_FILES}") +endmacro() + macro(add_source_at_current_directory_recursively) file(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" "*.cpp" "*.c" "*.cxx") message(STATUS "${CMAKE_CURRENT_SOURCE_DIR} add new source files at current directory recursively: ${SOURCE_FILES}") endmacro() -macro(add_source_at_current_directory) - file(GLOB SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" "*.cpp" "*.c" "*.cxx") - message(STATUS "${CMAKE_CURRENT_SOURCE_DIR} add new source files at current directory: ${SOURCE_FILES}") +macro(add_source_at_current_directory_recursively_with_exclude) + file(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" "*.cpp" "*.c" "*.cxx") + # Exclude files matching patterns + list(FILTER SOURCE_FILES EXCLUDE REGEX ".*_test\\.cc$") + list(FILTER SOURCE_FILES EXCLUDE REGEX ".*_test\\.cpp$") + list(FILTER SOURCE_FILES EXCLUDE REGEX ".*_mock\\.cc$") + list(FILTER SOURCE_FILES EXCLUDE REGEX ".*_mock\\.cpp$") + message(STATUS "${CMAKE_CURRENT_SOURCE_DIR} add new source files at current directory recursively: ${SOURCE_FILES}") endmacro() diff --git a/internal/core/src/common/Tracer.cpp b/internal/core/src/common/Tracer.cpp index c60f8ad3cb..c2ea1316d6 100644 --- a/internal/core/src/common/Tracer.cpp +++ b/internal/core/src/common/Tracer.cpp @@ -10,8 +10,11 @@ // or implied. See the License for the specific language governing permissions and limitations under the License #include "Tracer.h" +#ifndef MILVUS_LITE #include #include +#endif + #include "log/Log.h" #include @@ -20,6 +23,7 @@ #include #include +#ifndef MILVUS_LITE #include "opentelemetry/exporters/jaeger/jaeger_exporter_factory.h" #include "opentelemetry/exporters/ostream/span_exporter_factory.h" #include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h" @@ -34,7 +38,6 @@ #include "opentelemetry/trace/span_metadata.h" namespace milvus::tracer { - namespace trace = opentelemetry::trace; namespace nostd = opentelemetry::nostd; @@ -276,5 +279,126 @@ AutoSpan::~AutoSpan() { CloseRootSpan(); } } +#endif + +#ifdef MILVUS_LITE +namespace milvus::tracer { +static std::atomic enable_trace = true; +void +initTelemetry(const TraceConfig& cfg) { +} + +std::string +GetTraceID() { + return std::string(); +} + +std::string +GetTraceIDAsHexStr(const TraceContext* ctx) { + return std::string(); +} + +std::shared_ptr +GetTracer() { + return std::make_shared(); +} + +std::shared_ptr +StartSpan(const std::string& name, TraceContext* parentCtx) { + return std::make_shared(); +} + +std::shared_ptr +StartSpan(const std::string& name, const std::shared_ptr& span) { + return std::make_shared(); +} + +thread_local std::shared_ptr local_span; +void +SetRootSpan(std::shared_ptr span) { +} + +void +CloseRootSpan() { +} + +std::shared_ptr +GetRootSpan() { + if (enable_trace) { + return local_span; + } + return nullptr; +} + +std::string +GetSpanIDAsHexStr(const TraceContext* ctx) { + return std::string(); +} + +void +AddEvent(const std::string& event_label) { +} + +bool +isEmptyID(const uint8_t* id, int length) { + if (id != nullptr) { + for (int i = 0; i < length; i++) { + if (id[i] != 0) { + return false; + } + } + } + return true; +} + +bool +EmptyTraceID(const TraceContext* ctx) { + return true; +} + +bool +EmptySpanID(const TraceContext* ctx) { + return true; +} + +std::vector +GetTraceIDAsVector(const TraceContext* ctx) { + return {}; +} + +std::vector +GetSpanIDAsVector(const TraceContext* ctx) { + return {}; +} + +AutoSpan::AutoSpan(const std::string& name, + TraceContext* ctx, + bool is_root_span) + : is_root_span_(is_root_span) { + span_ = StartSpan(name, ctx); + if (is_root_span) { + SetRootSpan(span_); + } +} + +AutoSpan::AutoSpan(const std::string& name, + const std::shared_ptr& span) + : is_root_span_(false) { + span_ = StartSpan(name, span); +} +std::shared_ptr +AutoSpan::GetSpan() { + return span_; +} + +AutoSpan::~AutoSpan() { + if (span_ != nullptr) { + span_->End(); + } + if (is_root_span_) { + CloseRootSpan(); + } +} } // namespace milvus::tracer +#endif \ No newline at end of file diff --git a/internal/core/src/common/Tracer.h b/internal/core/src/common/Tracer.h index fce14d393b..6ee06daa2b 100644 --- a/internal/core/src/common/Tracer.h +++ b/internal/core/src/common/Tracer.h @@ -14,10 +14,32 @@ #include #include +#ifndef MILVUS_LITE #include "opentelemetry/trace/provider.h" +#endif #define TRACE_SERVICE_SEGCORE "segcore" +namespace trace { + +#ifdef MILVUS_LITE +class Span { + public: + void + End() { + } +}; +class Tracer { + public: + static int + WithActiveSpan(std::shared_ptr& span) noexcept { + return 0; + } +}; + +}; // namespace trace +#endif + namespace milvus::tracer { struct TraceConfig { @@ -36,7 +58,10 @@ struct TraceContext { const uint8_t* spanID = nullptr; uint8_t traceFlags = 0; }; + +#ifndef MILVUS_LITE namespace trace = opentelemetry::trace; +#endif void initTelemetry(const TraceConfig& cfg); diff --git a/internal/core/src/storage/CMakeLists.txt b/internal/core/src/storage/CMakeLists.txt index b88211bb87..a158becd37 100644 --- a/internal/core/src/storage/CMakeLists.txt +++ b/internal/core/src/storage/CMakeLists.txt @@ -16,6 +16,14 @@ add_source_at_current_directory() +# Exclude specific files +list(FILTER SOURCE_FILES EXCLUDE REGEX "^Aliyun.*\\.cpp$") +list(FILTER SOURCE_FILES EXCLUDE REGEX "^Minio.*\\.cpp$") +list(FILTER SOURCE_FILES EXCLUDE REGEX "^ChunkManager.cpp$") +list(FILTER SOURCE_FILES EXCLUDE REGEX "^TencentCloud.*\\.cpp$") + +message("SOURCE_FILES: ${SOURCE_FILES}") + if (ENABLE_GCP_NATIVE) add_definitions(-DENABLE_GCP_NATIVE) add_subdirectory(gcp-native-storage) diff --git a/internal/core/src/storage/ChunkManager.cpp b/internal/core/src/storage/ChunkManager.cpp index c6d8908625..c60bc74c6b 100644 --- a/internal/core/src/storage/ChunkManager.cpp +++ b/internal/core/src/storage/ChunkManager.cpp @@ -15,6 +15,7 @@ // limitations under the License. #include +#ifndef MILVUS_LITE #include #include #include @@ -28,11 +29,13 @@ #include #include + #include "storage/MinioChunkManager.h" #include "storage/AliyunSTSClient.h" #include "storage/TencentCloudSTSClient.h" #include "storage/AliyunCredentialsProvider.h" #include "storage/TencentCloudCredentialsProvider.h" +#endif #include "common/Consts.h" #include "common/EasyAssert.h" #include "log/Log.h" diff --git a/internal/core/src/storage/LocalChunkManager.cpp b/internal/core/src/storage/LocalChunkManager.cpp index be97ee000b..57e4c77dcb 100644 --- a/internal/core/src/storage/LocalChunkManager.cpp +++ b/internal/core/src/storage/LocalChunkManager.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "common/EasyAssert.h" #include "common/Exception.h" diff --git a/internal/core/src/storage/Util.cpp b/internal/core/src/storage/Util.cpp index 85ec72152c..f0dbee476c 100644 --- a/internal/core/src/storage/Util.cpp +++ b/internal/core/src/storage/Util.cpp @@ -37,7 +37,9 @@ #include "storage/InsertData.h" #include "storage/LocalChunkManager.h" #include "storage/MemFileManagerImpl.h" +#ifndef MILVUS_LITE #include "storage/MinioChunkManager.h" +#endif #ifdef USE_OPENDAL #include "storage/opendal/OpenDALChunkManager.h" #endif @@ -750,6 +752,7 @@ CreateChunkManager(const StorageConfig& storage_config) { return std::make_shared( storage_config.root_path); } +#ifndef MILVUS_LITE case ChunkManagerType::Minio: { return std::make_shared(storage_config); } @@ -770,22 +773,19 @@ CreateChunkManager(const StorageConfig& storage_config) { return std::make_shared( storage_config); } -#ifdef AZURE_BUILD_DIR case CloudProviderType::AZURE: { return std::make_shared(storage_config); } -#endif -#ifdef ENABLE_GCP_NATIVE case CloudProviderType::GCPNATIVE: { return std::make_shared( storage_config); } -#endif default: { return std::make_shared(storage_config); } } } +#endif #ifdef USE_OPENDAL case ChunkManagerType::OpenDAL: { return std::make_shared(storage_config); diff --git a/internal/core/thirdparty/knowhere/CMakeLists.txt b/internal/core/thirdparty/knowhere/CMakeLists.txt index f06d350ed9..858d01874f 100644 --- a/internal/core/thirdparty/knowhere/CMakeLists.txt +++ b/internal/core/thirdparty/knowhere/CMakeLists.txt @@ -22,6 +22,8 @@ message(STATUS "Knowhere version: ${KNOWHERE_VERSION}") message(STATUS "Building knowhere-${KNOWHERE_SOURCE_VER} from source") message(STATUS ${CMAKE_BUILD_TYPE}) +set(WITH_LIGHT ON ) + if ( BUILD_DISK_ANN STREQUAL "ON" ) set(WITH_DISKANN ON CACHE BOOL "" FORCE ) else () @@ -45,12 +47,35 @@ FetchContent_Declare( GIT_TAG ${KNOWHERE_VERSION} SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/knowhere-src BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/knowhere-build - DOWNLOAD_DIR ${THIRDPARTY_DOWNLOAD_PATH} ) + DOWNLOAD_DIR ${THIRDPARTY_DOWNLOAD_PATH} + ) FetchContent_GetProperties( knowhere ) if ( NOT knowhere_POPULATED ) FetchContent_Populate( knowhere ) + execute_process(COMMAND git diff --quiet + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/knowhere-src + RESULT_VARIABLE KNOWHERE_CHECK_RESULT + ) + + if(${KNOWHERE_CHECK_RESULT} EQUAL 0) + if(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR STREQUAL + "aarch64") + message("Apply knowhere android patch...") + execute_process(COMMAND git apply ${CMAKE_SOURCE_DIR}/thirdparty/knowhere-android.patch + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/knowhere-src + OUTPUT_VARIABLE result + ) + else() + message("Apply knowhere patch...") + execute_process(COMMAND git apply ${CMAKE_SOURCE_DIR}/thirdparty/knowhere.patch + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/knowhere-src + OUTPUT_VARIABLE result + ) + endif() + endif() + # Adding the following target: # knowhere add_subdirectory( ${knowhere_SOURCE_DIR} diff --git a/internal/core/thirdparty/tantivy/tokenizer.h b/internal/core/thirdparty/tantivy/tokenizer.h index c4be0ee314..79536f1c7d 100644 --- a/internal/core/thirdparty/tantivy/tokenizer.h +++ b/internal/core/thirdparty/tantivy/tokenizer.h @@ -5,6 +5,7 @@ #include "rust-hashmap.h" #include "tantivy/rust-array.h" #include "token-stream.h" +#include "common/EasyAssert.h" namespace milvus::tantivy {