From d9cdcf17215db0d61cd86fc9724bcb2740377cae Mon Sep 17 00:00:00 2001 From: Laura Glendenning Date: Wed, 4 Aug 2021 11:38:21 -0400 Subject: [PATCH] Updates from internal development branch. This includes two main features: 1. Add/fix status/train/predict endpoints for pipelines. 2. Add OpenAPI specification for backend API. --- .gitignore | 1 + README.md | 14 + backend/pine/backend/admin/bp.py | 14 +- backend/pine/backend/admin/openapi.yaml | 361 ++ backend/pine/backend/annotations/bp.py | 47 +- backend/pine/backend/annotations/openapi.yaml | 211 + backend/pine/backend/api/.gitignore | 3 + backend/pine/backend/api/__init__.py | 4 + backend/pine/backend/api/base.yaml | 34 + backend/pine/backend/api/bp.py | 34 + backend/pine/backend/api/components.yaml | 611 +++ .../pine/backend/api/download_swagger_ui.sh | 22 + backend/pine/backend/api/openapi.yaml | 4325 +++++++++++++++++ backend/pine/backend/api/swagger-ui/VERSION | 1 + .../backend/api/swagger-ui/favicon-16x16.png | Bin 0 -> 665 bytes .../backend/api/swagger-ui/favicon-32x32.png | Bin 0 -> 628 bytes .../pine/backend/api/swagger-ui/index.html | 60 + .../api/swagger-ui/oauth2-redirect.html | 75 + .../api/swagger-ui/swagger-ui-bundle.js | 3 + .../api/swagger-ui/swagger-ui-bundle.js.map | 1 + .../swagger-ui/swagger-ui-es-bundle-core.js | 3 + .../swagger-ui-es-bundle-core.js.map | 1 + .../api/swagger-ui/swagger-ui-es-bundle.js | 3 + .../swagger-ui/swagger-ui-es-bundle.js.map | 1 + .../swagger-ui-standalone-preset.js | 3 + .../swagger-ui-standalone-preset.js.map | 1 + .../backend/api/swagger-ui/swagger-ui.css | 4 + .../backend/api/swagger-ui/swagger-ui.css.map | 1 + .../pine/backend/api/swagger-ui/swagger-ui.js | 3 + .../backend/api/swagger-ui/swagger-ui.js.map | 1 + backend/pine/backend/app.py | 3 + backend/pine/backend/auth/bp.py | 4 +- backend/pine/backend/auth/openapi.yaml | 410 ++ backend/pine/backend/collections/__init__.py | 2 +- backend/pine/backend/collections/bp.py | 21 +- backend/pine/backend/collections/openapi.yaml | 715 +++ backend/pine/backend/documents/openapi.yaml | 329 ++ backend/pine/backend/job_manager/service.py | 124 +- backend/pine/backend/pineiaa/bp.py | 9 +- backend/pine/backend/pineiaa/openapi.yaml | 72 + backend/pine/backend/pipelines/bp.py | 384 +- backend/pine/backend/pipelines/openapi.yaml | 541 +++ backend/pine/backend/shared/config.py | 6 +- client/pine/client/client.py | 185 + .../autoapi/pine/backend/api/bp/index.doctree | Bin 0 -> 13532 bytes .../autoapi/pine/backend/api/index.doctree | Bin 0 -> 3751 bytes .../pine/backend/collections/bp/index.doctree | Bin 93197 -> 93590 bytes .../pine/backend/collections/index.doctree | Bin 17934 -> 21206 bytes .../autoapi/pine/backend/index.doctree | Bin 9592 -> 9633 bytes .../backend/job_manager/service/index.doctree | Bin 51041 -> 77830 bytes .../pine/backend/pipelines/bp/index.doctree | Bin 37455 -> 79257 bytes .../autoapi/pine/client/client/index.doctree | Bin 365463 -> 430412 bytes .../autoapi/pine/client/index.doctree | Bin 318435 -> 383476 bytes .../pine/pipelines/EveClient/index.doctree | Bin 20167 -> 35195 bytes .../pine/pipelines/NER_API/index.doctree | Bin 18413 -> 30610 bytes .../pipelines/RankingFunctions/index.doctree | Bin 23656 -> 53467 bytes .../listener/service_listener/index.doctree | Bin 39750 -> 49617 bytes .../corenlp_NER_pipeline/index.doctree | Bin 33322 -> 40938 bytes .../opennlp_NER_pipeline/index.doctree | Bin 33939 -> 42589 bytes .../pine/pipelines/pipeline/index.doctree | Bin 14849 -> 51601 bytes .../pine/pipelines/pmap_ner/index.doctree | Bin 21577 -> 26600 bytes .../pipelines/shared/config/index.doctree | Bin 68210 -> 69066 bytes .../spacy_NER_pipeline/index.doctree | Bin 22910 -> 30645 bytes docs/build/doctrees/environment.pickle | Bin 3318562 -> 3490464 bytes .../autoapi/pine/backend/api/bp/index.rst.txt | 43 + .../autoapi/pine/backend/api/index.rst.txt | 21 + .../pine/backend/collections/bp/index.rst.txt | 2 +- .../pine/backend/collections/index.rst.txt | 8 + .../autoapi/pine/backend/index.rst.txt | 1 + .../backend/job_manager/service/index.rst.txt | 63 +- .../pine/backend/pipelines/bp/index.rst.txt | 80 +- .../autoapi/pine/client/client/index.rst.txt | 154 + .../autoapi/pine/client/index.rst.txt | 154 + .../pine/pipelines/EveClient/index.rst.txt | 29 +- .../pine/pipelines/NER_API/index.rst.txt | 23 +- .../pipelines/RankingFunctions/index.rst.txt | 21 +- .../listener/service_listener/index.rst.txt | 46 +- .../corenlp_NER_pipeline/index.rst.txt | 23 +- .../opennlp_NER_pipeline/index.rst.txt | 22 +- .../pine/pipelines/pipeline/index.rst.txt | 56 +- .../pine/pipelines/pmap_ner/index.rst.txt | 15 +- .../pipelines/shared/config/index.rst.txt | 5 + .../spacy_NER_pipeline/index.rst.txt | 31 +- docs/build/html/autoapi/index.html | 4 + .../pine/backend/annotations/bp/index.html | 10 +- .../autoapi/pine/backend/api/bp/index.html | 198 + .../html/autoapi/pine/backend/api/index.html | 139 + .../html/autoapi/pine/backend/auth/index.html | 10 +- .../pine/backend/collections/bp/index.html | 4 +- .../pine/backend/collections/index.html | 12 + .../pine/backend/data/service/index.html | 22 +- .../html/autoapi/pine/backend/index.html | 4 + .../backend/job_manager/service/index.html | 82 +- .../pine/backend/pipelines/bp/index.html | 190 +- .../autoapi/pine/client/client/index.html | 336 +- .../autoapi/pine/client/exceptions/index.html | 8 +- .../build/html/autoapi/pine/client/index.html | 266 + docs/build/html/autoapi/pine/index.html | 4 + .../pine/pipelines/EveClient/index.html | 49 +- .../autoapi/pine/pipelines/NER_API/index.html | 34 +- .../pipelines/RankingFunctions/index.html | 38 +- .../app/listener/service_listener/index.html | 61 +- .../pipelines/corenlp_NER_pipeline/index.html | 30 +- .../pipelines/opennlp_NER_pipeline/index.html | 32 +- .../pine/pipelines/pipeline/index.html | 96 +- .../pine/pipelines/pmap_ner/index.html | 20 +- .../pine/pipelines/shared/config/index.html | 6 + .../pipelines/spacy_NER_pipeline/index.html | 40 +- docs/build/html/genindex.html | 288 +- docs/build/html/objects.inv | Bin 7982 -> 8626 bytes docs/build/html/py-modindex.html | 10 + docs/build/html/searchindex.js | 2 +- docs/build/latex/pine.pdf | Bin 433319 -> 472516 bytes docs/build/latex/pine.tex | 1646 ++++++- docs/build/singlehtml/index.html | 1285 ++++- docs/build/singlehtml/objects.inv | Bin 8072 -> 8728 bytes .../nginx/nlp-web-app.http.mustache | 1 + .../nginx/nlp-web-app.https.mustache | 2 + .../app/service/metrics/metrics.service.ts | 7 +- pipelines/Pipfile | 2 + pipelines/Pipfile.lock | 203 +- pipelines/pine/pipelines/EveClient.py | 22 +- pipelines/pine/pipelines/NERWrapper.py | 2 + pipelines/pine/pipelines/NER_API.py | 94 +- pipelines/pine/pipelines/RankingFunctions.py | 371 +- .../app/listener/service_listener.py | 192 +- .../pine/pipelines/corenlp_NER_pipeline.py | 197 +- .../pine/pipelines/opennlp_NER_pipeline.py | 265 +- pipelines/pine/pipelines/pipeline.py | 71 +- pipelines/pine/pipelines/pmap_ner.py | 49 +- pipelines/pine/pipelines/shared/config.py | 7 +- .../pine/pipelines/spacy_NER_pipeline.py | 161 +- run_docker_compose.sh | 2 +- test/Pipfile | 1 + test/Pipfile.lock | 577 ++- test/data/collections.json | 60 + test/docker/pytest/docker_run.sh | 2 +- test/tests/pytest/02_collections_test.py | 44 + test/tests/pytest/04_pipelines_test.py | 226 + test/tests/pytest/common.py | 28 +- update_openapi.sh | 32 + 141 files changed, 15439 insertions(+), 1549 deletions(-) create mode 100644 backend/pine/backend/admin/openapi.yaml create mode 100644 backend/pine/backend/annotations/openapi.yaml create mode 100644 backend/pine/backend/api/.gitignore create mode 100644 backend/pine/backend/api/__init__.py create mode 100644 backend/pine/backend/api/base.yaml create mode 100644 backend/pine/backend/api/bp.py create mode 100644 backend/pine/backend/api/components.yaml create mode 100755 backend/pine/backend/api/download_swagger_ui.sh create mode 100644 backend/pine/backend/api/openapi.yaml create mode 100644 backend/pine/backend/api/swagger-ui/VERSION create mode 100644 backend/pine/backend/api/swagger-ui/favicon-16x16.png create mode 100644 backend/pine/backend/api/swagger-ui/favicon-32x32.png create mode 100644 backend/pine/backend/api/swagger-ui/index.html create mode 100644 backend/pine/backend/api/swagger-ui/oauth2-redirect.html create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui-bundle.js create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui-bundle.js.map create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui-es-bundle-core.js create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui-es-bundle-core.js.map create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui-es-bundle.js create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui-es-bundle.js.map create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui-standalone-preset.js create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui-standalone-preset.js.map create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui.css create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui.css.map create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui.js create mode 100644 backend/pine/backend/api/swagger-ui/swagger-ui.js.map create mode 100644 backend/pine/backend/auth/openapi.yaml create mode 100644 backend/pine/backend/collections/openapi.yaml create mode 100644 backend/pine/backend/documents/openapi.yaml create mode 100644 backend/pine/backend/pineiaa/openapi.yaml create mode 100644 backend/pine/backend/pipelines/openapi.yaml create mode 100644 docs/build/doctrees/autoapi/pine/backend/api/bp/index.doctree create mode 100644 docs/build/doctrees/autoapi/pine/backend/api/index.doctree create mode 100644 docs/build/html/_sources/autoapi/pine/backend/api/bp/index.rst.txt create mode 100644 docs/build/html/_sources/autoapi/pine/backend/api/index.rst.txt create mode 100644 docs/build/html/autoapi/pine/backend/api/bp/index.html create mode 100644 docs/build/html/autoapi/pine/backend/api/index.html create mode 100644 test/tests/pytest/04_pipelines_test.py create mode 100755 update_openapi.sh diff --git a/.gitignore b/.gitignore index 02c0b30..e94cbe7 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ # Python **/__pycache__ +**/.pytest_cache # Logs backend/pine/backend/logs diff --git a/README.md b/README.md index f5be26d..84e3e0f 100644 --- a/README.md +++ b/README.md @@ -150,6 +150,20 @@ Once the dev stack is up and running, the following ports are accessible: 2. `./generate_documentation.sh` 3. Generated documentation can then be found in `./docs/build`. +### Backend OpenAPI Specification + +The backend API is documented using an [OpenAPI specification](https://swagger.io/specification/). +This specification covers the main REST API used by PINE. A copy of the +[Swagger UI](https://swagger.io/tools/swagger-ui/) is hosted at `http[s]:///api/ui` and +the specification itself is hosted at `http[s]:///api/openapi.yaml`. + +This specification is found in the source code at `backend/pine/backend/api/openapi.yaml`. +*NOTE* however that this file is autogenerated by the `./update_openapi.sh` script. The "base" +file is located at `backend/pine/backend/api/base.yaml` which then pulls in information from other +files. ALL changes to the backend API should result in updates to the specification, as it is *NOT* +automatically updated or generated based on code changes. The `./update_openapi.sh` script requires +Docker to run and standard Linux tools (find, grep, awk, sort) but no other dependencies. + ### Testing Data To import testing data, run the dev stack and then run: diff --git a/backend/pine/backend/admin/bp.py b/backend/pine/backend/admin/bp.py index 662ecd7..cc0d596 100644 --- a/backend/pine/backend/admin/bp.py +++ b/backend/pine/backend/admin/bp.py @@ -1,6 +1,6 @@ # (C) 2019 The Johns Hopkins University Applied Physics Laboratory LLC. -from flask import Blueprint, jsonify, request, Response +from flask import Blueprint, jsonify, request import requests from werkzeug import exceptions @@ -29,7 +29,7 @@ def get_user(user_id): """ return jsonify(users.get_user(user_id)) -@bp.route("/users//password", methods = ["POST", "PUT", "PATCH"]) +@bp.route("/users//password", methods = ["PUT"]) @auth.admin_required def update_user_password(user_id): """ @@ -48,7 +48,7 @@ def update_user_password(user_id): resp = service.put("users/" + user_id, json = user, headers = {"If-Match": etag}) return service.convert_response(resp) -@bp.route("/users/", methods = ["PUT", "PATCH"]) +@bp.route("/users/", methods = ["PUT"]) @auth.admin_required def update_user(user_id): """ @@ -98,7 +98,13 @@ def add_user(): body["_id"] = body["id"] del body["id"] - if body["description"] == None: + + # check other fields as required by eve schema + if not "firstname" in body or not body["firstname"] or "lastname" not in body or not body["lastname"]: + raise exceptions.BadRequest(description = "Missing firstname or lastname in body JSON data.") + if not "roles" in body or not body["roles"]: + raise exceptions.BadRequest(description = "Missing/empty roles in body JSON data.") + if "description" in body and body["description"] == None: del body["description"] # post to data server diff --git a/backend/pine/backend/admin/openapi.yaml b/backend/pine/backend/admin/openapi.yaml new file mode 100644 index 0000000..ef986c5 --- /dev/null +++ b/backend/pine/backend/admin/openapi.yaml @@ -0,0 +1,361 @@ +# (C) 2021 The Johns Hopkins University Applied Physics Laboratory LLC. + +openapi: "3.0.2" + +security: + - cookieAuth: [] + +tags: + - name: admin + description: > + Operations in the "admin" blueprint. These operations are generally only available when the + "eve" auth module is running and are only accessible to logged-in users that are + administrators. + +components: + + schemas: + + UserRoles: + description: The role (for permissions) of the user. + type: array + items: + type: string + enum: [administrator, user] + + NewUserData: + type: object + properties: + id: + type: string + email: + type: string + passwd: + type: string + description: + type: string + firstname: + type: string + lastname: + type: string + role: + $ref: "#/components/schemas/UserRoles" + required: + - id + - email + - passwd + - firstname + - lastname + - roles + + UpdateUserData: + type: object + properties: + _id: + type: string + _etag: + type: string + description: + type: string + firstname: + type: string + lastname: + type: string + email: + type: string + description: If this is not included, you wont be able to log in. + passwdhash: + type: string + description: Setting this manually might break the password. + role: + $ref: "#/components/schemas/UserRoles" + required: + - _id + - _etag + - firstname + - lastname + - passwdhash + - role + +paths: + + /admin/users: + get: + summary: Get All User Information + description: | + Get a list of all users (and details: id, email, password hash). + + Example: `curl -X GET http://localhost:5000/admin/users --cookie admin.cookie` + + _Note_: this endpoint requires the logged in user to be an admin and is only relevant if + the auth module supports it. + operationId: admin_get_users + tags: [admin] + responses: + "200": + description: Returned list of user details. + content: + application/json: + schema: + type: array + items: + $ref: "../api/components.yaml#/schemas/UserInfo" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorizedOrNotAdmin" + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + post: + summary: Create New User + description: | + Create a new user. + + Example: `curl -X Post http://localhost:5000/admin/users -d '{"id":"joe", "passwd":"mypass", "email":"joe@pine.jhuapl.edu", "description": "", "firstname":"joe", "lastname":"jones"}' -H "Content-type:application/json" --cookie admin.cookie` + + _Note_: this endpoint requires the logged in user to be an admin and is only relevant if + the auth module supports it. + operationId: admin_add_user + tags: [admin] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/NewUserData" + responses: + "200": + description: Return id info of newly created user. + content: + application/json: + schema: + type: array + items: + $ref: "../api/components.yaml#/schemas/IDInfo" + "400": + $ref: "../api/components.yaml#/responses/InvalidInputParameters" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorizedOrNotAdmin" + "409": + description: User with that ID/email already exists. + content: {application/json: {schema: {$ref: "../api/components.yaml#/schemas/ErrorResponse"}}} + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + /admin/users/{user_id}: + get: + summary: Get User Details + description: | + Get details (id, email, password hash...) of a certain user. + + Example: `curl -X GET http://localhost:5000/admin/users/ada --cookie admin.cookie` + + _Note_: this endpoint requires the logged in user to be an admin and is only relevant if + the auth module supports it. + operationId: admin_get_user + tags: [admin] + parameters: + - $ref: "../api/components.yaml#/parameters/userIdParam" + responses: + "200": + description: Successfully found the user and returned their details. + content: + application/json: + schema: + $ref: "../api/components.yaml#/schemas/UserInfo" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorizedOrNotAdmin" + "404": + description: No user found with that ID. + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + put: + summary: Update user details. + description: | + Update user details. + + Example: `curl -X PUT http://localhost:5000/admin/users/ada -d '{"_id":"ada","description":"newdesc", "firstname":"newada", "lastname":"adalast", "_etag":"1c12354ee74f5d5732231ac5034f7915fb167244", "email":"ada@pine.jhuapl.edu"}' -H "Content-type:application/json" --cookie admin.cookie` + + _Note_: this endpoint requires the logged in user to be an admin and is only relevant if + the auth module supports it. + operationId: admin_update_user + tags: [admin] + parameters: + - $ref: "../api/components.yaml#/parameters/userIdParam" + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateUserData" + responses: + "200": + description: Successfully changed user information + content: + application/json: + schema: + $ref: "../api/components.yaml#/schemas/IDInfo" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorizedOrNotAdmin" + "404": + description: No user found with that ID. + "412": + $ref: "../api/components.yaml#/responses/MismatchedEtag" + "422": + $ref: "../api/components.yaml#/responses/InvalidInputParameters" + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + delete: + summary: Delete User + description: | + Delete a user. + + _Note_: this endpoint requires the logged in user to be an admin and is only relevant if + the auth module supports it. + operationId: admin_delete_user + tags: [admin] + parameters: + - $ref: "../api/components.yaml#/parameters/userIdParam" + responses: + "204": + description: Successfully deleted user. + "401": + $ref: "../api/components.yaml#/responses/NotAuthorizedOrNotAdmin" + "404": + description: No user found with that ID. + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + /admin/users/{user_id}/password: + put: + summary: Update User Password + description: | + Update the password of a user. + + Example: `curl -X post http://localhost:5000/admin/users/ada/password -d '{"passwd":"newpass"}' -H "Content-type:application/json" --cookie admin.cookie` + + _Note_: this endpoint requires the logged in user to be an admin and is only relevant if + the auth module supports it. + operationId: admin_update_user_password + tags: [admin] + parameters: + - $ref: "../api/components.yaml#/parameters/userIdParam" + requestBody: + content: + application/json: + schema: + type: object + properties: + passwd: + type: string + required: + - passwd + responses: + "200": + description: "Successfully changed user password" + content: + application/json: + schema: + $ref: "../api/components.yaml#/schemas/IDInfo" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorizedOrNotAdmin" + "404": + description: No user found with that ID. + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + /admin/system/export: + get: + summary: Export Database + description: | + Export the database to a zip file. + + Example: `curl -X GET http://localhost:5000/admin/system/export --cookie admin.cookie -v --output out.zip` + + _Note_: this endpoint requires the logged in user to be an admin and is only relevant if + the auth module supports it. + operationId: admin_system_export + tags: [admin] + responses: + "200": + description: "Successfully exported database" + content: + application/gzip: {} + "401": + $ref: "../api/components.yaml#/responses/NotAuthorizedOrNotAdmin" + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + /admin/system/import: + put: + summary: Import Database (Update) + description: | + Import the database given in request body. This will _update_ and not _replace_ the + database. + + Example: `curl -X PUT http://localhost:5000/admin/system/import --cookie admin.cookie -F "file=@/home/pine/out.zip"` + + _Note_: this endpoint requires the logged in user to be an admin and is only relevant if + the auth module supports it. + operationId: admin_system_import_put + tags: [admin] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + required: + - file + responses: + "200": + $ref: "../api/components.yaml#/responses/Success" + "400": + description: The loading of data was wrong. Should be a gz, like what is exported. + content: {application/json: {schema: {$ref: "../api/components.yaml#/schemas/ErrorResponse"}}} + "401": + $ref: "../api/components.yaml#/responses/NotAuthorizedOrNotAdmin" + "422": + description: The file argument was not present. + content: {application/json: {schema: {$ref: "../api/components.yaml#/schemas/ErrorResponse"}}} + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + post: + summary: Import Database (Replace) + description: | + Import the database given in request body. This will _replace_ and not _update_ the + database. + + Example: `curl -X POST http://localhost:5000/admin/system/import --cookie admin.cookie -F "file=@/home/pine/out.zip"` + + _Note_: this endpoint requires the logged in user to be an admin and is only relevant if + the auth module supports it. + operationId: admin_system_import_post + tags: [admin] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + required: + - file + responses: + "200": + $ref: "../api/components.yaml#/responses/Success" + "400": + description: The loading of data was wrong. Should be a gz, like what is exported. + content: {application/json: {schema: {$ref: "../api/components.yaml#/schemas/ErrorResponse"}}} + "401": + $ref: "../api/components.yaml#/responses/NotAuthorizedOrNotAdmin" + "422": + description: The file argument was not present. + content: {application/json: {schema: {$ref: "../api/components.yaml#/schemas/ErrorResponse"}}} + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" diff --git a/backend/pine/backend/annotations/bp.py b/backend/pine/backend/annotations/bp.py index c9cf820..950bff6 100644 --- a/backend/pine/backend/annotations/bp.py +++ b/backend/pine/backend/annotations/bp.py @@ -204,7 +204,7 @@ def _add_or_update_annotation(new_annotation): return new_annotation["_id"] -@bp.route("/mine/by_document_id/", methods = ["POST", "PUT"]) +@bp.route("/mine/by_document_id/", methods = ["POST"]) def save_annotations(doc_id): """ Save new NER annotations and labels to the database as an entry for the logged in user, for the document. If there @@ -254,7 +254,7 @@ def save_annotations(doc_id): return jsonify(resp) -@bp.route("/mine/by_collection_id/", methods = ["POST", "PUT"]) +@bp.route("/mine/by_collection_id/", methods = ["POST"]) def save_collection_annotations(collection_id: str): # If you change input or output, update client modules pine.client.models and pine.client.client collection = service.get_item_by_id("collections", collection_id, params=service.params({ @@ -277,6 +277,9 @@ def save_collection_annotations(collection_id: str): skip_document_updates = json.loads(request.args.get("skip_document_updates", "false")) update_iaa = json.loads(request.args.get("update_iaa", "true")) + # Batch mode should only be used when all documents being annotated haven't been + # annotated before, otherwise eve's versioning will be messed up. + batch_mode = json.loads(request.args.get("batch_mode", "true")) # make sure all the documents actually belong to that collection collection_ids = list(documents.get_collection_ids_for(doc_annotations.keys())) @@ -284,7 +287,6 @@ def save_collection_annotations(collection_id: str): raise exceptions.Unauthorized() user_id = auth.get_logged_in_user()["id"] - # first try batch mode new_annotations = [] for (doc_id, body) in doc_annotations.items(): (doc_labels, ner_annotations) = _make_annotations(body) @@ -295,24 +297,35 @@ def save_collection_annotations(collection_id: str): "document_id": doc_id, "annotation": doc_labels + ner_annotations }) - resp = service.post("annotations", json=new_annotations) - if resp.ok: - for (i, created_annotation) in enumerate(resp.json()["_items"]): - new_annotations[i]["_id"] = created_annotation["_id"] - if not skip_document_updates: - set_document_to_annotated_by_user(new_annotations[i]["document_id"], - new_annotations[i]["creator_id"]) - log.access_flask_annotate_documents(new_annotations) - if update_iaa: - success = pineiaa.update_iaa_report_by_collection_id(collection_id) - if not success: - logger.error("Unable to update IAA report but will not return an error") - return jsonify([annotation["_id"] for annotation in new_annotations]) + + if batch_mode: + # first try batch mode (should only be done if the document doesn't have annotations already) + resp = service.post("annotations", json=new_annotations) + if resp.ok: + resp_json = resp.json() + # Changing a single document will not have _items + if "_items" in resp_json: + for (i, created_annotation) in enumerate(resp_json["_items"]): + new_annotations[i]["_id"] = created_annotation["_id"] + if not skip_document_updates: + set_document_to_annotated_by_user(new_annotations[i]["document_id"], + new_annotations[i]["creator_id"]) + else: + new_annotations[0]["_id"] = resp_json["_id"] + if not skip_document_updates: + set_document_to_annotated_by_user(new_annotations[0]["document_id"], + new_annotations[0]["creator_id"]) + log.access_flask_annotate_documents(new_annotations) + if update_iaa: + success = pineiaa.update_iaa_report_by_collection_id(collection_id) + if not success: + logger.error("Unable to update IAA report but will not return an error") + return jsonify([annotation["_id"] for annotation in new_annotations]) # fall back on individual mode added_ids = [] for annotation in new_annotations: - added_id = _add_or_update_annotation(annotation["document_id"], user_id, annotation) + added_id = _add_or_update_annotation(annotation) if added_id: added_ids.append(added_id) if update_iaa: diff --git a/backend/pine/backend/annotations/openapi.yaml b/backend/pine/backend/annotations/openapi.yaml new file mode 100644 index 0000000..f2eb309 --- /dev/null +++ b/backend/pine/backend/annotations/openapi.yaml @@ -0,0 +1,211 @@ +# (C) 2021 The Johns Hopkins University Applied Physics Laboratory LLC. + +openapi: "3.0.2" + +security: + - cookieAuth: [] + +tags: + - name: annotations + description: Operations in the "annotations" blueprint. + +components: + + schemas: + + WrappedAnnotations: + type: object + properties: + _items: + type: array + items: + $ref: "../api/components.yaml#/schemas/UserDocumentAnnotation" + _links: + $ref: "../api/components.yaml#/schemas/EveLinks" + +paths: + + /annotations/mine/by_document_id/{doc_id}: + get: + summary: Get My Document Annotations + description: | + Get a list of annotations done by the logged in user on a document. + + Example: `curl -X GET http://localhost:5000/annotations/mine/by_document_id/60d08052f2cb44c51e0af0f1 --cookie session.cookie` + operationId: annotations_get_mine + tags: [annotations] + parameters: + - $ref: "../api/components.yaml#/parameters/docIdParam" + responses: + "200": + description: Successfully found document and got annotations. + content: + application/json: + schema: + $ref: "#/components/schemas/WrappedAnnotations" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorized" + "404": + $ref: "../api/components.yaml#/responses/DocumentNotFound" + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + post: + summary: Save My Annotations + description: | + Change annotations of a document. + + Example: `curl -X PUT http://localhost:5000/annotations/mine/by_document_id/60d08052f2cb44c51e0af0f1 --cookie session.cookie -H "Content-type: application/json" -d '{"doc":["sci.crypt", "talk.politics.misc"],"ner":[{"end":365,"start":346, "label":"sci.med"}, {"start":475, "end":530, "label":"alt.atheism"}]}'` + + _Note_: start or end indices in the middle of words might make the UI not show the label. + Also, invalid labels are not checked and might cause the UI to freeze. + operationId: annotations_save_mine + tags: [annotations] + parameters: + - $ref: "../api/components.yaml#/parameters/docIdParam" + - name: update_iaa + in: query + required: false + description: Whether to also update IAA reports. + schema: + type: boolean + default: true + requestBody: + description: The labels to add to the document. + required: true + content: + application/json: + schema: + $ref: "../api/components.yaml#/schemas/DocumentAnnotations" + responses: + "200": + description: Successfully found document and changed annotations (returns doc_id). + content: + application/json: + schema: + type: string + "400": + $ref: "../api/components.yaml#/responses/InvalidInputParameters" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorized" + "404": + $ref: "../api/components.yaml#/responses/DocumentNotFound" + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + /annotations/mine/by_collection_id/{collection_id}: + post: + summary: Set Collection Annotations + description: | + Modify annotations of certain documents in a given collection. + + Example: `curl -X POST http://localhost:5000/annotations/mine/by_collection_id/60d32ba28d34cf656fed503f --cookie session.cookie -H "Content-type: application/json" -d '{"60d32ba48d34cf656fed504b": {"doc":["sci.crypt", "talk.politics.misc"],"ner":[[0,4,"sci.med"], [0,4,"alt.atheism"]]}, "60d32ba48d34cf656fed504c": {"doc":[], "ner":[[0,4,"sci.med"]]}}'` + operationId: annotations_collection + tags: [annotations] + parameters: + - $ref: "../api/components.yaml#/parameters/collectionIdParam" + - name: batch_mode + required: true + description: | + Whether or not to send all annotations to the database as one batch or individually. + + _Note_: Batch mode should ONLY be used if all of the documents have not already been annotated. + + The versioning of eve will be messed up if batch mode annotates a document with pre-existing annotations (even if old). + + To be clear, even if a document had annotations that were deleted, using batch mode on that document will cause problems. + + Conversely, using individual mode (batch_mode = False) can always be done, but will be slower. + + Another issue with individual mode is with many documents, there will be many backend queries, possibly getting rate limited. + schema: + type: boolean + default: true + in: query + - name: update_iaa + in: query + required: false + description: Whether to also update IAA reports. + schema: + type: boolean + default: true + requestBody: + description: The labels to add to the document. + required: true + content: + application/json: + schema: + description: Mapping from document ID to annotations object. + type: object + additionalProperties: + $ref: "../api/components.yaml#/schemas/DocumentAnnotations" + example: + {"60d47b4bdbfddb3ca87c7971": {"doc": ["label1", "label2"], + "ner": [[0, 10, "label1"], [15, 18, "label2"]]}} + responses: + "200": + description: Successfully found document and changed annotations (returns annotation ids). + content: + application/json: + schema: + type: array + items: + type: string + "400": + $ref: "../api/components.yaml#/responses/InvalidInputParameters" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorized" + "404": + $ref: "../api/components.yaml#/responses/CollectionNotFound" + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + /annotations/others/by_document_id/{doc_id}: + get: + summary: Get Others' Document Annotations + description: | + Get a list of annotations done by everyone but me on a document. + + Example: `curl -X GET http://localhost:5000/annotations/others/by_document_id/60d08052f2cb44c51e0af0f1 --cookie session.cookie` + operationId: annotations_others + tags: [annotations] + parameters: + - $ref: "../api/components.yaml#/parameters/docIdParam" + responses: + "200": + description: Successfully found document and got annotations. + content: + application/json: + schema: + $ref: "#/components/schemas/WrappedAnnotations" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorized" + "404": + $ref: "../api/components.yaml#/responses/DocumentNotFound" + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" + + /annotations/by_document_id/{doc_id}: + get: + summary: Get All Document Annotations + description: | + Get a list of annotations done by everyone on a document. + + Example: `curl -X GET http://localhost:5000/annotations/by_document_id/60d08052f2cb44c51e0af0f1 --cookie session.cookie` + operationId: annotations_all + tags: [annotations] + parameters: + - $ref: "../api/components.yaml#/parameters/docIdParam" + responses: + "200": + description: Successfully found document and got annotations. + content: + application/json: + schema: + $ref: "#/components/schemas/WrappedAnnotations" + "401": + $ref: "../api/components.yaml#/responses/NotAuthorized" + "404": + $ref: "../api/components.yaml#/responses/DocumentNotFound" + default: + $ref: "../api/components.yaml#/responses/UnexpectedServerError" diff --git a/backend/pine/backend/api/.gitignore b/backend/pine/backend/api/.gitignore new file mode 100644 index 0000000..08677c1 --- /dev/null +++ b/backend/pine/backend/api/.gitignore @@ -0,0 +1,3 @@ +# (C) 2019 The Johns Hopkins University Applied Physics Laboratory LLC. + +*.tar.gz diff --git a/backend/pine/backend/api/__init__.py b/backend/pine/backend/api/__init__.py new file mode 100644 index 0000000..79dbc53 --- /dev/null +++ b/backend/pine/backend/api/__init__.py @@ -0,0 +1,4 @@ +# (C) 2019 The Johns Hopkins University Applied Physics Laboratory LLC. + +"""This module implements all methods required for SwaggerUI to run on the +backend of PINE.""" diff --git a/backend/pine/backend/api/base.yaml b/backend/pine/backend/api/base.yaml new file mode 100644 index 0000000..223187e --- /dev/null +++ b/backend/pine/backend/api/base.yaml @@ -0,0 +1,34 @@ +# (C) 2021 The Johns Hopkins University Applied Physics Laboratory LLC. + +openapi: "3.0.2" + +info: + title: "PINE" + description: | + PINE: Pmap Interface for Nlp Experimentation + + PINE is a Natural Language Processing (NLP) tool designed for integration with the + Precision Medicine Analytics Platform (PMAP), developed at the Johns Hopkins University Applied + Physics Laboratory (JHU/APL). + + PINE consists of a web UI along with backing services. + version: "1.0.1" + contact: + name: "Michael Harrity" + email: "Michael.Harrity@jhuapl.edu" + license: + name: "AGPL-3.0" + url: https://github.com/JHUAPL/PINE/blob/master/LICENSE + +servers: + - url: http://localhost:5000 + - url: https://localhost:8888/api + - url: https://dev-nlpannotator.pm.jh.edu/api + +paths: {} + +components: + securitySchemes: + cookieAuth: + $ref: "./components.yaml#/securitySchemes/cookieAuth" + schemas: {} diff --git a/backend/pine/backend/api/bp.py b/backend/pine/backend/api/bp.py new file mode 100644 index 0000000..a622c0d --- /dev/null +++ b/backend/pine/backend/api/bp.py @@ -0,0 +1,34 @@ +# (C) 2019 The Johns Hopkins University Applied Physics Laboratory LLC. + +import logging + +from flask import redirect, render_template, request, send_file, url_for, Blueprint + +bp = Blueprint("api", __name__, url_prefix = "/api", template_folder="swagger-ui") +LOGGER = logging.getLogger(__name__) + +# Return the openapi specification for SwaggerUI +@bp.route("/openapi.yaml", methods=["GET"]) +def openapi_spec(): + # Specify statically where the openapi file is, relative path + return send_file("api/openapi.yaml", mimetype='text/yaml', as_attachment=False) + +@bp.route("/ui", methods=["GET"], strict_slashes=False) +def swagger_ui_index(): + # forward to /api/ui/index.html, taking proxy prefix into account if set + url = request.headers.get("X-Forwarded-Prefix", "") + url_for("api.swagger_ui", file="index.html") + LOGGER.info("Redirecting to {}".format(url)) + return redirect(url) + +@bp.route("/ui/", methods=["GET"]) +def swagger_ui(file: str): + if file == "index.html": + # get url for /api/openapi.yaml, taking proxy prefix into account if set + url = request.headers.get("X-Forwarded-Prefix", "") + url_for("api.openapi_spec") + LOGGER.info("Grabbing spec from {}".format(url)) + return render_template("index.html", spec_url=url) + else: + return send_file("api/swagger-ui/{}".format(file)) + +def init_app(app): + app.register_blueprint(bp) diff --git a/backend/pine/backend/api/components.yaml b/backend/pine/backend/api/components.yaml new file mode 100644 index 0000000..f691da4 --- /dev/null +++ b/backend/pine/backend/api/components.yaml @@ -0,0 +1,611 @@ +# (C) 2021 The Johns Hopkins University Applied Physics Laboratory LLC. + +securitySchemes: + + cookieAuth: + description: | + This an example command to provision and print the session key using eve: + + `curl -X POST -H "Content-Type:application/json" -d '{"username":"ada@pine.jhuapl.edu","password":"ada@pine.jhuapl.edu"}' http://localhost:5000/auth/login --cookie-jar - --output /dev/null --silent | grep -o -P "session\s.+" | sed -e 's/session\s/session=/' -` + type: apiKey + in: cookie + name: session + +parameters: + + userIdParam: + name: user_id + in: path + required: true + description: ID of the user on which to operate. + schema: + type: string + + docIdParam: + name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: + type: string + + collectionIdParam: + name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: + type: string + + pipelineIdParam: + name: pipeline_id + in: path + required: true + description: The id of the pipeline on which to operate. + schema: + type: string + + classifierIdParam: + name: classifier_id + in: path + required: true + description: The id of the classifier on which to operate. + schema: + type: string + +schemas: + + DocumentAnnotations: + type: object + properties: + doc: + description: Document-level annotations. + type: array + items: + description: Annotation label. + type: string + ner: + description: NER annotations. + type: array + items: + type: object + properties: + start: + description: Start index, inclusive. + type: integer + end: + description: End index, exclusive. + type: integer + label: + description: Annotation label. + type: string + example: + doc: ["label1", "label2"] + ner: [{"start":0, "end":10, "label":"in-text-label"}] + + AuthUser: + type: object + properties: + display_name: + type: string + id: + type: string + is_admin: + type: boolean + username: + type: string + example: + display_name: Ada Lovelace + id: ada + is_admin: false + username: ada@pine.jhuapl.edu + + AuthUserDetails: + type: object + properties: + description: + type: string + first_name: + type: string + last_name: + type: string + example: + first_name: Ada + last_name: Lovelace + description: The first computer programmer. + + EveLinks: + type: object + properties: + parent: + type: object + properties: + title: + type: string + href: + type: string + self: + type: object + properties: + title: + type: string + href: + type: string + + EveBase: + type: object + properties: + _etag: + type: string + + EveBaseWithVersion: + allOf: + - $ref: "#/schemas/EveBase" + - type: object + properties: + _version: + type: integer + _latest_version: + type: integer + + Document: + type: object + properties: + _id: + type: string + creator_id: + type: string + collection_id: + type: string + overlap: + type: integer + format: int64 + metadata: + type: object + # This means accept any type for key/val + additionalProperties: {} + text: + type: string + has_annotated: + type: object + additionalProperties: + type: boolean + + DocumentDeletionResponse: + type: object + properties: + success: + type: boolean + description: Whether the operation was successful. + changed_objs: + type: object + description: What database objects were changed during operation. + properties: + next_instances: + type: object + properties: + updated: + description: IDs of next_instance objects that were updated. + type: array + items: + type: string + annotations: + type: object + properties: + deleted: + description: IDs of annotation objects that were deleted. + type: array + items: + type: string + documents: + type: object + properties: + deleted: + description: IDs of document objects that were deleted. + type: array + items: + type: string + + UserDocumentAnnotation: + description: > + This is the log of annotations by a specific user. A document might have 0, 1, or multiple of + these based on how many users annotated. + allOf: + - $ref: "#/schemas/EveBaseWithVersion" + - type: object + properties: + _id: + type: string + creator_id: + type: string + collection_id: + type: string + document_id: + type: string + annotation: + type: array + items: + anyOf: + - type: string + example: documentlabel + description: String for labels on the entire document. + - type: array + items: + anyOf: + - type: string + - type: integer + example: + [1, 2, "textlabel"] + description: Array for individual annotations [start_index, end_index, label] + + Collection: + type: object + properties: + _id: + type: string + creator_id: + type: string + metadata: + type: object + additionalProperties: {} + configuration: + type: object + additionalProperties: {} + labels: + type: array + items: + type: string + viewers: + type: array + items: + type: string + annotators: + type: array + items: + type: string + archived: + type: boolean + + CollectionDownload: + description: Collection download is Collection with a list of all docs inside (and no eve info) + type: object + properties: + _id: + type: string + creator_id: + type: string + metadata: + type: object + additionalProperties: {} + configuration: + type: object + additionalProperties: {} + labels: + type: array + items: + type: string + viewers: + type: array + items: + type: string + annotators: + type: array + items: + type: string + archived: + type: boolean + documents: + type: array + items: + $ref: '#/components/schemas/Document' + + UserPermissions: + type: object + properties: + add_documents: + type: boolean + add_images: + type: boolean + annotate: + type: boolean + archive: + type: boolean + download_data: + type: boolean + modify_document_metadata: + type: boolean + modify_labels: + type: boolean + modify_users: + type: boolean + view: + type: boolean + + UserInfo: + type: object + properties: + _id: + type: string + _created: + type: string + description: + type: string + email: + type: string + firstname: + type: string + lastname: + type: string + passwdhash: + type: string + role: + type: array + items: + type: string + + IDInfo: + description: > + This object is returned when doing actions like modifying a document or collection. It + contains the ID of the object and some other information from the database. + allOf: + - $ref: "#/schemas/EveBase" + - type: object + properties: + _status: + type: string + _id: + type: string + _updated: + type: string + format: date-time + _created: + type: string + format: date-time + _links: + $ref: "#/schemas/EveLinks" + + ErrorResponse: + description: Error message from the server. + type: string + example: Error message from the server. + + Pipeline: + allOf: + - $ref: "#/schemas/EveBase" + - type: object + properties: + _id: + type: string + title: + type: string + description: + type: string + name: + type: string + parameters: + type: object + additionalProperties: {} + example: + cutoff: "integer" + iterations: " integer" + n_iter: "integer" + dropout: "float" + max_left: "integer" + use_class_feature: [true, false] + use_word: [true, false] + use_ngrams: [true, false] + no_mid_ngrams: [true, false] + max_ngram_length: "integer" + use_prev: [true, false] + use_next: [true, false] + use_disjunctive: [true, false] + use_sequences: [true, false] + use_prev_sequences: [true, false] + use_type_seqs: [true, false] + use_type_seqs2: [true, false] + use_type_y_sequences: [true, false] + _updated: + type: string + format: date-time + _created: + type: string + format: date-time + + CollectionMetric: + type: object + properties: + _id: + type: string + collection_id: + type: string + classifier_id: + type: string + # Not positive what elements can be in these array so leaving blank + documents: + type: array + items: {} + annotations: + type: array + items: {} + folds: + type: array + items: {} + metrics: + type: array + items: {} + _updated: + type: string + _created: + type: string + _version: + type: integer + _etag: + type: string + _links: + type: object + properties: + self: + type: object + properties: + title: + type: string + href: + type: string + + InterAnnotatorAgreement: + allOf: + - $ref: "#/schemas/EveBaseWithVersion" + - type: object + properties: + _id: + type: string + collection_id: + type: string + num_of_annotators: + type: integer + num_of_agreement_docs: + type: integer + num_of_labels: + type: integer + per_doc_agreement: + type: object + properties: + doc_id: + type: string + avg: + type: number + format: double + stddev: + type: integer + per_label_agreement: + type: array + items: + type: object + properties: + label: + type: string + avg: + type: number + format: double + stddev: + type: integer + overall_agreement: + type: object + properties: + mean: + type: number + format: double + sd: + type: integer + heatmap_data: + type: object + properties: + matrix: + type: array + items: + type: array + items: + type: number + format: float + minItems: 2 + maxItems: 2 + example: + [1, .666666] + annotators: + type: array + items: + type: string + example: + ["ada", "margaret"] + labels_per_annotator: + # Dictionary of dictionaries per annotator + type: object + additionalProperties: + # Dictionary of number of each label + type: object + additionalProperties: + type: integer + example: + {"ada": {"label1": 1, "label2": 4}, "margaret": {"label1": 3, "label2": 2}} + _updated: + type: string + format: date-time + _created: + type: string + format: date-time + +responses: + + Success: + description: Whether the operation succeeded or failed. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + + NotAuthorized: + description: > + Authentication failed: not logged in or user doesn't have the permissions for this operation. + content: + application/json: + schema: + $ref: "#/schemas/ErrorResponse" + + NotAuthorizedOrNotAdmin: + description: Authentication failed, not logged in or not an admin. + content: + application/json: + schema: + $ref: "#/schemas/ErrorResponse" + + InvalidInputParameters: + description: Input parameters are missing/invalid. + content: + application/json: + schema: + $ref: "#/schemas/ErrorResponse" + + DocumentNotFound: + description: Document with given ID was not found. + content: + application/json: + schema: + $ref: "#/schemas/ErrorResponse" + + CollectionNotFound: + description: Collection with given ID was not found. + content: + application/json: + schema: + $ref: "#/schemas/ErrorResponse" + + PipelineNotFound: + description: Pipeline with given ID was not found. + content: + application/json: + schema: + $ref: "#/schemas/ErrorResponse" + + ClassifierNotFound: + description: Classifier with given ID was not found. + content: + application/json: + schema: + $ref: "#/schemas/ErrorResponse" + + MismatchedEtag: + description: Given etag did not match the most updated stored one. + content: + application/json: + schema: + $ref: "#/schemas/ErrorResponse" + + UnexpectedServerError: + description: Unexpected error, check server logs. + content: + application/json: + schema: + $ref: "#/schemas/ErrorResponse" diff --git a/backend/pine/backend/api/download_swagger_ui.sh b/backend/pine/backend/api/download_swagger_ui.sh new file mode 100755 index 0000000..4258aec --- /dev/null +++ b/backend/pine/backend/api/download_swagger_ui.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# (C) 2019 The Johns Hopkins University Applied Physics Laboratory LLC. + +set -ex + +if [[ $# -eq 0 ]]; then + VERSION=$(curl --silent "https://api.github.com/repos/swagger-api/swagger-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') + if [[ ${VERSION} = v* ]]; then + VERSION=${VERSION:1} + fi +else + VERSION="$1" +fi + +if [[ ! -f swagger-ui-${VERSION}.tar.gz ]]; then + wget "https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${VERSION}.tar.gz" -O swagger-ui-${VERSION}.tar.gz +fi + +rm -rf swagger-ui/ +tar xzf swagger-ui-${VERSION}.tar.gz swagger-ui-${VERSION}/dist/ --transform "s|swagger-ui-${VERSION}/dist|swagger-ui|" +sed -i 's|https://petstore.swagger.io/v2/swagger.json|{{spec_url}}|' swagger-ui/index.html +echo ${VERSION} > swagger-ui/VERSION diff --git a/backend/pine/backend/api/openapi.yaml b/backend/pine/backend/api/openapi.yaml new file mode 100644 index 0000000..eb15cdc --- /dev/null +++ b/backend/pine/backend/api/openapi.yaml @@ -0,0 +1,4325 @@ +# (C) 2021 The Johns Hopkins University Applied Physics Laboratory LLC. + +openapi: 3.0.2 +info: + title: PINE + description: > + PINE: Pmap Interface for Nlp Experimentation + + + PINE is a Natural Language Processing (NLP) tool designed for integration + with the + + Precision Medicine Analytics Platform (PMAP), developed at the Johns Hopkins + University Applied + + Physics Laboratory (JHU/APL). + + + PINE consists of a web UI along with backing services. + version: 1.0.1 + contact: + name: Michael Harrity + email: Michael.Harrity@jhuapl.edu + license: + name: AGPL-3.0 + url: 'https://github.com/JHUAPL/PINE/blob/master/LICENSE' +servers: + - url: 'http://localhost:5000' + - url: 'https://localhost:8888/api' + - url: 'https://dev-nlpannotator.pm.jh.edu/api' +paths: + /admin/users: + get: + summary: Get All User Information + description: > + Get a list of all users (and details: id, email, password hash). + + + Example: `curl -X GET http://localhost:5000/admin/users --cookie + admin.cookie` + + + _Note_: this endpoint requires the logged in user to be an admin and is + only relevant if + + the auth module supports it. + operationId: admin_get_users + tags: + - admin + responses: + '200': + description: Returned list of user details. + content: + application/json: + schema: + type: array + items: + type: object + properties: &ref_2 + _id: + type: string + _created: + type: string + description: + type: string + email: + type: string + firstname: + type: string + lastname: + type: string + passwdhash: + type: string + role: + type: array + items: + type: string + '401': + description: 'Authentication failed, not logged in or not an admin.' + content: &ref_0 + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + default: + description: 'Unexpected error, check server logs.' + content: &ref_1 + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + security: + - cookieAuth: [] + post: + summary: Create New User + description: > + Create a new user. + + + Example: `curl -X Post http://localhost:5000/admin/users -d + '{"id":"joe", "passwd":"mypass", "email":"joe@pine.jhuapl.edu", + "description": "", "firstname":"joe", "lastname":"jones"}' -H + "Content-type:application/json" --cookie admin.cookie` + + + _Note_: this endpoint requires the logged in user to be an admin and is + only relevant if + + the auth module supports it. + operationId: admin_add_user + tags: + - admin + requestBody: + content: + application/json: + schema: + type: object + properties: &ref_40 + id: + type: string + email: + type: string + passwd: + type: string + description: + type: string + firstname: + type: string + lastname: + type: string + role: + description: The role (for permissions) of the user. + type: array + items: &ref_4 + type: string + enum: + - administrator + - user + required: &ref_41 + - id + - email + - passwd + - firstname + - lastname + - roles + responses: + '200': + description: Return id info of newly created user. + content: + application/json: + schema: + type: array + items: + description: > + This object is returned when doing actions like modifying a + document or collection. It contains the ID of the object + and some other information from the database. + allOf: &ref_5 + - type: object + properties: &ref_8 + _etag: + type: string + - type: object + properties: + _status: + type: string + _id: + type: string + _updated: + type: string + format: date-time + _created: + type: string + format: date-time + _links: + type: object + properties: &ref_9 + parent: + type: object + properties: + title: + type: string + href: + type: string + self: + type: object + properties: + title: + type: string + href: + type: string + '400': + description: Input parameters are missing/invalid. + content: &ref_6 + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '401': + description: 'Authentication failed, not logged in or not an admin.' + content: *ref_0 + '409': + description: User with that ID/email already exists. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/admin/users/{user_id}': + get: + summary: Get User Details + description: > + Get details (id, email, password hash...) of a certain user. + + + Example: `curl -X GET http://localhost:5000/admin/users/ada --cookie + admin.cookie` + + + _Note_: this endpoint requires the logged in user to be an admin and is + only relevant if + + the auth module supports it. + operationId: admin_get_user + tags: + - admin + parameters: + - name: user_id + in: path + required: true + description: ID of the user on which to operate. + schema: &ref_3 + type: string + responses: + '200': + description: Successfully found the user and returned their details. + content: + application/json: + schema: + type: object + properties: *ref_2 + '401': + description: 'Authentication failed, not logged in or not an admin.' + content: *ref_0 + '404': + description: No user found with that ID. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + put: + summary: Update user details. + description: > + Update user details. + + + Example: `curl -X PUT http://localhost:5000/admin/users/ada -d + '{"_id":"ada","description":"newdesc", "firstname":"newada", + "lastname":"adalast", + "_etag":"1c12354ee74f5d5732231ac5034f7915fb167244", + "email":"ada@pine.jhuapl.edu"}' -H "Content-type:application/json" + --cookie admin.cookie` + + + _Note_: this endpoint requires the logged in user to be an admin and is + only relevant if + + the auth module supports it. + operationId: admin_update_user + tags: + - admin + parameters: + - name: user_id + in: path + required: true + description: ID of the user on which to operate. + schema: *ref_3 + requestBody: + content: + application/json: + schema: + type: object + properties: &ref_42 + _id: + type: string + _etag: + type: string + description: + type: string + firstname: + type: string + lastname: + type: string + email: + type: string + description: 'If this is not included, you wont be able to log in.' + passwdhash: + type: string + description: Setting this manually might break the password. + role: + description: The role (for permissions) of the user. + type: array + items: *ref_4 + required: &ref_43 + - _id + - _etag + - firstname + - lastname + - passwdhash + - role + responses: + '200': + description: Successfully changed user information + content: + application/json: + schema: + description: > + This object is returned when doing actions like modifying a + document or collection. It contains the ID of the object and + some other information from the database. + allOf: *ref_5 + '401': + description: 'Authentication failed, not logged in or not an admin.' + content: *ref_0 + '404': + description: No user found with that ID. + '412': + description: Given etag did not match the most updated stored one. + content: &ref_57 + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '422': + description: Input parameters are missing/invalid. + content: *ref_6 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + delete: + summary: Delete User + description: > + Delete a user. + + + _Note_: this endpoint requires the logged in user to be an admin and is + only relevant if + + the auth module supports it. + operationId: admin_delete_user + tags: + - admin + parameters: + - name: user_id + in: path + required: true + description: ID of the user on which to operate. + schema: *ref_3 + responses: + '204': + description: Successfully deleted user. + '401': + description: 'Authentication failed, not logged in or not an admin.' + content: *ref_0 + '404': + description: No user found with that ID. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/admin/users/{user_id}/password': + put: + summary: Update User Password + description: > + Update the password of a user. + + + Example: `curl -X post http://localhost:5000/admin/users/ada/password -d + '{"passwd":"newpass"}' -H "Content-type:application/json" --cookie + admin.cookie` + + + _Note_: this endpoint requires the logged in user to be an admin and is + only relevant if + + the auth module supports it. + operationId: admin_update_user_password + tags: + - admin + parameters: + - name: user_id + in: path + required: true + description: ID of the user on which to operate. + schema: *ref_3 + requestBody: + content: + application/json: + schema: + type: object + properties: + passwd: + type: string + required: + - passwd + responses: + '200': + description: Successfully changed user password + content: + application/json: + schema: + description: > + This object is returned when doing actions like modifying a + document or collection. It contains the ID of the object and + some other information from the database. + allOf: *ref_5 + '401': + description: 'Authentication failed, not logged in or not an admin.' + content: *ref_0 + '404': + description: No user found with that ID. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + /admin/system/export: + get: + summary: Export Database + description: > + Export the database to a zip file. + + + Example: `curl -X GET http://localhost:5000/admin/system/export --cookie + admin.cookie -v --output out.zip` + + + _Note_: this endpoint requires the logged in user to be an admin and is + only relevant if + + the auth module supports it. + operationId: admin_system_export + tags: + - admin + responses: + '200': + description: Successfully exported database + content: + application/gzip: {} + '401': + description: 'Authentication failed, not logged in or not an admin.' + content: *ref_0 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + /admin/system/import: + put: + summary: Import Database (Update) + description: > + Import the database given in request body. This will _update_ and not + _replace_ the + + database. + + + Example: `curl -X PUT http://localhost:5000/admin/system/import --cookie + admin.cookie -F "file=@/home/pine/out.zip"` + + + _Note_: this endpoint requires the logged in user to be an admin and is + only relevant if + + the auth module supports it. + operationId: admin_system_import_put + tags: + - admin + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + required: + - file + responses: + '200': + description: Whether the operation succeeded or failed. + content: &ref_7 + application/json: + schema: + type: object + properties: + success: + type: boolean + '400': + description: >- + The loading of data was wrong. Should be a gz, like what is + exported. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '401': + description: 'Authentication failed, not logged in or not an admin.' + content: *ref_0 + '422': + description: The file argument was not present. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + post: + summary: Import Database (Replace) + description: > + Import the database given in request body. This will _replace_ and not + _update_ the + + database. + + + Example: `curl -X POST http://localhost:5000/admin/system/import + --cookie admin.cookie -F "file=@/home/pine/out.zip"` + + + _Note_: this endpoint requires the logged in user to be an admin and is + only relevant if + + the auth module supports it. + operationId: admin_system_import_post + tags: + - admin + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + required: + - file + responses: + '200': + description: Whether the operation succeeded or failed. + content: *ref_7 + '400': + description: >- + The loading of data was wrong. Should be a gz, like what is + exported. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '401': + description: 'Authentication failed, not logged in or not an admin.' + content: *ref_0 + '422': + description: The file argument was not present. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/annotations/mine/by_document_id/{doc_id}': + get: + summary: Get My Document Annotations + description: > + Get a list of annotations done by the logged in user on a document. + + + Example: `curl -X GET + http://localhost:5000/annotations/mine/by_document_id/60d08052f2cb44c51e0af0f1 + --cookie session.cookie` + operationId: annotations_get_mine + tags: + - annotations + parameters: + - name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: &ref_10 + type: string + responses: + '200': + description: Successfully found document and got annotations. + content: + application/json: + schema: + type: object + properties: &ref_15 + _items: + type: array + items: + description: > + This is the log of annotations by a specific user. A + document might have 0, 1, or multiple of these based on + how many users annotated. + allOf: &ref_55 + - allOf: &ref_30 + - type: object + properties: *ref_8 + - type: object + properties: + _version: + type: integer + _latest_version: + type: integer + - type: object + properties: + _id: + type: string + creator_id: + type: string + collection_id: + type: string + document_id: + type: string + annotation: + type: array + items: + anyOf: + - type: string + example: documentlabel + description: String for labels on the entire document. + - type: array + items: + anyOf: + - type: string + - type: integer + example: + - 1 + - 2 + - textlabel + description: >- + Array for individual annotations + [start_index, end_index, label] + _links: + type: object + properties: *ref_9 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: &ref_11 + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '404': + description: Document with given ID was not found. + content: &ref_12 + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + post: + summary: Save My Annotations + description: > + Change annotations of a document. + + + Example: `curl -X PUT + http://localhost:5000/annotations/mine/by_document_id/60d08052f2cb44c51e0af0f1 + --cookie session.cookie -H "Content-type: application/json" -d + '{"doc":["sci.crypt", + "talk.politics.misc"],"ner":[{"end":365,"start":346, "label":"sci.med"}, + {"start":475, "end":530, "label":"alt.atheism"}]}'` + + + _Note_: start or end indices in the middle of words might make the UI + not show the label. + + Also, invalid labels are not checked and might cause the UI to freeze. + operationId: annotations_save_mine + tags: + - annotations + parameters: + - name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: *ref_10 + - name: update_iaa + in: query + required: false + description: Whether to also update IAA reports. + schema: + type: boolean + default: true + requestBody: + description: The labels to add to the document. + required: true + content: + application/json: + schema: + type: object + properties: &ref_13 + doc: + description: Document-level annotations. + type: array + items: + description: Annotation label. + type: string + ner: + description: NER annotations. + type: array + items: + type: object + properties: + start: + description: 'Start index, inclusive.' + type: integer + end: + description: 'End index, exclusive.' + type: integer + label: + description: Annotation label. + type: string + example: &ref_14 + doc: + - label1 + - label2 + ner: + - start: 0 + end: 10 + label: in-text-label + responses: + '200': + description: >- + Successfully found document and changed annotations (returns + doc_id). + content: + application/json: + schema: + type: string + '400': + description: Input parameters are missing/invalid. + content: *ref_6 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Document with given ID was not found. + content: *ref_12 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/annotations/mine/by_collection_id/{collection_id}': + post: + summary: Set Collection Annotations + description: > + Modify annotations of certain documents in a given collection. + + + Example: `curl -X POST + http://localhost:5000/annotations/mine/by_collection_id/60d32ba28d34cf656fed503f + --cookie session.cookie -H "Content-type: application/json" -d + '{"60d32ba48d34cf656fed504b": {"doc":["sci.crypt", + "talk.politics.misc"],"ner":[[0,4,"sci.med"], [0,4,"alt.atheism"]]}, + "60d32ba48d34cf656fed504c": {"doc":[], "ner":[[0,4,"sci.med"]]}}'` + operationId: annotations_collection + tags: + - annotations + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: &ref_21 + type: string + - name: batch_mode + required: true + description: > + Whether or not to send all annotations to the database as one batch + or individually. + + + _Note_: Batch mode should ONLY be used if all of the documents have + not already been annotated. + + + The versioning of eve will be messed up if batch mode annotates a + document with pre-existing annotations (even if old). + + + To be clear, even if a document had annotations that were deleted, + using batch mode on that document will cause problems. + + + Conversely, using individual mode (batch_mode = False) can always be + done, but will be slower. + + + Another issue with individual mode is with many documents, there + will be many backend queries, possibly getting rate limited. + schema: + type: boolean + default: true + in: query + - name: update_iaa + in: query + required: false + description: Whether to also update IAA reports. + schema: + type: boolean + default: true + requestBody: + description: The labels to add to the document. + required: true + content: + application/json: + schema: + description: Mapping from document ID to annotations object. + type: object + additionalProperties: + type: object + properties: *ref_13 + example: *ref_14 + example: + 60d47b4bdbfddb3ca87c7971: + doc: + - label1 + - label2 + ner: + - - 0 + - 10 + - label1 + - - 15 + - 18 + - label2 + responses: + '200': + description: >- + Successfully found document and changed annotations (returns + annotation ids). + content: + application/json: + schema: + type: array + items: + type: string + '400': + description: Input parameters are missing/invalid. + content: *ref_6 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: &ref_23 + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/annotations/others/by_document_id/{doc_id}': + get: + summary: Get Others' Document Annotations + description: > + Get a list of annotations done by everyone but me on a document. + + + Example: `curl -X GET + http://localhost:5000/annotations/others/by_document_id/60d08052f2cb44c51e0af0f1 + --cookie session.cookie` + operationId: annotations_others + tags: + - annotations + parameters: + - name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: *ref_10 + responses: + '200': + description: Successfully found document and got annotations. + content: + application/json: + schema: + type: object + properties: *ref_15 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Document with given ID was not found. + content: *ref_12 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/annotations/by_document_id/{doc_id}': + get: + summary: Get All Document Annotations + description: > + Get a list of annotations done by everyone on a document. + + + Example: `curl -X GET + http://localhost:5000/annotations/by_document_id/60d08052f2cb44c51e0af0f1 + --cookie session.cookie` + operationId: annotations_all + tags: + - annotations + parameters: + - name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: *ref_10 + responses: + '200': + description: Successfully found document and got annotations. + content: + application/json: + schema: + type: object + properties: *ref_15 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Document with given ID was not found. + content: *ref_12 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + /auth/module: + get: + summary: Get Auth Module + description: | + Get the current auth module being used (vegas or eve). + + Example: `curl -X GET http://localhost:5000/auth/module` + operationId: auth_get_module + tags: + - auth + responses: + '200': + description: Successfully got the auth module. + content: + application/json: + schema: + type: string + enum: + - eve + - vegas + /auth/flat: + get: + summary: Get Auth Is Flat + description: > + Return true if the current auth module is flat. + + + "Flat" auth means, generally, there are no administrators and + permissions are generally on + + the same "level". Collection-level permissions for viewing/annotating + still apply, however. + + + Example: `curl -X GET http://localhost:5000/auth/flat` + operationId: auth_get_flat + tags: + - auth + responses: + '200': + description: Successfully return a boolean if the auth module was flat. + content: + application/json: + schema: + type: boolean + /auth/can_manage_users: + get: + summary: Get Auth Can Manage Users + description: > + Return true if the current auth module supports managing users. + + + If `true`, the auth module can change, add, and delete users. If + `false`, users are managed + + by an external system. + + + Example: `curl -X GET http://localhost:5000/auth/flat` + operationId: auth_get_manage + tags: + - auth + responses: + '200': + description: >- + Successfully return a boolean if the auth module supports managing + users. + content: + application/json: + schema: + type: boolean + /auth/logged_in_user: + get: + summary: Get Logged In User + description: > + Get the currently logged in user (checks based on the session - need the + session cookie sent). + + If there is no user logged, in `null` is returned. + + + Example: `curl -X GET http://localhost:5000/auth/logged_in_user --cookie + session.cookie` + operationId: auth_logged_in_user + tags: + - auth + responses: + '200': + description: >- + Successfully returned the logged in user (or null if no session + cookie). + content: + application/json: + schema: + oneOf: + - type: string + nullable: true + default: null + - type: object + properties: &ref_18 + display_name: + type: string + id: + type: string + is_admin: + type: boolean + username: + type: string + example: &ref_19 + display_name: Ada Lovelace + id: ada + is_admin: false + username: ada@pine.jhuapl.edu + /auth/logged_in_user_details: + get: + summary: Get Logged In User Details + description: > + Get the currently logged in user's details. + + + Example: `curl -X GET http://localhost:5000/auth/logged_in_user_details + --cookie session.cookie` + operationId: auth_user_details + security: + - cookieAuth: [] + tags: + - auth + responses: + '200': + description: Successfully returned the logged in user details. + content: + application/json: + schema: + type: object + properties: &ref_16 + description: + type: string + first_name: + type: string + last_name: + type: string + example: &ref_17 + first_name: Ada + last_name: Lovelace + description: The first computer programmer. + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + post: + summary: Update Logged In User Details with Eve + description: | + Updates the user details for the logged in user. + + _Note_: this endpoint is only exposed if using "eve" auth module. + operationId: auth_eve_update_user_details + security: + - cookieAuth: [] + tags: + - auth_eve + requestBody: + content: + application/json: + schema: + type: object + properties: *ref_16 + example: *ref_17 + responses: + '200': + description: Successfully updated user details. + content: + application/json: + schema: + type: boolean + '400': + description: Input parameters are missing/invalid. + content: *ref_6 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + /auth/login_form: + get: + summary: Get the login form. + description: > + For auth modules that use a form to login, this endpoint will return the + information needed + + to present that form to the user and send back the necessary info in a + subsequent login + + call. + + + Example: `curl -X GET http://localhost:5000/auth/login_form` + operationId: auth_login_form + tags: + - auth + responses: + '200': + description: Successfully returned the login form. + content: + application/json: + schema: + description: Information needed to display a login form. + type: object + properties: &ref_44 + button_text: + description: Text to set in the login button. + type: string + fields: + description: Form fields to use. + type: array + items: + type: object + properties: + display: + description: Display name. + type: string + name: + description: Form name. + type: string + type: + description: Form type. + type: string + example: &ref_45 + button_text: Login + fields: + - display: Username or email + name: username + type: text + - display: Password + name: password + type: password + /auth/logout: + post: + summary: Logout + description: > + Logout of the current session. + + + Example: `curl -X POST http://localhost:5000/auth/logout --cookie + session.cookie` + operationId: auth_logout + tags: + - auth + security: + - cookieAuth: [] + responses: + '200': + description: Successfully logged out. + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + /auth/login: + post: + summary: Login User + description: > + Logs in user. How this works depends on the auth module used. + + + For eve: this takes a request body consisting of the login form data. + + + For vegas: this takes in no parameters and returns the URL the caller + should redirect to. + operationId: auth_login + tags: + - auth_eve + - auth_vegas + parameters: + - name: return_to + in: query + required: false + description: 'For vegas auth only, a URL to return to after auth flow.' + schema: + type: string + format: url + requestBody: + required: false + content: + application/json: + schema: + description: Only for eve login. + type: object + properties: &ref_46 + username: + type: string + password: + type: string + responses: + '200': + description: > + For eve: successfully logged in, returns user information. + + + For vegas: starts auth flow and returns the URL that the caller + should redirect to. + content: + application/json: + schema: + oneOf: + - type: object + properties: *ref_18 + example: *ref_19 + - type: string + format: url + '400': + description: Input parameters are missing/invalid. + content: *ref_6 + '401': + description: >- + Given user doesn't exist, password isn't set, or password doesn't + match. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + /auth/users: + get: + summary: Get Eve Users + description: | + Gets all users that are registered with eve. + + _Note_: this endpoint is only exposed if using "eve" auth module. + operationId: auth_eve_users + tags: + - auth_eve + security: + - cookieAuth: [] + responses: + '200': + description: Returns all users. + content: + application/json: + schema: + type: array + items: + type: object + properties: *ref_18 + example: *ref_19 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + /auth/logged_in_user_password: + post: + summary: Update Eve User Password + description: | + Updates the password of the currently logged in eve user. + + _Note_: this endpoint is only exposed if using "eve" auth module. + operationId: auth_eve_update_password + tags: + - auth_eve + security: + - cookieAuth: [] + requestBody: + content: + application/json: + schema: + type: object + properties: &ref_47 + current_password: + type: string + new_password: + type: string + responses: + '200': + description: Successfully changed password. + content: + application/json: + schema: + type: boolean + '400': + description: Input parameters are missing/invalid. + content: *ref_6 + '401': + description: 'Not logged in, or current password doesn''t match.' + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + /auth/authorize: + get: + summary: Authorize From Fragment + description: > + Part of the OAuth flow, this will authorize based on passed-in query + parameters. + + + _Note_: this endpoint is only exposed if using "vegas" auth module. + operationId: auth_vegas_authorize_get + tags: + - auth_vegas + parameters: + - name: fragment + in: query + required: true + description: OAuth flow fragment. + schema: + type: string + responses: + '200': + description: 'Successfully logged in, returns user information.' + content: + application/json: + schema: + type: object + properties: *ref_18 + example: *ref_19 + '400': + description: 'Fragment is not valid, or parsed token is not valid.' + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + post: + summary: Authorize From Token + description: > + Authorize diretly based on an obtained vegas token, outside the normal + OAuth flow. + + This is meant to make it easy to authenticate using vegas and then use + this API outside of + + the web UI. + + + _Note_: this endpoint is only exposed if using "vegas" auth module. + operationId: auth_vegas_authorize_post + tags: + - auth_vegas + requestBody: + description: Token obtained from Vegas. + required: true + content: + application/json: + schema: + description: An auth token obtained by Vegas out-of-band from PINE. + type: object + properties: &ref_48 + auth_token: + type: string + token_type: + type: string + additionalProperties: &ref_49 {} + responses: + '200': + description: 'Successfully logged in, returns user information.' + content: + application/json: + schema: + type: object + properties: *ref_18 + example: *ref_19 + '400': + description: Token is not valid. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + /collections/unarchived: + get: + summary: Get Unarchived Collections + description: > + Get all unarchived collections for logged in user. + + + Example: `curl http://localhost:5000/collections/unarchived --cookie + session.cookie` + operationId: collections_get_unarchived_all + tags: + - collections + responses: + '200': + description: Successfully retrieved relevant collections. + content: + application/json: + schema: + type: object + properties: &ref_20 + _items: + type: array + items: + type: object + properties: &ref_22 + _id: + type: string + creator_id: + type: string + metadata: + type: object + additionalProperties: {} + configuration: + type: object + additionalProperties: {} + labels: + type: array + items: + type: string + viewers: + type: array + items: + type: string + annotators: + type: array + items: + type: string + archived: + type: boolean + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/unarchived/{page}': + get: + summary: Get Paginated Unarchived Collections + description: > + Get unarchived user collections (either all or a certain page). + + + Example: `curl http://localhost:5000/collections/unarchived --cookie + session.cookie` + operationId: collections_get_unarchived_paginated + tags: + - collections + parameters: + - name: page + in: path + required: true + description: > + Optional page number for specifying which collections. "all" for + all pages or a page number. + schema: + oneOf: + - type: string + default: all + - type: integer + responses: + '200': + description: Successfully retrieved relevant collections. + content: + application/json: + schema: + type: object + properties: *ref_20 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + /collections/archived: + get: + summary: Get Archived Collections + description: > + Get all archived user collections. + + + Example: `curl http://localhost:5000/collections/archived --cookie + session.cookie` + operationId: collections_get_archived_all + tags: + - collections + responses: + '200': + description: Successfully retrieved relevant collections. + content: + application/json: + schema: + type: object + properties: *ref_20 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/archived/{page}': + get: + summary: Get Paginated Archived Collections + description: > + Get archived user collections (either all or a certain page). + + + Example: `curl http://localhost:5000/collections/archived --cookie + session.cookie` + operationId: collections_get_archived_paginated + tags: + - collections + parameters: + - name: page + in: path + required: true + description: > + Optional page number for specifying which collections. "all" for + all pages or a page number. + schema: + oneOf: + - type: string + default: all + - type: integer + responses: + '200': + description: Successfully retrieved relevant collections. + content: + application/json: + schema: + type: object + properties: *ref_20 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/archive/{collection_id}': + put: + summary: Archive Collection + description: > + Archive a collection with a certain ID. + + + Example: `curl -X PUT + http://localhost:5000/collections/archive/60c7b7375b72bf4ed6523bf0 + --cookie session.cookie` + operationId: collections_archive + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: Successfully archived the chosen collection. + content: + application/json: + schema: + type: object + properties: *ref_22 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/unarchive/{collection_id}': + put: + summary: Unarchive Collection + description: > + Unarchive a collection with a certain ID. + + + Example: `curl -X PUT + http://localhost:5000/collections/unarchive/60c7b7375b72bf4ed6523bf0 + --cookie session.cookie` + operationId: collections_unarchive + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: Successfully unarchived the chosen collection. + content: + application/json: + schema: + type: object + properties: *ref_22 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/by_id/{collection_id}': + get: + summary: Get Collection + description: > + Retrieve a collection by its ID. + + + Example: `curl -X GET + http://localhost:5000/collections/by_id/60c7b7375b72bf4ed6523bf0 + --cookie session.cookie` + operationId: collections_get + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: Successfully found and rerieved the chosen collection. + content: + application/json: + schema: + type: object + properties: *ref_22 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/by_id/{collection_id}/download': + get: + summary: Download Collection Data + description: > + Download a collection's data by its ID. + + + Example: `curl -X GET + http://localhost:5000/collections/by_id/60c7b7375b72bf4ed6523bf0/download + --cookie session.cookie` + operationId: collections_download + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: Successfully found and downloaded the chosen collection. + content: + application/json: + schema: + type: object + properties: *ref_22 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/add_annotator/{collection_id}': + post: + summary: Add Collection Annotator + description: > + Add an annotator by user_id to a specific collection. + + + Example: `curl --cookie session.cookie -X POST + "http://localhost:5000/collections/add_annotator/60c7453d5b72bf4ed65239e9" + -F 'user_id="\"bob\""'` + + + Notice the quotes around the user_id value, NEEDS to be like that to + include the "" in the + + request session.cookie is a file containing: "Set-cookie: + session=.eJy...(rest of cookie)". + operationId: collections_add_annotator + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + user_id: + type: string + description: > + Note: You must put double quotation marks (`""`) around the + user_id for the backend to parse it correctly as it is a + JSON string. For example, enter `"ada"` instead of just + `ada`. + required: + - user_id + responses: + '200': + description: Successfully added the user as an annotator to the collection. + content: + application/json: + schema: + description: > + This object is returned when doing actions like modifying a + document or collection. It contains the ID of the object and + some other information from the database. + allOf: *ref_5 + '400': + description: 'Request malformed, probably missisng user_id arg.' + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + '409': + description: Specified user is already an annotator. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '500': + description: Internal server error - the form data was probably malformed. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + security: + - cookieAuth: [] + '/collections/add_viewer/{collection_id}': + post: + summary: Add Collection Viewer + description: > + Add a viewer by user_id to a specific collection. + + + Example: `curl --cookie session.cookie -X POST + "http://localhost:5000/collections/add_viewer/60c7453d5b72bf4ed65239e9" + -F 'user_id="\"bob\""'` + + + Notice the quotes around the user_id value, NEEDS to be like that to + include the "" in the + + request. session.cookie is a file containing: "Set-cookie: + session=.eJy...(rest of cookie)" + operationId: addViewerToCollection + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + user_id: + type: string + description: >- + Note: You must put double quotation marks ("") around the + user_id for the backend to parse it correctly. + + + Ex: enter "ada" instead of just ada + required: + - user_id + responses: + '200': + description: Successfully added the user as a viewer to the collection. + content: + application/json: + schema: + description: > + This object is returned when doing actions like modifying a + document or collection. It contains the ID of the object and + some other information from the database. + allOf: *ref_5 + '400': + description: 'Request malformed, probably missisng user_id arg.' + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + '409': + description: Specified user is already an viewer. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '500': + description: Internal server error - the form data was probably malformed. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + security: + - cookieAuth: [] + '/collections/add_label/{collection_id}': + post: + summary: Add Collection Label + description: > + Add a label to a specific collection. + + + Example: `curl --cookie session.cookie -X POST + "http://localhost:5000/collections/add_label/60c7453d5b72bf4ed65239e9" + -F 'new_label="\"testlabel\""'` + + + Notice the quotes around the new_label value, NEEDS to be like that to + include the "" in the + + request. session.cookie is a file containing: "Set-cookie: + session=.eJy...(rest of cookie)" + operationId: collections_add_label + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + new_label: + type: string + description: > + Note: You must put double quotation marks (`""`) around the + new_label for the backend to parse it correctly. Ex: enter + `"MyLabel"` instead of just `MyLabel` + required: + - new_label + responses: + '200': + description: Successfully added the label to the collection. + content: + application/json: + schema: + description: > + This object is returned when doing actions like modifying a + document or collection. It contains the ID of the object and + some other information from the database. + allOf: *ref_5 + '400': + description: 'Request malformed, probably missisng new_label arg.' + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + '409': + description: Specified label is already in collection. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '500': + description: Internal server error - the form data was probably malformed. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + security: + - cookieAuth: [] + /collections: + post: + summary: Create Collection + description: > + Create a new collection. + + + Example: `curl --cookie session.cookie -X POST + "http://localhost:5000/collections" -F 'collection={"creator_id":"ada", + "annotators":["ada"], "labels":["label1", + "labellll"],"metadata":{"title":"newcoll11","subject":null,"description":"describe + blahblah"}}' -F 'overlap="\".9\""' -F 'train_every="\"100\""' -F + 'pipelineId="\"5babb6ee4eb7dd2c39b9671d\""'` + + + Notice the quotes around some value, NEEDS to be like that to include + the "" in the request + + to be parsed as a JSON string. session.cookie is a file containing: + + "Set-cookie: session=.eJy...(rest of cookie)" + operationId: collections_create + tags: + - collections + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: &ref_50 + collection: + description: >- + At minimum, this must include creator_id, annotators, + viewers and labels. All other args or sub-args should be + deleted or set to null value. + + + creator_id MUST be a valid user, otherwise 500 Error will + occur. + type: object + properties: + creator_id: + type: string + annotators: + type: array + items: + type: string + viewers: + type: array + items: + type: string + labels: + type: array + items: + type: string + archived: + type: boolean + default: false + metadata: + type: object + properties: + title: + type: string + subject: + type: string + description: + type: string + publisher: + type: string + contributor: + type: string + date: + type: string + type: + type: string + format: + type: string + identifier: + type: string + source: + type: string + language: + type: string + relation: + type: string + coverage: + type: string + rights: + type: string + configuration: + type: object + properties: + allow_overlapping_ner_annotations: + type: boolean + default: true + example: + creator_id: ada + annotators: + - ada + viewers: + - ada + - margaret + labels: + - label1 + - label2 + archived: false + metadata: + title: Test + subject: testcoll + description: test collection + publisher: ada + contributor: ada + date: 1/1/21 + type: sometype + format: HTML + identifier: ABCD + source: apl + language: english + relation: family + coverage: some + rights: all of them + configuration: + allow_overlapping_ner_annotations: true + train_every: + description: Should be an integer >= 5. + type: integer + minimum: 5 + overlap: + description: > + Should be a float between 0 and 1. + + + WARNING: You MUST put double quotation marks (`""`) around + the number for the backend to + + parse it correctly. + + + Ex: enter `".5"` instead of just `.5` + type: number + format: float + minimum: 0 + maximum: 1 + pipelineId: + type: string + description: > + WARNING: You MUST put double quotation marks (`""`) around + the id for the backend to + + parse it correctly. + + + Ex: enter `"123abc..."` instead of just `123abc...` + classifierParameters: + type: string + format: object + default: null + required: &ref_51 + - collection + - train_every + - overlap + - pipelineId + responses: + '201': + description: Successfully created the collection. + content: + application/json: + schema: + description: > + This object is returned when doing actions like modifying a + document or collection. It contains the ID of the object and + some other information from the database. + allOf: *ref_5 + '400': + description: Request malformed. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '401': + description: 'Authentication failed, not logged in.' + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '500': + description: Error in syntax of the request - OR Wekzeug Authentication Failure. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + security: + - cookieAuth: [] + '/collections/static_images/{collection_id}': + get: + summary: Get Collection Static Images + description: > + Retrieve all static images used in a collection. + + + Example: `curl --cookie session.cookie -X GET + "http://localhost:5000/collections/static_images/60c745395b72bf4ed6523821"` + operationId: collections_get_static_images + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: >- + Successfully found the collection and got any relevant static + images. + content: + application/json: + schema: + type: array + description: An array of static image paths. + items: + type: string + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/images/{collection_id}': + get: + summary: Get Collection Images + description: > + Retrieve all (non-static) images used in a collection. + + + Example: `curl --cookie session.cookie -X GET + "http://localhost:5000/collections/images/60c745395b72bf4ed6523821"` + operationId: collections_get_images + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: Successfully found the collection and got any relevant images. + content: + application/json: + schema: + type: array + description: An array of image paths. + items: + type: string + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/image_exists/{collection_id}/{path}': + get: + summary: Check Collection Image + description: > + Checks whether the given image exists in the given collection. + + + Example: `curl -X GET + "http://localhost:5000/collections/image_exists/60c745395b72bf4ed6523821/static%2Fapl.png" + -H "accept: application/json" --cookie session.cookie` + operationId: collections_image_exists + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + - name: path + in: path + required: true + description: >- + Path of the image to check (same as returned from + images/static_images). + schema: + type: string + example: static/apl.jpg + responses: + '200': + description: Returns whether the collection holds the image. + content: + application/json: + schema: + type: boolean + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/image/{collection_id}/{path}': + get: + summary: Get Collection Image + description: > + Download an image from a collection. + + + Example: `curl --cookie session.cookie -X GET + "http://localhost:5000/collections/image/60c745395b72bf4ed6523821/static/apl.png" + -v --output - > apl.png` + operationId: collections_image + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + - name: path + in: path + required: true + description: >- + Path of the image to download (same as returned from + images/static_images). + schema: + type: string + example: static/apl.jpg + responses: + '200': + description: Successfully found the collection and returns image data. + content: + image/*: + schema: + type: string + format: binary + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + post: + summary: Upload Collection Image + description: > + Upload an image to a collection. + + + Example: `curl --cookie session.cookie -X POST + "http://localhost:5000/collections/image/60c745395b72bf4ed6523821/static/dog.jpeg" + -F 'file=@/home/pine/Downloads/dog.jpeg'` + operationId: collections_image_upload + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + - name: path + in: path + required: true + description: > + Path to place the image at. + + + Note: This path piece should NOT start with / (Ex: static/dog.jpg, + not /static/dog.jpg). + schema: + type: string + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: string + format: binary + required: + - file + responses: + '100': + description: 'Couldn''t read the image, probably bad permissions or bad path.' + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '200': + description: Successfully uploaded image (Will return the path). + content: + application/json: + schema: + type: string + '400': + description: Did not include the image in the request form. + content: + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/collections/user_permissions/{collection_id}': + get: + summary: Get Collection User Permissions + description: > + Get the current user permissions of a collection. + + + Example: `curl --cookie session.cookie -X GET + "http://localhost:5000/collections/user_permissions/60c745395b72bf4ed6523821" + -v` + operationId: collections_permissions + tags: + - collections + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: Returns collection permissions for logged in user. + content: + application/json: + schema: + type: object + properties: &ref_27 + add_documents: + type: boolean + add_images: + type: boolean + annotate: + type: boolean + archive: + type: boolean + download_data: + type: boolean + modify_document_metadata: + type: boolean + modify_labels: + type: boolean + modify_users: + type: boolean + view: + type: boolean + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/documents/by_id/{doc_id}': + get: + summary: Get Document + description: > + Retrieve a document based on its ID. + + + Example: `curl + http://localhost:5000/documents/by_id/60c7453f5b72bf4ed65239ee --cookie + session.cookie` + operationId: documents_get + tags: + - documents + parameters: + - name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: *ref_10 + responses: + '200': + description: Successfully found the document based on the ID. + content: + application/json: + schema: + type: object + properties: &ref_25 + _id: + type: string + creator_id: + type: string + collection_id: + type: string + overlap: + type: integer + format: int64 + metadata: + type: object + additionalProperties: {} + text: + type: string + has_annotated: + type: object + additionalProperties: + type: boolean + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Document with given ID was not found. + content: *ref_12 + '500': + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + delete: + summary: Delete Document + description: > + Delete a document based on its ID. + + + This endpoint deletes a document and any annotations. It also updates + any next_instances so + + that the document will not be returned for annotation in any "get next + instance" calls in + + the future. It does NOT delete document data from any pipeline models + or update any IAA + + reports or pipeline metrics. These will be updated next time they are + requested. + + + Example: `curl -X DELETE + http://localhost:5000/documents/by_id/60c7453f5b72bf4ed65239ee --cookie + session.cookie` + operationId: documents_delete + tags: + - documents + parameters: + - name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: *ref_10 + responses: + '200': + description: 'Deletion successful, response has IDs of changed objects.' + content: + application/json: + schema: + type: object + properties: &ref_24 + success: + type: boolean + description: Whether the operation was successful. + changed_objs: + type: object + description: What database objects were changed during operation. + properties: + next_instances: + type: object + properties: + updated: + description: IDs of next_instance objects that were updated. + type: array + items: + type: string + annotations: + type: object + properties: + deleted: + description: IDs of annotation objects that were deleted. + type: array + items: + type: string + documents: + type: object + properties: + deleted: + description: IDs of document objects that were deleted. + type: array + items: + type: string + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Document with given ID was not found. + content: *ref_12 + '500': + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + /documents/by_ids: + delete: + summary: Delete Documents + description: > + Delete documents based on their IDs. + + + This endpoint deletes documents and any associated annotations. It also + updates any next_instances so + + that the documents will not be returned for annotation in any "get next + instance" calls in + + the future. It does NOT delete document data from any pipeline models + or update any IAA + + reports or pipeline metrics. These will be updated next time they are + requested. + + + Example: `curl -X DELETE + http://localhost:5000/documents/by_ids?ids=60c7453f5b72bf4ed65239ee,60c7453f5b72bf4ed65239ef + --cookie session.cookie` + operationId: documents_delete_multiple + tags: + - documents + parameters: + - name: ids + in: query + required: true + description: 'The IDs of the document to delete, comma-separated.' + schema: + type: string + example: '60c7453f5b72bf4ed65239ee,60c7453f5b72bf4ed65239ef' + responses: + '200': + description: 'Deletion successful, response has IDs of changed objects.' + content: + application/json: + schema: + type: object + properties: *ref_24 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Document with given ID was not found. + content: *ref_12 + '500': + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/documents/count_by_collection_id/{collection_id}': + get: + summary: Get Collection Document Count + description: > + Count the number of documents in a collection. + + + Example: `curl + http://localhost:5000/documents/count_by_collection_id/60c7453d5b72bf4ed65239e9 + --cookie session.cookie` + operationId: documents_count_by_collection + tags: + - documents + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: >- + Successfully found collection and counted number of documents + inside. + content: + application/json: + schema: + type: integer + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/documents/by_collection_id_all/{collection_id}': + get: + summary: Get All Collection Documents + description: > + Get all documents that are in a collection with a given collection id. + + + Example: `curl + http://localhost:5000/documents/by_collection_id_all/60c7453d5b72bf4ed65239e9 + --cookie session.cookie` + operationId: documents_get_by_collection + tags: + - documents + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: Successfully found collection and retrieved all related documents. + content: + application/json: + schema: + type: object + properties: &ref_26 + _items: + type: array + items: + type: object + properties: *ref_25 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/documents/by_collection_id_paginated/{collection_id}': + get: + summary: Get Paginated Collection Documents + description: > + Get a variable page of variable size of documents. + + + Example: `curl + "http://localhost:5000/documents/by_collection_id_paginated/60c7453d5b72bf4ed65239e9?page=1&pageSize=5" + --cookie session.cookie` + operationId: documents_get_by_collection_paginated + tags: + - documents + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + - name: page + in: query + required: true + description: > + The page number to get by 0 indexing (Will have documents + page_num*pageSize -> page_num*pageSize+pageSize-1 in the collection + if there are any.) + schema: + type: integer + - name: pageSize + in: query + required: true + description: The number of documents to put in each page. + schema: + type: integer + responses: + '200': + description: > + Successfully found collection and retrieved any (if any) associated + documents (Could return no documents if page number too high). + content: + application/json: + schema: + type: object + properties: *ref_26 + '400': + description: Input parameters are missing/invalid. + content: *ref_6 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/documents/user_permissions/{doc_id}': + get: + summary: Get User Document Permissions + description: > + Get the permission that the logged in user has for this document. + + + Example: `curl + http://localhost:5000/documents/user_permissions/60c7453f5b72bf4ed65239ee + --cookie session.cookie` + operationId: documents_permissions + tags: + - documents + parameters: + - name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: *ref_10 + responses: + '200': + description: Successfully found document and retrieved user permissions. + content: + application/json: + schema: + type: object + properties: *ref_27 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Document with given ID was not found. + content: *ref_12 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/documents/metadata/{doc_id}': + put: + summary: Update Document Metadata + description: > + Change/Replace the metadata of a certain document (does not add). + + + Example: `curl -X PUT + http://localhost:5000/documents/metadata/60c7453f5b72bf4ed65239ee -d + '{"test":"this"}' --cookie session.cookie -H + Content-Type:application/json` + + + Note: you need the content type header to specify json. + operationId: documents_update_metadata + tags: + - documents + parameters: + - name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: *ref_10 + requestBody: + description: The metadata in json form in the body. + required: true + content: + application/json: + schema: + type: object + additionalProperties: {} + responses: + '200': + description: Successfully found document and changed the metadata. + content: + application/json: + schema: + description: > + This object is returned when doing actions like modifying a + document or collection. It contains the ID of the object and + some other information from the database. + allOf: *ref_5 + '400': + description: Input parameters are missing/invalid. + content: *ref_6 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Document with given ID was not found. + content: *ref_12 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + /documents: + post: + summary: Create Document + description: > + Create a new document in a collection. + + + Example: `curl -X POST http://localhost:5000/documents/ -d + '{"collection_id":"6ada", "text":"blah"}' --cookie session.cookie -H + Content-Type:application/json` + operationId: documents_create + tags: + - documents + requestBody: + required: true + content: + application/json: + schema: + oneOf: + - description: >- + Arguments for the new document (at least collection_id, + creator_id, text). + type: object + properties: &ref_28 + collection_id: + type: string + creator_id: + type: string + text: + type: string + overlap: + type: number + format: double + metadata: + type: object + additionalProperties: {} + has_annotated: + type: object + additionalProperties: + type: boolean + required: &ref_29 + - collection_id + - creator_id + - text + - type: array + items: + description: >- + Arguments for the new document (at least collection_id, + creator_id, text). + type: object + properties: *ref_28 + required: *ref_29 + responses: + '200': + description: Successfully created the new document in the collection. + content: + application/json: + schema: + description: > + This object is returned when doing actions like modifying a + document or collection. It contains the ID of the object and + some other information from the database. + allOf: *ref_5 + '400': + description: Input parameters are missing/invalid. + content: *ref_6 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/iaa_reports/by_collection_id/{collection_id}': + get: + summary: Get IAA Report for Collection + description: > + Get the Inter-Annotator Agreement for a specified collection. + + + Note: This will not error with an invalid collection ID, it will give no + items. + + + Example: `curl -X GET + http://localhost:5000/iaa_reports/by_collection_id/60df138b3f8fa7b2e1445bd7 + --cookie ~/session.cookie -v` + operationId: iaa_get + tags: + - iaa_reports + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: Successfully got collection's IAA. + content: + application/json: + schema: + type: object + properties: + _items: + type: array + items: + allOf: &ref_56 + - allOf: *ref_30 + - type: object + properties: + _id: + type: string + collection_id: + type: string + num_of_annotators: + type: integer + num_of_agreement_docs: + type: integer + num_of_labels: + type: integer + per_doc_agreement: + type: object + properties: + doc_id: + type: string + avg: + type: number + format: double + stddev: + type: integer + per_label_agreement: + type: array + items: + type: object + properties: + label: + type: string + avg: + type: number + format: double + stddev: + type: integer + overall_agreement: + type: object + properties: + mean: + type: number + format: double + sd: + type: integer + heatmap_data: + type: object + properties: + matrix: + type: array + items: + type: array + items: + type: number + format: float + minItems: 2 + maxItems: 2 + example: + - 1 + - 0.666666 + annotators: + type: array + items: + type: string + example: + - ada + - margaret + labels_per_annotator: + type: object + additionalProperties: + type: object + additionalProperties: + type: integer + example: + ada: + label1: 1 + label2: 4 + margaret: + label1: 3 + label2: 2 + _updated: + type: string + format: date-time + _created: + type: string + format: date-time + _links: + type: object + properties: *ref_9 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + post: + summary: Create IAA Report for Collection + description: > + Create an Inter-Annotator-Agreement for a collection. + + + Note: This will not error with an invalid collection ID (or not enough + annotators), it will + + return false. + + + Example: `curl -X POST + http://localhost:5000/iaa_reports/by_collection_id/60df138b3f8fa7b2e1445bd7 + --cookie ~/session.cookie -v` + operationId: iaa_create + tags: + - iaa_reports + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: | + Tried to create the IAA (success or fail). + + False means invalid collection ID or not enough annotators. + content: + application/json: + schema: + type: boolean + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + /pipelines: + get: + summary: Get Pipelines + description: > + Get all pipelines. + + + Example: `curl -X GET http://localhost:5000/pipelines/ --cookie + ~/session.cookie` + operationId: pipelines_get_all + tags: + - pipelines + responses: + '200': + description: Successfully got pipelines. + content: + application/json: + schema: + type: object + properties: + _items: + type: array + items: + allOf: &ref_31 + - type: object + properties: *ref_8 + - type: object + properties: + _id: + type: string + title: + type: string + description: + type: string + name: + type: string + parameters: + type: object + additionalProperties: {} + example: + cutoff: integer + iterations: ' integer' + n_iter: integer + dropout: float + max_left: integer + use_class_feature: + - true + - false + use_word: + - true + - false + use_ngrams: + - true + - false + no_mid_ngrams: + - true + - false + max_ngram_length: integer + use_prev: + - true + - false + use_next: + - true + - false + use_disjunctive: + - true + - false + use_sequences: + - true + - false + use_prev_sequences: + - true + - false + use_type_seqs: + - true + - false + use_type_seqs2: + - true + - false + use_type_y_sequences: + - true + - false + _updated: + type: string + format: date-time + _created: + type: string + format: date-time + _links: + type: object + properties: *ref_9 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/by_id/{pipeline_id}': + get: + summary: Get Pipeline + description: > + Get the pipeline with the given ID. + + + Example: `curl -X GET + http://localhost:5000/pipelines/by_id/5babb6ee4eb7dd2c39b9671f --cookie + ~/session.cookie -v` + operationId: pipelines_get + tags: + - pipelines + parameters: + - name: pipeline_id + in: path + required: true + description: The id of the pipeline on which to operate. + schema: &ref_35 + type: string + responses: + '200': + description: Successfully got specified pipeline. + content: + application/json: + schema: + allOf: *ref_31 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Pipeline with given ID was not found. + content: &ref_36 + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/classifiers/by_collection_id/{collection_id}': + get: + summary: Get Collection Classifier + description: > + Get the classifier information for a collection. + + + Example: `curl -X GET + http://localhost:5000/pipelines/classifiers/by_collection_id/60db2cacdbfddb3ca87c845d + --cookie ~/session.cookie` + operationId: pipelines_get_collection_classifier + tags: + - pipelines + parameters: + - name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + responses: + '200': + description: Successfully found collection and got information. + content: + application/json: + schema: + allOf: &ref_52 + - allOf: *ref_30 + - type: object + properties: + _id: + type: string + _created: + type: string + format: date-time + _updated: + type: string + format: date-time + annotated_document_count: + type: integer + collection_id: + type: string + labels: + type: array + items: + type: string + overlap: + type: number + format: double + parameters: + type: object + additionalProperties: {} + pipeline_id: + type: string + train_every: + type: integer + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Collection with given ID was not found. + content: *ref_23 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + /pipelines/metrics: + get: + summary: Get Collection Metrics + description: > + Get metrics for all available collections. + + + Example: `curl -X GET http://localhost:5000/pipelines/metrics --cookie + ~/session.cookie` + operationId: pipelines_get_metrics + tags: + - pipelines + responses: + '200': + description: Successfully got metrics. + content: + application/json: + schema: + type: object + properties: + _items: + type: array + items: + type: object + properties: &ref_32 + _id: + type: string + collection_id: + type: string + classifier_id: + type: string + documents: + type: array + items: {} + annotations: + type: array + items: {} + folds: + type: array + items: {} + metrics: + type: array + items: {} + _updated: + type: string + _created: + type: string + _version: + type: integer + _etag: + type: string + _links: + type: object + properties: + self: + type: object + properties: + title: + type: string + href: + type: string + _links: + type: object + properties: *ref_9 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/metrics/by_classifier_id/{classifier_id}': + get: + summary: Get Classifier Metrics + description: > + Get metric by classifier id. + + + Example: `curl -X GET + http://localhost:5000/pipelines/metrics/by_classifier_id/60df138b3f8fa7b2e1445bd8 + --cookie ~/session.cookie` + operationId: pipelines_get_classifier_metrics + tags: + - pipelines + parameters: + - name: classifier_id + in: path + required: true + description: The id of the classifier on which to operate. + schema: &ref_33 + type: string + responses: + '200': + description: Successfully got metric(s). + content: + application/json: + schema: + type: object + properties: + _items: + type: array + items: + type: object + properties: *ref_32 + _links: + type: object + properties: *ref_9 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Classifier with given ID was not found. + content: &ref_34 + application/json: + schema: + description: Error message from the server. + type: string + example: Error message from the server. + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/next_document/by_classifier_id/{classifier_id}': + get: + summary: Get Next Document to Annotate + description: > + Get the next document id to annotate based on classifier id (or null if + no un-annotated + + documents). + + + Example: `curl -X GET + http://localhost:5000/pipelines/next_document/by_classifier_id/60df138b3f8fa7b2e1445bd8 + --cookie ~/session.cookie` + operationId: pipelines_get_next_document + tags: + - pipelines + parameters: + - name: classifier_id + in: path + required: true + description: The id of the classifier on which to operate. + schema: *ref_33 + responses: + '200': + description: 'Got ID of next document to annotate, or null if all are complete.' + content: + application/json: + schema: + type: string + nullable: true + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Classifier with given ID was not found. + content: *ref_34 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/next_document/by_classifier_id/{classifier_id}/{doc_id}': + post: + summary: Advance Next Document + description: > + Advance to next document by marking the given one as annotated. + + + Example: `curl -X POST + http://localhost:5000/pipelines/next_document/by_classifier_id/60df138b3f8fa7b2e1445bd8/60df13d73f8fa7b2e1445bdd + --cookie ~/session.cookie` + + + This will still give you a valid response with an invalid document ID. + operationId: pipelines_advance_next_document + tags: + - pipelines + parameters: + - name: classifier_id + in: path + required: true + description: The id of the classifier on which to operate. + schema: *ref_33 + - name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: *ref_10 + responses: + '200': + description: Complete annotations on document. + content: + application/json: + schema: + type: object + properties: + body: + type: object + nullable: true + success: + type: boolean + trained: + type: boolean + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Classifier with given ID was not found. + content: *ref_34 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/status/{pipeline_id}': + get: + summary: Get Pipeline Status + description: > + Get the status of the pipeline with the given ID. + + + Example: `curl -X GET + http://localhost:5000/pipelines/status/60df138b3f8fa7b2e1445bd8 --cookie + ~/session.cookie` + operationId: pipelines_get_status + tags: + - pipelines + parameters: + - name: pipeline_id + in: path + required: true + description: The id of the pipeline on which to operate. + schema: *ref_35 + responses: + '200': + description: Returns the status for the given pipeline. + content: + application/json: + schema: + type: object + properties: &ref_37 + service_details: + description: Information about the pipeline service. + type: object + properties: + channel: + type: string + framework: + type: string + framework_types: + type: array + items: + type: string + name: + type: string + version: + type: string + format: version + job_id: + description: The ID of this pipeline job. + type: string + format: uuid + job_request: + description: The job request data submitted to pipelines. + type: object + properties: &ref_38 + job_id: + description: The ID of this pipeline job. + type: string + format: uuid + job_queue: + type: string + job_type: + type: string + job_data: + type: object + properties: + framework: + type: string + type: + description: The type of job. + type: string + classifier_id: + type: string + nullable: true + additionalProperties: + description: Any additional job parameters. + job_response: + description: The job request data received from pipelines. + type: object + properties: + pipeline_name: + type: string + eve_entry_point: + type: string + model_dir: + type: string + format: path + classifier: + description: Status of the classifier. + type: object + has_trained: + description: Whether the classifier has trained. + type: boolean + classifier_id: + description: Will not be present for pipeline status. + type: string + nullable: true + classifier_class: + description: Python class for this classifier. + type: string + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Pipeline with given ID was not found. + content: *ref_36 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/classifiers/status/{classifier_id}': + get: + summary: Get Classifier Status + description: > + Get the status of the classifier with the given ID. + + + Example: `curl -X GET + http://localhost:5000/pipelines/classifiers/status/60df138b3f8fa7b2e1445bd8 + --cookie ~/session.cookie` + operationId: pipelines_get_classifier_status + tags: + - pipelines + parameters: + - name: classifier_id + in: path + required: true + description: The id of the classifier on which to operate. + schema: *ref_33 + responses: + '200': + description: Returns the status for the given classifier. + content: + application/json: + schema: + type: object + properties: *ref_37 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Classifier with given ID was not found. + content: *ref_34 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/running_jobs/{classifier_id}': + get: + summary: Get Classifier Running Jobs + description: > + Get any currently running jobs of the classifier with the given ID. + + + Example: `curl -X GET + http://localhost:5000/pipelines/running_jobs/60df138b3f8fa7b2e1445bd8 + --cookie ~/session.cookie` + operationId: pipelines_get_running_jobs + tags: + - pipelines + parameters: + - name: classifier_id + in: path + required: true + description: The id of the classifier on which to operate. + schema: *ref_33 + responses: + '200': + description: Returns the all currently running jobs for the classifier. + content: + application/json: + schema: + type: array + items: + type: string + format: uuid + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Classifier with given ID was not found. + content: *ref_34 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/train/{classifier_id}': + post: + summary: Train Classifier + description: > + Trains the classifier based on currently annotated documents in the + collection. + + + This endpoint is _ASYNCHRONOUS_ in that it will return information about + the submitted job + + rather than any results from the job. + + + Example: `curl -X POST + http://localhost:5000/pipelines/train/60df138b3f8fa7b2e1445bd8 --cookie + session.cookie` + operationId: pipelines_train + tags: + - pipelines + parameters: + - name: classifier_id + in: path + required: true + description: The id of the classifier on which to operate. + schema: *ref_33 + requestBody: + content: + application/json: + schema: + type: object + properties: + model_name: + description: Optional name to save the model for future reference. + type: string + responses: + '200': + description: Returns the all currently running jobs for the classifier. + content: + application/json: + schema: + type: object + properties: + request: + description: The job request data submitted to pipelines. + type: object + properties: *ref_38 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Classifier with given ID was not found. + content: *ref_34 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] + '/pipelines/predict/{classifier_id}': + post: + summary: Predict Using Classifier + description: > + Uses the given classifier to predict annotations for the given + document(s). + + + Example: `curl -X POST + http://localhost:5000/pipelines/predict/60df138b3f8fa7b2e1445bd8 + --cookie session.cookie` + operationId: pipelines_predict + tags: + - pipelines + parameters: + - name: classifier_id + in: path + required: true + description: The id of the classifier on which to operate. + schema: *ref_33 + requestBody: + content: + application/json: + schema: + description: Either document_ids or texts must be given and non-empty. + type: object + properties: &ref_53 + document_ids: + description: IDs of documents to predict annotations for. + type: array + items: + type: string + default: [] + texts: + description: Text of documents to predict annotations for. + type: array + items: + type: string + default: [] + timeout_in_s: + description: >- + If provided, will wait this long before timing out on the + job. + type: integer + default: 36000 + responses: + '200': + description: Returns the predictions and other job information. + content: + application/json: + schema: + description: Pipeline predictions and other job information. + type: object + properties: &ref_54 + job_id: + type: string + format: uuid + job_request: + description: The job request data submitted to pipelines. + type: object + properties: *ref_38 + job_response: + type: object + properties: + documents_by_id: + description: >- + Predictions in a mapping from document ID to + annotations. + type: object + additionalProperties: + type: object + properties: &ref_39 + doc: + description: Document-level annotations. + type: array + items: + description: Annotation label. + type: string + example: + - label1 + - label2 + ner: + description: 'NER annotations. [startIndex, endIndex, label].' + type: array + items: + type: array + items: + oneOf: + - type: string + - type: integer + example: + - 5 + - 10 + - label1 + texts: + description: >- + Predictions for manual texts in the same order as they + were in the input. + type: array + items: + type: object + properties: *ref_39 + '400': + description: Input parameters are missing/invalid. + content: *ref_6 + '401': + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + '404': + description: Classifier with given ID was not found. + content: *ref_34 + default: + description: 'Unexpected error, check server logs.' + content: *ref_1 + security: + - cookieAuth: [] +components: + securitySchemes: + cookieAuth: + description: > + This an example command to provision and print the session key using + eve: + + + `curl -X POST -H "Content-Type:application/json" -d + '{"username":"ada@pine.jhuapl.edu","password":"ada@pine.jhuapl.edu"}' + http://localhost:5000/auth/login --cookie-jar - --output /dev/null + --silent | grep -o -P "session\s.+" | sed -e 's/session\s/session=/' -` + type: apiKey + in: cookie + name: session + schemas: + UserRoles: + description: The role (for permissions) of the user. + type: array + items: *ref_4 + NewUserData: + type: object + properties: *ref_40 + required: *ref_41 + UpdateUserData: + type: object + properties: *ref_42 + required: *ref_43 + WrappedAnnotations: + type: object + properties: *ref_15 + LoginForm: + description: Information needed to display a login form. + type: object + properties: *ref_44 + example: *ref_45 + EveLogin: + description: Only for eve login. + type: object + properties: *ref_46 + EvePasswordChange: + type: object + properties: *ref_47 + VegasAuthToken: + description: An auth token obtained by Vegas out-of-band from PINE. + type: object + properties: *ref_48 + additionalProperties: *ref_49 + WrappedCollections: + type: object + properties: *ref_20 + NewCollection: + type: object + properties: *ref_50 + required: *ref_51 + WrappedDocuments: + type: object + properties: *ref_26 + NewDocument: + description: >- + Arguments for the new document (at least collection_id, creator_id, + text). + type: object + properties: *ref_28 + required: *ref_29 + Classifier: + allOf: *ref_52 + PipelineJobRequest: + description: The job request data submitted to pipelines. + type: object + properties: *ref_38 + PipelineOrClassifierStatus: + type: object + properties: *ref_37 + PipelinePredictParameters: + description: Either document_ids or texts must be given and non-empty. + type: object + properties: *ref_53 + PipelineDocumentPredictions: + type: object + properties: *ref_39 + PipelinePredictions: + description: Pipeline predictions and other job information. + type: object + properties: *ref_54 + ErrorResponse: + description: Error message from the server. + type: string + example: Error message from the server. + UserInfo: + type: object + properties: *ref_2 + EveBase: + type: object + properties: *ref_8 + EveLinks: + type: object + properties: *ref_9 + IDInfo: + description: > + This object is returned when doing actions like modifying a document or + collection. It contains the ID of the object and some other information + from the database. + allOf: *ref_5 + EveBaseWithVersion: + allOf: *ref_30 + UserDocumentAnnotation: + description: > + This is the log of annotations by a specific user. A document might + have 0, 1, or multiple of these based on how many users annotated. + allOf: *ref_55 + DocumentAnnotations: + type: object + properties: *ref_13 + example: *ref_14 + AuthUser: + type: object + properties: *ref_18 + example: *ref_19 + AuthUserDetails: + type: object + properties: *ref_16 + example: *ref_17 + Collection: + type: object + properties: *ref_22 + UserPermissions: + type: object + properties: *ref_27 + Document: + type: object + properties: *ref_25 + DocumentDeletionResponse: + type: object + properties: *ref_24 + InterAnnotatorAgreement: + allOf: *ref_56 + Pipeline: + allOf: *ref_31 + CollectionMetric: + type: object + properties: *ref_32 + responses: + UnexpectedServerError: + description: 'Unexpected error, check server logs.' + content: *ref_1 + NotAuthorizedOrNotAdmin: + description: 'Authentication failed, not logged in or not an admin.' + content: *ref_0 + InvalidInputParameters: + description: Input parameters are missing/invalid. + content: *ref_6 + MismatchedEtag: + description: Given etag did not match the most updated stored one. + content: *ref_57 + Success: + description: Whether the operation succeeded or failed. + content: *ref_7 + NotAuthorized: + description: > + Authentication failed: not logged in or user doesn't have the + permissions for this operation. + content: *ref_11 + DocumentNotFound: + description: Document with given ID was not found. + content: *ref_12 + CollectionNotFound: + description: Collection with given ID was not found. + content: *ref_23 + PipelineNotFound: + description: Pipeline with given ID was not found. + content: *ref_36 + ClassifierNotFound: + description: Classifier with given ID was not found. + content: *ref_34 + parameters: + userIdParam: + name: user_id + in: path + required: true + description: ID of the user on which to operate. + schema: *ref_3 + docIdParam: + name: doc_id + in: path + required: true + description: The id of the document on which to operate. + schema: *ref_10 + collectionIdParam: + name: collection_id + in: path + required: true + description: The id of the collection on which to operate. + schema: *ref_21 + pipelineIdParam: + name: pipeline_id + in: path + required: true + description: The id of the pipeline on which to operate. + schema: *ref_35 + classifierIdParam: + name: classifier_id + in: path + required: true + description: The id of the classifier on which to operate. + schema: *ref_33 +tags: + - name: admin + description: > + Operations in the "admin" blueprint. These operations are generally only + available when the "eve" auth module is running and are only accessible to + logged-in users that are administrators. + x-displayName: admin + - name: annotations + description: Operations in the "annotations" blueprint. + x-displayName: annotations + - name: auth + description: Operations in the "auth" blueprint. + x-displayName: auth + - name: auth_eve + description: These operations are only available if using "eve" auth module. + x-displayName: auth_eve + - name: auth_vegas + description: These operations are only available if using "vegas" auth module. + x-displayName: auth_vegas + - name: collections + description: Operations in the "collections" blueprint. + x-displayName: collections + - name: documents + description: Operations in the "documents" blueprint. + x-displayName: documents + - name: iaa_reports + description: Operations in the "iaa_reports" blueprint. + x-displayName: iaa_reports + - name: pipelines + description: Operations in the "pipelines" blueprint. + x-displayName: pipelines +x-tagGroups: + - name: openapi + tags: + - admin + - annotations + - auth + - auth_eve + - auth_vegas + - collections + - documents + - iaa_reports + - pipelines diff --git a/backend/pine/backend/api/swagger-ui/VERSION b/backend/pine/backend/api/swagger-ui/VERSION new file mode 100644 index 0000000..ca25ff6 --- /dev/null +++ b/backend/pine/backend/api/swagger-ui/VERSION @@ -0,0 +1 @@ +3.50.0 diff --git a/backend/pine/backend/api/swagger-ui/favicon-16x16.png b/backend/pine/backend/api/swagger-ui/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..8b194e617af1c135e6b37939591d24ac3a5efa18 GIT binary patch literal 665 zcmV;K0%rY*P)}JKSduyL>)s!A4EhTMMEM%Q;aL6%l#xiZiF>S;#Y{N2Zz%pvTGHJduXuC6Lx-)0EGfRy*N{Tv4i8@4oJ41gw zKzThrcRe|7J~(YYIBq{SYCkn-KQm=N8$CrEK1CcqMI1dv9z#VRL_{D)L|`QmF8}}l zJ9JV`Q}p!p_4f7m_U`WQ@apR4;o;!mnU<7}iG_qr zF(e)x9~BG-3IzcG2M4an0002kNkl41`ZiN1i62V%{PM@Ry|IS_+Yc7{bb`MM~xm(7p4|kMHP&!VGuDW4kFixat zXw43VmgwEvB$hXt_u=vZ>+v4i7E}n~eG6;n4Z=zF1n?T*yg<;W6kOfxpC6nao>VR% z?fpr=asSJ&`L*wu^rLJ5Peq*PB0;alL#XazZCBxJLd&giTfw@!hW167F^`7kobi;( ze<<>qNlP|xy7S1zl@lZNIBR7#o9ybJsptO#%}P0hz~sBp00000NkvXXu0mjfUsDF? literal 0 HcmV?d00001 diff --git a/backend/pine/backend/api/swagger-ui/favicon-32x32.png b/backend/pine/backend/api/swagger-ui/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..249737fe44558e679f0b67134e274461d988fa98 GIT binary patch literal 628 zcmV-)0*n2LP)Ma*GM0}OV<074bNCP7P7GVd{iMr*I6y~TMLss@FjvgL~HxU z%Vvj33AwpD(Z4*$Mfx=HaU16axM zt2xG_rloN<$iy9j9I5 + + + + + Swagger UI + + + + + + + +
+ + + + + + diff --git a/backend/pine/backend/api/swagger-ui/oauth2-redirect.html b/backend/pine/backend/api/swagger-ui/oauth2-redirect.html new file mode 100644 index 0000000..64b171f --- /dev/null +++ b/backend/pine/backend/api/swagger-ui/oauth2-redirect.html @@ -0,0 +1,75 @@ + + + + Swagger UI: OAuth2 Redirect + + + + + diff --git a/backend/pine/backend/api/swagger-ui/swagger-ui-bundle.js b/backend/pine/backend/api/swagger-ui/swagger-ui-bundle.js new file mode 100644 index 0000000..12c26d6 --- /dev/null +++ b/backend/pine/backend/api/swagger-ui/swagger-ui-bundle.js @@ -0,0 +1,3 @@ +/*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(function(){try{return require("esprima")}catch(e){}}()):"function"==typeof define&&define.amd?define(["esprima"],t):"object"==typeof exports?exports.SwaggerUIBundle=t(function(){try{return require("esprima")}catch(e){}}()):e.SwaggerUIBundle=t(e.esprima)}(this,(function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist",n(n.s=555)}([function(e,t,n){"use strict";e.exports=n(131)},function(e,t,n){e.exports=function(){"use strict";var e=Array.prototype.slice;function t(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function n(e){return i(e)?e:J(e)}function r(e){return s(e)?e:K(e)}function o(e){return u(e)?e:Y(e)}function a(e){return i(e)&&!c(e)?e:G(e)}function i(e){return!(!e||!e[p])}function s(e){return!(!e||!e[f])}function u(e){return!(!e||!e[h])}function c(e){return s(e)||u(e)}function l(e){return!(!e||!e[d])}t(r,n),t(o,n),t(a,n),n.isIterable=i,n.isKeyed=s,n.isIndexed=u,n.isAssociative=c,n.isOrdered=l,n.Keyed=r,n.Indexed=o,n.Set=a;var p="@@__IMMUTABLE_ITERABLE__@@",f="@@__IMMUTABLE_KEYED__@@",h="@@__IMMUTABLE_INDEXED__@@",d="@@__IMMUTABLE_ORDERED__@@",m="delete",v=5,g=1<>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?A(e)+t:t}function k(){return!0}function j(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function T(e,t){return P(e,t,0)}function I(e,t){return P(e,t,t)}function P(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var N=0,M=1,R=2,D="function"==typeof Symbol&&Symbol.iterator,L="@@iterator",B=D||L;function F(e){this.next=e}function U(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function q(){return{value:void 0,done:!0}}function z(e){return!!H(e)}function V(e){return e&&"function"==typeof e.next}function W(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(D&&e[D]||e[L]);if("function"==typeof t)return t}function $(e){return e&&"number"==typeof e.length}function J(e){return null==e?ie():i(e)?e.toSeq():ce(e)}function K(e){return null==e?ie().toKeyedSeq():i(e)?s(e)?e.toSeq():e.fromEntrySeq():se(e)}function Y(e){return null==e?ie():i(e)?s(e)?e.entrySeq():e.toIndexedSeq():ue(e)}function G(e){return(null==e?ie():i(e)?s(e)?e.entrySeq():e:ue(e)).toSetSeq()}F.prototype.toString=function(){return"[Iterator]"},F.KEYS=N,F.VALUES=M,F.ENTRIES=R,F.prototype.inspect=F.prototype.toSource=function(){return this.toString()},F.prototype[B]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return pe(this,e,t,!0)},J.prototype.__iterator=function(e,t){return fe(this,e,t,!0)},t(K,J),K.prototype.toKeyedSeq=function(){return this},t(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString("Seq [","]")},Y.prototype.__iterate=function(e,t){return pe(this,e,t,!1)},Y.prototype.__iterator=function(e,t){return fe(this,e,t,!1)},t(G,J),G.of=function(){return G(arguments)},G.prototype.toSetSeq=function(){return this},J.isSeq=ae,J.Keyed=K,J.Set=G,J.Indexed=Y;var Z,X,Q,ee="@@__IMMUTABLE_SEQ__@@";function te(e){this._array=e,this.size=e.length}function ne(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function re(e){this._iterable=e,this.size=e.length||e.size}function oe(e){this._iterator=e,this._iteratorCache=[]}function ae(e){return!(!e||!e[ee])}function ie(){return Z||(Z=new te([]))}function se(e){var t=Array.isArray(e)?new te(e).fromEntrySeq():V(e)?new oe(e).fromEntrySeq():z(e)?new re(e).fromEntrySeq():"object"==typeof e?new ne(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function ue(e){var t=le(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function ce(e){var t=le(e)||"object"==typeof e&&new ne(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}function le(e){return $(e)?new te(e):V(e)?new oe(e):z(e)?new re(e):void 0}function pe(e,t,n,r){var o=e._cache;if(o){for(var a=o.length-1,i=0;i<=a;i++){var s=o[n?a-i:i];if(!1===t(s[1],r?s[0]:i,e))return i+1}return i}return e.__iterateUncached(t,n)}function fe(e,t,n,r){var o=e._cache;if(o){var a=o.length-1,i=0;return new F((function(){var e=o[n?a-i:i];return i++>a?q():U(t,r?e[0]:i-1,e[1])}))}return e.__iteratorUncached(t,n)}function he(e,t){return t?de(t,e,"",{"":e}):me(e)}function de(e,t,n,r){return Array.isArray(t)?e.call(r,n,Y(t).map((function(n,r){return de(e,n,r,t)}))):ve(t)?e.call(r,n,K(t).map((function(n,r){return de(e,n,r,t)}))):t}function me(e){return Array.isArray(e)?Y(e).map(me).toList():ve(e)?K(e).map(me).toMap():e}function ve(e){return e&&(e.constructor===Object||void 0===e.constructor)}function ge(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function ye(e,t){if(e===t)return!0;if(!i(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||s(e)!==s(t)||u(e)!==u(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!c(e);if(l(e)){var r=e.entries();return t.every((function(e,t){var o=r.next().value;return o&&ge(o[1],e)&&(n||ge(o[0],t))}))&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var a=e;e=t,t=a}var p=!0,f=t.__iterate((function(t,r){if(n?!e.has(t):o?!ge(t,e.get(r,b)):!ge(e.get(r,b),t))return p=!1,!1}));return p&&e.size===f}function be(e,t){if(!(this instanceof be))return new be(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(X)return X;X=this}}function _e(e,t){if(!e)throw new Error(t)}function xe(e,t,n){if(!(this instanceof xe))return new xe(e,t,n);if(_e(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),tr?q():U(e,o,n[t?r-o++:o++])}))},t(ne,K),ne.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},ne.prototype.has=function(e){return this._object.hasOwnProperty(e)},ne.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,a=0;a<=o;a++){var i=r[t?o-a:a];if(!1===e(n[i],i,this))return a+1}return a},ne.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,a=0;return new F((function(){var i=r[t?o-a:a];return a++>o?q():U(e,i,n[i])}))},ne.prototype[d]=!0,t(re,Y),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=W(this._iterable),r=0;if(V(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},re.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=W(this._iterable);if(!V(n))return new F(q);var r=0;return new F((function(){var t=n.next();return t.done?t:U(e,r++,t.value)}))},t(oe,Y),oe.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,a=0;a=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return U(e,o,r[o++])}))},t(be,Y),be.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},be.prototype.get=function(e,t){return this.has(e)?this._value:t},be.prototype.includes=function(e){return ge(this._value,e)},be.prototype.slice=function(e,t){var n=this.size;return j(e,t,n)?this:new be(this._value,I(t,n)-T(e,n))},be.prototype.reverse=function(){return this},be.prototype.indexOf=function(e){return ge(this._value,e)?0:-1},be.prototype.lastIndexOf=function(e){return ge(this._value,e)?this.size:-1},be.prototype.__iterate=function(e,t){for(var n=0;n=0&&t=0&&nn?q():U(e,a++,i)}))},xe.prototype.equals=function(e){return e instanceof xe?this._start===e._start&&this._end===e._end&&this._step===e._step:ye(this,e)},t(we,n),t(Ee,we),t(Se,we),t(Ce,we),we.Keyed=Ee,we.Indexed=Se,we.Set=Ce;var Ae="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function Oe(e){return e>>>1&1073741824|3221225471&e}function ke(e){if(!1===e||null==e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return Oe(n)}if("string"===t)return e.length>Fe?je(e):Te(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return Ie(e);if("function"==typeof e.toString)return Te(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function je(e){var t=ze[e];return void 0===t&&(t=Te(e),qe===Ue&&(qe=0,ze={}),qe++,ze[e]=t),t}function Te(e){for(var t=0,n=0;n0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}var Re,De="function"==typeof WeakMap;De&&(Re=new WeakMap);var Le=0,Be="__immutablehash__";"function"==typeof Symbol&&(Be=Symbol(Be));var Fe=16,Ue=255,qe=0,ze={};function Ve(e){_e(e!==1/0,"Cannot perform this action with an infinite size.")}function We(e){return null==e?ot():He(e)&&!l(e)?e:ot().withMutations((function(t){var n=r(e);Ve(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}function He(e){return!(!e||!e[Je])}t(We,Ee),We.of=function(){var t=e.call(arguments,0);return ot().withMutations((function(e){for(var n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}}))},We.prototype.toString=function(){return this.__toString("Map {","}")},We.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},We.prototype.set=function(e,t){return at(this,e,t)},We.prototype.setIn=function(e,t){return this.updateIn(e,b,(function(){return t}))},We.prototype.remove=function(e){return at(this,e,b)},We.prototype.deleteIn=function(e){return this.updateIn(e,(function(){return b}))},We.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},We.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=vt(this,wn(e),t,n);return r===b?void 0:r},We.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):ot()},We.prototype.merge=function(){return ft(this,void 0,arguments)},We.prototype.mergeWith=function(t){return ft(this,t,e.call(arguments,1))},We.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return"function"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]}))},We.prototype.mergeDeep=function(){return ft(this,ht,arguments)},We.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return ft(this,dt(t),n)},We.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]}))},We.prototype.sort=function(e){return zt(pn(this,e))},We.prototype.sortBy=function(e,t){return zt(pn(this,t,e))},We.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},We.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new S)},We.prototype.asImmutable=function(){return this.__ensureOwner()},We.prototype.wasAltered=function(){return this.__altered},We.prototype.__iterator=function(e,t){return new et(this,e,t)},We.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate((function(t){return r++,e(t[1],t[0],n)}),t),r},We.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?rt(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},We.isMap=He;var $e,Je="@@__IMMUTABLE_MAP__@@",Ke=We.prototype;function Ye(e,t){this.ownerID=e,this.entries=t}function Ge(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function Ze(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Xe(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Qe(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function et(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&nt(e._root)}function tt(e,t){return U(e,t[0],t[1])}function nt(e,t){return{node:e,index:0,__prev:t}}function rt(e,t,n,r){var o=Object.create(Ke);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function ot(){return $e||($e=rt(0))}function at(e,t,n){var r,o;if(e._root){var a=w(_),i=w(x);if(r=it(e._root,e.__ownerID,0,void 0,t,n,a,i),!i.value)return e;o=e.size+(a.value?n===b?-1:1:0)}else{if(n===b)return e;o=1,r=new Ye(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?rt(o,r):ot()}function it(e,t,n,r,o,a,i,s){return e?e.update(t,n,r,o,a,i,s):a===b?e:(E(s),E(i),new Qe(t,r,[o,a]))}function st(e){return e.constructor===Qe||e.constructor===Xe}function ut(e,t,n,r,o){if(e.keyHash===r)return new Xe(t,r,[e.entry,o]);var a,i=(0===n?e.keyHash:e.keyHash>>>n)&y,s=(0===n?r:r>>>n)&y;return new Ge(t,1<>>=1)i[s]=1&n?t[a++]:void 0;return i[r]=o,new Ze(e,a+1,i)}function ft(e,t,n){for(var o=[],a=0;a>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function yt(e,t,n,r){var o=r?e:C(e);return o[t]=n,o}function bt(e,t,n,r){var o=e.length+1;if(r&&t+1===o)return e[t]=n,e;for(var a=new Array(o),i=0,s=0;s=xt)return ct(e,u,r,o);var f=e&&e===this.ownerID,h=f?u:C(u);return p?s?c===l-1?h.pop():h[c]=h.pop():h[c]=[r,o]:h.push([r,o]),f?(this.entries=h,this):new Ye(e,h)}},Ge.prototype.get=function(e,t,n,r){void 0===t&&(t=ke(n));var o=1<<((0===e?t:t>>>e)&y),a=this.bitmap;return 0==(a&o)?r:this.nodes[gt(a&o-1)].get(e+v,t,n,r)},Ge.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=ke(r));var s=(0===t?n:n>>>t)&y,u=1<=wt)return pt(e,f,c,s,d);if(l&&!d&&2===f.length&&st(f[1^p]))return f[1^p];if(l&&d&&1===f.length&&st(d))return d;var m=e&&e===this.ownerID,g=l?d?c:c^u:c|u,_=l?d?yt(f,p,d,m):_t(f,p,m):bt(f,p,d,m);return m?(this.bitmap=g,this.nodes=_,this):new Ge(e,g,_)},Ze.prototype.get=function(e,t,n,r){void 0===t&&(t=ke(n));var o=(0===e?t:t>>>e)&y,a=this.nodes[o];return a?a.get(e+v,t,n,r):r},Ze.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=ke(r));var s=(0===t?n:n>>>t)&y,u=o===b,c=this.nodes,l=c[s];if(u&&!l)return this;var p=it(l,e,t+v,n,r,o,a,i);if(p===l)return this;var f=this.count;if(l){if(!p&&--f0&&r=0&&e>>t&y;if(r>=this.array.length)return new kt([],e);var o,a=0===r;if(t>0){var i=this.array[r];if((o=i&&i.removeBefore(e,t-v,n))===i&&a)return this}if(a&&!o)return this;var s=Lt(this,e);if(!a)for(var u=0;u>>t&y;if(o>=this.array.length)return this;if(t>0){var a=this.array[o];if((r=a&&a.removeAfter(e,t-v,n))===a&&o===this.array.length-1)return this}var i=Lt(this,e);return i.array.splice(o+1),r&&(i.array[o]=r),i};var jt,Tt,It={};function Pt(e,t){var n=e._origin,r=e._capacity,o=qt(r),a=e._tail;return i(e._root,e._level,0);function i(e,t,n){return 0===t?s(e,n):u(e,t,n)}function s(e,i){var s=i===o?a&&a.array:e&&e.array,u=i>n?0:n-i,c=r-i;return c>g&&(c=g),function(){if(u===c)return It;var e=t?--c:u++;return s&&s[e]}}function u(e,o,a){var s,u=e&&e.array,c=a>n?0:n-a>>o,l=1+(r-a>>o);return l>g&&(l=g),function(){for(;;){if(s){var e=s();if(e!==It)return e;s=null}if(c===l)return It;var n=t?--l:c++;s=i(u&&u[n],o-v,a+(n<=e.size||t<0)return e.withMutations((function(e){t<0?Ft(e,t).set(0,n):Ft(e,0,t+1).set(t,n)}));t+=e._origin;var r=e._tail,o=e._root,a=w(x);return t>=qt(e._capacity)?r=Dt(r,e.__ownerID,0,t,n,a):o=Dt(o,e.__ownerID,e._level,t,n,a),a.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):Nt(e._origin,e._capacity,e._level,o,r):e}function Dt(e,t,n,r,o,a){var i,s=r>>>n&y,u=e&&s0){var c=e&&e.array[s],l=Dt(c,t,n-v,r,o,a);return l===c?e:((i=Lt(e,t)).array[s]=l,i)}return u&&e.array[s]===o?e:(E(a),i=Lt(e,t),void 0===o&&s===i.array.length-1?i.array.pop():i.array[s]=o,i)}function Lt(e,t){return t&&e&&t===e.ownerID?e:new kt(e?e.array.slice():[],t)}function Bt(e,t){if(t>=qt(e._capacity))return e._tail;if(t<1<0;)n=n.array[t>>>r&y],r-=v;return n}}function Ft(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new S,o=e._origin,a=e._capacity,i=o+t,s=void 0===n?a:n<0?a+n:o+n;if(i===o&&s===a)return e;if(i>=s)return e.clear();for(var u=e._level,c=e._root,l=0;i+l<0;)c=new kt(c&&c.array.length?[void 0,c]:[],r),l+=1<<(u+=v);l&&(i+=l,o+=l,s+=l,a+=l);for(var p=qt(a),f=qt(s);f>=1<p?new kt([],r):h;if(h&&f>p&&iv;g-=v){var b=p>>>g&y;m=m.array[b]=Lt(m.array[b],r)}m.array[p>>>v&y]=h}if(s=f)i-=f,s-=f,u=v,c=null,d=d&&d.removeBefore(r,0,i);else if(i>o||f>>u&y;if(_!==f>>>u&y)break;_&&(l+=(1<o&&(c=c.removeBefore(r,u,i-l)),c&&fa&&(a=c.size),i(u)||(c=c.map((function(e){return he(e)}))),r.push(c)}return a>e.size&&(e=e.setSize(a)),mt(e,t,r)}function qt(e){return e>>v<=g&&i.size>=2*a.size?(r=(o=i.filter((function(e,t){return void 0!==e&&s!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=a.remove(t),o=s===i.size-1?i.pop():i.set(s,void 0))}else if(u){if(n===i.get(s)[1])return e;r=a,o=i.set(s,[t,n])}else r=a.set(t,i.size),o=i.set(i.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Wt(r,o)}function Jt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Kt(e){this._iter=e,this.size=e.size}function Yt(e){this._iter=e,this.size=e.size}function Gt(e){this._iter=e,this.size=e.size}function Zt(e){var t=bn(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=_n,t.__iterateUncached=function(t,n){var r=this;return e.__iterate((function(e,n){return!1!==t(n,e,r)}),n)},t.__iteratorUncached=function(t,n){if(t===R){var r=e.__iterator(t,n);return new F((function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e}))}return e.__iterator(t===M?N:M,n)},t}function Xt(e,t,n){var r=bn(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var a=e.get(r,b);return a===b?o:t.call(n,a,r,e)},r.__iterateUncached=function(r,o){var a=this;return e.__iterate((function(e,o,i){return!1!==r(t.call(n,e,o,i),o,a)}),o)},r.__iteratorUncached=function(r,o){var a=e.__iterator(R,o);return new F((function(){var o=a.next();if(o.done)return o;var i=o.value,s=i[0];return U(r,s,t.call(n,i[1],s,e),o)}))},r}function Qt(e,t){var n=bn(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Zt(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=_n,n.__iterate=function(t,n){var r=this;return e.__iterate((function(e,n){return t(e,n,r)}),!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function en(e,t,n,r){var o=bn(e);return r&&(o.has=function(r){var o=e.get(r,b);return o!==b&&!!t.call(n,o,r,e)},o.get=function(r,o){var a=e.get(r,b);return a!==b&&t.call(n,a,r,e)?a:o}),o.__iterateUncached=function(o,a){var i=this,s=0;return e.__iterate((function(e,a,u){if(t.call(n,e,a,u))return s++,o(e,r?a:s-1,i)}),a),s},o.__iteratorUncached=function(o,a){var i=e.__iterator(R,a),s=0;return new F((function(){for(;;){var a=i.next();if(a.done)return a;var u=a.value,c=u[0],l=u[1];if(t.call(n,l,c,e))return U(o,r?c:s++,l,a)}}))},o}function tn(e,t,n){var r=We().asMutable();return e.__iterate((function(o,a){r.update(t.call(n,o,a,e),0,(function(e){return e+1}))})),r.asImmutable()}function nn(e,t,n){var r=s(e),o=(l(e)?zt():We()).asMutable();e.__iterate((function(a,i){o.update(t.call(n,a,i,e),(function(e){return(e=e||[]).push(r?[i,a]:a),e}))}));var a=yn(e);return o.map((function(t){return mn(e,a(t))}))}function rn(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),j(t,n,o))return e;var a=T(t,o),i=I(n,o);if(a!=a||i!=i)return rn(e.toSeq().cacheResult(),t,n,r);var s,u=i-a;u==u&&(s=u<0?0:u);var c=bn(e);return c.size=0===s?s:e.size&&s||void 0,!r&&ae(e)&&s>=0&&(c.get=function(t,n){return(t=O(this,t))>=0&&ts)return q();var e=o.next();return r||t===M?e:U(t,u-1,t===N?void 0:e.value[1],e)}))},c}function on(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterate(r,o);var i=0;return e.__iterate((function(e,o,s){return t.call(n,e,o,s)&&++i&&r(e,o,a)})),i},r.__iteratorUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterator(r,o);var i=e.__iterator(R,o),s=!0;return new F((function(){if(!s)return q();var e=i.next();if(e.done)return e;var o=e.value,u=o[0],c=o[1];return t.call(n,c,u,a)?r===R?e:U(r,u,c,e):(s=!1,q())}))},r}function an(e,t,n,r){var o=bn(e);return o.__iterateUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterate(o,a);var s=!0,u=0;return e.__iterate((function(e,a,c){if(!s||!(s=t.call(n,e,a,c)))return u++,o(e,r?a:u-1,i)})),u},o.__iteratorUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterator(o,a);var s=e.__iterator(R,a),u=!0,c=0;return new F((function(){var e,a,l;do{if((e=s.next()).done)return r||o===M?e:U(o,c++,o===N?void 0:e.value[1],e);var p=e.value;a=p[0],l=p[1],u&&(u=t.call(n,l,a,i))}while(u);return o===R?e:U(o,a,l,e)}))},o}function sn(e,t){var n=s(e),o=[e].concat(t).map((function(e){return i(e)?n&&(e=r(e)):e=n?se(e):ue(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===o.length)return e;if(1===o.length){var a=o[0];if(a===e||n&&s(a)||u(e)&&u(a))return a}var c=new te(o);return n?c=c.toKeyedSeq():u(e)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=o.reduce((function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}}),0),c}function un(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=0,s=!1;function u(e,c){var l=this;e.__iterate((function(e,o){return(!t||c0}function dn(e,t,r){var o=bn(e);return o.size=new te(r).map((function(e){return e.size})).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(M,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var a=r.map((function(e){return e=n(e),W(o?e.reverse():e)})),i=0,s=!1;return new F((function(){var n;return s||(n=a.map((function(e){return e.next()})),s=n.some((function(e){return e.done}))),s?q():U(e,i++,t.apply(null,n.map((function(e){return e.value}))))}))},o}function mn(e,t){return ae(e)?t:e.constructor(t)}function vn(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function gn(e){return Ve(e.size),A(e)}function yn(e){return s(e)?r:u(e)?o:a}function bn(e){return Object.create((s(e)?K:u(e)?Y:G).prototype)}function _n(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function xn(e,t){return e>t?1:e=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Kn(e,t)},Vn.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Ve(e.size);var t=this.size,n=this._head;return e.reverse().forEach((function(e){t++,n={value:e,next:n}})),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Kn(t,n)},Vn.prototype.pop=function(){return this.slice(1)},Vn.prototype.unshift=function(){return this.push.apply(this,arguments)},Vn.prototype.unshiftAll=function(e){return this.pushAll(e)},Vn.prototype.shift=function(){return this.pop.apply(this,arguments)},Vn.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Yn()},Vn.prototype.slice=function(e,t){if(j(e,t,this.size))return this;var n=T(e,this.size);if(I(t,this.size)!==this.size)return Se.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):Kn(r,o)},Vn.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Kn(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Vn.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},Vn.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new F((function(){if(r){var t=r.value;return r=r.next,U(e,n++,t)}return q()}))},Vn.isStack=Wn;var Hn,$n="@@__IMMUTABLE_STACK__@@",Jn=Vn.prototype;function Kn(e,t,n,r){var o=Object.create(Jn);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Yn(){return Hn||(Hn=Kn(0))}function Gn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}Jn[$n]=!0,Jn.withMutations=Ke.withMutations,Jn.asMutable=Ke.asMutable,Jn.asImmutable=Ke.asImmutable,Jn.wasAltered=Ke.wasAltered,n.Iterator=F,Gn(n,{toArray:function(){Ve(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate((function(t,n){e[n]=t})),e},toIndexedSeq:function(){return new Kt(this)},toJS:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJS?e.toJS():e})).__toJS()},toJSON:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e})).__toJS()},toKeyedSeq:function(){return new Jt(this,!0)},toMap:function(){return We(this.toKeyedSeq())},toObject:function(){Ve(this.size);var e={};return this.__iterate((function(t,n){e[n]=t})),e},toOrderedMap:function(){return zt(this.toKeyedSeq())},toOrderedSet:function(){return Ln(s(this)?this.valueSeq():this)},toSet:function(){return jn(s(this)?this.valueSeq():this)},toSetSeq:function(){return new Yt(this)},toSeq:function(){return u(this)?this.toIndexedSeq():s(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Vn(s(this)?this.valueSeq():this)},toList:function(){return St(s(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){return mn(this,sn(this,e.call(arguments,0)))},includes:function(e){return this.some((function(t){return ge(t,e)}))},entries:function(){return this.__iterator(R)},every:function(e,t){Ve(this.size);var n=!0;return this.__iterate((function(r,o,a){if(!e.call(t,r,o,a))return n=!1,!1})),n},filter:function(e,t){return mn(this,en(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Ve(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Ve(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate((function(r){n?n=!1:t+=e,t+=null!=r?r.toString():""})),t},keys:function(){return this.__iterator(N)},map:function(e,t){return mn(this,Xt(this,e,t))},reduce:function(e,t,n){var r,o;return Ve(this.size),arguments.length<2?o=!0:r=t,this.__iterate((function(t,a,i){o?(o=!1,r=t):r=e.call(n,r,t,a,i)})),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return mn(this,Qt(this,!0))},slice:function(e,t){return mn(this,rn(this,e,t,!0))},some:function(e,t){return!this.every(tr(e),t)},sort:function(e){return mn(this,pn(this,e))},values:function(){return this.__iterator(M)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(e,t){return A(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return tn(this,e,t)},equals:function(e){return ye(this,e)},entrySeq:function(){var e=this;if(e._cache)return new te(e._cache);var t=e.toSeq().map(er).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(tr(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate((function(n,o,a){if(e.call(t,n,o,a))return r=[o,n],!1})),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(k)},flatMap:function(e,t){return mn(this,cn(this,e,t))},flatten:function(e){return mn(this,un(this,e,!0))},fromEntrySeq:function(){return new Gt(this)},get:function(e,t){return this.find((function(t,n){return ge(n,e)}),void 0,t)},getIn:function(e,t){for(var n,r=this,o=wn(e);!(n=o.next()).done;){var a=n.value;if((r=r&&r.get?r.get(a,b):b)===b)return t}return r},groupBy:function(e,t){return nn(this,e,t)},has:function(e){return this.get(e,b)!==b},hasIn:function(e){return this.getIn(e,b)!==b},isSubset:function(e){return e="function"==typeof e.includes?e:n(e),this.every((function(t){return e.includes(t)}))},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey((function(t){return ge(t,e)}))},keySeq:function(){return this.toSeq().map(Qn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return fn(this,e)},maxBy:function(e,t){return fn(this,t,e)},min:function(e){return fn(this,e?nr(e):ar)},minBy:function(e,t){return fn(this,t?nr(t):ar,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return mn(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return mn(this,an(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(tr(e),t)},sortBy:function(e,t){return mn(this,pn(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return mn(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return mn(this,on(this,e,t))},takeUntil:function(e,t){return this.takeWhile(tr(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=ir(this))}});var Zn=n.prototype;Zn[p]=!0,Zn[B]=Zn.values,Zn.__toJS=Zn.toArray,Zn.__toStringMapper=rr,Zn.inspect=Zn.toSource=function(){return this.toString()},Zn.chain=Zn.flatMap,Zn.contains=Zn.includes,Gn(r,{flip:function(){return mn(this,Zt(this))},mapEntries:function(e,t){var n=this,r=0;return mn(this,this.toSeq().map((function(o,a){return e.call(t,[a,o],r++,n)})).fromEntrySeq())},mapKeys:function(e,t){var n=this;return mn(this,this.toSeq().flip().map((function(r,o){return e.call(t,r,o,n)})).flip())}});var Xn=r.prototype;function Qn(e,t){return t}function er(e,t){return[t,e]}function tr(e){return function(){return!e.apply(this,arguments)}}function nr(e){return function(){return-e.apply(this,arguments)}}function rr(e){return"string"==typeof e?JSON.stringify(e):String(e)}function or(){return C(arguments)}function ar(e,t){return et?-1:0}function ir(e){if(e.size===1/0)return 0;var t=l(e),n=s(e),r=t?1:0;return sr(e.__iterate(n?t?function(e,t){r=31*r+ur(ke(e),ke(t))|0}:function(e,t){r=r+ur(ke(e),ke(t))|0}:t?function(e){r=31*r+ke(e)|0}:function(e){r=r+ke(e)|0}),r)}function sr(e,t){return t=Ae(t,3432918353),t=Ae(t<<15|t>>>-15,461845907),t=Ae(t<<13|t>>>-13,5),t=Ae((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Oe((t=Ae(t^t>>>13,3266489909))^t>>>16)}function ur(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return Xn[f]=!0,Xn[B]=Zn.entries,Xn.__toJS=Zn.toObject,Xn.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+rr(e)},Gn(o,{toKeyedSeq:function(){return new Jt(this,!1)},filter:function(e,t){return mn(this,en(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return mn(this,Qt(this,!1))},slice:function(e,t){return mn(this,rn(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=T(e,e<0?this.count():this.size);var r=this.slice(0,e);return mn(this,1===n?r:r.concat(C(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return mn(this,un(this,e,!1))},get:function(e,t){return(e=O(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,n){return n===e}),void 0,t)},has:function(e){return(e=O(this,e))>=0&&(void 0!==this.size?this.size===1/0||e1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Ne(e){return t=e.replace(/\.[^./]*$/,""),Y()(J()(t));var t}function Me(e,t,n,r,a){if(!t)return[];var s=[],u=t.get("nullable"),c=t.get("required"),p=t.get("maximum"),h=t.get("minimum"),d=t.get("type"),m=t.get("format"),g=t.get("maxLength"),b=t.get("minLength"),x=t.get("uniqueItems"),w=t.get("maxItems"),E=t.get("minItems"),S=t.get("pattern"),C=n||!0===c,A=null!=e;if(u&&null===e||!d||!(C||A&&"array"===d||!(!C&&!A)))return[];var O="string"===d&&e,k="array"===d&&l()(e)&&e.length,j="array"===d&&W.a.List.isList(e)&&e.count(),T=[O,k,j,"array"===d&&"string"==typeof e&&e,"file"===d&&e instanceof se.a.File,"boolean"===d&&(e||!1===e),"number"===d&&(e||0===e),"integer"===d&&(e||0===e),"object"===d&&"object"===i()(e)&&null!==e,"object"===d&&"string"==typeof e&&e],I=P()(T).call(T,(function(e){return!!e}));if(C&&!I&&!r)return s.push("Required field is not provided"),s;if("object"===d&&(null===a||"application/json"===a)){var N,M=e;if("string"==typeof e)try{M=JSON.parse(e)}catch(e){return s.push("Parameter string value must be valid JSON"),s}if(t&&t.has("required")&&Se(c.isList)&&c.isList()&&y()(c).call(c,(function(e){void 0===M[e]&&s.push({propKey:e,error:"Required property not found"})})),t&&t.has("properties"))y()(N=t.get("properties")).call(N,(function(e,t){var n=Me(M[t],e,!1,r,a);s.push.apply(s,o()(f()(n).call(n,(function(e){return{propKey:t,error:e}}))))}))}if(S){var R=function(e,t){if(!new RegExp(t).test(e))return"Value must follow pattern "+t}(e,S);R&&s.push(R)}if(E&&"array"===d){var D=function(e,t){var n;if(!e&&t>=1||e&&e.lengtht)return v()(n="Array must not contain more then ".concat(t," item")).call(n,1===t?"":"s")}(e,w);L&&s.push({needRemove:!0,error:L})}if(x&&"array"===d){var B=function(e,t){if(e&&("true"===t||!0===t)){var n=Object(V.fromJS)(e),r=n.toSet();if(e.length>r.size){var o=Object(V.Set)();if(y()(n).call(n,(function(e,t){_()(n).call(n,(function(t){return Se(t.equals)?t.equals(e):t===e})).size>1&&(o=o.add(t))})),0!==o.size)return f()(o).call(o,(function(e){return{index:e,error:"No duplicates allowed."}})).toArray()}}}(e,x);B&&s.push.apply(s,o()(B))}if(g||0===g){var F=function(e,t){var n;if(e.length>t)return v()(n="Value must be no longer than ".concat(t," character")).call(n,1!==t?"s":"")}(e,g);F&&s.push(F)}if(b){var U=function(e,t){var n;if(e.lengtht)return"Value must be less than ".concat(t)}(e,p);q&&s.push(q)}if(h||0===h){var z=function(e,t){if(e2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,a=n.bypassRequiredCheck,i=void 0!==a&&a,s=e.get("required"),u=Object(le.a)(e,{isOAS3:o}),c=u.schema,l=u.parameterContentMediaType;return Me(t,c,s,i,l)},De=function(e,t,n){if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var r=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=r[1]}return Object(ie.memoizedCreateXMLExample)(e,t,n)},Le=[{when:/json/,shouldStringifyTypes:["string"]}],Be=["object"],Fe=function(e,t,n,r){var a=Object(ie.memoizedSampleFromSchema)(e,t,r),s=i()(a),u=S()(Le).call(Le,(function(e,t){var r;return t.when.test(n)?v()(r=[]).call(r,o()(e),o()(t.shouldStringifyTypes)):e}),Be);return te()(u,(function(e){return e===s}))?M()(a,null,2):a},Ue=function(e,t,n,r){var o,a=Fe(e,t,n,r);try{"\n"===(o=ve.a.safeDump(ve.a.safeLoad(a),{lineWidth:-1}))[o.length-1]&&(o=T()(o).call(o,0,o.length-1))}catch(e){return console.error(e),"error: could not generate yaml example"}return o.replace(/\t/g," ")},qe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&Se(e.toJS)&&(e=e.toJS()),r&&Se(r.toJS)&&(r=r.toJS()),/xml/.test(t)?De(e,n,r):/(yaml|yml)/.test(t)?Ue(e,n,t,r):Fe(e,n,t,r)},ze=function(){var e={},t=se.a.location.search;if(!t)return{};if(""!=t){var n=t.substr(1).split("&");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split("="),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||"")}return e},Ve=function(t){return(t instanceof e?t:e.from(t.toString(),"utf-8")).toString("base64")},We={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},He=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},$e=function(e,t,n){return!!Q()(n,(function(n){return re()(e[n],t[n])}))};function Je(e){return"string"!=typeof e||""===e?"":Object(H.sanitizeUrl)(e)}function Ke(e){return!(!e||D()(e).call(e,"localhost")>=0||D()(e).call(e,"127.0.0.1")>=0||"none"===e)}function Ye(e){if(!W.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=B()(e).call(e,(function(e,t){return U()(t).call(t,"2")&&w()(e.get("content")||{}).length>0})),n=e.get("default")||W.a.OrderedMap(),r=(n.get("content")||W.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var Ge=function(e){return"string"==typeof e||e instanceof String?z()(e).call(e).replace(/\s/g,"%20"):""},Ze=function(e){return ce()(Ge(e).replace(/%20/g,"_"))},Xe=function(e){return _()(e).call(e,(function(e,t){return/^x-/.test(t)}))},Qe=function(e){return _()(e).call(e,(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)}))};function et(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==i()(e)||l()(e)||null===e||!t)return e;var o=A()({},e);return y()(n=w()(o)).call(n,(function(e){e===t&&r(o[e],e)?delete o[e]:o[e]=et(o[e],t,r)})),o}function tt(e){if("string"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),"object"===i()(e)&&null!==e)try{return M()(e,null,2)}catch(t){return String(e)}return null==e?"":e.toString()}function nt(e){return"number"==typeof e?e.toString():e}function rt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,a=void 0===o||o;if(!W.a.Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var i,s,u,c=e.get("name"),l=e.get("in"),p=[];e&&e.hashCode&&l&&c&&a&&p.push(v()(i=v()(s="".concat(l,".")).call(s,c,".hash-")).call(i,e.hashCode()));l&&c&&p.push(v()(u="".concat(l,".")).call(u,c));return p.push(c),r?p:p[0]||""}function ot(e,t){var n,r=rt(e,{returnAll:!0});return _()(n=f()(r).call(r,(function(e){return t[e]}))).call(n,(function(e){return void 0!==e}))[0]}function at(){return st(fe()(32).toString("base64"))}function it(e){return st(de()("sha256").update(e).digest("base64"))}function st(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}var ut=function(e){return!e||!(!ye(e)||!e.isEmpty())}}).call(this,n(65).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(247);function o(e,t){for(var n=0;n1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:r,n=null,a=null;return function(){return o(t,n,arguments)||(a=e.apply(null,arguments)),n=arguments,a}}))},function(e,t,n){e.exports=n(674)},function(e,t,n){var r=n(181),o=n(582);function a(t){return"function"==typeof r&&"symbol"==typeof o?(e.exports=a=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=a=function(e){return e&&"function"==typeof r&&e.constructor===r&&e!==r.prototype?"symbol":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),a(t)}e.exports=a,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){e.exports=n(608)},function(e,t,n){e.exports=n(606)},function(e,t,n){"use strict";var r=n(40),o=n(107).f,a=n(369),i=n(33),s=n(110),u=n(70),c=n(54),l=function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t};e.exports=function(e,t){var n,p,f,h,d,m,v,g,y=e.target,b=e.global,_=e.stat,x=e.proto,w=b?r:_?r[y]:(r[y]||{}).prototype,E=b?i:i[y]||(i[y]={}),S=E.prototype;for(f in t)n=!a(b?f:y+(_?".":"#")+f,e.forced)&&w&&c(w,f),d=E[f],n&&(m=e.noTargetGet?(g=o(w,f))&&g.value:w[f]),h=n&&m?m:t[f],n&&typeof d==typeof h||(v=e.bind&&n?s(h,r):e.wrap&&n?l(h):x&&"function"==typeof h?s(Function.call,h):h,(e.sham||h&&h.sham||d&&d.sham)&&u(v,"sham",!0),E[f]=v,x&&(c(i,p=y+"Prototype")||u(i,p,{}),i[p][f]=h,e.real&&S&&!S[f]&&u(S,f,h)))}},function(e,t,n){e.exports=n(611)},function(e,t,n){e.exports=n(408)},function(e,t,n){var r=n(457),o=n(458),a=n(881),i=n(459),s=n(886),u=n(888),c=n(893),l=n(247),p=n(3);function f(e,t){var n=r(e);if(o){var s=o(e);t&&(s=a(s).call(s,(function(t){return i(e,t).enumerable}))),n.push.apply(n,s)}return n}e.exports=function(e){for(var t=1;t>",i=function(){invariant(!1,"ImmutablePropTypes type checking code is stripped in production.")};i.isRequired=i;var s=function(){return i};function u(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":e instanceof o.Iterable?"Immutable."+e.toSource().split(" ")[0]:t}function c(e){function t(t,n,r,o,i,s){for(var u=arguments.length,c=Array(u>6?u-6:0),l=6;l4)}function l(e){var t=e.get("swagger");return"string"==typeof t&&i()(t).call(t,"2.0")}function p(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?c(n.specSelectors.specJson())?u.a.createElement(e,o()({},r,n,{Ori:t})):u.a.createElement(t,r):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},function(e,t,n){e.exports=n(602)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){"use strict";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;function i(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,u=i(e),c=1;c0){var o=v()(n).call(n,(function(e){return console.error(e),e.line=e.fullPath?_(x,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e}));a.newThrownErrBatch(o)}return r.updateResolved(t)}))}},Se=[],Ce=G()(u()(f.a.mark((function e(){var t,n,r,o,a,i,s,c,l,p,h,m,g,b,x,E,C,O;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Se.system){e.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),e.abrupt("return");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,a=o.resolveSubtree,i=o.fetch,s=o.AST,c=void 0===s?{}:s,l=t.specSelectors,p=t.specActions,a){e.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),e.abrupt("return");case 8:return h=c.getLineNumberForPath?c.getLineNumberForPath:function(){},m=l.specStr(),g=t.getConfigs(),b=g.modelPropertyMacro,x=g.parameterMacro,E=g.requestInterceptor,C=g.responseInterceptor,e.prev=11,e.next=14,_()(Se).call(Se,function(){var e=u()(f.a.mark((function e(t,o){var s,c,p,g,_,O,j,T,I;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return s=e.sent,c=s.resultMap,p=s.specWithCurrentSubtrees,e.next=7,a(p,o,{baseDoc:l.url(),modelPropertyMacro:b,parameterMacro:x,requestInterceptor:E,responseInterceptor:C});case 7:if(g=e.sent,_=g.errors,O=g.spec,r.allErrors().size&&n.clearBy((function(e){var t;return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!w()(t=e.get("fullPath")).call(t,(function(e,t){return e===o[t]||void 0===o[t]}))})),d()(_)&&_.length>0&&(j=v()(_).call(_,(function(e){return e.line=e.fullPath?h(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e})),n.newThrownErrBatch(j)),!O||!l.isOAS3()||"components"!==o[0]||"securitySchemes"!==o[1]){e.next=15;break}return e.next=15,S.a.all(v()(T=A()(I=k()(O)).call(I,(function(e){return"openIdConnect"===e.type}))).call(T,function(){var e=u()(f.a.mark((function e(t){var n,r;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={url:t.openIdConnectUrl,requestInterceptor:E,responseInterceptor:C},e.prev=1,e.next=4,i(n);case 4:(r=e.sent)instanceof Error||r.status>=400?console.error(r.statusText+" "+n.url):t.openIdConnectData=JSON.parse(r.text),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.error(e.t0);case 11:case"end":return e.stop()}}),e,null,[[1,8]])})));return function(t){return e.apply(this,arguments)}}()));case 15:return X()(c,o,O),X()(p,o,O),e.abrupt("return",{resultMap:c,specWithCurrentSubtrees:p});case 18:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),S.a.resolve({resultMap:(l.specResolvedSubtree([])||Object(V.Map)()).toJS(),specWithCurrentSubtrees:l.specJson().toJS()}));case 14:O=e.sent,delete Se.system,Se=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:p.updateResolvedSubtree([],O.resultMap);case 23:case"end":return e.stop()}}),e,null,[[11,19]])}))),35),Ae=function(e){return function(t){var n;T()(n=v()(Se).call(Se,(function(e){return e.join("@@")}))).call(n,e.join("@@"))>-1||(Se.push(e),Se.system=t,Ce())}};function Oe(e,t,n,r,o){return{type:re,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}}function ke(e,t,n,r){return{type:re,payload:{path:e,param:t,value:n,isXml:r}}}var je=function(e,t){return{type:me,payload:{path:e,value:t}}},Te=function(){return{type:me,payload:{path:[],value:Object(V.Map)()}}},Ie=function(e,t){return{type:ae,payload:{pathMethod:e,isOAS3:t}}},Pe=function(e,t,n,r){return{type:oe,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Ne(e){return{type:fe,payload:{pathMethod:e}}}function Me(e,t){return{type:he,payload:{path:e,value:t,key:"consumes_value"}}}function Re(e,t){return{type:he,payload:{path:e,value:t,key:"produces_value"}}}var De=function(e,t,n){return{payload:{path:e,method:t,res:n},type:ie}},Le=function(e,t,n){return{payload:{path:e,method:t,req:n},type:se}},Be=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ue}},Fe=function(e){return{payload:e,type:ce}},Ue=function(e){return function(t){var n,r,o=t.fn,a=t.specActions,i=t.specSelectors,s=t.getConfigs,c=t.oas3Selectors,l=e.pathName,p=e.method,h=e.operation,m=s(),g=m.requestInterceptor,y=m.responseInterceptor,b=h.toJS();h&&h.get("parameters")&&P()(n=A()(r=h.get("parameters")).call(r,(function(e){return e&&!0===e.get("allowEmptyValue")}))).call(n,(function(t){if(i.parameterInclusionSettingFor([l,p],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};var n=Object(Q.B)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get("name")]="")}}));if(e.contextUrl=H()(i.url()).toString(),b&&b.operationId?e.operationId=b.operationId:b&&l&&p&&(e.operationId=o.opId(b,l,p)),i.isOAS3()){var _,x=M()(_="".concat(l,":")).call(_,p);e.server=c.selectedServer(x)||c.selectedServer();var w=c.serverVariables({server:e.server,namespace:x}).toJS(),E=c.serverVariables({server:e.server}).toJS();e.serverVariables=D()(w).length?w:E,e.requestContentType=c.requestContentType(l,p),e.responseContentType=c.responseContentType(l,p)||"*/*";var S,C=c.requestBodyValue(l,p),O=c.requestBodyInclusionSetting(l,p);if(C&&C.toJS)e.requestBody=A()(S=v()(C).call(C,(function(e){return V.Map.isMap(e)?e.get("value"):e}))).call(S,(function(e,t){return(d()(e)?0!==e.length:!Object(Q.q)(e))||O.get(t)})).toJS();else e.requestBody=C}var k=B()({},e);k=o.buildRequest(k),a.setRequest(e.pathName,e.method,k);var j=function(){var t=u()(f.a.mark((function t(n){var r,o;return f.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,g.apply(undefined,[n]);case 2:return r=t.sent,o=B()({},r),a.setMutatedRequest(e.pathName,e.method,o),t.abrupt("return",r);case 6:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();e.requestInterceptor=j,e.responseInterceptor=y;var T=U()();return o.execute(e).then((function(t){t.duration=U()()-T,a.setResponse(e.pathName,e.method,t)})).catch((function(t){"Failed to fetch"===t.message&&(t.name="",t.message='**Failed to fetch.** \n**Possible Reasons:** \n - CORS \n - Network Failure \n - URL scheme must be "http" or "https" for CORS request.'),a.setResponse(e.pathName,e.method,{error:!0,err:Object($.serializeError)(t)})}))}},qe=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=i()(e,["path","method"]);return function(e){var a=e.fn.fetch,i=e.specSelectors,s=e.specActions,u=i.specJsonWithResolvedSubtrees().toJS(),c=i.operationScheme(t,n),l=i.contentTypeValues([t,n]).toJS(),p=l.requestContentType,f=l.responseContentType,h=/xml/i.test(p),d=i.parameterValues([t,n],h).toJS();return s.executeRequest(o()(o()({},r),{},{fetch:a,spec:u,pathName:t,method:n,parameters:d,requestContentType:p,scheme:c,responseContentType:f}))}};function ze(e,t){return{type:le,payload:{path:e,method:t}}}function Ve(e,t){return{type:pe,payload:{path:e,method:t}}}function We(e,t,n){return{type:ve,payload:{scheme:e,path:t,method:n}}}},function(e,t,n){var r=n(33),o=n(54),a=n(243),i=n(71).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||i(t,e,{value:a.f(e)})}},function(e,t,n){"use strict";var r=n(167),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],a=["scalar","sequence","mapping"];e.exports=function(e,t){var n,i;if(t=t||{},Object.keys(t).forEach((function(t){if(-1===o.indexOf(t))throw new r('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=(n=t.styleAliases||null,i={},null!==n&&Object.keys(n).forEach((function(e){n[e].forEach((function(t){i[String(t)]=e}))})),i),-1===a.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},function(e,t,n){var r=n(37);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){var r=n(181),o=n(250),a=n(249),i=n(190);e.exports=function(e,t){var n=void 0!==r&&o(e)||e["@@iterator"];if(!n){if(a(e)||(n=i(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var s=0,u=function(){};return{s:u,n:function(){return s>=e.length?{done:!0}:{done:!1,value:e[s++]}},e:function(e){throw e},f:u}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,l=!0,p=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){p=!0,c=e},f:function(){try{l||null==n.return||n.return()}finally{if(p)throw c}}}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(45);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},function(e,t){var n=Array.isArray;e.exports=n},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(62),o={}.hasOwnProperty;e.exports=function(e,t){return o.call(r(e),t)}},function(e,t,n){var r=n(458),o=n(460),a=n(898);e.exports=function(e,t){if(null==e)return{};var n,i,s=a(e,t);if(r){var u=r(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_SELECTED_SERVER",(function(){return r})),n.d(t,"UPDATE_REQUEST_BODY_VALUE",(function(){return o})),n.d(t,"UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG",(function(){return a})),n.d(t,"UPDATE_REQUEST_BODY_INCLUSION",(function(){return i})),n.d(t,"UPDATE_ACTIVE_EXAMPLES_MEMBER",(function(){return s})),n.d(t,"UPDATE_REQUEST_CONTENT_TYPE",(function(){return u})),n.d(t,"UPDATE_RESPONSE_CONTENT_TYPE",(function(){return c})),n.d(t,"UPDATE_SERVER_VARIABLE_VALUE",(function(){return l})),n.d(t,"SET_REQUEST_BODY_VALIDATE_ERROR",(function(){return p})),n.d(t,"CLEAR_REQUEST_BODY_VALIDATE_ERROR",(function(){return f})),n.d(t,"CLEAR_REQUEST_BODY_VALUE",(function(){return h})),n.d(t,"setSelectedServer",(function(){return d})),n.d(t,"setRequestBodyValue",(function(){return m})),n.d(t,"setRetainRequestBodyValueFlag",(function(){return v})),n.d(t,"setRequestBodyInclusion",(function(){return g})),n.d(t,"setActiveExamplesMember",(function(){return y})),n.d(t,"setRequestContentType",(function(){return b})),n.d(t,"setResponseContentType",(function(){return _})),n.d(t,"setServerVariableValue",(function(){return x})),n.d(t,"setRequestBodyValidateError",(function(){return w})),n.d(t,"clearRequestBodyValidateError",(function(){return E})),n.d(t,"initRequestBodyValidateError",(function(){return S})),n.d(t,"clearRequestBodyValue",(function(){return C}));var r="oas3_set_servers",o="oas3_set_request_body_value",a="oas3_set_request_body_retain_flag",i="oas3_set_request_body_inclusion",s="oas3_set_active_examples_member",u="oas3_set_request_content_type",c="oas3_set_response_content_type",l="oas3_set_server_variable_value",p="oas3_set_request_body_validate_error",f="oas3_clear_request_body_validate_error",h="oas3_clear_request_body_value";function d(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}function m(e){var t=e.value,n=e.pathMethod;return{type:o,payload:{value:t,pathMethod:n}}}var v=function(e){var t=e.value,n=e.pathMethod;return{type:a,payload:{value:t,pathMethod:n}}};function g(e){var t=e.value,n=e.pathMethod,r=e.name;return{type:i,payload:{value:t,pathMethod:n,name:r}}}function y(e){var t=e.name,n=e.pathMethod,r=e.contextType,o=e.contextName;return{type:s,payload:{name:t,pathMethod:n,contextType:r,contextName:o}}}function b(e){var t=e.value,n=e.pathMethod;return{type:u,payload:{value:t,pathMethod:n}}}function _(e){var t=e.value,n=e.path,r=e.method;return{type:c,payload:{value:t,path:n,method:r}}}function x(e){var t=e.server,n=e.namespace,r=e.key,o=e.val;return{type:l,payload:{server:t,namespace:n,key:r,val:o}}}var w=function(e){var t=e.path,n=e.method,r=e.validationErrors;return{type:p,payload:{path:t,method:n,validationErrors:r}}},E=function(e){var t=e.path,n=e.method;return{type:f,payload:{path:t,method:n}}},S=function(e){var t=e.pathMethod;return{type:f,payload:{path:t[0],method:t[1]}}},C=function(e){var t=e.pathMethod;return{type:h,payload:{pathMethod:t}}}},function(e,t,n){"use strict";var r=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=o},function(e,t,n){e.exports=n(677)},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return m})),n.d(t,"e",(function(){return v})),n.d(t,"c",(function(){return y})),n.d(t,"a",(function(){return b})),n.d(t,"d",(function(){return _}));var r=n(50),o=n.n(r),a=n(18),i=n.n(a),s=n(2),u=n.n(s),c=n(59),l=n.n(c),p=n(363),f=n.n(p),h=function(e){return String.prototype.toLowerCase.call(e)},d=function(e){return e.replace(/[^\w]/gi,"_")};function m(e){var t=e.openapi;return!!t&&f()(t,"3")}function v(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=r.v2OperationIdCompatibilityMode;if(!e||"object"!==i()(e))return null;var a=(e.operationId||"").replace(/\s/g,"");return a.length?d(e.operationId):g(t,n,{v2OperationIdCompatibilityMode:o})}function g(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.v2OperationIdCompatibilityMode;if(o){var a,i,s=u()(a="".concat(t.toLowerCase(),"_")).call(a,e).replace(/[\s!@#$%^&*()_+=[{\]};:<>|./?,\\'""-]/g,"_");return(s=s||u()(i="".concat(e.substring(1),"_")).call(i,t)).replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return u()(n="".concat(h(t))).call(n,d(e))}function y(e,t){var n;return u()(n="".concat(h(t),"-")).call(n,e)}function b(e,t){return e&&e.paths?function(e,t){return function(e,t,n){if(!e||"object"!==i()(e)||!e.paths||"object"!==i()(e.paths))return null;var r=e.paths;for(var o in r)for(var a in r[o])if("PARAMETERS"!==a.toUpperCase()){var s=r[o][a];if(s&&"object"===i()(s)){var u={spec:e,pathName:o,method:a.toUpperCase(),operation:s},c=t(u);if(n&&c)return u}}return}(e,t,!0)||null}(e,(function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||"object"!==i()(o))return!1;var a=o.operationId;return[v(o,n,r),y(n,r),a].some((function(e){return e&&e===t}))})):null}function _(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var a in n){var i=n[a];if(l()(i)){var s=i.parameters,c=function(e){var n=i[e];if(!l()(n))return"continue";var c=v(n,a,e);if(c){r[c]?r[c].push(n):r[c]=[n];var p=r[c];if(p.length>1)p.forEach((function(e,t){var n;e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId=u()(n="".concat(c)).call(n,t+1)}));else if(void 0!==n.operationId){var f=p[0];f.__originalOperationId=f.__originalOperationId||n.operationId,f.operationId=c}}if("parameters"!==e){var h=[],d={};for(var m in t)"produces"!==m&&"consumes"!==m&&"security"!==m||(d[m]=t[m],h.push(d));if(s&&(d.parameters=s,h.push(d)),h.length){var g,y=o()(h);try{for(y.s();!(g=y.n()).done;){var b=g.value;for(var _ in b)if(n[_]){if("parameters"===_){var x,w=o()(b[_]);try{var E=function(){var e=x.value;n[_].some((function(t){return t.name&&t.name===e.name||t.$ref&&t.$ref===e.$ref||t.$$ref&&t.$$ref===e.$$ref||t===e}))||n[_].push(e)};for(w.s();!(x=w.n()).done;)E()}catch(e){w.e(e)}finally{w.f()}}}else n[_]=b[_]}}catch(e){y.e(e)}finally{y.f()}}}};for(var p in i)c(p)}}return t.$$normalized=!0,e}},function(e,t,n){"use strict";n.r(t),n.d(t,"NEW_THROWN_ERR",(function(){return o})),n.d(t,"NEW_THROWN_ERR_BATCH",(function(){return a})),n.d(t,"NEW_SPEC_ERR",(function(){return i})),n.d(t,"NEW_SPEC_ERR_BATCH",(function(){return s})),n.d(t,"NEW_AUTH_ERR",(function(){return u})),n.d(t,"CLEAR",(function(){return c})),n.d(t,"CLEAR_BY",(function(){return l})),n.d(t,"newThrownErr",(function(){return p})),n.d(t,"newThrownErrBatch",(function(){return f})),n.d(t,"newSpecErr",(function(){return h})),n.d(t,"newSpecErrBatch",(function(){return d})),n.d(t,"newAuthErr",(function(){return m})),n.d(t,"clear",(function(){return v})),n.d(t,"clearBy",(function(){return g}));var r=n(146),o="err_new_thrown_err",a="err_new_thrown_err_batch",i="err_new_spec_err",s="err_new_spec_err_batch",u="err_new_auth_err",c="err_clear",l="err_clear_by";function p(e){return{type:o,payload:Object(r.serializeError)(e)}}function f(e){return{type:a,payload:e}}function h(e){return{type:i,payload:e}}function d(e){return{type:s,payload:e}}function m(e){return{type:u,payload:e}}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:c,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:l,payload:e}}},function(e,t,n){var r=n(109);e.exports=function(e){return Object(r(e))}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){var r=n(65),o=r.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function i(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(a(r,t),t.Buffer=i),a(o,i),i.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return o(e,t,n)},i.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=o(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},i.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return o(e)},i.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){"use strict";(function(e){var r=n(598),o=n(599),a=n(383);function i(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(i()=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function d(e,t){if(u.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return q(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return z(e).length;default:if(r)return q(e).length;t=(""+t).toLowerCase(),r=!0}}function m(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return T(this,t,n);case"utf8":case"utf-8":return A(this,t,n);case"ascii":return k(this,t,n);case"latin1":case"binary":return j(this,t,n);case"base64":return C(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return I(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function g(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=u.from(t,r)),u.isBuffer(t))return 0===t.length?-1:y(e,t,n,r,o);if("number"==typeof t)return t&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):y(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function y(e,t,n,r,o){var a,i=1,s=e.length,u=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;i=2,s/=2,u/=2,n/=2}function c(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){var l=-1;for(a=n;as&&(n=s-u),a=n;a>=0;a--){for(var p=!0,f=0;fo&&(r=o):r=o;var a=t.length;if(a%2!=0)throw new TypeError("Invalid hex string");r>a/2&&(r=a/2);for(var i=0;i>8,o=n%256,a.push(o),a.push(r);return a}(t,e.length-n),e,n,r)}function C(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function A(e,t,n){n=Math.min(e.length,n);for(var r=[],o=t;o239?4:c>223?3:c>191?2:1;if(o+p<=n)switch(p){case 1:c<128&&(l=c);break;case 2:128==(192&(a=e[o+1]))&&(u=(31&c)<<6|63&a)>127&&(l=u);break;case 3:a=e[o+1],i=e[o+2],128==(192&a)&&128==(192&i)&&(u=(15&c)<<12|(63&a)<<6|63&i)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:a=e[o+1],i=e[o+2],s=e[o+3],128==(192&a)&&128==(192&i)&&128==(192&s)&&(u=(15&c)<<18|(63&a)<<12|(63&i)<<6|63&s)>65535&&u<1114112&&(l=u)}null===l?(l=65533,p=1):l>65535&&(l-=65536,r.push(l>>>10&1023|55296),l=56320|1023&l),r.push(l),o+=p}return function(e){var t=e.length;if(t<=O)return String.fromCharCode.apply(String,e);var n="",r=0;for(;r0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},u.prototype.compare=function(e,t,n,r,o){if(!u.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;for(var a=(o>>>=0)-(r>>>=0),i=(n>>>=0)-(t>>>=0),s=Math.min(a,i),c=this.slice(r,o),l=e.slice(t,n),p=0;po)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var a=!1;;)switch(r){case"hex":return b(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return x(this,e,t,n);case"latin1":case"binary":return w(this,e,t,n);case"base64":return E(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,n);default:if(a)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function k(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;or)&&(n=r);for(var o="",a=t;an)throw new RangeError("Trying to access beyond buffer length")}function N(e,t,n,r,o,a){if(!u.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||te.length)throw new RangeError("Index out of range")}function M(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,a=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,a=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function D(e,t,n,r,o,a){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function L(e,t,n,r,a){return a||D(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function B(e,t,n,r,a){return a||D(e,0,n,8),o.write(e,t,n,r,52,8),n+8}u.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),(t=void 0===t?r:~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),t0&&(o*=256);)r+=this[e+--t]*o;return r},u.prototype.readUInt8=function(e,t){return t||P(e,1,this.length),this[e]},u.prototype.readUInt16LE=function(e,t){return t||P(e,2,this.length),this[e]|this[e+1]<<8},u.prototype.readUInt16BE=function(e,t){return t||P(e,2,this.length),this[e]<<8|this[e+1]},u.prototype.readUInt32LE=function(e,t){return t||P(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},u.prototype.readUInt32BE=function(e,t){return t||P(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},u.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=this[e],o=1,a=0;++a=(o*=128)&&(r-=Math.pow(2,8*t)),r},u.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||P(e,t,this.length);for(var r=t,o=1,a=this[e+--r];r>0&&(o*=256);)a+=this[e+--r]*o;return a>=(o*=128)&&(a-=Math.pow(2,8*t)),a},u.prototype.readInt8=function(e,t){return t||P(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},u.prototype.readInt16LE=function(e,t){t||P(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt16BE=function(e,t){t||P(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},u.prototype.readInt32LE=function(e,t){return t||P(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},u.prototype.readInt32BE=function(e,t){return t||P(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},u.prototype.readFloatLE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!0,23,4)},u.prototype.readFloatBE=function(e,t){return t||P(e,4,this.length),o.read(this,e,!1,23,4)},u.prototype.readDoubleLE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!0,52,8)},u.prototype.readDoubleBE=function(e,t){return t||P(e,8,this.length),o.read(this,e,!1,52,8)},u.prototype.writeUIntLE=function(e,t,n,r){(e=+e,t|=0,n|=0,r)||N(this,e,t,n,Math.pow(2,8*n)-1,0);var o=1,a=0;for(this[t]=255&e;++a=0&&(a*=256);)this[t+o]=e/a&255;return t+n},u.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,255,0),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},u.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):M(this,e,t,!0),t+2},u.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):M(this,e,t,!1),t+2},u.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},u.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);N(this,e,t,n,o-1,-o)}var a=0,i=1,s=0;for(this[t]=255&e;++a>0)-s&255;return t+n},u.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);N(this,e,t,n,o-1,-o)}var a=n-1,i=1,s=0;for(this[t+a]=255&e;--a>=0&&(i*=256);)e<0&&0===s&&0!==this[t+a+1]&&(s=1),this[t+a]=(e/i>>0)-s&255;return t+n},u.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,127,-128),u.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},u.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):M(this,e,t,!0),t+2},u.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):M(this,e,t,!1),t+2},u.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},u.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),u.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},u.prototype.writeFloatLE=function(e,t,n){return L(this,e,t,!0,n)},u.prototype.writeFloatBE=function(e,t,n){return L(this,e,t,!1,n)},u.prototype.writeDoubleLE=function(e,t,n){return B(this,e,t,!0,n)},u.prototype.writeDoubleBE=function(e,t,n){return B(this,e,t,!1,n)},u.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--o)e[o+t]=this[o+n];else if(a<1e3||!u.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(a=t;a55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(i+1===r){(t-=3)>-1&&a.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&a.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&a.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;a.push(n)}else if(n<2048){if((t-=2)<0)break;a.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function z(e){return r.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(F,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function V(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(this,n(53))},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t0?o(r(e),9007199254740991):0}},function(e,t,n){var r,o,a,i=n(374),s=n(40),u=n(45),c=n(70),l=n(54),p=n(235),f=n(188),h=n(159),d="Object already initialized",m=s.WeakMap;if(i){var v=p.state||(p.state=new m),g=v.get,y=v.has,b=v.set;r=function(e,t){if(y.call(v,e))throw new TypeError(d);return t.facade=e,b.call(v,e,t),t},o=function(e){return g.call(v,e)||{}},a=function(e){return y.call(v,e)}}else{var _=f("state");h[_]=!0,r=function(e,t){if(l(e,_))throw new TypeError(d);return t.facade=e,c(e,_,t),t},o=function(e){return l(e,_)?e[_]:{}},a=function(e){return l(e,_)}}e.exports={set:r,get:o,has:a,enforce:function(e){return a(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!u(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){"use strict";var r=n(30),o=n(38),a=n(481),i=n(124),s=n(482),u=n(142),c=n(208),l=n(25),p=[],f=0,h=a.getPooled(),d=!1,m=null;function v(){w.ReactReconcileTransaction&&m||r("123")}var g=[{initialize:function(){this.dirtyComponentsLength=p.length},close:function(){this.dirtyComponentsLength!==p.length?(p.splice(0,this.dirtyComponentsLength),x()):p.length=0}},{initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}}];function y(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=a.getPooled(),this.reconcileTransaction=w.ReactReconcileTransaction.getPooled(!0)}function b(e,t){return e._mountOrder-t._mountOrder}function _(e){var t=e.dirtyComponentsLength;t!==p.length&&r("124",t,p.length),p.sort(b),f++;for(var n=0;n",'"',"`"," ","\r","\n","\t"]),l=["'"].concat(c),p=["%","/","?",";","#"].concat(l),f=["/","?","#"],h=/^[+a-z0-9A-Z_-]{0,63}$/,d=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,m={javascript:!0,"javascript:":!0},v={javascript:!0,"javascript:":!0},g={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},y=n(1107);function b(e,t,n){if(e&&o.isObject(e)&&e instanceof a)return e;var r=new a;return r.parse(e,t,n),r}a.prototype.parse=function(e,t,n){if(!o.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var a=e.indexOf("?"),s=-1!==a&&a127?N+="x":N+=P[M];if(!N.match(h)){var D=T.slice(0,O),L=T.slice(O+1),B=P.match(d);B&&(D.push(B[1]),L.unshift(B[2])),L.length&&(b="/"+L.join(".")+b),this.hostname=D.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),j||(this.hostname=r.toASCII(this.hostname));var F=this.port?":"+this.port:"",U=this.hostname||"";this.host=U+F,this.href+=this.host,j&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==b[0]&&(b="/"+b))}if(!m[w])for(O=0,I=l.length;O0)&&n.host.split("@"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift());return n.search=e.search,n.query=e.query,o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!E.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var C=E.slice(-1)[0],A=(n.host||e.host||E.length>1)&&("."===C||".."===C)||""===C,O=0,k=E.length;k>=0;k--)"."===(C=E[k])?E.splice(k,1):".."===C?(E.splice(k,1),O++):O&&(E.splice(k,1),O--);if(!x&&!w)for(;O--;O)E.unshift("..");!x||""===E[0]||E[0]&&"/"===E[0].charAt(0)||E.unshift(""),A&&"/"!==E.join("/").substr(-1)&&E.push("");var j,T=""===E[0]||E[0]&&"/"===E[0].charAt(0);S&&(n.hostname=n.host=T?"":E.length?E.shift():"",(j=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift()));return(x=x||n.host&&E.length)&&!T&&E.unshift(""),E.length?n.pathname=E.join("/"):(n.pathname=null,n.path=null),o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},a.prototype.parseHost=function(){var e=this.host,t=s.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){"use strict";n.r(t),n.d(t,"SHOW_AUTH_POPUP",(function(){return h})),n.d(t,"AUTHORIZE",(function(){return d})),n.d(t,"LOGOUT",(function(){return m})),n.d(t,"PRE_AUTHORIZE_OAUTH2",(function(){return v})),n.d(t,"AUTHORIZE_OAUTH2",(function(){return g})),n.d(t,"VALIDATE",(function(){return y})),n.d(t,"CONFIGURE_AUTH",(function(){return b})),n.d(t,"RESTORE_AUTHORIZATION",(function(){return _})),n.d(t,"showDefinitions",(function(){return x})),n.d(t,"authorize",(function(){return w})),n.d(t,"authorizeWithPersistOption",(function(){return E})),n.d(t,"logout",(function(){return S})),n.d(t,"logoutWithPersistOption",(function(){return C})),n.d(t,"preAuthorizeImplicit",(function(){return A})),n.d(t,"authorizeOauth2",(function(){return O})),n.d(t,"authorizeOauth2WithPersistOption",(function(){return k})),n.d(t,"authorizePassword",(function(){return j})),n.d(t,"authorizeApplication",(function(){return T})),n.d(t,"authorizeAccessCodeWithFormParams",(function(){return I})),n.d(t,"authorizeAccessCodeWithBasicAuthentication",(function(){return P})),n.d(t,"authorizeRequest",(function(){return N})),n.d(t,"configureAuth",(function(){return M})),n.d(t,"restoreAuthorization",(function(){return R})),n.d(t,"persistAuthorizationIfNeeded",(function(){return D}));var r=n(18),o=n.n(r),a=n(32),i=n.n(a),s=n(20),u=n.n(s),c=n(96),l=n.n(c),p=n(26),f=n(5),h="show_popup",d="authorize",m="logout",v="pre_authorize_oauth2",g="authorize_oauth2",y="validate",b="configure_auth",_="restore_authorization";function x(e){return{type:h,payload:e}}function w(e){return{type:d,payload:e}}var E=function(e){return function(t){var n=t.authActions;n.authorize(e),n.persistAuthorizationIfNeeded()}};function S(e){return{type:m,payload:e}}var C=function(e){return function(t){var n=t.authActions;n.logout(e),n.persistAuthorizationIfNeeded()}},A=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,a=e.token,s=e.isValid,u=o.schema,c=o.name,l=u.get("flow");delete p.a.swaggerUIRedirectOauth2,"accessCode"===l||s||r.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),a.error?r.newAuthErr({authId:c,source:"auth",level:"error",message:i()(a)}):n.authorizeOauth2WithPersistOption({auth:o,token:a})}};function O(e){return{type:g,payload:e}}var k=function(e){return function(t){var n=t.authActions;n.authorizeOauth2(e),n.persistAuthorizationIfNeeded()}},j=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.name,a=e.username,i=e.password,s=e.passwordType,c=e.clientId,l=e.clientSecret,p={grant_type:"password",scope:e.scopes.join(" "),username:a,password:i},h={};switch(s){case"request-body":!function(e,t,n){t&&u()(e,{client_id:t});n&&u()(e,{client_secret:n})}(p,c,l);break;case"basic":h.Authorization="Basic "+Object(f.a)(c+":"+l);break;default:console.warn("Warning: invalid passwordType ".concat(s," was passed, not including client id and secret"))}return n.authorizeRequest({body:Object(f.b)(p),url:r.get("tokenUrl"),name:o,headers:h,query:{},auth:e})}};var T=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,a=e.name,i=e.clientId,s=e.clientSecret,u={Authorization:"Basic "+Object(f.a)(i+":"+s)},c={grant_type:"client_credentials",scope:o.join(" ")};return n.authorizeRequest({body:Object(f.b)(c),name:a,url:r.get("tokenUrl"),auth:e,headers:u})}},I=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={grant_type:"authorization_code",code:t.code,client_id:i,client_secret:s,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(f.b)(c),name:a,url:o.get("tokenUrl"),auth:t})}},P=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,s=t.clientSecret,u=t.codeVerifier,c={Authorization:"Basic "+Object(f.a)(i+":"+s)},l={grant_type:"authorization_code",code:t.code,client_id:i,redirect_uri:n,code_verifier:u};return r.authorizeRequest({body:Object(f.b)(l),name:a,url:o.get("tokenUrl"),auth:t,headers:c})}},N=function(e){return function(t){var n,r=t.fn,a=t.getConfigs,s=t.authActions,c=t.errActions,p=t.oas3Selectors,f=t.specSelectors,h=t.authSelectors,d=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,_=e.url,x=e.auth,w=(h.getConfigs()||{}).additionalQueryStringParams;if(f.isOAS3()){var E=p.serverEffectiveValue(p.selectedServer());n=l()(_,E,!0)}else n=l()(_,f.url(),!0);"object"===o()(w)&&(n.query=u()({},n.query,w));var S=n.toString(),C=u()({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},y);r.fetch({url:S,method:"post",headers:C,query:v,body:d,requestInterceptor:a().requestInterceptor,responseInterceptor:a().responseInterceptor}).then((function(e){var t=JSON.parse(e.data),n=t&&(t.error||""),r=t&&(t.parseError||"");e.ok?n||r?c.newAuthErr({authId:b,level:"error",source:"auth",message:i()(t)}):s.authorizeOauth2WithPersistOption({auth:x,token:t}):c.newAuthErr({authId:b,level:"error",source:"auth",message:e.statusText})})).catch((function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r="string"==typeof n?JSON.parse(n):n;r.error&&(t+=", error: ".concat(r.error)),r.error_description&&(t+=", description: ".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:b,level:"error",source:"auth",message:t})}))}};function M(e){return{type:b,payload:e}}function R(e){return{type:_,payload:e}}var D=function(){return function(e){var t=e.authSelectors;if((0,e.getConfigs)().persistAuthorization){var n=t.authorized();localStorage.setItem("authorized",i()(n.toJS()))}}}},function(e,t,n){var r=n(1072);e.exports=function(e){for(var t=1;tS;S++)if((h||S in x)&&(b=w(y=x[S],S,_),e))if(t)A[S]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:u.call(A,y)}else switch(e){case 4:return!1;case 7:u.call(A,y)}return p?-1:c||l?l:A}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterOut:c(7)}},function(e,t,n){n(161);var r=n(586),o=n(40),a=n(101),i=n(70),s=n(130),u=n(41)("toStringTag");for(var c in r){var l=o[c],p=l&&l.prototype;p&&a(p)!==u&&i(p,u,c),s[c]=s.Array}},function(e,t,n){"use strict";e.exports={current:null}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t){var n,r,o=e.exports={};function a(){throw new Error("setTimeout has not been defined")}function i(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===a||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:a}catch(e){n=a}try{r="function"==typeof clearTimeout?clearTimeout:i}catch(e){r=i}}();var u,c=[],l=!1,p=-1;function f(){l&&u&&(l=!1,u.length?c=u.concat(c):p=-1,c.length&&h())}function h(){if(!l){var e=s(f);l=!0;for(var t=c.length;t;){for(u=c,c=[];++p1)for(var n=1;n0&&"/"!==t[0]}));function Se(e,t,n){var r;t=t||[];var o=xe.apply(void 0,u()(r=[e]).call(r,i()(t))).get("parameters",Object(I.List)());return w()(o).call(o,(function(e,t){var r=n&&"body"===t.get("in")?t.get("value_xml"):t.get("value");return e.set(Object(T.A)(t,{allowHashes:!1}),r)}),Object(I.fromJS)({}))}function Ce(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(I.List.isList(e))return A()(e).call(e,(function(e){return I.Map.isMap(e)&&e.get("in")===t}))}function Ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(I.List.isList(e))return A()(e).call(e,(function(e){return I.Map.isMap(e)&&e.get("type")===t}))}function Oe(e,t){var n,r;t=t||[];var o=z(e).getIn(u()(n=["paths"]).call(n,i()(t)),Object(I.fromJS)({})),a=e.getIn(u()(r=["meta","paths"]).call(r,i()(t)),Object(I.fromJS)({})),s=ke(e,t),c=o.get("parameters")||new I.List,l=a.get("consumes_value")?a.get("consumes_value"):Ae(c,"file")?"multipart/form-data":Ae(c,"formData")?"application/x-www-form-urlencoded":void 0;return Object(I.fromJS)({requestContentType:l,responseContentType:s})}function ke(e,t){var n,r;t=t||[];var o=z(e).getIn(u()(n=["paths"]).call(n,i()(t)),null);if(null!==o){var a=e.getIn(u()(r=["meta","paths"]).call(r,i()(t),["produces_value"]),null),s=o.getIn(["produces",0],null);return a||s||"application/json"}}function je(e,t){var n;t=t||[];var r=z(e),a=r.getIn(u()(n=["paths"]).call(n,i()(t)),null);if(null!==a){var s=t,c=o()(s,1)[0],l=a.get("produces",null),p=r.getIn(["paths",c,"produces"],null),f=r.getIn(["produces"],null);return l||p||f}}function Te(e,t){var n;t=t||[];var r=z(e),a=r.getIn(u()(n=["paths"]).call(n,i()(t)),null);if(null!==a){var s=t,c=o()(s,1)[0],l=a.get("consumes",null),p=r.getIn(["paths",c,"consumes"],null),f=r.getIn(["consumes"],null);return l||p||f}}var Ie=function(e,t,n){var r=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),o=k()(r)?r[1]:null;return e.getIn(["scheme",t,n])||e.getIn(["scheme","_defaultScheme"])||o||""},Pe=function(e,t,n){var r;return d()(r=["http","https"]).call(r,Ie(e,t,n))>-1},Ne=function(e,t){var n;t=t||[];var r=e.getIn(u()(n=["meta","paths"]).call(n,i()(t),["parameters"]),Object(I.fromJS)([])),o=!0;return f()(r).call(r,(function(e){var t=e.get("errors");t&&t.count()&&(o=!1)})),o},Me=function(e,t){var n,r,o={requestBody:!1,requestContentType:{}},a=e.getIn(u()(n=["resolvedSubtrees","paths"]).call(n,i()(t),["requestBody"]),Object(I.fromJS)([]));return a.size<1||(a.getIn(["required"])&&(o.requestBody=a.getIn(["required"])),f()(r=a.getIn(["content"]).entrySeq()).call(r,(function(e){var t=e[0];if(e[1].getIn(["schema","required"])){var n=e[1].getIn(["schema","required"]).toJS();o.requestContentType[t]=n}}))),o},Re=function(e,t,n,r){var o;if((n||r)&&n===r)return!0;var a=e.getIn(u()(o=["resolvedSubtrees","paths"]).call(o,i()(t),["requestBody","content"]),Object(I.fromJS)([]));if(a.size<2||!n||!r)return!1;var s=a.getIn([n,"schema","properties"],Object(I.fromJS)([])),c=a.getIn([r,"schema","properties"],Object(I.fromJS)([]));return!!s.equals(c)};function De(e){return I.Map.isMap(e)?e:new I.Map}},function(e,t,n){"use strict";(function(t){var r=n(919),o=n(920),a=/^[A-Za-z][A-Za-z0-9+-.]*:[\\/]+/,i=/^([a-z][a-z0-9.+-]*:)?([\\/]{1,})?([\S\s]*)/i,s=new RegExp("^[\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]+");function u(e){return(e||"").toString().replace(s,"")}var c=[["#","hash"],["?","query"],function(e){return e.replace("\\","/")},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d+)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],l={hash:1,query:1};function p(e){var n,r=("undefined"!=typeof window?window:void 0!==t?t:"undefined"!=typeof self?self:{}).location||{},o={},i=typeof(e=e||r);if("blob:"===e.protocol)o=new h(unescape(e.pathname),{});else if("string"===i)for(n in o=new h(e,{}),l)delete o[n];else if("object"===i){for(n in e)n in l||(o[n]=e[n]);void 0===o.slashes&&(o.slashes=a.test(e.href))}return o}function f(e){e=u(e);var t=i.exec(e);return{protocol:t[1]?t[1].toLowerCase():"",slashes:!!(t[2]&&t[2].length>=2),rest:t[2]&&1===t[2].length?"/"+t[3]:t[3]}}function h(e,t,n){if(e=u(e),!(this instanceof h))return new h(e,t,n);var a,i,s,l,d,m,v=c.slice(),g=typeof t,y=this,b=0;for("object"!==g&&"string"!==g&&(n=t,t=null),n&&"function"!=typeof n&&(n=o.parse),t=p(t),a=!(i=f(e||"")).protocol&&!i.slashes,y.slashes=i.slashes||a&&t.slashes,y.protocol=i.protocol||t.protocol||"",e=i.rest,i.slashes||(v[3]=[/(.*)/,"pathname"]);b=4?[t[0],t[1],t[2],t[3],"".concat(t[0],".").concat(t[1]),"".concat(t[0],".").concat(t[2]),"".concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[0]),"".concat(t[1],".").concat(t[2]),"".concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[1]),"".concat(t[2],".").concat(t[3]),"".concat(t[3],".").concat(t[0]),"".concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[0]),"".concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[1],".").concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[2],".").concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[3],".").concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[2],".").concat(t[1],".").concat(t[0])]:void 0),g[r]}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=e.filter((function(e){return"token"!==e})),o=y(r);return o.reduce((function(e,t){return f()({},e,n[t])}),t)}function _(e){return e.join(" ")}function x(e){var t=e.node,n=e.stylesheet,r=e.style,o=void 0===r?{}:r,a=e.useInlineStyles,i=e.key,s=t.properties,u=t.type,c=t.tagName,l=t.value;if("text"===u)return l;if(c){var p,h=function(e,t){var n=0;return function(r){return n+=1,r.map((function(r,o){return x({node:r,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(o)})}))}}(n,a);if(a){var m=Object.keys(n).reduce((function(e,t){return t.split(".").forEach((function(t){e.includes(t)||e.push(t)})),e}),[]),g=s.className&&s.className.includes("token")?["token"]:[],y=s.className&&g.concat(s.className.filter((function(e){return!m.includes(e)})));p=f()({},s,{className:_(y)||void 0,style:b(s.className,Object.assign({},s.style,o),n)})}else p=f()({},s,{className:_(s.className)});var w=h(t.children);return d.a.createElement(c,v()({key:i},p),w)}}var w=/\n/g;function E(e){var t=e.codeString,n=e.codeStyle,r=e.containerStyle,o=void 0===r?{float:"left",paddingRight:"10px"}:r,a=e.numberStyle,i=void 0===a?{}:a,s=e.startingLineNumber;return d.a.createElement("code",{style:Object.assign({},n,o)},function(e){var t=e.lines,n=e.startingLineNumber,r=e.style;return t.map((function(e,t){var o=t+n;return d.a.createElement("span",{key:"line-".concat(t),className:"react-syntax-highlighter-line-number",style:"function"==typeof r?r(o):r},"".concat(o,"\n"))}))}({lines:t.replace(/\n$/,"").split("\n"),style:i,startingLineNumber:s}))}function S(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function C(e,t,n){var r,o={display:"inline-block",minWidth:(r=n,"".concat(r.toString().length,".25em")),paddingRight:"1em",textAlign:"right",userSelect:"none"},a="function"==typeof e?e(t):e;return f()({},o,a)}function A(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,o=e.largestLineNumber,a=e.showInlineLineNumbers,i=e.lineProps,s=void 0===i?{}:i,u=e.className,c=void 0===u?[]:u,l=e.showLineNumbers,p=e.wrapLongLines,h="function"==typeof s?s(n):s;if(h.className=c,n&&a){var d=C(r,n,o);t.unshift(S(n,d))}return p&l&&(h.style=f()({},h.style,{display:"flex"})),{type:"element",tagName:"span",properties:h,children:t}}function O(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=0;r2&&void 0!==arguments[2]?arguments[2]:[];return A({children:e,lineNumber:t,lineNumberStyle:s,largestLineNumber:i,showInlineLineNumbers:o,lineProps:n,className:a,showLineNumbers:r,wrapLongLines:u})}function m(e,t){if(r&&t&&o){var n=C(s,t,i);e.unshift(S(t,n))}return e}function v(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||r.length>0?d(e,n,r):m(e,n)}for(var g=function(){var e=l[h],t=e.children[0].value;if(t.match(w)){var n=t.split("\n");n.forEach((function(t,o){var i=r&&p.length+a,s={type:"text",value:"".concat(t,"\n")};if(0===o){var u=v(l.slice(f+1,h).concat(A({children:[s],className:e.properties.className})),i);p.push(u)}else if(o===n.length-1){if(l[h+1]&&l[h+1].children&&l[h+1].children[0]){var c=A({children:[{type:"text",value:"".concat(t)}],className:e.properties.className});l.splice(h+1,0,c)}else{var d=v([s],i,e.properties.className);p.push(d)}}else{var m=v([s],i,e.properties.className);p.push(m)}})),f=h}h++};h .hljs-title":{color:"#88C0D0"},"hljs-keyword":{color:"#81A1C1"},"hljs-literal":{color:"#81A1C1"},"hljs-symbol":{color:"#81A1C1"},"hljs-number":{color:"#B48EAD"},"hljs-regexp":{color:"#EBCB8B"},"hljs-string":{color:"#A3BE8C"},"hljs-title":{color:"#8FBCBB"},"hljs-params":{color:"#D8DEE9"},"hljs-bullet":{color:"#81A1C1"},"hljs-code":{color:"#8FBCBB"},"hljs-emphasis":{fontStyle:"italic"},"hljs-formula":{color:"#8FBCBB"},"hljs-strong":{fontWeight:"bold"},"hljs-link:hover":{textDecoration:"underline"},"hljs-quote":{color:"#4C566A"},"hljs-comment":{color:"#4C566A"},"hljs-doctag":{color:"#8FBCBB"},"hljs-meta":{color:"#5E81AC"},"hljs-meta-keyword":{color:"#5E81AC"},"hljs-meta-string":{color:"#A3BE8C"},"hljs-attr":{color:"#8FBCBB"},"hljs-attribute":{color:"#D8DEE9"},"hljs-builtin-name":{color:"#81A1C1"},"hljs-name":{color:"#81A1C1"},"hljs-section":{color:"#88C0D0"},"hljs-tag":{color:"#81A1C1"},"hljs-variable":{color:"#D8DEE9"},"hljs-template-variable":{color:"#D8DEE9"},"hljs-template-tag":{color:"#5E81AC"},"abnf .hljs-attribute":{color:"#88C0D0"},"abnf .hljs-symbol":{color:"#EBCB8B"},"apache .hljs-attribute":{color:"#88C0D0"},"apache .hljs-section":{color:"#81A1C1"},"arduino .hljs-built_in":{color:"#88C0D0"},"aspectj .hljs-meta":{color:"#D08770"},"aspectj > .hljs-title":{color:"#88C0D0"},"bnf .hljs-attribute":{color:"#8FBCBB"},"clojure .hljs-name":{color:"#88C0D0"},"clojure .hljs-symbol":{color:"#EBCB8B"},"coq .hljs-built_in":{color:"#88C0D0"},"cpp .hljs-meta-string":{color:"#8FBCBB"},"css .hljs-built_in":{color:"#88C0D0"},"css .hljs-keyword":{color:"#D08770"},"diff .hljs-meta":{color:"#8FBCBB"},"ebnf .hljs-attribute":{color:"#8FBCBB"},"glsl .hljs-built_in":{color:"#88C0D0"},"groovy .hljs-meta:not(:first-child)":{color:"#D08770"},"haxe .hljs-meta":{color:"#D08770"},"java .hljs-meta":{color:"#D08770"},"ldif .hljs-attribute":{color:"#8FBCBB"},"lisp .hljs-name":{color:"#88C0D0"},"lua .hljs-built_in":{color:"#88C0D0"},"moonscript .hljs-built_in":{color:"#88C0D0"},"nginx .hljs-attribute":{color:"#88C0D0"},"nginx .hljs-section":{color:"#5E81AC"},"pf .hljs-built_in":{color:"#88C0D0"},"processing .hljs-built_in":{color:"#88C0D0"},"scss .hljs-keyword":{color:"#81A1C1"},"stylus .hljs-keyword":{color:"#81A1C1"},"swift .hljs-meta":{color:"#D08770"},"vim .hljs-built_in":{color:"#88C0D0",fontStyle:"italic"},"yaml .hljs-meta":{color:"#D08770"}},obsidian:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#282b2e",color:"#e0e2e4"},"hljs-keyword":{color:"#93c763",fontWeight:"bold"},"hljs-selector-tag":{color:"#93c763",fontWeight:"bold"},"hljs-literal":{color:"#93c763",fontWeight:"bold"},"hljs-selector-id":{color:"#93c763"},"hljs-number":{color:"#ffcd22"},"hljs-attribute":{color:"#668bb0"},"hljs-code":{color:"white"},"hljs-class .hljs-title":{color:"white"},"hljs-section":{color:"white",fontWeight:"bold"},"hljs-regexp":{color:"#d39745"},"hljs-link":{color:"#d39745"},"hljs-meta":{color:"#557182"},"hljs-tag":{color:"#8cbbad"},"hljs-name":{color:"#8cbbad",fontWeight:"bold"},"hljs-bullet":{color:"#8cbbad"},"hljs-subst":{color:"#8cbbad"},"hljs-emphasis":{color:"#8cbbad"},"hljs-type":{color:"#8cbbad",fontWeight:"bold"},"hljs-built_in":{color:"#8cbbad"},"hljs-selector-attr":{color:"#8cbbad"},"hljs-selector-pseudo":{color:"#8cbbad"},"hljs-addition":{color:"#8cbbad"},"hljs-variable":{color:"#8cbbad"},"hljs-template-tag":{color:"#8cbbad"},"hljs-template-variable":{color:"#8cbbad"},"hljs-string":{color:"#ec7600"},"hljs-symbol":{color:"#ec7600"},"hljs-comment":{color:"#818e96"},"hljs-quote":{color:"#818e96"},"hljs-deletion":{color:"#818e96"},"hljs-selector-class":{color:"#A082BD"},"hljs-doctag":{fontWeight:"bold"},"hljs-title":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"}},"tomorrow-night":{"hljs-comment":{color:"#969896"},"hljs-quote":{color:"#969896"},"hljs-variable":{color:"#cc6666"},"hljs-template-variable":{color:"#cc6666"},"hljs-tag":{color:"#cc6666"},"hljs-name":{color:"#cc6666"},"hljs-selector-id":{color:"#cc6666"},"hljs-selector-class":{color:"#cc6666"},"hljs-regexp":{color:"#cc6666"},"hljs-deletion":{color:"#cc6666"},"hljs-number":{color:"#de935f"},"hljs-built_in":{color:"#de935f"},"hljs-builtin-name":{color:"#de935f"},"hljs-literal":{color:"#de935f"},"hljs-type":{color:"#de935f"},"hljs-params":{color:"#de935f"},"hljs-meta":{color:"#de935f"},"hljs-link":{color:"#de935f"},"hljs-attribute":{color:"#f0c674"},"hljs-string":{color:"#b5bd68"},"hljs-symbol":{color:"#b5bd68"},"hljs-bullet":{color:"#b5bd68"},"hljs-addition":{color:"#b5bd68"},"hljs-title":{color:"#81a2be"},"hljs-section":{color:"#81a2be"},"hljs-keyword":{color:"#b294bb"},"hljs-selector-tag":{color:"#b294bb"},hljs:{display:"block",overflowX:"auto",background:"#1d1f21",color:"#c5c8c6",padding:"0.5em"},"hljs-emphasis":{fontStyle:"italic"},"hljs-strong":{fontWeight:"bold"}}},Q=o()(X),ee=function(e){return i()(Q).call(Q,e)?X[e]:(console.warn("Request style '".concat(e,"' is not available, returning default instead")),Z)}},function(e,t){e.exports=!0},function(e,t,n){var r=n(244),o=n(71).f,a=n(70),i=n(54),s=n(560),u=n(41)("toStringTag");e.exports=function(e,t,n,c){if(e){var l=n?e:e.prototype;i(l,u)||o(l,u,{configurable:!0,value:t}),c&&!r&&a(l,"toString",s)}}},function(e,t,n){var r=n(244),o=n(152),a=n(41)("toStringTag"),i="Arguments"==o(function(){return arguments}());e.exports=r?o:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),a))?n:i?o(t):"Object"==(r=o(t))&&"function"==typeof t.callee?"Arguments":r}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw new TypeError(e+" is not a function");return e}},function(e,t,n){e.exports=n(685)},function(e,t,n){"use strict";function r(e){return function(e){try{return!!JSON.parse(e)}catch(e){return null}}(e)?"json":null}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_LAYOUT",(function(){return o})),n.d(t,"UPDATE_FILTER",(function(){return a})),n.d(t,"UPDATE_MODE",(function(){return i})),n.d(t,"SHOW",(function(){return s})),n.d(t,"updateLayout",(function(){return u})),n.d(t,"updateFilter",(function(){return c})),n.d(t,"show",(function(){return l})),n.d(t,"changeMode",(function(){return p}));var r=n(5),o="layout_update_layout",a="layout_update_filter",i="layout_update_mode",s="layout_show";function u(e){return{type:o,payload:e}}function c(e){return{type:a,payload:e}}function l(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=Object(r.v)(e),{type:s,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=Object(r.v)(e),{type:i,payload:{thing:e,mode:t}}}},function(e,t,n){var r=n(428),o=n(165),a=n(197),i=n(52),s=n(117),u=n(198),c=n(164),l=n(256),p=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(s(e)&&(i(e)||"string"==typeof e||"function"==typeof e.splice||u(e)||l(e)||a(e)))return!e.length;var t=o(e);if("[object Map]"==t||"[object Set]"==t)return!e.size;if(c(e))return!r(e).length;for(var n in e)if(p.call(e,n))return!1;return!0}},function(e,t,n){var r=n(49),o=n(182),a=n(108),i=n(69),s=n(184),u=n(54),c=n(368),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=i(e),t=s(t,!0),c)try{return l(e,t)}catch(e){}if(u(e,t))return a(!o.f.call(e,t),e[t])}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var r=n(78);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r,o=n(51),a=n(237),i=n(240),s=n(159),u=n(373),c=n(232),l=n(188),p=l("IE_PROTO"),f=function(){},h=function(e){return" - + + + + +
+
+
+
+ +
+

pine.backend.api.bp

+
+

Module Contents

+
+

Functions

+ ++++ + + + + + + + + + + + + + + +

openapi_spec()

swagger_ui_index()

swagger_ui(file: str)

init_app(app)

+
+
+pine.backend.api.bp.bp
+
+ +
+
+pine.backend.api.bp.LOGGER
+
+ +
+
+pine.backend.api.bp.openapi_spec()
+
+ +
+
+pine.backend.api.bp.swagger_ui_index()
+
+ +
+
+pine.backend.api.bp.swagger_ui(file: str)
+
+ +
+
+pine.backend.api.bp.init_app(app)
+
+ +
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/autoapi/pine/backend/api/index.html b/docs/build/html/autoapi/pine/backend/api/index.html new file mode 100644 index 0000000..341babc --- /dev/null +++ b/docs/build/html/autoapi/pine/backend/api/index.html @@ -0,0 +1,139 @@ + + + + + + + + + pine.backend.api — pine documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

pine.backend.api

+

This module implements all methods required for SwaggerUI to run on the +backend of PINE.

+
+

Submodules

+ +
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/build/html/autoapi/pine/backend/auth/index.html b/docs/build/html/autoapi/pine/backend/auth/index.html index 20afaff..1ae7a53 100644 --- a/docs/build/html/autoapi/pine/backend/auth/index.html +++ b/docs/build/html/autoapi/pine/backend/auth/index.html @@ -19,7 +19,7 @@ - + @z$w(l<8t@L|F=Xc%sSiA^zy$H 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 wjiqp;m3Y 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
o2ER_Kw`eLS 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

YQm6 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

ZIs* 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

ru1j=<9e8UT(l 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

9u~e>6ru;U$XGrY-YY;S7M_rpS{_=`eS2OqBFuU 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

+ + + + + + +
+pine.backend.api +

This module implements all methods required for SwaggerUI to run on the +backend of PINE.

+
+Submodules +
+
+pine.backend.api.bp +
+Module Contents +
+Functions + ++++ + + + + + + + + + + + + + + +

openapi_spec()

swagger_ui_index()

swagger_ui(file: str)

init_app(app)

+
+
+pine.backend.api.bp.bp
+
+ +
+
+pine.backend.api.bp.LOGGER
+
+ +
+
+pine.backend.api.bp.openapi_spec()
+
+ +
+
+pine.backend.api.bp.swagger_ui_index()
+
+ +
+
+pine.backend.api.bp.swagger_ui(file: str)
+
+ +
+
+pine.backend.api.bp.init_app(app)
+
+
@@ -960,7 +1029,7 @@ front-end and store the collections in the backend

add_label_to_collection(collection_id)

-

get_overlap_ids(collection_id)

+

get_overlap_ids(collection_id: str)

Return the list of ids for overlapping documents for the collection matching the provided collection id.

_upload_documents(collection, docs)

@@ -1139,7 +1208,7 @@ pages.
-pine.backend.collections.bp.get_overlap_ids(collection_id)
+pine.backend.collections.bp.get_overlap_ids(collection_id: str)

Return the list of ids for overlapping documents for the collection matching the provided collection id. :param collection_id: str :return: tuple

@@ -1257,6 +1326,9 @@ csvHasHeader - boolean for whether or not the csv file has a header row (default

get_user_permissions_by_ids(collection_ids: Iterable[str]) → List[models.CollectionUserPermissions]

+

get_overlap_ids(collection_id: str)

+

Return the list of ids for overlapping documents for the collection matching the provided collection id.

+
@@ -1279,6 +1351,14 @@ csvHasHeader - boolean for whether or not the csv file has a header row (default pine.backend.collections.get_user_permissions_by_ids(collection_ids: Iterable[str])List[models.CollectionUserPermissions]
+
+
+pine.backend.collections.get_overlap_ids(collection_id: str)
+

Return the list of ids for overlapping documents for the collection matching the provided collection id. +:param collection_id: str +:return: tuple

+
+
@@ -1489,7 +1569,7 @@ type of strings that is combined with a ‘/’.

-pine.backend.data.service.get(path: PATH_TYPE, **kwargs: dict)requests.Response
+pine.backend.data.service.get(path: PATH_TYPE, **kwargs: dict)requests.Response

Wraps requests.get for the given eve-relative path.

Parameters
@@ -1503,14 +1583,14 @@ type of strings that is combined with a ‘/’.

server response

Return type
-

requests.Response

+

requests.Response

-pine.backend.data.service.post(path: PATH_TYPE, **kwargs: dict)requests.Response
+pine.backend.data.service.post(path: PATH_TYPE, **kwargs: dict)requests.Response

Wraps requests.post for the given eve-relative path.

Parameters
@@ -1524,14 +1604,14 @@ type of strings that is combined with a ‘/’.

server response

Return type
-

requests.Response

+

requests.Response

-pine.backend.data.service.put(path: PATH_TYPE, **kwargs: dict)requests.Response
+pine.backend.data.service.put(path: PATH_TYPE, **kwargs: dict)requests.Response

Wraps requests.put for the given eve-relative path.

Parameters
@@ -1545,14 +1625,14 @@ type of strings that is combined with a ‘/’.

server response

Return type
-

requests.Response

+

requests.Response

-pine.backend.data.service.delete(path: PATH_TYPE, **kwargs: dict)requests.Response
+pine.backend.data.service.delete(path: PATH_TYPE, **kwargs: dict)requests.Response

Wraps requests.delete for the given eve-relative path.

Parameters
@@ -1566,14 +1646,14 @@ type of strings that is combined with a ‘/’.

server response

Return type
-

requests.Response

+

requests.Response

-pine.backend.data.service.patch(path: PATH_TYPE, **kwargs: dict)requests.Response
+pine.backend.data.service.patch(path: PATH_TYPE, **kwargs: dict)requests.Response

Wraps requests.patch for the given eve-relative path.

Parameters
@@ -1587,7 +1667,7 @@ type of strings that is combined with a ‘/’.

server response

Return type
-

requests.Response

+

requests.Response

@@ -1677,7 +1757,7 @@ JSON with “_items”, “_meta”, etc.

-pine.backend.data.service.convert_response(requests_response: requests.Response)flask.Response
+pine.backend.data.service.convert_response(requests_response: requests.Response)flask.Response

Converts a requests response to a flask response.

Parameters
@@ -2079,7 +2159,10 @@ calling … with all the default options.

-

ServiceManager

+

ServiceJob

+

Data class for a service job.

+ +

ServiceManager

type default_handler

callable

@@ -2099,6 +2182,23 @@ calling … with all the default options.

pine.backend.job_manager.service.logger
+
+
+class pine.backend.job_manager.service.ServiceJob(job_id: str, request_body: dict, request_response: dict)
+

Bases: object

+

Data class for a service job.

+

“Constructor.

+
+
Parameters
+
    +
  • job_id – str: job ID

  • +
  • request_body – dict: job request body

  • +
  • request_response – dict: job request response

  • +
+
+
+
+
class pine.backend.job_manager.service.ServiceManager(default_handler=None)
@@ -2210,6 +2310,16 @@ calling … with all the default options.

reserved_channels
+
+
+classmethod get_results_key(cls, service_name: str, job_id: str)str
+
+ +
+
+classmethod get_running_jobs_key(cls, service_name: str)str
+
+
classmethod get_registered_channels(cls, include_ttl=False)
@@ -2234,9 +2344,19 @@ calling … with all the default options.

:rtype: list[str] | list[dict]

+
+
+classmethod _get_service_details(cls, service_name: str, retry_count=10)dict
+
+ +
+
+classmethod _get_service_channel(cls, service_name: str)str
+
+
-classmethod send_service_request(cls, service_name, data, job_id=None, encoder=None)
+classmethod send_service_request(cls, service_name: str, data, job_id=None, encoder=None)

Queue’s a job for the requested service. :type service_name: str :type data: dict @@ -2245,6 +2365,36 @@ calling … with all the default options.

:rtype: None | dict

+
+
+classmethod get_job_response(cls, service_name: str, job_id: str, timeout_in_s: int)
+

Waits for a response for the given job and returns it. +:param service_name: str: service name +:param job_id: str: job ID +:param timeout_in_s: int: wait timeout in seconds +:rtype None | dict

+
+ +
+
+classmethod send_service_request_and_get_response(cls, service_name: str, data, timeout_in_s: int, job_id=None, encoder=None)pine.backend.job_manager.service.ServiceJob
+

Sends a service requests, waits for a response, and returns job data. +:param service_name: str: service name +:param data: job data +:param timeout_in_s: int: wait timeout in seconds +:param job_id: str: optional job ID (or None to auto-generate one) +:param encoder: optional JSON encoder for job data +:rtype None | ServiceJob

+
+ +
+
+classmethod get_running_jobs(cls, service_name: str)List[str]
+

Returns running jobs. +:param service_name: str: service name +:rtype list[str]

+
+
start_listeners(self)
@@ -3058,43 +3208,73 @@ annotations. Boundary errors for adjacent annotations with the same label are ig +

_get_classifier(classifier_id: str) → dict

+

+ +

_clear_classifier(classifier_id: str)

+

+ +

_get_classifier_pipeline(classifier_id: str) → dict

+

+ +

_check_permissions(classifier: dict)

+

+ +

_get_pipeline_status(pipeline: str, classifier_id: str) → dict

+

+ +

_get_pipeline_running_jobs(pipeline: str, classifier_id: str) → List[str]

+

+ +

_train_pipeline(pipeline: str, classifier_id: str, model_name: str) → dict

+

+ +

_predict_pipeline(pipeline: str, classifier_id: str, document_ids: List[str], texts: List[str], timeout_in_s: int) → dict

+

+

get_pipelines()

-

get_pipeline_by_id(pipeline_id)

+

get_pipeline_by_id(pipeline_id: str)

-

_get_collection_classifier(collection_id)

+

get_pipeline_status(pipeline_id: str) → flask.Response

-

get_collection_classifier(collection_id)

+

_get_classifier_metrics(classifier_id: str)

-

_get_classifier_metrics(classifier_id)

+

get_classifier_metrics(classifier_id: str)

-

get_metrics()

+

_get_collection_classifier(collection_id: str) → dict

-

get_classifier_metrics(classifier_id)

+

get_collection_classifier(collection_id: str)

-

_get_classifier(classifier_id)

+

get_classifier_status(classifier_id: str)

-

_get_next_instance(classifier_id)

+

get_running_jobs(classifier_id: str)

-

get_next_by_classifier(classifier_id)

+

train(classifier_id: str)

-

advance_to_next_document_by_classifier(classifier_id, document_id)

+

predict(classifier_id: str)

-

predict()

+

_get_next_instance(classifier_id: str)

-

test_redis()

+

_check_instance_overlap(classifier: dict, instance: dict, user_id: str)

+

+ +

get_next_by_classifier(classifier_id: str)

+

+ +

advance_to_next_document_by_classifier(classifier_id: str, document_id: str)

init_app(app)

@@ -3118,13 +3298,53 @@ annotations. Boundary errors for adjacent annotations with the same label are ig
-
-pine.backend.pipelines.bp.classifier_dict
+
+pine.backend.pipelines.bp._cached_classifiers
-
-pine.backend.pipelines.bp.classifier_pipelines
+
+pine.backend.pipelines.bp._cached_classifier_pipelines
+
+ +
+
+pine.backend.pipelines.bp._get_classifier(classifier_id: str)dict
+
+ +
+
+pine.backend.pipelines.bp._clear_classifier(classifier_id: str)
+
+ +
+
+pine.backend.pipelines.bp._get_classifier_pipeline(classifier_id: str)dict
+
+ +
+
+pine.backend.pipelines.bp._check_permissions(classifier: dict)
+
+ +
+
+pine.backend.pipelines.bp._get_pipeline_status(pipeline: str, classifier_id: str)dict
+
+ +
+
+pine.backend.pipelines.bp._get_pipeline_running_jobs(pipeline: str, classifier_id: str)List[str]
+
+ +
+
+pine.backend.pipelines.bp._train_pipeline(pipeline: str, classifier_id: str, model_name: str)dict
+
+ +
+
+pine.backend.pipelines.bp._predict_pipeline(pipeline: str, classifier_id: str, document_ids: List[str], texts: List[str], timeout_in_s: int)dict
@@ -3134,62 +3354,72 @@ annotations. Boundary errors for adjacent annotations with the same label are ig
-pine.backend.pipelines.bp.get_pipeline_by_id(pipeline_id)
+pine.backend.pipelines.bp.get_pipeline_by_id(pipeline_id: str)
-
-pine.backend.pipelines.bp._get_collection_classifier(collection_id)
-
- -
-
-pine.backend.pipelines.bp.get_collection_classifier(collection_id)
+
+pine.backend.pipelines.bp.get_pipeline_status(pipeline_id: str)flask.Response
-pine.backend.pipelines.bp._get_classifier_metrics(classifier_id)
-
- -
-
-pine.backend.pipelines.bp.get_metrics()
+pine.backend.pipelines.bp._get_classifier_metrics(classifier_id: str)
-pine.backend.pipelines.bp.get_classifier_metrics(classifier_id)
+pine.backend.pipelines.bp.get_classifier_metrics(classifier_id: str)
-
-pine.backend.pipelines.bp._get_classifier(classifier_id)
+
+pine.backend.pipelines.bp._get_collection_classifier(collection_id: str)dict
-
-pine.backend.pipelines.bp._get_next_instance(classifier_id)
+
+pine.backend.pipelines.bp.get_collection_classifier(collection_id: str)
-
-pine.backend.pipelines.bp.get_next_by_classifier(classifier_id)
+
+pine.backend.pipelines.bp.get_classifier_status(classifier_id: str)
-
-pine.backend.pipelines.bp.advance_to_next_document_by_classifier(classifier_id, document_id)
+
+pine.backend.pipelines.bp.get_running_jobs(classifier_id: str)
+
+ +
+
+pine.backend.pipelines.bp.train(classifier_id: str)
-pine.backend.pipelines.bp.predict()
+pine.backend.pipelines.bp.predict(classifier_id: str)
-
-pine.backend.pipelines.bp.test_redis()
+
+pine.backend.pipelines.bp._get_next_instance(classifier_id: str)
+
+ +
+
+pine.backend.pipelines.bp._check_instance_overlap(classifier: dict, instance: dict, user_id: str)
+
+ +
+
+pine.backend.pipelines.bp.get_next_by_classifier(classifier_id: str)
+
+ +
+
+pine.backend.pipelines.bp.advance_to_next_document_by_classifier(classifier_id: str, document_id: str)
@@ -4258,7 +4488,7 @@ are fully aware of the security consequences

The currently open session, or None.

Type
-

requests.Session

+

requests.Session

@@ -4311,145 +4541,145 @@ security consequences of such.

-_req(self, method: str, path: str, *additional_paths: List[str], **kwargs)requests.Response
-

Makes a requests call, checks for errors, and returns the response.

+_req(self, method: str, path: str, *additional_paths: List[str], **kwargs)requests.Response +

Makes a requests call, checks for errors, and returns the response.

Parameters
  • method (str) – REST method ("get", "post", etc.)

  • path (str) – relative path, e.g. "users"

  • *additional_paths (list(str), optional) – any additional path components

  • -
  • **kwargs (dict) – any additional kwargs to send to requests

  • +
  • **kwargs (dict) – any additional kwargs to send to requests

Raises

exceptions.PineClientHttpException – if the HTTP request returns an error

Returns
-

the requests requests.Response object

+

the requests requests.Response object

Return type
-

requests.Response

+

requests.Response

-get(self, path: str, *additional_paths: List[str], **kwargs)requests.Response
-

Makes a requests GET call, checks for errors, and returns the response.

+get(self, path: str, *additional_paths: List[str], **kwargs)requests.Response +

Makes a requests GET call, checks for errors, and returns the response.

Parameters
  • path (str) – relative path, e.g. "users"

  • *additional_paths (list(str), optional) – any additional path components

  • -
  • **kwargs (dict) – any additional kwargs to send to requests

  • +
  • **kwargs (dict) – any additional kwargs to send to requests

Raises

exceptions.PineClientHttpException – if the HTTP request returns an error

Returns
-

the requests Response object

+

the requests Response object

Return type
-

requests.Response

+

requests.Response

-put(self, path: str, *additional_paths: List[str], **kwargs)requests.Response
-

Makes a requests PUT call, checks for errors, and returns the response.

+put(self, path: str, *additional_paths: List[str], **kwargs)requests.Response +

Makes a requests PUT call, checks for errors, and returns the response.

Parameters
  • path (str) – relative path, e.g. "users"

  • *additional_paths (list(str), optional) – any additional path components

  • -
  • **kwargs (dict) – any additional kwargs to send to requests

  • +
  • **kwargs (dict) – any additional kwargs to send to requests

Raises

exceptions.PineClientHttpException – if the HTTP request returns an error

Returns
-

the requests Response object

+

the requests Response object

Return type
-

requests.Response

+

requests.Response

-patch(self, path: str, *additional_paths: List[str], **kwargs)requests.Response
-

Makes a requests PATCH call, checks for errors, and returns the response.

+patch(self, path: str, *additional_paths: List[str], **kwargs)requests.Response +

Makes a requests PATCH call, checks for errors, and returns the response.

Parameters
  • path (str) – relative path, e.g. "users"

  • *additional_paths (list(str), optional) – any additional path components

  • -
  • **kwargs (dict) – any additional kwargs to send to requests

  • +
  • **kwargs (dict) – any additional kwargs to send to requests

Raises

exceptions.PineClientHttpException – if the HTTP request returns an error

Returns
-

the requests Response object

+

the requests Response object

Return type
-

requests.Response

+

requests.Response

-post(self, path: str, *additional_paths: List[str], **kwargs)requests.Response
-

Makes a requests POST call, checks for errors, and returns the response.

+post(self, path: str, *additional_paths: List[str], **kwargs)requests.Response +

Makes a requests POST call, checks for errors, and returns the response.

Parameters
  • path (str) – relative path, e.g. "users"

  • *additional_paths (list(str), optional) – any additional path components

  • -
  • **kwargs (dict) – any additional kwargs to send to requests

  • +
  • **kwargs (dict) – any additional kwargs to send to requests

Raises

exceptions.PineClientHttpException – if the HTTP request returns an error

Returns
-

the requests Response object

+

the requests Response object

Return type
-

requests.Response

+

requests.Response

-delete(self, path: str, *additional_paths: List[str], **kwargs)requests.Response
-

Makes a requests DELETE call, checks for errors, and returns the response.

+delete(self, path: str, *additional_paths: List[str], **kwargs)requests.Response +

Makes a requests DELETE call, checks for errors, and returns the response.

Parameters
  • path (str) – relative path, e.g. "users"

  • *additional_paths (list(str), optional) – any additional path components

  • -
  • **kwargs (dict) – any additional kwargs to send to requests

  • +
  • **kwargs (dict) – any additional kwargs to send to requests

Raises

exceptions.PineClientHttpException – if the HTTP request returns an error

Returns
-

the requests Response object

+

the requests Response object

Return type
-

requests.Response

+

requests.Response

@@ -4498,10 +4728,10 @@ are fully aware of the security consequences

mongo :pymongo.MongoClient
-

The pymongo.mongo_client.MongoClient instance.

+

The pymongo.mongo_client.MongoClient instance.

Type
-

pymongo.mongo_client.MongoClient

+

pymongo.mongo_client.MongoClient

@@ -4509,10 +4739,10 @@ are fully aware of the security consequences

mongo_db :pymongo.database.Database
-

The pymongo.database.Database instance.

+

The pymongo.database.Database instance.

Type
-

pymongo.database.Database

+

pymongo.database.Database

@@ -4929,6 +5159,23 @@ endpoint, e.g. containing fields “access_token”, “token_type”, “expire
+
+
+get_pipeline_status(self, pipeline_id: str)dict
+

Returns status for the given pipeline.

+
+
Parameters
+

pipeline_id – str: pipeline ID

+
+
Returns
+

pipeline status

+
+
Return type
+

dict

+
+
+
+
collection_builder(self, **kwargs: dict)pine.client.models.CollectionBuilder
@@ -4970,6 +5217,26 @@ endpoint, e.g. containing fields “access_token”, “token_type”, “expire
+
+
+archive_collection(self, collection_id: str, archive: bool = True)dict
+

Archives or unarchives the given collection.

+
+
Parameters
+
    +
  • collection_id – str: the ID of the collection

  • +
  • archive – bool: whether to archive (True) or unarchive (False) the collection

  • +
+
+
Returns
+

updated collection information

+
+
Return type
+

dict

+
+
+
+
get_collection_permissions(self, collection_id: str)pine.client.models.CollectionUserPermissions
@@ -5008,6 +5275,65 @@ endpoint, e.g. containing fields “access_token”, “token_type”, “expire
+
+
+get_collection_classifier(self, collection_id: str)dict
+

Returns the classifier associated with the given collection.

+
+
Parameters
+

collection_id (str) – the ID of the collection

+
+
Returns
+

the classifier associated with the given collection

+
+
Return type
+

dict

+
+
+
+ +
+
+get_next_document(self, classifier_id: str)str
+

Returns the ‘next’ document associated with the given classifier.

+

The next document is the one that the model suggests should be annotated by the logged-in +user next.

+
+
Parameters
+

classifier_id – str: ID of the classifier

+
+
Returns
+

the next document ID, or None if there are none left to annotate

+
+
Return type
+

str

+
+
+
+ +
+
+advance_next_document(self, classifier_id: str, document_id: str)dict
+

Advances the ‘next’ document associated with the given classifier by marking the +given document as annotated.

+

The next document is the one that the model suggests should be annotated by the logged-in +user next.

+
+
Parameters
+
    +
  • classifier_id – str: ID of the classifier

  • +
  • document_id – str: the ID of the document that was annotated

  • +
+
+
Returns
+

information on the advanced instance

+
+
Return type
+

dict

+
+
+
+
add_document(self, document: dict = {}, creator_id: str = None, collection_id: str = None, overlap: int = None, text: str = None, metadata: dict = None)str
@@ -5168,6 +5494,54 @@ This should only be
+
+
+get_my_document_annotations(self, document_id: str)List[List[dict]]
+

Returns annotations for the given document for the logged in user.

+
+
Parameters
+

document_id – the ID of the document to get annotations for

+
+
Raises
+
+
+
Returns
+

the annotations for the given document for the logged in user

+
+
Return type
+

list(list(dict))

+
+
+
+ +
+
+get_others_document_annotations(self, document_id: str)List[List]
+

Returns annotations for the given document for users other than the logged in user.

+
+
Parameters
+

document_id – the ID of the document to get annotations for

+
+
Raises
+
+
+
Returns
+

the annotations for the given document for users other than the logged in user

+
+
Return type
+

list(list(dict))

+
+
+
+
list_collections(self, include_archived: bool = False)List[dict]
@@ -5191,6 +5565,23 @@ This should only be
+
+
+get_collection(self, collection_id: str)dict
+

Returns the collection with the given ID.

+
+
Parameters
+

collection_id – str: the ID of the collection

+
+
Returns
+

the collection data

+
+
Return type
+

dict

+
+
+
+
get_collection_iaa_report(self, collection_id: str)dict
@@ -5244,6 +5635,98 @@ collection doesn’t exist

+
+
+get_classifier_status(self, classifier_id: str)dict
+

Returns the status for the given classifier.

+
+
Param
+

classifier_id: str: classifier ID

+
+
Returns
+

status for the given classifier

+
+
Return type
+

dict

+
+
+
+ +
+
+classifier_train(self, classifier_id: str, model_name: str = 'auto-trained')dict
+

Trains the given classifier (using collection documents).

+

Note that training is done asynchronously, so this method should return very quickly. One +of the things returned in the dict will be a job ID. If you want to know when the training +has finished, you can periodically poll get_classifier_running_jobs() and check +for that job ID.

+
+
Parameters
+
    +
  • classifier_id – str: classifier ID

  • +
  • model_name – str: name of model corresponding to filename on disk, defaults to +"auto-trained" which is the same as the annotation-based +model training

  • +
+
+
Return type
+

dict

+
+
+
+ +
+
+classifier_has_trained(self, classifier_id: str)bool
+

Returns whether the given classifier has been trained or not.

+

If False, future calls to predict will fail.

+
+
Param
+

classifier_id: str: classifier ID

+
+
Return type
+

bool

+
+
+
+ +
+
+classifier_predict(self, classifier_id, document_ids: List[str], texts: List[str], timeout_in_s: int = 36000)dict
+

Runs classifier prediction on the given documents. At least one of document_ids and +texts must be non-empty.

+

This prediction uses the last-trained model name for that classifier. This method will +block until the prediction has finished and then return the results.

+
+
Parameters
+
    +
  • classifier_id – str: classifier ID

  • +
  • document_ids – list[str]: a list of document IDs to run prediction on

  • +
  • texts – list[str]: a list of direct document texts to run prediction on

  • +
  • timeout_in_s – int: max timeout in seconds before erroring out and returning, defaults +to 36000

  • +
+
+
Return type
+

dict

+
+
+
+ +
+
+get_classifier_running_jobs(self, classifier_id: str)List[str]
+

Gets the list of running job IDs for the given classifier.

+
+
Parameters
+

classifier_id – str: classifier ID

+
+
Return type
+

list[str]

+
+
+
+
@@ -5328,7 +5811,7 @@ are fully aware of the security consequences

-exception pine.client.exceptions.PineClientHttpException(method: str, path: str, resp: requests.Response)
+exception pine.client.exceptions.PineClientHttpException(method: str, path: str, resp: requests.Response)

Bases: pine.client.exceptions.PineClientException

A PINE client exception caused by an underlying HTTP exception.

Constructor.

@@ -5337,17 +5820,17 @@ are fully aware of the security consequences

resp :requests.Response
-

The Response with the error info

+

The Response with the error info

Type
-

requests.Response

+

requests.Response

@@ -6795,6 +7278,23 @@ endpoint, e.g. containing fields “access_token”, “token_type”, “expire
+
+
+get_pipeline_status(self, pipeline_id: str)dict
+

Returns status for the given pipeline.

+
+
Parameters
+

pipeline_id – str: pipeline ID

+
+
Returns
+

pipeline status

+
+
Return type
+

dict

+
+
+
+
collection_builder(self, **kwargs: dict)pine.client.models.CollectionBuilder
@@ -6836,6 +7336,26 @@ endpoint, e.g. containing fields “access_token”, “token_type”, “expire
+
+
+archive_collection(self, collection_id: str, archive: bool = True)dict
+

Archives or unarchives the given collection.

+
+
Parameters
+
    +
  • collection_id – str: the ID of the collection

  • +
  • archive – bool: whether to archive (True) or unarchive (False) the collection

  • +
+
+
Returns
+

updated collection information

+
+
Return type
+

dict

+
+
+
+
get_collection_permissions(self, collection_id: str)pine.client.models.CollectionUserPermissions
@@ -6874,6 +7394,65 @@ endpoint, e.g. containing fields “access_token”, “token_type”, “expire
+
+
+get_collection_classifier(self, collection_id: str)dict
+

Returns the classifier associated with the given collection.

+
+
Parameters
+

collection_id (str) – the ID of the collection

+
+
Returns
+

the classifier associated with the given collection

+
+
Return type
+

dict

+
+
+
+ +
+
+get_next_document(self, classifier_id: str)str
+

Returns the ‘next’ document associated with the given classifier.

+

The next document is the one that the model suggests should be annotated by the logged-in +user next.

+
+
Parameters
+

classifier_id – str: ID of the classifier

+
+
Returns
+

the next document ID, or None if there are none left to annotate

+
+
Return type
+

str

+
+
+
+ +
+
+advance_next_document(self, classifier_id: str, document_id: str)dict
+

Advances the ‘next’ document associated with the given classifier by marking the +given document as annotated.

+

The next document is the one that the model suggests should be annotated by the logged-in +user next.

+
+
Parameters
+
    +
  • classifier_id – str: ID of the classifier

  • +
  • document_id – str: the ID of the document that was annotated

  • +
+
+
Returns
+

information on the advanced instance

+
+
Return type
+

dict

+
+
+
+
add_document(self, document: dict = {}, creator_id: str = None, collection_id: str = None, overlap: int = None, text: str = None, metadata: dict = None)str
@@ -7034,6 +7613,54 @@ This should only be
+
+
+get_my_document_annotations(self, document_id: str)List[List[dict]]
+

Returns annotations for the given document for the logged in user.

+
+
Parameters
+

document_id – the ID of the document to get annotations for

+
+
Raises
+
+
+
Returns
+

the annotations for the given document for the logged in user

+
+
Return type
+

list(list(dict))

+
+
+
+ +
+
+get_others_document_annotations(self, document_id: str)List[List]
+

Returns annotations for the given document for users other than the logged in user.

+
+
Parameters
+

document_id – the ID of the document to get annotations for

+
+
Raises
+
+
+
Returns
+

the annotations for the given document for users other than the logged in user

+
+
Return type
+

list(list(dict))

+
+
+
+
list_collections(self, include_archived: bool = False)List[dict]
@@ -7057,6 +7684,23 @@ This should only be
+
+
+get_collection(self, collection_id: str)dict
+

Returns the collection with the given ID.

+
+
Parameters
+

collection_id – str: the ID of the collection

+
+
Returns
+

the collection data

+
+
Return type
+

dict

+
+
+
+
get_collection_iaa_report(self, collection_id: str)dict
@@ -7110,6 +7754,98 @@ collection doesn’t exist

+
+
+get_classifier_status(self, classifier_id: str)dict
+

Returns the status for the given classifier.

+
+
Param
+

classifier_id: str: classifier ID

+
+
Returns
+

status for the given classifier

+
+
Return type
+

dict

+
+
+
+ +
+
+classifier_train(self, classifier_id: str, model_name: str = 'auto-trained')dict
+

Trains the given classifier (using collection documents).

+

Note that training is done asynchronously, so this method should return very quickly. One +of the things returned in the dict will be a job ID. If you want to know when the training +has finished, you can periodically poll get_classifier_running_jobs() and check +for that job ID.

+
+
Parameters
+
    +
  • classifier_id – str: classifier ID

  • +
  • model_name – str: name of model corresponding to filename on disk, defaults to +"auto-trained" which is the same as the annotation-based +model training

  • +
+
+
Return type
+

dict

+
+
+
+ +
+
+classifier_has_trained(self, classifier_id: str)bool
+

Returns whether the given classifier has been trained or not.

+

If False, future calls to predict will fail.

+
+
Param
+

classifier_id: str: classifier ID

+
+
Return type
+

bool

+
+
+
+ +
+
+classifier_predict(self, classifier_id, document_ids: List[str], texts: List[str], timeout_in_s: int = 36000)dict
+

Runs classifier prediction on the given documents. At least one of document_ids and +texts must be non-empty.

+

This prediction uses the last-trained model name for that classifier. This method will +block until the prediction has finished and then return the results.

+
+
Parameters
+
    +
  • classifier_id – str: classifier ID

  • +
  • document_ids – list[str]: a list of document IDs to run prediction on

  • +
  • texts – list[str]: a list of direct document texts to run prediction on

  • +
  • timeout_in_s – int: max timeout in seconds before erroring out and returning, defaults +to 36000

  • +
+
+
Return type
+

dict

+
+
+
+ +
+
+get_classifier_running_jobs(self, classifier_id: str)List[str]
+

Gets the list of running job IDs for the given classifier.

+
+
Parameters
+

classifier_id – str: classifier ID

+
+
Return type
+

list[str]

+
+
+
+
@@ -7652,6 +8388,26 @@ defaults to Noneprocessing_queue_key_timeout
+
+
+results_queue_key
+
+ +
+
+results_queue_key_timeout
+
+ +
+
+running_jobs_key
+
+ +
+
+classifiers_training_key
+
+
processing_lock_key
@@ -7687,16 +8443,6 @@ defaults to Noneregistration_channel
-
-
-classmethod publish_response(cls, channel, data)
-
-
Return type
-

bool

-
-
-
-
start_workers(self)
@@ -7717,9 +8463,29 @@ defaults to None
+
+
+static do_with_redis(callback: Callable[[redis.StrictRedis], typing.Any])
+
+ +
+
+static push_results(job_id: str, response)
+
+ +
+
+static wait_until_classifier_isnt_training(classifier_id: str, job_id: str)
+
+ +
+
+static classifier_is_done_training(classifier_id: str)
+
+
-static process_message(job_details)
+static process_message(job_id: str, job_details)
@@ -7890,6 +8656,11 @@ defaults to NoneREDIS_EXPIRE = 3600
+
+
+REDIS_MAX_PROCESSES = 10
+
+
SCHEDULER_REGISTRATION_TIMEOUT
@@ -8183,18 +8954,57 @@ The prefix can be used to avoid blindy changing values and target a subset of ma
-get_items(self, resource)
+get_items(self, resource, params={}) +
+ +
+
+_get_documents_map(self, params: dict = {})
-get_documents(self, collection_id)
+get_documents(self, collection_id: str)Dict[str, str] +

Returns a document map where the document overlap is 0.

+
+
Parameters
+

collection_id – str: the ID of the collection

+
+
Returns
+

a mapping from document ID to document text for non-overlap documents

+
+
Return type
+

dict

+
+
+
+ +
+
+get_documents_by_id(self, document_ids: List[str])
-get_docs_with_annotations(self, collection_id, doc_map)
-
+get_docs_with_annotations(self, collection_id: str, doc_map: Dict[str, str])Tuple[typing.List[str], typing.List[str], typing.List[str], typing.List[str]] +

Gets document and annotation data. Only non-overlapping documents are returned.

+
+
Parameters
+
    +
  • collection_id – str: the ID of the collection

  • +
  • doc_map – dict[str, str]: map of document IDs to document text

  • +
+
+
Returns
+

(documents, labels, doc_ids, ann_ids) where documents is a list of the texts, +labels is a list of the annotations, doc_ids is a list of the document IDs, and +ann_ids is a list of the annotation IDs

+
+
Return type
+

tuple

+
+
+
@@ -8312,20 +9122,43 @@ The prefix can be used to avoid blindy changing values and target a subset of ma
class pine.pipelines.NER_API.ner_api

Bases: object

+
+
+status(self, classifier_id: str, pipeline_name: str)dict
+
+
-perform_fold(self, model, train_data, test_data, pipeline_parameters)
+perform_fold(self, model: pine.pipelines.pmap_ner.NER, train_data, test_data, **pipeline_parameters)
-perform_five_fold(self, model, documents, annotations, doc_ids, pipeline_parameters)
+perform_five_fold(self, model: pine.pipelines.pmap_ner.NER, documents, annotations, doc_ids, **pipeline_parameters)
-get_document_ranking(self, model, doc_map, doc_ids)
-
+get_document_ranking(self, model: pine.pipelines.pmap_ner.NER, doc_map: Dict[str, str], doc_ids: List[str])List[str] +

Calculates document rankings and returns document IDs sorted by ranking.

+

The ranking should be which documents should be evaluated first. This probably +corresponds in some ways to the documents which the model is least confident about.

+
+
Parameters
+
    +
  • model – NER model

  • +
  • doc_map – dict: mapping of document IDs to document text where overlap is 0

  • +
  • doc_ids – list: IDs of documents where ???

  • +
+
+
Returns
+

sorted document IDs

+
+
Return type
+

list

+
+
+
@@ -8339,7 +9172,7 @@ The prefix can be used to avoid blindy changing values and target a subset of ma
-predict(self, classifier_id, pipeline_name, documents, document_ids)
+predict(self, classifier_id: str, pipeline_name: str, document_ids: List[str], texts: List[str])
@@ -8359,35 +9192,40 @@ The prefix can be used to avoid blindy changing values and target a subset of ma -

rank(results, metric)

+

rank(document_ids: List[str], results: List[DocumentPredictionProbabilities], metric: str) → List[Tuple[str, float]]

if metric == ‘lc’: return least_confidence(results)

-

least_confidence(results)

+

least_confidence(document_ids: List[str], results: List[DocumentPredictionProbabilities]) → List[Tuple[str, float]]

-

least_confidence_squared(results)

+

least_confidence_squared(document_ids: List[str], results: List[DocumentPredictionProbabilities]) → List[Tuple[str, float]]

-

least_confidence_squared_by_entity(results)

+

least_confidence_squared_by_entity(document_ids: List[str], results: List[DocumentPredictionProbabilities]) → List[Tuple[str, float]]

-

largest_margin(results)

+

largest_margin(document_ids: List[str], results: List[DocumentPredictionProbabilities]) → List[Tuple[str, float]]

-

entropy_rank(results, N=None)

+

entropy_rank(document_ids: List[str], results: List[DocumentPredictionProbabilities], N=None) → List[Tuple[str, float]]

-

random_rank(results)

+

random_rank(document_ids: List[str], results: List[DocumentPredictionProbabilities]) → List[Tuple[str, float]]

-

most_of_least_popular(results)

+

most_of_least_popular(document_ids: List[str], results: List[DocumentPredictionProbabilities]) → List[Tuple[str, float]]

+
+
+pine.pipelines.RankingFunctions.logger
+
+
-pine.pipelines.RankingFunctions.rank(results, metric)
+pine.pipelines.RankingFunctions.rank(document_ids: List[str], results: List[DocumentPredictionProbabilities], metric: str)List[Tuple[str, float]]

if metric == ‘lc’: return least_confidence(results) if metric == ‘ma’: return largest_margin(results) if metric == ‘en’: return entropy_rank(results) @@ -8401,37 +9239,37 @@ return -1

-pine.pipelines.RankingFunctions.least_confidence(results)
+pine.pipelines.RankingFunctions.least_confidence(document_ids: List[str], results: List[DocumentPredictionProbabilities])List[Tuple[str, float]]
-pine.pipelines.RankingFunctions.least_confidence_squared(results)
+pine.pipelines.RankingFunctions.least_confidence_squared(document_ids: List[str], results: List[DocumentPredictionProbabilities])List[Tuple[str, float]]
-pine.pipelines.RankingFunctions.least_confidence_squared_by_entity(results)
+pine.pipelines.RankingFunctions.least_confidence_squared_by_entity(document_ids: List[str], results: List[DocumentPredictionProbabilities])List[Tuple[str, float]]
-pine.pipelines.RankingFunctions.largest_margin(results)
+pine.pipelines.RankingFunctions.largest_margin(document_ids: List[str], results: List[DocumentPredictionProbabilities])List[Tuple[str, float]]
-pine.pipelines.RankingFunctions.entropy_rank(results, N=None)
+pine.pipelines.RankingFunctions.entropy_rank(document_ids: List[str], results: List[DocumentPredictionProbabilities], N=None)List[Tuple[str, float]]
-pine.pipelines.RankingFunctions.random_rank(results)
+pine.pipelines.RankingFunctions.random_rank(document_ids: List[str], results: List[DocumentPredictionProbabilities])List[Tuple[str, float]]
+pine.pipelines.RankingFunctions.most_of_least_popular(document_ids: List[str], results: List[DocumentPredictionProbabilities])List[Tuple[str, float]]
@@ -8508,24 +9346,44 @@ return -1

__props
+
+
+__is_setup = False
+
+
__id
+
+
+__default_fit_params
+
+ +
+
+classmethod setup(cls, java_dir=None, ner_path=None)
+
+ +
+
+status(self)dict
+
+
-fit(self, X, y, params=None)
+fit(self, X, y, **params)
-predict(self, X, Xid)
+predict(self, X: Iterable[str])List[DocumentPredictions]
-predict_proba(self, X, Xid, get_all_labels=False, include_other=False)
+predict_proba(self, X: Iterable[str], get_all_labels=False, include_other=False, **kwargs)List[DocumentPredictionProbabilities]
@@ -8605,8 +9463,8 @@ return -1

class pine.pipelines.opennlp_NER_pipeline.opennlp_NER(java_dir=None, ner_path=None, tmp_dir=None)

Bases: pine.pipelines.pipeline.Pipeline

-
-__jar =
+
+__ner_path =
@@ -8644,19 +9502,34 @@ return -1

__id
+
+
+__is_setup = False
+
+ +
+
+classmethod setup(cls, java_dir=None, ner_path=None)
+
+ +
+
+status(self)dict
+
+
-fit(self, X, y, params)
+fit(self, X, y, **params)
-predict(self, X, Xid)
+predict(self, X: Iterable[str])List[DocumentPredictions]
-predict_proba(self, X, Xid, get_all_labels=False, include_other=False)
+predict_proba(self, X: Iterable[str], **kwargs)List[DocumentPredictionProbabilities]
@@ -8696,7 +9569,7 @@ return -1

-convert_ann_collection_to_per_token(self, annotations, tokens)
+convert_ann_collection_to_per_token(self, annotations: List[Union[NerPrediction, typing.Tuple[int, int, str]]], tokens)
@@ -8726,28 +9599,99 @@ return -1

+

NerPrediction

+

+ +

DocumentPredictions

+

+ +

NerPredictionProbabilities

+

+ +

DocumentPredictionProbabilities

+

+

Pipeline

+
+
+class pine.pipelines.pipeline.NerPrediction(offset_start: int, offset_end: int, label: str)
+

Bases: object

+
+
+serialize(self)Tuple[int, int, str]
+
+ +
+ +
+
+class pine.pipelines.pipeline.DocumentPredictions(ner: List[NerPrediction], doc: List[str], extra_data: Any = None)
+

Bases: object

+
+
+serialize(self)dict
+
+ +
+ +
+
+class pine.pipelines.pipeline.NerPredictionProbabilities(offset_start: int, offset_end: int, predictions: List[Tuple[str, float]])
+

Bases: object

+
+
+get_highest_prediction(self)Tuple[str, float]
+
+ +
+
+get_predictions_from_highest_to_lowest(self)List[Tuple[str, float]]
+
+ +
+
+serialize(self)Tuple[int, int, typing.List[typing.Tuple[str, float]]]
+
+ +
+ +
+
+class pine.pipelines.pipeline.DocumentPredictionProbabilities(ner: List[NerPredictionProbabilities], doc: List[Tuple[str, float]])
+

Bases: object

+
+
+serialize(self)dict
+
+ +
+
class pine.pipelines.pipeline.Pipeline

Bases: object

+
+
+abstract status(self)dict
+
+
-abstract fit(self, X, y)
+abstract fit(self, X, y, **params)
-abstract predict(self, X, Xid)
+abstract predict(self, X: Iterable[str])List[DocumentPredictions]
-abstract predict_proba(self, X, Xid)
+abstract predict_proba(self, X: Iterable[str], **kwargs)List[DocumentPredictionProbabilities]
@@ -8816,19 +9760,29 @@ return -1

pipe_init(self, x, **kwargs)
+
+
+property pipeline_class(self)
+
+ +
+
+status(self)dict
+
+
-fit(self, X, y, kwargs)
+fit(self, X, y, **kwargs)
-predict(self, X, Xid)
+predict(self, X: Iterable[str])List[DocumentPredictions]
-predict_proba(self, X, Xid, **kwargs)
+predict_proba(self, X: Iterable[str], **kwargs)List[DocumentPredictionProbabilities]
@@ -8843,7 +9797,7 @@ return -1

-save_model(self, model_path)
+save_model(self, model_name)
@@ -8880,10 +9834,20 @@ return -1

+
+
+pine.pipelines.spacy_NER_pipeline.logger
+
+
class pine.pipelines.spacy_NER_pipeline.spacy_NER(model_path=None)

Bases: pine.pipelines.pipeline.Pipeline

+
+
+__model
+
+
__nlp = []
@@ -8899,9 +9863,24 @@ return -1

__optimizer = []
+
+
+__default_fit_params
+
+ +
+
+_load_model(self, model_path=None)
+
+ +
+
+status(self)dict
+
+
-fit(self, X, y, params=None)
+fit(self, X, y, **params)
@@ -8911,12 +9890,12 @@ return -1

-predict(self, X, Xid)
+predict(self, X: Iterable[str])List[DocumentPredictions]
-predict_proba(self, X, Xid)
+predict_proba(self, X: Iterable[str], **kwargs)List[DocumentPredictionProbabilities]
@@ -8936,12 +9915,12 @@ return -1

-save_model(self, model_path)
+save_model(self, model_name)
-load_model(self, model_path)
+load_model(self, model_name)
diff --git a/docs/build/singlehtml/objects.inv b/docs/build/singlehtml/objects.inv index a2848cdbdb8a59d9d17250833d378cc341203fa8..49b28208812bb08c537e976d22eeab0df8a9a0e4 100644 GIT binary patch delta 8684 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 Ka`*q_BHpS44b3|M delta 8023 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 Z6L0p-53}F0Z&um!CufK6{vW(rr}jO4QkDP! diff --git a/frontend/annotation/nginx/nlp-web-app.http.mustache b/frontend/annotation/nginx/nlp-web-app.http.mustache index a91f4be..5f6ab64 100644 --- a/frontend/annotation/nginx/nlp-web-app.http.mustache +++ b/frontend/annotation/nginx/nlp-web-app.http.mustache @@ -18,6 +18,7 @@ server { location /api { include proxy_params; + proxy_set_header X-Forwarded-Prefix /api; rewrite ^/api(.*) $1 break; proxy_pass ${BACKEND_SERVER}; } diff --git a/frontend/annotation/nginx/nlp-web-app.https.mustache b/frontend/annotation/nginx/nlp-web-app.https.mustache index 8b660de..a4fccc0 100644 --- a/frontend/annotation/nginx/nlp-web-app.https.mustache +++ b/frontend/annotation/nginx/nlp-web-app.https.mustache @@ -20,8 +20,10 @@ server { location /api { include proxy_params; + proxy_set_header X-Forwarded-Prefix /api; rewrite ^/api(.*) $1 break; proxy_pass ${BACKEND_SERVER}; + proxy_redirect http://$http_host/ https://$http_host/; } } diff --git a/frontend/annotation/src/app/service/metrics/metrics.service.ts b/frontend/annotation/src/app/service/metrics/metrics.service.ts index 38a7642..c2ce121 100644 --- a/frontend/annotation/src/app/service/metrics/metrics.service.ts +++ b/frontend/annotation/src/app/service/metrics/metrics.service.ts @@ -5,7 +5,6 @@ import { map } from "rxjs/operators"; import { AuthService } from "../auth/auth.service"; import { BackendService } from "../backend/backend.service"; -import { DBClassifier, Classifier } from "../../model/classifier"; import { DBMetric, DBMetrics, Metric } from "../../model/metrics"; @Injectable({ @@ -15,9 +14,9 @@ export class MetricsService { constructor(private backend: BackendService, private auth: AuthService) { } - public getAllMetrics(): Observable { - return this.backend.get("/pipelines/metrics").pipe(map(Metric.fromDBItems)); - } +// public getAllMetrics(): Observable { +// return this.backend.get("/pipelines/metrics").pipe(map(Metric.fromDBItems)); +// } public getMetric(metric_id: string): Observable { return this.backend.get(`/pipelines/metrics/by_id/${metric_id}`).pipe(map(Metric.fromDB)); diff --git a/pipelines/Pipfile b/pipelines/Pipfile index ed86ca9..b91c947 100644 --- a/pipelines/Pipfile +++ b/pipelines/Pipfile @@ -1,4 +1,5 @@ # (C) 2019 The Johns Hopkins University Applied Physics Laboratory LLC. + [[source]] name = "pypi" url = "https://pypi.org/simple" @@ -19,6 +20,7 @@ spacy = "*" sklearn = "*" scikit-multilearn = "*" python-json-logger = "*" +overrides = "*" [requires] python_version = "3.6" diff --git a/pipelines/Pipfile.lock b/pipelines/Pipfile.lock index 1556d34..a18d1de 100644 --- a/pipelines/Pipfile.lock +++ b/pipelines/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "25ab5d00c7db50cedd4e5ffa1b72e5f3b604a1eac8cd6e69a1d0a35adbd826a1" + "sha256": "8daf42e30ea1629ba29f0aaec5d98bab899969be992a9168272abf3d5e57b080" }, "pipfile-spec": 6, "requires": { @@ -66,6 +66,21 @@ ], "version": "==3.0.4" }, + "click": { + "hashes": [ + "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", + "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==7.1.2" + }, + "contextvars": { + "hashes": [ + "sha256:f38c908aaa59c14335eeea12abea5f443646216c4e29380d7bf34d2018e2c39e" + ], + "markers": "python_version < '3.7'", + "version": "==2.4" + }, "cymem": { "hashes": [ "sha256:5083b2ab5fe13ced094a82e0df465e2dbbd9b1c013288888035e24fd6eb4ed01", @@ -121,6 +136,14 @@ "index": "pypi", "version": "==0.29.16" }, + "dataclasses": { + "hashes": [ + "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf", + "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97" + ], + "markers": "python_version < '3.7'", + "version": "==0.8" + }, "idna": { "hashes": [ "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", @@ -128,6 +151,27 @@ ], "version": "==2.9" }, + "immutables": { + "hashes": [ + "sha256:141c2e9ea515a3a815007a429f0b47a578ebeb42c831edaec882a245a35fffca", + "sha256:2283a93c151566e6830aee0e5bee55fc273455503b43aa004356b50f9182092b", + "sha256:3035849accee4f4e510ed7c94366a40e0f5fef9069fbe04a35f4787b13610a4a", + "sha256:3713ab1ebbb6946b7ce1387bb9d1d7f5e09c45add58c2a2ee65f963c171e746b", + "sha256:3b15c08c71c59e5b7c2470ef949d49ff9f4263bb77f488422eaa157da84d6999", + "sha256:6728f4392e3e8e64b593a5a0cd910a1278f07f879795517e09f308daed138631", + "sha256:6f117d9206165b9dab8fd81c5129db757d1a044953f438654236ed9a7a4224ae", + "sha256:8703d8abfd8687932f2a05f38e7de270c3a6ca3bd1c1efb3c938656b3f2f985a", + "sha256:a0a4e4417d5ef4812d7f99470cd39347b58cb927365dd2b8da9161040d260db0", + "sha256:b04fa69174e0c8f815f9c55f2a43fc9e5a68452fab459a08e904a74e8471639f", + "sha256:b75ade826920c4e490b1bb14cf967ac14e61eb7c5562161c5d7337d61962c226", + "sha256:b7e13c061785e34f73c4f659861f1b3e4a5fd918e4395c84b21c4e3d449ebe27", + "sha256:b8ad986f9b532c026f19585289384b0769188fcb68b37c7f0bd0df9092a6ca54", + "sha256:cbe8c64640637faa5535d539421b293327f119c31507c33ca880bd4f16035eb6", + "sha256:f0836cd3bdc37c8a77b192bbe5f41dbcc3ce654db048ebbba89bdfe6db7a1c7a" + ], + "markers": "python_version >= '3.5'", + "version": "==0.15" + }, "importlib-metadata": { "hashes": [ "sha256:2a688cbaa90e0cc587f1df48bdc97a6eadccdcd9c35fb3f976a09e3b5016d90f", @@ -136,6 +180,14 @@ "markers": "python_version < '3.8'", "version": "==1.6.0" }, + "jinja2": { + "hashes": [ + "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4", + "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4" + ], + "markers": "python_version >= '3.6'", + "version": "==3.0.1" + }, "joblib": { "hashes": [ "sha256:0630eea4f5664c463f23fbf5dcfc54a2bc6168902719fa8e19daf033022786c8", @@ -143,6 +195,46 @@ ], "version": "==0.14.1" }, + "markupsafe": { + "hashes": [ + "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298", + "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64", + "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b", + "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567", + "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff", + "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74", + "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35", + "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26", + "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7", + "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75", + "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f", + "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135", + "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8", + "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a", + "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914", + "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18", + "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8", + "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2", + "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d", + "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b", + "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f", + "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb", + "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833", + "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415", + "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902", + "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9", + "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d", + "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066", + "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f", + "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5", + "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94", + "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509", + "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51", + "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872" + ], + "markers": "python_version >= '3.6'", + "version": "==2.0.1" + }, "multiprocessing-logging": { "hashes": [ "sha256:9d3eb0f1f859b7ba6250a029726f77a7701999deda939595122d8748751de2e3" @@ -205,6 +297,30 @@ ], "version": "==1.18.2" }, + "overrides": { + "hashes": [ + "sha256:33926e018a952b06309517b3febede982112b86430e588bdd00560b80a4a800b", + "sha256:5ba636b73bf72d3d80550f4a5dfe3c7d04ec6e8fd246c4074bfc7ad82bd0ea3d" + ], + "index": "pypi", + "version": "==6.1.0" + }, + "packaging": { + "hashes": [ + "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", + "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==20.9" + }, + "pathy": { + "hashes": [ + "sha256:bffa0bd74c66575cf51c96d3ab312f34d08d6bff54aabb8c7a2b9f8b701fe6ef", + "sha256:f83f1eddf77dd86e824143eef8d9adbe0785c3cdd5ec0ed6c0edea3227385048" + ], + "markers": "python_version >= '3.6'", + "version": "==0.6.0" + }, "pebble": { "hashes": [ "sha256:077b51bcb8726ad9003214fb268fe8c51778503f4c37ffcea9a905ab97e23473", @@ -241,6 +357,34 @@ ], "version": "==3.0.2" }, + "pydantic": { + "hashes": [ + "sha256:00250e5123dd0b123ff72be0e1b69140e0b0b9e404d15be3846b77c6f1b1e387", + "sha256:0a1abcbd525fbb52da58c813d54c2ec706c31a91afdb75411a73dd1dec036595", + "sha256:115d8aa6f257a1d469c66b6bfc7aaf04cd87c25095f24542065c68ebcb42fe63", + "sha256:1f86d4da363badb39426a0ff494bf1d8510cd2f7274f460eee37bdbf2fd495ec", + "sha256:2c44a9afd4c4c850885436a4209376857989aaf0853c7b118bb2e628d4b78c4e", + "sha256:3b8154babf30a5e0fa3aa91f188356763749d9b30f7f211fafb247d4256d7877", + "sha256:3c60039e84552442defbcb5d56711ef0e057028ca7bfc559374917408a88d84e", + "sha256:3ea1256a9e782149381e8200119f3e2edea7cd6b123f1c79ab4bbefe4d9ba2c9", + "sha256:47c5b1d44934375a3311891cabd450c150a31cf5c22e84aa172967bf186718be", + "sha256:4c1979d5cc3e14b35f0825caddea5a243dd6085e2a7539c006bc46997ef7a61a", + "sha256:4c92863263e4bd89e4f9cf1ab70d918170c51bd96305fe7b00853d80660acb26", + "sha256:66757d4e1eab69a3cfd3114480cc1d72b6dd847c4d30e676ae838c6740fdd146", + "sha256:6e7e314acb170e143c6f3912f93f2ec80a96aa2009ee681356b7ce20d57e5c62", + "sha256:80cc46378505f7ff202879dcffe4bfbf776c15675028f6e08d1d10bdfbb168ac", + "sha256:8857576600c32aa488f18d30833aa833b54a48e3bab3adb6de97e463af71f8f8", + "sha256:8ef77cd17b73b5ba46788d040c0e820e49a2d80cfcd66fda3ba8be31094fd146", + "sha256:a3026ee105b5360855e500b4abf1a1d0b034d88e75a2d0d66a4c35e60858e15b", + "sha256:a82385c6d5a77e3387e94612e3e34b77e13c39ff1295c26e3ba664e7b98073e2", + "sha256:d24aa3f7f791a023888976b600f2f389d3713e4f23b7a4c88217d3fce61cdffc", + "sha256:dda60d7878a5af2d8560c55c7c47a8908344aa78d32ec1c02d742ede09c534df", + "sha256:e28455b42a0465a7bf2cde5eab530389226ce7dc779de28d17b8377245982b1e", + "sha256:e87edd753da0ca1d44e308a1b1034859ffeab1f4a4492276bff9e1c3230db4fe" + ], + "markers": "python_version >= '3.6'", + "version": "==1.7.4" + }, "pydash": { "hashes": [ "sha256:a7733886ab811e36510b44ff1de7ccc980327d701fb444a4b2ce395e6f4a4a87", @@ -277,6 +421,14 @@ "index": "pypi", "version": "==1.2.1" }, + "pyparsing": { + "hashes": [ + "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", + "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.4.7" + }, "python-json-logger": { "hashes": [ "sha256:b7a31162f2a01965a5efb94453ce69230ed208468b0bbc7fdfc56e6d8df2e281" @@ -373,6 +525,14 @@ "index": "pypi", "version": "==0.0" }, + "smart-open": { + "hashes": [ + "sha256:2059b07f530c8c9e2158e4e1575309aacb74bd813da2325c1f348015d04f3bd6", + "sha256:e4dc1350b240ef0759e343e4e2f361bfd4e5477bb2619866e97f80240652e92e" + ], + "markers": "python_version >= '3.6'", + "version": "==5.1.0" + }, "spacy": { "hashes": [ "sha256:01202066f75c7f2cfeb9c167c3184b5b0a9d465604b0ca553bd9e788353c5905", @@ -389,6 +549,14 @@ "index": "pypi", "version": "==2.2.4" }, + "spacy-legacy": { + "hashes": [ + "sha256:3029826f8cdd0da11331917a389d53d586f274837f35ed24b9263297a4574f50", + "sha256:76d102a840cae96dbcc2637e5baca0c0c001e6c43b5879112c6b4431eb0efbdb" + ], + "markers": "python_version >= '3.6'", + "version": "==3.0.6" + }, "srsly": { "hashes": [ "sha256:18bad26c34cf5a8853fbf018fd168a7bf2ea7ce661e66476c25dac711cb79c9b", @@ -423,6 +591,14 @@ ], "version": "==7.4.0" }, + "threadpoolctl": { + "hashes": [ + "sha256:38b74ca20ff3bb42caca8b00055111d74159ee95c4370882bbff2b93d24da725", + "sha256:ddc57c96a38beb63db45d6c159b5ab07b6bced12c45a1f07b2b92f272aebfa6b" + ], + "markers": "python_version >= '3.5'", + "version": "==2.1.0" + }, "tqdm": { "hashes": [ "sha256:00339634a22c10a7a22476ee946bbde2dbe48d042ded784e4d88e0236eca5d81", @@ -430,6 +606,31 @@ ], "version": "==4.45.0" }, + "typer": { + "hashes": [ + "sha256:5455d750122cff96745b0dec87368f56d023725a7ebc9d2e54dd23dc86816303", + "sha256:ba58b920ce851b12a2d790143009fa00ac1d05b3ff3257061ff69dbdfc3d161b" + ], + "markers": "python_version >= '3.6'", + "version": "==0.3.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", + "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", + "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" + ], + "markers": "python_version < '3.8'", + "version": "==3.10.0.0" + }, + "typing-utils": { + "hashes": [ + "sha256:6bd26f3d38a5dd526ca3a59f0a451ccb59bcee9dc829c872dd6c0aae4ec8bbef", + "sha256:8ff6b6705414b82575ad5ae0925ac414a9650fb8c5718289b1327dec61252f65" + ], + "markers": "python_full_version >= '3.6.1'", + "version": "==0.1.0" + }, "urllib3": { "hashes": [ "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", diff --git a/pipelines/pine/pipelines/EveClient.py b/pipelines/pine/pipelines/EveClient.py index 1300cb7..ef21412 100644 --- a/pipelines/pine/pipelines/EveClient.py +++ b/pipelines/pine/pipelines/EveClient.py @@ -79,8 +79,14 @@ class EveClient(object): break return doc_map - def get_documents(self, collection_id: str) -> dict: - # get documents + def get_documents(self, collection_id: str) -> typing.Dict[str, str]: + """Returns a document map where the document overlap is 0. + + :param collection_id: str: the ID of the collection + + :returns: a mapping from document ID to document text for non-overlap documents + :rtype: dict + """ params = { "where": json.dumps({ "overlap": 0, @@ -99,7 +105,17 @@ class EveClient(object): } return self._get_documents_map(params) - def get_docs_with_annotations(self, collection_id, doc_map): + def get_docs_with_annotations(self, collection_id: str, doc_map: typing.Dict[str, str]) -> typing.Tuple[typing.List[str], typing.List[str], typing.List[str], typing.List[str]]: + """Gets document and annotation data. Only non-overlapping documents are returned. + + :param collection_id: str: the ID of the collection + :param doc_map: dict[str, str]: map of document IDs to document text + + :returns: (documents, labels, doc_ids, ann_ids) where documents is a list of the texts, + labels is a list of the annotations, doc_ids is a list of the document IDs, and + ann_ids is a list of the annotation IDs + :rtype: tuple + """ doc_ids = list() documents = [] ann_ids = list() diff --git a/pipelines/pine/pipelines/NERWrapper.py b/pipelines/pine/pipelines/NERWrapper.py index 711f0f8..39c7d5b 100644 --- a/pipelines/pine/pipelines/NERWrapper.py +++ b/pipelines/pine/pipelines/NERWrapper.py @@ -11,6 +11,8 @@ import uuid from .pmap_ner import NER from . import RankingFunctions as rank +# IMPORTANT: This class probably no longer works, but it doesn't seem to be used anywhere. + class NERWrapper: eve_headers = {'Content-Type': 'application/json'} diff --git a/pipelines/pine/pipelines/NER_API.py b/pipelines/pine/pipelines/NER_API.py index 695c1be..9596579 100644 --- a/pipelines/pine/pipelines/NER_API.py +++ b/pipelines/pine/pipelines/NER_API.py @@ -2,9 +2,12 @@ import logging import os +import typing import uuid + import numpy as np import pydash + from skmultilearn.model_selection import IterativeStratification from sklearn.preprocessing import MultiLabelBinarizer from itertools import chain @@ -25,13 +28,28 @@ class ner_api(object): logger.info("Saving models to {}".format(self.model_dir)) self.eve_client = EveClient() - def perform_fold(self, model, train_data, test_data, pipeline_parameters): - model.fit(train_data[0], train_data[1], pipeline_parameters) + def status(self, classifier_id: str, pipeline_name: str) -> dict: + classifier = NER(pipeline_name) + status = { + "pipeline_name": pipeline_name, + "classifier_id": classifier_id, + "model_dir": self.model_dir, + "eve_entry_point": self.eve_client.entry_point, + "classifier_class": classifier.pipeline_class, + "classifier": classifier.status() + } + if classifier_id: + classifier_obj, pipeline_obj, metrics_obj = self.get_classifier_pipeline_metrics_objs(classifier_id) + status["has_trained"] = "filename" in classifier_obj + return status + + def perform_fold(self, model: NER, train_data, test_data, **pipeline_parameters): + model.fit(train_data[0], train_data[1], **pipeline_parameters) results = model.evaluate(test_data[0], test_data[1], range(0, len(test_data[0]))) return results - def perform_five_fold(self, model, documents, annotations, doc_ids, pipeline_parameters): + def perform_five_fold(self, model: NER, documents, annotations, doc_ids, **pipeline_parameters): metrics = list() # store list of documents ids per fold folds = list() @@ -67,7 +85,7 @@ class ner_api(object): test_documents = documents_np_array[test_index] fold_metrics = self.perform_fold(model, [train_documents.tolist(), train_annotations.tolist()], - [test_documents.tolist(), test_annotations.tolist()], pipeline_parameters) + [test_documents.tolist(), test_annotations.tolist()], **pipeline_parameters) # saving docs used to train fold fold_doc_ids = doc_ids_np_array[train_index] @@ -112,18 +130,30 @@ class ner_api(object): return metrics, folds, average_metrics - def get_document_ranking(self, model, doc_map, doc_ids): + def get_document_ranking(self, model: NER, doc_map: typing.Dict[str, str], doc_ids: typing.List[str]) -> typing.List[str]: + """Calculates document rankings and returns document IDs sorted by ranking. + + The ranking should be which documents should be evaluated first. This probably + corresponds in some ways to the documents which the model is least confident about. + + :param model: NER model + :param doc_map: dict: mapping of document IDs to document text where overlap is 0 + :param doc_ids: list: IDs of documents where ??? + + :returns: sorted document IDs + :rtype: list + """ # re rank documents documents_no_anns = [] ids_no_anns = list(set(doc_map.keys()).difference(set(doc_ids))) - for id in ids_no_anns: - documents_no_anns.append(doc_map[id]) + for doc_id in ids_no_anns: + documents_no_anns.append(doc_map[doc_id]) # classifier.load_model(os.path.join(self.model_dir, filename)) # ranks = classifier.next_example(documents_no_anns, ids_no_anns) - results = model.predict_proba(documents_no_anns, ids_no_anns) - ranks = rank.least_confidence_squared(results) - return ranks + results = model.predict_proba(documents_no_anns) + ranks = rank.least_confidence_squared(ids_no_anns, results) + return [r[0] for r in ranks] def get_classifier_pipeline_metrics_objs(self, classifier_id): classifier_obj = self.eve_client.get_obj('classifiers', classifier_id) @@ -143,28 +173,32 @@ class ner_api(object): return classifier_obj, pipeline_obj, metrics_obj def train_model(self, custom_filename, classifier_id, pipeline_name): + logger.info("train_model called with custom_filename='{}' classifier_id='{}' pipeline_name='{}'".format( + custom_filename, classifier_id, pipeline_name)) # get classifier object classifier_obj, pipeline_obj, metrics_obj = self.get_classifier_pipeline_metrics_objs(classifier_id) collection_id = pydash.get(classifier_obj, 'collection_id', None) pipeline_parameters = pydash.get(classifier_obj, 'parameters', None) + logger.info("train_model collection_id='{}' pipeline_parameters='{}'".format( + collection_id, pipeline_parameters)) #get pipeline name # pipeline_name = pipeline_obj["name"] - # get documents + # get documents where overlap is 0 doc_map = self.eve_client.get_documents(collection_id) - # get documents with its annotations + # get documents with its annotations where overlap is 0 documents, labels, doc_ids, ann_ids = self.eve_client.get_docs_with_annotations(collection_id, doc_map) # instantiate model classifier = NER(pipeline_name) # get folds information - metrics, folds, averages = self.perform_five_fold(classifier, documents, labels, doc_ids, pipeline_parameters) + metrics, folds, averages = self.perform_five_fold(classifier, documents, labels, doc_ids, **pipeline_parameters) logger.info("Starting to train classifier for {} pipeline".format(pipeline_name)) - classifier.fit(documents, labels, pipeline_parameters) + classifier.fit(documents, labels, **pipeline_parameters) logger.info("Trained classifier for {} pipeline".format(pipeline_name)) @@ -203,8 +237,7 @@ class ner_api(object): logger.info("Updating next instances entry for current classifier") return self.eve_client.update('next_instances', id, etag, {'document_ids': ranks}) - def predict(self, classifier_id, pipeline_name, documents, document_ids): - + def predict(self, classifier_id: str, pipeline_name: str, document_ids: typing.List[str], texts: typing.List[str]): classifier_obj, pipeline_obj, metrics_obj = self.get_classifier_pipeline_metrics_objs(classifier_id) if classifier_obj is None: @@ -212,17 +245,36 @@ class ner_api(object): if 'filename' not in classifier_obj: raise Exception('No filename in classifier obj') + if document_ids == None: + document_ids = [] + if texts == None: + texts = [] + # pipeline_name=pipeline_obj["name"] + + # load documents + doc_map = self.eve_client.get_documents_by_id(document_ids) + documents = [] + for document_id in document_ids: + if document_id not in doc_map: + raise Exception("Unable to find document with ID {}".format(document_id)) + documents.append(doc_map[document_id]) filename = os.path.join(self.model_dir, pipeline_name, classifier_obj['filename']) if not os.path.exists(filename): - raise FileNotFoundError("No model with {} filename has been created".format(filename)) + raise FileNotFoundError("No model with {} filename has been created".format(filename)) classifier = NER(pipeline_name) classifier.load_model(filename) logger.info("Loaded classifier {}".format(classifier)) - if len(documents) == len(document_ids): - return classifier.predict(documents, document_ids) - else: - return None + predicted_documents = classifier.predict(documents) + predicted_documents_by_id = {} + for i, doc_id in enumerate(document_ids): + predicted_documents_by_id[doc_id] = predicted_documents[i].serialize() + predicted_texts = [p.serialize() for p in classifier.predict(texts)] + return { + "documents_by_id": predicted_documents_by_id, + "texts": predicted_texts + } + return classifier.predict(documents, document_ids) diff --git a/pipelines/pine/pipelines/RankingFunctions.py b/pipelines/pine/pipelines/RankingFunctions.py index cb12c43..769e6c7 100644 --- a/pipelines/pine/pipelines/RankingFunctions.py +++ b/pipelines/pine/pipelines/RankingFunctions.py @@ -1,207 +1,198 @@ # (C) 2019 The Johns Hopkins University Applied Physics Laboratory LLC. -import math, random +import logging +import math +import random +import typing -def rank(results, metric): - ''' - if metric == 'lc': return least_confidence(results) - if metric == 'ma': return largest_margin(results) - if metric == 'en': return entropy_rank(results) - if metric == 'lcs': return least_confidence_squared(results) - if metric == 'lce': return least_confidence_squared_by_entity(results) - if metric == 'ra': return random_rank(results) - if metric == 'mlp': return most_of_least_popular(results) - return -1 +from .pipeline import DocumentPredictionProbabilities - #Dictionary method is inefficient as it runs every method before returning one - ''' - return { - 'lc':least_confidence(results), - 'ma':largest_margin(results), - 'en':entropy_rank(results), - 'lcs':least_confidence_squared(results), - 'lce':least_confidence_squared_by_entity(results), - 'ra':random_rank(results), - 'mlp':most_of_least_popular(results) - }[metric] - +logger = logging.getLogger(__name__) -def least_confidence(results): - print('least confidence') - #returns average confidence in each document, ranked from lowest to highest - ranking = [] - for key in results: - confidence = 0 - numel = 0 - for ent in results[key]: - if type(ent[2]) is list: - ent[2].sort(key=lambda tup: tup[1], reverse=True) #sort from most to least confident - confidence += ent[2][0][1] - else: - confidence += ent[3] - numel += 1 - if numel > 0: - confidence /= numel - #print(confidence) - ranking.append((key, confidence)) - ranking.sort(key=lambda tup: tup[1]) - return ranking +def rank(document_ids: typing.List[str], results: typing.List[DocumentPredictionProbabilities], metric: str) -> typing.List[typing.Tuple[str, float]]: + ''' + if metric == 'lc': return least_confidence(results) + if metric == 'ma': return largest_margin(results) + if metric == 'en': return entropy_rank(results) + if metric == 'lcs': return least_confidence_squared(results) + if metric == 'lce': return least_confidence_squared_by_entity(results) + if metric == 'ra': return random_rank(results) + if metric == 'mlp': return most_of_least_popular(results) + return -1 -def least_confidence_squared(results): - print('least confidence squared') - #returns average squared confidence in each document, ranked from lowest to highest (hopefully prioritizes consistently low confidence over spotty) - ranking = [] - for key in results: - confidence = 0 - numel = 0 - for ent in results[key]: - if type(ent[2]) is list: - ent[2].sort(key=lambda tup: tup[1], reverse=True) #sort from most to least confident prediction - confidence += math.pow(ent[2][0][1], 2) - else: - confidence += math.pow(ent[3], 2) - numel += 1 - if numel > 0: - confidence /= numel - #print(confidence) - ranking.append((key, confidence)) - ranking.sort(key=lambda tup: tup[1]) - rank_res = [ranks[0] for ranks in ranking] - return rank_res + #Dictionary method is inefficient as it runs every method before returning one + ''' + return { + 'lc':least_confidence(results), + 'ma':largest_margin(results), + 'en':entropy_rank(results), + 'lcs':least_confidence_squared(results), + 'lce':least_confidence_squared_by_entity(results), + 'ra':random_rank(results), + 'mlp':most_of_least_popular(results) + }[metric] + -def least_confidence_squared_by_entity(results): - print('least confidence square by entity') - #returns average squared entity-confidence in each document (average confidence squared per entity), same idea as lcs but for individual entities - ranking = [] - for key in results: - confidences = {} - numels = {} - for ent in results[key]: - if type(ent[2]) is list: - ent[2].sort(key=lambda tup: tup[1], reverse=True) #sort from most to least confident prediction - pred_label = ent[2][0][0] - pred_prob = ent[2][0][1] - else: - pred_label = ent[2] - pred_prob = ent[3] - if pred_label not in confidences: - confidences[pred_label] = 0 - numels[pred_label] = 0 - confidences[pred_label] += pred_prob - numels[pred_label] += 1 - confidence = 0 - for label in confidences: - confidence += math.pow((confidences[label]/numels[label]), 2) - if len(confidences) > 0: - confidence /= len(confidences) - #print(confidence) - ranking.append((key, confidence)) - ranking.sort(key=lambda tup: tup[1]) - return ranking +def least_confidence(document_ids: typing.List[str], results: typing.List[DocumentPredictionProbabilities]) -> typing.List[typing.Tuple[str, float]]: + logger.info('least confidence') + #returns average confidence in each document, ranked from lowest to highest + ranking = [] + for (doc_id, result) in zip(document_ids, results): + confidence = 0 + numel = 0 + for ner in result.ner: + (_, pred) = ner.get_highest_prediction() #sort from most to least confident + confidence += pred + numel += 1 + if numel > 0: + confidence /= numel + #print(confidence) + ranking.append((doc_id, confidence)) + ranking.sort(key=lambda tup: tup[1]) + return ranking + +def least_confidence_squared(document_ids: typing.List[str], results: typing.List[DocumentPredictionProbabilities]) -> typing.List[typing.Tuple[str, float]]: + logger.info('least confidence squared') + #returns average squared confidence in each document, ranked from lowest to highest (hopefully prioritizes consistently low confidence over spotty) + ranking = [] + for (doc_id, result) in zip(document_ids, results): + confidence = 0 + numel = 0 + for ner in result.ner: + (_, pred) = ner.get_highest_prediction() #sort from most to least confident prediction + confidence += math.pow(pred, 2) + numel += 1 + if numel > 0: + confidence /= numel + #print(confidence) + ranking.append((doc_id, confidence)) + ranking.sort(key=lambda tup: tup[1]) + return ranking + +def least_confidence_squared_by_entity(document_ids: typing.List[str], results: typing.List[DocumentPredictionProbabilities]) -> typing.List[typing.Tuple[str, float]]: + logger.info('least confidence square by entity') + #returns average squared entity-confidence in each document (average confidence squared per entity), same idea as lcs but for individual entities + ranking = [] + for (doc_id, result) in zip(document_ids, results): + confidences = {} + numels = {} + for ner in result.ner: + (pred_label, pred_prob) = ner.get_highest_prediction() #sort from most to least confident prediction + if pred_label not in confidences: + confidences[pred_label] = 0 + numels[pred_label] = 0 + confidences[pred_label] += pred_prob + numels[pred_label] += 1 + confidence = 0 + for label in confidences: + confidence += math.pow((confidences[label]/numels[label]), 2) + if len(confidences) > 0: + confidence /= len(confidences) + #print(confidence) + ranking.append((doc_id, confidence)) + ranking.sort(key=lambda tup: tup[1]) + return ranking #WARNING: REQUIRES PROBABLITIES FOR ALL POSSIBLE LABELS PER TOKEN INSTEAD OF JUST MOST LIKELY -def largest_margin(results): - print('largest margin') - #returns average margin in each document, ranked from lowest to highest - ranking = [] - for key in results: - margin = 0 - numel = 0 - for ent in results[key]: - #if only most confident prediction is provided, cannot calculate margin - if type(ent[2]) is list: - ent[2].sort(key=lambda tup: tup[1], reverse=True) #sort from most to least confident prediction - margin += (ent[2][0][1] - ent[2][1][1]) - numel += 1 - - if numel > 0: - margin /= numel - #print(margin) - ranking.append((key, margin)) - ranking.sort(key=lambda tup: tup[1]) - return ranking +def largest_margin(document_ids: typing.List[str], results: typing.List[DocumentPredictionProbabilities]) -> typing.List[typing.Tuple[str, float]]: + logger.info('largest margin') + #returns average margin in each document, ranked from lowest to highest + ranking = [] + for (doc_id, result) in zip(document_ids, results): + margin = 0 + numel = 0 + for ner in result.ner: + #if only most confident prediction is provided, cannot calculate margin + if len(ner.predictions) > 1: + sorted_predictions = ner.get_predictions_from_highest_to_lowest() #sort from most to least confident prediction + margin += (sorted_predictions[0][1] - sorted_predictions[1][1]) + numel += 1 + + if numel > 0: + margin /= numel + #print(margin) + ranking.append((doc_id, margin)) + ranking.sort(key=lambda tup: tup[1]) + return ranking #WARNING: REQUIRES PROBABLITIES FOR ALL POSSIBLE LABELS PER TOKEN INSTEAD OF JUST MOST LIKELY -def entropy_rank(results, N=None): - print('entropy rank') - ranking = [] - for key in results: - entropy = 0 - numel = 0 - #TODO: check to ensure N is not larger than number of possible labels - for ent in results[key]: - #print(ent[2]) - #if only most confident prediction is provided, cannot calculate entropy - if type(ent[2]) is list: - ent[2].sort(key=lambda tup: tup[1], reverse=True) #sort from most to least confident prediction - for i in range(0, N if N is not None else len(ent[2])): - #print(str(i)) - prob = ent[2][i][1] - entropy += (prob*math.log(prob)) - entropy *= -1 - numel += 1 - if numel > 0: - entropy = entropy/numel - #print(margin) - ranking.append((key, entropy)) - ranking.sort(key=lambda tup: tup[1], reverse=True) - return ranking +def entropy_rank(document_ids: typing.List[str], results: typing.List[DocumentPredictionProbabilities], N=None) -> typing.List[typing.Tuple[str, float]]: + logger.info('entropy rank') + ranking = [] + for (doc_id, result) in zip(document_ids, results): + entropy = 0 + numel = 0 + #TODO: check to ensure N is not larger than number of possible labels + for ner in result.ner: + #print(ent[2]) + #if only most confident prediction is provided, cannot calculate entropy + if len(ner.predictions) > 1: + sorted_predictions = ner.get_predictions_from_highest_to_lowest() #sort from most to least confident prediction + for i in range(0, min(N, len(sorted_predictions)) if N is not None else len(sorted_predictions)): + #print(str(i)) + prob = sorted_predictions[i][1] + entropy += (prob*math.log(prob)) + entropy *= -1 + numel += 1 + if numel > 0: + entropy = entropy/numel + #print(margin) + ranking.append((doc_id, entropy)) + ranking.sort(key=lambda tup: tup[1], reverse=True) + return ranking -def random_rank(results): - print('random rank') - ranks = list(range(0, len(results))) - random.shuffle(ranks) - ranking = [] - for i,key in enumerate(results): - ranking.append((key, ranks[i])) +def random_rank(document_ids: typing.List[str], results: typing.List[DocumentPredictionProbabilities]) -> typing.List[typing.Tuple[str, float]]: + logger.info('random rank') + ranks = list(range(0, len(results))) + random.shuffle(ranks) + ranking = [] + for (i, doc_id) in enumerate(document_ids): + ner = results[ranks[i]].ner + ranking.append((doc_id, ner.get_highest_prediction()[1])) - ranking.sort(key=lambda tup: tup[1]) - return ranking + return ranking -def most_of_least_popular(results): - print('most of least popular') - doc_stats = [] - ranking = [] - popularity = {} - for key in results: - stats = {} - for ent in results[key]: - if type(ent[2]) is list: - ent[2].sort(key=lambda tup: tup[1], reverse=True) #sort from most to least confident prediction - predicted_label = ent[2][0][0] - else: - predicted_label = ent[2] - if predicted_label not in stats: - stats[predicted_label] = 0 - stats[predicted_label] += 1 +def most_of_least_popular(document_ids: typing.List[str], results: typing.List[DocumentPredictionProbabilities]) -> typing.List[typing.Tuple[str, float]]: + logger.info('most of least popular') + doc_stats = [] + ranking = [] + popularity = {} + for (doc_id, result) in zip(document_ids, results): + stats = {} + for ner in result.ner: + (predicted_label, _) = ner.get_highest_prediction() + if predicted_label not in stats: + stats[predicted_label] = 0 + stats[predicted_label] += 1 - doc_stats.append((key, stats)) - for label in stats: - if label not in popularity: - popularity[label] = 0 - popularity[label] += stats[label] - if 'O' in popularity: - del popularity['O'] - #ignores labels with 0 predicted instances... - #for every label, starting with least popular - for l in sorted(popularity, key=popularity.__getitem__): - label_rank = [] - for doc in doc_stats: - if l not in doc[1]: - doc[1][l] = 0 - label_rank.append((doc[0], doc[1][l])) - #sort all documents by predicted instances of that label - label_rank.sort(key=lambda tup: tup[1], reverse=True) + doc_stats.append((doc_id, stats)) + for label in stats: + if label not in popularity: + popularity[label] = 0 + popularity[label] += stats[label] + if 'O' in popularity: + del popularity['O'] + #ignores labels with 0 predicted instances... + #for every label, starting with least popular + for l in sorted(popularity, key=popularity.__getitem__): + label_rank = [] + for doc in doc_stats: + if l not in doc[1]: + doc[1][l] = 0 + label_rank.append((doc[0], doc[1][l])) + #sort all documents by predicted instances of that label + label_rank.sort(key=lambda tup: tup[1], reverse=True) - #go through the ranking for individual label in order from most to least instances - for lp in range(0, len(label_rank)): - doc_label_stats = label_rank[lp] #(doc_id, label_instances) - #append any documents with nonzero predicted instances in their respective order - if doc_label_stats[1] > 0: - ranking.append((doc_label_stats[0], [l, doc_label_stats[1]])) - #remove ranked document from pool - doc_stats = [d for d in doc_stats if d[0] != doc_label_stats[0]] - else: - break + #go through the ranking for individual label in order from most to least instances + for lp in range(0, len(label_rank)): + doc_label_stats = label_rank[lp] #(doc_id, label_instances) + #append any documents with nonzero predicted instances in their respective order + if doc_label_stats[1] > 0: + # TODO check what this is actually doing if we ever use this method + ranking.append((doc_label_stats[0], [l, doc_label_stats[1]])) + #remove ranked document from pool + doc_stats = [d for d in doc_stats if d[0] != doc_label_stats[0]] + else: + break - return ranking \ No newline at end of file + return ranking diff --git a/pipelines/pine/pipelines/app/listener/service_listener.py b/pipelines/pine/pipelines/app/listener/service_listener.py index 2b5704e..c11fb5e 100644 --- a/pipelines/pine/pipelines/app/listener/service_listener.py +++ b/pipelines/pine/pipelines/app/listener/service_listener.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- + # ********************************************************************** # Copyright (C) 2018 Johns Hopkins University Applied Physics Laboratory # @@ -9,17 +10,21 @@ # clause 52.227-14 or DFARS clauses 252.227-7013/7014. # For any other permission, please contact the Legal Office at JHU/APL. # ********************************************************************** + import atexit import json import logging import threading +import traceback +import typing +import uuid from datetime import timedelta import pebble import pydash import redis import time -from pebble import concurrent +from pebble import concurrent, ProcessPool from ...shared.config import ConfigBuilder from ...NER_API import ner_api @@ -73,6 +78,10 @@ class ServiceListener(object): # Scheduled Keys processing_queue_key = config.REDIS_PREFIX + config.PIPELINE + "work-queue" processing_queue_key_timeout = timedelta(seconds=config.SERVICE_HANDLER_TIMEOUT * 2) # Timeout for queueing processing a job... + results_queue_key = config.REDIS_PREFIX + config.PIPELINE + ":work-results" + results_queue_key_timeout = timedelta(seconds=config.SERVICE_HANDLER_TIMEOUT * 2) + running_jobs_key = config.REDIS_PREFIX + config.PIPELINE + ":running-jobs" + classifiers_training_key = config.REDIS_PREFIX + config.PIPELINE + ":classifiers-training" # Mutexes Keys processing_lock_key = config.REDIS_PREFIX + "locks:processing" @@ -103,15 +112,6 @@ class ServiceListener(object): # make sure things are stopped properly atexit.register(self.stop_workers) - @classmethod - def publish_response(cls, channel, data): - """ - :type channel: str - :type data: dict - :rtype: bool - """ - pass - def start_workers(self): is_registration_thread_alive = isinstance(self.registration_thread, threading.Thread) and self.registration_thread.is_alive() is_channel_thread_alive = isinstance(self.channel_thread, threading.Thread) and self.channel_thread.is_alive() @@ -230,47 +230,106 @@ class ServiceListener(object): return job_data @staticmethod - @concurrent.process(timeout=processing_limit.seconds) - def process_message(job_details): + def do_with_redis(callback: typing.Callable[[redis.StrictRedis], typing.Any]): local_redis = redis.StrictRedis(host=config.REDIS_HOST, port=config.REDIS_PORT, charset="utf-8", decode_responses=True) time_to_spend_trying_to_acquire_lock = max(1, ServiceListener.processing_lock_key_timeout.total_seconds() // 2) + max_retries = 10 + retry = 0 + last_exception = None + while retry < max_retries: + try: + with local_redis.lock(ServiceListener.processing_lock_key, + timeout=ServiceListener.processing_lock_key_timeout.total_seconds(), + blocking_timeout=time_to_spend_trying_to_acquire_lock): + return callback(local_redis) + except redis.exceptions.LockError as e: + logger.exception("Unable to acquire lock in time") + retry += 1 + last_exception = e + # if we're here, we maxed out the retries + logger.error("Maxed out %s retries trying to connect to redis", max_retries) + raise last_exception + + @staticmethod + def push_results(job_id: str, response): + def callback(local_redis: redis.StrictRedis) -> None: + response_key = ServiceListener.results_queue_key + ":" + job_id + logger.info("Writing status to %s", response_key) + local_redis.rpush(response_key, json.dumps(response, separators=(",", ":"))) + local_redis.expire(response_key, ServiceListener.results_queue_key_timeout) + ServiceListener.do_with_redis(callback) + + @staticmethod + def wait_until_classifier_isnt_training(classifier_id: str, job_id: str): + def callback(local_redis: redis.StrictRedis) -> bool: + return local_redis.hexists(ServiceListener.classifiers_training_key, classifier_id) + while ServiceListener.do_with_redis(callback): + logger.info("classifier %s is already running a training job, sleeping 10 seconds", classifier_id) + time.sleep(10) + def callback_set(local_redis: redis.StrictRedis) -> None: + local_redis.hset(ServiceListener.classifiers_training_key, classifier_id, job_id) + ServiceListener.do_with_redis(callback_set) + + @staticmethod + def classifier_is_done_training(classifier_id: str): + def callback(local_redis: redis.StrictRedis): + return local_redis.hdel(ServiceListener.classifiers_training_key, classifier_id) + return ServiceListener.do_with_redis(callback) + + @staticmethod + def process_message(job_id: str, job_details): + logger.info("process_message starting for job %s", job_id) + + job_type = pydash.get(job_details, "type", None) + job_framework = pydash.get(job_details, "framework", None) + classifier_id = pydash.get(job_details, "classifier_id", None) + model_name = pydash.get(job_details, "model_name", None) + try: - with local_redis.lock(ServiceListener.processing_lock_key, - timeout=ServiceListener.processing_lock_key_timeout.total_seconds(), - blocking_timeout=time_to_spend_trying_to_acquire_lock): - job_type = pydash.get(job_details, "type", None) - job_framework = pydash.get(job_details, "framework", None) - classifier_id = pydash.get(job_details, "classifier_id", None) - - if job_type == "fit": - model_name = pydash.get(job_details, "model_name", None) + if job_type == "fit": + if not classifier_id: + raise ValueError("Need classifier_id to train") + ServiceListener.wait_until_classifier_isnt_training(classifier_id, job_id) + try: + logger.info("fit %s running", job_id) pipeline = ner_api() - try: - pipeline.train_model(model_name, classifier_id, job_framework) - except Exception as e: - logger.error("ERROR: Could not train classifier, error: {}".format(e)) - # TODO: return status to the front end, either by adding a redis listener or setting job status - # as failed in the database - logger.info('fit completed') - - elif job_type == "predict": - pipeline = ner_api() - documents = pydash.get(job_details, "documents", []) - doc_ids = pydash.get(job_details, "doc_ids", []) - try: - results = pipeline.predict(classifier_id, job_framework, documents, doc_ids) - except Exception as e: - logger.error("ERROR: Could not predict document annotations, error: {}".format(e)) - # TODO: return status, stating that were unable to execute a predict from the given parameters - - # TODO: return results through redis - - else: - logger.error("Service type, {}, unavailable".format(job_type)) - return - except redis.exceptions.LockError as e: - logger.info("Unable to acquire lock in time, re-scheduling job...") - local_redis.rpush(ServiceListener.processing_queue_key, json.dumps(job_details, separators=(",", ":"))) + pipeline.train_model(model_name, classifier_id, job_framework) + logger.info("fit %s finished", job_id) + finally: + ServiceListener.classifier_is_done_training(classifier_id) + + elif job_type == "predict": + logger.info("predict %s running", job_id) + document_ids = pydash.get(job_details, "document_ids", []) + texts = pydash.get(job_details, "texts", []) + pipeline = ner_api() + try: + results = pipeline.predict(classifier_id, job_framework, document_ids, texts) + ServiceListener.push_results(job_id, results) + except Exception as e: + results = { + "error": str(e) + } + ServiceListener.push_results(job_id, results) + raise e + finally: + logger.info("predict %s finished", job_id) + + elif job_type == "status": + logger.info("status %s running", job_id) + pipeline = ner_api() + status = pipeline.status(classifier_id, job_framework) + logger.info("Received status from job_framework=%s classifier_id=%s: %s", + job_framework, classifier_id, status) + ServiceListener.push_results(job_id, status) + logger.info("status %s finished", job_id) + + else: + logger.error("Service type, %s, unavailable", job_type) + + except Exception as e: + logger.exception("Exception processing %s job", job_type) + raise e def _start_registration_task(self): while not self.registration_exit_event.is_set(): @@ -307,16 +366,31 @@ class ServiceListener(object): self.listener_exit_event.wait(self.listener_poll.seconds) def _start_queue_processor_task(self): - while not self.queue_processor_exit_event.is_set(): - msg_in_queue = self.r_conn.lpop(self.processing_queue_key) - if not msg_in_queue: + with ProcessPool(max_workers=config.REDIS_MAX_PROCESSES) as pool: + self.r_conn.delete(self.running_jobs_key) # clear out running jobs since this is a new startup + while not self.queue_processor_exit_event.is_set(): + msg_in_queue = self.r_conn.lpop(self.processing_queue_key) + if not msg_in_queue: + self.queue_processor_exit_event.wait(self.processor_poll.seconds) + continue + try: + job_details = json.loads(msg_in_queue) + except (json.JSONDecodeError, TypeError): + logger.warning("Invalid Job Details Message") + continue + if "job_id" not in job_details: + job_details["job_id"] = str(uuid.uuid4()) + job_id = pydash.get(job_details, "job_id") + try: + logger.info("Received job id/details: %s/%s", job_id, job_details) + self.r_conn.sadd(self.running_jobs_key, job_id) + future = pool.schedule(ServiceListener.process_message, args=(job_id, job_details)) + logger.debug("Got future for %s: %s", job_id, future) + def finished(f): + logger.info("Job %s has finished; removing from running jobs list", job_id) + self.r_conn.srem(self.running_jobs_key, job_id) + future.add_done_callback(finished) + except Exception: + logger.exception("Exception processing message") + self.queue_processor_exit_event.wait(self.processor_poll.seconds) - continue - try: - job_details = json.loads(msg_in_queue) - except (json.JSONDecodeError, TypeError): - logger.warning("Invalid Job Details Message") - continue - # will allow one processor at a time (due to internal locking) - self.process_message(job_details) # type: pebble.ProcessFuture - self.queue_processor_exit_event.wait(self.processor_poll.seconds) diff --git a/pipelines/pine/pipelines/corenlp_NER_pipeline.py b/pipelines/pine/pipelines/corenlp_NER_pipeline.py index 23a2755..5a7eeba 100644 --- a/pipelines/pine/pipelines/corenlp_NER_pipeline.py +++ b/pipelines/pine/pipelines/corenlp_NER_pipeline.py @@ -4,11 +4,14 @@ import logging import os -from os.path import isfile, isdir, join +from os.path import abspath, isfile, isdir, join import textwrap +import typing import uuid -from .pipeline import Pipeline +from overrides import overrides + +from .pipeline import Pipeline, NerPrediction, DocumentPredictions, NerPredictionProbabilities, DocumentPredictionProbabilities from .shared.config import ConfigBuilder config = ConfigBuilder.get_config() @@ -36,61 +39,46 @@ class corenlp_NER(Pipeline): __props = None #class variables + __is_setup = False __id = None + __default_fit_params = None - #init() - #set tunable parameters - #TODO: Should probably make this more robust by inserting try/catch - def __init__(self, java_dir=None, ner_path=None, load_model=None, tmp_dir=None): - - self.__id = uuid.uuid4() - - if tmp_dir != None: - self.__temp_dir = tmp_dir - #can choose to dictate where the model will store files so that it doesn't overwrite any, - #otherwise it will write to a new directory within the resources folder - else: - self.__temp_dir = config.ROOT_DIR + '/tmp/' + str(self.__id) - - if not isdir(self.__temp_dir): - os.makedirs(self.__temp_dir) - logger.info("Using temp dir {}".format(self.__temp_dir)) - - self.__train_file = join(self.__temp_dir, 'corenlp_training.tsv') - self.__test_file = join(self.__temp_dir, 'corenlp_test_gold.tsv') - self.__model = join(self.__temp_dir, 'corenlp-ner-model.ser.gz') - - + @classmethod + def setup(cls, java_dir=None, ner_path=None): + if cls.__is_setup: + logger.info("Java is already set up.") + return + + logger.info("Setting up Java.") #TODO: set defaults for the following. #Point to location of JAVA installation if java_dir != None: - self.__jdk_dir = java_dir + cls.__jdk_dir = java_dir else: - self.__jdk_dir = '/usr/lib/jvm/java-1.8.0-openjdk-amd64' # self.__jdk_dir = '/usr/lib/jvm/java-8-oracle' - if isdir(self.__jdk_dir): - os.environ['JAVA_HOME'] = self.__jdk_dir + cls.__jdk_dir = '/usr/lib/jvm/java-1.8.0-openjdk-amd64' # self.__jdk_dir = '/usr/lib/jvm/java-8-oracle' + if isdir(cls.__jdk_dir): + os.environ['JAVA_HOME'] = cls.__jdk_dir else: raise ImportError("ERROR: JAVA installation not found") - - + #Point to Location of Stanford NER Library if ner_path != None: - self.__jar = ner_path + cls.__jar = ner_path else: - self.__jar = './resources/stanford-corenlp-full-2018-02-27/stanford-corenlp-3.9.1.jar' - if isfile(self.__jar): - os.environ['CLASSPATH'] = self.__jar + cls.__jar = './resources/stanford-corenlp-full-2018-02-27/stanford-corenlp-3.9.1.jar' + if isfile(cls.__jar): + os.environ['CLASSPATH'] = cls.__jar else: - self.__jar = 'pine/pipelines/resources/stanford-corenlp-full-2018-02-27/stanford-corenlp-3.9.1.jar' - if isfile(self.__jar): - os.environ['CLASSPATH'] = self.__jar + cls.__jar = 'pine/pipelines/resources/stanford-corenlp-full-2018-02-27/stanford-corenlp-3.9.1.jar' + if isfile(cls.__jar): + os.environ['CLASSPATH'] = cls.__jar else: raise ImportError("ERROR: Stanford NER Library not found") - + #if you get to this point, java and stanford ner library should be located import jnius_config if not jnius_config.vm_running: - print('Configured JVM') + logger.info('Configured JVM') jnius_config.add_options('-Xmx32g') #allocate enough memory to the JVM heap to run the classifier else: raise RuntimeWarning('WARNING: JVM already running. Cannot run core nlp') @@ -99,32 +87,22 @@ class corenlp_NER(Pipeline): from jnius import autoclass #General - self.__java_String = autoclass("java.lang.String") + cls.__java_String = autoclass("java.lang.String") #TOKENIZING - self.__java_StringReader = autoclass("java.io.StringReader") - self.__java_Tokenizer = autoclass("edu.stanford.nlp.process.PTBTokenizer") + cls.__java_StringReader = autoclass("java.io.StringReader") + cls.__java_Tokenizer = autoclass("edu.stanford.nlp.process.PTBTokenizer") #TRAINING AND TESTING CRFCLASSIFIER - self.__java_CRFClassifier = autoclass("edu.stanford.nlp.ie.crf.CRFClassifier") - self.__java_Properties = autoclass("java.util.Properties") - self.__java_AA = autoclass("edu.stanford.nlp.ling.CoreAnnotations$AnswerAnnotation") + cls.__java_CRFClassifier = autoclass("edu.stanford.nlp.ie.crf.CRFClassifier") + cls.__java_Properties = autoclass("java.util.Properties") + cls.__java_AA = autoclass("edu.stanford.nlp.ling.CoreAnnotations$AnswerAnnotation") #GETTING CONFIDENCES - self.__java_CRFCliqueTree = autoclass("edu.stanford.nlp.ie.crf.CRFCliqueTree") - - if load_model != None: - self.__crf = self.__java_CRFClassifier.getClassifier(self.__java_String(load_model)) - self.__model = load_model - - self.__SCNLP = autoclass("edu.stanford.nlp.pipeline.StanfordCoreNLP") - - - #fit(X, y) - #internal state is changed - def fit(self, X, y, params=None): - - default_params = { + cls.__java_CRFCliqueTree = autoclass("edu.stanford.nlp.ie.crf.CRFCliqueTree") + + cls.__SCNLP = autoclass("edu.stanford.nlp.pipeline.StanfordCoreNLP") + cls.__default_fit_params = { 'import_prop_file': None, 'export_prop_file': None, 'max_left': 1, @@ -143,6 +121,48 @@ class corenlp_NER(Pipeline): 'use_type_y_sequences': True, 'word_shape': "chris2useLC" } + + cls.__is_setup = True + + #init() + #set tunable parameters + #TODO: Should probably make this more robust by inserting try/catch + def __init__(self, java_dir=None, ner_path=None, load_model=None, tmp_dir=None): + corenlp_NER.setup(java_dir=java_dir, ner_path=ner_path) + + self.__id = uuid.uuid4() + + if tmp_dir != None: + self.__temp_dir = tmp_dir + #can choose to dictate where the model will store files so that it doesn't overwrite any, + #otherwise it will write to a new directory within the resources folder + else: + self.__temp_dir = config.ROOT_DIR + '/tmp/' + str(self.__id) + + if not isdir(self.__temp_dir): + os.makedirs(self.__temp_dir) + logger.info("Using temp dir {}".format(self.__temp_dir)) + + self.__train_file = join(self.__temp_dir, 'corenlp_training.tsv') + self.__test_file = join(self.__temp_dir, 'corenlp_test_gold.tsv') + self.__model = join(self.__temp_dir, 'corenlp-ner-model.ser.gz') + + if load_model != None: + self.__crf = self.__java_CRFClassifier.getClassifier(self.__java_String(load_model)) + self.__model = load_model + + @overrides + def status(self) -> dict: + return { + "temp_dir": abspath(self.__temp_dir), + "jdk_dir": abspath(self.__jdk_dir), + "jar": abspath(self.__jar), + "default_fit_params": self.__default_fit_params + } + + @overrides + def fit(self, X, y, **params): + default_params = self.__default_fit_params.copy() #format input data into tsv file for ner to train on try: train_data = self.format_data(X, y) @@ -223,13 +243,11 @@ wordShape=""" + default_params["word_shape"] + """ os.remove(self.__train_file) - - #predict(X, Xid) - #returns {text_id: [[offset_start, offset_end, label], ... []], ...} - def predict(self, X, Xid): - out = {} - for doc, doc_id in zip(X, Xid): - doc_ents = [] + @overrides + def predict(self, X: typing.Iterable[str]) -> typing.List[DocumentPredictions]: + out = [] + for doc in X: + ner_preds = [] test_text = self.__java_String(doc) results = self.__crf.classify(test_text) @@ -241,18 +259,16 @@ wordShape=""" + default_params["word_shape"] + """ label = word.get(self.__java_AA) #print(str(start_char) + '-' + str(end_char) + ': ' + word.word() + '/' + label) if label != 'O': - doc_ents.append((start_char, end_char, label)) - out[doc_id] = doc_ents + ner_preds.append(NerPrediction(start_char, end_char, label)) + out.append(DocumentPredictions(ner_preds, [])) return out - #predict_proba(X, Xid) - #returns {text_id: [(offset_start, offset_end, label, score), ... []], ...} - #can also return scores for all labels if get_all is True - def predict_proba(self, X, Xid, get_all_labels=False, include_other=False): - out = {} + @overrides + def predict_proba(self, X: typing.Iterable[str], get_all_labels=False, include_other=False, **kwargs) -> typing.List[DocumentPredictionProbabilities]: + out = [] # Score is confidence of classifier for this prediction - for doc, doc_id in zip(X, Xid): - doc_ents = [] + for doc in X: + ner_probs = [] test_text = self.__java_String(doc) results = self.__crf.classify(test_text) @@ -269,7 +285,7 @@ wordShape=""" + default_params["word_shape"] + """ index = self.__crf.classIndex.indexOf(self.__java_String(label)) prob = cliqueTree.prob(w, index) #print(str(start_char) + '-' + str(end_char) + ': ' + word.word() + '/' + label) - doc_ents.append((start_char, end_char, label, prob)) + ner_probs.append(NerPredictionProbabilities(start_char, end_char, [(label, prob)])) else: itr = self.__crf.classIndex.iterator() all_probs = [] @@ -278,15 +294,14 @@ wordShape=""" + default_params["word_shape"] + """ index = self.__crf.classIndex.indexOf(self.__java_String(label)) prob = cliqueTree.prob(w, index) all_probs.append((label, prob)) - doc_ents.append((start_char, end_char, all_probs)) + ner_probs.append(NerPredictionProbabilities(start_char, end_char, all_probs)) - out[doc_id] = doc_ents + out.append(DocumentPredictions(ner_probs, [])) return out - #TODO: next_example(X, Xid) - #Given model's current state evaluate the input (id, String) pairs and return a rank ordering of lowest->highest scores for instances (will need to discuss specifics of ranking) - #Discussing rank is now a major project - see notes + @overrides + #TODO def next_example(self, X, Xid): return @@ -334,23 +349,23 @@ wordShape=""" + default_params["word_shape"] + """ out.append(ent_extract) return out - #saves model so that it can be loaded again later + @overrides #models must be saved with extension ".ser.gz" def save_model(self, model_name): if not model_name.endswith(".ser.gz"): - print('WARNING: model_name must end in .ser.gz, adding...') + logger.warn('WARNING: model_name must end in .ser.gz, adding...') model_name = model_name + ".ser.gz" self.__crf.serializeClassifier(self.__java_String(model_name)) - print('Saved model to ' + model_name) + logger.info('Saved model to ' + model_name) return model_name - #loads a previously saved model + @overrides #properties can be exported/imported during train def load_model(self, model_name): #TODO: what to do if model doesn't exist? if not model_name.endswith(".ser.gz"): - print('WARNING: model_name must end in .ser.gz, adding...') + logger.warn('WARNING: model_name must end in .ser.gz, adding...') model_name = model_name + ".ser.gz" self.__crf = self.__java_CRFClassifier.getClassifier(self.__java_String(model_name)) self.__model = model_name @@ -411,10 +426,10 @@ wordShape=""" + default_params["word_shape"] + """ #Find corresponding token in gold and predicted word = answer[0] gold = answer[1] - if verbose: print('GOLD: ' + word + ',' + gold) + if verbose: logger.trace('GOLD: ' + word + ',' + gold) if word == '': - if verbose: print('SKIP') + if verbose: logger.trace('SKIP') continue if next_guess != None: @@ -452,7 +467,7 @@ wordShape=""" + default_params["word_shape"] + """ next_guess = None a = 1 votes = {guess[1]: 1} #reset votes when concatenation is discarded - if verbose: print(guess) + if verbose: logger.trace(guess) #check what the next gold token is, if it matches with the current guess then just move on #(likely the current answer token doesn't exactly match the guess token, see `` vs '') @@ -466,7 +481,7 @@ wordShape=""" + default_params["word_shape"] + """ if word != guess[0]: continue #if the code gets to here we are pretty confident the tokens match - if verbose: print('GUESS: ' + str(guess)) + if verbose: logger.trace('GUESS: ' + str(guess)) pred = guess[1] diff --git a/pipelines/pine/pipelines/opennlp_NER_pipeline.py b/pipelines/pine/pipelines/opennlp_NER_pipeline.py index 51842a2..24b45ce 100644 --- a/pipelines/pine/pipelines/opennlp_NER_pipeline.py +++ b/pipelines/pine/pipelines/opennlp_NER_pipeline.py @@ -4,13 +4,16 @@ import logging import os -from os.path import isfile, isdir, exists, join -import pydash +from os.path import abspath, isfile, isdir, exists, join import uuid import sys import traceback +import typing -from .pipeline import Pipeline +import pydash +from overrides import overrides + +from .pipeline import Pipeline, NerPrediction, DocumentPredictions, NerPredictionProbabilities, DocumentPredictionProbabilities from .shared.config import ConfigBuilder config = ConfigBuilder.get_config() @@ -20,7 +23,7 @@ logger = logging.getLogger(__name__) class opennlp_NER(Pipeline): #Path variables - __jar = '' + __ner_path = '' __jdk_dir = '' __temp_dir = None __train_file = '' @@ -32,13 +35,94 @@ class opennlp_NER(Pipeline): #Class variables __id = None + __is_setup = False + + @classmethod + def setup(cls, java_dir=None, ner_path=None): + if cls.__is_setup: + logger.info("Java is already set up.") + return + + logger.info("Setting up Java.") + #TODO: set defaults for the following + #TODO: Point to location of JAVA installation + if java_dir != None: + cls.__jdk_dir = java_dir + else: + cls.__jdk_dir = '/usr/lib/jvm/java-1.8.0-openjdk-amd64' + if isdir(cls.__jdk_dir): + os.environ['JAVA_HOME'] = cls.__jdk_dir + else: + raise ImportError("ERROR: JAVA installation not found") + #Point to Location of OpenNLP Library Directory + if ner_path != None: + cls.__ner_path = ner_path + else: + #self.__jar = 'resources/apache-opennlp-1.9.0/lib/' + cls.__ner_path= 'resources/apache-opennlp-1.9.0' + if exists(cls.__ner_path): + os.environ['CLASSPATH'] = os.path.join(cls.__ner_path, 'lib', '*') + else: + cls.__ner_path = 'pine/pipelines/resources/apache-opennlp-1.9.0' + if exists(cls.__ner_path): + os.environ['CLASSPATH'] = os.path.join(cls.__ner_path, 'lib', '*') + else: + raise ImportError("ERROR: OpenNLP Library not found") + + #if you get to this point, java and opennlp library should be located + import jnius_config + if not jnius_config.vm_running: + logger.info('Configured JVM') + jnius_config.add_options('-Xmx8g') #allocate enough memory to the JVM heap to run the classifier + else: + raise RuntimeWarning('WARNING: JVM already running. Cannot run open nlp') + + #import pyjnius to import required classes from JAVA/opennlp + from jnius import autoclass + + #General + cls.__java_String = autoclass("java.lang.String") + cls.__java_File = autoclass("java.io.File") + + #TOKENIZING + cls.__java_SentenceModel = autoclass("opennlp.tools.sentdetect.SentenceModel") + cls.__java_SentenceDetectorME = autoclass("opennlp.tools.sentdetect.SentenceDetectorME") + cls.__java_TokenizerModel = autoclass("opennlp.tools.tokenize.TokenizerModel") + cls.__java_TokenizerME = autoclass("opennlp.tools.tokenize.TokenizerME") + + #self.__sentenceDetector = self.__java_SentenceDetectorME(self.__java_SentenceModel(self.__java_File(self.__java_String("pipelines/resources/apache-opennlp-1.9.0/en-sent.bin")))) + #self.__tokenizer = self.__java_TokenizerME(self.__java_TokenizerModel(self.__java_File(self.__java_String("pipelines/resources/apache-opennlp-1.9.0/en-token.bin")))) + cls.__sentenceDetector = cls.__java_SentenceDetectorME(cls.__java_SentenceModel(cls.__java_File(cls.__java_String(os.path.join(cls.__ner_path, 'en-sent.bin'))))) + cls.__tokenizer = cls.__java_TokenizerME(cls.__java_TokenizerModel(cls.__java_File(cls.__java_String(os.path.join(cls.__ner_path, 'en-token.bin'))))) + + #TRAINING + cls.__java_PlainTextByLineStream = autoclass("opennlp.tools.util.PlainTextByLineStream") + cls.__java_NameSampleDataStream = autoclass("opennlp.tools.namefind.NameSampleDataStream") + cls.__java_NameFinderME = autoclass("opennlp.tools.namefind.NameFinderME") + cls.__java_TrainingParameters = autoclass("opennlp.tools.util.TrainingParameters") + cls.__java_TokenNameFinderFactory = autoclass("opennlp.tools.namefind.TokenNameFinderFactory") + cls.__java_MarkableFileInputStreamFactory = autoclass("opennlp.tools.util.MarkableFileInputStreamFactory") + + #SAVING/LOADING MODEL + cls.__java_TokenNameFinderModel = autoclass("opennlp.tools.namefind.TokenNameFinderModel") + + #EVALUATION + cls.__java_TokenNameFinderEvaluator = autoclass("opennlp.tools.namefind.TokenNameFinderEvaluator") + + #MISC + cls.__java_WindowFeatureGenerator = autoclass("opennlp.tools.util.featuregen.WindowFeatureGenerator") + cls.__java_AdditionalContextFeatureGenerator = autoclass("opennlp.tools.util.featuregen.AdditionalContextFeatureGenerator") + cls.__java_Array = autoclass("java.lang.reflect.Array") + + cls.__is_setup = True #init() #set tunable parameters #TODO: Should probably make this more robust by inserting try/catch def __init__(self, java_dir=None, ner_path=None, tmp_dir=None): - + opennlp_NER.setup(java_dir=java_dir, ner_path=ner_path) + self.__id = uuid.uuid4() if tmp_dir != None: @@ -55,81 +139,16 @@ class opennlp_NER(Pipeline): self.__train_file = join(self.__temp_dir, 'opennlp_ner.train') self.__test_file = join(self.__temp_dir, 'opennlp_ner.test') - #TODO: set defaults for the following - #TODO: Point to location of JAVA installation - if java_dir != None: - self.__jdk_dir = java_dir - else: - self.__jdk_dir = '/usr/lib/jvm/java-1.8.0-openjdk-amd64' - if isdir(self.__jdk_dir): - os.environ['JAVA_HOME'] = self.__jdk_dir - else: - raise ImportError("ERROR: JAVA installation not found") + @overrides + def status(self) -> dict: + return { + "temp_dir": abspath(self.__temp_dir), + "jdk_dir": abspath(self.__jdk_dir), + "ner_path": abspath(self.__ner_path) + } - #Point to Location of OpenNLP Library Directory - if ner_path != None: - self.__ner_path = ner_path - else: - #self.__jar = 'resources/apache-opennlp-1.9.0/lib/' - self.__ner_path= 'resources/apache-opennlp-1.9.0' - if exists(self.__ner_path): - os.environ['CLASSPATH'] = os.path.join(self.__ner_path, 'lib', '*') - else: - self.__ner_path = 'pine/pipelines/resources/apache-opennlp-1.9.0' - if exists(self.__ner_path): - os.environ['CLASSPATH'] = os.path.join(self.__ner_path, 'lib', '*') - else: - raise ImportError("ERROR: OpenNLP Library not found") - - - #if you get to this point, java and opennlp library should be located - import jnius_config - if not jnius_config.vm_running: - logger.info('Configured JVM') - jnius_config.add_options('-Xmx8g') #allocate enough memory to the JVM heap to run the classifier - else: - raise RuntimeWarning('WARNING: JVM already running. Cannot run open nlp') - - #import pyjnius to import required classes from JAVA/opennlp - from jnius import autoclass - - #General - self.__java_String = autoclass("java.lang.String") - self.__java_File = autoclass("java.io.File") - - #TOKENIZING - self.__java_SentenceModel = autoclass("opennlp.tools.sentdetect.SentenceModel") - self.__java_SentenceDetectorME = autoclass("opennlp.tools.sentdetect.SentenceDetectorME") - self.__java_TokenizerModel = autoclass("opennlp.tools.tokenize.TokenizerModel") - self.__java_TokenizerME = autoclass("opennlp.tools.tokenize.TokenizerME") - - #self.__sentenceDetector = self.__java_SentenceDetectorME(self.__java_SentenceModel(self.__java_File(self.__java_String("pipelines/resources/apache-opennlp-1.9.0/en-sent.bin")))) - #self.__tokenizer = self.__java_TokenizerME(self.__java_TokenizerModel(self.__java_File(self.__java_String("pipelines/resources/apache-opennlp-1.9.0/en-token.bin")))) - self.__sentenceDetector = self.__java_SentenceDetectorME(self.__java_SentenceModel(self.__java_File(self.__java_String(os.path.join(self.__ner_path, 'en-sent.bin'))))) - self.__tokenizer = self.__java_TokenizerME(self.__java_TokenizerModel(self.__java_File(self.__java_String(os.path.join(self.__ner_path, 'en-token.bin'))))) - - #TRAINING - self.__java_PlainTextByLineStream = autoclass("opennlp.tools.util.PlainTextByLineStream") - self.__java_NameSampleDataStream = autoclass("opennlp.tools.namefind.NameSampleDataStream") - self.__java_NameFinderME = autoclass("opennlp.tools.namefind.NameFinderME") - self.__java_TrainingParameters = autoclass("opennlp.tools.util.TrainingParameters") - self.__java_TokenNameFinderFactory = autoclass("opennlp.tools.namefind.TokenNameFinderFactory") - self.__java_MarkableFileInputStreamFactory = autoclass("opennlp.tools.util.MarkableFileInputStreamFactory") - - #SAVING/LOADING MODEL - self.__java_TokenNameFinderModel = autoclass("opennlp.tools.namefind.TokenNameFinderModel") - - #EVALUATION - self.__java_TokenNameFinderEvaluator = autoclass("opennlp.tools.namefind.TokenNameFinderEvaluator") - - #MISC - self.__java_WindowFeatureGenerator = autoclass("opennlp.tools.util.featuregen.WindowFeatureGenerator") - self.__java_AdditionalContextFeatureGenerator = autoclass("opennlp.tools.util.featuregen.AdditionalContextFeatureGenerator") - self.__java_Array = autoclass("java.lang.reflect.Array") - - #fit(X, y) - #internal state is changed - def fit(self, X, y, params): + @overrides + def fit(self, X, y, **params): try: data = self.format_data(X, y) if len(data)==0 or data is None: @@ -168,13 +187,13 @@ class opennlp_NER(Pipeline): self.__nameFinder = self.__java_NameFinderME(self.__model) os.remove(self.__train_file) - #predict(X, Xid) - #returns {text_id: [[offset_start, offset_end, label], ... []], ...} - def predict(self, X, Xid): - out = {} + @overrides + def predict(self, X: typing.Iterable[str]) -> typing.List[DocumentPredictions]: + out = [] #self.find_all_init() - for doc, doc_id in zip(X, Xid): - doc_ents = [] + for doc in X: + ner_preds = [] + doc_tokens = [] sentences = self.__sentenceDetector.sentPosDetect(self.__java_String(str(doc).encode('utf-8'))) for s in sentences: s_start = s.getStart() @@ -182,36 +201,30 @@ class opennlp_NER(Pipeline): sent = self.__java_String(str(doc[s_start:s_end]).encode('utf-8')) tokens = self.__tokenizer.tokenizePos(sent) tok_string = [] - doc_tokens = [] for t in tokens: - t_start = t.getStart() + s_start t_end = t.getEnd() + s_start - doc_tokens.append((t_start, t_end)) + doc_tokens.append([t_start, t_end]) tok_string.append(self.__java_String(str(doc[t_start:t_end]).encode('utf-8'))) ents = self.__nameFinder.find(tok_string) # ents = self.find_all(tok_string) for e in ents: start_token = tokens[e.getStart()] end_token = tokens[e.getEnd() - 1] - doc_ents.append((start_token.getStart() + s_start, end_token.getEnd() + s_start, e.getType())) + ner_preds.append(NerPrediction(start_token.getStart() + s_start, end_token.getEnd() + s_start, e.getType())) # sequenceFinder = self.__model.getNameFinderSequenceModel() # print(str(len(ents)) + ',' + str(len(tok_string)) + str(sequenceFinder.getOutcomes())) - #print(doc_id) - #print(doc_ents) - out[doc_id] = (doc_ents, doc_tokens) + out.append(DocumentPredictions(ner_preds, [], extra_data=doc_tokens)) self.__nameFinder.clearAdaptiveData() return out - # predict_proba(X, Xid) - # returns {text_id: [(offset_start, offset_end, label, score), ... (), ...} + @overrides # TODO: figure out how to retrieve confidences for all labels instead of just most confident - # Right now get_all_labels and include_other do nothing - def predict_proba(self, X, Xid, get_all_labels=False, include_other=False): - out = {} - for doc, doc_id in zip(X, Xid): - doc_ents = [] + def predict_proba(self, X: typing.Iterable[str], **kwargs) -> typing.List[DocumentPredictionProbabilities]: + out = [] + for doc in X: + ner_probs = [] sentences = self.__sentenceDetector.sentPosDetect(self.__java_String(str(doc).encode('utf-8'))) for s in sentences: s_start = s.getStart() @@ -227,20 +240,19 @@ class opennlp_NER(Pipeline): for e in ents: start_token = tokens[e.getStart()] end_token = tokens[e.getEnd() - 1] - doc_ents.append((start_token.getStart() + s_start, end_token.getEnd() + s_start, e.getType(), e.getProb())) - out[doc_id] = doc_ents + ner_probs.append(NerPredictionProbabilities(start_token.getStart() + s_start, end_token.getEnd() + s_start, [(e.getType(), e.getProb())])) + out.append(DocumentPredictionProbabilities(ner_probs, [])) self.__nameFinder.clearAdaptiveData() return out - # TODO: next_example(X, Xid) - # Given model's current state evaluate the input (id, String) pairs and return a rank ordering of lowest->highest scores for instances (will need to discuss specifics of ranking) - # Discussing rank is now a major project - see notes + @overrides + # TODO def next_example(self, X, Xid): return # EXTRA METHODS TO HELP WITH THE opennlp PIPELINE ## - # Save a model to be used again later + @overrides # models must be saved and loaded with extension ".bin" def save_model(self, model_name): if not model_name.endswith(".bin"): @@ -251,8 +263,7 @@ class opennlp_NER(Pipeline): return model_name - - #loads a model from file + @overrides def load_model(self, model_name): if not model_name.endswith(".bin"): logger.warning('WARNING: model_name must end with .bin, adding...') @@ -328,12 +339,7 @@ class opennlp_NER(Pipeline): in_ann = True out += doc[start:end] + ' ' - except: - exec_type, value, tb = sys.exc_info() - print(traceback.format_tb(tb)) - print(value) - try: if cur_ann[1] <= end and not doc_done: if in_ann: out += ' ' @@ -343,9 +349,7 @@ class opennlp_NER(Pipeline): else: doc_done = True except: - exec_type, value, tb = sys.exc_info() - print(traceback.format_tb(tb)) - print(value) + logger.exception("Error getting annotations") if not in_ann: out += '\n' #fixes times where sentence detector would cut off in the middle of a label out += '\n' @@ -353,38 +357,39 @@ class opennlp_NER(Pipeline): logger.warning(e) return out - def convert_ann_collection_to_per_token(self, annotations, tokens): + def convert_ann_collection_to_per_token(self, annotations: typing.List[typing.Union[NerPrediction, typing.Tuple[int, int, str]]], tokens): labels_per_token = [] for tok in tokens: labels = [] for ann in annotations: - if ann[0] <= tok[0] and ann[1] >= tok[1]: - labels.append(ann[2]) + if isinstance(ann, NerPrediction): + if ann.offset_start <= tok[0] and ann.offset_end >= tok[1]: + labels.append(ann.label) + else: + if ann[0] <= tok[0] and ann[1] >= tok[1]: + labels.append(ann[2]) labels_per_token.append(labels) return labels_per_token def evaluate(self, X, y, Xid): - predictions = self.predict(X, Xid) + predictions = self.predict(X) stats = {'Totals': [0, 0, 0, 0]} - - for doc_id in predictions: - guess = predictions[doc_id][0] + for (doc_id, prediction) in zip(Xid, predictions): + guesses: typing.List[NerPrediction] = prediction.ner gold = y[Xid.index(doc_id)] - all_tokens = predictions[doc_id][1] + all_tokens = prediction.extra_data - - reformat_gold = [tuple(pydash.flatten(go)) for go in gold] - gold = reformat_gold + gold = [tuple(pydash.flatten(go)) for go in gold] labels_in_gold = self.convert_ann_collection_to_per_token(gold, all_tokens) - labels_in_guess = self.convert_ann_collection_to_per_token(guess, all_tokens) + labels_in_guess = self.convert_ann_collection_to_per_token(guesses, all_tokens) all_known_labels = set() - for ann in guess: - all_known_labels.add(ann[2]) + for ann in guesses: + all_known_labels.add(ann.label) for ann in gold: all_known_labels.add(ann[2]) @@ -465,6 +470,6 @@ class opennlp_NER(Pipeline): evaluator.evaluate(sampleStream) result = evaluator.getFMeasure() - print(result.toString()) + logger.info(result.toString()) return (result.getPrecisionScore(), result.getRecallScore(), result.getFMeasure()) diff --git a/pipelines/pine/pipelines/pipeline.py b/pipelines/pine/pipelines/pipeline.py index 912c065..902499a 100644 --- a/pipelines/pine/pipelines/pipeline.py +++ b/pipelines/pine/pipelines/pipeline.py @@ -1,6 +1,54 @@ # (C) 2019 The Johns Hopkins University Applied Physics Laboratory LLC. import abc +import typing + +class NerPrediction(object): + def __init__(self, offset_start: int, offset_end: int, label: str): + self.offset_start: int = offset_start + self.offset_end: int = offset_end + self.label: str = label + + def serialize(self) -> typing.Tuple[int, int, str]: + return (self.offset_start, self.offset_end, self.label) + +class DocumentPredictions(object): + def __init__(self, ner: typing.List[NerPrediction], doc: typing.List[str], extra_data: typing.Any = None): + self.ner = ner + self.doc = doc + self.extra_data = extra_data + + def serialize(self) -> dict: + return { + "ner": [n.serialize() for n in self.ner], + "doc": self.doc + } + +class NerPredictionProbabilities(object): + def __init__(self, offset_start: int, offset_end: int, predictions: typing.List[typing.Tuple[str, float]]): + self.offset_start = offset_start + self.offset_end = offset_end + self.predictions = predictions + + def get_highest_prediction(self) -> typing.Tuple[str, float]: + return max(self.predictions, key=lambda t: t[1]) + + def get_predictions_from_highest_to_lowest(self) -> typing.List[typing.Tuple[str, float]]: + return sorted(self.predictions, key=lambda t: t[1], reverse=True) + + def serialize(self) -> typing.Tuple[int, int, typing.List[typing.Tuple[str, float]]]: + return (self.offset_start, self.offset_end, self.predictions) + +class DocumentPredictionProbabilities(object): + def __init__(self, ner: typing.List[NerPredictionProbabilities], doc: typing.List[typing.Tuple[str, float]]): + self.ner = ner + self.doc = doc + + def serialize(self) -> dict: + return { + "ner": [n.serialize() for n in self.ner], + "doc": self.doc + } class Pipeline(object, metaclass=abc.ABCMeta): @@ -8,26 +56,43 @@ class Pipeline(object, metaclass=abc.ABCMeta): def __init__(self): raise NotImplementedError('Must define __init__ to use Pipeline Base Class') + # status() @abc.abstractmethod - def fit(self, X, y): + def status(self) -> dict: + raise NotImplementedError('Must define status to use Pipeline Base Class') + + # fit(X, y) + # internal state is changed + @abc.abstractmethod + def fit(self, X, y, **params): raise NotImplementedError('Must define fit to use Pipeline Base Class') + # predict(X) + # returns [[[offset_start, offset_end, label], ..., ...] @abc.abstractmethod - def predict(self, X, Xid): + def predict(self, X: typing.Iterable[str]) -> typing.List[DocumentPredictions]: raise NotImplementedError('Must define predict to use Pipeline Base Class') + # predict_proba(X) + # returns [[[offset_start, offset_end, label, score], ...], ...] + # can also return scores for all labels if get_all is True @abc.abstractmethod - def predict_proba(self, X, Xid): + def predict_proba(self, X: typing.Iterable[str], **kwargs) -> typing.List[DocumentPredictionProbabilities]: raise NotImplementedError('Must define predict_proba to use Pipeline Base Class') + # next_example(X, Xid) + # Given model's current state evaluate the input (id, String) pairs and return a rank ordering of lowest->highest scores for instances (will need to discuss specifics of ranking) + # Discussing rank is now a major project - see notes @abc.abstractmethod def next_example(self, X, Xid): raise NotImplementedError('Must define next_example to use Pipeline Base Class') + # saves model so that it can be loaded again later @abc.abstractmethod def save_model(self, model_name): raise NotImplementedError('Must define save_model to use Pipeline Base Class') + # loads a previously saved model @abc.abstractmethod def load_model(self, model_name): raise NotImplementedError('Must define load_model to use Pipeline Base Class') diff --git a/pipelines/pine/pipelines/pmap_ner.py b/pipelines/pine/pipelines/pmap_ner.py index fa9941f..99a9937 100644 --- a/pipelines/pine/pipelines/pmap_ner.py +++ b/pipelines/pine/pipelines/pmap_ner.py @@ -3,8 +3,11 @@ import importlib import logging import os +import typing -from .pipeline import Pipeline +from .pipeline import Pipeline, DocumentPredictions, DocumentPredictionProbabilities + +from overrides import overrides logger = logging.getLogger(__name__) @@ -42,24 +45,28 @@ class NER(Pipeline): self.pipeline = self.pipe_init('spacy', **kwargs) self.__lib = 'spacy' - - #fit(X, y) - #returns nothing + @property + def pipeline_class(self): + return self.pipeline.__class__.__module__ + "." + self.pipeline.__class__.__name__ + + @overrides + def status(self) -> dict: + return self.pipeline.status() + #internal state is changed #kwargs varies between pipelines, see individual pipeline for extra arguments - def fit(self, X, y, kwargs): - return self.pipeline.fit(X, y, kwargs) + @overrides + def fit(self, X, y, **kwargs): + return self.pipeline.fit(X, y, **kwargs) - #predict(X) - #returns {doc_id:[(offset_start, offset_end, label), ... ()]} - def predict(self, X, Xid): - return self.pipeline.predict(X, Xid) + @overrides + def predict(self, X: typing.Iterable[str]) -> typing.List[DocumentPredictions]: + return self.pipeline.predict(X) - #predict_proba(X) - #returns {doc_id:[(offset_start, offset_end, label, confidence), ... ()]} #kwargs varies between pipelines, see individual pipeline for extra arguments - def predict_proba(self, X, Xid, **kwargs): - return self.pipeline.predict_proba(X, Xid, **kwargs) + @overrides + def predict_proba(self, X: typing.Iterable[str], **kwargs) -> typing.List[DocumentPredictionProbabilities]: + return self.pipeline.predict_proba(X, **kwargs) # evaluate(X, y, Xid) # returns stats @@ -68,22 +75,20 @@ class NER(Pipeline): #next_example(Xid) #Given model's current state evaluate the input (id, String) pairs and return a rank ordering of lowest->highest scores for instances (will need to discuss specifics of ranking) + @overrides def next_example(self, X, Xid): #may want to program it here instead of one level down, as the ranking function might not change with the pipeline used return self.pipeline.next_example(X, Xid) - #saves model so that it can be loaded again later - #models must be saved with extension ".ser.gz" - # save_model(path) - def save_model(self, model_path): - directory = os.path.dirname(model_path) + @overrides + def save_model(self, model_name): + directory = os.path.dirname(model_name) # if directories in path dont exists create them if not os.path.exists(directory): os.makedirs(directory) - return self.pipeline.save_model(model_path) + return self.pipeline.save_model(model_name) - #loads a previously saved model - #properties can be exported/imported during train + @overrides def load_model(self, model_name): self.pipeline.load_model(model_name) diff --git a/pipelines/pine/pipelines/shared/config.py b/pipelines/pine/pipelines/shared/config.py index 24a0683..2e2cbab 100644 --- a/pipelines/pine/pipelines/shared/config.py +++ b/pipelines/pine/pipelines/shared/config.py @@ -56,6 +56,7 @@ class BaseConfig(object): REDIS_DBNUM = 0 # Redis DB Number (0-5) REDIS_PREFIX = "AL:" # Note: Must be used manually REDIS_EXPIRE = 3600 + REDIS_MAX_PROCESSES = 10 # Scheduler SCHEDULER_REGISTRATION_TIMEOUT = int(timedelta(minutes=10).total_seconds()) # how long something will be registered as a service @@ -74,7 +75,7 @@ class BaseConfig(object): channel="service_corenlp", service=dict( framework="corenlp", - types=["fit", "predict"] + types=["fit", "predict", "status"] ) ), dict( @@ -83,7 +84,7 @@ class BaseConfig(object): channel="service_opennlp", service=dict( framework="opennlp", - types=["fit", "predict"] + types=["fit", "predict", "status"] ) ), dict( @@ -92,7 +93,7 @@ class BaseConfig(object): channel="service_spacy", service=dict( framework="spacy", - types=["fit", "predict"] + types=["fit", "predict", "status"] ) ) ] diff --git a/pipelines/pine/pipelines/spacy_NER_pipeline.py b/pipelines/pine/pipelines/spacy_NER_pipeline.py index 6b11472..e64012e 100644 --- a/pipelines/pine/pipelines/spacy_NER_pipeline.py +++ b/pipelines/pine/pipelines/spacy_NER_pipeline.py @@ -9,60 +9,82 @@ For more details, see the documentation: Compatible with: spaCy v2.0.0+ """ +from collections import defaultdict +import logging import random +import typing + import spacy from spacy.scorer import Scorer from spacy.gold import GoldParse -from collections import defaultdict +from overrides import overrides -from .pipeline import Pipeline +from .pipeline import Pipeline, NerPrediction, DocumentPredictions, NerPredictionProbabilities, DocumentPredictionProbabilities +logger = logging.getLogger(__name__) class spacy_NER(Pipeline): + __model = None __nlp = [] __ner = [] __optimizer = [] + __default_fit_params = None # init() # set tunable parameters def __init__(self, model_path=None): + self._load_model(model_path) + self.__optimizer = self.__nlp.begin_training() + self.__default_fit_params = { + "iterations": 100, + "dropout": 0.5 + } + + def _load_model(self, model_path=None): # Allows user to load their own model if desired if model_path != None: + self.__model = model_path self.__nlp = spacy.load(model_path) - print('Loaded model from ' + model_path) + logger.info('Loaded model from ' + model_path) # checks to see if ner pipeline exists if 'ner' not in self.__nlp.pipe_names: self.__ner = self.__nlp.create_pipe('ner') - print('Created spaCy NER pipe and added to model') + logger.info('Created spaCy NER pipe and added to model') else: self.__ner = self.__nlp.get_pipe('ner') else: + self.__model = "en" # if user does not specify a model to load, creates a blank one instead self.__nlp = spacy.blank('en') - print('Created blank EN spaCy model') + logger.info('Created blank EN spaCy model') # create the built-in pipeline components and add them to the pipeline # nlp.create_pipe works for built-ins that are registered with spaCy self.__ner = self.__nlp.create_pipe('ner') self.__nlp.add_pipe(self.__ner, last=True) - print('Created spaCy NER pipe') - self.__optimizer = self.__nlp.begin_training() + logger.info('Created spaCy NER pipe') - # fit(X, y) - # internal state is changed - def fit(self, X, y, params=None): - #setting up params - default_params = { - "n_iter":100, - "dropout":0.5 + @overrides + def status(self) -> dict: + # TODO more status + return { + "model": self.__model, + "default_fit_params": self.__default_fit_params } + + @overrides + def fit(self, X, y, **params): + #setting up params + default_params = self.__default_fit_params.copy() if params is not None: for key in default_params.keys(): if key in params: default_params[key]= params[key] + logger.info("Training with parameters: {}".format(default_params)) train_data = self.format_data(X, y) + logger.info("Training data of length {} has been prepared".format(len(train_data))) # add labels for _, annotations in train_data: @@ -71,21 +93,30 @@ class spacy_NER(Pipeline): # get names of other pipes to disable them during training (only needed if user loads own model as we aren't sure what's in it) other_pipes = [pipe for pipe in self.__nlp.pipe_names if pipe != 'ner'] + all_losses = [] with self.__nlp.disable_pipes(*other_pipes): # only train NER self.__optimizer = self.__nlp.entity.create_optimizer() # begin_training() zeros out existing entity types so we just create another optimizer instead to account for training new entity types # NOTE: be sure to include examples of both existing and new entity types when fitting otherwise spacy will overfit to the new data - for itn in range(default_params["n_iter"]): + for itn in range(default_params["iterations"]): random.shuffle(train_data) losses = {} for text, annotations in train_data: + if not text: + continue + logger.debug("text len={} annotations len={}".format(len(text), len(annotations["entities"]))) self.__nlp.update( [text], # batch of texts [annotations], # batch of annotations drop=default_params["dropout"], # dropout - make it harder to memorise data sgd=self.__optimizer, # callable to update weights losses=losses) - print(losses) + logger.info("[{}/{}] completed: losses={}".format((itn + 1), default_params["iterations"], losses)) + all_losses.append(losses) + return { + "iterations": default_params["iterations"], + "losses": all_losses + } def evaluate(self, X, y, Xid): train_data = self.format_data(X, y) @@ -193,25 +224,25 @@ class spacy_NER(Pipeline): # if label in ent: # text_entities.append(ent) # doc_gold_text = self.__nlp.make_doc(text) - # print(str(doc_gold_text.is_nered)) + # logger.info(str(doc_gold_text.is_nered)) # # gold = GoldParse(doc_gold_text, entities=text_entities) # # pred_value = self.__nlp(text) # for token in pred_value: - # print(token) - # print(token.ent_type) - # print(token.ent_type_) - # print(str(pred_value.is_nered)) - # print(pred_value) + # logger.info(token) + # logger.info(token.ent_type) + # logger.info(token.ent_type_) + # logger.info(str(pred_value.is_nered)) + # logger.info(pred_value) # scorer.score(pred_value, gold) # except Exception as e: # raise e # scores = scorer.scores - # print(scores) + # logger.info(scores) # # metrics[label] = {'precision': scores["ents_p"], 'recall': scores["ents_r"], 'f1': scores["ents_f"], 'TP': scorer.ner.tp, 'FP': scorer.ner.fp, 'FN': scorer.ner.fn} - # print(metrics[label]) + # logger.info(metrics[label]) #Calculate totals # TP = 0 @@ -238,18 +269,19 @@ class spacy_NER(Pipeline): # # return metrics - def predict(self, X, Xid): - out = {} - for text, text_id in zip(X, Xid): + @overrides + def predict(self, X: typing.Iterable[str]) -> typing.List[DocumentPredictions]: + out = [] + for text in X: pred = self.__nlp(text) - print('Entities', [(ent.start_char, ent.end_char, ent.label_, ent.text) for ent in pred.ents]) - out[text_id] = [(ent.start_char, ent.end_char, ent.label_) for ent in pred.ents] + if logger.isEnabledFor(logging.DEBUG): + logger.debug('Entities', [(ent.start_char, ent.end_char, ent.label_, ent.text) for ent in pred.ents]) + out.append(DocumentPredictions([NerPrediction(ent.start_char, ent.end_char, ent.label_) for ent in pred.ents], [])) return out - # predict_proba(X, Xid) - # returns {text_id: [[offset_start, offset_end, label, score], ... []], ...} - def predict_proba(self, X, Xid): - out = {} + @overrides + def predict_proba(self, X: typing.Iterable[str], **kwargs) -> typing.List[DocumentPredictionProbabilities]: + out = [] # Score is confidence of classifier for this prediction, though this implementation is weird/potentially unreliable # since spacy does not directly supply the NER confidence data @@ -259,9 +291,9 @@ class spacy_NER(Pipeline): # This clips solutions at each step. We multiply the score of the top-ranked action by this value, and use the result as a threshold. This prevents the parser from exploring options that look very unlikely, saving a bit of efficiency. Accuracy may also improve, because we've trained on greedy objective. beam_density = 0.0001 - for text, text_id in zip(X, Xid): + for text in X: doc = self.__nlp(text) - # print('TEXT: ' + text) + # logger.info('TEXT: ' + text) """ print ('--- Tokens ---') #DEBUGGING: Print all tokens present in text @@ -270,14 +302,14 @@ class spacy_NER(Pipeline): print ('') """ # DEBUGGING: Print entities detected with NER (denoted by start/end char) - print('--- Entities (detected with standard NER) ---') + logger.info('--- Entities (detected with standard NER) ---') # Store detected entities in dict ner_selected_entity_scores = defaultdict(float) for ent in doc.ents: - print('%d to %d: %s (%s)' % (ent.start_char, ent.end_char, ent.label_, ent.text)) + logger.debug('%d to %d: %s (%s)' % (ent.start_char, ent.end_char, ent.label_, ent.text)) ner_selected_entity_scores[(ent.start_char, ent.end_char, ent.label_)] = 0.0 - print('') + logger.debug('') # Begin beam search for confidences # notice these 2 lines - if they're not here, standard NER # will be used and all scores will be 1.0 @@ -301,30 +333,29 @@ class spacy_NER(Pipeline): ner_selected_entity_scores[(start_char, end_char, label)] += score # DEBUGGING: print scores for entities whose keys match those found from the original NER # WARNING: this is due to the scores requiring beam search, if beam search doesn't find the same ones some scores could be 0 - print('--- Relevant Entities and scores (detected with beam search) ---') - for key in ner_selected_entity_scores: - start, end, label = key - print('%d to %d: %s (%f)' % (start, end, label, ner_selected_entity_scores[key])) - - print('') - """ - #DEBUGGING: print all scores for all possible entities found by beam search - print ('--- All Entities and scores ---') - for key in all_entity_scores: - start, end, label = key - print ('%d to %d: %s (%f)' % (start, end, label, all_entity_scores[key])) - print('') - """ + if logger.isEnabledFor(logging.DEBUG): + logger.debug('--- Relevant Entities and scores (detected with beam search) ---') + for key in ner_selected_entity_scores: + start, end, label = key + logger.debug('%d to %d: %s (%f)' % (start, end, label, ner_selected_entity_scores[key])) + logger.debug('') + """ + #DEBUGGING: print all scores for all possible entities found by beam search + print ('--- All Entities and scores ---') + for key in all_entity_scores: + start, end, label = key + print ('%d to %d: %s (%f)' % (start, end, label, all_entity_scores[key])) + print('') + """ # output directly from NER pipe # out[(text_id, text)] = [(ent.start_char, ent.end_char, ent.label_) for ent in doc.ents] # output from NER score dictionary - out[text_id] = [(key[0], key[1], key[2], ner_selected_entity_scores[key]) for key in - ner_selected_entity_scores] + out.append(DocumentPredictions([NerPrediction(key[0], key[1], [(key[2], ner_selected_entity_scores[key])]) for key in + ner_selected_entity_scores], [])) return out - # TODO: next_example(X, Xid) - # Given model's current state evaluate the input (id, String) pairs and return a rank ordering of lowest->highest scores for instances (will need to discuss specifics of ranking) - # Discussing rank is now a major project - see notes + @overrides + # TODO def next_example(self, X, Xid): return @@ -342,12 +373,12 @@ class spacy_NER(Pipeline): def add_label(self, entity): self.__ner.add_label(entity) - # saves model so that it can be loaded again later - def save_model(self, model_path): - self.__nlp.to_disk(model_path) - print('Saved model to ' + model_path) - return model_path + @overrides + def save_model(self, model_name): + self.__nlp.to_disk(model_name) + logger.info('Saved model to ' + model_name) + return model_name - # load model - def load_model(self, model_path): - self.__init__(model_path=model_path) + @overrides + def load_model(self, model_name): + self._load_model(model_path=model_name) diff --git a/run_docker_compose.sh b/run_docker_compose.sh index cabe7ab..d8b188d 100755 --- a/run_docker_compose.sh +++ b/run_docker_compose.sh @@ -5,7 +5,7 @@ usage() { set +x echo "Usage: $0 [--build|--build-with-cert |--up|--up-test]" echo " --build will build the docker stack" - echo " --build-with-certs will build the docker stack using the given SSL certificate file" + echo " --build-with-cert will build the docker stack using the given SSL certificate file" echo " --up will bring up the docker stack" echo " --up-test will bring up the docker stack with the testing ports exposed" echo " --down will bring down the docker stack" diff --git a/test/Pipfile b/test/Pipfile index 77b4654..13e7b84 100644 --- a/test/Pipfile +++ b/test/Pipfile @@ -13,6 +13,7 @@ overrides = "*" python-json-logger = "*" bcrypt = "*" pytest = "*" +pytest-rerunfailures = "*" [requires] python_version = "3.6" diff --git a/test/Pipfile.lock b/test/Pipfile.lock index add6665..c02da96 100644 --- a/test/Pipfile.lock +++ b/test/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "21cd116656e983fe5d5a34e151511b27f7694306be294bdfb88801b92c416762" + "sha256": "9cd388460b7622c94022a1c7a1a65e7ba39d4f9522365e2608ebfa8ca169cc28" }, "pipfile-spec": 6, "requires": { @@ -18,343 +18,470 @@ "default": { "attrs": { "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", + "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" ], - "version": "==19.3.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==21.2.0" }, "bcrypt": { "hashes": [ - "sha256:0258f143f3de96b7c14f762c770f5fc56ccd72f8a1857a451c1cd9a655d9ac89", - "sha256:0b0069c752ec14172c5f78208f1863d7ad6755a6fae6fe76ec2c80d13be41e42", - "sha256:19a4b72a6ae5bb467fea018b825f0a7d917789bcfe893e53f15c92805d187294", - "sha256:5432dd7b34107ae8ed6c10a71b4397f1c853bd39a4d6ffa7e35f40584cffd161", - "sha256:6305557019906466fc42dbc53b46da004e72fd7a551c044a827e572c82191752", - "sha256:69361315039878c0680be456640f8705d76cb4a3a3fe1e057e0f261b74be4b31", - "sha256:6fe49a60b25b584e2f4ef175b29d3a83ba63b3a4df1b4c0605b826668d1b6be5", - "sha256:74a015102e877d0ccd02cdeaa18b32aa7273746914a6c5d0456dd442cb65b99c", - "sha256:763669a367869786bb4c8fcf731f4175775a5b43f070f50f46f0b59da45375d0", - "sha256:8b10acde4e1919d6015e1df86d4c217d3b5b01bb7744c36113ea43d529e1c3de", - "sha256:9fe92406c857409b70a38729dbdf6578caf9228de0aef5bc44f859ffe971a39e", - "sha256:a190f2a5dbbdbff4b74e3103cef44344bc30e61255beb27310e2aec407766052", - "sha256:a595c12c618119255c90deb4b046e1ca3bcfad64667c43d1166f2b04bc72db09", - "sha256:c9457fa5c121e94a58d6505cadca8bed1c64444b83b3204928a866ca2e599105", - "sha256:cb93f6b2ab0f6853550b74e051d297c27a638719753eb9ff66d1e4072be67133", - "sha256:ce4e4f0deb51d38b1611a27f330426154f2980e66582dc5f438aad38b5f24fc1", - "sha256:d7bdc26475679dd073ba0ed2766445bb5b20ca4793ca0db32b399dccc6bc84b7", - "sha256:ff032765bb8716d9387fd5376d987a937254b0619eff0972779515b5c98820bc" + "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29", + "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7", + "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34", + "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55", + "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6", + "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1", + "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d" ], "index": "pypi", - "version": "==3.1.7" + "version": "==3.2.0" }, "certifi": { "hashes": [ - "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3", - "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41" + "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", + "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" ], - "version": "==2020.6.20" + "version": "==2021.5.30" }, "cffi": { "hashes": [ - "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", - "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b", - "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac", - "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0", - "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384", - "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26", - "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6", - "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b", - "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e", - "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd", - "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2", - "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66", - "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc", - "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8", - "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55", - "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4", - "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5", - "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d", - "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78", - "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa", - "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793", - "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f", - "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a", - "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f", - "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30", - "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f", - "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3", - "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c" + "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d", + "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771", + "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872", + "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c", + "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc", + "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762", + "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202", + "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5", + "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548", + "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a", + "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f", + "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20", + "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218", + "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c", + "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e", + "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56", + "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224", + "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a", + "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2", + "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a", + "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819", + "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346", + "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b", + "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e", + "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534", + "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb", + "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0", + "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156", + "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd", + "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87", + "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc", + "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195", + "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33", + "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f", + "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d", + "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd", + "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728", + "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7", + "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca", + "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99", + "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf", + "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e", + "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c", + "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5", + "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69" ], - "version": "==1.14.0" + "version": "==1.14.6" }, - "chardet": { + "charset-normalizer": { "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1", + "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12" ], - "version": "==3.0.4" + "markers": "python_version >= '3'", + "version": "==2.0.3" }, "idna": { "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" + "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a", + "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3" ], - "version": "==2.10" + "markers": "python_version >= '3'", + "version": "==3.2" }, "importlib-metadata": { "hashes": [ - "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83", - "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070" + "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac", + "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e" ], "markers": "python_version < '3.8'", - "version": "==1.7.0" + "version": "==4.6.1" + }, + "iniconfig": { + "hashes": [ + "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", + "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" + ], + "version": "==1.1.1" }, "joblib": { "hashes": [ - "sha256:8f52bf24c64b608bf0b2563e0e47d6fcf516abc8cfafe10cfd98ad66d94f92d6", - "sha256:d348c5d4ae31496b2aa060d6d9b787864dd204f9480baaa52d18850cb43e9f49" + "sha256:9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7", + "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5" ], - "version": "==0.16.0" - }, - "more-itertools": { - "hashes": [ - "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", - "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" - ], - "version": "==8.4.0" + "markers": "python_version >= '3.6'", + "version": "==1.0.1" }, "numpy": { "hashes": [ - "sha256:13af0184177469192d80db9bd02619f6fa8b922f9f327e077d6f2a6acb1ce1c0", - "sha256:26a45798ca2a4e168d00de75d4a524abf5907949231512f372b217ede3429e98", - "sha256:26f509450db547e4dfa3ec739419b31edad646d21fb8d0ed0734188b35ff6b27", - "sha256:30a59fb41bb6b8c465ab50d60a1b298d1cd7b85274e71f38af5a75d6c475d2d2", - "sha256:33c623ef9ca5e19e05991f127c1be5aeb1ab5cdf30cb1c5cf3960752e58b599b", - "sha256:356f96c9fbec59974a592452ab6a036cd6f180822a60b529a975c9467fcd5f23", - "sha256:3c40c827d36c6d1c3cf413694d7dc843d50997ebffbc7c87d888a203ed6403a7", - "sha256:4d054f013a1983551254e2379385e359884e5af105e3efe00418977d02f634a7", - "sha256:63d971bb211ad3ca37b2adecdd5365f40f3b741a455beecba70fd0dde8b2a4cb", - "sha256:658624a11f6e1c252b2cd170d94bf28c8f9410acab9f2fd4369e11e1cd4e1aaf", - "sha256:76766cc80d6128750075378d3bb7812cf146415bd29b588616f72c943c00d598", - "sha256:7b57f26e5e6ee2f14f960db46bd58ffdca25ca06dd997729b1b179fddd35f5a3", - "sha256:7b852817800eb02e109ae4a9cef2beda8dd50d98b76b6cfb7b5c0099d27b52d4", - "sha256:8cde829f14bd38f6da7b2954be0f2837043e8b8d7a9110ec5e318ae6bf706610", - "sha256:a2e3a39f43f0ce95204beb8fe0831199542ccab1e0c6e486a0b4947256215632", - "sha256:a86c962e211f37edd61d6e11bb4df7eddc4a519a38a856e20a6498c319efa6b0", - "sha256:a8705c5073fe3fcc297fb8e0b31aa794e05af6a329e81b7ca4ffecab7f2b95ef", - "sha256:b6aaeadf1e4866ca0fdf7bb4eed25e521ae21a7947c59f78154b24fc7abbe1dd", - "sha256:be62aeff8f2f054eff7725f502f6228298891fd648dc2630e03e44bf63e8cee0", - "sha256:c2edbb783c841e36ca0fa159f0ae97a88ce8137fb3a6cd82eae77349ba4b607b", - "sha256:cbe326f6d364375a8e5a8ccb7e9cd73f4b2f6dc3b2ed205633a0db8243e2a96a", - "sha256:d34fbb98ad0d6b563b95de852a284074514331e6b9da0a9fc894fb1cdae7a79e", - "sha256:d97a86937cf9970453c3b62abb55a6475f173347b4cde7f8dcdb48c8e1b9952d", - "sha256:dd53d7c4a69e766e4900f29db5872f5824a06827d594427cf1a4aa542818b796", - "sha256:df1889701e2dfd8ba4dc9b1a010f0a60950077fb5242bb92c8b5c7f1a6f2668a", - "sha256:fa1fe75b4a9e18b66ae7f0b122543c42debcf800aaafa0212aaff3ad273c2596" + "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94", + "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080", + "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e", + "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c", + "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76", + "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371", + "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c", + "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2", + "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a", + "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb", + "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140", + "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28", + "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f", + "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d", + "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff", + "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8", + "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa", + "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea", + "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc", + "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73", + "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d", + "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d", + "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4", + "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c", + "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e", + "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea", + "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd", + "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f", + "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff", + "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e", + "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7", + "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa", + "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827", + "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60" ], - "version": "==1.19.0" + "markers": "python_version >= '3.6'", + "version": "==1.19.5" }, "overrides": { "hashes": [ - "sha256:30f761124579e59884b018758c4d7794914ef02a6c038621123fec49ea7599c6" + "sha256:33926e018a952b06309517b3febede982112b86430e588bdd00560b80a4a800b", + "sha256:5ba636b73bf72d3d80550f4a5dfe3c7d04ec6e8fd246c4074bfc7ad82bd0ea3d" ], "index": "pypi", - "version": "==3.1.0" + "version": "==6.1.0" }, "packaging": { "hashes": [ - "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8", - "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181" + "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7", + "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14" ], - "version": "==20.4" + "markers": "python_version >= '3.6'", + "version": "==21.0" }, "pluggy": { "hashes": [ "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.13.1" }, "py": { "hashes": [ - "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2", - "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342" + "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", + "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" ], - "version": "==1.9.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.10.0" }, "pycparser": { "hashes": [ "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.20" }, "pymongo": { "hashes": [ - "sha256:01b4e10027aef5bb9ecefbc26f5df3368ce34aef81df43850f701e716e3fe16d", - "sha256:0fc5aa1b1acf7f61af46fe0414e6a4d0c234b339db4c03a63da48599acf1cbfc", - "sha256:1396eb7151e0558b1f817e4b9d7697d5599e5c40d839a9f7270bd90af994ad82", - "sha256:18e84a3ec5e73adcb4187b8e5541b2ad61d716026ed9863267e650300d8bea33", - "sha256:19adf2848b80cb349b9891cc854581bbf24c338be9a3260e73159bdeb2264464", - "sha256:20ee0475aa2ba437b0a14806f125d696f90a8433d820fb558fdd6f052acde103", - "sha256:26798795097bdeb571f13942beef7e0b60125397811c75b7aa9214d89880dd1d", - "sha256:26e707a4eb851ec27bb969b5f1413b9b2eac28fe34271fa72329100317ea7c73", - "sha256:2a3c7ad01553b27ec553688a1e6445e7f40355fb37d925c11fcb50b504e367f8", - "sha256:2f07b27dbf303ea53f4147a7922ce91a26b34a0011131471d8aaf73151fdee9a", - "sha256:316f0cf543013d0c085e15a2c8abe0db70f93c9722c0f99b6f3318ff69477d70", - "sha256:31d11a600eea0c60de22c8bdcb58cda63c762891facdcb74248c36713240987f", - "sha256:334ef3ffd0df87ea83a0054454336159f8ad9c1b389e19c0032d9cb8410660e6", - "sha256:358ba4693c01022d507b96a980ded855a32dbdccc3c9331d0667be5e967f30ed", - "sha256:3a6568bc53103df260f5c7d2da36dffc5202b9a36c85540bba1836a774943794", - "sha256:444bf2f44264578c4085bb04493bfed0e5c1b4fe7c2704504d769f955cc78fe4", - "sha256:47a00b22c52ee59dffc2aad02d0bbfb20c26ec5b8de8900492bf13ad6901cf35", - "sha256:4c067db43b331fc709080d441cb2e157114fec60749667d12186cc3fc8e7a951", - "sha256:4c092310f804a5d45a1bcaa4191d6d016c457b6ed3982a622c35f729ff1c7f6b", - "sha256:53b711b33134e292ef8499835a3df10909c58df53a2a0308f598c432e9a62892", - "sha256:568d6bee70652d8a5af1cd3eec48b4ca1696fb1773b80719ebbd2925b72cb8f6", - "sha256:56fa55032782b7f8e0bf6956420d11e2d4e9860598dfe9c504edec53af0fc372", - "sha256:5a2c492680c61b440272341294172fa3b3751797b1ab983533a770e4fb0a67ac", - "sha256:61235cc39b5b2f593086d1d38f3fc130b2d125bd8fc8621d35bc5b6bdeb92bd2", - "sha256:619ac9aaf681434b4d4718d1b31aa2f0fce64f2b3f8435688fcbdc0c818b6c54", - "sha256:6238ac1f483494011abde5286282afdfacd8926659e222ba9b74c67008d3a58c", - "sha256:63752a72ca4d4e1386278bd43d14232f51718b409e7ac86bcf8810826b531113", - "sha256:6fdc5ccb43864065d40dd838437952e9e3da9821b7eac605ba46ada77f846bdf", - "sha256:7abc3a6825a346fa4621a6f63e3b662bbb9e0f6ffc32d30a459d695f20fb1a8b", - "sha256:7aef381bb9ae8a3821abd7f9d4d93978dbd99072b48522e181baeffcd95b56ae", - "sha256:80df3caf251fe61a3f0c9614adc6e2bfcffd1cd3345280896766712fb4b4d6d7", - "sha256:95f970f34b59987dee6f360d2e7d30e181d58957b85dff929eee4423739bd151", - "sha256:993257f6ca3cde55332af1f62af3e04ca89ce63c08b56a387cdd46136c72f2fa", - "sha256:9c0a57390549affc2b5dda24a38de03a5c7cbc58750cd161ff5d106c3c6eec80", - "sha256:a0794e987d55d2f719cc95fcf980fc62d12b80e287e6a761c4be14c60bd9fecc", - "sha256:a3b98121e68bf370dd8ea09df67e916f93ea95b52fc010902312168c4d1aff5d", - "sha256:a60756d55f0887023b3899e6c2923ba5f0042fb11b1d17810b4e07395404f33e", - "sha256:a676bd2fbc2309092b9bbb0083d35718b5420af3a42135ebb1e4c3633f56604d", - "sha256:a732838c78554c1257ff2492f5c8c4c7312d0aecd7f732149e255f3749edd5ee", - "sha256:ae65d65fde4135ef423a2608587c9ef585a3551fc2e4e431e7c7e527047581be", - "sha256:b070a4f064a9edb70f921bfdc270725cff7a78c22036dd37a767c51393fb956f", - "sha256:b6da85949aa91e9f8c521681344bd2e163de894a5492337fba8b05c409225a4f", - "sha256:bbf47110765b2a999803a7de457567389253f8670f7daafb98e059c899ce9764", - "sha256:c06b3f998d2d7160db58db69adfb807d2ec307e883e2f17f6b87a1ef6c723f11", - "sha256:c318fb70542be16d3d4063cde6010b1e4d328993a793529c15a619251f517c39", - "sha256:c4aef42e5fa4c9d5a99f751fb79caa880dac7eaf8a65121549318b984676a1b7", - "sha256:c9ca545e93a9c2a3bdaa2e6e21f7a43267ff0813e8055adf2b591c13164c0c57", - "sha256:da2c3220eb55c4239dd8b982e213da0b79023cac59fe54ca09365f2bc7e4ad32", - "sha256:dd8055da300535eefd446b30995c0813cc4394873c9509323762a93e97c04c03", - "sha256:e2b46e092ea54b732d98c476720386ff2ccd126de1e52076b470b117bff7e409", - "sha256:e334c4f39a2863a239d38b5829e442a87f241a92da9941861ee6ec5d6380b7fe", - "sha256:e5c54f04ca42bbb5153aec5d4f2e3d9f81e316945220ac318abd4083308143f5", - "sha256:f96333f9d2517c752c20a35ff95de5fc2763ac8cdb1653df0f6f45d281620606" + "sha256:02dc0b0f48ed3cd06c13b7e31b066bf91e00dac5f8147b0a0a45f9009bfab857", + "sha256:053b4ebf91c7395d1fcd2ce6a9edff0024575b7b2de6781554a4114448a8adc9", + "sha256:070a4ef689c9438a999ec3830e69b208ff0d12251846e064d947f97d819d1d05", + "sha256:072ba7cb65c8aa4d5c5659bf6722ee85781c9d7816dc00679b8b6f3dff1ddafc", + "sha256:0b6055e0ef451ff73c93d0348d122a0750dddf323b9361de5835dac2f6cf7fc1", + "sha256:11f9e0cfc84ade088a38df2708d0b958bb76360181df1b2e1e1a41beaa57952b", + "sha256:18290649759f9db660972442aa606f845c368db9b08c4c73770f6da14113569b", + "sha256:186104a94d39b8412f8e3de385acd990a628346a4402d4f3a288a82b8660bd22", + "sha256:1970cfe2aec1bf74b40cf30c130ad10cd968941694630386db33e1d044c22a2e", + "sha256:19d4bd0fc29aa405bb1781456c9cfff9fceabb68543741eb17234952dbc2bbb0", + "sha256:1bab889ae7640eba739f67fcbf8eff252dddc60d4495e6ddd3a87cd9a95fdb52", + "sha256:1bc6fe7279ff40c6818db002bf5284aa03ec181ea1b1ceaeee33c289d412afa7", + "sha256:208debdcf76ed39ebf24f38509f50dc1c100e31e8653817fedb8e1f867850a13", + "sha256:2399a85b54f68008e483b2871f4a458b4c980469c7fe921595ede073e4844f1e", + "sha256:246ec420e4c8744fceb4e259f906211b9c198e1f345e6158dcd7cbad3737e11e", + "sha256:24f8aeec4d6b894a6128844e50ff423dd02462ee83addf503c598ee3a80ddf3d", + "sha256:255a35bf29185f44b412e31a927d9dcedda7c2c380127ecc4fbf2f61b72fa978", + "sha256:2dbfbbded947a83a3dffc2bd1ec4750c17e40904692186e2c55a3ad314ca0222", + "sha256:2e92aa32300a0b5e4175caec7769f482b292769807024a86d674b3f19b8e3755", + "sha256:316c1b8723afa9870567cd6dff35d440b2afeda53aa13da6c5ab85f98ed6f5ca", + "sha256:333bfad77aa9cd11711febfb75eed0bb537a1d022e1c252714dad38993590240", + "sha256:39dafa2eaf577d1969f289dc9a44501859a1897eb45bd589e93ce843fc610800", + "sha256:3ce83f17f641a62a4dfb0ba1b8a3c1ced7c842f511b5450d90c030c7828e3693", + "sha256:46d5ec90276f71af3a29917b30f2aec2315a2759b5f8d45b3b63a07ca8a070a3", + "sha256:48d5bc80ab0af6b60c4163c5617f5cd23f2f880d7600940870ea5055816af024", + "sha256:4ba0def4abef058c0e5101e05e3d5266e6fffb9795bbf8be0fe912a7361a0209", + "sha256:5af390fa9faf56c93252dab09ea57cd020c9123aa921b63a0ed51832fdb492e7", + "sha256:5e574664f1468872cd40f74e4811e22b1aa4de9399d6bcfdf1ee6ea94c017fcf", + "sha256:625befa3bc9b40746a749115cc6a15bf20b9bd7597ca55d646205b479a2c99c7", + "sha256:6261bee7c5abadeac7497f8f1c43e521da78dd13b0a2439f526a7b0fc3788824", + "sha256:657ad80de8ec9ed656f28844efc801a0802961e8c6a85038d97ff6f555ef4919", + "sha256:6b89dc51206e4971c5568c797991eaaef5dc2a6118d67165858ad11752dba055", + "sha256:6e66780f14c2efaf989cd3ac613b03ee6a8e3a0ba7b96c0bb14adca71a427e55", + "sha256:6fb3f85870ae26896bb44e67db94045f2ebf00c5d41e6b66cdcbb5afd644fc18", + "sha256:701e08457183da70ed96b35a6b43e6ba1df0b47c837b063cde39a1fbe1aeda81", + "sha256:70761fd3c576b027eec882b43ee0a8e5b22ff9c20cdf4d0400e104bc29e53e34", + "sha256:73b400fdc22de84bae0dbf1a22613928a41612ec0a3d6ed47caf7ad4d3d0f2ff", + "sha256:7412a36798966624dc4c57d64aa43c2d1100b348abd98daaac8e99e57d87e1d7", + "sha256:78ecb8d42f50d393af912bfb1fb1dcc9aabe9967973efb49ee577e8f1cea494c", + "sha256:7c6a9948916a7bbcc6d3a9f6fb75db1acb5546078023bfb3db6efabcd5a67527", + "sha256:7c72d08acdf573455b2b9d2b75b8237654841d63a48bc2327dc102c6ee89b75a", + "sha256:7d98ce3c42921bb91566121b658e0d9d59a9082a9bd6f473190607ff25ab637f", + "sha256:845a8b83798b2fb11b09928413cb32692866bfbc28830a433d9fa4c8c3720dd0", + "sha256:94d38eba4d1b5eb3e6bfece0651b855a35c44f32fd91f512ab4ba41b8c0d3e66", + "sha256:9a13661681d17e43009bb3e85e837aa1ec5feeea1e3654682a01b8821940f8b3", + "sha256:a0e5dff6701fa615f165306e642709e1c1550d5b237c5a7a6ea299886828bd50", + "sha256:a2239556ff7241584ce57be1facf25081669bb457a9e5cbe68cce4aae6567aa1", + "sha256:a325600c83e61e3c9cebc0c2b1c8c4140fa887f789085075e8f44c8ff2547eb9", + "sha256:a3566acfbcde46911c52810374ecc0354fdb841284a3efef6ff7105bc007e9a8", + "sha256:a634a4730ce0b0934ed75e45beba730968e12b4dafbb22f69b3b2f616d9e644e", + "sha256:a6d055f01b83b1a4df8bb0c61983d3bdffa913764488910af3620e5c2450bf83", + "sha256:a752ecd1a26000a6d67be7c9a2e93801994a8b3f866ac95b672fbc00225ca91a", + "sha256:a9ba2a63777027b06b116e1ea8248e66fd1bedc2c644f93124b81a91ddbf6d88", + "sha256:aaa038eafb7186a4abbb311fcf20724be9363645882bbce540bef4797e812a7a", + "sha256:af586e85144023686fb0af09c8cdf672484ea182f352e7ceead3d832de381e1b", + "sha256:b0a0cf39f589e52d801fdef418305562bc030cdf8929217463c8433c65fd5c2f", + "sha256:b1c4874331ab960429caca81acb9d2932170d66d6d6f87e65dc4507a85aca152", + "sha256:b3b5b3cbc3fdf4fcfa292529df2a85b5d9c7053913a739d3069af1e12e12219f", + "sha256:b542d56ed1b8d5cf3bb36326f814bd2fbe8812dfd2582b80a15689ea433c0e35", + "sha256:b6ea08758b6673610b3c5bdf47189286cf9c58b1077558706a2f6f8744922527", + "sha256:b754240daafecd9d5fce426b0fbaaed03f4ebb130745c8a4ae9231fffb8d75e5", + "sha256:b772bab31cbd9cb911e41e1a611ebc9497f9a32a7348e2747c38210f75c00f41", + "sha256:b88d1742159bc93a078733f9789f563cef26f5e370eba810476a71aa98e5fbc2", + "sha256:b8bf42d3b32f586f4c9e37541769993783a534ad35531ce8a4379f6fa664fba9", + "sha256:bc9ac81e73573516070d24ce15da91281922811f385645df32bd3c8a45ab4684", + "sha256:c188db6cf9e14dbbb42f5254292be96f05374a35e7dfa087cc2140f0ff4f10f6", + "sha256:c55782a55f4a013a78ac5b6ee4b8731a192dea7ab09f1b6b3044c96d5128edd4", + "sha256:c5cab230e7cabdae9ff23c12271231283efefb944c1b79bed79a91beb65ba547", + "sha256:cbf8672edeb7b7128c4a939274801f0e32bbf5159987815e3d1eace625264a46", + "sha256:cc2894fe91f31a513860238ede69fe47fada21f9e7ddfe73f7f9fef93a971e41", + "sha256:cda9e628b1315beec8341e8c04aac9a0b910650b05e0751e42e399d5694aeacb", + "sha256:ceae3ab9e11a27aaab42878f1d203600dfd24f0e43678b47298219a0f10c0d30", + "sha256:ced944dcdd561476deef7cb7bfd4987c69fffbfeff6d02ca4d5d4fd592d559b7", + "sha256:d04ca462cb99077e6c059e97c072957caf2918e6e4191e3161c01c439e0193de", + "sha256:d1131562ddc2ea8a446f66c2648d7dabec2b3816fc818528eb978a75a6d23b2e", + "sha256:d1740776b70367277323fafb76bcf09753a5cc9824f5d705bac22a34ff3668ea", + "sha256:d6e11ffd43184d529d6752d6dcb62b994f903038a17ea2168ef1910c96324d26", + "sha256:d73e10772152605f6648ba4410318594f1043bbfe36d2fadee7c4b8912eff7c5", + "sha256:da8288bc4a7807c6715416deed1c57d94d5e03e93537889e002bf985be503f1a", + "sha256:db93608a246da44d728842b8fa9e45aa9782db76955f634a707739a8d53ff544", + "sha256:dcd3d0009fbb6e454d729f8b22d0063bd9171c31a55e0f0271119bd4f2700023", + "sha256:dd1f49f949a658c4e8f81ed73f9aad25fcc7d4f62f767f591e749e30038c4e1d", + "sha256:dd6ff2192f34bd622883c745a56f492b1c9ccd44e14953e8051c33024a2947d5", + "sha256:e018a4921657c2d3f89c720b7b90b9182e277178a04a7e9542cc79d7d787ca51", + "sha256:e2b7670c0c8c6b501464150dd49dd0d6be6cb7f049e064124911cec5514fa19e", + "sha256:e7a33322e08021c37e89cae8ff06327503e8a1719e97c69f32c31cbf6c30d72c", + "sha256:e8a82e35d52ad6f867e88096a1a2b9bdc7ec4d5e65c7b4976a248bf2d1a32a93", + "sha256:e9faf8d4712d5ea301d74abfcf6dafe4b7f4af7936e91f283b0ad7bf69ed3e3a", + "sha256:ec5ca7c0007ce268048bbe0ffc6846ed1616cf3d8628b136e81d5e64ff3f52a2", + "sha256:eee42a1cc06565f6b21caa1f504ec15e07de7ebfd520ab57f8cb3308bc118e22", + "sha256:f2acf9bbcd514e901f82c4ca6926bbd2ae61716728f110b4343eb0a69612d018", + "sha256:f55c1ddcc1f6050b07d468ce594f55dbf6107b459e16f735d26818d7be1e9538", + "sha256:f6977a520bd96e097c8a37a8cbb9faa1ea99d21bf84190195056e25f688af73d", + "sha256:f94c7d22fb36b184734dded7345a04ec5f95130421c775b8b0c65044ef073f34", + "sha256:fa8957e9a1b202cb45e6b839c241cd986c897be1e722b81d2f32e9c6aeee80b0", + "sha256:fd3854148005c808c485c754a184c71116372263709958b42aefbef2e5dd373a", + "sha256:fe5872ce6f9627deac8314bdffd3862624227c3de4c17ef0cc78bbf0402999eb", + "sha256:ffbae429ba9e42d0582d3ac63fdb410338892468a2107d8ff68228ec9a39a0ed" ], "index": "pypi", - "version": "==3.10.1" + "version": "==3.12.0" }, "pyparsing": { "hashes": [ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.4.7" }, "pytest": { "hashes": [ - "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1", - "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8" + "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b", + "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890" ], "index": "pypi", - "version": "==5.4.3" + "version": "==6.2.4" + }, + "pytest-rerunfailures": { + "hashes": [ + "sha256:53db94acf7499c75c5257c79d8a1dc22c3db4bc8d32ec3a713ea91eda3f98359", + "sha256:7617c06de13ee6dd2df9add7e275bfb2bcebbaaf3e450f5937cd0200df824273" + ], + "index": "pypi", + "version": "==10.1" }, "python-json-logger": { "hashes": [ - "sha256:b7a31162f2a01965a5efb94453ce69230ed208468b0bbc7fdfc56e6d8df2e281" + "sha256:f26eea7898db40609563bed0a7ca11af12e2a79858632706d835a0f961b7d398" ], "index": "pypi", - "version": "==0.1.11" + "version": "==2.0.1" }, "requests": { "hashes": [ - "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b", - "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898" + "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", + "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" ], "index": "pypi", - "version": "==2.24.0" + "version": "==2.26.0" }, "scikit-learn": { "hashes": [ - "sha256:04799686060ecbf8992f26a35be1d99e981894c8c7860c1365cda4200f954a16", - "sha256:058d213092de4384710137af1300ed0ff030b8c40459a6c6f73c31ccd274cc39", - "sha256:0c3464e46ef8bd4f1bfa5c009648c6449412c8f7e9b3fc0c9e3d800139c48827", - "sha256:0e7b55f73b35537ecd0d19df29dd39aa9e076dba78f3507b8136c819d84611fd", - "sha256:16feae4361be6b299d4d08df5a30956b4bfc8eadf173fe9258f6d59630f851d4", - "sha256:244ca85d6eba17a1e6e8a66ab2f584be6a7784b5f59297e3d7ff8c7983af627c", - "sha256:3e6e92b495eee193a8fa12a230c9b7976ea0fc1263719338e35c986ea1e42cff", - "sha256:5bcea4d6ee431c814261117281363208408aa4e665633655895feb059021aca6", - "sha256:93f56abd316d131645559ec0ab4f45e3391c2ccdd4eadaa4912f4c1e0a6f2c96", - "sha256:9e04c0811ea92931ee8490d638171b8cb2f21387efcfff526bbc8c2a3da60f1c", - "sha256:bded94236e16774385202cafd26190ce96db18e4dc21e99473848c61e4fdc400", - "sha256:c2fa33d20408b513cf432505c80e6eb4bf4d71434f1ae36680765d4a2c2a16ec", - "sha256:e3fec1c8831f8f93ad85581ca29ca1bb88e2da377fb097cf8322aa89c21bc9b8", - "sha256:e585682e37f2faa81ad6cd4472fff646bf2fd0542147bec93697a905db8e6bd2", - "sha256:e9879ba9e64ec3add41bf201e06034162f853652ef4849b361d73b0deb3153ad", - "sha256:ebe853e6f318f9d8b3b74dd17e553720d35646eff675a69eeaed12fbbbb07daa" + "sha256:038f4e9d6ef10e1f3fe82addc3a14735c299866eb10f2c77c090410904828312", + "sha256:06ffdcaaf81e2a3b1b50c3ac6842cfb13df2d8b737d61f64643ed61da7389cde", + "sha256:0e71ce9c7cbc20f6f8b860107ce15114da26e8675238b4b82b7e7cd37ca0c087", + "sha256:1eec963fe9ffc827442c2e9333227c4d49749a44e592f305398c1db5c1563393", + "sha256:2754c85b2287333f9719db7f23fb7e357f436deed512db3417a02bf6f2830aa5", + "sha256:2db429090b98045d71218a9ba913cc9b3fe78e0ba0b6b647d8748bc6d5a44080", + "sha256:39b7e3b71bcb1fe46397185d6c1a5db1c441e71c23c91a31e7ad8cc3f7305f9a", + "sha256:3cbd734e1aefc7c5080e6b6973fe062f97c26a1cdf1a991037ca196ce1c8f427", + "sha256:40556bea1ef26ef54bc678d00cf138a63069144a0b5f3a436eecd8f3468b903e", + "sha256:48f273836e19901ba2beecd919f7b352f09310ce67c762f6e53bc6b81cacf1f0", + "sha256:49ec0b1361da328da9bb7f1a162836028e72556356adeb53342f8fae6b450d47", + "sha256:4e6198675a6f9d333774671bd536668680eea78e2e81c0b19e57224f58d17f37", + "sha256:5beaeb091071625e83f5905192d8aecde65ba2f26f8b6719845bbf586f7a04a1", + "sha256:5ff3e4e4cf7592d36541edec434e09fb8ab9ba6b47608c4ffe30c9038d301897", + "sha256:62214d2954377fcf3f31ec867dd4e436df80121e7a32947a0b3244f58f45e455", + "sha256:7be1b88c23cfac46e06404582215a917017cd2edaa2e4d40abe6aaff5458f24b", + "sha256:8fac72b9688176922f9f54fda1ba5f7ffd28cbeb9aad282760186e8ceba9139a", + "sha256:90a297330f608adeb4d2e9786c6fda395d3150739deb3d42a86d9a4c2d15bc1d", + "sha256:a2a47449093dcf70babc930beba2ca0423cb7df2fa5fd76be5260703d67fa574", + "sha256:ae19ac105cf7ce8c205a46166992fdec88081d6e783ab6e38ecfbe45729f3c39", + "sha256:ae426e3a52842c6b6d77d00f906b6031c8c2cfdfabd6af7511bb4bc9a68d720e", + "sha256:cbdb0b3db99dd1d5f69d31b4234367d55475add31df4d84a3bd690ef017b55e2", + "sha256:cdf24c1b9bbeb4936456b42ac5bd32c60bb194a344951acb6bfb0cddee5439a4", + "sha256:d14701a12417930392cd3898e9646cf5670c190b933625ebe7511b1f7d7b8736", + "sha256:d177fe1ff47cc235942d628d41ee5b1c6930d8f009f1a451c39b5411e8d0d4cf", + "sha256:d5bf9c863ba4717b3917b5227463ee06860fc43931dc9026747de416c0a10fee", + "sha256:dd968a174aa82f3341a615a033fa6a8169e9320cbb46130686562db132d7f1f0", + "sha256:f0ed4483c258fb23150e31b91ea7d25ff8495dba108aea0b0d4206a777705350", + "sha256:f18c3ed484eeeaa43a0d45dc2efb4d00fc6542ccdcfa2c45d7b635096a2ae534", + "sha256:f1d2108e770907540b5248977e4cff9ffaf0f73d0d13445ee938df06ca7579c6", + "sha256:f3ec00f023d84526381ad0c0f2cff982852d035c921bbf8ceb994f4886c00c64", + "sha256:f74429a07fedb36a03c159332b914e6de757176064f9fed94b5f79ebac07d913", + "sha256:fec42690a2eb646b384eafb021c425fab48991587edb412d4db77acc358b27ce" ], "index": "pypi", - "version": "==0.23.1" + "version": "==0.24.2" }, "scipy": { "hashes": [ - "sha256:039572f0ca9578a466683558c5bf1e65d442860ec6e13307d528749cfe6d07b8", - "sha256:058e84930407927f71963a4ad8c1dc96c4d2d075636a68578195648c81f78810", - "sha256:06b19a650471781056c1a2172eeeeb777b8b516e9434005dd392a4559e0938b9", - "sha256:35d042d6499caf1a5d171baed0ebf01eb665b7af2ad98a8ff1b0e6e783654540", - "sha256:57a0f2be3063dbe1e3daf31ec9005576e8fd1022a28159d0db71d14566899d16", - "sha256:5e0bb43ff581811ab7f27425f6b96c1ddf7591ccad2e486c9af0b910c18f7185", - "sha256:71742889393a724dfce755b6b61228677873d269a4234e51ddaf08b998433c91", - "sha256:7908c85854c5b5b6d3ce7fefafac1ca3e23ff9ac41edabc2d46ae5dc9fa070ac", - "sha256:81859ed3aad620752dd2c07c32b5d3a80a0d47c5e3813904621954a78a0ae899", - "sha256:8302d69fb1528ea7c7f2a1ea640d354c981b6eb8192d1c175349874209397604", - "sha256:9323d268775991b79690f7b9a28a4e8b8c4f2b160ed9f8a90123127314e2d3c1", - "sha256:b4858ccbd88f4b53950fb9fc0069c1d9fea83d7cff2382e1d8b023d3f4883014", - "sha256:c05c6fe76228cc13c5214e9faf5f2a871a1da54473bc417ab9da310d0e5fff8b", - "sha256:c06e731aa46c0dfc563cc636155758178ebc019ef78b9b0f4370effe2ac0f0e6", - "sha256:eb46d8b5947ca27b0bc972cecfba8130f088a83ab3d08c1a6033d9070b3046b3", - "sha256:fff15df01bef1243468be60c55178ed7576270b200aab08a7ffd5b8e0bbc340c" + "sha256:168c45c0c32e23f613db7c9e4e780bc61982d71dcd406ead746c7c7c2f2004ce", + "sha256:213bc59191da2f479984ad4ec39406bf949a99aba70e9237b916ce7547b6ef42", + "sha256:25b241034215247481f53355e05f9e25462682b13bd9191359075682adcd9554", + "sha256:2c872de0c69ed20fb1a9b9cf6f77298b04a26f0b8720a5457be08be254366c6e", + "sha256:3397c129b479846d7eaa18f999369a24322d008fac0782e7828fa567358c36ce", + "sha256:368c0f69f93186309e1b4beb8e26d51dd6f5010b79264c0f1e9ca00cd92ea8c9", + "sha256:3d5db5d815370c28d938cf9b0809dade4acf7aba57eaf7ef733bfedc9b2474c4", + "sha256:4598cf03136067000855d6b44d7a1f4f46994164bcd450fb2c3d481afc25dd06", + "sha256:4a453d5e5689de62e5d38edf40af3f17560bfd63c9c5bd228c18c1f99afa155b", + "sha256:4f12d13ffbc16e988fa40809cbbd7a8b45bc05ff6ea0ba8e3e41f6f4db3a9e47", + "sha256:634568a3018bc16a83cda28d4f7aed0d803dd5618facb36e977e53b2df868443", + "sha256:65923bc3809524e46fb7eb4d6346552cbb6a1ffc41be748535aa502a2e3d3389", + "sha256:6b0ceb23560f46dd236a8ad4378fc40bad1783e997604ba845e131d6c680963e", + "sha256:8c8d6ca19c8497344b810b0b0344f8375af5f6bb9c98bd42e33f747417ab3f57", + "sha256:9ad4fcddcbf5dc67619379782e6aeef41218a79e17979aaed01ed099876c0e62", + "sha256:a254b98dbcc744c723a838c03b74a8a34c0558c9ac5c86d5561703362231107d", + "sha256:b03c4338d6d3d299e8ca494194c0ae4f611548da59e3c038813f1a43976cb437", + "sha256:cc1f78ebc982cd0602c9a7615d878396bec94908db67d4ecddca864d049112f2", + "sha256:d6d25c41a009e3c6b7e757338948d0076ee1dd1770d1c09ec131f11946883c54", + "sha256:d84cadd7d7998433334c99fa55bcba0d8b4aeff0edb123b2a1dfcface538e474", + "sha256:e360cb2299028d0b0d0f65a5c5e51fc16a335f1603aa2357c25766c8dab56938", + "sha256:e98d49a5717369d8241d6cf33ecb0ca72deee392414118198a8e5b4c35c56340", + "sha256:ed572470af2438b526ea574ff8f05e7f39b44ac37f712105e57fc4d53a6fb660", + "sha256:f87b39f4d69cf7d7529d7b1098cb712033b17ea7714aed831b95628f483fd012", + "sha256:fa789583fc94a7689b45834453fec095245c7e69c58561dc159b5d5277057e4c" ], - "version": "==1.5.1" + "markers": "python_version >= '3.6'", + "version": "==1.5.4" }, "six": { "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "version": "==1.15.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" }, "threadpoolctl": { "hashes": [ - "sha256:38b74ca20ff3bb42caca8b00055111d74159ee95c4370882bbff2b93d24da725", - "sha256:ddc57c96a38beb63db45d6c159b5ab07b6bced12c45a1f07b2b92f272aebfa6b" + "sha256:86d4b6801456d780e94681d155779058759eaef3c3564758b17b6c99db5f81cb", + "sha256:e5a995e3ffae202758fa8a90082e35783b9370699627ae2733cd1c3a73553616" ], - "version": "==2.1.0" + "markers": "python_version >= '3.6'", + "version": "==2.2.0" + }, + "toml": { + "hashes": [ + "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", + "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.10.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", + "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", + "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" + ], + "markers": "python_version < '3.8'", + "version": "==3.10.0.0" + }, + "typing-utils": { + "hashes": [ + "sha256:6bd26f3d38a5dd526ca3a59f0a451ccb59bcee9dc829c872dd6c0aae4ec8bbef", + "sha256:8ff6b6705414b82575ad5ae0925ac414a9650fb8c5718289b1327dec61252f65" + ], + "markers": "python_full_version >= '3.6.1'", + "version": "==0.1.0" }, "urllib3": { "hashes": [ - "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527", - "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115" + "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4", + "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f" ], - "version": "==1.25.9" - }, - "wcwidth": { - "hashes": [ - "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", - "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" - ], - "version": "==0.2.5" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", + "version": "==1.26.6" }, "zipp": { "hashes": [ - "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b", - "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96" + "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3", + "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4" ], - "version": "==3.1.0" + "markers": "python_version >= '3.6'", + "version": "==3.5.0" } }, "develop": {} diff --git a/test/data/collections.json b/test/data/collections.json index 11ca40e..a67b8ff 100644 --- a/test/data/collections.json +++ b/test/data/collections.json @@ -31,6 +31,66 @@ "num_annotations": 375 } }, + { + "collection": { + "creator_id": "ada", + "annotators": ["ada"], + "viewers": ["ada"], + "labels": ["geo", "gpe", "per", "org", "tim", "art"], + "metadata": { + "title": "Small Collection", + "description": "This is a small collection" + }, + "archived": false, + "configuration": { + "allow_overlapping_ner_annotations": true + } + }, "classifier": { + "pipelineId": "5babb6ee4eb7dd2c39b9671d", + "overlap": 0, + "train_every": 5, + "classifierParameters": { + "cutoff": 1, + "iterations": 5 + } + }, "documents": { + "ner_annotations": { + "csv_file": "./ner_dataset.csv", + "sentences_per_doc": 10 + }, + "num_docs": 10 + } + }, + { + "collection": { + "creator_id": "ada", + "annotators": ["ada"], + "viewers": ["ada"], + "labels": ["geo", "gpe", "per", "org", "tim", "art"], + "metadata": { + "title": "Small Collection OpenNLP", + "description": "This is a small collection using OpenNLP pipeline" + }, + "archived": false, + "configuration": { + "allow_overlapping_ner_annotations": true + } + }, "classifier": { + "pipelineId": "5babb6ee4eb7dd2c39b9671c", + "overlap": 0, + "train_every": 5, + "classifierParameters": { + "cutoff": 1, + "iterations": 5 + } + }, "documents": { + "ner_annotations": { + "csv_file": "./ner_dataset.csv", + "sentences_per_doc": 10 + }, + "num_docs": 10 + } + }, { "collection": { "creator_id": "margaret", diff --git a/test/docker/pytest/docker_run.sh b/test/docker/pytest/docker_run.sh index a8fc2af..68827d5 100755 --- a/test/docker/pytest/docker_run.sh +++ b/test/docker/pytest/docker_run.sh @@ -19,4 +19,4 @@ done sleep 5 cd tests/ -pytest pytest/ $@ +pytest pytest/ --verbose $@ diff --git a/test/tests/pytest/02_collections_test.py b/test/tests/pytest/02_collections_test.py index c0b76ee..df070a9 100644 --- a/test/tests/pytest/02_collections_test.py +++ b/test/tests/pytest/02_collections_test.py @@ -163,3 +163,47 @@ def test_collection_user_permissions(): "archive": True, "delete_documents": True } + +def test_collection_creation_and_get_and_archive(): + client = common.login_with_test_user(common.client()) + pipeline_id = [p for p in client.get_pipelines() if p["name"].lower() == "spacy"][0]["_id"] + assert pipeline_id is not None + my_id = client.get_my_user_id() + assert my_id is not None + + collection_builder = client.collection_builder() \ + .viewer(my_id) \ + .annotator(my_id) \ + .label("label") \ + .title("Collection to Test Creation") \ + .description("This is a collection for pytest to test creation.") \ + .classifier(pipeline_id, train_every=100) + collection_id = client.create_collection(collection_builder) + assert type(collection_id) is str + + try: + collection = client.get_collection(collection_id) + assert type(collection) is dict + + assert collection["_id"] == collection_id + assert collection["creator_id"] == my_id + assert collection["annotators"] == [my_id] + assert collection["viewers"] == [my_id] + assert collection["archived"] == False + assert collection["labels"] == ["label"] + assert collection["metadata"] == { + "title": "Collection to Test Creation", + "description": "This is a collection for pytest to test creation." + } + + updated_collection = client.archive_collection(collection_id, True) + assert type(updated_collection) is dict + assert updated_collection["_id"] == collection_id + assert updated_collection["archived"] == True + + updated_collection = client.archive_collection(collection_id, False) + assert type(updated_collection) is dict + assert updated_collection["_id"] == collection_id + assert updated_collection["archived"] == False + finally: + client.archive_collection(collection_id, True) diff --git a/test/tests/pytest/04_pipelines_test.py b/test/tests/pytest/04_pipelines_test.py new file mode 100644 index 0000000..16f5951 --- /dev/null +++ b/test/tests/pytest/04_pipelines_test.py @@ -0,0 +1,226 @@ +# (C) 2019 The Johns Hopkins University Applied Physics Laboratory LLC. + +import csv + +import pytest + +import common +import pine.client.exceptions + +def test_get_and_advance_next_documents(tmp_path): + client = common.login_with_test_user(common.client()) + pipeline_id = [p for p in client.get_pipelines() if p["name"].lower() == "spacy"][0]["_id"] + assert pipeline_id is not None + my_id = client.get_my_user_id() + assert my_id is not None + + # write documents CSV + documents_file = tmp_path / "documents.csv" + with open(documents_file, "w", newline="") as csvfile: + writer = csv.writer(csvfile) + for i in range(5): + writer.writerow(["This is document number {}.".format(i)]) + + collection = client.collection_builder() \ + .viewer(my_id) \ + .annotator(my_id) \ + .label("label") \ + .title("Collection to Test Next Document") \ + .description("This is a collection for pytest to test the next/advance documents feature.") \ + .classifier(pipeline_id, train_every=100, overlap=1) \ + .document_csv_file(documents_file, has_header=False, text_column=0) + collection_id = client.create_collection(collection) + assert collection_id is not None + + document_ids = [d["_id"] for d in client.get_collection_documents(collection_id, True, 1)] + assert len(document_ids) == 5 + + try: + classifier = client.get_collection_classifier(collection_id) + assert classifier is not None + classifier_id = classifier["_id"] + assert classifier_id is not None + + # add more documents + document_ids += [ + client.add_document( + collection_id=collection_id, + overlap=1, + text="This is document number {}.".format(i)) + for i in range(5, 10)] + assert len(document_ids) == 10 + for document_id in document_ids: + assert type(document_id) is str + + next_ids = [] + next_id = client.get_next_document(classifier_id) + while next_id is not None: + assert type(next_id) is str + assert next_id not in next_ids # no duplicates + next_ids.append(next_id) + assert len(next_ids) <= len(document_ids) # sanity check to prevent an infinite loop + updated_document = client.advance_next_document(classifier_id, next_id) + assert type(updated_document) is dict + next_id = client.get_next_document(classifier_id) + assert set(document_ids) == set(next_ids) + finally: + client.archive_collection(collection_id) + +def _check_pipeline_status(status, classifier_id): + assert type(status) is dict + assert "service_details" in status and type(status["service_details"]) is dict + assert "job_id" in status + assert type(status["job_id"]) is str and len(status["job_id"]) != 0 + assert "job_request" in status and type(status["job_request"]) is dict + assert "job_response" in status and type(status["job_response"]) is dict + + request = status["job_request"] + assert "job_data" in request and type(request["job_data"]) is dict + + response = status["job_response"] + assert "classifier_id" in response and classifier_id == response["classifier_id"] + assert "model_dir" in response + assert "pipeline_name" in response + assert "classifier_class" in response + assert "classifier" in response and type(response["classifier"]) is dict + assert (classifier_id != None) == ("has_trained" in response) + +def test_get_pipelines(): + client = common.login_with_test_user(common.client()) + + imported_pipelines = common.test_pipeline_data() + expected_pipeline_ids = [pipeline["_id"] for pipeline in imported_pipelines] + + pipelines = client.get_pipelines() + actual_pipeline_ids = [pipeline["_id"] for pipeline in pipelines] + assert set(expected_pipeline_ids) == set(actual_pipeline_ids) + + for pipeline in pipelines: + expected = [p for p in imported_pipelines if p["_id"] == pipeline["_id"]][0] + for key in expected: + assert expected[key] == pipeline[key] + +def test_get_pipeline_status(): + client = common.login_with_test_user(common.client()) + + for pipeline in common.test_pipeline_data(): + status = client.get_pipeline_status(pipeline["_id"]) + _check_pipeline_status(status, None) + +def test_get_collection_classifier(): + client = common.login_with_test_user(common.client()) + + # make sure that a correct classifier is returned for each collection + for collection in client.list_collections(): + classifier = client.get_collection_classifier(collection["_id"]) + assert type(classifier) is dict + assert classifier["collection_id"] == collection["_id"] + assert classifier["pipeline_id"] is not None + +def test_get_classifier_status(): + client = common.login_with_test_user(common.client()) + + for collection in client.list_collections(): + classifier = client.get_collection_classifier(collection["_id"]) + status = client.get_classifier_status(classifier["_id"]) + _check_pipeline_status(status, classifier["_id"]) + +def _test_train_and_predict(collection_title): + client = common.login_with_test_user(common.client()) + + collection = common.get_collection(client, collection_title) + assert collection is not None + collection_id = collection["_id"] + assert collection_id is not None + labels = collection["labels"] + assert labels is not None and len(labels) > 0 + classifier_id = client.get_collection_classifier(collection_id)["_id"] + assert classifier_id is not None + first_document = client.get_collection_documents(collection_id, truncate=False)[0] + document_id = first_document["_id"] + document_text = first_document["text"] + assert document_text.startswith("Thousands of demonstrators have ") + + # train + train_job_data = client.classifier_train(classifier_id) + assert train_job_data is not None + assert "request" in train_job_data + assert isinstance(train_job_data["request"], dict) + assert "job_id" in train_job_data["request"] + train_job_id = train_job_data["request"]["job_id"] + assert train_job_id is not None + common.wait_for_job_to_finish(client, classifier_id, train_job_id, max_wait_seconds=120) + status = client.get_classifier_status(classifier_id) + _check_pipeline_status(status, classifier_id) + assert status["job_response"]["has_trained"] + + # predict from ID + prediction_job_data = client.classifier_predict(classifier_id, [document_id], []) + assert "job_response" in prediction_job_data and prediction_job_data["job_response"] is not None + docs_by_id = prediction_job_data["job_response"]["documents_by_id"] + texts = prediction_job_data["job_response"]["texts"] + assert docs_by_id.keys() == {document_id} + prediction_from_id = docs_by_id[document_id] + assert len(texts) == 0 + + # predict from text + prediction_job_data = client.classifier_predict(classifier_id, [], [document_text]) + assert "job_response" in prediction_job_data and prediction_job_data["job_response"] is not None + docs_by_id = prediction_job_data["job_response"]["documents_by_id"] + texts = prediction_job_data["job_response"]["texts"] + assert len(docs_by_id) == 0 + assert len(texts) == 1 + prediction_from_text = texts[0] + + # should be the same + assert prediction_from_id == prediction_from_text + + # make sure they're in the right format + assert isinstance(prediction_from_id, dict) + assert "doc" in prediction_from_id and "ner" in prediction_from_id + assert isinstance(prediction_from_id["doc"], list) + for pred in prediction_from_id["doc"]: + assert isinstance(pred, str) + assert pred in labels + assert isinstance(prediction_from_id["ner"], list) + for pred in prediction_from_id["ner"]: + assert isinstance(pred, list) and isinstance(pred[0], int) and isinstance(pred[1], int) and isinstance(pred[2], str) + assert pred[0] >= 0 and pred[1] > pred[0] + assert pred[2] in labels + + return prediction_from_id + +@pytest.mark.flaky(reruns=3) +def test_train_and_predict_spacy(): + prediction = _test_train_and_predict("Small Collection") + assert len(prediction["doc"]) == 0 + preds = prediction["ner"] + # unfortunately the spacy predictions are not the same across runs + # but there are some that seem to consistently be there + common_labels = {'gpe', 'org', 'geo', 'tim'} + common_tokens = [[48, 54], [111, 118], [633, 640], [717, 724], [754, 760], [833, 837], + [852, 858], [972, 976], [1025, 1029], [1200, 1209], [1221, 1225]] + for [s, e] in common_tokens: + found = False + for pred in preds: + if pred[0] == s and pred[1] == e: + if pred[2] not in common_labels: + print(common_labels, pred) + assert pred[2] in common_labels + found = True + break + if not found: + print([s, e], preds) + assert found + +def test_train_and_predict_opennlp(): + prediction = _test_train_and_predict("Small Collection OpenNLP") + assert len(prediction["doc"]) == 0 + preds = prediction["ner"] + assert preds == [[48, 54, 'geo'], [77, 81, 'geo'], [111, 118, 'gpe'], [255, 259, 'per'], + [343, 353, 'geo'], [368, 377, 'geo'], [524, 531, 'geo'], [542, 553, 'org'], + [570, 577, 'gpe'], [596, 604, 'geo'], [633, 640, 'gpe'], [665, 669, 'geo'], + [717, 724, 'gpe'], [754, 760, 'geo'], [833, 837, 'geo'], [840, 845, 'geo'], + [852, 858, 'geo'], [865, 899, 'org'], [934, 940, 'geo'], [941, 950, 'tim'], + [972, 976, 'gpe'], [1025, 1029, 'gpe'], [1089, 1096, 'geo'], [1113, 1120, 'gpe'], + [1200, 1209, 'tim'], [1221, 1225, 'org']] diff --git a/test/tests/pytest/common.py b/test/tests/pytest/common.py index 30bb4cf..e47edf7 100644 --- a/test/tests/pytest/common.py +++ b/test/tests/pytest/common.py @@ -3,6 +3,7 @@ import json import os import sys +import time import typing DIR = os.path.dirname(os.path.realpath(__file__)) @@ -47,6 +48,16 @@ def test_collection_data(title: str = None) -> typing.Union[dict, typing.List[di else: return collections +def test_pipeline_data(id_or_name: str = None) -> typing.Union[dict, typing.List[dict]]: + with open(os.path.join(TEST_DATA_DIR, "pipelines.json"), "r") as f: + pipelines = json.load(f) + if id_or_name: + for pipeline in pipelines: + if pipeline["_id"] == id_or_name or pipeline["name"].lower() == id_or_name.lower(): + return pipeline + else: + return pipelines + def login_with_user(user_id_or_email: str, client: pine.client.LocalPineClient) -> pine.client.LocalPineClient: user = test_user_data(user_id_or_email) assert client.is_logged_in() == False @@ -58,8 +69,21 @@ def login_with_user(user_id_or_email: str, client: pine.client.LocalPineClient) def login_with_test_user(client: pine.client.LocalPineClient) -> pine.client.LocalPineClient: return login_with_user(TEST_USER, client) -def get_collection_id(client, collection_title: str) -> str: +def get_collection(client, collection_title: str) -> dict: for col in client.list_collections(): if col["metadata"]["title"] == collection_title: - return col["_id"] + return col raise AssertionError("Couldn't find collection with title " + collection_title) + +def get_collection_id(client, collection_title: str) -> str: + return get_collection(client, collection_title)["_id"] + +def wait_for_job_to_finish(client: pine.client.LocalPineClient, classifier_id: str, job_id: str, max_wait_seconds = 60): + retry_sleep_s = 5 + slept_seconds = 0 + running_jobs = client.get_classifier_running_jobs(classifier_id) + while job_id in running_jobs and slept_seconds < max_wait_seconds: + time.sleep(retry_sleep_s) + slept_seconds += retry_sleep_s + running_jobs = client.get_classifier_running_jobs(classifier_id) + assert job_id not in running_jobs # timeout diff --git a/update_openapi.sh b/update_openapi.sh new file mode 100755 index 0000000..e33cb87 --- /dev/null +++ b/update_openapi.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# (C) 2021 The Johns Hopkins University Applied Physics Laboratory LLC. + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +# Find all blueprint-specs. +BP_SPECS=$(cd backend/pine/backend && find . -name 'openapi.yaml' | grep -v './api/openapi.yaml' | sort | awk '{print "/local/" $0}') + +set -ex + +# Join them into one. +docker run --rm \ + -v "${DIR}/backend/pine/backend:/local:rw" \ + -w /local/api \ + redocly/openapi-cli join \ + /local/api/base.yaml \ + ${BP_SPECS} + +# Dereference and lint. +docker run --rm -v "${DIR}/backend/pine/backend:/local:rw" redocly/openapi-cli bundle \ + --lint \ + --dereferenced \ + --output /local/api/openapi.yaml \ + /local/api/openapi.yaml + +# docker run --rm -v "${DIR}/backend/pine/backend:/local:rw" openapitools/openapi-generator-cli generate \ +# -g openapi-yaml \ +# -i /local/api/openapi.yaml -o /local/api \ +# --additional-properties outputFile=openapi.yaml \ +# $@ + +sed -i '1i # (C) 2021 The Johns Hopkins University Applied Physics Laboratory LLC.\n' ${DIR}/backend/pine/backend/api/openapi.yaml \ No newline at end of file

FEi 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 aPnOxlCGmhr(Kxwyxp`4(X{D5;QU4!Z;Ecfl diff --git a/docs/build/latex/pine.tex b/docs/build/latex/pine.tex index a562fa6..ce5bf10 100644 --- a/docs/build/latex/pine.tex +++ b/docs/build/latex/pine.tex @@ -74,7 +74,7 @@ \title{pine} -\date{Jul 12, 2021} +\date{Aug 04, 2021} \release{} \author{JHU/APL} \newcommand{\sphinxlogo}{\vbox{}} @@ -597,6 +597,109 @@ request to create a new entry. +\subparagraph{\sphinxstyleliteralintitle{\sphinxupquote{pine.backend.api}}} +\label{\detokenize{autoapi/pine/backend/api/index:module-pine.backend.api}}\label{\detokenize{autoapi/pine/backend/api/index:pine-backend-api}}\label{\detokenize{autoapi/pine/backend/api/index::doc}}\index{module@\spxentry{module}!pine.backend.api@\spxentry{pine.backend.api}}\index{pine.backend.api@\spxentry{pine.backend.api}!module@\spxentry{module}} +\sphinxAtStartPar +This module implements all methods required for SwaggerUI to run on the +backend of PINE. + + +\subparagraph{Submodules} +\label{\detokenize{autoapi/pine/backend/api/index:submodules}} + +\subparagraph{\sphinxstyleliteralintitle{\sphinxupquote{pine.backend.api.bp}}} +\label{\detokenize{autoapi/pine/backend/api/bp/index:module-pine.backend.api.bp}}\label{\detokenize{autoapi/pine/backend/api/bp/index:pine-backend-api-bp}}\label{\detokenize{autoapi/pine/backend/api/bp/index::doc}}\index{module@\spxentry{module}!pine.backend.api.bp@\spxentry{pine.backend.api.bp}}\index{pine.backend.api.bp@\spxentry{pine.backend.api.bp}!module@\spxentry{module}} + +\subparagraph{Module Contents} +\label{\detokenize{autoapi/pine/backend/api/bp/index:module-contents}} + +\subparagraph{Functions} +\label{\detokenize{autoapi/pine/backend/api/bp/index:functions}} + +\begin{savenotes}\sphinxatlongtablestart\begin{longtable}[c]{\X{1}{2}\X{1}{2}} +\hline + +\endfirsthead + +\multicolumn{2}{c}% +{\makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}}\\ +\hline + +\endhead + +\hline +\multicolumn{2}{r}{\makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}}\\ +\endfoot + +\endlastfoot + +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.openapi_spec}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{openapi\_spec}}}}}() +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.swagger_ui_index}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{swagger\_ui\_index}}}}}() +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.swagger_ui}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{swagger\_ui}}}}}(file: str) +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.init_app}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{init\_app}}}}}(app) +& +\sphinxAtStartPar + +\\ +\hline +\end{longtable}\sphinxatlongtableend\end{savenotes} +\index{bp (in module pine.backend.api.bp)@\spxentry{bp}\spxextra{in module pine.backend.api.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.bp}}\pysigline{\sphinxcode{\sphinxupquote{pine.backend.api.bp.}}\sphinxbfcode{\sphinxupquote{bp}}} +\end{fulllineitems} + +\index{LOGGER (in module pine.backend.api.bp)@\spxentry{LOGGER}\spxextra{in module pine.backend.api.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.LOGGER}}\pysigline{\sphinxcode{\sphinxupquote{pine.backend.api.bp.}}\sphinxbfcode{\sphinxupquote{LOGGER}}} +\end{fulllineitems} + +\index{openapi\_spec() (in module pine.backend.api.bp)@\spxentry{openapi\_spec()}\spxextra{in module pine.backend.api.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.openapi_spec}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.api.bp.}}\sphinxbfcode{\sphinxupquote{openapi\_spec}}}{}{} +\end{fulllineitems} + +\index{swagger\_ui\_index() (in module pine.backend.api.bp)@\spxentry{swagger\_ui\_index()}\spxextra{in module pine.backend.api.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.swagger_ui_index}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.api.bp.}}\sphinxbfcode{\sphinxupquote{swagger\_ui\_index}}}{}{} +\end{fulllineitems} + +\index{swagger\_ui() (in module pine.backend.api.bp)@\spxentry{swagger\_ui()}\spxextra{in module pine.backend.api.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.swagger_ui}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.api.bp.}}\sphinxbfcode{\sphinxupquote{swagger\_ui}}}{\emph{\DUrole{n}{file}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\end{fulllineitems} + +\index{init\_app() (in module pine.backend.api.bp)@\spxentry{init\_app()}\spxextra{in module pine.backend.api.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/api/bp/index:pine.backend.api.bp.init_app}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.api.bp.}}\sphinxbfcode{\sphinxupquote{init\_app}}}{\emph{\DUrole{n}{app}}}{} +\end{fulllineitems} + + + \subparagraph{\sphinxstyleliteralintitle{\sphinxupquote{pine.backend.auth}}} \label{\detokenize{autoapi/pine/backend/auth/index:module-pine.backend.auth}}\label{\detokenize{autoapi/pine/backend/auth/index:pine-backend-auth}}\label{\detokenize{autoapi/pine/backend/auth/index::doc}}\index{module@\spxentry{module}!pine.backend.auth@\spxentry{pine.backend.auth}}\index{pine.backend.auth@\spxentry{pine.backend.auth}!module@\spxentry{module}} @@ -1535,7 +1638,7 @@ Return the collection object for the collection matching the provided collection \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/collections/bp/index:pine.backend.collections.bp.get_overlap_ids}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_overlap\_ids}}}}}(collection\_id) +{\hyperref[\detokenize{autoapi/pine/backend/collections/bp/index:pine.backend.collections.bp.get_overlap_ids}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_overlap\_ids}}}}}(collection\_id: str) & \sphinxAtStartPar Return the list of ids for overlapping documents for the collection matching the provided collection id. @@ -1804,7 +1907,7 @@ Return the collection object for the collection matching the provided collection \index{get\_overlap\_ids() (in module pine.backend.collections.bp)@\spxentry{get\_overlap\_ids()}\spxextra{in module pine.backend.collections.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/collections/bp/index:pine.backend.collections.bp.get_overlap_ids}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.collections.bp.}}\sphinxbfcode{\sphinxupquote{get\_overlap\_ids}}}{\emph{\DUrole{n}{collection\_id}}}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/collections/bp/index:pine.backend.collections.bp.get_overlap_ids}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.collections.bp.}}\sphinxbfcode{\sphinxupquote{get\_overlap\_ids}}}{\emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} \sphinxAtStartPar Return the list of ids for overlapping documents for the collection matching the provided collection id. :param collection\_id: str @@ -1971,6 +2074,13 @@ A collection can also be created with a number of images through FILES fields & \sphinxAtStartPar +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/collections/index:pine.backend.collections.get_overlap_ids}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_overlap\_ids}}}}}(collection\_id: str) +& +\sphinxAtStartPar +Return the list of ids for overlapping documents for the collection matching the provided collection id. \\ \hline \end{longtable}\sphinxatlongtableend\end{savenotes} @@ -1998,6 +2108,17 @@ A collection can also be created with a number of images through FILES fields \phantomsection\label{\detokenize{autoapi/pine/backend/collections/index:pine.backend.collections.get_user_permissions_by_ids}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.collections.}}\sphinxbfcode{\sphinxupquote{get\_user\_permissions\_by\_ids}}}{\emph{\DUrole{n}{collection\_ids}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}models.CollectionUserPermissions\DUrole{p}{{]}}}} \end{fulllineitems} +\index{get\_overlap\_ids() (in module pine.backend.collections)@\spxentry{get\_overlap\_ids()}\spxextra{in module pine.backend.collections}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/collections/index:pine.backend.collections.get_overlap_ids}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.collections.}}\sphinxbfcode{\sphinxupquote{get\_overlap\_ids}}}{\emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\sphinxAtStartPar +Return the list of ids for overlapping documents for the collection matching the provided collection id. +:param collection\_id: str +:return: tuple + +\end{fulllineitems} + \subparagraph{\sphinxstyleliteralintitle{\sphinxupquote{pine.backend.data}}} @@ -3291,6 +3412,13 @@ calling … with all the default options. \endlastfoot +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceJob}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{ServiceJob}}}}} +& +\sphinxAtStartPar +Data class for a service job. +\\ +\hline \sphinxAtStartPar {\hyperref[\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{ServiceManager}}}}} & @@ -3317,6 +3445,38 @@ callable \phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.logger}}\pysigline{\sphinxcode{\sphinxupquote{pine.backend.job\_manager.service.}}\sphinxbfcode{\sphinxupquote{logger}}} \end{fulllineitems} +\index{ServiceJob (class in pine.backend.job\_manager.service)@\spxentry{ServiceJob}\spxextra{class in pine.backend.job\_manager.service}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceJob}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{pine.backend.job\_manager.service.}}\sphinxbfcode{\sphinxupquote{ServiceJob}}}{\emph{\DUrole{n}{job\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{request\_body}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}}, \emph{\DUrole{n}{request\_response}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}}}{} +\sphinxAtStartPar +Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sphinxcode{\sphinxupquote{object}}} + +\sphinxAtStartPar +Data class for a service job. + +\sphinxAtStartPar +“Constructor. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{job\_id}} \textendash{} str: job ID + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{request\_body}} \textendash{} dict: job request body + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{request\_response}} \textendash{} dict: job request response + +\end{itemize} + +\end{description}\end{quote} + +\end{fulllineitems} + \index{ServiceManager (class in pine.backend.job\_manager.service)@\spxentry{ServiceManager}\spxextra{class in pine.backend.job\_manager.service}} \begin{fulllineitems} @@ -3451,6 +3611,18 @@ Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sp \phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager.reserved_channels}}\pysigline{\sphinxbfcode{\sphinxupquote{reserved\_channels}}} \end{fulllineitems} +\index{get\_results\_key() (pine.backend.job\_manager.service.ServiceManager class method)@\spxentry{get\_results\_key()}\spxextra{pine.backend.job\_manager.service.ServiceManager class method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager.get_results_key}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{get\_results\_key}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{service\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{job\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}} +\end{fulllineitems} + +\index{get\_running\_jobs\_key() (pine.backend.job\_manager.service.ServiceManager class method)@\spxentry{get\_running\_jobs\_key()}\spxextra{pine.backend.job\_manager.service.ServiceManager class method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager.get_running_jobs_key}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{get\_running\_jobs\_key}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{service\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}} +\end{fulllineitems} + \index{get\_registered\_channels() (pine.backend.job\_manager.service.ServiceManager class method)@\spxentry{get\_registered\_channels()}\spxextra{pine.backend.job\_manager.service.ServiceManager class method}} \begin{fulllineitems} @@ -3484,10 +3656,22 @@ Get list of registered services and registration body if requested. \end{fulllineitems} +\index{\_get\_service\_details() (pine.backend.job\_manager.service.ServiceManager class method)@\spxentry{\_get\_service\_details()}\spxextra{pine.backend.job\_manager.service.ServiceManager class method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager._get_service_details}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{\_get\_service\_details}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{service\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{retry\_count}\DUrole{o}{=}\DUrole{default_value}{10}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + +\index{\_get\_service\_channel() (pine.backend.job\_manager.service.ServiceManager class method)@\spxentry{\_get\_service\_channel()}\spxextra{pine.backend.job\_manager.service.ServiceManager class method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager._get_service_channel}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{\_get\_service\_channel}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{service\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}} +\end{fulllineitems} + \index{send\_service\_request() (pine.backend.job\_manager.service.ServiceManager class method)@\spxentry{send\_service\_request()}\spxextra{pine.backend.job\_manager.service.ServiceManager class method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager.send_service_request}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{send\_service\_request}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{service\_name}}, \emph{\DUrole{n}{data}}, \emph{\DUrole{n}{job\_id}\DUrole{o}{=}\DUrole{default_value}{None}}, \emph{\DUrole{n}{encoder}\DUrole{o}{=}\DUrole{default_value}{None}}}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager.send_service_request}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{send\_service\_request}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{service\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{data}}, \emph{\DUrole{n}{job\_id}\DUrole{o}{=}\DUrole{default_value}{None}}, \emph{\DUrole{n}{encoder}\DUrole{o}{=}\DUrole{default_value}{None}}}{} \sphinxAtStartPar Queue’s a job for the requested service. :type service\_name: str @@ -3498,6 +3682,45 @@ Queue’s a job for the requested service. \end{fulllineitems} +\index{get\_job\_response() (pine.backend.job\_manager.service.ServiceManager class method)@\spxentry{get\_job\_response()}\spxextra{pine.backend.job\_manager.service.ServiceManager class method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager.get_job_response}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{get\_job\_response}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{service\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{job\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{timeout\_in\_s}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}}}}{} +\sphinxAtStartPar +Waits for a response for the given job and returns it. +:param service\_name: str: service name +:param job\_id: str: job ID +:param timeout\_in\_s: int: wait timeout in seconds +:rtype None | dict + +\end{fulllineitems} + +\index{send\_service\_request\_and\_get\_response() (pine.backend.job\_manager.service.ServiceManager class method)@\spxentry{send\_service\_request\_and\_get\_response()}\spxextra{pine.backend.job\_manager.service.ServiceManager class method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager.send_service_request_and_get_response}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{send\_service\_request\_and\_get\_response}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{service\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{data}}, \emph{\DUrole{n}{timeout\_in\_s}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}}}, \emph{\DUrole{n}{job\_id}\DUrole{o}{=}\DUrole{default_value}{None}}, \emph{\DUrole{n}{encoder}\DUrole{o}{=}\DUrole{default_value}{None}}}{{ $\rightarrow$ {\hyperref[\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceJob}]{\sphinxcrossref{pine.backend.job\_manager.service.ServiceJob}}}}} +\sphinxAtStartPar +Sends a service requests, waits for a response, and returns job data. +:param service\_name: str: service name +:param data: job data +:param timeout\_in\_s: int: wait timeout in seconds +:param job\_id: str: optional job ID (or None to auto\sphinxhyphen{}generate one) +:param encoder: optional JSON encoder for job data +:rtype None | ServiceJob + +\end{fulllineitems} + +\index{get\_running\_jobs() (pine.backend.job\_manager.service.ServiceManager class method)@\spxentry{get\_running\_jobs()}\spxextra{pine.backend.job\_manager.service.ServiceManager class method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/job_manager/service/index:pine.backend.job_manager.service.ServiceManager.get_running_jobs}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{get\_running\_jobs}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{service\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}} +\sphinxAtStartPar +Returns running jobs. +:param service\_name: str: service name +:rtype list{[}str{]} + +\end{fulllineitems} + \index{start\_listeners() (pine.backend.job\_manager.service.ServiceManager method)@\spxentry{start\_listeners()}\spxextra{pine.backend.job\_manager.service.ServiceManager method}} \begin{fulllineitems} @@ -4744,6 +4967,62 @@ annotations. Boundary errors for adjacent annotations with the same label are ig \endlastfoot +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_classifier}}}}}(classifier\_id: str) \(\rightarrow\) dict +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._clear_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_clear\_classifier}}}}}(classifier\_id: str) +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier_pipeline}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_classifier\_pipeline}}}}}(classifier\_id: str) \(\rightarrow\) dict +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._check_permissions}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_check\_permissions}}}}}(classifier: dict) +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_pipeline_status}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_pipeline\_status}}}}}(pipeline: str, classifier\_id: str) \(\rightarrow\) dict +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_pipeline_running_jobs}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_pipeline\_running\_jobs}}}}}(pipeline: str, classifier\_id: str) \(\rightarrow\) List{[}str{]} +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._train_pipeline}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_train\_pipeline}}}}}(pipeline: str, classifier\_id: str, model\_name: str) \(\rightarrow\) dict +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._predict_pipeline}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_predict\_pipeline}}}}}(pipeline: str, classifier\_id: str, document\_ids: List{[}str{]}, texts: List{[}str{]}, timeout\_in\_s: int) \(\rightarrow\) dict +& +\sphinxAtStartPar + +\\ +\hline \sphinxAtStartPar {\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_pipelines}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_pipelines}}}}}() & @@ -4752,84 +5031,98 @@ annotations. Boundary errors for adjacent annotations with the same label are ig \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_pipeline_by_id}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_pipeline\_by\_id}}}}}(pipeline\_id) +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_pipeline_by_id}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_pipeline\_by\_id}}}}}(pipeline\_id: str) & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_collection_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_collection\_classifier}}}}}(collection\_id) +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_pipeline_status}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_pipeline\_status}}}}}(pipeline\_id: str) \(\rightarrow\) flask.Response & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_collection_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_collection\_classifier}}}}}(collection\_id) +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier_metrics}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_classifier\_metrics}}}}}(classifier\_id: str) & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier_metrics}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_classifier\_metrics}}}}}(classifier\_id) +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_classifier_metrics}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_classifier\_metrics}}}}}(classifier\_id: str) & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_metrics}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_metrics}}}}}() +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_collection_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_collection\_classifier}}}}}(collection\_id: str) \(\rightarrow\) dict & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_classifier_metrics}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_classifier\_metrics}}}}}(classifier\_id) +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_collection_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_collection\_classifier}}}}}(collection\_id: str) & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_classifier}}}}}(classifier\_id) +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_classifier_status}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_classifier\_status}}}}}(classifier\_id: str) & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_next_instance}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_next\_instance}}}}}(classifier\_id) +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_running_jobs}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_running\_jobs}}}}}(classifier\_id: str) & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_next_by_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_next\_by\_classifier}}}}}(classifier\_id) +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.train}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{train}}}}}(classifier\_id: str) & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.advance_to_next_document_by_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{advance\_to\_next\_document\_by\_classifier}}}}}(classifier\_id, document\_id) +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.predict}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{predict}}}}}(classifier\_id: str) & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.predict}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{predict}}}}}() +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_next_instance}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_get\_next\_instance}}}}}(classifier\_id: str) & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.test_redis}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{test\_redis}}}}}() +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._check_instance_overlap}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{\_check\_instance\_overlap}}}}}(classifier: dict, instance: dict, user\_id: str) +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_next_by_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_next\_by\_classifier}}}}}(classifier\_id: str) +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.advance_to_next_document_by_classifier}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{advance\_to\_next\_document\_by\_classifier}}}}}(classifier\_id: str, document\_id: str) & \sphinxAtStartPar @@ -4861,16 +5154,64 @@ annotations. Boundary errors for adjacent annotations with the same label are ig \phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.bp}}\pysigline{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{bp}}} \end{fulllineitems} -\index{classifier\_dict (in module pine.backend.pipelines.bp)@\spxentry{classifier\_dict}\spxextra{in module pine.backend.pipelines.bp}} +\index{\_cached\_classifiers (in module pine.backend.pipelines.bp)@\spxentry{\_cached\_classifiers}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.classifier_dict}}\pysigline{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{classifier\_dict}}} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._cached_classifiers}}\pysigline{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_cached\_classifiers}}} \end{fulllineitems} -\index{classifier\_pipelines (in module pine.backend.pipelines.bp)@\spxentry{classifier\_pipelines}\spxextra{in module pine.backend.pipelines.bp}} +\index{\_cached\_classifier\_pipelines (in module pine.backend.pipelines.bp)@\spxentry{\_cached\_classifier\_pipelines}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.classifier_pipelines}}\pysigline{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{classifier\_pipelines}}} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._cached_classifier_pipelines}}\pysigline{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_cached\_classifier\_pipelines}}} +\end{fulllineitems} + +\index{\_get\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_classifier}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + +\index{\_clear\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{\_clear\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._clear_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_clear\_classifier}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\end{fulllineitems} + +\index{\_get\_classifier\_pipeline() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_classifier\_pipeline()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier_pipeline}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_classifier\_pipeline}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + +\index{\_check\_permissions() (in module pine.backend.pipelines.bp)@\spxentry{\_check\_permissions()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._check_permissions}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_check\_permissions}}}{\emph{\DUrole{n}{classifier}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}}}{} +\end{fulllineitems} + +\index{\_get\_pipeline\_status() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_pipeline\_status()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_pipeline_status}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_pipeline\_status}}}{\emph{\DUrole{n}{pipeline}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + +\index{\_get\_pipeline\_running\_jobs() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_pipeline\_running\_jobs()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_pipeline_running_jobs}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_pipeline\_running\_jobs}}}{\emph{\DUrole{n}{pipeline}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}} +\end{fulllineitems} + +\index{\_train\_pipeline() (in module pine.backend.pipelines.bp)@\spxentry{\_train\_pipeline()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._train_pipeline}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_train\_pipeline}}}{\emph{\DUrole{n}{pipeline}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{model\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + +\index{\_predict\_pipeline() (in module pine.backend.pipelines.bp)@\spxentry{\_predict\_pipeline()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._predict_pipeline}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_predict\_pipeline}}}{\emph{\DUrole{n}{pipeline}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{texts}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{timeout\_in\_s}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} \end{fulllineitems} \index{get\_pipelines() (in module pine.backend.pipelines.bp)@\spxentry{get\_pipelines()}\spxextra{in module pine.backend.pipelines.bp}} @@ -4882,73 +5223,85 @@ annotations. Boundary errors for adjacent annotations with the same label are ig \index{get\_pipeline\_by\_id() (in module pine.backend.pipelines.bp)@\spxentry{get\_pipeline\_by\_id()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_pipeline_by_id}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_pipeline\_by\_id}}}{\emph{\DUrole{n}{pipeline\_id}}}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_pipeline_by_id}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_pipeline\_by\_id}}}{\emph{\DUrole{n}{pipeline\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} \end{fulllineitems} -\index{\_get\_collection\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_collection\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} +\index{get\_pipeline\_status() (in module pine.backend.pipelines.bp)@\spxentry{get\_pipeline\_status()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_collection_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_collection\_classifier}}}{\emph{\DUrole{n}{collection\_id}}}{} -\end{fulllineitems} - -\index{get\_collection\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{get\_collection\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} - -\begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_collection_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_collection\_classifier}}}{\emph{\DUrole{n}{collection\_id}}}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_pipeline_status}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_pipeline\_status}}}{\emph{\DUrole{n}{pipeline\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://flask.palletsprojects.com/en/1.1.x/api/\#flask.Response}{flask.Response}}} \end{fulllineitems} \index{\_get\_classifier\_metrics() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_classifier\_metrics()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier_metrics}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_classifier\_metrics}}}{\emph{\DUrole{n}{classifier\_id}}}{} -\end{fulllineitems} - -\index{get\_metrics() (in module pine.backend.pipelines.bp)@\spxentry{get\_metrics()}\spxextra{in module pine.backend.pipelines.bp}} - -\begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_metrics}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_metrics}}}{}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier_metrics}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_classifier\_metrics}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} \end{fulllineitems} \index{get\_classifier\_metrics() (in module pine.backend.pipelines.bp)@\spxentry{get\_classifier\_metrics()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_classifier_metrics}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_classifier\_metrics}}}{\emph{\DUrole{n}{classifier\_id}}}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_classifier_metrics}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_classifier\_metrics}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} \end{fulllineitems} -\index{\_get\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} +\index{\_get\_collection\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_collection\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_classifier}}}{\emph{\DUrole{n}{classifier\_id}}}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_collection_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_collection\_classifier}}}{\emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} \end{fulllineitems} -\index{\_get\_next\_instance() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_next\_instance()}\spxextra{in module pine.backend.pipelines.bp}} +\index{get\_collection\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{get\_collection\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_next_instance}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_next\_instance}}}{\emph{\DUrole{n}{classifier\_id}}}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_collection_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_collection\_classifier}}}{\emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} \end{fulllineitems} -\index{get\_next\_by\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{get\_next\_by\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} +\index{get\_classifier\_status() (in module pine.backend.pipelines.bp)@\spxentry{get\_classifier\_status()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_next_by_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_next\_by\_classifier}}}{\emph{\DUrole{n}{classifier\_id}}}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_classifier_status}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_classifier\_status}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} \end{fulllineitems} -\index{advance\_to\_next\_document\_by\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{advance\_to\_next\_document\_by\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} +\index{get\_running\_jobs() (in module pine.backend.pipelines.bp)@\spxentry{get\_running\_jobs()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.advance_to_next_document_by_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{advance\_to\_next\_document\_by\_classifier}}}{\emph{\DUrole{n}{classifier\_id}}, \emph{\DUrole{n}{document\_id}}}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_running_jobs}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_running\_jobs}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\end{fulllineitems} + +\index{train() (in module pine.backend.pipelines.bp)@\spxentry{train()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.train}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{train}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} \end{fulllineitems} \index{predict() (in module pine.backend.pipelines.bp)@\spxentry{predict()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.predict}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{predict}}}{}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.predict}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} \end{fulllineitems} -\index{test\_redis() (in module pine.backend.pipelines.bp)@\spxentry{test\_redis()}\spxextra{in module pine.backend.pipelines.bp}} +\index{\_get\_next\_instance() (in module pine.backend.pipelines.bp)@\spxentry{\_get\_next\_instance()}\spxextra{in module pine.backend.pipelines.bp}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.test_redis}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{test\_redis}}}{}{} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._get_next_instance}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_get\_next\_instance}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\end{fulllineitems} + +\index{\_check\_instance\_overlap() (in module pine.backend.pipelines.bp)@\spxentry{\_check\_instance\_overlap()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp._check_instance_overlap}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{\_check\_instance\_overlap}}}{\emph{\DUrole{n}{classifier}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}}, \emph{\DUrole{n}{instance}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}}, \emph{\DUrole{n}{user\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\end{fulllineitems} + +\index{get\_next\_by\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{get\_next\_by\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.get_next_by_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{get\_next\_by\_classifier}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\end{fulllineitems} + +\index{advance\_to\_next\_document\_by\_classifier() (in module pine.backend.pipelines.bp)@\spxentry{advance\_to\_next\_document\_by\_classifier()}\spxextra{in module pine.backend.pipelines.bp}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/backend/pipelines/bp/index:pine.backend.pipelines.bp.advance_to_next_document_by_classifier}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.backend.pipelines.bp.}}\sphinxbfcode{\sphinxupquote{advance\_to\_next\_document\_by\_classifier}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{document\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} \end{fulllineitems} \index{init\_app() (in module pine.backend.pipelines.bp)@\spxentry{init\_app()}\spxextra{in module pine.backend.pipelines.bp}} @@ -7502,6 +7855,29 @@ all pipelines accessible to logged in user \end{fulllineitems} +\index{get\_pipeline\_status() (pine.client.client.PineClient method)@\spxentry{get\_pipeline\_status()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.get_pipeline_status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_pipeline\_status}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{pipeline\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Returns status for the given pipeline. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{pipeline\_id}} \textendash{} str: pipeline ID + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +pipeline status + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + \index{collection\_builder() (pine.client.client.PineClient method)@\spxentry{collection\_builder()}\spxextra{pine.client.client.PineClient method}} \begin{fulllineitems} @@ -7563,6 +7939,36 @@ the created collection’s ID \end{fulllineitems} +\index{archive\_collection() (pine.client.client.PineClient method)@\spxentry{archive\_collection()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.archive_collection}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{archive\_collection}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{archive}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#bool}{bool}} \DUrole{o}{=} \DUrole{default_value}{True}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Archives or unarchives the given collection. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{collection\_id}} \textendash{} str: the ID of the collection + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{archive}} \textendash{} bool: whether to archive (True) or unarchive (False) the collection + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +updated collection information + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + \index{get\_collection\_permissions() (pine.client.client.PineClient method)@\spxentry{get\_collection\_permissions()}\spxextra{pine.client.client.PineClient method}} \begin{fulllineitems} @@ -7620,6 +8026,91 @@ all the documents in the given collection \end{fulllineitems} +\index{get\_collection\_classifier() (pine.client.client.PineClient method)@\spxentry{get\_collection\_classifier()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.get_collection_classifier}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_collection\_classifier}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Returns the classifier associated with the given collection. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{collection\_id}} (\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{\sphinxstyleliteralemphasis{\sphinxupquote{str}}}) \textendash{} the ID of the collection + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the classifier associated with the given collection + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{get\_next\_document() (pine.client.client.PineClient method)@\spxentry{get\_next\_document()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.get_next_document}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_next\_document}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}} +\sphinxAtStartPar +Returns the ‘next’ document associated with the given classifier. + +\sphinxAtStartPar +The next document is the one that the model suggests should be annotated by the logged\sphinxhyphen{}in +user next. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: ID of the classifier + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the next document ID, or None if there are none left to annotate + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{advance\_next\_document() (pine.client.client.PineClient method)@\spxentry{advance\_next\_document()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.advance_next_document}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{advance\_next\_document}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{document\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Advances the ‘next’ document associated with the given classifier by marking the +given document as annotated. + +\sphinxAtStartPar +The next document is the one that the model suggests should be annotated by the logged\sphinxhyphen{}in +user next. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: ID of the classifier + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{document\_id}} \textendash{} str: the ID of the document that was annotated + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +information on the advanced instance + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + \index{add\_document() (pine.client.client.PineClient method)@\spxentry{add\_document()}\spxextra{pine.client.client.PineClient method}} \begin{fulllineitems} @@ -7896,6 +8387,82 @@ the annotation IDs \end{fulllineitems} +\index{get\_my\_document\_annotations() (pine.client.client.PineClient method)@\spxentry{get\_my\_document\_annotations()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.get_my_document_annotations}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_my\_document\_annotations}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{document\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}\DUrole{p}{{]}}\DUrole{p}{{]}}}} +\sphinxAtStartPar +Returns annotations for the given document for the logged in user. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{document\_id}} \textendash{} the ID of the document to get annotations for + +\item[{Raises}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientValueException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientValueException}}}}} \textendash{} if the document ID is not a valid string + +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientAuthException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientAuthException}}}}} \textendash{} if not logged in + +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientHttpException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientHttpException}}}}} \textendash{} if the HTTP request returns an error + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the annotations for the given document for the logged in user + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}(\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}(\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict})) + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{get\_others\_document\_annotations() (pine.client.client.PineClient method)@\spxentry{get\_others\_document\_annotations()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.get_others_document_annotations}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_others\_document\_annotations}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{document\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}List\DUrole{p}{{]}}}} +\sphinxAtStartPar +Returns annotations for the given document for users other than the logged in user. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{document\_id}} \textendash{} the ID of the document to get annotations for + +\item[{Raises}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientValueException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientValueException}}}}} \textendash{} if the document ID is not a valid string + +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientAuthException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientAuthException}}}}} \textendash{} if not logged in + +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientHttpException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientHttpException}}}}} \textendash{} if the HTTP request returns an error + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the annotations for the given document for users other than the logged in user + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}(\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}(\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict})) + +\end{description}\end{quote} + +\end{fulllineitems} + \index{list\_collections() (pine.client.client.PineClient method)@\spxentry{list\_collections()}\spxextra{pine.client.client.PineClient method}} \begin{fulllineitems} @@ -7930,6 +8497,29 @@ user’s collections \end{fulllineitems} +\index{get\_collection() (pine.client.client.PineClient method)@\spxentry{get\_collection()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.get_collection}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_collection}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Returns the collection with the given ID. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{collection\_id}} \textendash{} str: the ID of the collection + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the collection data + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + \index{get\_collection\_iaa\_report() (pine.client.client.PineClient method)@\spxentry{get\_collection\_iaa\_report()}\spxextra{pine.client.client.PineClient method}} \begin{fulllineitems} @@ -8020,6 +8610,144 @@ collection data \end{fulllineitems} +\index{get\_classifier\_status() (pine.client.client.PineClient method)@\spxentry{get\_classifier\_status()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.get_classifier_status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_classifier\_status}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Returns the status for the given classifier. +\begin{quote}\begin{description} +\item[{Param}] \leavevmode +\sphinxAtStartPar +classifier\_id: str: classifier ID + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +status for the given classifier + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{classifier\_train() (pine.client.client.PineClient method)@\spxentry{classifier\_train()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.classifier_train}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classifier\_train}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{model\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}} \DUrole{o}{=} \DUrole{default_value}{\textquotesingle{}auto\sphinxhyphen{}trained\textquotesingle{}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Trains the given classifier (using collection documents). + +\sphinxAtStartPar +Note that training is done asynchronously, so this method should return very quickly. One +of the things returned in the dict will be a job ID. If you want to know when the training +has finished, you can periodically poll {\hyperref[\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.get_classifier_running_jobs}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_classifier\_running\_jobs()}}}}} and check +for that job ID. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: classifier ID + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{model\_name}} \textendash{} str: name of model corresponding to filename on disk, defaults to +\sphinxcode{\sphinxupquote{"auto\sphinxhyphen{}trained"}} which is the same as the annotation\sphinxhyphen{}based +model training + +\end{itemize} + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{classifier\_has\_trained() (pine.client.client.PineClient method)@\spxentry{classifier\_has\_trained()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.classifier_has_trained}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classifier\_has\_trained}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/functions.html\#bool}{bool}}} +\sphinxAtStartPar +Returns whether the given classifier has been trained or not. + +\sphinxAtStartPar +If False, future calls to predict will fail. +\begin{quote}\begin{description} +\item[{Param}] \leavevmode +\sphinxAtStartPar +classifier\_id: str: classifier ID + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/functions.html\#bool}{bool} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{classifier\_predict() (pine.client.client.PineClient method)@\spxentry{classifier\_predict()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.classifier_predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classifier\_predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}}, \emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{texts}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{timeout\_in\_s}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}} \DUrole{o}{=} \DUrole{default_value}{36000}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Runs classifier prediction on the given documents. At least one of document\_ids and +texts must be non\sphinxhyphen{}empty. + +\sphinxAtStartPar +This prediction uses the last\sphinxhyphen{}trained model name for that classifier. This method will +block until the prediction has finished and then return the results. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: classifier ID + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{document\_ids}} \textendash{} list{[}str{]}: a list of document IDs to run prediction on + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{texts}} \textendash{} list{[}str{]}: a list of direct document texts to run prediction on + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{timeout\_in\_s}} \textendash{} int: max timeout in seconds before erroring out and returning, defaults +to \sphinxcode{\sphinxupquote{36000}} + +\end{itemize} + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{get\_classifier\_running\_jobs() (pine.client.client.PineClient method)@\spxentry{get\_classifier\_running\_jobs()}\spxextra{pine.client.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/client/index:pine.client.client.PineClient.get_classifier_running_jobs}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_classifier\_running\_jobs}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}} +\sphinxAtStartPar +Gets the list of running job IDs for the given classifier. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: classifier ID + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}{[}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}{]} + +\end{description}\end{quote} + +\end{fulllineitems} + \end{fulllineitems} @@ -10502,6 +11230,29 @@ all pipelines accessible to logged in user \end{fulllineitems} +\index{get\_pipeline\_status() (pine.client.PineClient method)@\spxentry{get\_pipeline\_status()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.get_pipeline_status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_pipeline\_status}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{pipeline\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Returns status for the given pipeline. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{pipeline\_id}} \textendash{} str: pipeline ID + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +pipeline status + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + \index{collection\_builder() (pine.client.PineClient method)@\spxentry{collection\_builder()}\spxextra{pine.client.PineClient method}} \begin{fulllineitems} @@ -10563,6 +11314,36 @@ the created collection’s ID \end{fulllineitems} +\index{archive\_collection() (pine.client.PineClient method)@\spxentry{archive\_collection()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.archive_collection}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{archive\_collection}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{archive}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#bool}{bool}} \DUrole{o}{=} \DUrole{default_value}{True}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Archives or unarchives the given collection. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{collection\_id}} \textendash{} str: the ID of the collection + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{archive}} \textendash{} bool: whether to archive (True) or unarchive (False) the collection + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +updated collection information + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + \index{get\_collection\_permissions() (pine.client.PineClient method)@\spxentry{get\_collection\_permissions()}\spxextra{pine.client.PineClient method}} \begin{fulllineitems} @@ -10620,6 +11401,91 @@ all the documents in the given collection \end{fulllineitems} +\index{get\_collection\_classifier() (pine.client.PineClient method)@\spxentry{get\_collection\_classifier()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.get_collection_classifier}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_collection\_classifier}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Returns the classifier associated with the given collection. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{collection\_id}} (\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{\sphinxstyleliteralemphasis{\sphinxupquote{str}}}) \textendash{} the ID of the collection + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the classifier associated with the given collection + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{get\_next\_document() (pine.client.PineClient method)@\spxentry{get\_next\_document()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.get_next_document}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_next\_document}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}} +\sphinxAtStartPar +Returns the ‘next’ document associated with the given classifier. + +\sphinxAtStartPar +The next document is the one that the model suggests should be annotated by the logged\sphinxhyphen{}in +user next. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: ID of the classifier + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the next document ID, or None if there are none left to annotate + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{advance\_next\_document() (pine.client.PineClient method)@\spxentry{advance\_next\_document()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.advance_next_document}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{advance\_next\_document}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{document\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Advances the ‘next’ document associated with the given classifier by marking the +given document as annotated. + +\sphinxAtStartPar +The next document is the one that the model suggests should be annotated by the logged\sphinxhyphen{}in +user next. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: ID of the classifier + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{document\_id}} \textendash{} str: the ID of the document that was annotated + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +information on the advanced instance + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + \index{add\_document() (pine.client.PineClient method)@\spxentry{add\_document()}\spxextra{pine.client.PineClient method}} \begin{fulllineitems} @@ -10896,6 +11762,82 @@ the annotation IDs \end{fulllineitems} +\index{get\_my\_document\_annotations() (pine.client.PineClient method)@\spxentry{get\_my\_document\_annotations()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.get_my_document_annotations}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_my\_document\_annotations}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{document\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}\DUrole{p}{{]}}\DUrole{p}{{]}}}} +\sphinxAtStartPar +Returns annotations for the given document for the logged in user. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{document\_id}} \textendash{} the ID of the document to get annotations for + +\item[{Raises}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientValueException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientValueException}}}}} \textendash{} if the document ID is not a valid string + +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientAuthException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientAuthException}}}}} \textendash{} if not logged in + +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientHttpException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientHttpException}}}}} \textendash{} if the HTTP request returns an error + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the annotations for the given document for the logged in user + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}(\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}(\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict})) + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{get\_others\_document\_annotations() (pine.client.PineClient method)@\spxentry{get\_others\_document\_annotations()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.get_others_document_annotations}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_others\_document\_annotations}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{document\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}List\DUrole{p}{{]}}}} +\sphinxAtStartPar +Returns annotations for the given document for users other than the logged in user. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{document\_id}} \textendash{} the ID of the document to get annotations for + +\item[{Raises}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientValueException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientValueException}}}}} \textendash{} if the document ID is not a valid string + +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientAuthException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientAuthException}}}}} \textendash{} if not logged in + +\item {} +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/client/exceptions/index:pine.client.exceptions.PineClientHttpException}]{\sphinxcrossref{\sphinxstyleliteralstrong{\sphinxupquote{exceptions.PineClientHttpException}}}}} \textendash{} if the HTTP request returns an error + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the annotations for the given document for users other than the logged in user + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}(\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}(\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict})) + +\end{description}\end{quote} + +\end{fulllineitems} + \index{list\_collections() (pine.client.PineClient method)@\spxentry{list\_collections()}\spxextra{pine.client.PineClient method}} \begin{fulllineitems} @@ -10930,6 +11872,29 @@ user’s collections \end{fulllineitems} +\index{get\_collection() (pine.client.PineClient method)@\spxentry{get\_collection()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.get_collection}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_collection}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Returns the collection with the given ID. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{collection\_id}} \textendash{} str: the ID of the collection + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +the collection data + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + \index{get\_collection\_iaa\_report() (pine.client.PineClient method)@\spxentry{get\_collection\_iaa\_report()}\spxextra{pine.client.PineClient method}} \begin{fulllineitems} @@ -11020,6 +11985,144 @@ collection data \end{fulllineitems} +\index{get\_classifier\_status() (pine.client.PineClient method)@\spxentry{get\_classifier\_status()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.get_classifier_status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_classifier\_status}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Returns the status for the given classifier. +\begin{quote}\begin{description} +\item[{Param}] \leavevmode +\sphinxAtStartPar +classifier\_id: str: classifier ID + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +status for the given classifier + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{classifier\_train() (pine.client.PineClient method)@\spxentry{classifier\_train()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.classifier_train}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classifier\_train}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{model\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}} \DUrole{o}{=} \DUrole{default_value}{\textquotesingle{}auto\sphinxhyphen{}trained\textquotesingle{}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Trains the given classifier (using collection documents). + +\sphinxAtStartPar +Note that training is done asynchronously, so this method should return very quickly. One +of the things returned in the dict will be a job ID. If you want to know when the training +has finished, you can periodically poll {\hyperref[\detokenize{autoapi/pine/client/index:pine.client.PineClient.get_classifier_running_jobs}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{get\_classifier\_running\_jobs()}}}}} and check +for that job ID. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: classifier ID + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{model\_name}} \textendash{} str: name of model corresponding to filename on disk, defaults to +\sphinxcode{\sphinxupquote{"auto\sphinxhyphen{}trained"}} which is the same as the annotation\sphinxhyphen{}based +model training + +\end{itemize} + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{classifier\_has\_trained() (pine.client.PineClient method)@\spxentry{classifier\_has\_trained()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.classifier_has_trained}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classifier\_has\_trained}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/functions.html\#bool}{bool}}} +\sphinxAtStartPar +Returns whether the given classifier has been trained or not. + +\sphinxAtStartPar +If False, future calls to predict will fail. +\begin{quote}\begin{description} +\item[{Param}] \leavevmode +\sphinxAtStartPar +classifier\_id: str: classifier ID + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/functions.html\#bool}{bool} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{classifier\_predict() (pine.client.PineClient method)@\spxentry{classifier\_predict()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.classifier_predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classifier\_predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}}, \emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{texts}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{timeout\_in\_s}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}} \DUrole{o}{=} \DUrole{default_value}{36000}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\sphinxAtStartPar +Runs classifier prediction on the given documents. At least one of document\_ids and +texts must be non\sphinxhyphen{}empty. + +\sphinxAtStartPar +This prediction uses the last\sphinxhyphen{}trained model name for that classifier. This method will +block until the prediction has finished and then return the results. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: classifier ID + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{document\_ids}} \textendash{} list{[}str{]}: a list of document IDs to run prediction on + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{texts}} \textendash{} list{[}str{]}: a list of direct document texts to run prediction on + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{timeout\_in\_s}} \textendash{} int: max timeout in seconds before erroring out and returning, defaults +to \sphinxcode{\sphinxupquote{36000}} + +\end{itemize} + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{get\_classifier\_running\_jobs() (pine.client.PineClient method)@\spxentry{get\_classifier\_running\_jobs()}\spxextra{pine.client.PineClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/client/index:pine.client.PineClient.get_classifier_running_jobs}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_classifier\_running\_jobs}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}} +\sphinxAtStartPar +Gets the list of running job IDs for the given classifier. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{classifier\_id}} \textendash{} str: classifier ID + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list}{[}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}{]} + +\end{description}\end{quote} + +\end{fulllineitems} + \end{fulllineitems} @@ -11847,6 +12950,30 @@ Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sp \phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.processing_queue_key_timeout}}\pysigline{\sphinxbfcode{\sphinxupquote{processing\_queue\_key\_timeout}}} \end{fulllineitems} +\index{results\_queue\_key (pine.pipelines.app.listener.service\_listener.ServiceListener attribute)@\spxentry{results\_queue\_key}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.results_queue_key}}\pysigline{\sphinxbfcode{\sphinxupquote{results\_queue\_key}}} +\end{fulllineitems} + +\index{results\_queue\_key\_timeout (pine.pipelines.app.listener.service\_listener.ServiceListener attribute)@\spxentry{results\_queue\_key\_timeout}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.results_queue_key_timeout}}\pysigline{\sphinxbfcode{\sphinxupquote{results\_queue\_key\_timeout}}} +\end{fulllineitems} + +\index{running\_jobs\_key (pine.pipelines.app.listener.service\_listener.ServiceListener attribute)@\spxentry{running\_jobs\_key}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.running_jobs_key}}\pysigline{\sphinxbfcode{\sphinxupquote{running\_jobs\_key}}} +\end{fulllineitems} + +\index{classifiers\_training\_key (pine.pipelines.app.listener.service\_listener.ServiceListener attribute)@\spxentry{classifiers\_training\_key}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.classifiers_training_key}}\pysigline{\sphinxbfcode{\sphinxupquote{classifiers\_training\_key}}} +\end{fulllineitems} + \index{processing\_lock\_key (pine.pipelines.app.listener.service\_listener.ServiceListener attribute)@\spxentry{processing\_lock\_key}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener attribute}} \begin{fulllineitems} @@ -11889,18 +13016,6 @@ Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sp \phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.registration_channel}}\pysigline{\sphinxbfcode{\sphinxupquote{registration\_channel}}} \end{fulllineitems} -\index{publish\_response() (pine.pipelines.app.listener.service\_listener.ServiceListener class method)@\spxentry{publish\_response()}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener class method}} - -\begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.publish_response}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{publish\_response}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{channel}}, \emph{\DUrole{n}{data}}}{}~\begin{quote}\begin{description} -\item[{Return type}] \leavevmode -\sphinxAtStartPar -\sphinxhref{https://docs.python.org/3/library/functions.html\#bool}{bool} - -\end{description}\end{quote} - -\end{fulllineitems} - \index{start\_workers() (pine.pipelines.app.listener.service\_listener.ServiceListener method)@\spxentry{start\_workers()}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener method}} \begin{fulllineitems} @@ -11925,10 +13040,34 @@ bool | dict \end{fulllineitems} +\index{do\_with\_redis() (pine.pipelines.app.listener.service\_listener.ServiceListener static method)@\spxentry{do\_with\_redis()}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener static method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.do_with_redis}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{static }}\sphinxbfcode{\sphinxupquote{do\_with\_redis}}}{\emph{\DUrole{n}{callback}\DUrole{p}{:} \DUrole{n}{Callable\DUrole{p}{{[}}\DUrole{p}{{[}}redis.StrictRedis\DUrole{p}{{]}}\DUrole{p}{, }typing.Any\DUrole{p}{{]}}}}}{} +\end{fulllineitems} + +\index{push\_results() (pine.pipelines.app.listener.service\_listener.ServiceListener static method)@\spxentry{push\_results()}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener static method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.push_results}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{static }}\sphinxbfcode{\sphinxupquote{push\_results}}}{\emph{\DUrole{n}{job\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{response}}}{} +\end{fulllineitems} + +\index{wait\_until\_classifier\_isnt\_training() (pine.pipelines.app.listener.service\_listener.ServiceListener static method)@\spxentry{wait\_until\_classifier\_isnt\_training()}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener static method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.wait_until_classifier_isnt_training}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{static }}\sphinxbfcode{\sphinxupquote{wait\_until\_classifier\_isnt\_training}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{job\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\end{fulllineitems} + +\index{classifier\_is\_done\_training() (pine.pipelines.app.listener.service\_listener.ServiceListener static method)@\spxentry{classifier\_is\_done\_training()}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener static method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.classifier_is_done_training}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{static }}\sphinxbfcode{\sphinxupquote{classifier\_is\_done\_training}}}{\emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\end{fulllineitems} + \index{process\_message() (pine.pipelines.app.listener.service\_listener.ServiceListener static method)@\spxentry{process\_message()}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener static method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.process_message}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{static }}\sphinxbfcode{\sphinxupquote{process\_message}}}{\emph{\DUrole{n}{job\_details}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/app/listener/service_listener/index:pine.pipelines.app.listener.service_listener.ServiceListener.process_message}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{static }}\sphinxbfcode{\sphinxupquote{process\_message}}}{\emph{\DUrole{n}{job\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{job\_details}}}{} \end{fulllineitems} \index{\_start\_registration\_task() (pine.pipelines.app.listener.service\_listener.ServiceListener method)@\spxentry{\_start\_registration\_task()}\spxextra{pine.pipelines.app.listener.service\_listener.ServiceListener method}} @@ -12146,6 +13285,12 @@ Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sp \phantomsection\label{\detokenize{autoapi/pine/pipelines/shared/config/index:pine.pipelines.shared.config.BaseConfig.REDIS_EXPIRE}}\pysigline{\sphinxbfcode{\sphinxupquote{REDIS\_EXPIRE}}\sphinxbfcode{\sphinxupquote{ = 3600}}} \end{fulllineitems} +\index{REDIS\_MAX\_PROCESSES (pine.pipelines.shared.config.BaseConfig attribute)@\spxentry{REDIS\_MAX\_PROCESSES}\spxextra{pine.pipelines.shared.config.BaseConfig attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/shared/config/index:pine.pipelines.shared.config.BaseConfig.REDIS_MAX_PROCESSES}}\pysigline{\sphinxbfcode{\sphinxupquote{REDIS\_MAX\_PROCESSES}}\sphinxbfcode{\sphinxupquote{ = 10}}} +\end{fulllineitems} + \index{SCHEDULER\_REGISTRATION\_TIMEOUT (pine.pipelines.shared.config.BaseConfig attribute)@\spxentry{SCHEDULER\_REGISTRATION\_TIMEOUT}\spxextra{pine.pipelines.shared.config.BaseConfig attribute}} \begin{fulllineitems} @@ -12523,19 +13668,74 @@ Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sp \index{get\_items() (pine.pipelines.EveClient.EveClient method)@\spxentry{get\_items()}\spxextra{pine.pipelines.EveClient.EveClient method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/EveClient/index:pine.pipelines.EveClient.EveClient.get_items}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_items}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{resource}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/EveClient/index:pine.pipelines.EveClient.EveClient.get_items}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_items}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{resource}}, \emph{\DUrole{n}{params}\DUrole{o}{=}\DUrole{default_value}{\{\}}}}{} +\end{fulllineitems} + +\index{\_get\_documents\_map() (pine.pipelines.EveClient.EveClient method)@\spxentry{\_get\_documents\_map()}\spxextra{pine.pipelines.EveClient.EveClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/EveClient/index:pine.pipelines.EveClient.EveClient._get_documents_map}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_get\_documents\_map}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{params}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}} \DUrole{o}{=} \DUrole{default_value}{\{\}}}}{} \end{fulllineitems} \index{get\_documents() (pine.pipelines.EveClient.EveClient method)@\spxentry{get\_documents()}\spxextra{pine.pipelines.EveClient.EveClient method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/EveClient/index:pine.pipelines.EveClient.EveClient.get_documents}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_documents}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/EveClient/index:pine.pipelines.EveClient.EveClient.get_documents}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_documents}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ Dict\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}} +\sphinxAtStartPar +Returns a document map where the document overlap is 0. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{collection\_id}} \textendash{} str: the ID of the collection + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +a mapping from document ID to document text for non\sphinxhyphen{}overlap documents + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict} + +\end{description}\end{quote} + +\end{fulllineitems} + +\index{get\_documents\_by\_id() (pine.pipelines.EveClient.EveClient method)@\spxentry{get\_documents\_by\_id()}\spxextra{pine.pipelines.EveClient.EveClient method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/EveClient/index:pine.pipelines.EveClient.EveClient.get_documents_by_id}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_documents\_by\_id}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{} \end{fulllineitems} \index{get\_docs\_with\_annotations() (pine.pipelines.EveClient.EveClient method)@\spxentry{get\_docs\_with\_annotations()}\spxextra{pine.pipelines.EveClient.EveClient method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/EveClient/index:pine.pipelines.EveClient.EveClient.get_docs_with_annotations}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_docs\_with\_annotations}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}}, \emph{\DUrole{n}{doc\_map}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/EveClient/index:pine.pipelines.EveClient.EveClient.get_docs_with_annotations}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_docs\_with\_annotations}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{collection\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{doc\_map}\DUrole{p}{:} \DUrole{n}{Dict\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{{ $\rightarrow$ Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/typing.html\#typing.List}{typing.List}\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/typing.html\#typing.List}{typing.List}\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/typing.html\#typing.List}{typing.List}\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/typing.html\#typing.List}{typing.List}\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}\DUrole{p}{{]}}}} +\sphinxAtStartPar +Gets document and annotation data. Only non\sphinxhyphen{}overlapping documents are returned. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{collection\_id}} \textendash{} str: the ID of the collection + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{doc\_map}} \textendash{} dict{[}str, str{]}: map of document IDs to document text + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +(documents, labels, doc\_ids, ann\_ids) where documents is a list of the texts, +labels is a list of the annotations, doc\_ids is a list of the document IDs, and +ann\_ids is a list of the annotation IDs + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#tuple}{tuple} + +\end{description}\end{quote} + \end{fulllineitems} \index{update() (pine.pipelines.EveClient.EveClient method)@\spxentry{update()}\spxextra{pine.pipelines.EveClient.EveClient method}} @@ -12703,22 +13903,60 @@ Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sp \phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{pine.pipelines.NER\_API.}}\sphinxbfcode{\sphinxupquote{ner\_api}}} \sphinxAtStartPar Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sphinxcode{\sphinxupquote{object}}} +\index{status() (pine.pipelines.NER\_API.ner\_api method)@\spxentry{status()}\spxextra{pine.pipelines.NER\_API.ner\_api method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api.status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{status}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{pipeline\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + \index{perform\_fold() (pine.pipelines.NER\_API.ner\_api method)@\spxentry{perform\_fold()}\spxextra{pine.pipelines.NER\_API.ner\_api method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api.perform_fold}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{perform\_fold}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model}}, \emph{\DUrole{n}{train\_data}}, \emph{\DUrole{n}{test\_data}}, \emph{\DUrole{n}{pipeline\_parameters}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api.perform_fold}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{perform\_fold}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model}\DUrole{p}{:} \DUrole{n}{{\hyperref[\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER}]{\sphinxcrossref{pine.pipelines.pmap\_ner.NER}}}}}, \emph{\DUrole{n}{train\_data}}, \emph{\DUrole{n}{test\_data}}, \emph{\DUrole{o}{**}\DUrole{n}{pipeline\_parameters}}}{} \end{fulllineitems} \index{perform\_five\_fold() (pine.pipelines.NER\_API.ner\_api method)@\spxentry{perform\_five\_fold()}\spxextra{pine.pipelines.NER\_API.ner\_api method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api.perform_five_fold}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{perform\_five\_fold}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model}}, \emph{\DUrole{n}{documents}}, \emph{\DUrole{n}{annotations}}, \emph{\DUrole{n}{doc\_ids}}, \emph{\DUrole{n}{pipeline\_parameters}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api.perform_five_fold}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{perform\_five\_fold}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model}\DUrole{p}{:} \DUrole{n}{{\hyperref[\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER}]{\sphinxcrossref{pine.pipelines.pmap\_ner.NER}}}}}, \emph{\DUrole{n}{documents}}, \emph{\DUrole{n}{annotations}}, \emph{\DUrole{n}{doc\_ids}}, \emph{\DUrole{o}{**}\DUrole{n}{pipeline\_parameters}}}{} \end{fulllineitems} \index{get\_document\_ranking() (pine.pipelines.NER\_API.ner\_api method)@\spxentry{get\_document\_ranking()}\spxextra{pine.pipelines.NER\_API.ner\_api method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api.get_document_ranking}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_document\_ranking}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model}}, \emph{\DUrole{n}{doc\_map}}, \emph{\DUrole{n}{doc\_ids}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api.get_document_ranking}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_document\_ranking}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model}\DUrole{p}{:} \DUrole{n}{{\hyperref[\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER}]{\sphinxcrossref{pine.pipelines.pmap\_ner.NER}}}}}, \emph{\DUrole{n}{doc\_map}\DUrole{p}{:} \DUrole{n}{Dict\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{doc\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}} +\sphinxAtStartPar +Calculates document rankings and returns document IDs sorted by ranking. + +\sphinxAtStartPar +The ranking should be which documents should be evaluated first. This probably +corresponds in some ways to the documents which the model is least confident about. +\begin{quote}\begin{description} +\item[{Parameters}] \leavevmode\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{model}} \textendash{} NER model + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{doc\_map}} \textendash{} dict: mapping of document IDs to document text where overlap is 0 + +\item {} +\sphinxAtStartPar +\sphinxstyleliteralstrong{\sphinxupquote{doc\_ids}} \textendash{} list: IDs of documents where ??? + +\end{itemize} + +\item[{Returns}] \leavevmode +\sphinxAtStartPar +sorted document IDs + +\item[{Return type}] \leavevmode +\sphinxAtStartPar +\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#list}{list} + +\end{description}\end{quote} + \end{fulllineitems} \index{get\_classifier\_pipeline\_metrics\_objs() (pine.pipelines.NER\_API.ner\_api method)@\spxentry{get\_classifier\_pipeline\_metrics\_objs()}\spxextra{pine.pipelines.NER\_API.ner\_api method}} @@ -12736,7 +13974,7 @@ Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sp \index{predict() (pine.pipelines.NER\_API.ner\_api method)@\spxentry{predict()}\spxextra{pine.pipelines.NER\_API.ner\_api method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}}, \emph{\DUrole{n}{pipeline\_name}}, \emph{\DUrole{n}{documents}}, \emph{\DUrole{n}{document\_ids}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/NER_API/index:pine.pipelines.NER_API.ner_api.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{classifier\_id}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{pipeline\_name}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}, \emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{texts}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{} \end{fulllineitems} @@ -12771,66 +14009,72 @@ Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sp \endlastfoot \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.rank}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{rank}}}}}(results, metric) +{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.rank}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{rank}}}}}(document\_ids: List{[}str{]}, results: List{[}DocumentPredictionProbabilities{]}, metric: str) \(\rightarrow\) List{[}Tuple{[}str, float{]}{]} & \sphinxAtStartPar if metric == ‘lc’: return least\_confidence(results) \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{least\_confidence}}}}}(results) +{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{least\_confidence}}}}}(document\_ids: List{[}str{]}, results: List{[}DocumentPredictionProbabilities{]}) \(\rightarrow\) List{[}Tuple{[}str, float{]}{]} & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence_squared}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{least\_confidence\_squared}}}}}(results) +{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence_squared}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{least\_confidence\_squared}}}}}(document\_ids: List{[}str{]}, results: List{[}DocumentPredictionProbabilities{]}) \(\rightarrow\) List{[}Tuple{[}str, float{]}{]} & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence_squared_by_entity}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{least\_confidence\_squared\_by\_entity}}}}}(results) +{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence_squared_by_entity}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{least\_confidence\_squared\_by\_entity}}}}}(document\_ids: List{[}str{]}, results: List{[}DocumentPredictionProbabilities{]}) \(\rightarrow\) List{[}Tuple{[}str, float{]}{]} & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.largest_margin}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{largest\_margin}}}}}(results) +{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.largest_margin}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{largest\_margin}}}}}(document\_ids: List{[}str{]}, results: List{[}DocumentPredictionProbabilities{]}) \(\rightarrow\) List{[}Tuple{[}str, float{]}{]} & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.entropy_rank}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{entropy\_rank}}}}}(results, N=None) +{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.entropy_rank}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{entropy\_rank}}}}}(document\_ids: List{[}str{]}, results: List{[}DocumentPredictionProbabilities{]}, N=None) \(\rightarrow\) List{[}Tuple{[}str, float{]}{]} & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.random_rank}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{random\_rank}}}}}(results) +{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.random_rank}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{random\_rank}}}}}(document\_ids: List{[}str{]}, results: List{[}DocumentPredictionProbabilities{]}) \(\rightarrow\) List{[}Tuple{[}str, float{]}{]} & \sphinxAtStartPar \\ \hline \sphinxAtStartPar -{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.most_of_least_popular}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{most\_of\_least\_popular}}}}}(results) +{\hyperref[\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.most_of_least_popular}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{most\_of\_least\_popular}}}}}(document\_ids: List{[}str{]}, results: List{[}DocumentPredictionProbabilities{]}) \(\rightarrow\) List{[}Tuple{[}str, float{]}{]} & \sphinxAtStartPar \\ \hline \end{longtable}\sphinxatlongtableend\end{savenotes} +\index{logger (in module pine.pipelines.RankingFunctions)@\spxentry{logger}\spxextra{in module pine.pipelines.RankingFunctions}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.logger}}\pysigline{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{logger}}} +\end{fulllineitems} + \index{rank() (in module pine.pipelines.RankingFunctions)@\spxentry{rank()}\spxextra{in module pine.pipelines.RankingFunctions}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.rank}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{rank}}}{\emph{\DUrole{n}{results}}, \emph{\DUrole{n}{metric}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.rank}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{rank}}}{\emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{results}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}}, \emph{\DUrole{n}{metric}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}} \sphinxAtStartPar if metric == ‘lc’: return least\_confidence(results) if metric == ‘ma’: return largest\_margin(results) @@ -12849,43 +14093,43 @@ return \sphinxhyphen{}1 \index{least\_confidence() (in module pine.pipelines.RankingFunctions)@\spxentry{least\_confidence()}\spxextra{in module pine.pipelines.RankingFunctions}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{least\_confidence}}}{\emph{\DUrole{n}{results}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{least\_confidence}}}{\emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{results}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}} \end{fulllineitems} \index{least\_confidence\_squared() (in module pine.pipelines.RankingFunctions)@\spxentry{least\_confidence\_squared()}\spxextra{in module pine.pipelines.RankingFunctions}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence_squared}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{least\_confidence\_squared}}}{\emph{\DUrole{n}{results}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence_squared}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{least\_confidence\_squared}}}{\emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{results}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}} \end{fulllineitems} \index{least\_confidence\_squared\_by\_entity() (in module pine.pipelines.RankingFunctions)@\spxentry{least\_confidence\_squared\_by\_entity()}\spxextra{in module pine.pipelines.RankingFunctions}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence_squared_by_entity}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{least\_confidence\_squared\_by\_entity}}}{\emph{\DUrole{n}{results}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.least_confidence_squared_by_entity}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{least\_confidence\_squared\_by\_entity}}}{\emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{results}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}} \end{fulllineitems} \index{largest\_margin() (in module pine.pipelines.RankingFunctions)@\spxentry{largest\_margin()}\spxextra{in module pine.pipelines.RankingFunctions}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.largest_margin}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{largest\_margin}}}{\emph{\DUrole{n}{results}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.largest_margin}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{largest\_margin}}}{\emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{results}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}} \end{fulllineitems} \index{entropy\_rank() (in module pine.pipelines.RankingFunctions)@\spxentry{entropy\_rank()}\spxextra{in module pine.pipelines.RankingFunctions}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.entropy_rank}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{entropy\_rank}}}{\emph{\DUrole{n}{results}}, \emph{\DUrole{n}{N}\DUrole{o}{=}\DUrole{default_value}{None}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.entropy_rank}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{entropy\_rank}}}{\emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{results}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}}, \emph{\DUrole{n}{N}\DUrole{o}{=}\DUrole{default_value}{None}}}{{ $\rightarrow$ List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}} \end{fulllineitems} \index{random\_rank() (in module pine.pipelines.RankingFunctions)@\spxentry{random\_rank()}\spxextra{in module pine.pipelines.RankingFunctions}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.random_rank}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{random\_rank}}}{\emph{\DUrole{n}{results}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.random_rank}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{random\_rank}}}{\emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{results}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}} \end{fulllineitems} \index{most\_of\_least\_popular() (in module pine.pipelines.RankingFunctions)@\spxentry{most\_of\_least\_popular()}\spxextra{in module pine.pipelines.RankingFunctions}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.most_of_least_popular}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{most\_of\_least\_popular}}}{\emph{\DUrole{n}{results}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/RankingFunctions/index:pine.pipelines.RankingFunctions.most_of_least_popular}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{pine.pipelines.RankingFunctions.}}\sphinxbfcode{\sphinxupquote{most\_of\_least\_popular}}}{\emph{\DUrole{n}{document\_ids}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{results}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}} \end{fulllineitems} @@ -12990,28 +14234,52 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.__props}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_props}}} \end{fulllineitems} +\index{\_\_is\_setup (pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER attribute)@\spxentry{\_\_is\_setup}\spxextra{pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.__is_setup}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_is\_setup}}\sphinxbfcode{\sphinxupquote{ = False}}} +\end{fulllineitems} + \index{\_\_id (pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER attribute)@\spxentry{\_\_id}\spxextra{pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER attribute}} \begin{fulllineitems} \phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.__id}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_id}}} \end{fulllineitems} +\index{\_\_default\_fit\_params (pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER attribute)@\spxentry{\_\_default\_fit\_params}\spxextra{pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.__default_fit_params}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_default\_fit\_params}}} +\end{fulllineitems} + +\index{setup() (pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER class method)@\spxentry{setup()}\spxextra{pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER class method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.setup}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{setup}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{java\_dir}\DUrole{o}{=}\DUrole{default_value}{None}}, \emph{\DUrole{n}{ner\_path}\DUrole{o}{=}\DUrole{default_value}{None}}}{} +\end{fulllineitems} + +\index{status() (pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method)@\spxentry{status()}\spxextra{pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{status}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + \index{fit() (pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method)@\spxentry{fit()}\spxextra{pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}, \emph{\DUrole{n}{params}\DUrole{o}{=}\DUrole{default_value}{None}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}, \emph{\DUrole{o}{**}\DUrole{n}{params}}}{} \end{fulllineitems} \index{predict() (pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method)@\spxentry{predict()}\spxextra{pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}DocumentPredictions\DUrole{p}{{]}}}} \end{fulllineitems} \index{predict\_proba() (pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method)@\spxentry{predict\_proba()}\spxextra{pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}, \emph{\DUrole{n}{get\_all\_labels}\DUrole{o}{=}\DUrole{default_value}{False}}, \emph{\DUrole{n}{include\_other}\DUrole{o}{=}\DUrole{default_value}{False}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/corenlp_NER_pipeline/index:pine.pipelines.corenlp_NER_pipeline.corenlp_NER.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{get\_all\_labels}\DUrole{o}{=}\DUrole{default_value}{False}}, \emph{\DUrole{n}{include\_other}\DUrole{o}{=}\DUrole{default_value}{False}}, \emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{{ $\rightarrow$ List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}} \end{fulllineitems} \index{next\_example() (pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method)@\spxentry{next\_example()}\spxextra{pine.pipelines.corenlp\_NER\_pipeline.corenlp\_NER method}} @@ -13119,10 +14387,10 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{pine.pipelines.opennlp\_NER\_pipeline.}}\sphinxbfcode{\sphinxupquote{opennlp\_NER}}}{\emph{\DUrole{n}{java\_dir}\DUrole{o}{=}\DUrole{default_value}{None}}, \emph{\DUrole{n}{ner\_path}\DUrole{o}{=}\DUrole{default_value}{None}}, \emph{\DUrole{n}{tmp\_dir}\DUrole{o}{=}\DUrole{default_value}{None}}}{} \sphinxAtStartPar Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{pine.pipelines.pipeline.Pipeline}}}}} -\index{\_\_jar (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER attribute)@\spxentry{\_\_jar}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER attribute}} +\index{\_\_ner\_path (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER attribute)@\spxentry{\_\_ner\_path}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER attribute}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.__jar}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_jar}}\sphinxbfcode{\sphinxupquote{ =}}} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.__ner_path}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_ner\_path}}\sphinxbfcode{\sphinxupquote{ =}}} \end{fulllineitems} \index{\_\_jdk\_dir (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER attribute)@\spxentry{\_\_jdk\_dir}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER attribute}} @@ -13167,22 +14435,40 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.__id}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_id}}} \end{fulllineitems} +\index{\_\_is\_setup (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER attribute)@\spxentry{\_\_is\_setup}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.__is_setup}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_is\_setup}}\sphinxbfcode{\sphinxupquote{ = False}}} +\end{fulllineitems} + +\index{setup() (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER class method)@\spxentry{setup()}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER class method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.setup}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{classmethod }}\sphinxbfcode{\sphinxupquote{setup}}}{\emph{\DUrole{n}{cls}}, \emph{\DUrole{n}{java\_dir}\DUrole{o}{=}\DUrole{default_value}{None}}, \emph{\DUrole{n}{ner\_path}\DUrole{o}{=}\DUrole{default_value}{None}}}{} +\end{fulllineitems} + +\index{status() (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method)@\spxentry{status()}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{status}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + \index{fit() (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method)@\spxentry{fit()}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}, \emph{\DUrole{n}{params}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}, \emph{\DUrole{o}{**}\DUrole{n}{params}}}{} \end{fulllineitems} \index{predict() (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method)@\spxentry{predict()}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}DocumentPredictions\DUrole{p}{{]}}}} \end{fulllineitems} \index{predict\_proba() (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method)@\spxentry{predict\_proba()}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}, \emph{\DUrole{n}{get\_all\_labels}\DUrole{o}{=}\DUrole{default_value}{False}}, \emph{\DUrole{n}{include\_other}\DUrole{o}{=}\DUrole{default_value}{False}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{{ $\rightarrow$ List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}} \end{fulllineitems} \index{next\_example() (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method)@\spxentry{next\_example()}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method}} @@ -13230,7 +14516,7 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \index{convert\_ann\_collection\_to\_per\_token() (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method)@\spxentry{convert\_ann\_collection\_to\_per\_token()}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.convert_ann_collection_to_per_token}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{convert\_ann\_collection\_to\_per\_token}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{annotations}}, \emph{\DUrole{n}{tokens}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/opennlp_NER_pipeline/index:pine.pipelines.opennlp_NER_pipeline.opennlp_NER.convert_ann_collection_to_per_token}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{convert\_ann\_collection\_to\_per\_token}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{annotations}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}Union\DUrole{p}{{[}}NerPrediction\DUrole{p}{, }typing.Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}\DUrole{p}{{]}}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{tokens}}}{} \end{fulllineitems} \index{evaluate() (pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method)@\spxentry{evaluate()}\spxextra{pine.pipelines.opennlp\_NER\_pipeline.opennlp\_NER method}} @@ -13276,6 +14562,34 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \endlastfoot +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPrediction}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{NerPrediction}}}}} +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.DocumentPredictions}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{DocumentPredictions}}}}} +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPredictionProbabilities}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{NerPredictionProbabilities}}}}} +& +\sphinxAtStartPar + +\\ +\hline +\sphinxAtStartPar +{\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.DocumentPredictionProbabilities}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{DocumentPredictionProbabilities}}}}} +& +\sphinxAtStartPar + +\\ +\hline \sphinxAtStartPar {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{Pipeline}}}}} & @@ -13284,28 +14598,106 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \\ \hline \end{longtable}\sphinxatlongtableend\end{savenotes} +\index{NerPrediction (class in pine.pipelines.pipeline)@\spxentry{NerPrediction}\spxextra{class in pine.pipelines.pipeline}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPrediction}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{pine.pipelines.pipeline.}}\sphinxbfcode{\sphinxupquote{NerPrediction}}}{\emph{\DUrole{n}{offset\_start}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}}}, \emph{\DUrole{n}{offset\_end}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}}}, \emph{\DUrole{n}{label}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}}}}{} +\sphinxAtStartPar +Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sphinxcode{\sphinxupquote{object}}} +\index{serialize() (pine.pipelines.pipeline.NerPrediction method)@\spxentry{serialize()}\spxextra{pine.pipelines.pipeline.NerPrediction method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPrediction.serialize}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{serialize}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}} +\end{fulllineitems} + + +\end{fulllineitems} + +\index{DocumentPredictions (class in pine.pipelines.pipeline)@\spxentry{DocumentPredictions}\spxextra{class in pine.pipelines.pipeline}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.DocumentPredictions}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{pine.pipelines.pipeline.}}\sphinxbfcode{\sphinxupquote{DocumentPredictions}}}{\emph{\DUrole{n}{ner}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}{\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPrediction}]{\sphinxcrossref{NerPrediction}}}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{doc}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{extra\_data}\DUrole{p}{:} \DUrole{n}{Any} \DUrole{o}{=} \DUrole{default_value}{None}}}{} +\sphinxAtStartPar +Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sphinxcode{\sphinxupquote{object}}} +\index{serialize() (pine.pipelines.pipeline.DocumentPredictions method)@\spxentry{serialize()}\spxextra{pine.pipelines.pipeline.DocumentPredictions method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.DocumentPredictions.serialize}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{serialize}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + + +\end{fulllineitems} + +\index{NerPredictionProbabilities (class in pine.pipelines.pipeline)@\spxentry{NerPredictionProbabilities}\spxextra{class in pine.pipelines.pipeline}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPredictionProbabilities}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{pine.pipelines.pipeline.}}\sphinxbfcode{\sphinxupquote{NerPredictionProbabilities}}}{\emph{\DUrole{n}{offset\_start}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}}}, \emph{\DUrole{n}{offset\_end}\DUrole{p}{:} \DUrole{n}{\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}}}, \emph{\DUrole{n}{predictions}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}}}{} +\sphinxAtStartPar +Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sphinxcode{\sphinxupquote{object}}} +\index{get\_highest\_prediction() (pine.pipelines.pipeline.NerPredictionProbabilities method)@\spxentry{get\_highest\_prediction()}\spxextra{pine.pipelines.pipeline.NerPredictionProbabilities method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPredictionProbabilities.get_highest_prediction}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_highest\_prediction}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}}} +\end{fulllineitems} + +\index{get\_predictions\_from\_highest\_to\_lowest() (pine.pipelines.pipeline.NerPredictionProbabilities method)@\spxentry{get\_predictions\_from\_highest\_to\_lowest()}\spxextra{pine.pipelines.pipeline.NerPredictionProbabilities method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPredictionProbabilities.get_predictions_from_highest_to_lowest}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{get\_predictions\_from\_highest\_to\_lowest}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}} +\end{fulllineitems} + +\index{serialize() (pine.pipelines.pipeline.NerPredictionProbabilities method)@\spxentry{serialize()}\spxextra{pine.pipelines.pipeline.NerPredictionProbabilities method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPredictionProbabilities.serialize}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{serialize}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#int}{int}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/typing.html\#typing.List}{typing.List}\DUrole{p}{{[}}typing.Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}\DUrole{p}{{]}}}} +\end{fulllineitems} + + +\end{fulllineitems} + +\index{DocumentPredictionProbabilities (class in pine.pipelines.pipeline)@\spxentry{DocumentPredictionProbabilities}\spxextra{class in pine.pipelines.pipeline}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.DocumentPredictionProbabilities}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{pine.pipelines.pipeline.}}\sphinxbfcode{\sphinxupquote{DocumentPredictionProbabilities}}}{\emph{\DUrole{n}{ner}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}{\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.NerPredictionProbabilities}]{\sphinxcrossref{NerPredictionProbabilities}}}\DUrole{p}{{]}}}}, \emph{\DUrole{n}{doc}\DUrole{p}{:} \DUrole{n}{List\DUrole{p}{{[}}Tuple\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{, }\sphinxhref{https://docs.python.org/3/library/functions.html\#float}{float}\DUrole{p}{{]}}\DUrole{p}{{]}}}}}{} +\sphinxAtStartPar +Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sphinxcode{\sphinxupquote{object}}} +\index{serialize() (pine.pipelines.pipeline.DocumentPredictionProbabilities method)@\spxentry{serialize()}\spxextra{pine.pipelines.pipeline.DocumentPredictionProbabilities method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.DocumentPredictionProbabilities.serialize}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{serialize}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + + +\end{fulllineitems} + \index{Pipeline (class in pine.pipelines.pipeline)@\spxentry{Pipeline}\spxextra{class in pine.pipelines.pipeline}} \begin{fulllineitems} \phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline}}\pysigline{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{pine.pipelines.pipeline.}}\sphinxbfcode{\sphinxupquote{Pipeline}}} \sphinxAtStartPar Bases: \sphinxhref{https://docs.python.org/3/library/functions.html\#object}{\sphinxcode{\sphinxupquote{object}}} +\index{status() (pine.pipelines.pipeline.Pipeline method)@\spxentry{status()}\spxextra{pine.pipelines.pipeline.Pipeline method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline.status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{abstract }}\sphinxbfcode{\sphinxupquote{status}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + \index{fit() (pine.pipelines.pipeline.Pipeline method)@\spxentry{fit()}\spxextra{pine.pipelines.pipeline.Pipeline method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{abstract }}\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{abstract }}\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}, \emph{\DUrole{o}{**}\DUrole{n}{params}}}{} \end{fulllineitems} \index{predict() (pine.pipelines.pipeline.Pipeline method)@\spxentry{predict()}\spxextra{pine.pipelines.pipeline.Pipeline method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{abstract }}\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{abstract }}\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}{\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.DocumentPredictions}]{\sphinxcrossref{DocumentPredictions}}}\DUrole{p}{{]}}}} \end{fulllineitems} \index{predict\_proba() (pine.pipelines.pipeline.Pipeline method)@\spxentry{predict\_proba()}\spxextra{pine.pipelines.pipeline.Pipeline method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{abstract }}\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{abstract }}\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{{ $\rightarrow$ List\DUrole{p}{{[}}{\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.DocumentPredictionProbabilities}]{\sphinxcrossref{DocumentPredictionProbabilities}}}\DUrole{p}{{]}}}} \end{fulllineitems} \index{next\_example() (pine.pipelines.pipeline.Pipeline method)@\spxentry{next\_example()}\spxextra{pine.pipelines.pipeline.Pipeline method}} @@ -13401,22 +14793,34 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.pipe_init}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{pipe\_init}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{x}}, \emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \end{fulllineitems} +\index{pipeline\_class() (pine.pipelines.pmap\_ner.NER property)@\spxentry{pipeline\_class()}\spxextra{pine.pipelines.pmap\_ner.NER property}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.pipeline_class}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{property }}\sphinxbfcode{\sphinxupquote{pipeline\_class}}}{\emph{\DUrole{n}{self}}}{} +\end{fulllineitems} + +\index{status() (pine.pipelines.pmap\_ner.NER method)@\spxentry{status()}\spxextra{pine.pipelines.pmap\_ner.NER method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{status}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + \index{fit() (pine.pipelines.pmap\_ner.NER method)@\spxentry{fit()}\spxextra{pine.pipelines.pmap\_ner.NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}, \emph{\DUrole{n}{kwargs}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}, \emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} \end{fulllineitems} \index{predict() (pine.pipelines.pmap\_ner.NER method)@\spxentry{predict()}\spxextra{pine.pipelines.pmap\_ner.NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}DocumentPredictions\DUrole{p}{{]}}}} \end{fulllineitems} \index{predict\_proba() (pine.pipelines.pmap\_ner.NER method)@\spxentry{predict\_proba()}\spxextra{pine.pipelines.pmap\_ner.NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}, \emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{{ $\rightarrow$ List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}} \end{fulllineitems} \index{evaluate() (pine.pipelines.pmap\_ner.NER method)@\spxentry{evaluate()}\spxextra{pine.pipelines.pmap\_ner.NER method}} @@ -13434,7 +14838,7 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \index{save\_model() (pine.pipelines.pmap\_ner.NER method)@\spxentry{save\_model()}\spxextra{pine.pipelines.pmap\_ner.NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.save_model}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{save\_model}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model\_path}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/pmap_ner/index:pine.pipelines.pmap_ner.NER.save_model}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{save\_model}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model\_name}}}{} \end{fulllineitems} \index{load\_model() (pine.pipelines.pmap\_ner.NER method)@\spxentry{load\_model()}\spxextra{pine.pipelines.pmap\_ner.NER method}} @@ -13493,12 +14897,24 @@ Compatible with: spaCy v2.0.0+ \\ \hline \end{longtable}\sphinxatlongtableend\end{savenotes} +\index{logger (in module pine.pipelines.spacy\_NER\_pipeline)@\spxentry{logger}\spxextra{in module pine.pipelines.spacy\_NER\_pipeline}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.logger}}\pysigline{\sphinxcode{\sphinxupquote{pine.pipelines.spacy\_NER\_pipeline.}}\sphinxbfcode{\sphinxupquote{logger}}} +\end{fulllineitems} + \index{spacy\_NER (class in pine.pipelines.spacy\_NER\_pipeline)@\spxentry{spacy\_NER}\spxextra{class in pine.pipelines.spacy\_NER\_pipeline}} \begin{fulllineitems} \phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{pine.pipelines.spacy\_NER\_pipeline.}}\sphinxbfcode{\sphinxupquote{spacy\_NER}}}{\emph{\DUrole{n}{model\_path}\DUrole{o}{=}\DUrole{default_value}{None}}}{} \sphinxAtStartPar Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelines.pipeline.Pipeline}]{\sphinxcrossref{\sphinxcode{\sphinxupquote{pine.pipelines.pipeline.Pipeline}}}}} +\index{\_\_model (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER attribute)@\spxentry{\_\_model}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.__model}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_model}}} +\end{fulllineitems} + \index{\_\_nlp (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER attribute)@\spxentry{\_\_nlp}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER attribute}} \begin{fulllineitems} @@ -13517,10 +14933,28 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.__optimizer}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_optimizer}}\sphinxbfcode{\sphinxupquote{ = {[}{]}}}} \end{fulllineitems} +\index{\_\_default\_fit\_params (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER attribute)@\spxentry{\_\_default\_fit\_params}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER attribute}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.__default_fit_params}}\pysigline{\sphinxbfcode{\sphinxupquote{\_\_default\_fit\_params}}} +\end{fulllineitems} + +\index{\_load\_model() (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method)@\spxentry{\_load\_model()}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER._load_model}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{\_load\_model}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model\_path}\DUrole{o}{=}\DUrole{default_value}{None}}}{} +\end{fulllineitems} + +\index{status() (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method)@\spxentry{status()}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method}} + +\begin{fulllineitems} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.status}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{status}}}{\emph{\DUrole{n}{self}}}{{ $\rightarrow$ \sphinxhref{https://docs.python.org/3/library/stdtypes.html\#dict}{dict}}} +\end{fulllineitems} + \index{fit() (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method)@\spxentry{fit()}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}, \emph{\DUrole{n}{params}\DUrole{o}{=}\DUrole{default_value}{None}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.fit}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{fit}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{y}}, \emph{\DUrole{o}{**}\DUrole{n}{params}}}{} \end{fulllineitems} \index{evaluate() (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method)@\spxentry{evaluate()}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method}} @@ -13532,13 +14966,13 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \index{predict() (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method)@\spxentry{predict()}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.predict}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}}{{ $\rightarrow$ List\DUrole{p}{{[}}DocumentPredictions\DUrole{p}{{]}}}} \end{fulllineitems} \index{predict\_proba() (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method)@\spxentry{predict\_proba()}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}}, \emph{\DUrole{n}{Xid}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.predict_proba}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{predict\_proba}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{X}\DUrole{p}{:} \DUrole{n}{Iterable\DUrole{p}{{[}}\sphinxhref{https://docs.python.org/3/library/stdtypes.html\#str}{str}\DUrole{p}{{]}}}}, \emph{\DUrole{o}{**}\DUrole{n}{kwargs}}}{{ $\rightarrow$ List\DUrole{p}{{[}}DocumentPredictionProbabilities\DUrole{p}{{]}}}} \end{fulllineitems} \index{next\_example() (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method)@\spxentry{next\_example()}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method}} @@ -13562,13 +14996,13 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \index{save\_model() (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method)@\spxentry{save\_model()}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.save_model}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{save\_model}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model\_path}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.save_model}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{save\_model}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model\_name}}}{} \end{fulllineitems} \index{load\_model() (pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method)@\spxentry{load\_model()}\spxextra{pine.pipelines.spacy\_NER\_pipeline.spacy\_NER method}} \begin{fulllineitems} -\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.load_model}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{load\_model}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model\_path}}}{} +\phantomsection\label{\detokenize{autoapi/pine/pipelines/spacy_NER_pipeline/index:pine.pipelines.spacy_NER_pipeline.spacy_NER.load_model}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{load\_model}}}{\emph{\DUrole{n}{self}}, \emph{\DUrole{n}{model\_name}}}{} \end{fulllineitems} @@ -13603,6 +15037,8 @@ Bases: {\hyperref[\detokenize{autoapi/pine/pipelines/pipeline/index:pine.pipelin \item\relax\sphinxstyleindexentry{pine.backend.admin.bp}\sphinxstyleindexpageref{autoapi/pine/backend/admin/bp/index:\detokenize{module-pine.backend.admin.bp}} \item\relax\sphinxstyleindexentry{pine.backend.annotations}\sphinxstyleindexpageref{autoapi/pine/backend/annotations/index:\detokenize{module-pine.backend.annotations}} \item\relax\sphinxstyleindexentry{pine.backend.annotations.bp}\sphinxstyleindexpageref{autoapi/pine/backend/annotations/bp/index:\detokenize{module-pine.backend.annotations.bp}} +\item\relax\sphinxstyleindexentry{pine.backend.api}\sphinxstyleindexpageref{autoapi/pine/backend/api/index:\detokenize{module-pine.backend.api}} +\item\relax\sphinxstyleindexentry{pine.backend.api.bp}\sphinxstyleindexpageref{autoapi/pine/backend/api/bp/index:\detokenize{module-pine.backend.api.bp}} \item\relax\sphinxstyleindexentry{pine.backend.app}\sphinxstyleindexpageref{autoapi/pine/backend/app/index:\detokenize{module-pine.backend.app}} \item\relax\sphinxstyleindexentry{pine.backend.auth}\sphinxstyleindexpageref{autoapi/pine/backend/auth/index:\detokenize{module-pine.backend.auth}} \item\relax\sphinxstyleindexentry{pine.backend.auth.bp}\sphinxstyleindexpageref{autoapi/pine/backend/auth/bp/index:\detokenize{module-pine.backend.auth.bp}} diff --git a/docs/build/singlehtml/index.html b/docs/build/singlehtml/index.html index b63c34a..ddd4312 100644 --- a/docs/build/singlehtml/index.html +++ b/docs/build/singlehtml/index.html @@ -358,6 +358,75 @@ request to create a new entry. pine.backend.annotations.bp.init_app(app)