diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a2db77de..e143fbd5 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -33,7 +33,7 @@ } }, // Install ezkl cli, done here instead of the Dockerfile to test new versions without rebuilding the image. - "onCreateCommand": "curl https://raw.githubusercontent.com/zkonduit/ezkl/main/install_ezkl_cli.sh | bash -s v19.0.7", + "onCreateCommand": "curl https://raw.githubusercontent.com/zkonduit/ezkl/main/install_ezkl_cli.sh | bash -s v22.2.1", "postCreateCommand": "uv tool install bittensor-cli", "remoteEnv": { "PATH": "${containerEnv:PATH}:/home/vscode/.ezkl" diff --git a/cspell.json b/cspell.json index 06533650..86e21a23 100644 --- a/cspell.json +++ b/cspell.json @@ -12,6 +12,9 @@ "CIRCOM", "circuitized", "coldkey", + "dslice", + "dslices", + "dsperse", "dtype", "ezkl", "fastapi", @@ -41,6 +44,7 @@ "uvicorn", "venv", "wandb", + "winddown", "zkproof" ], "ignoreWords": [], diff --git a/neurons/_miner/miner_session.py b/neurons/_miner/miner_session.py index 0358d400..a047909b 100644 --- a/neurons/_miner/miner_session.py +++ b/neurons/_miner/miner_session.py @@ -23,10 +23,12 @@ SINGLE_PROOF_OF_WEIGHTS_MODEL_ID, ) from deployment_layer.circuit_store import circuit_store +from execution_layer.dsperse_manager import DSperseManager from execution_layer.generic_input import GenericInput from execution_layer.verified_model_session import VerifiedModelSession from protocol import ( Competition, + DSliceProofGenerationDataModel, ProofOfWeightsDataModel, QueryForCapacities, QueryZkProof, @@ -48,6 +50,7 @@ def __init__(self): self.configure() self.check_register(should_exit=True) self.auto_update = AutoUpdate() + self.dsperse_manager = DSperseManager() self.log_batch = [] self.shuffled_uids = None self.last_shuffle_epoch = -1 @@ -80,6 +83,10 @@ def start_server(self) -> bool: self.server.register_route( path=f"/{QueryForCapacities.name}", endpoint=self.handleCapacityRequest ) + self.server.register_route( + path=f"/{DSliceProofGenerationDataModel.name}", + endpoint=self.handleDSliceRequest, + ) self.server.start() existing_miner = self.metagraph.axons[self.subnet_uid] @@ -466,6 +473,24 @@ def handleCompetitionRequest(self, data: Competition) -> JSONResponse: status_code=500, ) + def handleDSliceRequest(self, data: DSliceProofGenerationDataModel) -> JSONResponse: + """ + Handle DSlice proof generation requests from validators. + """ + bt.logging.info( + f"Handling DSlice proof generation request for slice_num={data.slice_num} run_uid={data.run_uid}" + ) + + result = self.dsperse_manager.prove_slice( + circuit_id=data.circuit, + slice_num=data.slice_num, + inputs=data.inputs, + outputs=data.outputs, + ) + + # Implementation for handling DSlice slice requests goes here + return JSONResponse(content=result, status_code=200) + def queryZkProof(self, data: QueryZkProof) -> JSONResponse: """ This function run proof generation of the model (with its output as well) diff --git a/neurons/_validator/api/__init__.py b/neurons/_validator/api/__init__.py index fe0bc430..d69f19df 100644 --- a/neurons/_validator/api/__init__.py +++ b/neurons/_validator/api/__init__.py @@ -23,6 +23,7 @@ import bittensor as bt from _validator.models.poc_rpc_request import ProofOfComputationRPCRequest from _validator.models.pow_rpc_request import ProofOfWeightsRPCRequest +from _validator.models.base_rpc_request import QueuedRequestDataModel import hashlib from constants import ( MAX_SIGNATURE_LIFESPAN, @@ -70,9 +71,10 @@ def _should_rate_limit(ip: str): class ValidatorAPI: def __init__(self, config: ValidatorConfig): self.config = config - self.external_requests_queue: list[ - ProofOfWeightsRPCRequest | ProofOfComputationRPCRequest - ] = [] + # a Queue of requests to be sent to miners + # consists of "real world requests" ProofOfWeightsRPCRequest and ProofOfComputationRPCRequest + # and a Request with one slice of a DSperse model (DSlice) + self.stacked_requests_queue: list[QueuedRequestDataModel] = [] self.ws_manager = WebSocketManager() self.recent_requests: dict[str, int] = {} self.validator_keys_cache = ValidatorKeysCache(config) @@ -282,7 +284,7 @@ async def handle_proof_of_weights( return InvalidParams(str(e)) self.pending_requests[external_request.hash] = asyncio.Event() - self.external_requests_queue.insert(0, external_request) + self.stacked_requests_queue.insert(0, external_request) bt.logging.success( f"External request with hash {external_request.hash} added to queue" ) @@ -341,7 +343,7 @@ async def handle_proof_of_computation( return InvalidParams(str(e)) self.pending_requests[external_request.hash] = asyncio.Event() - self.external_requests_queue.insert(0, external_request) + self.stacked_requests_queue.insert(0, external_request) bt.logging.success( f"External request with hash {external_request.hash} added to queue" ) diff --git a/neurons/_validator/api/client.py b/neurons/_validator/api/client.py index ecf640d3..52ce6382 100644 --- a/neurons/_validator/api/client.py +++ b/neurons/_validator/api/client.py @@ -1,11 +1,11 @@ import hashlib import json import time -import traceback import bittensor as bt import httpx +from _validator.models.miner_response import MinerResponse from _validator.core.request import Request from utils.signatures import Headers @@ -14,44 +14,31 @@ async def query_miner( httpx_client: httpx.AsyncClient, request: Request, wallet: bt.wallet, -) -> Request | None: - try: - # Use httpx.URL for safer URL construction - url = httpx.URL( - scheme="http", - host=request.ip, - port=request.port, - path=f"/{request.url_path.lstrip('/')}", - ) - content = json.dumps(request.data) - - headers = get_headers(request, content, wallet) - - start_time = time.perf_counter() - response = await httpx_client.post( - url=url, - content=content, - timeout=request.circuit.timeout if request.circuit else None, - headers=headers, - ) - response.raise_for_status() - end_time = time.perf_counter() - - result = response.json() - request.response_time = end_time - start_time - request.deserialized = result - return request - - except httpx.InvalidURL: - bt.logging.warning( - f"Ignoring UID as there is not a valid URL: {request.uid}. {request.ip}:{request.port}" - ) - return None - - except httpx.HTTPError as e: - bt.logging.warning(f"Failed to query miner for UID: {request.uid}. Error: {e}") - traceback.print_exc() - return None +) -> MinerResponse: + # Use httpx.URL for safer URL construction + url = httpx.URL( + scheme="http", + host=request.ip, + port=request.port, + path=f"/{request.url_path.lstrip('/')}", + ) + content = json.dumps(request.data) + + headers = get_headers(request, content, wallet) + + start_time = time.perf_counter() + response = await httpx_client.post( + url=url, + content=content, + timeout=request.circuit.timeout if request.circuit else None, + headers=headers, + ) + response.raise_for_status() + end_time = time.perf_counter() + + request.response_time = end_time - start_time + + return MinerResponse.from_raw_response(request, response.json()) def get_headers(request: Request, content: str, wallet: bt.wallet) -> dict: diff --git a/neurons/_validator/core/exceptions.py b/neurons/_validator/core/exceptions.py new file mode 100644 index 00000000..aaf98f21 --- /dev/null +++ b/neurons/_validator/core/exceptions.py @@ -0,0 +1,28 @@ +"""Custom exceptions for validator core operations.""" + + +class ProofException(Exception): + """Base exception for proof-related errors.""" + + def __init__(self, uid: int, circuit: str, message: str = ""): + self.uid = uid + self.circuit = circuit + self.message = message + super().__init__(self.message) + + +class EmptyProofException(ProofException): + """Raised when miner fails to provide a proof.""" + + def __init__(self, uid: int, circuit: str, raw_response: str | None = None): + self.raw_response = raw_response + message = f"Miner at UID {uid} failed to provide a valid proof for {circuit}." + super().__init__(uid, circuit, message) + + +class IncorrectProofException(ProofException): + """Raised when proof verification fails.""" + + def __init__(self, uid: int, circuit: str): + message = f"Miner at UID {uid} provided an incorrect proof for {circuit}." + super().__init__(uid, circuit, message) diff --git a/neurons/_validator/core/request.py b/neurons/_validator/core/request.py index 6c3bd239..4e9a50b6 100644 --- a/neurons/_validator/core/request.py +++ b/neurons/_validator/core/request.py @@ -1,6 +1,7 @@ from dataclasses import dataclass from typing import Any +from _validator.models.base_rpc_request import QueuedRequestDataModel from _validator.models.request_type import RequestType from execution_layer.circuit import Circuit from execution_layer.generic_input import GenericInput @@ -22,7 +23,15 @@ class Request: circuit: Circuit | None = None data: dict[str, Any] | None = None inputs: GenericInput | None = None - request_hash: str | None = None + dsperse_slice_num: int | None = None + dsperse_run_uid: str | None = None + # next one is used only for rescheduling DSlice and RWR requests in case of failure + queued_request: QueuedRequestDataModel | None = None + # `external_request_hash` is the hash of the original request from external API user + # we use it to report back results to `ValidatorAPI`` class. It sends the results to the user. + external_request_hash: str | None = None + # `guard_hash` is the hash used by HashGuard to prevent duplicate requests + # It's calculated from the inputs of the request. + guard_hash: str | None = None response_time: float | None = None - deserialized: dict[str, object] | None = None save: bool = False diff --git a/neurons/_validator/core/request_pipeline.py b/neurons/_validator/core/request_pipeline.py index 23bc35ff..b2c2ad91 100644 --- a/neurons/_validator/core/request_pipeline.py +++ b/neurons/_validator/core/request_pipeline.py @@ -21,7 +21,11 @@ from deployment_layer.circuit_store import circuit_store from execution_layer.circuit import Circuit, CircuitType from execution_layer.generic_input import GenericInput -from protocol import ProofOfWeightsDataModel, QueryZkProof +from protocol import ( + ProofOfWeightsDataModel, + QueryZkProof, + DSliceProofGenerationDataModel, +) from utils.wandb_logger import safe_log @@ -34,53 +38,40 @@ def __init__( self.api = api self.hash_guard = HashGuard() - def prepare_requests(self, filtered_uids) -> list[Request]: - """ - Prepare requests for the current validation step. - This includes both regular benchmark requests and any external requests. - - Args: - filtered_uids (list): List of UIDs to send requests to. - - Returns: - list[Request]: List of prepared requests. - """ - if len(filtered_uids) == 0: - bt.logging.error("No UIDs to query") - return [] - - if self.api.external_requests_queue: - return self._prepare_real_world_requests(filtered_uids) - return self._prepare_benchmark_requests(filtered_uids) - def _check_and_create_request( self, uid: int, - request_data: ProofOfWeightsDataModel | QueryZkProof, + request_data: ( + ProofOfWeightsDataModel | QueryZkProof | DSliceProofGenerationDataModel + ), circuit: Circuit, request_type: RequestType, - request_hash: str | None = None, + external_request_hash: str | None = None, save: bool = False, ) -> Request | None: """Check hash and create request if valid.""" try: - if isinstance(request_data, ProofOfWeightsDataModel): + if isinstance(request_data, ProofOfWeightsDataModel) or isinstance( + request_data, DSliceProofGenerationDataModel + ): input_data = request_data.inputs else: input_data = request_data.query_input - self.hash_guard.check_hash(input_data) - except Exception as e: + # Check hash to prevent duplicate requests + guard_hash = self.hash_guard.check_hash(input_data) + except ValueError as e: bt.logging.error(f"Hash already exists: {e}") safe_log({"hash_guard_error": 1}) if request_type == RequestType.RWR: self.api.set_request_result( - request_hash, {"success": False, "error": "Hash already exists"} + external_request_hash, + {"success": False, "error": "Hash already exists"}, ) return None axon: AxonInfo = self.config.metagraph.axons[uid] - return Request( + request = Request( uid=uid, ip=axon.ip, port=axon.port, @@ -91,59 +82,64 @@ def _check_and_create_request( circuit=circuit, request_type=request_type, # 'inputs' are used for verification later on validator side: + # I suppose `RWR` passed here to prevent new data generation inputs=GenericInput(RequestType.RWR, input_data), - request_hash=request_hash, + external_request_hash=external_request_hash, + guard_hash=guard_hash, save=save, ) - def _prepare_real_world_requests(self, filtered_uids: list[int]) -> list[Request]: - external_request = self.api.external_requests_queue.pop() - requests = [] + if isinstance(request_data, DSliceProofGenerationDataModel): + # Add dsperse specific fields + request.dsperse_slice_num = request_data.slice_num + request.dsperse_run_uid = request_data.run_uid - for uid in filtered_uids: - try: - request_data, save = self.get_request_data( - RequestType.RWR, external_request.circuit, external_request - ) - request = self._check_and_create_request( - uid=uid, - request_data=request_data, - circuit=external_request.circuit, - request_type=RequestType.RWR, - request_hash=external_request.hash, - save=save, - ) - if request: - requests.append(request) - except Exception as e: - bt.logging.error(f"Error preparing request for UID {uid}: {e}") - traceback.print_exc() + return request + + def _prepare_queued_request(self, uid: int) -> Request: + external_request = self.api.stacked_requests_queue.pop() + request = None + + try: + request_data, save = self.get_request_data( + external_request.request_type, + external_request.circuit, + external_request, + ) + request = self._check_and_create_request( + uid=uid, + request_data=request_data, + circuit=external_request.circuit, + request_type=external_request.request_type, + external_request_hash=external_request.hash, + save=save, + ) + if request: + request.queued_request = external_request + except Exception as e: + bt.logging.error(f"Error preparing request for UID {uid}: {e}") + traceback.print_exc() + if external_request.request_type == RequestType.RWR: self.api.set_request_result( external_request.hash, {"success": False, "error": "Error preparing request"}, ) - continue - return requests + return request - def _prepare_benchmark_requests(self, filtered_uids: list[int]) -> list[Request]: + def _prepare_benchmark_request(self, uid: int) -> Request: circuit = self.select_circuit_for_benchmark() if circuit is None: bt.logging.error("No circuit selected") - return [] + return None - requests = [] - for uid in filtered_uids: - request_data, save = self.get_request_data(RequestType.BENCHMARK, circuit) - request = self._check_and_create_request( - uid=uid, - request_data=request_data, - circuit=circuit, - request_type=RequestType.BENCHMARK, - save=save, - ) - if request: - requests.append(request) - return requests + request_data, save = self.get_request_data(RequestType.BENCHMARK, circuit) + return self._check_and_create_request( + uid=uid, + request_data=request_data, + circuit=circuit, + request_type=RequestType.BENCHMARK, + save=save, + ) def select_circuit_for_benchmark(self) -> Circuit: """ @@ -169,7 +165,7 @@ def get_request_data( circuit.input_handler(request_type) if request_type == RequestType.BENCHMARK else circuit.input_handler( - RequestType.RWR, + request_type, copy.deepcopy(request.inputs), ) ) @@ -207,6 +203,17 @@ def get_request_data( QueryZkProof(query_input=inputs, model_id=circuit.id, query_output=""), False, ) + elif circuit.metadata.type == CircuitType.DSPERSE_PROOF_GENERATION: + return ( + DSliceProofGenerationDataModel( + circuit=circuit.id, + inputs=request.inputs, + outputs=request.outputs, + slice_num=request.slice_num, + run_uid=request.run_uid, + ), + False, + ) return ( ProofOfWeightsDataModel( @@ -219,20 +226,3 @@ def get_request_data( ), False, ) - - def prepare_single_request(self, uid: int) -> Request | None: - """ - Prepare a single request for a specific UID. - - Args: - uid (int): The UID to prepare a request for. - - Returns: - Request | None: The prepared request, or None if preparation failed. - """ - if self.api.external_requests_queue: - requests = self._prepare_real_world_requests([uid]) - else: - requests = self._prepare_benchmark_requests([uid]) - - return requests[0] if requests else None diff --git a/neurons/_validator/core/response_processor.py b/neurons/_validator/core/response_processor.py index 537141ac..b853559f 100644 --- a/neurons/_validator/core/response_processor.py +++ b/neurons/_validator/core/response_processor.py @@ -1,81 +1,94 @@ from __future__ import annotations -import traceback + import time + import bittensor as bt -from _validator.core.request import Request -from _validator.models.completed_proof_of_weights import CompletedProofOfWeightsItem -from _validator.models.miner_response import MinerResponse -from _validator.models.request_type import RequestType -from _validator.scoring.score_manager import ScoreManager +from execution_layer.dsperse_manager import DSperseManager from execution_layer.generic_input import GenericInput from execution_layer.verified_model_session import VerifiedModelSession -from substrateinterface import Keypair + +from _validator.core.exceptions import EmptyProofException, IncorrectProofException +from _validator.models.miner_response import MinerResponse +from _validator.models.request_type import RequestType class ResponseProcessor: - def __init__( - self, - metagraph, - score_manager: ScoreManager, - user_uid, - hotkey: Keypair, - ): - self.metagraph = metagraph - self.score_manager = score_manager - self.user_uid = user_uid - self.hotkey = hotkey - self.proof_batches_queue = [] - self.completed_proof_of_weights_queue: list[CompletedProofOfWeightsItem] = [] + def __init__(self, dsperse_manager: DSperseManager): + self.dsperse_manager = dsperse_manager - def process_single_response(self, response: Request | None) -> MinerResponse | None: - if response is None: - return None - miner_response = MinerResponse.from_raw_response(response) - if miner_response.proof_content is None: - bt.logging.debug( + def verify_single_response( + self, miner_response: MinerResponse + ) -> MinerResponse | None: + """ + Verify a single response from a miner + + Raises: + EmptyProofException: If miner fails to provide a proof. + IncorrectProofException: If proof verification fails. + """ + circuit_str = str(miner_response.circuit) + + if not miner_response.proof_content: + bt.logging.error( f"Miner at UID: {miner_response.uid} failed to provide a valid proof for " - f"{str(miner_response.circuit)}." - f"Response from miner: {miner_response.raw}" + f"{circuit_str}. Response from miner: {miner_response.raw}" + ) + raise EmptyProofException( + uid=miner_response.uid, + circuit=circuit_str, + raw_response=miner_response.raw, ) - elif miner_response.proof_content: + + bt.logging.debug( + f"Attempting to verify proof for UID: {miner_response.uid} " + f"using {circuit_str}." + ) + + start_time = time.time() + verification_result = self._verify_response_proof( + miner_response, miner_response.inputs + ) + miner_response.verification_time = time.time() - start_time + miner_response.verification_result = verification_result + + if not verification_result: bt.logging.debug( - f"Attempting to verify proof for UID: {miner_response.uid} " - f"using {str(miner_response.circuit)}." + f"Miner at UID: {miner_response.uid} provided a proof" + f" for {circuit_str}, but verification failed." + ) + raise IncorrectProofException( + uid=miner_response.uid, + circuit=circuit_str, ) - try: - start_time = time.time() - verification_result = self.verify_proof_string( - miner_response, response.inputs - ) - miner_response.verification_time = time.time() - start_time - miner_response.set_verification_result(verification_result) - if not verification_result: - bt.logging.debug( - f"Miner at UID: {miner_response.uid} provided a proof" - f" for {str(miner_response.circuit)}" - ", but verification failed." - ) - except Exception as e: - bt.logging.debug( - f"Unable to verify proof for UID: {miner_response.uid}. Error: {e}" - ) - traceback.print_exc() - if miner_response.verification_result: - bt.logging.debug( - f"Miner at UID: {miner_response.uid} provided a valid proof " - f"for {str(miner_response.circuit)} " - f"in {miner_response.response_time} seconds." - ) + bt.logging.debug( + f"Miner at UID: {miner_response.uid} provided a valid proof " + f"for {circuit_str} in {miner_response.response_time} seconds." + ) return miner_response - def verify_proof_string( + def _verify_response_proof( self, response: MinerResponse, validator_inputs: GenericInput ) -> bool: - if not response.proof_content or not response.public_json: - bt.logging.error(f"Proof or public json not found for UID: {response.uid}") + """ + Verify the proof contained in the miner's response. + """ + if not response.proof_content: + bt.logging.error(f"Proof not found for UID: {response.uid}") return False - try: + + if response.request_type == RequestType.DSLICE: + res = self.dsperse_manager.verify_slice_proof( + run_uid=response.dsperse_run_uid, + slice_num=response.dsperse_slice_num, + proof=response.proof_content, + ) + self.dsperse_manager.check_run_completion( + run_uid=response.dsperse_run_uid, remove_completed=True + ) + else: + if not response.public_json: + raise ValueError(f"Public signals not found in for UID: {response.uid}") inference_session = VerifiedModelSession( GenericInput(RequestType.RWR, response.public_json), response.circuit, @@ -84,6 +97,4 @@ def verify_proof_string( validator_inputs, response.proof_content ) inference_session.end() - return res - except Exception as e: - raise e + return res diff --git a/neurons/_validator/core/validator_loop.py b/neurons/_validator/core/validator_loop.py index 426d0770..3ae00389 100644 --- a/neurons/_validator/core/validator_loop.py +++ b/neurons/_validator/core/validator_loop.py @@ -14,11 +14,13 @@ import httpx from bittensor.core.chain_data import AxonInfo +import cli_parser from _validator.api import ValidatorAPI from _validator.api.client import query_miner from _validator.competitions.competition import Competition from _validator.config import ValidatorConfig from _validator.core.capacity_manager import CapacityManager +from _validator.core.exceptions import EmptyProofException, IncorrectProofException from _validator.core.prometheus import ( log_error, log_queue_metrics, @@ -47,10 +49,14 @@ ONE_HOUR, ONE_MINUTE, ) +from execution_layer.dsperse_manager import DSperseManager from utils import AutoUpdate, clean_temp_files, with_rate_limit from utils.gc_logging import gc_log_competition_metrics from utils.gc_logging import log_responses as gc_log_responses +# Set to True for synchronous request processing (easier debugging) +DEBUG_SYNC_MODE = os.environ.get("DEBUG_SYNC_MODE", "").lower() in ("1", "true", "yes") + class ValidatorLoop: """ @@ -75,6 +81,7 @@ def __init__(self, config: ValidatorConfig): self.competition_to_validator_queue = MPQueue() # Messages FROM competition self.current_concurrency = MAX_CONCURRENT_REQUESTS self.capacity_manager = CapacityManager(self.config, self.httpx_client) + self.dsperse_manager = DSperseManager() try: competition_id = 1 bt.logging.info("Initializing competition module...") @@ -102,12 +109,7 @@ def __init__(self, config: ValidatorConfig): self.config.full_path_score, self.competition, ) - self.response_processor = ResponseProcessor( - self.config.metagraph, - self.score_manager, - self.config.user_uid, - self.config.wallet.hotkey, - ) + self.response_processor = ResponseProcessor(self.dsperse_manager) self.weights_manager = WeightsManager( self.config.subtensor, self.config.metagraph, @@ -254,7 +256,7 @@ def update_competition_metrics(self): try: metrics_to_log = self.competition.get_summary_for_logging() - if metrics_to_log: + if metrics_to_log and not cli_parser.config.disable_metric_logging: metrics_to_log["validator_key"] = ( self.config.wallet.hotkey.ss58_address ) @@ -287,80 +289,117 @@ async def log_responses(self): if self.recent_responses: console_log_responses(self.recent_responses) - try: - block = ( - self.config.metagraph.block.item() - if self.config.metagraph.block is not None - else 0 - ) - _ = await asyncio.get_event_loop().run_in_executor( - self.thread_pool, - lambda: gc_log_responses( - self.config.metagraph, - self.config.wallet.hotkey, - self.config.user_uid, - self.recent_responses, - ( - time.time() - self.last_response_time - if hasattr(self, "last_response_time") - else 0 + if not cli_parser.config.disable_metric_logging: + try: + block = ( + self.config.metagraph.block.item() + if self.config.metagraph.block is not None + else 0 + ) + _ = await asyncio.get_event_loop().run_in_executor( + self.thread_pool, + lambda: gc_log_responses( + self.config.metagraph, + self.config.wallet.hotkey, + self.config.user_uid, + self.recent_responses, + ( + time.time() - self.last_response_time + if hasattr(self, "last_response_time") + else 0 + ), + block, + self.score_manager.scores, ), - block, - self.score_manager.scores, - ), - ) - except Exception as e: - bt.logging.error(f"Error in GC logging: {e}") + ) + except Exception as e: + bt.logging.error(f"Error in GC logging: {e}") self.last_response_time = time.time() self.recent_responses = [] + async def maintain_competitions(self): + """ + Maintain competition message handling. + """ + try: + message = await asyncio.get_event_loop().run_in_executor( + self.thread_pool, + lambda: self.competition_to_validator_queue.get(timeout=0.1), + ) + if message == ValidatorMessage.WINDDOWN: + bt.logging.info( + "Received winddown message, reducing concurrency to zero" + ) + self.current_concurrency = 0 + elif message == ValidatorMessage.COMPETITION_COMPLETE: + bt.logging.info( + "Received competition complete message, restoring concurrency" + ) + self.current_concurrency = MAX_CONCURRENT_REQUESTS + except Empty: + bt.logging.trace("No messages in competition queue") + except Exception as e: + bt.logging.error(f"Error in competition message handling: {e}") + traceback.print_exc() + async def maintain_request_pool(self): + """ + Maintain the pool of active requests to miners. + Basically, the main loop of the validator. + """ while self._should_run: + await self.maintain_competitions() try: - try: - message = await asyncio.get_event_loop().run_in_executor( - self.thread_pool, - lambda: self.competition_to_validator_queue.get(timeout=0.1), - ) - if message == ValidatorMessage.WINDDOWN: - bt.logging.info( - "Received winddown message, reducing concurrency to zero" - ) - self.current_concurrency = 0 - elif message == ValidatorMessage.COMPETITION_COMPLETE: - bt.logging.info( - "Received competition complete message, restoring concurrency" - ) - self.current_concurrency = MAX_CONCURRENT_REQUESTS - except Empty: - bt.logging.trace("No messages in competition queue") - except Exception as e: - bt.logging.error(f"Error in competition message handling: {e}") - traceback.print_exc() - slots_available = self.current_concurrency - len(self.active_tasks) - if slots_available > 0: - available_uids = [ - uid - for uid in self.queryable_uids - if uid not in self.processed_uids - and uid not in self.active_tasks - ] + if not slots_available: + await asyncio.sleep(1) + continue + + if not self.api.stacked_requests_queue: + # Refill the stacked requests queue from DSperse manager if needed + for ( + dslice_request + ) in self.dsperse_manager.generate_dslice_requests(): + self.api.stacked_requests_queue.insert(0, dslice_request) + + # available miners to send requests to + available_uids = [ + uid + for uid in self.queryable_uids + if uid not in self.processed_uids and uid not in self.active_tasks + ] + + for uid in available_uids[:slots_available]: + if self.api.stacked_requests_queue: + request = self.request_pipeline._prepare_queued_request(uid) + else: + request = self.request_pipeline._prepare_benchmark_request(uid) - for uid in available_uids[:slots_available]: - request: Request = self.request_pipeline.prepare_single_request( - uid + if not request: + bt.logging.warning( + f"Empty request prepared for UID {uid}, skipping" + ) + continue + + if DEBUG_SYNC_MODE: + # Synchronous mode for easier debugging -- NOT FOR PRODUCTION + bt.logging.debug( + f"[SYNC MODE] Processing request for UID {uid}" + ) + self.active_tasks[uid] = "dummy_task_object" # type: ignore + await self._process_single_request(request) + self._handle_completed_task(uid) + else: + # Asynchronous mode for normal operation + task = asyncio.create_task( + self._process_single_request(request) + ) + self.active_tasks[uid] = task + task.add_done_callback( + lambda _, uid=uid: self._handle_completed_task(uid) ) - if request: - task = asyncio.create_task( - self._process_single_request(request) - ) - self.active_tasks[uid] = task - task.add_done_callback( - lambda t, uid=uid: self._handle_completed_task(t, uid) - ) await asyncio.sleep(0) except Exception as e: @@ -368,26 +407,22 @@ async def maintain_request_pool(self): traceback.print_exc() await asyncio.sleep(EXCEPTION_DELAY_SECONDS) - def _handle_completed_task(self, task: asyncio.Task, uid: int): - try: - self.processed_uids.add(uid) - except Exception as e: - bt.logging.error(f"Error in task for UID {uid}: {e}") - traceback.print_exc() - finally: - if uid in self.active_tasks: - del self.active_tasks[uid] - if ( - self.current_concurrency == 0 - and not self.active_tasks - and self.competition - ): - bt.logging.info( - "All tasks completed during winddown, sending winddown complete message" - ) - self.validator_to_competition_queue.put( - ValidatorMessage.WINDDOWN_COMPLETE - ) + def _handle_completed_task(self, uid: int): + self.processed_uids.add(uid) + + if uid in self.active_tasks: + del self.active_tasks[uid] + if ( + self.current_concurrency == 0 + and not self.active_tasks + and self.competition + ): + bt.logging.info( + "All tasks completed during winddown, sending winddown complete message" + ) + self.validator_to_competition_queue.put( + ValidatorMessage.WINDDOWN_COMPLETE + ) async def run_periodic_tasks(self): while self._should_run: @@ -438,32 +473,72 @@ async def run(self) -> NoReturn: finally: await self._cleanup() - async def _process_single_request(self, request: Request) -> Request: + async def _process_single_request(self, request: Request) -> None: """ - Process a single request and return the response. + Perform a single request to a miner and handle the response. """ + response: MinerResponse | None = None try: response = await query_miner( self.httpx_client, request, self.config.wallet, ) - if response is None: - return request - processed_response: ( - MinerResponse | None - ) = await asyncio.get_event_loop().run_in_executor( - self.response_thread_pool, - self.response_processor.process_single_response, - response, + + if DEBUG_SYNC_MODE: + # Direct sync call for easier debugging + response = self.response_processor.verify_single_response(response) + else: + # Run in thread pool to avoid blocking event loop + response: ( + MinerResponse | None + ) = await asyncio.get_event_loop().run_in_executor( + self.response_thread_pool, + self.response_processor.verify_single_response, + response, + ) + + except (EmptyProofException, IncorrectProofException) as e: + bt.logging.warning(f"{e.message}") + self._reschedule_request(request) + except httpx.InvalidURL: + bt.logging.warning( + f"Ignoring UID as there is not a valid URL: {request.uid}. {request.ip}:{request.port}" + ) + self._reschedule_request(request) + except httpx.HTTPError as e: + bt.logging.warning( + f"Failed to query miner for UID: {request.uid}. {request.ip}:{request.port} Error: {e}" ) - if processed_response: - await self._handle_response(processed_response) + self._reschedule_request(request) except Exception as e: bt.logging.error(f"Error processing request for UID {request.uid}: {e}") traceback.print_exc() log_error("request_processing", "axon_query", str(e)) - return request + self._reschedule_request(request) + finally: + if response: + await self._handle_response(response) + + def _reschedule_request(self, request: Request) -> None: + """ + Reschedule a failed request for retry. + Only RWR and DSLICE requests are rescheduled. + """ + if request.request_type not in (RequestType.RWR, RequestType.DSLICE): + bt.logging.debug( + f"Not rescheduling request type {request.request_type} for UID {request.uid}" + ) + return + + bt.logging.info( + f"Rescheduling {request.request_type.name} request for UID {request.uid}" + ) + + # Remove hash from HashGuard to allow retry + self.request_pipeline.hash_guard.remove_hash(request.guard_hash) + # Re-add to the stacked requests queue for retry with a different miner + self.api.stacked_requests_queue.append(request.queued_request) async def _handle_response(self, response: MinerResponse) -> None: """ @@ -473,8 +548,13 @@ async def _handle_response(self, response: MinerResponse) -> None: response (MinerResponse): The processed response to handle. """ try: - request_hash = response.input_hash - if not response.verification_result: + request_hash = response.external_request_hash + if response.verification_result: + bt.logging.info( + f"Successfully verified proof from UID {response.uid} " + f"for circuit {response.circuit}. Request type: {response.request_type.name}" + ) + else: response.response_time = ( response.circuit.evaluation_data.maximum_response_time ) @@ -505,7 +585,7 @@ async def _handle_response(self, response: MinerResponse) -> None: proof=[response.proof_content], metadata={ "circuit": str(response.circuit), - "request_hash": response.input_hash, + "request_hash": request_hash, "miner_uid": response.uid, }, hotkey=self.config.wallet.hotkey, @@ -537,6 +617,7 @@ async def _cleanup(self): await self.httpx_client.aclose() stop_prometheus_logging() clean_temp_files() + self.dsperse_manager.total_cleanup() if self.competition: self.competition.competition_thread.stop() if hasattr(self.competition.circuit_manager, "close"): diff --git a/neurons/_validator/models/base_rpc_request.py b/neurons/_validator/models/base_rpc_request.py index 4ecd9c39..a0106e74 100644 --- a/neurons/_validator/models/base_rpc_request.py +++ b/neurons/_validator/models/base_rpc_request.py @@ -1,11 +1,19 @@ from pydantic import BaseModel -from execution_layer.circuit import Circuit + +from _validator.models.request_type import RequestType from _validator.utils.api import hash_inputs +from execution_layer.circuit import Circuit + +class QueuedRequestDataModel(BaseModel): + """ + Base model for requests that are stacked in the validator's queue and waiting to be sent to miners. + At the moment, that's a Real World Request (RWR) or a Request with one slice of a DSperse model (DSlice). + """ -class RealWorldRequest(BaseModel): circuit: Circuit inputs: dict + request_type: RequestType = RequestType.RWR model_config = {"arbitrary_types_allowed": True} diff --git a/neurons/_validator/models/dslice_request.py b/neurons/_validator/models/dslice_request.py new file mode 100644 index 00000000..5bda9e5a --- /dev/null +++ b/neurons/_validator/models/dslice_request.py @@ -0,0 +1,15 @@ +from pydantic import Field + +from _validator.models.base_rpc_request import QueuedRequestDataModel +from _validator.models.request_type import RequestType + + +class DSliceQueuedProofRequest(QueuedRequestDataModel): + """ + Request for a DSperse slice. + """ + + request_type: RequestType = RequestType.DSLICE + slice_num: str = Field(..., description="Num of the DSperse slice") + run_uid: str = Field(..., description="UID of the DSperse run") + outputs: dict = Field(..., description="Outputs of the DSperse slice") diff --git a/neurons/_validator/models/miner_response.py b/neurons/_validator/models/miner_response.py index 033cc1dc..55193d50 100644 --- a/neurons/_validator/models/miner_response.py +++ b/neurons/_validator/models/miner_response.py @@ -1,16 +1,9 @@ -from __future__ import annotations from dataclasses import dataclass import bittensor as bt import json -import traceback -from constants import ( - DEFAULT_PROOF_SIZE, - SINGLE_PROOF_OF_WEIGHTS_MODEL_ID, - CIRCUIT_TIMEOUT_SECONDS, -) -from deployment_layer.circuit_store import circuit_store +from constants import DEFAULT_PROOF_SIZE from _validator.core.request import Request from execution_layer.circuit import ProofSystem, Circuit from _validator.models.request_type import RequestType @@ -20,153 +13,100 @@ class MinerResponse: """ Represents a response from a miner. - - Attributes: - uid (int): Unique identifier of the miner. - verification_result (bool): Whether the miner's response was verified. - response_time (float): Time taken by the miner to respond. - verification_time (float): Time taken to verify the proof. - proof_size (int): Size of the proof provided by the miner. - circuit (Circuit): Circuit used. - proof_content (Any): Content of the proof - either a string or a dict. - raw (str): Deserialized form of the response. - error (str): Error message, if any occurred during processing. """ uid: int verification_result: bool - input_hash: str + # hash of the original request from external API user + # we use it to report back results to `ValidatorAPI`` class. It sends the results to the user. + external_request_hash: str response_time: float proof_size: int circuit: Circuit verification_time: float | None = None proof_content: dict | str | None = None public_json: list[str] | None = None + inputs: dict | None = None request_type: RequestType | None = None + dsperse_slice_num: int | None = None + dsperse_run_uid: str | None = None raw: dict | None = None error: str | None = None save: bool = False @classmethod - def from_raw_response(cls, response: Request) -> "MinerResponse": + def from_raw_response( + cls, request: Request, deserialized_response: dict + ) -> "MinerResponse": """ Creates a MinerResponse object from a raw response dictionary. - - Args: - response (dict): Raw response from a miner. - - Returns: - MinerResponse: Processed miner response object. """ - try: - deserialized_response = response.deserialized - bt.logging.trace(f"Deserialized response: {deserialized_response}") - proof_content = None - public_json = None - if isinstance(deserialized_response, str): - try: - deserialized_response = json.loads(deserialized_response) - except json.JSONDecodeError as e: - bt.logging.debug(f"JSON decoding error: {e}") - return cls.empty(uid=response.uid, circuit=response.circuit) - - if isinstance(deserialized_response, dict): - proof = deserialized_response.get("proof", "{}") - public_signals = deserialized_response.get("public_signals", "[]") + bt.logging.trace(f"Deserialized response: {deserialized_response}") - if isinstance(proof, str): - if all(c in "0123456789ABCDEFabcdef" for c in proof): - proof_content = proof - else: - proof_content = json.loads(proof) - else: - proof_content = proof - if public_signals and str(public_signals).strip(): - public_json = ( - json.loads(public_signals) - if isinstance(public_signals, str) - else public_signals - ) - else: - bt.logging.debug( - f"Miner at {response.uid} did not return public signals." - ) - - if isinstance(proof_content, str): - proof_size = len(proof_content) + proof = deserialized_response.get("proof", "{}") + if isinstance(proof, str): + if all(c in "0123456789ABCDEFabcdef" for c in proof): + proof_content = proof else: - if response.circuit.proof_system == ProofSystem.CIRCOM: - proof_size = ( - sum( - len(str(value)) - for key in ("pi_a", "pi_b", "pi_c") - for element in proof_content.get(key, []) - for value in ( - element if isinstance(element, list) else [element] - ) + proof_content = json.loads(proof) + else: + proof_content = proof + + if isinstance(proof_content, str): + proof_size = len(proof_content) + elif request.circuit is not None: + if request.circuit.proof_system == ProofSystem.CIRCOM: + proof_size = ( + sum( + len(str(value)) + for key in ("pi_a", "pi_b", "pi_c") + for element in proof_content.get(key, []) + for value in ( + element if isinstance(element, list) else [element] ) - if proof_content - else DEFAULT_PROOF_SIZE ) - elif response.circuit.proof_system == ProofSystem.EZKL: - proof_size = len(proof_content["proof"]) - else: - proof_size = DEFAULT_PROOF_SIZE - - return cls( - uid=response.uid, - verification_result=False, - response_time=response.response_time, - proof_size=proof_size or DEFAULT_PROOF_SIZE, - circuit=response.circuit, - proof_content=proof_content, - request_type=response.request_type, - input_hash=response.request_hash, - public_json=public_json, - raw=deserialized_response, - save=response.save, + if proof_content + else DEFAULT_PROOF_SIZE + ) + elif request.circuit.proof_system == ProofSystem.EZKL: + proof_size = len(proof_content["proof"]) + else: + proof_size = DEFAULT_PROOF_SIZE + else: + # capacity requests don't have circuit associated + proof_size = 0 + + public_signals = deserialized_response.get("public_signals", "[]") + if public_signals and str(public_signals).strip(): + public_json = ( + json.loads(public_signals) + if isinstance(public_signals, str) + else public_signals ) - except json.JSONDecodeError as e: - traceback.print_exc() - bt.logging.error(f"JSON decoding error: {e}") - return cls.empty(uid=response.uid, circuit=response.circuit) - except Exception as e: - traceback.print_exc() - bt.logging.error(f"Error processing miner response: {e}") - return cls.empty(uid=response.uid, circuit=response.circuit) - - @classmethod - def empty(cls, uid: int = 0, circuit: Circuit | None = None) -> "MinerResponse": - """ - Creates an empty MinerResponse object. + else: + bt.logging.debug(f"Miner at {request.uid} did not return public signals.") + public_json = None - Returns: - MinerResponse: An empty MinerResponse object. - """ - if circuit is None: - circuit = circuit_store.get_circuit(SINGLE_PROOF_OF_WEIGHTS_MODEL_ID) - timeout = ( - circuit.timeout if circuit and circuit.timeout else CIRCUIT_TIMEOUT_SECONDS - ) return cls( - uid=uid, + uid=request.uid, verification_result=False, - response_time=timeout, - verification_time=None, - proof_size=DEFAULT_PROOF_SIZE, - circuit=circuit, - proof_content=None, - public_json=None, - request_type=RequestType.BENCHMARK, - input_hash=None, - raw=None, - error="Empty response", - save=False, + response_time=request.response_time, + proof_size=proof_size or DEFAULT_PROOF_SIZE, + circuit=request.circuit, + proof_content=proof_content, + request_type=request.request_type, + external_request_hash=request.external_request_hash, + public_json=public_json, + inputs=request.inputs, + raw=deserialized_response, + save=request.save, + dsperse_slice_num=request.dsperse_slice_num, + dsperse_run_uid=request.dsperse_run_uid, ) def to_log_dict(self, metagraph: bt.metagraph) -> dict: # type: ignore """ - Parse a MinerResponse object into a dictionary. + Parse a MinerResponse object into a dictionary. Used for logging purposes. """ return { "miner_key": metagraph.hotkeys[self.uid], @@ -184,20 +124,11 @@ def to_log_dict(self, metagraph: bt.metagraph) -> dict: # type: ignore "proof_size": self.proof_size, "response_duration": self.response_time, "is_verified": self.verification_result, - "input_hash": self.input_hash, + "external_request_hash": self.external_request_hash, "request_type": self.request_type.value, "error": self.error, "save": self.save, } - def set_verification_result(self, result: bool): - """ - Sets the verification result for the miner's response. - - Args: - result (bool): The verification result to set. - """ - self.verification_result = result - def __iter__(self): return iter(self.__dict__.items()) diff --git a/neurons/_validator/models/poc_rpc_request.py b/neurons/_validator/models/poc_rpc_request.py index 5c7fd50b..a4729bb8 100644 --- a/neurons/_validator/models/poc_rpc_request.py +++ b/neurons/_validator/models/poc_rpc_request.py @@ -1,10 +1,10 @@ -from _validator.models.base_rpc_request import RealWorldRequest +from _validator.models.base_rpc_request import QueuedRequestDataModel from pydantic import Field from deployment_layer.circuit_store import circuit_store from execution_layer.circuit import CircuitType -class ProofOfComputationRPCRequest(RealWorldRequest): +class ProofOfComputationRPCRequest(QueuedRequestDataModel): """ Request for the Proof of Computation RPC method. """ diff --git a/neurons/_validator/models/pow_rpc_request.py b/neurons/_validator/models/pow_rpc_request.py index 14a65995..4257d06b 100644 --- a/neurons/_validator/models/pow_rpc_request.py +++ b/neurons/_validator/models/pow_rpc_request.py @@ -1,10 +1,10 @@ from __future__ import annotations -from _validator.models.base_rpc_request import RealWorldRequest +from _validator.models.base_rpc_request import QueuedRequestDataModel from pydantic import Field from deployment_layer.circuit_store import circuit_store -class ProofOfWeightsRPCRequest(RealWorldRequest): +class ProofOfWeightsRPCRequest(QueuedRequestDataModel): """ Request for the Proof of Weights RPC method. """ diff --git a/neurons/_validator/models/request_type.py b/neurons/_validator/models/request_type.py index e6202c21..005347c6 100644 --- a/neurons/_validator/models/request_type.py +++ b/neurons/_validator/models/request_type.py @@ -2,14 +2,31 @@ class RequestType(Enum): + """ + Enumeration of different types of requests that the validator can send to miner. + - BENCHMARK: Requests with generated input data for benchmarking purposes. + In case of empty RWR queue the validator generates some input data to keep miners busy. + - RWR: Real World Requests with actual input data for real-world inference. + Validator collects such requests from external users and stacks them in a queue to be sent to miners. + - DSLICE: That's a tricky one. We use DSperse app for slicing large models into smaller parts. + And some requests involve sliced model and each slice is sent as a separate request to the miner. + That each slice request is of type DSLICE. + At the moment we just stack DSlices to the same RWR queue, and behave as normal RWR requests. + That means DSLICE request is a part of RWR or BENCHMARK request. + XXX: Yeah, not very elegant, but we'll improve it later, I promise. + """ + BENCHMARK = "benchmark_request" RWR = "real_world_request" + DSLICE = "dslice_request" def __str__(self) -> str: if self == RequestType.BENCHMARK: return "Benchmark" elif self == RequestType.RWR: return "Real World Request" + elif self == RequestType.DSPERSE: + return "DSperse Request (one slice)" else: raise ValueError(f"Unknown request type: {self}") diff --git a/neurons/_validator/utils/hash_guard.py b/neurons/_validator/utils/hash_guard.py index d7657d38..18ea9e1d 100644 --- a/neurons/_validator/utils/hash_guard.py +++ b/neurons/_validator/utils/hash_guard.py @@ -18,7 +18,15 @@ def __init__(self): self.hash_set = set() self.hash_queue = deque(maxlen=self.MAX_HASHES) - def check_hash(self, input: BaseInput) -> None: + def remove_hash(self, hash_value: str) -> None: + """ + Remove a hash from the guard. + """ + if hash_value in self.hash_set: + self.hash_set.remove(hash_value) + self.hash_queue.remove(hash_value) + + def check_hash(self, input: BaseInput) -> str: if isinstance(input, BaseInput): input = input.to_json() @@ -35,7 +43,6 @@ def sort_dict(d): hash_value = hashlib.sha256(json_str.encode()).hexdigest() if hash_value in self.hash_set: - bt.logging.error(f"Hash already exists: {hash_value}. Inputs: {input}") raise ValueError("Hash already exists") if len(self.hash_queue) == self.MAX_HASHES: @@ -44,3 +51,5 @@ def sort_dict(d): self.hash_set.add(hash_value) self.hash_queue.append(hash_value) + + return hash_value diff --git a/neurons/_validator/utils/logging.py b/neurons/_validator/utils/logging.py index e143aa89..0490620a 100644 --- a/neurons/_validator/utils/logging.py +++ b/neurons/_validator/utils/logging.py @@ -104,6 +104,7 @@ def log_responses(responses: list[MinerResponse]): ("Proof Size", "right", "blue"), ("Circuit Name", "left", "magenta"), ("Proof System", "left", "red"), + ("Request Type", "left", "white"), ] sorted_responses = sorted(responses, key=lambda x: x.uid) @@ -115,6 +116,7 @@ def log_responses(responses: list[MinerResponse]): str(response.proof_size), (response.circuit.metadata.name if response.circuit else "Unknown"), (response.circuit.metadata.proof_system if response.circuit else "Unknown"), + (response.request_type.name if response.request_type else "Unknown"), ] for response in sorted_responses ] diff --git a/neurons/_validator/utils/proof_of_weights.py b/neurons/_validator/utils/proof_of_weights.py index f65348fe..eb79aec7 100644 --- a/neurons/_validator/utils/proof_of_weights.py +++ b/neurons/_validator/utils/proof_of_weights.py @@ -40,9 +40,6 @@ def to_tensor(value, dtype): return torch.tensor(value, dtype=dtype) -dummy_miner_response = MinerResponse.empty() - - @dataclass class ProofOfWeightsItem: maximum_score: torch.Tensor diff --git a/neurons/cli_parser.py b/neurons/cli_parser.py index 79346510..6d559a1e 100644 --- a/neurons/cli_parser.py +++ b/neurons/cli_parser.py @@ -73,6 +73,12 @@ def init_config(role: Optional[str] = None): help="Whether to disable WandB logging.", action="store_true", ) + parser.add_argument( + "--disable-metric-logging", + default=False, + help="Whether to disable metric logging.", + action="store_true", + ) parser.add_argument( "--dev", default=False, @@ -96,6 +102,11 @@ def init_config(role: Optional[str] = None): default=None, help="Custom location for storing models data (optional)", ) + parser.add_argument( + "--dsperse-run-dir", + default=None, + help="Custom location for storing dsperse run data (optional)", + ) if role == Roles.VALIDATOR: # CLI arguments specific to the validator _validator_config() @@ -127,6 +138,7 @@ def init_config(role: Optional[str] = None): config.eth_wallet if config.eth_wallet is not None else "0x002" ) config.disable_wandb = True + config.disable_metric_logging = True config.verbose = config.verbose if config.verbose is None else True config.full_path = os.path.expanduser("~/.bittensor/subnet-2") # type: ignore @@ -141,6 +153,10 @@ def init_config(role: Optional[str] = None): else: config.full_path_models = os.path.join(config.full_path, "models") + if not config.dsperse_run_dir: + config.dsperse_run_dir = os.path.join(config.full_path, "dsperse_runs") + os.makedirs(config.dsperse_run_dir, exist_ok=True) + if config.whitelisted_public_keys: config.whitelisted_public_keys = config.whitelisted_public_keys.split(",") diff --git a/neurons/deployment_layer/model_b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c/input.json b/neurons/deployment_layer/model_b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c/input.json new file mode 100644 index 00000000..4837d209 --- /dev/null +++ b/neurons/deployment_layer/model_b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c/input.json @@ -0,0 +1,3078 @@ +{ + "input_data": [ + [ + -0.9764705896377563, + -0.9764705896377563, + -0.9607843160629272, + -0.9686274528503418, + -0.9843137264251709, + -0.9921568632125854, + -0.9843137264251709, + -0.9843137264251709, + -0.9764705896377563, + -0.9607843160629272, + -0.9686274528503418, + -0.6705882549285889, + 0.22352945804595947, + 0.48235297203063965, + -0.26274508237838745, + -0.7568627595901489, + -0.8588235378265381, + -0.8588235378265381, + -0.8274509906768799, + -0.8509804010391235, + -0.8823529481887817, + -0.8901960849761963, + -0.8823529481887817, + -0.6549019813537598, + -0.29411762952804565, + -0.5372549295425415, + -0.9058823585510254, + -0.9215686321258545, + -0.9450980424880981, + -0.9686274528503418, + -0.9607843160629272, + -0.9607843160629272, + -0.9607843160629272, + -0.9529411792755127, + -0.9529411792755127, + -0.9764705896377563, + -0.9921568632125854, + -0.9843137264251709, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9529411792755127, + -0.9607843160629272, + -0.3960784077644348, + 0.5529412031173706, + 0.7176470756530762, + 0.301960825920105, + -0.2549019455909729, + -0.6549019813537598, + -0.843137264251709, + -0.8274509906768799, + -0.8274509906768799, + -0.8196078538894653, + -0.6705882549285889, + -0.4117646813392639, + -0.08235293626785278, + 0.19215691089630127, + -0.04313725233078003, + -0.5058823823928833, + -0.8901960849761963, + -0.9450980424880981, + -0.9607843160629272, + -0.9607843160629272, + -0.9686274528503418, + -0.9686274528503418, + -0.9686274528503418, + -0.9607843160629272, + -0.9921568632125854, + -0.9843137264251709, + -0.9843137264251709, + -0.9764705896377563, + -0.9764705896377563, + -0.9686274528503418, + -0.9450980424880981, + -0.9686274528503418, + -0.41960781812667847, + 0.545098066329956, + 0.6235294342041016, + 0.529411792755127, + 0.3960784673690796, + -0.12156862020492554, + -0.40392154455184937, + -0.2078431248664856, + -0.10588234663009644, + -0.09803920984268188, + 0.20000004768371582, + 0.5686274766921997, + 0.5686274766921997, + 0.3960784673690796, + 0.20784318447113037, + 0.23137259483337402, + -0.5607843399047852, + -0.9372549057006836, + -0.9450980424880981, + -0.9686274528503418, + -0.9686274528503418, + -0.9843137264251709, + -0.9843137264251709, + -0.9843137264251709, + -0.9843137264251709, + -0.9843137264251709, + -0.9764705896377563, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9372549057006836, + -0.9607843160629272, + -0.6235294342041016, + 0.4117647409439087, + 0.6392157077789307, + 0.6000000238418579, + 0.41960787773132324, + 0.21568632125854492, + 0.43529415130615234, + 0.6784313917160034, + 0.7882353067398071, + 0.7411764860153198, + 0.843137264251709, + 0.8980392217636108, + 0.7019608020782471, + 0.6313725709915161, + 0.27843141555786133, + 0.35686278343200684, + -0.09019607305526733, + -0.8901960849761963, + -0.9450980424880981, + -0.9686274528503418, + -0.9529411792755127, + -0.9529411792755127, + -0.9764705896377563, + -0.9843137264251709, + -0.9843137264251709, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.929411768913269, + -0.9450980424880981, + -0.843137264251709, + 0.12156867980957031, + 0.7254902124404907, + 0.5686274766921997, + 0.37254905700683594, + 0.3960784673690796, + 0.7176470756530762, + 0.8588235378265381, + 0.9215686321258545, + 0.9058823585510254, + 0.9372549057006836, + 0.8745098114013672, + 0.49803924560546875, + 0.22352945804595947, + 0.23921573162078857, + 0.20784318447113037, + 0.10588240623474121, + -0.7490196228027344, + -0.9686274528503418, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9607843160629272, + -0.9843137264251709, + -0.9921568632125854, + -0.9843137264251709, + -0.9764705896377563, + -0.9607843160629272, + -0.9450980424880981, + -0.9529411792755127, + -0.929411768913269, + -0.9215686321258545, + -0.9529411792755127, + -0.26274508237838745, + 0.6235294342041016, + 0.5058823823928833, + 0.34117650985717773, + 0.5686274766921997, + 0.6941176652908325, + 0.6313725709915161, + 0.8039215803146362, + 0.8745098114013672, + 0.9215686321258545, + 0.9137254953384399, + 0.2862745523452759, + -0.4823529124259949, + -0.16862744092941284, + -0.019607841968536377, + -0.027450978755950928, + -0.5843137502670288, + -0.9529411792755127, + -0.8901960849761963, + -0.8980392217636108, + -0.9215686321258545, + -0.929411768913269, + -0.9686274528503418, + -0.9843137264251709, + -0.9843137264251709, + -0.9764705896377563, + -0.9607843160629272, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9137254953384399, + -0.9686274528503418, + -0.5686274766921997, + 0.458823561668396, + 0.5921568870544434, + 0.34117650985717773, + 0.4431372880935669, + 0.011764764785766602, + -0.011764705181121826, + 0.5529412031173706, + 0.8980392217636108, + 0.8745098114013672, + 0.929411768913269, + 0.45098042488098145, + -0.4431372284889221, + -0.3176470398902893, + 0.058823585510253906, + -0.29411762952804565, + -0.7568627595901489, + -0.9137254953384399, + -0.8745098114013672, + -0.8901960849761963, + -0.9372549057006836, + -0.9529411792755127, + -0.9607843160629272, + -0.9764705896377563, + -0.9764705896377563, + -0.9607843160629272, + -0.9529411792755127, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9372549057006836, + -0.772549033164978, + 0.29411768913269043, + 0.45098042488098145, + 0.12941181659698486, + 0.16862750053405762, + -0.4431372284889221, + -0.1764705777168274, + 0.5607843399047852, + 0.8745098114013672, + 0.7019608020782471, + 0.7098039388656616, + 0.7333333492279053, + 0.20000004768371582, + 0.050980448722839355, + 0.4431372880935669, + -0.40392154455184937, + -1.0, + -0.9215686321258545, + -0.9137254953384399, + -0.9215686321258545, + -0.9137254953384399, + -0.9450980424880981, + -0.9686274528503418, + -0.9764705896377563, + -0.9764705896377563, + -0.9529411792755127, + -0.9529411792755127, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9137254953384399, + -0.9058823585510254, + -0.38823527097702026, + 0.003921627998352051, + 0.18431377410888672, + 0.48235297203063965, + -0.1764705777168274, + -0.07450979948043823, + 0.7333333492279053, + 0.8352941274642944, + 0.5215686559677124, + 0.37254905700683594, + 0.6235294342041016, + 0.6705882549285889, + 0.529411792755127, + 0.6078431606292725, + -0.15294116735458374, + -0.9686274528503418, + -0.9529411792755127, + -0.9137254953384399, + -0.9058823585510254, + -0.9607843160629272, + -0.9686274528503418, + -0.9764705896377563, + -0.9764705896377563, + -0.9764705896377563, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.9058823585510254, + -0.6784313917160034, + 0.21568632125854492, + 0.8117647171020508, + 0.5686274766921997, + 0.6705882549285889, + 0.8039215803146362, + 0.7882353067398071, + 0.5058823823928833, + 0.13725495338439941, + 0.38823533058166504, + 0.686274528503418, + 0.6000000238418579, + 0.545098066329956, + -0.13725489377975464, + -0.9058823585510254, + -0.929411768913269, + -0.9058823585510254, + -0.9137254953384399, + -0.9921568632125854, + -0.9764705896377563, + -0.9764705896377563, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8980392217636108, + -0.7411764860153198, + 0.14509809017181396, + 0.8352941274642944, + 0.8666666746139526, + 0.8588235378265381, + 0.6784313917160034, + 0.6235294342041016, + 0.20784318447113037, + -0.10588234663009644, + -0.03529411554336548, + 0.49803924560546875, + 0.49803924560546875, + 0.4745098352432251, + -0.1607843041419983, + -0.9215686321258545, + -0.9058823585510254, + -0.8901960849761963, + -0.8980392217636108, + -0.9843137264251709, + -0.9764705896377563, + -0.9764705896377563, + -0.9686274528503418, + -0.9686274528503418, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.9215686321258545, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8823529481887817, + -0.6392157077789307, + 0.15294122695922852, + 0.7411764860153198, + 0.8823529481887817, + 0.8352941274642944, + 0.7019608020782471, + 0.4431372880935669, + -0.26274508237838745, + -0.2549019455909729, + -0.32549017667770386, + 0.17647063732147217, + 0.5058823823928833, + 0.3333333730697632, + -0.19999998807907104, + -0.9215686321258545, + -0.9058823585510254, + -0.8901960849761963, + -0.8901960849761963, + -0.9843137264251709, + -0.9764705896377563, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.6392157077789307, + 0.16862750053405762, + 0.7254902124404907, + 0.6392157077789307, + 0.6470588445663452, + 0.8196078538894653, + 0.4901961088180542, + -0.24705880880355835, + -0.30980390310287476, + -0.3176470398902893, + 0.29411768913269043, + 0.6078431606292725, + 0.09019613265991211, + -0.498039186000824, + -0.929411768913269, + -0.8980392217636108, + -0.8823529481887817, + -0.8980392217636108, + -0.9843137264251709, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8823529481887817, + -0.8823529481887817, + -0.6705882549285889, + 0.08235299587249756, + 0.5529412031173706, + 0.4117647409439087, + 0.3647059202194214, + 0.8117647171020508, + 0.8117647171020508, + 0.09803926944732666, + -0.29411762952804565, + -0.26274508237838745, + 0.43529415130615234, + 0.4901961088180542, + -0.1450980305671692, + -0.6627451181411743, + -0.9529411792755127, + -0.8901960849761963, + -0.8823529481887817, + -0.8901960849761963, + -0.9921568632125854, + -0.9764705896377563, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9215686321258545, + -0.9215686321258545, + -0.9058823585510254, + -0.8823529481887817, + -0.8666666746139526, + -0.8745098114013672, + -0.686274528503418, + -0.08235293626785278, + 0.27843141555786133, + 0.3647059202194214, + 0.29411768913269043, + 0.6078431606292725, + 0.8588235378265381, + 0.301960825920105, + -0.24705880880355835, + -0.18431371450424194, + 0.29411768913269043, + 0.035294175148010254, + -0.5137255191802979, + -0.7803921699523926, + -0.9372549057006836, + -0.8745098114013672, + -0.8666666746139526, + -0.8823529481887817, + -0.9764705896377563, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.8666666746139526, + -0.8823529481887817, + -0.7019608020782471, + -0.1764705777168274, + 0.035294175148010254, + 0.15294122695922852, + 0.34117650985717773, + 0.17647063732147217, + 0.27843141555786133, + 0.12156867980957031, + -0.027450978755950928, + 0.30980396270751953, + 0.3333333730697632, + -0.2862744927406311, + -0.6313725709915161, + -0.8666666746139526, + -0.8901960849761963, + -0.8588235378265381, + -0.8666666746139526, + -0.8745098114013672, + -0.9529411792755127, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8980392217636108, + -0.8666666746139526, + -0.8823529481887817, + -0.6784313917160034, + -0.2078431248664856, + -0.05882352590560913, + 0.011764764785766602, + 0.5529412031173706, + 0.23137259483337402, + -0.16862744092941284, + 0.23921573162078857, + 0.37254905700683594, + 0.45098042488098145, + -0.1921568512916565, + -0.6000000238418579, + -0.7176470756530762, + -0.8980392217636108, + -0.9058823585510254, + -0.8509804010391235, + -0.8666666746139526, + -0.8823529481887817, + -0.9529411792755127, + -0.9607843160629272, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.8666666746139526, + -0.8745098114013672, + -0.5764706134796143, + -0.11372548341751099, + 0.06666672229766846, + -0.04313725233078003, + 0.37254905700683594, + 0.5215686559677124, + -0.1764705777168274, + 0.09019613265991211, + 0.07450985908508301, + 0.043137311935424805, + -0.27843135595321655, + -0.6627451181411743, + -0.8039215803146362, + -0.8666666746139526, + -0.8823529481887817, + -0.8509804010391235, + -0.8509804010391235, + -0.8509804010391235, + -0.9764705896377563, + -0.9607843160629272, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.9137254953384399, + -0.9137254953384399, + -0.8901960849761963, + -0.8666666746139526, + -0.8666666746139526, + -0.5372549295425415, + -0.07450979948043823, + 0.16862750053405762, + 0.17647063732147217, + 0.18431377410888672, + 0.49803924560546875, + 0.12156867980957031, + 0.23137259483337402, + -0.03529411554336548, + 0.12156867980957031, + -0.13725489377975464, + -0.46666663885116577, + -0.40392154455184937, + -0.6235294342041016, + -0.8196078538894653, + -0.8509804010391235, + -0.8588235378265381, + -0.8745098114013672, + -0.9843137264251709, + -0.9843137264251709, + -0.9764705896377563, + -0.9764705896377563, + -0.9607843160629272, + -0.9529411792755127, + -0.9372549057006836, + -0.9215686321258545, + -0.9215686321258545, + -0.9215686321258545, + -0.9058823585510254, + -0.8901960849761963, + -0.8588235378265381, + -0.8745098114013672, + -0.5764706134796143, + -0.027450978755950928, + 0.24705886840820312, + 0.5607843399047852, + 0.29411768913269043, + 0.2862745523452759, + 0.20000004768371582, + 0.003921627998352051, + 0.09019613265991211, + 0.08235299587249756, + -0.29411762952804565, + -0.24705880880355835, + -0.019607841968536377, + -0.32549017667770386, + -0.7490196228027344, + -0.8588235378265381, + -0.8509804010391235, + -0.8666666746139526, + -0.9843137264251709, + -0.9843137264251709, + -0.9843137264251709, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.929411768913269, + -0.9215686321258545, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8666666746139526, + -0.8901960849761963, + -0.615686297416687, + -0.05098038911819458, + 0.22352945804595947, + 0.6392157077789307, + 0.6078431606292725, + 0.19215691089630127, + 0.17647063732147217, + -0.05098038911819458, + -0.08235293626785278, + -0.1450980305671692, + -0.4117646813392639, + -0.1294117569923401, + 0.23921573162078857, + -0.09803920984268188, + -0.5215686559677124, + -0.7254902124404907, + -0.843137264251709, + -0.8588235378265381, + -0.9921568632125854, + -0.9843137264251709, + -0.9843137264251709, + -0.9686274528503418, + -0.9607843160629272, + -0.9450980424880981, + -0.9372549057006836, + -0.9215686321258545, + -0.9215686321258545, + -0.9137254953384399, + -0.8823529481887817, + -0.8745098114013672, + -0.8588235378265381, + -0.8901960849761963, + -0.6392157077789307, + -0.003921568393707275, + 0.2627451419830322, + 0.5058823823928833, + 0.7019608020782471, + 0.4901961088180542, + 0.35686278343200684, + -0.011764705181121826, + -0.15294116735458374, + -0.270588219165802, + -0.40392154455184937, + 0.06666672229766846, + 0.35686278343200684, + -0.13725489377975464, + -0.4431372284889221, + -0.4431372284889221, + -0.7882353067398071, + -0.8745098114013672, + -0.9921568632125854, + -0.9921568632125854, + -0.9764705896377563, + -0.9686274528503418, + -0.9686274528503418, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8901960849761963, + -0.8745098114013672, + -0.8588235378265381, + -0.8823529481887817, + -0.6627451181411743, + 0.035294175148010254, + 0.3333333730697632, + 0.4274510145187378, + 0.6000000238418579, + 0.6235294342041016, + 0.40392160415649414, + 0.30980396270751953, + 0.12156867980957031, + -0.05882352590560913, + 0.13725495338439941, + 0.45098042488098145, + 0.40392160415649414, + -0.1607843041419983, + -0.7019608020782471, + -0.5137255191802979, + -0.7647058963775635, + -0.8823529481887817, + -0.9921568632125854, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9607843160629272, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8901960849761963, + -0.8823529481887817, + -0.8509804010391235, + -0.8745098114013672, + -0.7333333492279053, + -0.06666666269302368, + 0.3647059202194214, + 0.5058823823928833, + 0.5921568870544434, + 0.6078431606292725, + 0.5921568870544434, + 0.7411764860153198, + 0.41960787773132324, + 0.458823561668396, + 0.7333333492279053, + 0.7254902124404907, + 0.4901961088180542, + -0.10588234663009644, + -0.8352941274642944, + -0.843137264251709, + -0.8509804010391235, + -0.8666666746139526, + -0.9921568632125854, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9686274528503418, + -0.9607843160629272, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8666666746139526, + -0.8588235378265381, + -0.8352941274642944, + -0.2549019455909729, + 0.3803921937942505, + 0.6784313917160034, + 0.8352941274642944, + 0.7960784435272217, + 0.7254902124404907, + 0.7019608020782471, + 0.45098042488098145, + 0.6705882549285889, + 0.8509804010391235, + 0.7176470756530762, + 0.46666669845581055, + -0.10588234663009644, + -0.8196078538894653, + -0.8823529481887817, + -0.8745098114013672, + -0.8588235378265381, + -0.9921568632125854, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9686274528503418, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.8745098114013672, + -0.8509804010391235, + -0.8588235378265381, + -0.40392154455184937, + 0.34117650985717773, + 0.6392157077789307, + 0.8039215803146362, + 0.7019608020782471, + 0.6627451181411743, + 0.7019608020782471, + 0.5215686559677124, + 0.43529415130615234, + 0.38823533058166504, + 0.49803924560546875, + 0.5215686559677124, + 0.019607901573181152, + -0.6549019813537598, + -0.8666666746139526, + -0.8666666746139526, + -0.8666666746139526, + -0.9921568632125854, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9686274528503418, + -0.9529411792755127, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8745098114013672, + -0.8509804010391235, + -0.8509804010391235, + -0.5686274766921997, + 0.12941181659698486, + 0.4901961088180542, + 0.5529412031173706, + 0.3960784673690796, + 0.34117650985717773, + 0.45098042488098145, + 0.27843141555786133, + 0.08235299587249756, + -0.019607841968536377, + 0.27843141555786133, + 0.458823561668396, + 0.24705886840820312, + -0.30980390310287476, + -0.8352941274642944, + -0.8352941274642944, + -0.8666666746139526, + -0.9921568632125854, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9215686321258545, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8823529481887817, + -0.8823529481887817, + -0.8588235378265381, + -0.8509804010391235, + -0.7411764860153198, + -0.1294117569923401, + 0.35686278343200684, + 0.32549023628234863, + 0.050980448722839355, + 0.043137311935424805, + 0.14509809017181396, + 0.043137311935424805, + -0.270588219165802, + -0.4431372284889221, + -0.15294116735458374, + 0.22352945804595947, + 0.41960787773132324, + 0.003921627998352051, + -0.7568627595901489, + -0.8509804010391235, + -0.8588235378265381, + -0.9921568632125854, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8588235378265381, + -0.8509804010391235, + -0.8352941274642944, + -0.35686272382736206, + 0.2549020051956177, + 0.3176470994949341, + -0.16862744092941284, + -0.5058823823928833, + -0.3803921341896057, + -0.26274508237838745, + -0.6784313917160034, + -0.8196078538894653, + -0.6313725709915161, + -0.027450978755950928, + 0.45098042488098145, + 0.19215691089630127, + -0.6313725709915161, + -0.8901960849761963, + -0.8588235378265381, + -0.9921568632125854, + -0.9843137264251709, + -0.9764705896377563, + -0.9686274528503418, + -0.9686274528503418, + -0.9529411792755127, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8745098114013672, + -0.8666666746139526, + -0.8509804010391235, + -0.8745098114013672, + -0.5686274766921997, + 0.21568632125854492, + 0.46666669845581055, + -0.03529411554336548, + -0.8352941274642944, + -0.8509804010391235, + -0.7176470756530762, + -0.843137264251709, + -0.8823529481887817, + -0.8117647171020508, + -0.32549017667770386, + 0.3647059202194214, + 0.2705882787704468, + -0.529411792755127, + -0.9058823585510254, + -0.8745098114013672, + -1.0, + -0.9843137264251709, + -0.9764705896377563, + -0.9764705896377563, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.9372549057006836, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8666666746139526, + -0.8588235378265381, + -0.8588235378265381, + -0.7411764860153198, + -0.03529411554336548, + 0.49803924560546875, + 0.301960825920105, + -0.6313725709915161, + -0.8745098114013672, + -0.8352941274642944, + -0.8588235378265381, + -0.8509804010391235, + -0.8666666746139526, + -0.6313725709915161, + 0.21568632125854492, + 0.301960825920105, + -0.498039186000824, + -0.929411768913269, + -0.8901960849761963, + -1.0, + -0.9921568632125854, + -0.9843137264251709, + -0.9764705896377563, + -0.9764705896377563, + -0.9686274528503418, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.8980392217636108, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8588235378265381, + -0.843137264251709, + -0.8352941274642944, + -0.4901960492134094, + 0.23921573162078857, + 0.4117647409439087, + -0.3803921341896057, + -0.8823529481887817, + -0.8274509906768799, + -0.8509804010391235, + -0.8509804010391235, + -0.8666666746139526, + -0.8274509906768799, + -0.05882352590560913, + 0.34117650985717773, + -0.4431372284889221, + -0.9372549057006836, + -0.8901960849761963, + -0.9686274528503418, + -0.9686274528503418, + -0.9529411792755127, + -0.9529411792755127, + -0.9607843160629272, + -0.9607843160629272, + -0.9529411792755127, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9450980424880981, + -0.6941176652908325, + 0.16862750053405762, + 0.4431372880935669, + -0.34117645025253296, + -0.772549033164978, + -0.843137264251709, + -0.8352941274642944, + -0.8274509906768799, + -0.8352941274642944, + -0.843137264251709, + -0.8509804010391235, + -0.8509804010391235, + -0.615686297416687, + -0.2392156720161438, + -0.4901960492134094, + -0.8588235378265381, + -0.8901960849761963, + -0.9058823585510254, + -0.9215686321258545, + -0.929411768913269, + -0.9372549057006836, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9607843160629272, + -0.9607843160629272, + -0.9529411792755127, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9215686321258545, + -0.9372549057006836, + -0.427450954914093, + 0.5137255191802979, + 0.7254902124404907, + 0.20000004768371582, + -0.3960784077644348, + -0.7019608020782471, + -0.8352941274642944, + -0.8196078538894653, + -0.8117647171020508, + -0.7960784435272217, + -0.686274528503418, + -0.46666663885116577, + -0.1294117569923401, + 0.17647063732147217, + -0.04313725233078003, + -0.529411792755127, + -0.8509804010391235, + -0.8980392217636108, + -0.9137254953384399, + -0.9215686321258545, + -0.9372549057006836, + -0.9607843160629272, + -0.9607843160629272, + -0.9607843160629272, + -0.9764705896377563, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.9137254953384399, + -0.929411768913269, + -0.45098036527633667, + 0.4901961088180542, + 0.5529412031173706, + 0.40392160415649414, + 0.19215691089630127, + -0.27843135595321655, + -0.4745097756385803, + -0.3176470398902893, + -0.24705880880355835, + -0.2862744927406311, + 0.003921627998352051, + 0.45098042488098145, + 0.4745098352432251, + 0.27843141555786133, + 0.12156867980957031, + 0.09019613265991211, + -0.5843137502670288, + -0.8823529481887817, + -0.8980392217636108, + -0.9215686321258545, + -0.929411768913269, + -0.9764705896377563, + -0.9764705896377563, + -0.9764705896377563, + -0.9686274528503418, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9058823585510254, + -0.929411768913269, + -0.6235294342041016, + 0.3176470994949341, + 0.4745098352432251, + 0.40392160415649414, + 0.2862745523452759, + 0.011764764785766602, + 0.20000004768371582, + 0.529411792755127, + 0.615686297416687, + 0.45098042488098145, + 0.6313725709915161, + 0.8823529481887817, + 0.7098039388656616, + 0.529411792755127, + 0.17647063732147217, + 0.23921573162078857, + -0.1607843041419983, + -0.843137264251709, + -0.9058823585510254, + -0.9137254953384399, + -0.9058823585510254, + -0.9372549057006836, + -0.9607843160629272, + -0.9686274528503418, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.8980392217636108, + -0.9058823585510254, + -0.8274509906768799, + 0.043137311935424805, + 0.5137255191802979, + 0.30980396270751953, + 0.24705886840820312, + 0.20784318447113037, + 0.5058823823928833, + 0.843137264251709, + 0.8588235378265381, + 0.6549019813537598, + 0.7176470756530762, + 0.8274509906768799, + 0.4431372880935669, + 0.09803926944732666, + 0.09019613265991211, + 0.09019613265991211, + 0.035294175148010254, + -0.7333333492279053, + -0.9215686321258545, + -0.8980392217636108, + -0.8980392217636108, + -0.9137254953384399, + -0.9450980424880981, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.929411768913269, + -0.9137254953384399, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.929411768913269, + -0.3019607663154602, + 0.4431372880935669, + 0.2627451419830322, + 0.23137259483337402, + 0.4117647409439087, + 0.5764706134796143, + 0.6235294342041016, + 0.7333333492279053, + 0.6000000238418579, + 0.615686297416687, + 0.7490196228027344, + 0.20784318447113037, + -0.38823527097702026, + -0.26274508237838745, + -0.12156862020492554, + -0.11372548341751099, + -0.6235294342041016, + -0.9137254953384399, + -0.8745098114013672, + -0.8823529481887817, + -0.8980392217636108, + -0.9137254953384399, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9450980424880981, + -0.929411768913269, + -0.9137254953384399, + -0.9058823585510254, + -0.9058823585510254, + -0.8823529481887817, + -0.929411768913269, + -0.6000000238418579, + 0.30980396270751953, + 0.37254905700683594, + 0.19215691089630127, + 0.2705882787704468, + -0.06666666269302368, + -0.05098038911819458, + 0.4117647409439087, + 0.6549019813537598, + 0.529411792755127, + 0.6549019813537598, + 0.3333333730697632, + -0.26274508237838745, + -0.35686272382736206, + -0.04313725233078003, + -0.3647058606147766, + -0.7960784435272217, + -0.8980392217636108, + -0.8666666746139526, + -0.8745098114013672, + -0.929411768913269, + -0.9450980424880981, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8980392217636108, + -0.8980392217636108, + -0.7803921699523926, + 0.12156867980957031, + 0.2862745523452759, + -0.019607841968536377, + -0.011764705181121826, + -0.37254899740219116, + -0.05098038911819458, + 0.3803921937942505, + 0.5764706134796143, + 0.3333333730697632, + 0.3647059202194214, + 0.5058823823928833, + 0.08235299587249756, + -0.11372548341751099, + 0.2705882787704468, + -0.427450954914093, + -0.9764705896377563, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.9137254953384399, + -0.9450980424880981, + -0.9450980424880981, + -0.9450980424880981, + -0.9450980424880981, + -0.9215686321258545, + -0.9215686321258545, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8980392217636108, + -0.8823529481887817, + -0.8823529481887817, + -0.4745097756385803, + -0.15294116735458374, + 0.06666672229766846, + 0.3176470994949341, + -0.270588219165802, + -0.1450980305671692, + 0.5058823823928833, + 0.49803924560546875, + 0.14509809017181396, + 0.035294175148010254, + 0.3647059202194214, + 0.5137255191802979, + 0.30980396270751953, + 0.38823533058166504, + -0.2078431248664856, + -0.9529411792755127, + -0.9215686321258545, + -0.8745098114013672, + -0.8666666746139526, + -0.9529411792755127, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.7098039388656616, + 0.10588240623474121, + 0.6000000238418579, + 0.34117650985717773, + 0.49803924560546875, + 0.5764706134796143, + 0.4745098352432251, + 0.24705886840820312, + -0.04313725233078003, + 0.19215691089630127, + 0.529411792755127, + 0.45098042488098145, + 0.4117647409439087, + -0.18431371450424194, + -0.8980392217636108, + -0.8901960849761963, + -0.8666666746139526, + -0.8823529481887817, + -0.9764705896377563, + -0.9607843160629272, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.8509804010391235, + -0.7254902124404907, + 0.09019613265991211, + 0.6627451181411743, + 0.6705882549285889, + 0.772549033164978, + 0.529411792755127, + 0.43529415130615234, + 0.09019613265991211, + -0.16862744092941284, + -0.09803920984268188, + 0.3960784673690796, + 0.43529415130615234, + 0.4745098352432251, + -0.15294116735458374, + -0.8980392217636108, + -0.8666666746139526, + -0.8666666746139526, + -0.8666666746139526, + -0.9764705896377563, + -0.9607843160629272, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9137254953384399, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.843137264251709, + -0.6392157077789307, + 0.14509809017181396, + 0.686274528503418, + 0.8274509906768799, + 0.8117647171020508, + 0.6235294342041016, + 0.3490196466445923, + -0.3176470398902893, + -0.26274508237838745, + -0.32549017667770386, + 0.18431377410888672, + 0.48235297203063965, + 0.3960784673690796, + -0.16862744092941284, + -0.8980392217636108, + -0.8745098114013672, + -0.8588235378265381, + -0.8588235378265381, + -0.9764705896377563, + -0.9686274528503418, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8823529481887817, + -0.8666666746139526, + -0.8509804010391235, + -0.6235294342041016, + 0.18431377410888672, + 0.7411764860153198, + 0.6784313917160034, + 0.6627451181411743, + 0.8274509906768799, + 0.458823561668396, + -0.27843135595321655, + -0.30980390310287476, + -0.3176470398902893, + 0.32549023628234863, + 0.615686297416687, + 0.12941181659698486, + -0.4745097756385803, + -0.9058823585510254, + -0.8666666746139526, + -0.8509804010391235, + -0.8666666746139526, + -0.9843137264251709, + -0.9686274528503418, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8588235378265381, + -0.6627451181411743, + 0.08235299587249756, + 0.6000000238418579, + 0.4745098352432251, + 0.40392160415649414, + 0.8588235378265381, + 0.8117647171020508, + 0.09019613265991211, + -0.2862744927406311, + -0.23137253522872925, + 0.5058823823928833, + 0.5372549295425415, + -0.12156862020492554, + -0.6470588445663452, + -0.929411768913269, + -0.8666666746139526, + -0.8509804010391235, + -0.8588235378265381, + -0.9764705896377563, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.8823529481887817, + -0.8745098114013672, + -0.8588235378265381, + -0.8666666746139526, + -0.7019608020782471, + -0.13725489377975464, + 0.24705886840820312, + 0.4117647409439087, + 0.3490196466445923, + 0.6627451181411743, + 0.9058823585510254, + 0.301960825920105, + -0.2549019455909729, + -0.2235293984413147, + 0.18431377410888672, + 0.011764764785766602, + -0.5058823823928833, + -0.7803921699523926, + -0.929411768913269, + -0.8588235378265381, + -0.8509804010391235, + -0.8509804010391235, + -0.9529411792755127, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.9058823585510254, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8745098114013672, + -0.8588235378265381, + -0.8509804010391235, + -0.7176470756530762, + -0.2392156720161438, + -0.05098038911819458, + 0.12156867980957031, + 0.37254905700683594, + 0.19215691089630127, + 0.29411768913269043, + -0.03529411554336548, + -0.3647058606147766, + -0.27843135595321655, + -0.3333333134651184, + -0.5686274766921997, + -0.6470588445663452, + -0.8666666746139526, + -0.8745098114013672, + -0.8509804010391235, + -0.843137264251709, + -0.8509804010391235, + -0.9215686321258545, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8745098114013672, + -0.8588235378265381, + -0.8588235378265381, + -0.7254902124404907, + -0.29411762952804565, + -0.12156862020492554, + -0.03529411554336548, + 0.5686274766921997, + 0.21568632125854492, + -0.27843135595321655, + -0.1764705777168274, + -0.2549019455909729, + -0.21568626165390015, + -0.5686274766921997, + -0.7176470756530762, + -0.7176470756530762, + -0.8745098114013672, + -0.8823529481887817, + -0.843137264251709, + -0.8509804010391235, + -0.8509804010391235, + -0.929411768913269, + -0.929411768913269, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8588235378265381, + -0.8745098114013672, + -0.6470588445663452, + -0.2392156720161438, + -0.03529411554336548, + -0.11372548341751099, + 0.37254905700683594, + 0.545098066329956, + -0.26274508237838745, + -0.09803920984268188, + -0.21568626165390015, + -0.23137253522872925, + -0.30980390310287476, + -0.6627451181411743, + -0.8352941274642944, + -0.8666666746139526, + -0.8588235378265381, + -0.843137264251709, + -0.843137264251709, + -0.8352941274642944, + -0.9529411792755127, + -0.929411768913269, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8823529481887817, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8588235378265381, + -0.8588235378265381, + -0.6000000238418579, + -0.2392156720161438, + 0.035294175148010254, + 0.08235299587249756, + 0.16078436374664307, + 0.5372549295425415, + 0.08235299587249756, + 0.09019613265991211, + -0.1764705777168274, + 0.019607901573181152, + -0.1764705777168274, + -0.5215686559677124, + -0.4901960492134094, + -0.6941176652908325, + -0.8196078538894653, + -0.8352941274642944, + -0.8352941274642944, + -0.843137264251709, + -0.9686274528503418, + -0.9450980424880981, + -0.9450980424880981, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8901960849761963, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8509804010391235, + -0.8588235378265381, + -0.6235294342041016, + -0.1921568512916565, + 0.09803926944732666, + 0.41960787773132324, + 0.20784318447113037, + 0.29411768913269043, + 0.23921573162078857, + -0.06666666269302368, + -0.04313725233078003, + -0.003921568393707275, + -0.34117645025253296, + -0.30980390310287476, + -0.10588234663009644, + -0.3960784077644348, + -0.7490196228027344, + -0.8352941274642944, + -0.8274509906768799, + -0.843137264251709, + -0.9686274528503418, + -0.9529411792755127, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.8980392217636108, + -0.8901960849761963, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.8666666746139526, + -0.8588235378265381, + -0.8666666746139526, + -0.6470588445663452, + -0.19999998807907104, + 0.058823585510253906, + 0.46666669845581055, + 0.46666669845581055, + 0.15294122695922852, + 0.18431377410888672, + -0.05882352590560913, + -0.09803920984268188, + -0.1607843041419983, + -0.45098036527633667, + -0.23137253522872925, + 0.13725495338439941, + -0.15294116735458374, + -0.5686274766921997, + -0.7568627595901489, + -0.8352941274642944, + -0.843137264251709, + -0.9843137264251709, + -0.9607843160629272, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.8588235378265381, + -0.8509804010391235, + -0.8745098114013672, + -0.6784313917160034, + -0.1607843041419983, + 0.06666672229766846, + 0.3176470994949341, + 0.5372549295425415, + 0.4117647409439087, + 0.34117650985717773, + -0.019607841968536377, + -0.1450980305671692, + -0.2862744927406311, + -0.4823529124259949, + -0.06666666269302368, + 0.23921573162078857, + -0.1921568512916565, + -0.5137255191802979, + -0.5058823823928833, + -0.7960784435272217, + -0.8588235378265381, + -0.9764705896377563, + -0.9607843160629272, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8588235378265381, + -0.8509804010391235, + -0.8666666746139526, + -0.6941176652908325, + -0.1450980305671692, + 0.09803926944732666, + 0.20784318447113037, + 0.41960787773132324, + 0.5137255191802979, + 0.38823533058166504, + 0.34117650985717773, + 0.12941181659698486, + -0.09019607305526733, + 0.035294175148010254, + 0.32549023628234863, + 0.301960825920105, + -0.2235293984413147, + -0.7254902124404907, + -0.5529412031173706, + -0.7647058963775635, + -0.8588235378265381, + -0.9607843160629272, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8509804010391235, + -0.8666666746139526, + -0.7333333492279053, + -0.2235293984413147, + 0.11372554302215576, + 0.2705882787704468, + 0.3960784673690796, + 0.48235297203063965, + 0.5607843399047852, + 0.7882353067398071, + 0.40392160415649414, + 0.4117647409439087, + 0.686274528503418, + 0.6627451181411743, + 0.43529415130615234, + -0.18431371450424194, + -0.843137264251709, + -0.8196078538894653, + -0.8274509906768799, + -0.843137264251709, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8745098114013672, + -0.8745098114013672, + -0.8666666746139526, + -0.8509804010391235, + -0.8509804010391235, + -0.8196078538894653, + -0.34117645025253296, + 0.16862750053405762, + 0.49803924560546875, + 0.686274528503418, + 0.686274528503418, + 0.6705882549285889, + 0.686274528503418, + 0.41960787773132324, + 0.6313725709915161, + 0.8352941274642944, + 0.7098039388656616, + 0.45098042488098145, + -0.2235293984413147, + -0.8352941274642944, + -0.843137264251709, + -0.8352941274642944, + -0.8352941274642944, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8823529481887817, + -0.8745098114013672, + -0.8745098114013672, + -0.8588235378265381, + -0.8509804010391235, + -0.843137264251709, + -0.843137264251709, + -0.45098036527633667, + 0.20784318447113037, + 0.5764706134796143, + 0.7647058963775635, + 0.6313725709915161, + 0.6000000238418579, + 0.6941176652908325, + 0.5372549295425415, + 0.4274510145187378, + 0.3803921937942505, + 0.5058823823928833, + 0.529411792755127, + -0.07450979948043823, + -0.7176470756530762, + -0.8352941274642944, + -0.8352941274642944, + -0.843137264251709, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.8588235378265381, + -0.8509804010391235, + -0.843137264251709, + -0.8274509906768799, + -0.6000000238418579, + 0.011764764785766602, + 0.43529415130615234, + 0.5058823823928833, + 0.30980396270751953, + 0.301960825920105, + 0.46666669845581055, + 0.301960825920105, + 0.08235299587249756, + -0.003921568393707275, + 0.3176470994949341, + 0.4745098352432251, + 0.13725495338439941, + -0.4431372284889221, + -0.8274509906768799, + -0.8274509906768799, + -0.843137264251709, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8901960849761963, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.8509804010391235, + -0.8588235378265381, + -0.843137264251709, + -0.8352941274642944, + -0.7490196228027344, + -0.24705880880355835, + 0.2705882787704468, + 0.2862745523452759, + -0.04313725233078003, + -0.019607841968536377, + 0.13725495338439941, + 0.043137311935424805, + -0.3019607663154602, + -0.43529409170150757, + -0.12156862020492554, + 0.21568632125854492, + 0.2705882787704468, + -0.1921568512916565, + -0.7803921699523926, + -0.8352941274642944, + -0.8352941274642944, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.8588235378265381, + -0.8509804010391235, + -0.8509804010391235, + -0.8352941274642944, + -0.8196078538894653, + -0.45098036527633667, + 0.10588240623474121, + 0.23137259483337402, + -0.24705880880355835, + -0.545098066329956, + -0.3803921341896057, + -0.2549019455909729, + -0.6784313917160034, + -0.8039215803146362, + -0.6000000238418579, + -0.03529411554336548, + 0.30980396270751953, + -0.04313725233078003, + -0.7019608020782471, + -0.8588235378265381, + -0.843137264251709, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8509804010391235, + -0.8588235378265381, + -0.843137264251709, + -0.8509804010391235, + -0.615686297416687, + -0.019607841968536377, + 0.2705882787704468, + -0.13725489377975464, + -0.8274509906768799, + -0.8352941274642944, + -0.686274528503418, + -0.8274509906768799, + -0.8509804010391235, + -0.7803921699523926, + -0.30980390310287476, + 0.2627451419830322, + 0.043137311935424805, + -0.6392157077789307, + -0.8823529481887817, + -0.843137264251709, + -0.9686274528503418, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8666666746139526, + -0.8588235378265381, + -0.843137264251709, + -0.8509804010391235, + -0.7568627595901489, + -0.2235293984413147, + 0.23921573162078857, + 0.16862750053405762, + -0.6313725709915161, + -0.843137264251709, + -0.8039215803146362, + -0.8352941274642944, + -0.8196078538894653, + -0.8352941274642944, + -0.6078431606292725, + 0.15294122695922852, + 0.09019613265991211, + -0.615686297416687, + -0.9058823585510254, + -0.8509804010391235, + -0.9686274528503418, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8745098114013672, + -0.8588235378265381, + -0.8509804010391235, + -0.843137264251709, + -0.8274509906768799, + -0.5607843399047852, + -0.003921568393707275, + 0.23137259483337402, + -0.40392154455184937, + -0.8509804010391235, + -0.7960784435272217, + -0.8274509906768799, + -0.8196078538894653, + -0.8352941274642944, + -0.7960784435272217, + -0.09803920984268188, + 0.14509809017181396, + -0.5529412031173706, + -0.9215686321258545, + -0.8666666746139526, + -0.9529411792755127, + -0.9529411792755127, + -0.9450980424880981, + -0.9529411792755127, + -0.9529411792755127, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9450980424880981, + -0.7333333492279053, + 0.14509809017181396, + 0.38823533058166504, + -0.43529409170150757, + -0.8039215803146362, + -0.8588235378265381, + -0.8509804010391235, + -0.8588235378265381, + -0.8666666746139526, + -0.8823529481887817, + -0.8509804010391235, + -0.8588235378265381, + -0.615686297416687, + -0.19999998807907104, + -0.4588235020637512, + -0.8666666746139526, + -0.8901960849761963, + -0.9058823585510254, + -0.9215686321258545, + -0.9215686321258545, + -0.929411768913269, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9529411792755127, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9137254953384399, + -0.9372549057006836, + -0.4745097756385803, + 0.5137255191802979, + 0.7411764860153198, + 0.08235299587249756, + -0.545098066329956, + -0.7647058963775635, + -0.8509804010391235, + -0.8352941274642944, + -0.8274509906768799, + -0.8196078538894653, + -0.7490196228027344, + -0.5607843399047852, + -0.2392156720161438, + 0.09019613265991211, + -0.003921568393707275, + -0.4901960492134094, + -0.8509804010391235, + -0.8980392217636108, + -0.9137254953384399, + -0.9137254953384399, + -0.929411768913269, + -0.9372549057006836, + -0.9450980424880981, + -0.9450980424880981, + -0.9607843160629272, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.929411768913269, + -0.9058823585510254, + -0.9372549057006836, + -0.4823529124259949, + 0.48235297203063965, + 0.5529412031173706, + 0.3176470994949341, + -0.04313725233078003, + -0.4745097756385803, + -0.5843137502670288, + -0.46666663885116577, + -0.43529409170150757, + -0.5372549295425415, + -0.27843135595321655, + 0.2862745523452759, + 0.3490196466445923, + 0.08235299587249756, + 0.050980448722839355, + 0.13725495338439941, + -0.5607843399047852, + -0.8901960849761963, + -0.8980392217636108, + -0.929411768913269, + -0.929411768913269, + -0.9607843160629272, + -0.9607843160629272, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.9215686321258545, + -0.6470588445663452, + 0.2862745523452759, + 0.43529415130615234, + 0.3490196466445923, + 0.17647063732147217, + -0.2549019455909729, + -0.11372548341751099, + 0.29411768913269043, + 0.3333333730697632, + -0.019607841968536377, + 0.2627451419830322, + 0.8274509906768799, + 0.6705882549285889, + 0.3490196466445923, + 0.003921627998352051, + 0.22352945804595947, + -0.13725489377975464, + -0.843137264251709, + -0.8980392217636108, + -0.9215686321258545, + -0.9137254953384399, + -0.9372549057006836, + -0.9529411792755127, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8980392217636108, + -0.8196078538894653, + -0.003921568393707275, + 0.4745098352432251, + 0.2705882787704468, + 0.16078436374664307, + -0.07450979948043823, + 0.20784318447113037, + 0.7882353067398071, + 0.7176470756530762, + 0.20784318447113037, + 0.27843141555786133, + 0.6549019813537598, + 0.37254905700683594, + -0.04313725233078003, + -0.1294117569923401, + -0.011764705181121826, + -0.019607841968536377, + -0.7411764860153198, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.9372549057006836, + -0.9372549057006836, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9058823585510254, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.9058823585510254, + -0.34117645025253296, + 0.40392160415649414, + 0.20784318447113037, + 0.12941181659698486, + 0.12156867980957031, + 0.3333333730697632, + 0.5529412031173706, + 0.5764706134796143, + 0.17647063732147217, + 0.12941181659698486, + 0.40392160415649414, + 0.043137311935424805, + -0.3960784077644348, + -0.40392154455184937, + -0.29411762952804565, + -0.2549019455909729, + -0.6941176652908325, + -0.9215686321258545, + -0.8901960849761963, + -0.8823529481887817, + -0.9215686321258545, + -0.9137254953384399, + -0.9372549057006836, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8980392217636108, + -0.8823529481887817, + -0.9137254953384399, + -0.6392157077789307, + 0.20784318447113037, + 0.2862745523452759, + 0.035294175148010254, + -0.04313725233078003, + -0.2078431248664856, + -0.027450978755950928, + 0.18431377410888672, + 0.24705886840820312, + 0.058823585510253906, + 0.21568632125854492, + 0.08235299587249756, + -0.24705880880355835, + -0.43529409170150757, + -0.2235293984413147, + -0.4745097756385803, + -0.843137264251709, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9137254953384399, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8901960849761963, + -0.8901960849761963, + -0.8039215803146362, + -0.09019607305526733, + 0.11372554302215576, + -0.1921568512916565, + -0.26274508237838745, + -0.3960784077644348, + 0.043137311935424805, + 0.13725495338439941, + 0.12156867980957031, + -0.1294117569923401, + -0.1294117569923401, + 0.12941181659698486, + -0.09019607305526733, + -0.3490195870399475, + 0.019607901573181152, + -0.4901960492134094, + -0.9529411792755127, + -0.8901960849761963, + -0.8823529481887817, + -0.8823529481887817, + -0.9137254953384399, + -0.929411768913269, + -0.929411768913269, + -0.9372549057006836, + -0.9372549057006836, + -0.9137254953384399, + -0.9137254953384399, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.6078431606292725, + -0.3490195870399475, + -0.1294117569923401, + 0.043137311935424805, + -0.3803921341896057, + -0.2392156720161438, + 0.16078436374664307, + 0.019607901573181152, + -0.27843135595321655, + -0.38823527097702026, + -0.027450978755950928, + 0.20784318447113037, + -0.003921568393707275, + 0.08235299587249756, + -0.3019607663154602, + -0.9372549057006836, + -0.9058823585510254, + -0.8588235378265381, + -0.8588235378265381, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8745098114013672, + -0.8745098114013672, + -0.7647058963775635, + -0.09803920984268188, + 0.24705886840820312, + 0.011764764785766602, + 0.2549020051956177, + 0.21568632125854492, + 0.043137311935424805, + -0.09803920984268188, + -0.3019607663154602, + -0.12156862020492554, + 0.23137259483337402, + 0.18431377410888672, + 0.13725495338439941, + -0.29411762952804565, + -0.8980392217636108, + -0.8823529481887817, + -0.8588235378265381, + -0.8666666746139526, + -0.9686274528503418, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8823529481887817, + -0.8666666746139526, + -0.8509804010391235, + -0.7647058963775635, + -0.09019607305526733, + 0.32549023628234863, + 0.3647059202194214, + 0.5921568870544434, + 0.23921573162078857, + 0.11372554302215576, + -0.11372548341751099, + -0.270588219165802, + -0.2235293984413147, + 0.16078436374664307, + 0.22352945804595947, + 0.34117650985717773, + -0.21568626165390015, + -0.8980392217636108, + -0.8588235378265381, + -0.843137264251709, + -0.8509804010391235, + -0.9607843160629272, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9137254953384399, + -0.9058823585510254, + -0.9058823585510254, + -0.8980392217636108, + -0.8823529481887817, + -0.8823529481887817, + -0.8823529481887817, + -0.8745098114013672, + -0.8588235378265381, + -0.6941176652908325, + 0.003921627998352051, + 0.48235297203063965, + 0.7019608020782471, + 0.7176470756530762, + 0.4274510145187378, + 0.18431377410888672, + -0.3647058606147766, + -0.2549019455909729, + -0.3176470398902893, + 0.09803926944732666, + 0.3647059202194214, + 0.37254905700683594, + -0.16862744092941284, + -0.8980392217636108, + -0.8666666746139526, + -0.843137264251709, + -0.8509804010391235, + -0.9607843160629272, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8823529481887817, + -0.8745098114013672, + -0.8509804010391235, + -0.6549019813537598, + 0.10588240623474121, + 0.6784313917160034, + 0.6313725709915161, + 0.6235294342041016, + 0.7647058963775635, + 0.40392160415649414, + -0.2862744927406311, + -0.2862744927406311, + -0.29411762952804565, + 0.29411768913269043, + 0.5843137502670288, + 0.16078436374664307, + -0.4745097756385803, + -0.9058823585510254, + -0.8588235378265381, + -0.8509804010391235, + -0.8588235378265381, + -0.9686274528503418, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8823529481887817, + -0.8823529481887817, + -0.8745098114013672, + -0.8509804010391235, + -0.686274528503418, + -0.003921568393707275, + 0.5529412031173706, + 0.45098042488098145, + 0.37254905700683594, + 0.8509804010391235, + 0.7960784435272217, + 0.08235299587249756, + -0.26274508237838745, + -0.2078431248664856, + 0.4745098352432251, + 0.545098066329956, + -0.12156862020492554, + -0.6627451181411743, + -0.9137254953384399, + -0.843137264251709, + -0.843137264251709, + -0.8509804010391235, + -0.9607843160629272, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8980392217636108, + -0.8823529481887817, + -0.8823529481887817, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8745098114013672, + -0.7490196228027344, + -0.270588219165802, + 0.11372554302215576, + 0.3647059202194214, + 0.32549023628234863, + 0.6705882549285889, + 0.9058823585510254, + 0.2705882787704468, + -0.26274508237838745, + -0.23137253522872925, + 0.20000004768371582, + 0.019607901573181152, + -0.5686274766921997, + -0.8117647171020508, + -0.9137254953384399, + -0.843137264251709, + -0.8274509906768799, + -0.843137264251709, + -0.9450980424880981, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8980392217636108, + -0.8823529481887817, + -0.8745098114013672, + -0.8823529481887817, + -0.8823529481887817, + -0.8588235378265381, + -0.843137264251709, + -0.772549033164978, + -0.3960784077644348, + -0.2235293984413147, + 0.003921627998352051, + 0.301960825920105, + 0.16078436374664307, + 0.2705882787704468, + -0.04313725233078003, + -0.2862744927406311, + -0.13725489377975464, + -0.1607843041419983, + -0.5137255191802979, + -0.7333333492279053, + -0.8901960849761963, + -0.8823529481887817, + -0.843137264251709, + -0.8196078538894653, + -0.8274509906768799, + -0.9137254953384399, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8823529481887817, + -0.8823529481887817, + -0.8588235378265381, + -0.8274509906768799, + -0.7803921699523926, + -0.46666663885116577, + -0.29411762952804565, + -0.16862744092941284, + 0.46666669845581055, + 0.15294122695922852, + -0.3176470398902893, + -0.11372548341751099, + -0.06666666269302368, + 0.011764764785766602, + -0.46666663885116577, + -0.7098039388656616, + -0.772549033164978, + -0.8823529481887817, + -0.8823529481887817, + -0.843137264251709, + -0.8352941274642944, + -0.8196078538894653, + -0.9137254953384399, + -0.9215686321258545, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8745098114013672, + -0.8588235378265381, + -0.843137264251709, + -0.843137264251709, + -0.7568627595901489, + -0.45098036527633667, + -0.2235293984413147, + -0.24705880880355835, + 0.27843141555786133, + 0.4745098352432251, + -0.30980390310287476, + -0.07450979948043823, + -0.1294117569923401, + -0.13725489377975464, + -0.3176470398902893, + -0.7176470756530762, + -0.8745098114013672, + -0.8901960849761963, + -0.8588235378265381, + -0.8274509906768799, + -0.8352941274642944, + -0.8274509906768799, + -0.9450980424880981, + -0.9215686321258545, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8745098114013672, + -0.8745098114013672, + -0.8745098114013672, + -0.8509804010391235, + -0.843137264251709, + -0.8509804010391235, + -0.7098039388656616, + -0.4901960492134094, + -0.19999998807907104, + -0.12156862020492554, + 0.035294175148010254, + 0.4431372880935669, + 0.050980448722839355, + 0.12156867980957031, + -0.1450980305671692, + 0.011764764785766602, + -0.19999998807907104, + -0.6235294342041016, + -0.6313725709915161, + -0.7960784435272217, + -0.843137264251709, + -0.8196078538894653, + -0.8274509906768799, + -0.8274509906768799, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8823529481887817, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8509804010391235, + -0.843137264251709, + -0.8588235378265381, + -0.7254902124404907, + -0.4588235020637512, + -0.16862744092941284, + 0.10588240623474121, + 0.043137311935424805, + 0.22352945804595947, + 0.20000004768371582, + -0.08235293626785278, + -0.019607841968536377, + 0.019607901573181152, + -0.38823527097702026, + -0.4745097756385803, + -0.29411762952804565, + -0.5372549295425415, + -0.7960784435272217, + -0.8352941274642944, + -0.8196078538894653, + -0.8274509906768799, + -0.9529411792755127, + -0.9450980424880981, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8901960849761963, + -0.8823529481887817, + -0.8823529481887817, + -0.8745098114013672, + -0.8588235378265381, + -0.8509804010391235, + -0.843137264251709, + -0.8509804010391235, + -0.7333333492279053, + -0.43529409170150757, + -0.1921568512916565, + 0.11372554302215576, + 0.16862750053405762, + 0.035294175148010254, + 0.14509809017181396, + -0.11372548341751099, + -0.11372548341751099, + -0.1607843041419983, + -0.529411792755127, + -0.43529409170150757, + -0.08235293626785278, + -0.3176470398902893, + -0.6784313917160034, + -0.8039215803146362, + -0.8196078538894653, + -0.8274509906768799, + -0.9686274528503418, + -0.9529411792755127, + -0.9450980424880981, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8980392217636108, + -0.8823529481887817, + -0.8823529481887817, + -0.8745098114013672, + -0.8588235378265381, + -0.8588235378265381, + -0.8352941274642944, + -0.8588235378265381, + -0.7568627595901489, + -0.41960781812667847, + -0.19999998807907104, + 0.003921627998352051, + 0.20000004768371582, + 0.19215691089630127, + 0.2549020051956177, + -0.08235293626785278, + -0.2078431248664856, + -0.3803921341896057, + -0.6313725709915161, + -0.30980390310287476, + 0.011764764785766602, + -0.34117645025253296, + -0.6392157077789307, + -0.6392157077789307, + -0.7960784435272217, + -0.8352941274642944, + -0.9607843160629272, + -0.9529411792755127, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8666666746139526, + -0.843137264251709, + -0.8588235378265381, + -0.772549033164978, + -0.427450954914093, + -0.2078431248664856, + -0.08235293626785278, + 0.12941181659698486, + 0.27843141555786133, + 0.27843141555786133, + 0.301960825920105, + 0.058823585510253906, + -0.26274508237838745, + -0.19999998807907104, + 0.07450985908508301, + 0.11372554302215576, + -0.32549017667770386, + -0.7882353067398071, + -0.6392157077789307, + -0.7803921699523926, + -0.8588235378265381, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9215686321258545, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8588235378265381, + -0.8666666746139526, + -0.8509804010391235, + -0.8588235378265381, + -0.7882353067398071, + -0.4588235020637512, + -0.19999998807907104, + -0.05098038911819458, + 0.08235299587249756, + 0.20000004768371582, + 0.4274510145187378, + 0.7568627595901489, + 0.2862745523452759, + 0.19215691089630127, + 0.45098042488098145, + 0.458823561668396, + 0.2862745523452759, + -0.30980390310287476, + -0.8509804010391235, + -0.8196078538894653, + -0.8196078538894653, + -0.843137264251709, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9215686321258545, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.843137264251709, + -0.843137264251709, + -0.8352941274642944, + -0.843137264251709, + -0.529411792755127, + -0.1294117569923401, + 0.21568632125854492, + 0.3960784673690796, + 0.4117647409439087, + 0.4745098352432251, + 0.5843137502670288, + 0.2627451419830322, + 0.43529415130615234, + 0.6549019813537598, + 0.5607843399047852, + 0.30980396270751953, + -0.3960784077644348, + -0.8666666746139526, + -0.843137264251709, + -0.8196078538894653, + -0.8117647171020508, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8745098114013672, + -0.8745098114013672, + -0.8666666746139526, + -0.8274509906768799, + -0.8274509906768799, + -0.8274509906768799, + -0.8588235378265381, + -0.5843137502670288, + -0.03529411554336548, + 0.3960784673690796, + 0.5764706134796143, + 0.4117647409439087, + 0.40392160415649414, + 0.5686274766921997, + 0.4274510145187378, + 0.301960825920105, + 0.2549020051956177, + 0.38823533058166504, + 0.41960787773132324, + -0.270588219165802, + -0.8274509906768799, + -0.8352941274642944, + -0.8196078538894653, + -0.8196078538894653, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8509804010391235, + -0.8352941274642944, + -0.8274509906768799, + -0.843137264251709, + -0.843137264251709, + -0.686274528503418, + -0.2078431248664856, + 0.2862745523452759, + 0.32549023628234863, + 0.10588240623474121, + 0.13725495338439941, + 0.3490196466445923, + 0.23921573162078857, + -0.003921568393707275, + -0.07450979948043823, + 0.2549020051956177, + 0.38823533058166504, + -0.06666666269302368, + -0.6313725709915161, + -0.8352941274642944, + -0.8274509906768799, + -0.8352941274642944, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8823529481887817, + -0.8823529481887817, + -0.8745098114013672, + -0.8588235378265381, + -0.8509804010391235, + -0.843137264251709, + -0.843137264251709, + -0.8509804010391235, + -0.7882353067398071, + -0.43529409170150757, + 0.10588240623474121, + 0.11372554302215576, + -0.23137253522872925, + -0.1764705777168274, + 0.027451038360595703, + -0.027450978755950928, + -0.37254899740219116, + -0.4901960492134094, + -0.1764705777168274, + 0.09803926944732666, + 0.019607901573181152, + -0.46666663885116577, + -0.8352941274642944, + -0.8352941274642944, + -0.8352941274642944, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.8509804010391235, + -0.8588235378265381, + -0.8588235378265381, + -0.843137264251709, + -0.843137264251709, + -0.8352941274642944, + -0.5921568870544434, + -0.11372548341751099, + 0.035294175148010254, + -0.3960784077644348, + -0.615686297416687, + -0.4431372284889221, + -0.3176470398902893, + -0.7098039388656616, + -0.8196078538894653, + -0.6392157077789307, + -0.1450980305671692, + 0.07450985908508301, + -0.3333333134651184, + -0.8117647171020508, + -0.843137264251709, + -0.8196078538894653, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.929411768913269, + -0.929411768913269, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.8666666746139526, + -0.8588235378265381, + -0.8588235378265381, + -0.8509804010391235, + -0.843137264251709, + -0.843137264251709, + -0.8588235378265381, + -0.7254902124404907, + -0.32549017667770386, + -0.011764705181121826, + -0.3019607663154602, + -0.8509804010391235, + -0.8274509906768799, + -0.7019608020782471, + -0.8352941274642944, + -0.8588235378265381, + -0.7960784435272217, + -0.38823527097702026, + 0.058823585510253906, + -0.2392156720161438, + -0.772549033164978, + -0.8666666746139526, + -0.8274509906768799, + -0.9607843160629272, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.929411768913269, + -0.9215686321258545, + -0.9137254953384399, + -0.8980392217636108, + -0.8823529481887817, + -0.8745098114013672, + -0.8666666746139526, + -0.8588235378265381, + -0.8588235378265381, + -0.843137264251709, + -0.8509804010391235, + -0.8509804010391235, + -0.8039215803146362, + -0.4901960492134094, + -0.07450979948043823, + -0.04313725233078003, + -0.686274528503418, + -0.8274509906768799, + -0.8117647171020508, + -0.8509804010391235, + -0.8196078538894653, + -0.8274509906768799, + -0.6313725709915161, + -0.019607841968536377, + -0.1921568512916565, + -0.7568627595901489, + -0.8745098114013672, + -0.8352941274642944, + -0.9607843160629272, + -0.9529411792755127, + -0.9450980424880981, + -0.9372549057006836, + -0.9372549057006836, + -0.9215686321258545, + -0.9137254953384399, + -0.9058823585510254, + -0.8901960849761963, + -0.8823529481887817, + -0.8745098114013672, + -0.8745098114013672, + -0.8666666746139526, + -0.8588235378265381, + -0.8588235378265381, + -0.8588235378265381, + -0.843137264251709, + -0.7019608020782471, + -0.3019607663154602, + -0.011764705181121826, + -0.4745097756385803, + -0.843137264251709, + -0.7960784435272217, + -0.8274509906768799, + -0.8196078538894653, + -0.8196078538894653, + -0.7803921699523926, + -0.19999998807907104, + -0.09803920984268188, + -0.686274528503418, + -0.8980392217636108, + -0.8588235378265381 + ] + ] +} \ No newline at end of file diff --git a/neurons/deployment_layer/model_b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c/input.py b/neurons/deployment_layer/model_b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c/input.py new file mode 100644 index 00000000..46ae01be --- /dev/null +++ b/neurons/deployment_layer/model_b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c/input.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +import random + +from execution_layer.base_input import BaseInput +from execution_layer.input_registry import InputRegistry +from pydantic import BaseModel + +from _validator.models.request_type import RequestType + +INPUT_LENGTH = 3072 + + +class CircuitInputSchema(BaseModel): + input_data: list[list[float]] + + +@InputRegistry.register( + "b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c" +) +class CircuitInput(BaseInput): + + schema = CircuitInputSchema + + def __init__( + self, request_type: RequestType, data: dict[str, object] | None = None + ): + super().__init__(request_type, data) + + @staticmethod + def generate() -> dict[str, object]: + return { + "input_data": [[random.uniform(-1.0, 1.0) for _ in range(INPUT_LENGTH)]] + } + + def validate(self, data: dict[str, object]) -> None: + return CircuitInputSchema(**data) + + @staticmethod + def process(data: dict[str, object]) -> dict[str, object]: + """ + No processing needs to take place, as all inputs are randomized. + """ + return data + + def to_array(self) -> list: + """Converts the data to array format""" + return self.data["input_data"] diff --git a/neurons/deployment_layer/model_b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c/metadata.json b/neurons/deployment_layer/model_b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c/metadata.json new file mode 100644 index 00000000..6b8b208b --- /dev/null +++ b/neurons/deployment_layer/model_b4a373270b59e2b9d5aac05e41df8cdff76a252f5543e00fcd87f2626b37360c/metadata.json @@ -0,0 +1,17 @@ +{ + "name": "DSPerse test NET model", + "description": "Model for testing DSPerse integration.", + "author": "Inference Labs", + "version": "0.0.1", + "proof_system": "EZKL", + "type": "dsperse_proof_generation", + "external_files": {}, + "dslices": [ + "https://sn2-storage.inferencelabs.com/7a3a83ce7366ef53354231cbf3b92824c658c4800b0c242572ac8c3e33e4d6e2.dslice", + "https://sn2-storage.inferencelabs.com/4de41b429bda66a524579207e15c44e0907c88258299218863969c1404c9cacd.dslice", + "https://sn2-storage.inferencelabs.com/50b9f4e7e0aa926cf4109060052db5b0174e0b6f046bcc427bedd21171040eeb.dslice", + "https://sn2-storage.inferencelabs.com/67196b8cf4aee00a3efef58f7dba1f2e09e20484f03c94cf5d68eb1755682545.dslice", + "https://sn2-storage.inferencelabs.com/b10e4b497eaf4a301119dd336a75804c4e38f7355cd7b6683a8538e5692c62e0.dslice" + ], + "benchmark_choice_weight": 0.2 +} diff --git a/neurons/execution_layer/circuit.py b/neurons/execution_layer/circuit.py index 8c082cfe..2e31bdd6 100644 --- a/neurons/execution_layer/circuit.py +++ b/neurons/execution_layer/circuit.py @@ -1,27 +1,30 @@ from __future__ import annotations + +import json +import os +import re +import time from dataclasses import dataclass, field from enum import Enum + import torch -import os -import json -import cli_parser -from execution_layer.input_registry import InputRegistry + +# trunk-ignore(pylint/E0611) +from bittensor import Wallet, logging, subtensor from execution_layer.base_input import BaseInput -from utils.metrics_logger import log_circuit_metrics -from utils.gc_logging import gc_log_eval_metrics +from execution_layer.input_registry import InputRegistry + +import cli_parser from constants import ( - MAX_EVALUATION_ITEMS, + CIRCUIT_TIMEOUT_SECONDS, DEFAULT_PROOF_SIZE, + MAX_EVALUATION_ITEMS, MAXIMUM_SCORE_MEDIAN_SAMPLE, - CIRCUIT_TIMEOUT_SECONDS, ONE_MINUTE, ) from utils import with_rate_limit -import time -import re - -# trunk-ignore(pylint/E0611) -from bittensor import logging, subtensor, Wallet +from utils.gc_logging import gc_log_eval_metrics +from utils.metrics_logger import log_circuit_metrics class CircuitType(str, Enum): @@ -31,6 +34,7 @@ class CircuitType(str, Enum): PROOF_OF_WEIGHTS = "proof_of_weights" PROOF_OF_COMPUTATION = "proof_of_computation" + DSPERSE_PROOF_GENERATION = "dsperse_proof_generation" class ProofSystem(str, Enum): @@ -145,7 +149,8 @@ class CircuitMetadata: version: str proof_system: str type: CircuitType - external_files: dict[str, str] + external_files: None | dict[str, str] + dslices: None | list[dict] = None netuid: int | None = None weights_version: int | None = None timeout: int | None = None @@ -263,7 +268,8 @@ def update(self, item: CircuitEvaluationItem): except Exception as e: logging.error(f"Failed to save evaluation data: {e}") - self._log_metrics() + if not cli_parser.config.disable_metric_logging: + self._log_metrics() @with_rate_limit(period=ONE_MINUTE) def _log_metrics(self) -> None: @@ -396,6 +402,7 @@ def __init__(self, circuit_id: str): if not os.path.isdir(deployment_folder): raise ValueError(f"Circuit path is not a directory: model_{circuit_id}") + # XXX: might not fit to dsperse... self.paths = CircuitPaths(circuit_id) self.metadata = CircuitMetadata.from_file(self.paths.metadata) self.id = circuit_id diff --git a/neurons/execution_layer/dsperse_manager.py b/neurons/execution_layer/dsperse_manager.py new file mode 100644 index 00000000..c92b4e13 --- /dev/null +++ b/neurons/execution_layer/dsperse_manager.py @@ -0,0 +1,402 @@ +import json +import random +import tempfile +import shutil +from dataclasses import dataclass +from datetime import datetime +from enum import Enum +from pathlib import Path +from typing import Iterable + +import ezkl +from bittensor import logging +from deployment_layer.circuit_store import circuit_store +from dsperse.src.compile.compiler import Compiler +from dsperse.src.prover import Prover +from dsperse.src.run.runner import Runner +from dsperse.src.verifier import Verifier +from dsperse.src.slice.utils.converter import Converter +from execution_layer.circuit import Circuit, CircuitType + +import cli_parser +from _validator.models.dslice_request import DSliceQueuedProofRequest +from _validator.models.request_type import RequestType +from utils.pre_flight import SYNC_LOG_PREFIX + + +@dataclass +class DSliceData: + slice_num: str + circuit_id: str + input_file: Path + output_file: Path + proof_file: Path | None = None + success: bool | None = None + + +class EZKLInputType(Enum): + F16 = ezkl.PyInputType.F16 + F32 = ezkl.PyInputType.F32 + F64 = ezkl.PyInputType.F64 + Int = ezkl.PyInputType.Int + Bool = ezkl.PyInputType.Bool + TDim = ezkl.PyInputType.TDim + + +def ensure_proof_inputs(proof: dict, inputs: list[list], model_settings: dict) -> dict: + """ + Ensures that the proof JSON contains the correct input instances. + That should prevent miners from cheating by reusing proofs with different inputs. + """ + scale_map = model_settings.get("model_input_scales", []) + type_map = model_settings.get("input_types", []) + instances = [ + ezkl.float_to_felt(x, scale_map[i], EZKLInputType[type_map[i]].value) + for i, arr in enumerate(inputs) + for x in arr + ] + proof["instances"] = [instances[:] + proof["instances"][0][len(instances) :]] + + proof["transcript_type"] = "EVM" + + return proof + + +class DSperseManager: + def __init__(self): + self.circuits: list[Circuit] = [ + circuit + for circuit in circuit_store.circuits.values() + if circuit.metadata.type == CircuitType.DSPERSE_PROOF_GENERATION + ] + self.runs = {} # run_uid -> run data (slices etc.), used by validator only + + def _get_circuit_by_id(self, circuit_id: str) -> Circuit | None: + circuit = next((c for c in self.circuits if c.id == circuit_id), None) + if circuit is None: + raise ValueError(f"Circuit with ID {circuit_id} not found.") + return circuit + + def generate_dslice_requests(self) -> Iterable[DSliceQueuedProofRequest]: + """ + Generate DSlice requests for DSperse models. + Each DSlice request corresponds to one slice of a DSperse model. + """ + if not self.circuits: + # No DSperse circuits available, skip request generation + return + + circuit = random.choice(self.circuits) + run_uid = datetime.now().strftime("%Y%m%d%H%M%S%f") + logging.info( + f"Generating DSlice requests for circuit {circuit.metadata.name}... Run UID: {run_uid}" + ) + + slices: list[DSliceData] = self.run_dsperse(circuit, run_uid) + self.runs[run_uid] = slices + + for slice_data in slices: + with open(slice_data.input_file, "r") as input_file: + with open(slice_data.output_file, "r") as output_file: + yield DSliceQueuedProofRequest( + circuit=circuit, + inputs=json.load(input_file), + outputs=json.load(output_file), + slice_num=slice_data.slice_num, + run_uid=run_uid, + ) + + def run_dsperse(self, circuit: Circuit, run_uid: str) -> list[DSliceData]: + # Create temporary folder for run metadata + run_metadata_path = Path(cli_parser.config.dsperse_run_dir) / f"run_{run_uid}" + run_metadata_path.mkdir(parents=True, exist_ok=True) + save_metadata_path = run_metadata_path / "metadata.json" + logging.debug(f"Running DSperse model. Run metadata path: {run_metadata_path}") + + # Generate benchmarking input JSON + input_json_path = run_metadata_path / "input.json" + with open(input_json_path, "w") as f: + json.dump(circuit.input_handler(RequestType.BENCHMARK).generate(), f) + + # init runner and run the sliced model + runner = Runner(save_metadata_path=save_metadata_path) + results = runner.run( + input_json_path=input_json_path, slice_path=circuit.paths.external_base_path + ) + logging.debug( + f"DSperse run completed. Results data saved at {save_metadata_path}" + ) + slice_results = results["slice_results"] + + if not all(slice_result["success"] for slice_result in slice_results.values()): + logging.error( + "DSperse run failed for some slices. Aborting request generation..." + ) + return [] + + return [ + DSliceData( + slice_num=slice_num.split("_")[-1], + input_file=Path(r["input_file"]), + output_file=Path(r["output_file"]), + circuit_id=circuit.id, + ) + for slice_num, r in slice_results.items() + ] + + def prove_slice( + self, circuit_id: str, slice_num: str, inputs: dict, outputs: dict + ) -> dict | None: + """ + Generate proof for a given slice. + """ + circuit = self._get_circuit_by_id(circuit_id) + model_dir = Path(circuit.paths.external_base_path) / f"slice_{slice_num}" + + with tempfile.TemporaryDirectory() as tmp_dir: + tmp_path = Path(tmp_dir) + + input_file = tmp_path / "input.json" + output_file = tmp_path / "output.json" + + with open(input_file, "w") as f: + json.dump(inputs, f) + + with open(output_file, "w") as f: + json.dump(outputs, f) + + prover = Prover() + result = prover.prove( + run_path=tmp_path, + model_dir=model_dir, + output_path=tmp_path, + ) + logging.debug(f"Got proof generation result. Result: {result}") + + slice_id, proof_execution = self._parse_dsperse_result(result, "proof") + + success = proof_execution.get("success", False) + proof_generation_time = proof_execution.get("proof_generation_time", None) + proof_data = None + if proof_execution.get("proof_file", None): + with open(proof_execution["proof_file"], "r") as proof_file: + proof_data = json.load(proof_file) + + return { + "circuit_id": circuit_id, + "slice_num": slice_id, + "success": success, + "proof_generation_time": proof_generation_time, + "proof": proof_data, + } + + def verify_slice_proof( + self, + run_uid: str, + slice_num: str, + proof: dict, + ) -> bool: + """ + Verify proof for a given slice. + """ + # do we have run data for this run UID? + if run_uid not in self.runs: + raise ValueError(f"Run UID {run_uid} not found.") + + # get slice run data from stored run data + slice_data: DSliceData = next( + (s for s in self.runs[run_uid] if s.slice_num == slice_num), None + ) + if slice_data is None: + raise ValueError(f"Slice data for slice number {slice_num} not found.") + + circuit = self._get_circuit_by_id(slice_data.circuit_id) + # prepare inputs + with open(slice_data.input_file, "r") as f: + input_obj = circuit.input_handler( + request_type=RequestType.DSLICE, data=json.load(f) + ) + + # ensure proof has correct inputs + proof = ensure_proof_inputs( + proof, input_obj.to_array(), self._get_slice_settings(circuit, slice_num) + ) + + proof_file_path = slice_data.input_file.parent / "proof.json" + with open(proof_file_path, "w") as proof_file: + json.dump(proof, proof_file) + slice_data.proof_file = proof_file_path + + # time to verify! + verifier = Verifier() + result = verifier.verify( + run_path=slice_data.input_file.parent, + model_path=Path(circuit.paths.external_base_path) / f"slice_{slice_num}", + ) + + logging.debug(f"Got proof verification result. Result: {result}") + + _, verification_execution = self._parse_dsperse_result(result, "verification") + success = verification_execution.get("success", False) + slice_data.success = success + return success + + def check_run_completion( + self, run_uid: str, remove_completed: bool = False + ) -> bool: + """ + Check if all slices in a run have been successfully verified. + """ + if run_uid not in self.runs: + raise ValueError(f"Run UID {run_uid} not found.") + + slices: list[DSliceData] = self.runs[run_uid] + all_verified = all(slice_data.success for slice_data in slices) + if all_verified and remove_completed: + self.cleanup_run(run_uid) + return all_verified + + def cleanup_run(self, run_uid: str): + """ + Cleanup run data and delete run folder for a given run UID. + """ + if run_uid not in self.runs: + raise ValueError(f"Cannot cleanup run data. Run UID {run_uid} not found.") + logging.info(f"Cleaning up run data for run UID {run_uid}...") + run_path = self.runs[run_uid][0].input_file.parent.parent + if run_path.exists() and run_path.is_dir(): + shutil.rmtree(run_path) + del self.runs[run_uid] + + def total_cleanup(self): + """ + Cleanup all run data and delete all run folders. + Used during validator shutdown to free up disk space. + """ + logging.info("Performing total cleanup of all DSperse run data...") + for run_uid in list(self.runs.keys()): + self.cleanup_run(run_uid) + + def _get_slice_settings(self, circuit: Circuit, slice_num: str) -> dict: + """ + Retrieve settings for a specific slice from its metadata. + """ + metadata = self.get_slice_metadata( + Path(circuit.paths.external_base_path) / f"slice_{slice_num}" + ) + + settings_path = ( + metadata.get("slices", [{}])[0] + .get("compilation", {}) + .get("ezkl", {}) + .get("files", {}) + .get("settings", None) + ) + if not settings_path: + raise ValueError( + f"Settings file path not found in metadata for slice {slice_num} of circuit {circuit.id}." + ) + settings_path = ( + Path(circuit.paths.external_base_path) + / f"slice_{slice_num}" + / settings_path + ) + if not settings_path.exists() or not settings_path.is_file(): + raise ValueError( + f"Settings file not found at {settings_path} for slice {slice_num} of circuit {circuit.id}." + ) + with open(settings_path, "r") as f: + settings = json.load(f) + return settings + + def _parse_dsperse_result(self, result: dict, execution_type: str) -> dict: + execution_results = result.get("execution_chain", {}).get( + "execution_results", [] + ) + execution_result = execution_results[0] if execution_results else None + if not execution_result: + logging.error(f"No execution results found in proof generation result.") + return None + + slice_id = execution_result.get("slice_id", None) + execution = execution_result.get(f"{execution_type}_execution", {}) + + return slice_id, execution + + @classmethod + def get_slice_metadata(cls, slice_path: Path | str) -> dict: + """ + Retrieve metadata for a specific DSperse slice. + """ + slice_path = Path(slice_path) + metadata_path = slice_path / "metadata.json" + if not metadata_path.exists(): + raise ValueError(f"Metadata file not found at {metadata_path}.") + with open(metadata_path, "r") as f: + metadata = json.load(f) + if not isinstance(metadata, dict): + raise ValueError(f"Invalid metadata format at {metadata_path}.") + return metadata + + @classmethod + def extract_dslices(cls, model_path: Path | str) -> None: + """ + Extract DSperse slice files in a folder if there are any. + """ + model_path = Path(model_path) + # dslice_files = glob.glob(os.path.join(model_path, "slice_*.dslice")) + dslice_files = list(model_path.glob("slice_*.dslice")) + if not dslice_files: + return + logging.debug(SYNC_LOG_PREFIX + f"Extracting DSlices for model {model_path}...") + for dslice_file in dslice_files: + # extracted_path = os.path.splitext(dslice_file)[0] + extracted_path = dslice_file.with_suffix("") # remove .dslice suffix + if extracted_path.exists(): + # Extracted folder already exists, but the .dslice file is not deleted + # that means we probably interrupted extraction previously. Let's extract again + shutil.rmtree(extracted_path) + logging.info( + SYNC_LOG_PREFIX + + f"Extracting DSlice file {dslice_file} to {extracted_path}..." + ) + Converter.convert( + path=dslice_file, + output_type="dirs", + output_path=extracted_path, + cleanup=True, + ) + # `cleanup=True` doesn't work for some reason, so we manually delete the .dslice file + dslice_file.unlink(missing_ok=True) + + @classmethod + def compile_dslices(cls, model_path: Path | str) -> None: + """ + Compile DSperse slices in a folder if there are any. + """ + logging.debug( + f"Checking compilation status for DSperse slices in {model_path.name}..." + ) + model_path = Path(model_path) + compiler = Compiler() + for slice_dir in model_path.glob("slice_*"): + if not slice_dir.is_dir(): + continue + + metadata = cls.get_slice_metadata(slice_dir) + is_compiled = ( + metadata.get("slices", [{}])[0] + .get("compilation", {}) + .get("ezkl", {}) + .get("compiled", False) + ) + if is_compiled: + logging.debug( + f"DSlice {slice_dir.name} is already compiled. Skipping compilation." + ) + continue + + logging.info( + f"Compiling DSlice {slice_dir.name} in model {model_path.name}..." + ) + compiler.compile(model_path=slice_dir) diff --git a/neurons/generate_test_input.py b/neurons/generate_test_input.py deleted file mode 100644 index a429d1d8..00000000 --- a/neurons/generate_test_input.py +++ /dev/null @@ -1,14 +0,0 @@ -from deployment_layer.model_50818a54b31b3e0fe3306a7fb7826156fc2c42c9d64c6ba106ba135fbe7b7b19.input import ( - CircuitInput, -) -from _validator.models.request_type import RequestType - - -def main(): - input_instance = CircuitInput(RequestType.BENCHMARK) - generated_data = input_instance.generate() - print(f"Generated list items: {generated_data['list_items']}") - - -if __name__ == "__main__": - main() diff --git a/neurons/protocol.py b/neurons/protocol.py index 1844b114..6d4e0e90 100644 --- a/neurons/protocol.py +++ b/neurons/protocol.py @@ -1,11 +1,12 @@ from __future__ import annotations + +import os from typing import Any, ClassVar, Optional import bittensor as bt -from pydantic import BaseModel - import toml from execution_layer.circuit import ProofSystem +from pydantic import BaseModel class QueryZkProof(BaseModel): @@ -94,7 +95,10 @@ def deserialize(self) -> Optional[dict[str, int]]: return self.capacities @staticmethod - def from_config(config_path: str = "miner.config.toml") -> dict[str, int]: + def from_config(config_path: str | None = None) -> dict[str, int]: + if config_path is None: + # Use env var if available, otherwise fall back to default config path + config_path = os.environ.get("MINER_CIRCUITS_CONFIG", "miner.config.toml") try: with open(config_path, "r") as f: config = toml.load(f) @@ -107,3 +111,16 @@ def from_config(config_path: str = "miner.config.toml") -> dict[str, int]: except Exception as e: bt.logging.error(f"Error loading capacities from config: {e}") return {} + + +class DSliceProofGenerationDataModel(BaseModel): + """ + Data model for conveying DSPERSE proof generation messages + """ + + name: ClassVar = "dsperse-proof-generation" + circuit: Optional[str] = None + inputs: Optional[Any] = None + outputs: Optional[Any] = None + slice_num: Optional[str] = None + run_uid: Optional[str] = None diff --git a/neurons/scripts/check_miner.py b/neurons/scripts/check_miner.py index 7fafdc0a..1f8aa246 100755 --- a/neurons/scripts/check_miner.py +++ b/neurons/scripts/check_miner.py @@ -125,8 +125,6 @@ async def run_query(): ) sys.exit(1) - response = MinerResponse.from_raw_response(response) - bt.logging.trace(f"Miner query response: {response}") if response and not response.error: bt.logging.trace(f"Status Message: {response.error}") diff --git a/neurons/utils/__init__.py b/neurons/utils/__init__.py index 9d8fe5b0..6d3b7601 100644 --- a/neurons/utils/__init__.py +++ b/neurons/utils/__init__.py @@ -1,7 +1,7 @@ from .pre_flight import ( run_shared_preflight_checks, ensure_snarkjs_installed, - sync_model_files, + sync_models, ) from .system import restart_app, clean_temp_files from .auto_update import AutoUpdate @@ -11,7 +11,7 @@ __all__ = [ "run_shared_preflight_checks", "ensure_snarkjs_installed", - "sync_model_files", + "sync_models", "restart_app", "clean_temp_files", "AutoUpdate", diff --git a/neurons/utils/pre_flight.py b/neurons/utils/pre_flight.py index 6e0426a5..cfb80ec2 100644 --- a/neurons/utils/pre_flight.py +++ b/neurons/utils/pre_flight.py @@ -4,8 +4,10 @@ import subprocess import time import traceback +from collections import OrderedDict +from functools import partial +from pathlib import Path from typing import Optional -from constants import FIVE_MINUTES, Roles # trunk-ignore(pylint/E0611) import bittensor as bt @@ -13,10 +15,7 @@ import requests import cli_parser -from constants import IGNORED_MODEL_HASHES - -from functools import partial -from collections import OrderedDict +from constants import FIVE_MINUTES, IGNORED_MODEL_HASHES, Roles LOCAL_SNARKJS_INSTALL_DIR = os.path.join(os.path.expanduser("~"), ".snarkjs") LOCAL_SNARKJS_PATH = os.path.join( @@ -34,6 +33,8 @@ "circuit.zkey", ] +SYNC_LOG_PREFIX = " SYNC | " + async def download_srs(logrows): await ezkl.get_srs(logrows=logrows, commitment=ezkl.PyCommitments.KZG) @@ -57,13 +58,13 @@ def run_shared_preflight_checks(role: Optional[Roles] = None): "Ensuring Node.js version": ensure_nodejs_version, "Checking SnarkJS installation": ensure_snarkjs_installed, "Checking EZKL installation": ensure_ezkl_installed, - "Syncing model files": partial(sync_model_files, role=role), + "Syncing model files": partial(sync_models, role=role), } ) bt.logging.info(" PreFlight | Running pre-flight checks") - # Skip sync_model_files during docker build + # Skip sync_models during docker build if os.getenv("SUBNET_2_DOCKER_BUILD", False): bt.logging.info(" PreFlight | Skipping model file sync") _ = preflight_checks.pop("Syncing model files") @@ -167,14 +168,17 @@ def ensure_snarkjs_installed(): ) from e -def sync_model_files(role: Optional[Roles] = None): +def sync_models(role: Optional[Roles] = None): """ - Sync external model files + Download SRS files and sync external files for all models in the deployment layer. """ + from execution_layer.dsperse_manager import DSperseManager + from execution_layer.circuit import CircuitType + MODEL_DIR = os.path.join(os.path.dirname(__file__), "..", "deployment_layer") - SYNC_LOG_PREFIX = " SYNC | " loop = asyncio.get_event_loop() + # Download SRS files to ~/.ezkl/srs for logrows 1 to 25 for logrows in range(1, 26): if os.path.exists( os.path.join(os.path.expanduser("~"), ".ezkl", "srs", f"kzg{logrows}.srs") @@ -194,22 +198,23 @@ def sync_model_files(role: Optional[Roles] = None): f"{SYNC_LOG_PREFIX}Failed to download SRS for logrows={logrows}: {e}" ) - for model_hash in os.listdir(MODEL_DIR): - if not model_hash.startswith("model_"): + for model_path in Path(MODEL_DIR).iterdir(): + if not model_path.name.startswith("model_"): continue - if model_hash.split("_")[1] in IGNORED_MODEL_HASHES: + if model_path.name.split("_")[1] in IGNORED_MODEL_HASHES: bt.logging.info( SYNC_LOG_PREFIX - + f"Ignoring model {model_hash} as it is in the ignored list." + + f"Ignoring model {model_path} as it is in the ignored list." ) continue - metadata_file = os.path.join(MODEL_DIR, model_hash, "metadata.json") - if not os.path.isfile(metadata_file): + # XXX: maybe use `neurons.execution_layer.circuit.CircuitMetadata` here? + metadata_file = model_path / "metadata.json" + if not metadata_file.is_file(): bt.logging.error( SYNC_LOG_PREFIX - + f"Metadata file not found at {metadata_file} for {model_hash}. Skipping sync for this model." + + f"Metadata file not found at {metadata_file} for {model_path}. Skipping sync for this model." ) continue @@ -222,41 +227,95 @@ def sync_model_files(role: Optional[Roles] = None): ) continue - external_files = metadata.get("external_files", {}) - for key, url in external_files.items(): - if (role == Roles.VALIDATOR and key not in VALIDATOR_EXTERNAL_FILES) or ( - role == Roles.MINER and key not in MINER_EXTERNAL_FILES - ): - bt.logging.info( - SYNC_LOG_PREFIX - + f"Skipping {key} for {model_hash} as it is not required for the {role}." - ) - continue - file_path = os.path.join( - cli_parser.config.full_path_models, model_hash, key + external_files_model_path = ( + Path(cli_parser.config.full_path_models) / model_path.name + ) + download_external_files( + external_files_model_path, metadata.get("external_files", {}), role + ) + if metadata.get("type") == CircuitType.DSPERSE_PROOF_GENERATION: + download_dslices(external_files_model_path, metadata.get("dslices", [])) + DSperseManager.extract_dslices(external_files_model_path) + DSperseManager.compile_dslices(external_files_model_path) + + +def download_external_files( + target_dir: Path, external_files: dict, role: Optional[Roles] = None +): + """ + Sync external files for a model based on its metadata. + """ + if not external_files: + return + target_dir.mkdir(parents=True, exist_ok=True) + + for key, url in external_files.items(): + if (role == Roles.VALIDATOR and key not in VALIDATOR_EXTERNAL_FILES) or ( + role == Roles.MINER and key not in MINER_EXTERNAL_FILES + ): + bt.logging.info( + SYNC_LOG_PREFIX + + f"Skipping {key} for {target_dir.name} as it is not required for the {role}." ) - os.makedirs(os.path.dirname(file_path), exist_ok=True) - if os.path.isfile(file_path): - bt.logging.info( - SYNC_LOG_PREFIX - + f"File {key} for {model_hash} already downloaded, skipping..." - ) - continue - - bt.logging.info(SYNC_LOG_PREFIX + f"Downloading {url} to {file_path}...") - try: - with requests.get( - url, timeout=FIVE_MINUTES * 2, stream=True - ) as response: - response.raise_for_status() - with open(file_path, "wb") as f: - for chunk in response.iter_content(chunk_size=8192): - f.write(chunk) - except requests.RequestException as e: - bt.logging.error( - SYNC_LOG_PREFIX + f"Failed to download {url} to {file_path}: {e}" - ) - continue + continue + file_path = target_dir / key + + if file_path.is_file(): + bt.logging.info( + SYNC_LOG_PREFIX + + f"File {key} for {target_dir.name} already downloaded, skipping..." + ) + continue + download_file(url, file_path) + + +def download_dslices(target_dir: Path, dslices: list[dict]): + """ + Download DSperse slice files for a model if there are any. + """ + if not dslices: + return + bt.logging.debug( + SYNC_LOG_PREFIX + f"Checking DSlices for model {target_dir.name}..." + ) + for dslice_num, url in enumerate(dslices): + if not url: # Skip if URL is missing + bt.logging.warning( + SYNC_LOG_PREFIX + + f"DSlice URL missing for slice {dslice_num} of {target_dir.name}, skipping..." + ) + continue + + # dslice files are just zip archives, + # but later on we extract them to a folder named after the file without extension + # so in case that folder already exists, we skip downloading and extracting again + file_path = target_dir / f"slice_{dslice_num}.dslice" + extracted_path = file_path.with_suffix("") # remove .dslice suffix + # XXX: maybe we need to have some kind of versioning here and verification of the files? + if extracted_path.is_dir() or file_path.is_file(): + bt.logging.debug( + SYNC_LOG_PREFIX + + f"Dsperse file for {target_dir.name} already downloaded, skipping..." + ) + else: + download_file(url, file_path) + + +def download_file(url: str, file_path: Path | str): + """ + Download a file from a URL to a specified file path. + """ + bt.logging.info(SYNC_LOG_PREFIX + f"Downloading {url} to {file_path}...") + try: + with requests.get(url, timeout=FIVE_MINUTES * 2, stream=True) as response: + response.raise_for_status() + with open(file_path, "wb") as f: + for chunk in response.iter_content(chunk_size=8192): + f.write(chunk) + except requests.RequestException as e: + bt.logging.error( + SYNC_LOG_PREFIX + f"Failed to download {url} to {file_path}: {e}" + ) def ensure_nodejs_version(): diff --git a/pyproject.toml b/pyproject.toml index a12152e7..1f2d192b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,13 +15,14 @@ dependencies = [ "bittensor==9.9.0", "boto3>=1.36.13", "botocore>=1.37.19", - "ezkl==22.0.1", + "dsperse", + "ezkl==22.2.1", "fastapi==0.110.3", "gitpython>=3.1.44", "httpx>=0.28.1", "jsonrpcserver>=5.0.9", "matplotlib>=3.10.1", - "numpy==2.0.2", + "numpy~=2.2.3", "onnxruntime>=1.21.0", "opencv-contrib-python-headless>=4.11.0.86", "opencv-python>=4.11.0.86", @@ -74,6 +75,7 @@ pythonpath = [".", "neurons"] [tool.uv.sources] torch = { index = "pytorch" } +dsperse = { git = "https://github.com/inference-labs-inc/dsperse.git", rev = "dsperse-integration" } [[tool.uv.index]] name = "pytorch" diff --git a/requirements.txt b/requirements.txt index 016c1a4e..47d8cc3e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,10 @@ # This file was autogenerated by uv via the following command: -# uv export --no-dev --no-editable --no-emit-project -o requirements.txt --frozen +# uv export -o requirements.txt +-e . aiohappyeyeballs==2.6.1 \ --hash=sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558 \ --hash=sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 + # via aiohttp aiohttp==3.12.15 \ --hash=sha256:2e5a495cb1be69dae4b08f35a6c4579c539e9b5706f606632102c0f855bcba7c \ --hash=sha256:3c5092ce14361a73086b90c6efb3948ffa5be2f5b6fbcf52e8d8c8b8848bb97c \ @@ -22,33 +24,76 @@ aiohttp==3.12.15 \ --hash=sha256:d849b0901b50f2185874b9a232f38e26b9b3d4810095a7572eacea939132d4e1 \ --hash=sha256:f2800614cd560287be05e33a679638e586a2d7401f4ddf99e304d98878c29444 \ --hash=sha256:fd736ed420f4db2b8148b52b46b88ed038d0354255f9a73196b7bbce3ea97545 + # via + # bittensor + # subnet-2 aiosignal==1.4.0 \ --hash=sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e \ --hash=sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7 + # via aiohttp aiosqlite==0.21.0 \ --hash=sha256:131bb8056daa3bc875608c631c678cda73922a2d4ba8aec373b19f18c17e7aa3 \ --hash=sha256:2549cf4057f95f53dcba16f2b64e8e2791d7e1adedb13197dd8ed77bb226d7d0 + # via async-substrate-interface annotated-types==0.7.0 \ --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 + # via pydantic +ansicon==1.89.0 ; sys_platform == 'win32' \ + --hash=sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1 \ + --hash=sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec + # via jinxed anyio==4.10.0 \ --hash=sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6 \ --hash=sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1 + # via + # httpx + # starlette +appnope==0.1.4 ; sys_platform == 'darwin' \ + --hash=sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee \ + --hash=sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c + # via ipykernel +asttokens==3.0.0 \ + --hash=sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7 \ + --hash=sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2 + # via + # nbdev + # snoop + # stack-data +astunparse==1.6.3 \ + --hash=sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872 \ + --hash=sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 + # via nbdev async-substrate-interface==1.5.2 \ --hash=sha256:8b84bca2fc045338a0d9b327138807cae3872ffc6c38e5bb8032463897132d44 \ --hash=sha256:8d763550f691eed99f351daebba25001201171965a358f47efb3ea122228bf68 + # via + # bittensor + # subnet-2 asyncstdlib==3.13.1 \ --hash=sha256:a64da68176af1da8c699026cad98f70b184f82b4cb39739e0b9701a2a7541cf9 \ --hash=sha256:f47564b9a3566f8f9172631d88c75fe074b0ce2127963b7265d310df9aeed03a + # via bittensor attrs==24.3.0 \ --hash=sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff \ --hash=sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308 + # via + # aiohttp + # jsonschema + # referencing + # subnet-2 base58==2.1.1 \ --hash=sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2 \ --hash=sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c + # via + # scalecodec + # substrate-interface bittensor==9.9.0 \ --hash=sha256:4bff5ac33ba77ddb414d34d4c717210a648380afb2a4ad32edb65e212b3fc561 \ --hash=sha256:79b54026f4e464611c862ad85031c44bc2576221c16ca759279908dcda9f5e35 + # via + # proof-of-portfolio + # subnet-2 bittensor-drand==1.0.0 \ --hash=sha256:2d9f4960acabcb494de74790bf94c8b0d36efed4f21f5388690a25ecb48b1b8a \ --hash=sha256:2f3a7f878689f4c996db33ba3a8a336dd4c4f797fb4cd69176f75da13e770794 \ @@ -56,6 +101,7 @@ bittensor-drand==1.0.0 \ --hash=sha256:d309a19981d69e2bfc0ac27770c63531173fc4bb2a41483c9c60b6677c44a501 \ --hash=sha256:d3c1a78034ea4a9eb3c5b607ed4746c85051107fc742c782d3291574a249a83d \ --hash=sha256:eddf11a9e352e06558435f5938b3f859ff38a41ef947547d461d07221e2c0ba7 + # via bittensor bittensor-wallet==4.0.0 \ --hash=sha256:3c6b8d58f3b3c8c0b01ff8fd6260fad6acfa74506e4a38ce2df8f7ecd33f4d73 \ --hash=sha256:5ba1953a05b4ae220f84ddaf885b4dc8c800db33d7ac70b77d3b60b951009a08 \ @@ -63,12 +109,32 @@ bittensor-wallet==4.0.0 \ --hash=sha256:5ff0b15c41604b1adb035cbe8fcdfd8b840f60355817a1c4dd8ec257f9b63b33 \ --hash=sha256:9f990eac74b08897f9fc9a8af460d566b5cfb6e542f0313e4896a809449beb47 \ --hash=sha256:c1f53313b653eb0b67bf606a4f9e24ece503ba32025628b568da89ba7d7c4e82 + # via bittensor +black==25.1.0 \ + --hash=sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc \ + --hash=sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666 \ + --hash=sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f \ + --hash=sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b \ + --hash=sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717 \ + --hash=sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba +blessed==1.21.0 \ + --hash=sha256:ece8bbc4758ab9176452f4e3a719d70088eb5739798cd5582c9e05f2a28337ec \ + --hash=sha256:f831e847396f5a2eac6c106f4dfadedf46c4f804733574b15fe86d2ed45a9588 + # via curtsies boto3==1.40.30 \ --hash=sha256:04e89abf61240857bf7dec160e22f097eec68c502509b2bb3c5010a22cb91052 \ --hash=sha256:e95db539c938710917f4cb4fc5915f71b27f2c836d949a1a95df7895d2e9ec8b + # via subnet-2 botocore==1.40.30 \ --hash=sha256:1d87874ad81234bec3e83f9de13618f67ccdfefd08d6b8babc041cd45007447e \ --hash=sha256:8a74f77cfe5c519826d22f7613f89544cbb8491a1a49d965031bd997f89a8e3f + # via + # boto3 + # s3transfer + # subnet-2 +bpython==0.25 \ + --hash=sha256:28fd86008ca5ef6100ead407c9743aa60c51293a18ba5b18fcacea7f5b7f2257 \ + --hash=sha256:c246fc909ef6dcc26e9d8cb4615b0e6b1613f3543d12269b19ffd0782166c65b bt-decode==0.6.0 \ --hash=sha256:05e67b5ab018af7a31651bb9c0fb838c3a1733806823019d14c287922869f84e \ --hash=sha256:636e8a2c5074f43f1a68b75f225ad5434cbffed66d7e289c7efec5f0dde4bb54 \ @@ -77,10 +143,21 @@ bt-decode==0.6.0 \ --hash=sha256:78534a941d136715a33bdbbbf9d5f7d72ca3d75abe888f449b39e56396cea823 \ --hash=sha256:b61e4237b58977f6bd4500a0ca52b1ffc405f47498a5d89c70f6a37087e8cabc \ --hash=sha256:ecbf71fb8786727b7c7835441419c74104473d984505d2bfd5aaa2a78402d47a + # via async-substrate-interface +build==1.3.0 \ + --hash=sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397 \ + --hash=sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4 + # via nbdev certifi==2025.8.3 \ --hash=sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407 \ --hash=sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5 -cffi==2.0.0 ; platform_python_implementation != 'PyPy' \ + # via + # httpcore + # httpx + # requests + # sentry-sdk + # substrate-interface +cffi==2.0.0 ; implementation_name == 'pypy' or platform_python_implementation != 'PyPy' \ --hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \ --hash=sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe \ --hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \ @@ -94,6 +171,10 @@ cffi==2.0.0 ; platform_python_implementation != 'PyPy' \ --hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \ --hash=sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5 \ --hash=sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18 + # via + # cryptography + # pynacl + # pyzmq charset-normalizer==3.4.3 \ --hash=sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154 \ --hash=sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884 \ @@ -108,15 +189,38 @@ charset-normalizer==3.4.3 \ --hash=sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a \ --hash=sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1 \ --hash=sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37 + # via requests +cheap-repr==0.5.2 \ + --hash=sha256:001a5cf8adb0305c7ad3152c5f776040ac2a559d97f85770cebcb28c6ca5a30f \ + --hash=sha256:537ec1991bfee885c13c6d473afd110a408e039cde26882e95bf92761556ab6e + # via snoop click==8.2.1 \ --hash=sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202 \ --hash=sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b + # via + # black + # uvicorn + # wandb colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via + # bittensor + # build + # click + # dsperse + # ipython + # proof-of-portfolio + # pytest + # tqdm coloredlogs==15.0.1 \ --hash=sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934 \ --hash=sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0 + # via onnxruntime +comm==0.2.3 \ + --hash=sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971 \ + --hash=sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417 + # via ipykernel contourpy==1.3.3 \ --hash=sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69 \ --hash=sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc \ @@ -130,6 +234,7 @@ contourpy==1.3.3 \ --hash=sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7 \ --hash=sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb \ --hash=sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8 + # via matplotlib cryptography==45.0.7 \ --hash=sha256:16ede8a4f7929b4b7ff3642eba2bf79aa1d71f24ab6ee443935c0d269b6bc513 \ --hash=sha256:18fcf70f243fe07252dcb1b268a687f2358025ce32f9f88028ca5c364b123ef5 \ @@ -156,9 +261,27 @@ cryptography==45.0.7 \ --hash=sha256:dd342f085542f6eb894ca00ef70236ea46070c8a13824c6bde0dfdcd36065b9b \ --hash=sha256:f3df7b3d0f91b88b2106031fd995802a2e9ae13e02c36c1fc075b43f420f3a17 \ --hash=sha256:fa26fa54c0a9384c27fcdc905a2fb7d60ac6e47d14bc2692145f2b3b1e2cfdbd + # via pyopenssl +curtsies==0.4.3 \ + --hash=sha256:102a0ffbf952124f1be222fd6989da4ec7cce04e49f613009e5f54ad37618825 \ + --hash=sha256:65a1b4d6ff887bd9b0f0836cc6dc68c3a2c65c57f51a62f0ee5df408edee1a99 + # via bpython +cwcwidth==0.1.10 \ + --hash=sha256:1d2b21ff2eb60c6793349b7fb161c40a8583a57ec32e61f47aab7938177bfdec \ + --hash=sha256:2dd9a92fdfbc53fc79f0953f39708dcf743fd27450c374985f419e3d47eb89d4 \ + --hash=sha256:734d764281e3d87c40d0265543f00a653409145fa9f48a93bc0fbf9a8e7932ca \ + --hash=sha256:7468760f72c1f4107be1b2b2854bc000401ea36a69daed36fb966a1e19a7a124 \ + --hash=sha256:848b6ffca1e32e28d2ccbb2cd395ccd3c38a7c4ec110728cd9d828eaf609b09e \ + --hash=sha256:c3a7bfe1da478c0c27c549f68c6e28a583413da3ee451854ec2d983497bd18b8 \ + --hash=sha256:cff03100f49170bc50fc399d05a31b8fcb7b0cef26df1a8068fa943387107f6c \ + --hash=sha256:e0316488349c3e5ca4b20de7daa1cb8e96a05d1d14d040d46e87a495da655f4a + # via + # bpython + # curtsies cycler==0.12.1 \ --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c + # via matplotlib cytoolz==1.0.1 ; implementation_name == 'cpython' \ --hash=sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662 \ --hash=sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3 \ @@ -175,41 +298,89 @@ cytoolz==1.0.1 ; implementation_name == 'cpython' \ --hash=sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0 \ --hash=sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9 \ --hash=sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4 + # via eth-utils +debugpy==1.8.16 \ + --hash=sha256:19c9521962475b87da6f673514f7fd610328757ec993bf7ec0d8c96f9a325f9e \ + --hash=sha256:31e69a1feb1cf6b51efbed3f6c9b0ef03bc46ff050679c4be7ea6d2e23540870 \ + --hash=sha256:64473c4a306ba11a99fe0bb14622ba4fbd943eb004847d9b69b107bde45aa9ea \ + --hash=sha256:75f204684581e9ef3dc2f67687c3c8c183fde2d6675ab131d94084baf8084121 \ + --hash=sha256:833a61ed446426e38b0dd8be3e9d45ae285d424f5bf6cd5b2b559c8f12305508 \ + --hash=sha256:b202e2843e32e80b3b584bcebfe0e65e0392920dc70df11b2bfe1afcb7a085e4 + # via ipykernel decorator==5.2.1 \ --hash=sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360 \ --hash=sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a + # via + # ipython + # retry +dsperse @ git+https://github.com/inference-labs-inc/dsperse.git@8a8204d366c87f9d39cdc2abc4bd5560bdfa75da + # via subnet-2 ecdsa==0.19.1 \ --hash=sha256:30638e27cf77b7e15c4c4cc1973720149e1033827cfd00661ca5c8cc0cdb24c3 \ --hash=sha256:478cba7b62555866fcb3bb3fe985e06decbdb68ef55713c4e5ab98c57d508e61 + # via substrate-interface eth-hash==0.7.1 \ --hash=sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a \ --hash=sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5 + # via eth-utils eth-keys==0.7.0 \ --hash=sha256:79d24fd876201df67741de3e3fefb3f4dbcbb6ace66e47e6fe662851a4547814 \ --hash=sha256:b0cdda8ffe8e5ba69c7c5ca33f153828edcace844f67aabd4542d7de38b159cf + # via substrate-interface eth-typing==5.2.1 \ --hash=sha256:7557300dbf02a93c70fa44af352b5c4a58f94e997a0fd6797fb7d1c29d9538ee \ --hash=sha256:b0c2812ff978267563b80e9d701f487dd926f1d376d674f3b535cfe28b665d3d + # via + # eth-keys + # eth-utils eth-utils==5.3.1 \ --hash=sha256:1f5476d8f29588d25b8ae4987e1ffdfae6d4c09026e476c4aad13b32dda3ead0 \ --hash=sha256:c94e2d2abd024a9a42023b4ddc1c645814ff3d6a737b33d5cfd890ebf159c2d1 -ezkl==22.0.1 \ - --hash=sha256:2fcfb55370dbf3202b92c389fa4d2a2b3b57ddc2535c2cc479e43b00eaa41b1d \ - --hash=sha256:38064ba748cdd03c71508766082b7774441c65879a4b4db27a326e55848c4793 \ - --hash=sha256:3d84b010ae23f183f2543c78684fd9772774954ef070d14ccdcbc36ef34cd305 \ - --hash=sha256:69b52aa055ecc8a47707660e00ddbf72c8647cdaddb7e44c8c0b8247e257ca74 \ - --hash=sha256:b51baa1bfcb4dd2e209aa6d67e8fdce9dcd658b9868001a54c6c152fd9d439ec \ - --hash=sha256:deb1e540560ee8f98567da986f56daa82935abf92f8ba061cc8effa11687cbf4 \ - --hash=sha256:f4a0d074415d344bd4b1b86f27cbe3d3d7c2ee60e7eb1b196eda803557996676 + # via + # eth-keys + # substrate-interface +execnb==0.1.14 \ + --hash=sha256:486065e0fa8a15c9668e1710f43aed3f73fd4fe1de15fd45e027aeea588c2936 \ + --hash=sha256:ba87e955809bd33318aa13314ff4df90b424bb4556741c2dcc90c7a28bc87ddd + # via nbdev +executing==2.2.1 \ + --hash=sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4 \ + --hash=sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017 + # via + # snoop + # stack-data +ezkl==22.2.1 \ + --hash=sha256:0a939581175fdef2fab356927d9c4395c22e99c8b00fa80c08edb86ccd6fa9c0 \ + --hash=sha256:6c2353fede3155b9b588e61824e7505b33d0f9b8716cf2b99fe1aaa022840220 \ + --hash=sha256:7b0a7aac78858934821d3cb3ec620684d28f7b679f485dd03108932f51032ca5 \ + --hash=sha256:a5db874cbb59747118a90d050eb382dea6392775ccb85cdb8b954efe5bc2201e \ + --hash=sha256:b2f6d0fb2bc037355e6f3ec3a73714f10e6a68aaf43a0f15c15d13f308b2f69c \ + --hash=sha256:b8eac3f42cd3aa3a6879925a07469f8fef7aba0279efdaabd6cb31b706b22e5b \ + --hash=sha256:c3b9fea855c11165b74f3f97bf01510ecc3249dc6e2eba02674c9f5967924df1 + # via + # dsperse + # subnet-2 fastapi==0.110.3 \ --hash=sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626 \ --hash=sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32 + # via + # bittensor + # subnet-2 +fastcore==1.8.8 \ + --hash=sha256:939f7b79c5510b059ba9fc512dfe8aab30f5a752130a640070f8a1b494493b56 \ + --hash=sha256:f38853245e5ae5abb16275daac92fca00edeced020871b1d2416fb22cde70df8 + # via + # execnb + # ghapi + # nbdev filelock==3.19.1 \ --hash=sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58 \ --hash=sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d + # via torch flatbuffers==25.2.10 \ --hash=sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e \ --hash=sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051 + # via onnxruntime fonttools==4.59.2 \ --hash=sha256:0476ea74161322e08c7a982f83558a2b81b491509984523a1a540baf8611cc31 \ --hash=sha256:0ec99f9bdfee9cdb4a9172f9e8fd578cce5feb231f598909e0aecf5418da4f25 \ @@ -221,6 +392,7 @@ fonttools==4.59.2 \ --hash=sha256:980fd7388e461b19a881d35013fec32c713ffea1fc37aef2f77d11f332dfd7da \ --hash=sha256:a10c1bd7644dc58f8862d8ba0cf9fb7fef0af01ea184ba6ce3f50ab7dfe74d5a \ --hash=sha256:e72c0749b06113f50bcb80332364c6be83a9582d6e3db3fe0b280f996dc2ef22 + # via matplotlib frozenlist==1.7.0 \ --hash=sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df \ --hash=sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5 \ @@ -241,38 +413,125 @@ frozenlist==1.7.0 \ --hash=sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4 \ --hash=sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08 \ --hash=sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025 + # via + # aiohttp + # aiosignal fsspec==2025.9.0 \ --hash=sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19 \ --hash=sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7 + # via torch +ghapi==1.0.6 \ + --hash=sha256:64fdd9f06d8e3373065c42c2a03e067e2bbb9ca18b583cd6e38a28aaad0224f6 \ + --hash=sha256:b3d96bf18fcaa2cb7131bad9de2948e2a1c2bb226377a25826f6c80950c57854 + # via nbdev gitdb==4.0.12 \ --hash=sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571 \ --hash=sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf + # via gitpython gitpython==3.1.45 \ --hash=sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c \ --hash=sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77 + # via + # subnet-2 + # tach + # wandb +greenlet==3.2.4 \ + --hash=sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d \ + --hash=sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f \ + --hash=sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d \ + --hash=sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0 \ + --hash=sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd \ + --hash=sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9 \ + --hash=sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02 \ + --hash=sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0 \ + --hash=sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6 \ + --hash=sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb \ + --hash=sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0 \ + --hash=sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968 + # via bpython h11==0.16.0 \ --hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \ --hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 + # via + # httpcore + # uvicorn +httpcore==1.0.9 \ + --hash=sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55 \ + --hash=sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8 + # via httpx +httpx==0.28.1 \ + --hash=sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad + # via subnet-2 humanfriendly==10.0 \ --hash=sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477 \ --hash=sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc + # via coloredlogs idna==3.10 \ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 + # via + # anyio + # httpx + # requests + # substrate-interface + # yarl +iniconfig==2.1.0 \ + --hash=sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7 \ + --hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 + # via pytest +ipykernel==6.30.1 \ + --hash=sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b \ + --hash=sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4 +ipython==9.5.0 \ + --hash=sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113 \ + --hash=sha256:88369ffa1d5817d609120daa523a6da06d02518e582347c29f8451732a9c5e72 + # via + # execnb + # ipykernel +ipython-pygments-lexers==1.1.1 \ + --hash=sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81 \ + --hash=sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c + # via ipython +jedi==0.19.2 \ + --hash=sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0 \ + --hash=sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9 + # via ipython jinja2==3.1.6 \ --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + # via torch +jinxed==1.3.0 ; sys_platform == 'win32' \ + --hash=sha256:1593124b18a41b7a3da3b078471442e51dbad3d77b4d4f2b0c26ab6f7d660dbf \ + --hash=sha256:b993189f39dc2d7504d802152671535b06d380b26d78070559551cbf92df4fc5 + # via blessed jmespath==1.0.1 \ --hash=sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980 \ --hash=sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe + # via + # boto3 + # botocore jsonrpcserver==5.0.9 \ --hash=sha256:a71fb2cfa18541c80935f60987f92755d94d74141248c7438847b96eee5c4482 + # via subnet-2 jsonschema==4.25.1 \ --hash=sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63 \ --hash=sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85 + # via jsonrpcserver jsonschema-specifications==2025.9.1 \ --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \ --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d + # via jsonschema +jupyter-client==8.6.3 \ + --hash=sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419 \ + --hash=sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f + # via ipykernel +jupyter-core==5.8.1 \ + --hash=sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941 \ + --hash=sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0 + # via + # ipykernel + # jupyter-client kiwisolver==1.4.9 \ --hash=sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77 \ --hash=sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60 \ @@ -288,9 +547,11 @@ kiwisolver==1.4.9 \ --hash=sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2 \ --hash=sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04 \ --hash=sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54 + # via matplotlib markdown-it-py==4.0.0 \ --hash=sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147 \ --hash=sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3 + # via rich markupsafe==3.0.2 \ --hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \ --hash=sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028 \ @@ -303,6 +564,7 @@ markupsafe==3.0.2 \ --hash=sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48 \ --hash=sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8 \ --hash=sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0 + # via jinja2 matplotlib==3.10.6 \ --hash=sha256:08f141d55148cd1fc870c3387d70ca4df16dee10e909b3b038782bd4bda6ea07 \ --hash=sha256:1678bb61d897bb4ac4757b5ecfb02bfb3fddf7f808000fb81e09c510712fda75 \ @@ -312,15 +574,28 @@ matplotlib==3.10.6 \ --hash=sha256:662df55604a2f9a45435566d6e2660e41efe83cd94f4288dfbf1e6d1eae4b0bb \ --hash=sha256:ec01b645840dd1996df21ee37f208cd8ba57644779fa20464010638013d3203c \ --hash=sha256:f44c8d264a71609c79a78d50349e724f5d5fc3684ead7c2a473665ee63d868aa + # via + # dsperse + # proof-of-portfolio + # subnet-2 +matplotlib-inline==0.1.7 \ + --hash=sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90 \ + --hash=sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca + # via + # ipykernel + # ipython mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py more-itertools==10.8.0 \ --hash=sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b \ --hash=sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd + # via scalecodec mpmath==1.3.0 \ --hash=sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f \ --hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c + # via sympy msgpack==1.1.1 \ --hash=sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157 \ --hash=sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef \ @@ -333,9 +608,11 @@ msgpack==1.1.1 \ --hash=sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a \ --hash=sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c \ --hash=sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b + # via msgpack-numpy-opentensor msgpack-numpy-opentensor==0.5.0 \ --hash=sha256:213232c20e2efd528ec8a9882b605e8ad87cfc35b57dfcfefe05d33aaaabe574 \ --hash=sha256:8a61c597a976425a87094d8e89846aa9528eb1f037e97ff1428fe3cd61a238e7 + # via bittensor multidict==6.6.4 \ --hash=sha256:01368e3c94032ba6ca0b78e7ccb099643466cf24f8dc8eefcfdc0571d56e58f9 \ --hash=sha256:047d9425860a8c9544fed1b9584f0c8bcd31bcde9568b047c5e567a1025ecd6e \ @@ -357,35 +634,79 @@ multidict==6.6.4 \ --hash=sha256:d191de6cbab2aff5de6c5723101705fd044b3e4c7cfd587a1929b5028b9714b3 \ --hash=sha256:d2d4e4787672911b48350df02ed3fa3fffdc2f2e8ca06dd6afdf34189b76a9dd \ --hash=sha256:db9801fe021f59a5b375ab778973127ca0ac52429a26e2fd86aa9508f4d26eb7 + # via + # aiohttp + # yarl munch==2.5.0 \ --hash=sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2 \ --hash=sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd + # via bittensor +mypy-extensions==1.1.0 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 + # via black +nbdev==2.4.5 \ + --hash=sha256:12fa7aedec70515bbb0efdf3f39000793541e0209c047cd115761cabe284a63d \ + --hash=sha256:4ed72a3fb48ec6cbd1ff69e4ea3b31c1e3fe7cdacbafef4579914d5c15ab8994 nest-asyncio==1.6.0 \ --hash=sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe \ --hash=sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c + # via + # bittensor + # ipykernel netaddr==1.3.0 \ --hash=sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a \ --hash=sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe -networkx==3.5 \ - --hash=sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec \ - --hash=sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037 -numpy==2.0.2 \ - --hash=sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a \ - --hash=sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5 \ - --hash=sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78 \ - --hash=sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e \ - --hash=sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c \ - --hash=sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c \ - --hash=sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c \ - --hash=sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692 \ - --hash=sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a \ - --hash=sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b \ - --hash=sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded -onnxruntime==1.22.1 \ - --hash=sha256:2d39a530aff1ec8d02e365f35e503193991417788641b184f5b1e8c9a6d5ce8d \ - --hash=sha256:6a64291d57ea966a245f749eb970f4fa05a64d26672e05a83fdb5db6b7d62f87 \ - --hash=sha256:984cea2a02fcc5dfea44ade9aca9fe0f7a8a2cd6f77c258fc4388238618f3928 \ - --hash=sha256:a938d11c0dc811badf78e435daa3899d9af38abee950d87f3ab7430eb5b3cf5a + # via bittensor +networkx==3.4.2 \ + --hash=sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1 \ + --hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f + # via + # dsperse + # tach + # torch +numpy==2.2.6 \ + --hash=sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49 \ + --hash=sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff \ + --hash=sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4 \ + --hash=sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282 \ + --hash=sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3 \ + --hash=sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2 \ + --hash=sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c \ + --hash=sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd \ + --hash=sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87 \ + --hash=sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249 \ + --hash=sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de + # via + # bittensor + # contourpy + # dsperse + # matplotlib + # msgpack-numpy-opentensor + # onnx + # onnxruntime + # opencv-contrib-python-headless + # opencv-python + # proof-of-portfolio + # scipy + # subnet-2 +onnx==1.18.0 \ + --hash=sha256:102c04edc76b16e9dfeda5a64c1fccd7d3d2913b1544750c01d38f1ac3c04e05 \ + --hash=sha256:3d8dbf9e996629131ba3aa1afd1d8239b660d1f830c6688dd7e03157cccd6b9c \ + --hash=sha256:521bac578448667cbb37c50bf05b53c301243ede8233029555239930996a625b \ + --hash=sha256:911b37d724a5d97396f3c2ef9ea25361c55cbc9aa18d75b12a52b620b67145af \ + --hash=sha256:99afac90b4cdb1471432203c3c1f74e16549c526df27056d39f41a9a47cfb4af \ + --hash=sha256:e4da451bf1c5ae381f32d430004a89f0405bc57a8471b0bddb6325a5b334aa40 \ + --hash=sha256:ee159b41a3ae58d9c7341cf432fc74b96aaf50bd7bb1160029f657b40dc69715 + # via dsperse +onnxruntime==1.21.0 \ + --hash=sha256:37b7445c920a96271a8dfa16855e258dc5599235b41c7bbde0d262d55bcc105f \ + --hash=sha256:7f801318476cd7003d636a5b392f7a37c08b6c8d2f829773f3c3887029e03f32 \ + --hash=sha256:893d67c68ca9e7a58202fa8d96061ed86a5815b0925b5a97aef27b8ba246a20b \ + --hash=sha256:9a04aafb802c1e5573ba4552f8babcb5021b041eb4cfa802c9b7644ca3510eca + # via + # dsperse + # subnet-2 opencv-contrib-python-headless==4.12.0.88 \ --hash=sha256:3d8a7b23a5faba4ad34e13f51668c56be791e57ab02d68d9016200fed3c12c77 \ --hash=sha256:85b520e527052a85a682f09cdc12e5f156f56d8c277261b4b65b48431abae96f \ @@ -394,6 +715,7 @@ opencv-contrib-python-headless==4.12.0.88 \ --hash=sha256:b183e2322468c9d3bd9cac4ba44b272d828ec22842395bcfa51df31765224c0a \ --hash=sha256:c57e32812fea2a542bb220088fb3ce8a210fe114c9454d1c9e8cd162e1a1fde8 \ --hash=sha256:d60a12b915c55a50468c013fcd839e941b49ccc1f37b914b62543382c36bf81d + # via subnet-2 opencv-python==4.12.0.88 \ --hash=sha256:092c16da4c5a163a818f120c22c5e4a2f96e0db4f24e659c701f1fe629a690f9 \ --hash=sha256:51fd981c7df6af3e8f70b1556696b05224c4e6b6777bdd2a46b3d4fb09de1a92 \ @@ -402,12 +724,39 @@ opencv-python==4.12.0.88 \ --hash=sha256:d98edb20aa932fd8ebd276a72627dad9dc097695b3d435a4257557bbb49a79d2 \ --hash=sha256:f9a1f08883257b95a5764bf517a32d75aec325319c8ed0f89739a57fae9e92a5 \ --hash=sha256:ff554d3f725b39878ac6a2e1fa232ec509c36130927afc18a1719ebf4fbf4357 + # via subnet-2 oslash==0.6.3 \ --hash=sha256:868aeb58a656f2ed3b73d9dd6abe387b20b74fc9413d3e8653b615b15bf728f3 \ --hash=sha256:89b978443b7db3ac2666106bdc3680add3c886a6d8fcdd02fd062af86d29494f + # via jsonrpcserver packaging==24.2 \ --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 \ --hash=sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f + # via + # bittensor + # black + # build + # fastcore + # ghapi + # ipykernel + # matplotlib + # nbdev + # onnxruntime + # pytest + # subnet-2 + # wandb +parso==0.8.5 \ + --hash=sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a \ + --hash=sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887 + # via jedi +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ + --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 + # via black +pexpect==4.9.0 ; sys_platform != 'emscripten' and sys_platform != 'win32' \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \ + --hash=sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f + # via ipython pillow==11.3.0 \ --hash=sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542 \ --hash=sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523 \ @@ -421,15 +770,34 @@ pillow==11.3.0 \ --hash=sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d \ --hash=sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d \ --hash=sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4 + # via + # matplotlib + # subnet-2 platformdirs==4.4.0 \ --hash=sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85 \ --hash=sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf + # via + # black + # jupyter-core + # wandb +pluggy==1.6.0 \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + # via pytest prometheus-client==0.21.1 \ --hash=sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb \ --hash=sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301 + # via subnet-2 +prompt-toolkit==3.0.52 \ + --hash=sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855 \ + --hash=sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955 + # via + # ipython + # tach proof-of-portfolio==0.0.134 \ --hash=sha256:5accfe9d112ad850e41bc2a1cfd6677343cb9fe30a86113d59025adfac437d05 \ --hash=sha256:72ab80c99dafad3db410244738c0cbddd957a5e26a701885b0324c45a2e68a33 + # via subnet-2 propcache==0.3.2 \ --hash=sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c \ --hash=sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535 \ @@ -449,6 +817,9 @@ propcache==0.3.2 \ --hash=sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06 \ --hash=sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1 \ --hash=sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67 + # via + # aiohttp + # yarl protobuf==6.32.1 \ --hash=sha256:2601b779fc7d32a866c6b4404f9d42a3f67c5b9f3f15b4db3cccabe06b95c346 \ --hash=sha256:2f5b80a49e1eb7b86d85fcd23fe92df154b9730a725c3b38c4e43b9d77018bf4 \ @@ -457,6 +828,11 @@ protobuf==6.32.1 \ --hash=sha256:b1864818300c297265c83a4982fd3169f97122c299f56a56e2445c3698d34710 \ --hash=sha256:d8c7e6eb619ffdf105ee4ab76af5a68b60a9d0f66da3ea12d1640e6d8dab7281 \ --hash=sha256:ee2469e4a021474ab9baafea6cd070e5bf27c7d29433504ddea1a4ee5850f68d + # via + # onnx + # onnxruntime + # subnet-2 + # wandb psutil==6.1.1 \ --hash=sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377 \ --hash=sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3 \ @@ -466,9 +842,21 @@ psutil==6.1.1 \ --hash=sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53 \ --hash=sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649 \ --hash=sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8 + # via + # ipykernel + # subnet-2 +ptyprocess==0.7.0 ; sys_platform != 'emscripten' and sys_platform != 'win32' \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 + # via pexpect +pure-eval==0.2.3 \ + --hash=sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 \ + --hash=sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42 + # via stack-data py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 + # via retry py-bip39-bindings==0.3.0 \ --hash=sha256:086c8e73208f423c3edd051a79334710b5253fb7be5e6a8d0b53da8538c0cc48 \ --hash=sha256:2b5f3f6dda9a68040c1fb74b9ca721788e3cec3d6e4d1e7ff91659bbc72c2bec \ @@ -484,6 +872,7 @@ py-bip39-bindings==0.3.0 \ --hash=sha256:b16eb31bbedc6148a739a6fc8a79053306dcb7585972405f3728802cd844bfa7 \ --hash=sha256:c0397a8c6744e906e13b7b4129fa676ff943569fea968cc310f2c9248b9f88e6 \ --hash=sha256:ccf1f277358c635c28469d6cfd33f40c8cde902dcfdc23f395ac2932d19564bf + # via substrate-interface py-ed25519-zebra-bindings==1.3.0 \ --hash=sha256:015c2ce6b934a6b36d50a21c6213636c18edf9a4c14b847f70089ba1897e119e \ --hash=sha256:160d09d42c3a71b27b31c6cfe33c495816603407a8dca65848e3daf5264ce650 \ @@ -499,6 +888,7 @@ py-ed25519-zebra-bindings==1.3.0 \ --hash=sha256:bc58becb6f3336e73249916bb0ebb5ca01304f7229066681fa1a54b437c73650 \ --hash=sha256:c0c4478ab57d65671b310524978122a81b9921847dba07f005d0d2d218f610b5 \ --hash=sha256:dd548a85aae8354e781db7ce2310cd74e11478c95caf30dcb0e61481de9b1ccd + # via substrate-interface py-sr25519-bindings==0.2.2 \ --hash=sha256:192d65d3bc43c6f4121a0732e1f6eb6ad869897ca26368ba032e96a82b3b7606 \ --hash=sha256:292be23ad53d9f9dbf1703a2a341005629a8f93c57cfad254c8c1230ec7d3fe3 \ @@ -514,9 +904,11 @@ py-sr25519-bindings==0.2.2 \ --hash=sha256:f22542738ed98fac0d3da2479dd3f26c695594800877a4d8bb116c47e4fd4b7c \ --hash=sha256:f44a0a9cb155af6408e3f73833a935abc98934ce097b2ad07dd13e3a88f82cb8 \ --hash=sha256:fea3ce0ac6a26a52735bb48f8daafb82d17147f776bb6d9d3c330bd2ccffe20d -pycparser==2.23 ; implementation_name != 'PyPy' and platform_python_implementation != 'PyPy' \ + # via substrate-interface +pycparser==2.23 ; (implementation_name != 'PyPy' and platform_python_implementation != 'PyPy') or (implementation_name == 'pypy' and platform_python_implementation == 'PyPy') \ --hash=sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2 \ --hash=sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934 + # via cffi pycryptodome==3.23.0 \ --hash=sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c \ --hash=sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f \ @@ -530,9 +922,18 @@ pycryptodome==3.23.0 \ --hash=sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575 \ --hash=sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843 \ --hash=sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa + # via + # bittensor + # substrate-interface pydantic==2.10.6 \ --hash=sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584 \ --hash=sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236 + # via + # bittensor + # eth-utils + # fastapi + # subnet-2 + # wandb pydantic-core==2.27.2 \ --hash=sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6 \ --hash=sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7 \ @@ -549,9 +950,21 @@ pydantic-core==2.27.2 \ --hash=sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9 \ --hash=sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3 \ --hash=sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39 + # via pydantic +pydot==3.0.4 \ + --hash=sha256:3ce88b2558f3808b0376f22bfa6c263909e1c3981e2a7b629b65b451eee4a25d \ + --hash=sha256:bfa9c3fc0c44ba1d132adce131802d7df00429d1a79cc0346b0a5cd374dbe9c6 + # via tach pygments==2.19.2 \ --hash=sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887 \ --hash=sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b + # via + # bpython + # ipython + # ipython-pygments-lexers + # pytest + # rich + # snoop pynacl==1.6.0 \ --hash=sha256:140373378e34a1f6977e573033d1dd1de88d2a5d90ec6958c9485b2fd9f3eb90 \ --hash=sha256:16c60daceee88d04f8d41d0a4004a7ed8d9a5126b997efd2933e08e93a3bd850 \ @@ -568,21 +981,49 @@ pynacl==1.6.0 \ --hash=sha256:ef214b90556bb46a485b7da8258e59204c244b1b5b576fb71848819b468c44a7 \ --hash=sha256:f3482abf0f9815e7246d461fab597aa179b7524628a4bc36f86a7dc418d2608d \ --hash=sha256:f4b3824920e206b4f52abd7de621ea7a44fd3cb5c8daceb7c3612345dfc54f2e + # via substrate-interface pyopenssl==25.1.0 \ --hash=sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab \ --hash=sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b + # via subnet-2 pyparsing==3.2.3 \ --hash=sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf \ --hash=sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be + # via + # matplotlib + # pydot +pyproject-hooks==1.2.0 \ + --hash=sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8 \ + --hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 + # via build pyreadline3==3.5.4 ; sys_platform == 'win32' \ --hash=sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7 \ --hash=sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6 + # via humanfriendly +pytest==8.4.2 \ + --hash=sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01 \ + --hash=sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79 + # via dsperse python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via + # botocore + # jupyter-client + # matplotlib python-statemachine==2.5.0 \ --hash=sha256:0ed53846802c17037fcb2a92323f4bc0c833290fa9d17a3587c50886c1541e62 \ --hash=sha256:ae88cd22e47930b92b983a2176e61d811e571b69897be2568ec812c2885fb93a + # via bittensor +pywin32==311 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32' \ + --hash=sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31 \ + --hash=sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067 \ + --hash=sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852 + # via jupyter-core +pyxdg==0.28 \ + --hash=sha256:3267bb3074e934df202af2ee0868575484108581e6f3cb006af1da35395e88b4 \ + --hash=sha256:bdaf595999a0178ecea4052b7f4195569c1ff4d344567bccdc12dfdf02d545ab + # via bpython pyyaml==6.0.2 \ --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ @@ -594,18 +1035,52 @@ pyyaml==6.0.2 \ --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 + # via + # bittensor + # nbdev + # tach + # wandb +pyzmq==27.1.0 \ + --hash=sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28 \ + --hash=sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113 \ + --hash=sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd \ + --hash=sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233 \ + --hash=sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31 \ + --hash=sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc \ + --hash=sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f \ + --hash=sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf \ + --hash=sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540 \ + --hash=sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856 \ + --hash=sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496 + # via + # ipykernel + # jupyter-client referencing==0.36.2 \ --hash=sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa \ --hash=sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0 + # via + # jsonschema + # jsonschema-specifications requests==2.32.4 \ --hash=sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c \ --hash=sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422 + # via + # bittensor + # bpython + # scalecodec + # subnet-2 + # substrate-interface + # wandb retry==0.9.2 \ --hash=sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606 \ --hash=sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4 + # via bittensor rich==13.8.1 \ --hash=sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06 \ --hash=sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a + # via + # subnet-2 + # tach rpds-py==0.27.1 \ --hash=sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e \ --hash=sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5 \ @@ -623,12 +1098,20 @@ rpds-py==0.27.1 \ --hash=sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594 \ --hash=sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb \ --hash=sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444 + # via + # jsonschema + # referencing s3transfer==0.14.0 \ --hash=sha256:ea3b790c7077558ed1f02a3072fb3cb992bbbd253392f4b6e9e8976941c7d456 \ --hash=sha256:eff12264e7c8b4985074ccce27a3b38a485bb7f7422cc8046fee9be4983e4125 + # via boto3 scalecodec==1.2.11 \ --hash=sha256:99a2cdbfccdcaf22bd86b86da55a730a2855514ad2309faef4a4a93ac6cbeb8d \ --hash=sha256:d15c94965f617caa25096f83a45f5f73031d05e6ee08d6039969f0a64fc35de1 + # via + # async-substrate-interface + # bittensor + # substrate-interface scipy==1.16.2 \ --hash=sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232 \ --hash=sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1 \ @@ -641,55 +1124,172 @@ scipy==1.16.2 \ --hash=sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1 \ --hash=sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f \ --hash=sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0 + # via proof-of-portfolio sentry-sdk==2.37.1 \ --hash=sha256:531751da91aa62a909b42a7be155b41f6bb0de9df6ae98441d23b95de2f98475 \ --hash=sha256:baaaea6608ed3a639766a69ded06b254b106d32ad9d180bdbe58f3db9364592b + # via wandb setuptools==70.0.0 \ --hash=sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4 \ --hash=sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0 + # via + # bittensor + # nbdev + # torch six==1.17.0 \ --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 + # via + # astunparse + # ecdsa + # munch + # python-dateutil smmap==5.0.2 \ --hash=sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5 \ --hash=sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e + # via gitdb sniffio==1.3.1 \ --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \ --hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc + # via anyio +snoop==0.6.0 \ + --hash=sha256:c615eddf84d8907f893dec7fde38768aa4b1d88d92d63055b6cfc07e5cde37ec \ + --hash=sha256:f5ea9060e65594bf404e6841086b4a964cc27bc30569109c91a470f948b0f729 +stack-data==0.6.3 \ + --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 + # via ipython starlette==0.37.2 \ --hash=sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee \ --hash=sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823 + # via fastapi substrate-interface==1.7.11 \ --hash=sha256:4caa5eacb9996edbe76ad12249521b3542bbd8d9d69b96734087201db1fef8f6 \ --hash=sha256:ce19bc97481769238ed23c752db985a3058637918693f2db6aeed2fab3756075 + # via subnet-2 sympy==1.14.0 \ --hash=sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517 \ --hash=sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 + # via + # onnxruntime + # torch +tach==0.29.0 \ + --hash=sha256:0b27b9265eee34f396515a2e918fa783d3d02e69edfb6ea1dfd1843d49021429 \ + --hash=sha256:2e15ceb80fc25435d18e01d10029fec15a54fb53bf6b430d53c4ecb53859a0ff \ + --hash=sha256:3b40c59e9a1d0b28fc6176736876c4cfa2d01114870d539e9989dfb7c6638139 \ + --hash=sha256:42e0bbecf5e8ea23791b62e54e7c8065376e8a7f642a232dcef8bcae0149944e \ + --hash=sha256:517f33d18d381326a775d101650e576c6922db53b2c336192db7db88b9a3521d \ + --hash=sha256:52903e54683b0aa26bd4ef0c9ed68b34480a3fbf83fb7b32e9d6a9908e2761e1 \ + --hash=sha256:58443cbd3f5d19d6b98cd3508593eae186c91f0e059c8bcf1348e3849095b622 \ + --hash=sha256:810e5aaa2e936c8417bb91672708886aadaf8ab116763ae418c6b1b961422bba \ + --hash=sha256:a7b8c82943f4ed72612282ff35c155fcca7222b9e9cd2864763b67497729f0c3 \ + --hash=sha256:d65408ec003ec16bdab4ef61990d7cfc0551672d145a78f80a4aef71e8714b9b \ + --hash=sha256:d984f54bebba0e4c981d2a08c3e4cdf76c3b5f3126e2f593a0faaed9d218552a toml==0.10.0 \ --hash=sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c \ --hash=sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e + # via + # bt-decode + # proof-of-portfolio +tomli==2.2.1 \ + --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \ + --hash=sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6 \ + --hash=sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77 \ + --hash=sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea \ + --hash=sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192 \ + --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 \ + --hash=sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98 \ + --hash=sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8 \ + --hash=sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e \ + --hash=sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc \ + --hash=sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff \ + --hash=sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222 + # via tach +tomli-w==1.2.0 \ + --hash=sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90 \ + --hash=sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021 + # via tach toolz==1.0.0 ; implementation_name == 'cpython' or implementation_name == 'pypy' \ --hash=sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236 \ --hash=sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02 + # via + # cytoolz + # eth-utils torch==2.7.1 ; sys_platform == 'darwin' \ --hash=sha256:7b4f8b2b83bd08f7d399025a9a7b323bdbb53d20566f1e0d584689bb92d82f9a + # via + # dsperse + # subnet-2 torch==2.7.1+cpu ; sys_platform != 'darwin' \ --hash=sha256:0bc887068772233f532b51a3e8c8cfc682ae62bef74bf4e0c53526c8b9e4138f \ --hash=sha256:3bf2db5adf77b433844f080887ade049c4705ddf9fe1a32023ff84ff735aa5ad \ --hash=sha256:8f8b3cfc53010a4b4a3c7ecb88c212e9decc4f5eeb6af75c3c803937d2d60947 \ --hash=sha256:a2618775f32eb4126c5b2050686da52001a08cffa331637d9cf51c8250931e00 + # via + # dsperse + # subnet-2 +tornado==6.5.2 \ + --hash=sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c \ + --hash=sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6 \ + --hash=sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef \ + --hash=sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4 \ + --hash=sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0 \ + --hash=sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e \ + --hash=sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882 \ + --hash=sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04 \ + --hash=sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0 \ + --hash=sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af \ + --hash=sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f \ + --hash=sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108 + # via + # ipykernel + # jupyter-client tqdm==4.67.1 \ --hash=sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2 \ --hash=sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2 + # via + # dsperse + # subnet-2 +traitlets==5.14.3 \ + --hash=sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7 \ + --hash=sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f + # via + # ipykernel + # ipython + # jupyter-client + # jupyter-core + # matplotlib-inline typing-extensions==4.15.0 \ --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 -urllib3==2.5.0 \ - --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \ - --hash=sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc + # via + # aiosignal + # aiosqlite + # anyio + # eth-typing + # fastapi + # onnx + # oslash + # pydantic + # pydantic-core + # pyopenssl + # referencing + # torch + # wandb +urllib3==2.6.2 \ + --hash=sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797 \ + --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd + # via + # botocore + # requests + # sentry-sdk + # subnet-2 uvicorn==0.34.0 \ --hash=sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4 \ --hash=sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9 + # via + # bittensor + # subnet-2 wandb==0.21.0 \ --hash=sha256:01689faa6b691df23ba2367e0a1ecf6e4d0be44474905840098eedd1fbcb8bdf \ --hash=sha256:28a0b2dad09d7c7344ac62b0276be18a2492a5578e4d7c84937a3e1991edaac7 \ @@ -702,9 +1302,35 @@ wandb==0.21.0 \ --hash=sha256:893508f0c7da48917448daa5cd622c27ce7ce15119adaa861185034c2bd7b14c \ --hash=sha256:9d3cccfba658fa011d6cab9045fa4f070a444885e8902ae863802549106a5dab \ --hash=sha256:a4e8245a8912247ddf7654f7b5330f583a6c56ab88fee65589158490d583c57d + # via subnet-2 +watchdog==6.0.0 \ + --hash=sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a \ + --hash=sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2 \ + --hash=sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f \ + --hash=sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c \ + --hash=sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0 \ + --hash=sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13 \ + --hash=sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e \ + --hash=sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379 \ + --hash=sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282 \ + --hash=sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f \ + --hash=sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948 \ + --hash=sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860 \ + --hash=sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 \ + --hash=sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26 + # via nbdev +wcwidth==0.2.13 \ + --hash=sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 \ + --hash=sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5 + # via + # blessed + # prompt-toolkit websocket-client==1.8.0 \ --hash=sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526 \ --hash=sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da + # via + # subnet-2 + # substrate-interface websockets==15.0.1 \ --hash=sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2 \ --hash=sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5 \ @@ -719,9 +1345,14 @@ websockets==15.0.1 \ --hash=sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215 \ --hash=sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f \ --hash=sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7 + # via async-substrate-interface wheel==0.45.1 \ --hash=sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729 \ --hash=sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248 + # via + # astunparse + # async-substrate-interface + # bittensor xxhash==3.5.0 \ --hash=sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84 \ --hash=sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00 \ @@ -739,6 +1370,9 @@ xxhash==3.5.0 \ --hash=sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8 \ --hash=sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e \ --hash=sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e + # via + # async-substrate-interface + # substrate-interface yarl==1.20.1 \ --hash=sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2 \ --hash=sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef \ @@ -759,3 +1393,4 @@ yarl==1.20.1 \ --hash=sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8 \ --hash=sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac \ --hash=sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5 + # via aiohttp diff --git a/uv.lock b/uv.lock index 7bf9fc78..d00589f6 100644 --- a/uv.lock +++ b/uv.lock @@ -595,6 +595,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] +[[package]] +name = "dsperse" +version = "1.0.1" +source = { git = "https://github.com/inference-labs-inc/dsperse.git?rev=dsperse-integration#8a8204d366c87f9d39cdc2abc4bd5560bdfa75da" } +dependencies = [ + { name = "colorama" }, + { name = "ezkl" }, + { name = "matplotlib" }, + { name = "networkx" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "onnxruntime" }, + { name = "pytest" }, + { name = "torch", version = "2.7.1", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'darwin'" }, + { name = "torch", version = "2.7.1+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform != 'darwin'" }, + { name = "tqdm" }, +] + [[package]] name = "ecdsa" version = "0.19.1" @@ -681,16 +699,16 @@ wheels = [ [[package]] name = "ezkl" -version = "22.0.1" +version = "22.2.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/b7/3bdc6c08656a10cd860270014fe945d06bd195451d583ba55f62ce2d7509/ezkl-22.0.1-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3d84b010ae23f183f2543c78684fd9772774954ef070d14ccdcbc36ef34cd305", size = 22908384, upload-time = "2025-04-23T08:53:43.285Z" }, - { url = "https://files.pythonhosted.org/packages/1c/18/5b4c89971beb09d58d77a23066baeebca7dce7db68af4f8d22ebec191095/ezkl-22.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:69b52aa055ecc8a47707660e00ddbf72c8647cdaddb7e44c8c0b8247e257ca74", size = 12160037, upload-time = "2025-04-23T08:53:46.427Z" }, - { url = "https://files.pythonhosted.org/packages/bd/d1/42a7bb7c05381994fdc5362704e95470801854c9179a2acb7d43c499f580/ezkl-22.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b51baa1bfcb4dd2e209aa6d67e8fdce9dcd658b9868001a54c6c152fd9d439ec", size = 14342112, upload-time = "2025-04-23T08:53:48.945Z" }, - { url = "https://files.pythonhosted.org/packages/a2/5c/8f377d1166b67995ca4d6bc4370dab8fe9392c2639a9d89dd94cdf8f4a99/ezkl-22.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:38064ba748cdd03c71508766082b7774441c65879a4b4db27a326e55848c4793", size = 13659674, upload-time = "2025-04-23T08:53:51.171Z" }, - { url = "https://files.pythonhosted.org/packages/72/62/b0f518136a3a87a02f8c66b9b32413bf3cc199feeb7869afcb524a702a4d/ezkl-22.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2fcfb55370dbf3202b92c389fa4d2a2b3b57ddc2535c2cc479e43b00eaa41b1d", size = 14547975, upload-time = "2025-04-23T08:53:53.74Z" }, - { url = "https://files.pythonhosted.org/packages/50/2c/a6e8d3324359f2032628c0f377afc4e6ab907255db12d2754710ad91d056/ezkl-22.0.1-cp37-abi3-win32.whl", hash = "sha256:f4a0d074415d344bd4b1b86f27cbe3d3d7c2ee60e7eb1b196eda803557996676", size = 10697810, upload-time = "2025-04-23T08:53:56.468Z" }, - { url = "https://files.pythonhosted.org/packages/2e/22/0f098f99e6b2512c130227eb8045ce2636cb747e2aff4d784cb5b1123b5f/ezkl-22.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:deb1e540560ee8f98567da986f56daa82935abf92f8ba061cc8effa11687cbf4", size = 12119543, upload-time = "2025-04-23T08:53:59.128Z" }, + { url = "https://files.pythonhosted.org/packages/63/30/c83bb67dce260839a0cf4f9e5b4c97302b163c808ceda76e0fb9dbff6497/ezkl-22.2.1-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a939581175fdef2fab356927d9c4395c22e99c8b00fa80c08edb86ccd6fa9c0", size = 23537536, upload-time = "2025-07-30T19:24:00.284Z" }, + { url = "https://files.pythonhosted.org/packages/8c/92/3f69d7163333cd5da1680774fe0aff899045f8dad3a13a6989ec70efda52/ezkl-22.2.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c3b9fea855c11165b74f3f97bf01510ecc3249dc6e2eba02674c9f5967924df1", size = 12480722, upload-time = "2025-07-30T19:24:02.97Z" }, + { url = "https://files.pythonhosted.org/packages/59/e3/594ddc887dd108a320d815c44c746e559c41d7999caa2e6967736bb088e6/ezkl-22.2.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8eac3f42cd3aa3a6879925a07469f8fef7aba0279efdaabd6cb31b706b22e5b", size = 14843162, upload-time = "2025-07-30T19:24:05.027Z" }, + { url = "https://files.pythonhosted.org/packages/66/c1/190949dee335186230747002aa23906952fde733ad33bcf6924e8e5049cd/ezkl-22.2.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6c2353fede3155b9b588e61824e7505b33d0f9b8716cf2b99fe1aaa022840220", size = 14096986, upload-time = "2025-07-30T19:24:07.448Z" }, + { url = "https://files.pythonhosted.org/packages/1a/f5/24504205c6536a178ef768a0e33a715b8abbe44da02d18e17d01179ba6a0/ezkl-22.2.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5db874cbb59747118a90d050eb382dea6392775ccb85cdb8b954efe5bc2201e", size = 15072219, upload-time = "2025-07-30T19:24:09.773Z" }, + { url = "https://files.pythonhosted.org/packages/17/b7/29bdd6129e4b41e619948a000cef13ef16e50c82541a55328f079359de65/ezkl-22.2.1-cp37-abi3-win32.whl", hash = "sha256:7b0a7aac78858934821d3cb3ec620684d28f7b679f485dd03108932f51032ca5", size = 10848669, upload-time = "2025-07-30T19:24:11.971Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ad/6334f2cec5d510c3789449c22a0f855684aa2f05cc7b000a48fbc8f36770/ezkl-22.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b2f6d0fb2bc037355e6f3ec3a73714f10e6a68aaf43a0f15c15d13f308b2f69c", size = 12430767, upload-time = "2025-07-30T19:24:14.4Z" }, ] [[package]] @@ -840,6 +858,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, { url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload-time = "2025-08-07T13:18:22.981Z" }, + { url = "https://files.pythonhosted.org/packages/27/45/80935968b53cfd3f33cf99ea5f08227f2646e044568c9b1555b58ffd61c2/greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0", size = 1564846, upload-time = "2025-11-04T12:42:15.191Z" }, + { url = "https://files.pythonhosted.org/packages/69/02/b7c30e5e04752cb4db6202a3858b149c0710e5453b71a3b2aec5d78a1aab/greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d", size = 1633814, upload-time = "2025-11-04T12:42:17.175Z" }, { url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload-time = "2025-08-07T13:38:53.448Z" }, ] @@ -1177,22 +1197,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] -[[package]] -name = "ml-dtypes" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/78/a7/aad060393123cfb383956dca68402aff3db1e1caffd5764887ed5153f41b/ml_dtypes-0.5.3.tar.gz", hash = "sha256:95ce33057ba4d05df50b1f3cfefab22e351868a843b3b15a46c65836283670c9", size = 692316, upload-time = "2025-07-29T18:39:19.454Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/eb/bc07c88a6ab002b4635e44585d80fa0b350603f11a2097c9d1bfacc03357/ml_dtypes-0.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:156418abeeda48ea4797db6776db3c5bdab9ac7be197c1233771e0880c304057", size = 663864, upload-time = "2025-07-29T18:38:33.777Z" }, - { url = "https://files.pythonhosted.org/packages/cf/89/11af9b0f21b99e6386b6581ab40fb38d03225f9de5f55cf52097047e2826/ml_dtypes-0.5.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1db60c154989af253f6c4a34e8a540c2c9dce4d770784d426945e09908fbb177", size = 4951313, upload-time = "2025-07-29T18:38:36.45Z" }, - { url = "https://files.pythonhosted.org/packages/d8/a9/b98b86426c24900b0c754aad006dce2863df7ce0bb2bcc2c02f9cc7e8489/ml_dtypes-0.5.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b255acada256d1fa8c35ed07b5f6d18bc21d1556f842fbc2d5718aea2cd9e55", size = 4928805, upload-time = "2025-07-29T18:38:38.29Z" }, - { url = "https://files.pythonhosted.org/packages/50/c1/85e6be4fc09c6175f36fb05a45917837f30af9a5146a5151cb3a3f0f9e09/ml_dtypes-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:da65e5fd3eea434ccb8984c3624bc234ddcc0d9f4c81864af611aaebcc08a50e", size = 208182, upload-time = "2025-07-29T18:38:39.72Z" }, - { url = "https://files.pythonhosted.org/packages/9e/17/cf5326d6867be057f232d0610de1458f70a8ce7b6290e4b4a277ea62b4cd/ml_dtypes-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:8bb9cd1ce63096567f5f42851f5843b5a0ea11511e50039a7649619abfb4ba6d", size = 161560, upload-time = "2025-07-29T18:38:41.072Z" }, -] - [[package]] name = "more-itertools" version = "10.8.0" @@ -1331,157 +1335,53 @@ wheels = [ [[package]] name = "networkx" -version = "3.5" +version = "3.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" }, + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, ] [[package]] name = "numpy" -version = "2.0.2" +version = "2.2.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015, upload-time = "2024-08-26T20:19:40.945Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803, upload-time = "2024-08-26T20:11:13.916Z" }, - { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835, upload-time = "2024-08-26T20:11:34.779Z" }, - { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499, upload-time = "2024-08-26T20:11:43.902Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497, upload-time = "2024-08-26T20:11:55.09Z" }, - { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158, upload-time = "2024-08-26T20:12:14.95Z" }, - { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173, upload-time = "2024-08-26T20:12:44.049Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174, upload-time = "2024-08-26T20:13:13.634Z" }, - { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701, upload-time = "2024-08-26T20:13:34.851Z" }, - { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313, upload-time = "2024-08-26T20:13:45.653Z" }, - { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179, upload-time = "2024-08-26T20:14:08.786Z" }, -] - -[[package]] -name = "subnet-2" -source = { editable = "." } -dependencies = [ - { name = "aiohttp" }, - { name = "async-substrate-interface" }, - { name = "attrs" }, - { name = "bittensor" }, - { name = "boto3" }, - { name = "botocore" }, - { name = "ezkl" }, - { name = "fastapi" }, - { name = "gitpython" }, - { name = "httpx" }, - { name = "jsonrpcserver" }, - { name = "matplotlib" }, - { name = "numpy" }, - { name = "onnxruntime" }, - { name = "opencv-contrib-python-headless" }, - { name = "opencv-python" }, - { name = "packaging" }, - { name = "pillow" }, - { name = "prometheus-client" }, - { name = "proof-of-portfolio" }, - { name = "protobuf" }, - { name = "psutil" }, - { name = "pydantic" }, - { name = "pyopenssl" }, - { name = "requests" }, - { name = "rich" }, - { name = "substrate-interface" }, - { name = "torch", version = "2.7.1", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'darwin'" }, - { name = "torch", version = "2.7.1+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform != 'darwin'" }, - { name = "tqdm" }, - { name = "urllib3" }, - { name = "uvicorn" }, - { name = "wandb" }, - { name = "websocket-client" }, -] - -[package.dev-dependencies] -dev = [ - { name = "black" }, - { name = "bpython" }, - { name = "debugpy" }, - { name = "ipykernel" }, - { name = "nbdev" }, - { name = "onnx" }, - { name = "pytest" }, - { name = "snoop" }, - { name = "tach" }, -] - -[package.metadata] -requires-dist = [ - { name = "aiohttp", specifier = ">=3.10.11" }, - { name = "async-substrate-interface", specifier = ">=1.0.8" }, - { name = "attrs", specifier = "==24.3.0" }, - { name = "bittensor", specifier = "==9.9.0" }, - { name = "boto3", specifier = ">=1.36.13" }, - { name = "botocore", specifier = ">=1.37.19" }, - { name = "ezkl", specifier = "==22.0.1" }, - { name = "fastapi", specifier = "==0.110.3" }, - { name = "gitpython", specifier = ">=3.1.44" }, - { name = "httpx", specifier = ">=0.28.1" }, - { name = "jsonrpcserver", specifier = ">=5.0.9" }, - { name = "matplotlib", specifier = ">=3.10.1" }, - { name = "numpy", specifier = "==2.0.2" }, - { name = "onnxruntime", specifier = ">=1.21.0" }, - { name = "opencv-contrib-python-headless", specifier = ">=4.11.0.86" }, - { name = "opencv-python", specifier = ">=4.11.0.86" }, - { name = "packaging", specifier = "==24.2" }, - { name = "pillow", specifier = ">=11.3.0" }, - { name = "prometheus-client", specifier = "==0.21.1" }, - { name = "proof-of-portfolio", specifier = ">=0.0.127" }, - { name = "protobuf", specifier = ">=5.29.5" }, - { name = "psutil", specifier = "==6.1.1" }, - { name = "pydantic", specifier = "==2.10.6" }, - { name = "pyopenssl", specifier = ">=25.0.0" }, - { name = "requests", specifier = "==2.32.4" }, - { name = "rich", specifier = "==13.8.1" }, - { name = "substrate-interface", specifier = ">=1.7.11" }, - { name = "torch", specifier = "==2.7.1", index = "https://download.pytorch.org/whl/cpu" }, - { name = "tqdm", specifier = ">=4.67.1" }, - { name = "urllib3", specifier = ">=2.3.0" }, - { name = "uvicorn", specifier = "==0.34.0" }, - { name = "wandb", specifier = "==0.21.0" }, - { name = "websocket-client", specifier = ">=1.8.0" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "black", specifier = ">=24.10.0" }, - { name = "bpython", specifier = ">=0.25" }, - { name = "debugpy", specifier = ">=1.8.13" }, - { name = "ipykernel", specifier = ">=6.29.5" }, - { name = "nbdev", specifier = ">=2.3.34" }, - { name = "onnx", specifier = ">=1.17.0" }, - { name = "pytest", specifier = ">=8.4.1" }, - { name = "snoop", specifier = ">=0.6.0" }, - { name = "tach", specifier = ">=0.27.2" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, ] [[package]] name = "onnx" -version = "1.19.0" +version = "1.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ml-dtypes" }, { name = "numpy" }, { name = "protobuf" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/bf/b0a63ee9f3759dcd177b28c6f2cb22f2aecc6d9b3efecaabc298883caa5f/onnx-1.19.0.tar.gz", hash = "sha256:aa3f70b60f54a29015e41639298ace06adf1dd6b023b9b30f1bca91bb0db9473", size = 11949859, upload-time = "2025-08-27T02:34:27.107Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/60/e56e8ec44ed34006e6d4a73c92a04d9eea6163cc12440e35045aec069175/onnx-1.18.0.tar.gz", hash = "sha256:3d8dbf9e996629131ba3aa1afd1d8239b660d1f830c6688dd7e03157cccd6b9c", size = 12563009, upload-time = "2025-05-12T22:03:09.626Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/94/f56f6ca5e2f921b28c0f0476705eab56486b279f04e1d568ed64c14e7764/onnx-1.19.0-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:61d94e6498ca636756f8f4ee2135708434601b2892b7c09536befb19bc8ca007", size = 18322331, upload-time = "2025-08-27T02:33:20.373Z" }, - { url = "https://files.pythonhosted.org/packages/c8/00/8cc3f3c40b54b28f96923380f57c9176872e475face726f7d7a78bd74098/onnx-1.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:224473354462f005bae985c72028aaa5c85ab11de1b71d55b06fdadd64a667dd", size = 18027513, upload-time = "2025-08-27T02:33:23.44Z" }, - { url = "https://files.pythonhosted.org/packages/61/90/17c4d2566fd0117a5e412688c9525f8950d467f477fbd574e6b32bc9cb8d/onnx-1.19.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae475c85c89bc4d1f16571006fd21a3e7c0e258dd2c091f6e8aafb083d1ed9b", size = 18202278, upload-time = "2025-08-27T02:33:26.103Z" }, - { url = "https://files.pythonhosted.org/packages/bc/6e/a9383d9cf6db4ac761a129b081e9fa5d0cd89aad43cf1e3fc6285b915c7d/onnx-1.19.0-cp312-cp312-win32.whl", hash = "sha256:323f6a96383a9cdb3960396cffea0a922593d221f3929b17312781e9f9b7fb9f", size = 16333080, upload-time = "2025-08-27T02:33:28.559Z" }, - { url = "https://files.pythonhosted.org/packages/a7/2e/3ff480a8c1fa7939662bdc973e41914add2d4a1f2b8572a3c39c2e4982e5/onnx-1.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:50220f3499a499b1a15e19451a678a58e22ad21b34edf2c844c6ef1d9febddc2", size = 16453927, upload-time = "2025-08-27T02:33:31.177Z" }, - { url = "https://files.pythonhosted.org/packages/57/37/ad500945b1b5c154fe9d7b826b30816ebd629d10211ea82071b5bcc30aa4/onnx-1.19.0-cp312-cp312-win_arm64.whl", hash = "sha256:efb768299580b786e21abe504e1652ae6189f0beed02ab087cd841cb4bb37e43", size = 16426022, upload-time = "2025-08-27T02:33:33.515Z" }, + { url = "https://files.pythonhosted.org/packages/a7/fe/16228aca685392a7114625b89aae98b2dc4058a47f0f467a376745efe8d0/onnx-1.18.0-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:521bac578448667cbb37c50bf05b53c301243ede8233029555239930996a625b", size = 18285770, upload-time = "2025-05-12T22:02:26.116Z" }, + { url = "https://files.pythonhosted.org/packages/1e/77/ba50a903a9b5e6f9be0fa50f59eb2fca4a26ee653375408fbc72c3acbf9f/onnx-1.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4da451bf1c5ae381f32d430004a89f0405bc57a8471b0bddb6325a5b334aa40", size = 17421291, upload-time = "2025-05-12T22:02:29.645Z" }, + { url = "https://files.pythonhosted.org/packages/11/23/25ec2ba723ac62b99e8fed6d7b59094dadb15e38d4c007331cc9ae3dfa5f/onnx-1.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99afac90b4cdb1471432203c3c1f74e16549c526df27056d39f41a9a47cfb4af", size = 17584084, upload-time = "2025-05-12T22:02:32.789Z" }, + { url = "https://files.pythonhosted.org/packages/6a/4d/2c253a36070fb43f340ff1d2c450df6a9ef50b938adcd105693fee43c4ee/onnx-1.18.0-cp312-cp312-win32.whl", hash = "sha256:ee159b41a3ae58d9c7341cf432fc74b96aaf50bd7bb1160029f657b40dc69715", size = 15734892, upload-time = "2025-05-12T22:02:35.527Z" }, + { url = "https://files.pythonhosted.org/packages/e8/92/048ba8fafe6b2b9a268ec2fb80def7e66c0b32ab2cae74de886981f05a27/onnx-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:102c04edc76b16e9dfeda5a64c1fccd7d3d2913b1544750c01d38f1ac3c04e05", size = 15850336, upload-time = "2025-05-12T22:02:38.545Z" }, + { url = "https://files.pythonhosted.org/packages/a1/66/bbc4ffedd44165dcc407a51ea4c592802a5391ce3dc94aa5045350f64635/onnx-1.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:911b37d724a5d97396f3c2ef9ea25361c55cbc9aa18d75b12a52b620b67145af", size = 15823802, upload-time = "2025-05-12T22:02:42.037Z" }, ] [[package]] name = "onnxruntime" -version = "1.22.1" +version = "1.21.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coloredlogs" }, @@ -1492,10 +1392,10 @@ dependencies = [ { name = "sympy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/48/70/ca2a4d38a5deccd98caa145581becb20c53684f451e89eb3a39915620066/onnxruntime-1.22.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:a938d11c0dc811badf78e435daa3899d9af38abee950d87f3ab7430eb5b3cf5a", size = 34342883, upload-time = "2025-07-10T19:15:38.223Z" }, - { url = "https://files.pythonhosted.org/packages/29/e5/00b099b4d4f6223b610421080d0eed9327ef9986785c9141819bbba0d396/onnxruntime-1.22.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:984cea2a02fcc5dfea44ade9aca9fe0f7a8a2cd6f77c258fc4388238618f3928", size = 14473861, upload-time = "2025-07-10T19:15:42.911Z" }, - { url = "https://files.pythonhosted.org/packages/0a/50/519828a5292a6ccd8d5cd6d2f72c6b36ea528a2ef68eca69647732539ffa/onnxruntime-1.22.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d39a530aff1ec8d02e365f35e503193991417788641b184f5b1e8c9a6d5ce8d", size = 16475713, upload-time = "2025-07-10T19:15:45.452Z" }, - { url = "https://files.pythonhosted.org/packages/5d/54/7139d463bb0a312890c9a5db87d7815d4a8cce9e6f5f28d04f0b55fcb160/onnxruntime-1.22.1-cp312-cp312-win_amd64.whl", hash = "sha256:6a64291d57ea966a245f749eb970f4fa05a64d26672e05a83fdb5db6b7d62f87", size = 12690910, upload-time = "2025-07-10T19:15:47.478Z" }, + { url = "https://files.pythonhosted.org/packages/ff/21/593c9bc56002a6d1ea7c2236f4a648e081ec37c8d51db2383a9e83a63325/onnxruntime-1.21.0-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:893d67c68ca9e7a58202fa8d96061ed86a5815b0925b5a97aef27b8ba246a20b", size = 33658780, upload-time = "2025-03-08T02:43:49.378Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b4/33ec675a8ac150478091262824413e5d4acc359e029af87f9152e7c1c092/onnxruntime-1.21.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37b7445c920a96271a8dfa16855e258dc5599235b41c7bbde0d262d55bcc105f", size = 14159975, upload-time = "2025-03-08T02:44:09.196Z" }, + { url = "https://files.pythonhosted.org/packages/8b/08/eead6895ed83b56711ca6c0d31d82f109401b9937558b425509e497d6fb4/onnxruntime-1.21.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a04aafb802c1e5573ba4552f8babcb5021b041eb4cfa802c9b7644ca3510eca", size = 16019285, upload-time = "2025-03-08T02:44:11.706Z" }, + { url = "https://files.pythonhosted.org/packages/77/39/e83d56e3c215713b5263cb4d4f0c69e3964bba11634233d8ae04fc7e6bf3/onnxruntime-1.21.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f801318476cd7003d636a5b392f7a37c08b6c8d2f829773f3c3887029e03f32", size = 11760975, upload-time = "2025-03-08T02:43:52.332Z" }, ] [[package]] @@ -2264,6 +2164,111 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/18/31fa32ed6c68ba66220204ef0be798c349d0a20c1901f9d4a794e08c76d8/starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee", size = 71908, upload-time = "2024-03-05T16:16:50.957Z" }, ] +[[package]] +name = "subnet-2" +source = { editable = "." } +dependencies = [ + { name = "aiohttp" }, + { name = "async-substrate-interface" }, + { name = "attrs" }, + { name = "bittensor" }, + { name = "boto3" }, + { name = "botocore" }, + { name = "dsperse" }, + { name = "ezkl" }, + { name = "fastapi" }, + { name = "gitpython" }, + { name = "httpx" }, + { name = "jsonrpcserver" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "onnxruntime" }, + { name = "opencv-contrib-python-headless" }, + { name = "opencv-python" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "prometheus-client" }, + { name = "proof-of-portfolio" }, + { name = "protobuf" }, + { name = "psutil" }, + { name = "pydantic" }, + { name = "pyopenssl" }, + { name = "requests" }, + { name = "rich" }, + { name = "substrate-interface" }, + { name = "torch", version = "2.7.1", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'darwin'" }, + { name = "torch", version = "2.7.1+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform != 'darwin'" }, + { name = "tqdm" }, + { name = "urllib3" }, + { name = "uvicorn" }, + { name = "wandb" }, + { name = "websocket-client" }, +] + +[package.dev-dependencies] +dev = [ + { name = "black" }, + { name = "bpython" }, + { name = "debugpy" }, + { name = "ipykernel" }, + { name = "nbdev" }, + { name = "onnx" }, + { name = "pytest" }, + { name = "snoop" }, + { name = "tach" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiohttp", specifier = ">=3.10.11" }, + { name = "async-substrate-interface", specifier = ">=1.0.8" }, + { name = "attrs", specifier = "==24.3.0" }, + { name = "bittensor", specifier = "==9.9.0" }, + { name = "boto3", specifier = ">=1.36.13" }, + { name = "botocore", specifier = ">=1.37.19" }, + { name = "dsperse", git = "https://github.com/inference-labs-inc/dsperse.git?rev=dsperse-integration" }, + { name = "ezkl", specifier = "==22.2.1" }, + { name = "fastapi", specifier = "==0.110.3" }, + { name = "gitpython", specifier = ">=3.1.44" }, + { name = "httpx", specifier = ">=0.28.1" }, + { name = "jsonrpcserver", specifier = ">=5.0.9" }, + { name = "matplotlib", specifier = ">=3.10.1" }, + { name = "numpy", specifier = "~=2.2.3" }, + { name = "onnxruntime", specifier = ">=1.21.0" }, + { name = "opencv-contrib-python-headless", specifier = ">=4.11.0.86" }, + { name = "opencv-python", specifier = ">=4.11.0.86" }, + { name = "packaging", specifier = "==24.2" }, + { name = "pillow", specifier = ">=11.3.0" }, + { name = "prometheus-client", specifier = "==0.21.1" }, + { name = "proof-of-portfolio", specifier = ">=0.0.127" }, + { name = "protobuf", specifier = ">=5.29.5" }, + { name = "psutil", specifier = "==6.1.1" }, + { name = "pydantic", specifier = "==2.10.6" }, + { name = "pyopenssl", specifier = ">=25.0.0" }, + { name = "requests", specifier = "==2.32.4" }, + { name = "rich", specifier = "==13.8.1" }, + { name = "substrate-interface", specifier = ">=1.7.11" }, + { name = "torch", specifier = "==2.7.1", index = "https://download.pytorch.org/whl/cpu" }, + { name = "tqdm", specifier = ">=4.67.1" }, + { name = "urllib3", specifier = ">=2.3.0" }, + { name = "uvicorn", specifier = "==0.34.0" }, + { name = "wandb", specifier = "==0.21.0" }, + { name = "websocket-client", specifier = ">=1.8.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "black", specifier = ">=24.10.0" }, + { name = "bpython", specifier = ">=0.25" }, + { name = "debugpy", specifier = ">=1.8.13" }, + { name = "ipykernel", specifier = ">=6.29.5" }, + { name = "nbdev", specifier = ">=2.3.34" }, + { name = "onnx", specifier = ">=1.17.0" }, + { name = "pytest", specifier = ">=8.4.1" }, + { name = "snoop", specifier = ">=0.6.0" }, + { name = "tach", specifier = ">=0.27.2" }, +] + [[package]] name = "substrate-interface" version = "1.7.11" @@ -2471,11 +2476,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", size = 432930, upload-time = "2025-12-11T15:56:40.252Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd", size = 131182, upload-time = "2025-12-11T15:56:38.584Z" }, ] [[package]]