diff --git a/notebook/integration_demo/demo.ipynb b/notebook/integration_demo/demo.ipynb index cb4c6b65a..ea9c396f4 100644 --- a/notebook/integration_demo/demo.ipynb +++ b/notebook/integration_demo/demo.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 21, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -14,16 +14,6 @@ ] } ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [], "source": [ "import os\n", "import pyro\n", @@ -53,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -71,9 +61,130 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:root:\n", + " ###############################\n", + "\n", + " There was an exception in pyciemss\n", + " \n", + " Error occured in function: load_and_sample_petri_model\n", + "\n", + " Function docs : \n", + " Load a petri net from a file, compile it into a probabilistic program, and sample from it.\n", + "\n", + " Args:\n", + " petri_model_or_path: Union[str, mira.metamodel.TemplateModel, mira.modeling.Model]\n", + " - A path to a petri net file, or a petri net object.\n", + " - This path can be a URL or a local path to a mira model or AMR model.\n", + " - Alternatively, this can be a mira template model directly.\n", + " num_samples: int\n", + " - The number of samples to draw from the model.\n", + " timepoints: [Iterable[float]]\n", + " - The timepoints to simulate the model from. Backcasting and/or forecasting is reflected in the choice of timepoints.\n", + " interventions: Optional[Iterable[Tuple[float, str, float]]]\n", + " - A list of interventions to apply to the model. Each intervention is a tuple of the form (time, parameter_name, value).\n", + " start_state: Optional[dict[str, float]]\n", + " - The initial state of the model. If None, the initial state is taken from the mira model.\n", + " start_time: float\n", + " - The start time of the model. This is used to align the `start_state` with the `timepoints`.\n", + " - By default we set the `start_time` to be a small negative number to avoid numerical issues w/ collision with the `timepoints` which typically start at 0.\n", + " method: str\n", + " - The method to use for solving the ODE. See torchdiffeq's `odeint` method for more details.\n", + " - If performance is incredibly slow, we suggest using `euler` to debug. If using `euler` results in faster simulation, the issue is likely that the model is stiff.\n", + " compile_rate_law_p: bool\n", + " - Whether or not to compile the rate law from the AMR rate expression. default True. False is useful for debugging.\n", + " compile_observables_p: bool\n", + " - Whether or not to compile the observables from the AMR observable expression. default True. False is useful for debugging.\n", + " time_unit: str\n", + " - Time unit (used for labeling outputs)\n", + " visual_options: None, bool, dict[str, any]\n", + " - True output a visual\n", + " - False do not output a visual\n", + " - dict output a visual with the dictionary passed to the visualization as kwargs\n", + " alpha_qs: Optional[Iterable[float]]\n", + " - The quantiles required for estimating weighted interval score to test forecasting accuracy.\n", + " stacking_order: Optional[str]\n", + " - The stacking order requested for the quantiles to keep the selected quantity together for each state.\n", + " - Options: \"timepoints\" or \"quantiles\"\n", + "\n", + " Returns:\n", + " result: dict\n", + " - Dictionary of outputs with following attribute:\n", + " * data: The samples from the model as a pandas DataFrame.\n", + " * quantiles: The quantiles for ensemble score calculation as a pandas DataFrames.\n", + " * risk: Risk estimates for each state as 2-day average at the final timepoint\n", + " * risk: Estimated alpha-superquantile risk with alpha=0.95\n", + " * qoi: Samples of quantity of interest (in this case, 2-day average of the state at the final timepoint)\n", + " * visual: Visualization. (If visual_options is truthy)\n", + " \n", + "\n", + " ################################\n", + " \n", + "Traceback (most recent call last):\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/custom_decorators.py\", line 9, in wrapped\n", + " result = function(*args, **kwargs)\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/interfaces.py\", line 127, in load_and_sample_petri_model\n", + " model = load_petri_model(\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/interfaces.py\", line 793, in load_petri_model\n", + " return ScaledNormalNoisePetriNetODESystem.from_askenet(\n", + " File \"/Users/oost464/opt/anaconda3/envs/CIEMSS_ENV/lib/python3.10/functools.py\", line 926, in _method\n", + " return method.__get__(obj, cls)(*args, **kwargs)\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py\", line 467, in _from_path\n", + " return cls.from_askenet(model_json, **kwargs)\n", + " File \"/Users/oost464/opt/anaconda3/envs/CIEMSS_ENV/lib/python3.10/functools.py\", line 926, in _method\n", + " return method.__get__(obj, cls)(*args, **kwargs)\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py\", line 449, in _from_json\n", + " return cls.from_askenet(petrinet.template_model_from_askenet_json(model_json), **kwargs)\n", + " File \"/Users/oost464/opt/anaconda3/envs/CIEMSS_ENV/lib/python3.10/functools.py\", line 926, in _method\n", + " return method.__get__(obj, cls)(*args, **kwargs)\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py\", line 425, in _from_template_model\n", + " model = cls.from_askenet(mira.modeling.Model(model_template), **kwargs)\n", + " File \"/Users/oost464/opt/anaconda3/envs/CIEMSS_ENV/lib/python3.10/functools.py\", line 926, in _method\n", + " return method.__get__(obj, cls)(*args, **kwargs)\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py\", line 418, in from_askenet\n", + " return cls(model, **kwargs)\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py\", line 555, in __init__\n", + " super().__init__(G, compile_rate_law_p=compile_rate_law_p, compile_observables_p=compile_observables_p, **kwargs)\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py\", line 308, in __init__\n", + " self.G.parameters = {\n", + " File \"/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py\", line 310, in \n", + " if value and value.placeholder == False\n", + "AttributeError: 'ModelParameter' object has no attribute 'placeholder'\n" + ] + }, + { + "ename": "AttributeError", + "evalue": "'ModelParameter' object has no attribute 'placeholder'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/Users/oost464/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/notebook/integration_demo/demo.ipynb Cell 4\u001b[0m line \u001b[0;36m5\n\u001b[1;32m 2\u001b[0m timepoints \u001b[39m=\u001b[39m [\u001b[39m0.5\u001b[39m, \u001b[39m1.0\u001b[39m, \u001b[39m2.0\u001b[39m, \u001b[39m3.0\u001b[39m, \u001b[39m4.0\u001b[39m]\n\u001b[1;32m 4\u001b[0m \u001b[39m# Run sampling w/o an intervention\u001b[39;00m\n\u001b[0;32m----> 5\u001b[0m result \u001b[39m=\u001b[39m load_and_sample_petri_model(ASKENET_PATH, num_samples, timepoints\u001b[39m=\u001b[39;49mtimepoints, time_unit\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mdays\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[1;32m 7\u001b[0m \u001b[39m# Save results\u001b[39;00m\n\u001b[1;32m 8\u001b[0m result[\u001b[39m\"\u001b[39m\u001b[39mdata\u001b[39m\u001b[39m\"\u001b[39m]\u001b[39m.\u001b[39mto_csv(os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39mjoin(DEMO_PATH, \u001b[39m\"\u001b[39m\u001b[39mresults_petri/sample_results.csv\u001b[39m\u001b[39m\"\u001b[39m), index\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m)\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/custom_decorators.py:30\u001b[0m, in \u001b[0;36mpyciemss_logging_wrapper..wrapped\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 18\u001b[0m log_message \u001b[39m=\u001b[39m \u001b[39m\"\"\"\u001b[39m\n\u001b[1;32m 19\u001b[0m \u001b[39m ###############################\u001b[39m\n\u001b[1;32m 20\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[39m ################################\u001b[39m\n\u001b[1;32m 28\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"\u001b[39m\n\u001b[1;32m 29\u001b[0m logging\u001b[39m.\u001b[39mexception(log_message, function\u001b[39m.\u001b[39m\u001b[39m__name__\u001b[39m, function\u001b[39m.\u001b[39m\u001b[39m__doc__\u001b[39m)\n\u001b[0;32m---> 30\u001b[0m \u001b[39mraise\u001b[39;00m e\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/custom_decorators.py:9\u001b[0m, in \u001b[0;36mpyciemss_logging_wrapper..wrapped\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m 8\u001b[0m start_time \u001b[39m=\u001b[39m time\u001b[39m.\u001b[39mperf_counter()\n\u001b[0;32m----> 9\u001b[0m result \u001b[39m=\u001b[39m function(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 10\u001b[0m end_time \u001b[39m=\u001b[39m time\u001b[39m.\u001b[39mperf_counter()\n\u001b[1;32m 11\u001b[0m logging\u001b[39m.\u001b[39minfo(\n\u001b[1;32m 12\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mElapsed time for \u001b[39m\u001b[39m%s\u001b[39;00m\u001b[39m: \u001b[39m\u001b[39m%f\u001b[39;00m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 13\u001b[0m function\u001b[39m.\u001b[39m\u001b[39m__name__\u001b[39m, end_time \u001b[39m-\u001b[39m start_time\n\u001b[1;32m 14\u001b[0m )\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/interfaces.py:127\u001b[0m, in \u001b[0;36mload_and_sample_petri_model\u001b[0;34m(petri_model_or_path, num_samples, timepoints, interventions, start_state, start_time, method, compile_rate_law_p, compile_observables_p, time_unit, visual_options, alpha_qs, stacking_order)\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 78\u001b[0m \u001b[39mLoad a petri net from a file, compile it into a probabilistic program, and sample from it.\u001b[39;00m\n\u001b[1;32m 79\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[39m * visual: Visualization. (If visual_options is truthy)\u001b[39;00m\n\u001b[1;32m 124\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 126\u001b[0m \u001b[39m# Load the model\u001b[39;00m\n\u001b[0;32m--> 127\u001b[0m model \u001b[39m=\u001b[39m load_petri_model(\n\u001b[1;32m 128\u001b[0m petri_model_or_path\u001b[39m=\u001b[39;49mpetri_model_or_path,\n\u001b[1;32m 129\u001b[0m add_uncertainty\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m,\n\u001b[1;32m 130\u001b[0m compile_rate_law_p\u001b[39m=\u001b[39;49mcompile_rate_law_p,\n\u001b[1;32m 131\u001b[0m compile_observables_p\u001b[39m=\u001b[39;49mcompile_observables_p,\n\u001b[1;32m 132\u001b[0m )\n\u001b[1;32m 134\u001b[0m \u001b[39m# If the user doesn't override the start state, use the initial values from the model.\u001b[39;00m\n\u001b[1;32m 135\u001b[0m \u001b[39mif\u001b[39;00m start_state \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/interfaces.py:793\u001b[0m, in \u001b[0;36mload_petri_model\u001b[0;34m(petri_model_or_path, add_uncertainty, noise_model, noise_scale, compile_observables_p, compile_rate_law_p)\u001b[0m\n\u001b[1;32m 789\u001b[0m \u001b[39mreturn\u001b[39;00m ScaledBetaNoisePetriNetODESystem\u001b[39m.\u001b[39mfrom_askenet(\n\u001b[1;32m 790\u001b[0m petri_model_or_path, noise_scale\u001b[39m=\u001b[39mnoise_scale, compile_rate_law_p\u001b[39m=\u001b[39mcompile_rate_law_p, compile_observables_p\u001b[39m=\u001b[39mcompile_observables_p, add_uncertainty\u001b[39m=\u001b[39madd_uncertainty\n\u001b[1;32m 791\u001b[0m )\n\u001b[1;32m 792\u001b[0m \u001b[39melif\u001b[39;00m noise_model \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mscaled_normal\u001b[39m\u001b[39m\"\u001b[39m:\n\u001b[0;32m--> 793\u001b[0m \u001b[39mreturn\u001b[39;00m ScaledNormalNoisePetriNetODESystem\u001b[39m.\u001b[39;49mfrom_askenet(\n\u001b[1;32m 794\u001b[0m petri_model_or_path, noise_scale\u001b[39m=\u001b[39;49mnoise_scale, compile_rate_law_p\u001b[39m=\u001b[39;49mcompile_rate_law_p, compile_observables_p\u001b[39m=\u001b[39;49mcompile_observables_p, add_uncertainty\u001b[39m=\u001b[39;49madd_uncertainty\n\u001b[1;32m 795\u001b[0m )\n\u001b[1;32m 796\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 797\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mUnknown noise model \u001b[39m\u001b[39m{\u001b[39;00mnoise_model\u001b[39m}\u001b[39;00m\u001b[39m. Please select from either \u001b[39m\u001b[39m'\u001b[39m\u001b[39mscaled_beta\u001b[39m\u001b[39m'\u001b[39m\u001b[39m or \u001b[39m\u001b[39m'\u001b[39m\u001b[39mscaled_normal\u001b[39m\u001b[39m'\u001b[39m\u001b[39m.\u001b[39m\u001b[39m\"\u001b[39m)\n", + "File \u001b[0;32m~/opt/anaconda3/envs/CIEMSS_ENV/lib/python3.10/functools.py:926\u001b[0m, in \u001b[0;36msingledispatchmethod.__get__.._method\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 924\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_method\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 925\u001b[0m method \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdispatcher\u001b[39m.\u001b[39mdispatch(args[\u001b[39m0\u001b[39m]\u001b[39m.\u001b[39m\u001b[39m__class__\u001b[39m)\n\u001b[0;32m--> 926\u001b[0m \u001b[39mreturn\u001b[39;00m method\u001b[39m.\u001b[39;49m\u001b[39m__get__\u001b[39;49m(obj, \u001b[39mcls\u001b[39;49m)(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py:467\u001b[0m, in \u001b[0;36mMiraPetriNetODESystem._from_path\u001b[0;34m(cls, model_json_path, **kwargs)\u001b[0m\n\u001b[1;32m 465\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mopen\u001b[39m(model_json_path) \u001b[39mas\u001b[39;00m fh:\n\u001b[1;32m 466\u001b[0m model_json \u001b[39m=\u001b[39m json\u001b[39m.\u001b[39mload(fh)\n\u001b[0;32m--> 467\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mcls\u001b[39;49m\u001b[39m.\u001b[39;49mfrom_askenet(model_json, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m~/opt/anaconda3/envs/CIEMSS_ENV/lib/python3.10/functools.py:926\u001b[0m, in \u001b[0;36msingledispatchmethod.__get__.._method\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 924\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_method\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 925\u001b[0m method \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdispatcher\u001b[39m.\u001b[39mdispatch(args[\u001b[39m0\u001b[39m]\u001b[39m.\u001b[39m\u001b[39m__class__\u001b[39m)\n\u001b[0;32m--> 926\u001b[0m \u001b[39mreturn\u001b[39;00m method\u001b[39m.\u001b[39;49m\u001b[39m__get__\u001b[39;49m(obj, \u001b[39mcls\u001b[39;49m)(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py:449\u001b[0m, in \u001b[0;36mMiraPetriNetODESystem._from_json\u001b[0;34m(cls, model_json, **kwargs)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mcls\u001b[39m\u001b[39m.\u001b[39mfrom_askenet(mira\u001b[39m.\u001b[39mmetamodel\u001b[39m.\u001b[39mTemplateModel\u001b[39m.\u001b[39mfrom_json(model_json), \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[1;32m 448\u001b[0m \u001b[39melif\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39mpetrinet\u001b[39m\u001b[39m\"\u001b[39m \u001b[39min\u001b[39;00m model_json[\u001b[39m\"\u001b[39m\u001b[39mheader\u001b[39m\u001b[39m\"\u001b[39m][\u001b[39m\"\u001b[39m\u001b[39mschema\u001b[39m\u001b[39m\"\u001b[39m]:\n\u001b[0;32m--> 449\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mcls\u001b[39;49m\u001b[39m.\u001b[39;49mfrom_askenet(petrinet\u001b[39m.\u001b[39;49mtemplate_model_from_askenet_json(model_json), \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 450\u001b[0m \u001b[39melif\u001b[39;00m \u001b[39m\"\u001b[39m\u001b[39mregnet\u001b[39m\u001b[39m\"\u001b[39m \u001b[39min\u001b[39;00m model_json[\u001b[39m\"\u001b[39m\u001b[39mheader\u001b[39m\u001b[39m\"\u001b[39m][\u001b[39m\"\u001b[39m\u001b[39mschema\u001b[39m\u001b[39m\"\u001b[39m]:\n\u001b[1;32m 451\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mcls\u001b[39m\u001b[39m.\u001b[39mfrom_askenet(regnet\u001b[39m.\u001b[39mtemplate_model_from_askenet_json(model_json), \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n", + "File \u001b[0;32m~/opt/anaconda3/envs/CIEMSS_ENV/lib/python3.10/functools.py:926\u001b[0m, in \u001b[0;36msingledispatchmethod.__get__.._method\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 924\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_method\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 925\u001b[0m method \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdispatcher\u001b[39m.\u001b[39mdispatch(args[\u001b[39m0\u001b[39m]\u001b[39m.\u001b[39m\u001b[39m__class__\u001b[39m)\n\u001b[0;32m--> 926\u001b[0m \u001b[39mreturn\u001b[39;00m method\u001b[39m.\u001b[39;49m\u001b[39m__get__\u001b[39;49m(obj, \u001b[39mcls\u001b[39;49m)(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py:425\u001b[0m, in \u001b[0;36mMiraPetriNetODESystem._from_template_model\u001b[0;34m(cls, model_template, **kwargs)\u001b[0m\n\u001b[1;32m 421\u001b[0m \u001b[39m@from_askenet\u001b[39m\u001b[39m.\u001b[39mregister(mira\u001b[39m.\u001b[39mmetamodel\u001b[39m.\u001b[39mTemplateModel)\n\u001b[1;32m 422\u001b[0m \u001b[39m@classmethod\u001b[39m\n\u001b[1;32m 423\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_from_template_model\u001b[39m(\u001b[39mcls\u001b[39m, model_template: mira\u001b[39m.\u001b[39mmetamodel\u001b[39m.\u001b[39mTemplateModel, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 424\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Return a model from a MIRA model template.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 425\u001b[0m model \u001b[39m=\u001b[39m \u001b[39mcls\u001b[39;49m\u001b[39m.\u001b[39;49mfrom_askenet(mira\u001b[39m.\u001b[39;49mmodeling\u001b[39m.\u001b[39;49mModel(model_template), \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 427\u001b[0m \u001b[39m# Check if all parameter names are strings\u001b[39;00m\n\u001b[1;32m 428\u001b[0m \u001b[39m# if all(isinstance(param.key, str) for param in model.G.parameters.values()):\u001b[39;00m\n\u001b[1;32m 429\u001b[0m \u001b[39m# return model\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 433\u001b[0m \n\u001b[1;32m 434\u001b[0m \u001b[39m# Check if we wish to aggregate parameters (default is no)\u001b[39;00m\n\u001b[1;32m 435\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39m'\u001b[39m\u001b[39maggregate_parameters_p\u001b[39m\u001b[39m'\u001b[39m \u001b[39min\u001b[39;00m kwargs \u001b[39mand\u001b[39;00m kwargs[\u001b[39m'\u001b[39m\u001b[39maggregate_parameters_p\u001b[39m\u001b[39m'\u001b[39m]:\n", + "File \u001b[0;32m~/opt/anaconda3/envs/CIEMSS_ENV/lib/python3.10/functools.py:926\u001b[0m, in \u001b[0;36msingledispatchmethod.__get__.._method\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 924\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_method\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 925\u001b[0m method \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdispatcher\u001b[39m.\u001b[39mdispatch(args[\u001b[39m0\u001b[39m]\u001b[39m.\u001b[39m\u001b[39m__class__\u001b[39m)\n\u001b[0;32m--> 926\u001b[0m \u001b[39mreturn\u001b[39;00m method\u001b[39m.\u001b[39;49m\u001b[39m__get__\u001b[39;49m(obj, \u001b[39mcls\u001b[39;49m)(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py:418\u001b[0m, in \u001b[0;36mMiraPetriNetODESystem.from_askenet\u001b[0;34m(cls, model, **kwargs)\u001b[0m\n\u001b[1;32m 414\u001b[0m \u001b[39m@functools\u001b[39m\u001b[39m.\u001b[39msingledispatchmethod\n\u001b[1;32m 415\u001b[0m \u001b[39m@classmethod\u001b[39m\n\u001b[1;32m 416\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mfrom_askenet\u001b[39m(\u001b[39mcls\u001b[39m, model: mira\u001b[39m.\u001b[39mmodeling\u001b[39m.\u001b[39mModel, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mMiraPetriNetODESystem\u001b[39m\u001b[39m\"\u001b[39m:\n\u001b[1;32m 417\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Return a model from a MIRA model.\"\"\"\u001b[39;00m\n\u001b[0;32m--> 418\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mcls\u001b[39;49m(model, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py:555\u001b[0m, in \u001b[0;36mScaledNormalNoisePetriNetODESystem.__init__\u001b[0;34m(self, G, noise_scale, compile_rate_law_p, compile_observables_p, **kwargs)\u001b[0m\n\u001b[1;32m 554\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__init__\u001b[39m(\u001b[39mself\u001b[39m, G: mira\u001b[39m.\u001b[39mmodeling\u001b[39m.\u001b[39mModel, noise_scale: \u001b[39mfloat\u001b[39m \u001b[39m=\u001b[39m \u001b[39m0.1\u001b[39m, compile_rate_law_p: \u001b[39mbool\u001b[39m \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m, compile_observables_p: \u001b[39mbool\u001b[39m \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 555\u001b[0m \u001b[39msuper\u001b[39;49m()\u001b[39m.\u001b[39;49m\u001b[39m__init__\u001b[39;49m(G, compile_rate_law_p\u001b[39m=\u001b[39;49mcompile_rate_law_p, compile_observables_p\u001b[39m=\u001b[39;49mcompile_observables_p, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 556\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mregister_buffer(\u001b[39m\"\u001b[39m\u001b[39mnoise_scale\u001b[39m\u001b[39m\"\u001b[39m, torch\u001b[39m.\u001b[39mas_tensor(noise_scale))\n\u001b[1;32m 557\u001b[0m \u001b[39massert\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mnoise_scale \u001b[39m>\u001b[39m \u001b[39m0\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39mNoise scale must be positive\u001b[39m\u001b[39m\"\u001b[39m\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py:308\u001b[0m, in \u001b[0;36mMiraPetriNetODESystem.__init__\u001b[0;34m(self, G, compile_rate_law_p, compile_observables_p, add_uncertainty)\u001b[0m\n\u001b[1;32m 306\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39madd_uncertainty \u001b[39m=\u001b[39m add_uncertainty\n\u001b[1;32m 307\u001b[0m \u001b[39mif\u001b[39;00m compile_rate_law_p:\n\u001b[0;32m--> 308\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mG\u001b[39m.\u001b[39mparameters \u001b[39m=\u001b[39m {\n\u001b[1;32m 309\u001b[0m param: value \u001b[39mfor\u001b[39;00m param, value \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mG\u001b[39m.\u001b[39mparameters\u001b[39m.\u001b[39mitems()\n\u001b[1;32m 310\u001b[0m \u001b[39mif\u001b[39;00m value \u001b[39mand\u001b[39;00m value\u001b[39m.\u001b[39mplaceholder \u001b[39m==\u001b[39m \u001b[39mFalse\u001b[39;00m\n\u001b[1;32m 311\u001b[0m }\n\u001b[1;32m 312\u001b[0m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39m\u001b[39m__init__\u001b[39m()\n\u001b[1;32m 313\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcompile_rate_law_p \u001b[39m=\u001b[39m compile_rate_law_p\n", + "File \u001b[0;32m~/Library/CloudStorage/OneDrive-PNNL/Desktop/projects/pyciemss/src/pyciemss/PetriNetODE/base.py:310\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 306\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39madd_uncertainty \u001b[39m=\u001b[39m add_uncertainty\n\u001b[1;32m 307\u001b[0m \u001b[39mif\u001b[39;00m compile_rate_law_p:\n\u001b[1;32m 308\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mG\u001b[39m.\u001b[39mparameters \u001b[39m=\u001b[39m {\n\u001b[1;32m 309\u001b[0m param: value \u001b[39mfor\u001b[39;00m param, value \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mG\u001b[39m.\u001b[39mparameters\u001b[39m.\u001b[39mitems()\n\u001b[0;32m--> 310\u001b[0m \u001b[39mif\u001b[39;00m value \u001b[39mand\u001b[39;00m value\u001b[39m.\u001b[39;49mplaceholder \u001b[39m==\u001b[39m \u001b[39mFalse\u001b[39;00m\n\u001b[1;32m 311\u001b[0m }\n\u001b[1;32m 312\u001b[0m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39m\u001b[39m__init__\u001b[39m()\n\u001b[1;32m 313\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcompile_rate_law_p \u001b[39m=\u001b[39m compile_rate_law_p\n", + "\u001b[0;31mAttributeError\u001b[0m: 'ModelParameter' object has no attribute 'placeholder'" + ] + } + ], "source": [ "num_samples = 3\n", "timepoints = [0.5, 1.0, 2.0, 3.0, 4.0]\n", @@ -99,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -350,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -552,7 +663,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -598,8 +709,10 @@ }, { "cell_type": "code", - "execution_count": 32, - "metadata": {}, + "execution_count": null, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "interventions = [(1.1, \"beta\", 1.0), (2.1, \"gamma\", 0.1), (1.3, \"beta\", 2.0), (1.4, \"gamma\", 0.3)]\n", @@ -642,8 +755,27 @@ ")\n", "result_int[\"quantiles\"].to_csv(\n", " os.path.join(DEMO_PATH, \"results_petri/quantiles_results_w_interventions.csv\"), index=False\n", - ")\n", - "\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ "plots.ipy_display(result_int[\"visual\"])" ] }, @@ -657,7 +789,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -697,7 +829,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -818,7 +950,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1020,7 +1152,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1041,7 +1173,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1088,7 +1220,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1269,7 +1401,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.10.11" } }, "nbformat": 4, diff --git a/notebook/visual examples/Graphs.ipynb b/notebook/visual examples/Graphs.ipynb index 8430f37f7..3345eabac 100644 --- a/notebook/visual examples/Graphs.ipynb +++ b/notebook/visual examples/Graphs.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 6, + "execution_count": 25, "id": "a1299176", "metadata": {}, "outputs": [ @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 26, "id": "5c1729f7-1b0d-4913-8048-01624c506cc5", "metadata": {}, "outputs": [], @@ -33,7 +33,15 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, + "id": "07d29614", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 27, "id": "997ef041-0312-4b83-bbe2-32a6ddfe3d6c", "metadata": {}, "outputs": [], @@ -43,18 +51,18 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 28, "id": "a4b1668c", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEsCAYAAAAvq2MDAABFfElEQVR4Ae2dCXxT153v/0e2sY0DyGyBhIKcPTQQkxVoUuxmaZtAY5O2SWYmjZnMm9fXedOY99rGSaaDSNqGzPRNnOnr9toU0+m0k7YBE0gaAq3tBALOhhyykQ2ZHcIiAcY2Xs77/68sW1ebJVuSr6Tf/dyre89+zvdKPx397zlHirCBAAiAAAhkDQGIftbcajQUBEAgDAEH+63kw8NHJR+Bexk73H0Hn+g+fnmCj3B7bZ9nNZ8Dr9kZ817KMaU+9Xyu4uMePsr5SOgO0U8oTmQGAhlAILuaICL9eF+TRfRFcMUpgt/AFyK6jXx28rGMj0iaKSLNwVRHRBKfeJM8+BTzrjnmcj6kLEkrh1yzV+L2SA1IXAnICQRAAASsS2AXV62FD+llu/hcwYfs2/nF7ye9exF86YWLoMsXgXwhSLrLOd5aPiSMTyRfIhKHeAvMQ8Rcfk1IulUcJl8Okr984SxldxUf8ktCfllIXHZSYE9f6iXh4i/5++P4f1Uc5wD5kpD0S/hadqmz+Mm1+Es5Hoi+4MABAiCQjQREEEWEpYcv1yKqJQxCBFJEWUTXL9DS417AYSK2ci29ci+7RXRFhMWPnST5iNsfl3gT8Q1M57+WuFK+fInIl4aYmZo4vuQlYZJONFoEfw37y5eL1E2+IKR+/i8Yf1l2jiNtENGXLzD50pG2sTdJnnLUS4aEDQTiI4DYIJARBEQ4RVBFLKXXLSIZTpBFxEUw/SIsjRfRl18AIrziljhyFrGWaxFxOcRP3HKWMEkXqYzAsMDyJL2/jpKPfNGIuIt+B4f58xAzlbRHviQkjrjlS4MkkWSCAwRAAASyiYCIqJhEgtssIim9fRFofy9cRDNQhCWNX1zFX9wSR86STq5nsEPy4ROJW8qTL5bAdBI3sIzAMMnX/yUj6Yk3ic8nihYWmIfEl18Fcpb6GF9SEH3CBgIgkIUERAzFnCKmEBF6QSDiKEIrJhG//V3s4PKLQHr0EiamGBHhQHGVtOInZ8lDrsXkImnEXCPCLr1sKVPKki+bORxZ7PkSJzBPMSeJqEtcKU80WtxyLX7yHEFMPa2c3l8WX5JcE2/+eol5R34NSP3lWnr9Yo4qkww5XsJ3ZAgCIAACViYgIljMFfSbYPiSpDcughwo0OOISMwxIpwituwkSSfxxF8EWfxE6OVcxi9yLXnxJcmDXhFqMSOJ4IvIi9hLmHwhyJeDX/SlDIkv+Uq4CL1otOQlJh15xiD+kk7yky8mKUv8pFw5+0Vf4otJR/IXf/mSkDQuyVA8cIAACIAACIw8ARF4EfNINRksPFK6fn+Ifj8KXIAACCSVADK3BAGIviVuAyoBAiAAAqkhANFPDWeUAgIgAAKWIADRt8RtQCV8BPAKAiCQbAIQ/WQTRv4gAAIgYCECEH0L3QxUBQRAAASSTSDdRD/ZPJA/CIAACGQ0AYh+Rt9eNA4EQCBJBGS8vEyk8mcvE6b815Y+Q/QtfXtQORAAgUEJjEwEmQErM15lFq3UQL4EZHau+InbsgdE37K3BhUDARCwMAERfRF5OUs15RzoFj9LHhB9S94WVAoEQMDiBETkZQ0dWUtHqipu0VMRfnFb9pBKWrZyqBgIJIYAcgGBUAKO+9fL6pehAUE+7scWyoJoQb4kIi+mHL95RxZuE8GXFTnJyhtE38p3B3UDARBIGgFHzTr/CpVRy3CvWCQCHxxH/ETk5SxhYtOXVTRF/KMtmCZxR/SA6I8ofhQOAiCQpgRE7INFX/5vV5ZdtnSTIPq+24NXEAABEIiHgIi+rK/vN+/Iv2TJlwDMO/FQRFwQAAEQAIHkEkBPP7l8kTsIgEC6EsjQekP0M/TGolkgAAIgEI4ARD8cFfiBAAiAQIYSgOhn6I1Fs1JBAGWAQPoRgOin3z1DjUEABKxDQMbn+xdeS4tF1yD61nnzoCYgAALpRaCKqyvLMMjMXJmUJeIvs3cxOYvBZOuOdoMACGQmARF5GaMvZ7/Iyzh9aa3/LNeWO9DTt9wtQYVAAATSgID08EXw5ZwG1R2oIkR/gAWuQAAEsojA6q0HY1pwbfG8KWKyCSbj7837z8Hhkd0jHALRH+EbgOJBAARGhsDqrQdiWnBt8bypsuRCcCXFni/+cvaHSc+/lB1i4+eTNXeIvjXvC2oFAiBgbQIyakds+hVcTTnziVbySysflu79Q/T5DmEHAWsRQG3ShIC/Vy+ra8qXgAzZtLyNH6KfJu8uVBMEQAAEEkEAop8IisgDBEAABNKEAEQ/TW5UUDXhBAEQAIEhEYDoDwkbEoEACIBAehKA6KfnfUOtQQAEQMBMIEYXRD9GUIgGAiAAAmEIyKgdGZ/vH7YZJoq1vCD61rofqA0IgEB6Eajl6soELRF+/xo87GXdHaJv3XuDmoFAggkguyQQkB5+XV++8gXQd2ndE0TfuvcGNQMBELA2AZmNK4fMwJV1fEqsXV1f7SD6Pg54jZGAdtodZKMZEv1Az/iK+R0/cpNNSW+H3I/eIjMSJQgHCFiegF42ToR60Hqq5d5wC65JOlljp5YvZA0fOUT85cxe1t2VdauGmo0AgZAiWeTtpOg26tXSoykj0vbASI6O3wY6OSrJF0Aj5ahV7h/cKteEDQSsSEA7x8Uk0Mrp5fd9SAvkc+BmX/97XNxyLfZ99rbuDtG37r0Z0Zqx2DtI9y7jSkR9EweLPsfv3/nNxb8CyOl+dOGqfk9cgEBmEKjmZsjDWznzpbHLg1zxk7PhYcUX/lxasVqo00gRYLG3k+q9j3pJfqrSYFs00fen5TeZm5Re4l6xKKaelT8dziBgYQLbuW6VfLj58O/yQFfcMX12/IlSfebPY3xFInbmEmDBLyWt1xBp6a3E1NBYRN+fEb/ZaqmwaLnbWW7pnpC/vjiDQCYS4M9hJjYLbYqXAAt+FQv+4yz49kHTKtVE0+ee5bXP2vVI993U+N7BqUfbus7SRJcPlpbfcC4W/nII/2CkEA4CySGgkpMtck0nAj7B75U/gAhfbaW8NPvOjVT2QCcVz/gMRwr7S6C7V+/Y+PbBHU/8+f1J7x08dRPHC7vzm87Nwj8Hwh8WTxp6osrpRIA/f+lUXdQ10QRY8CtI97JJJ0zOIvZX3lNPt/yfK8iWOytMjIhenvbuP9758y3jIok/v/HQ449IDwEgkDwC/NlLXubI2doEWPAdpDU/kNKhJp2iiW9R9Y5TlDd67jBa4fn1Vveflq19+xZNNC44H37zNbofW1ge7A83CIBA8gjw5y55mSNnaxPQy8aJ4JeG1PL8z62jv/6DI97efUg+fR6HTnY+M/f7mxaEFX4bLXU/ulAmuPTFxgkE0oKAdJQuD6hpU8C1pS8h+pa+PcmrnHaOdZKmZSElTJ65kb6x9Wr2lzc1nxKzHzrZGUn4PUrlzHGv+KIMdUtMYcgFBJJPQCZsyYxcmZAlpclzLjGTLhWHlQ+IvpXvTpLqxmYdO5t1dlHQ7FoaPWEPfet9T6J6+MHV37HPs2rRj7bcE+yvFK1yr1gYdRJYcBq4QWCECYjoy3h8Ofur0sgX4idnvrTmbhnRtyaezKxVxF7+/965jsZMWZTMVn/79y1P/+GNvbcHl8G9/RL09oOpwG1hAiL2IvBy9ldTOi7ilrPfz3JniL7lbknyK8S2fOnly8/RgcLEjn/3mqQKvhTW1aM3X/TQc7N00INdBdu+4MGRQgJ6Y01sC67dtCLcYAMR92DRD+eXwhbFVhREPzZOGROLTTulpHv5AW5Qkx46sG2YI3WCMozs/MWLH639/nPv3RYYg9+ILvdjC+cE+uE62wkkt/0s+jGZYdRNK0TMgysjfsGiL+vwSGdKzsHxLePmz5pl6oKKpIBAWNOO7+FtxMlU4arl8XiopaXFCFqwYIFxjvXlVEf3xsucG0LKg4knVoKIZwECwaIvAx+kM7WE6xbTlwnHG5Edoj8i2EeuUC3LyWptVunbfvwkzfmbe2OtlcvlooqKCqqqqiK3201er5fWrJGBC7HmQHTlwxvfOnr6zGWBKZRSS9wrbpVFqwK9cQ0CViQgoi9vehdXzs5HMR/S87f8+xeiz3cqm3a9bNzxkFE73/64kYomyJs4JhQi9mVlZYboS4LS0lKqra0l8RN3LMe/btj51I8bPrwjMK5Serl7xSL54AR6R7tGGAiAQJwEIPpxAkv36HrZWH6GGtQKp1cmlph7/0FRojlLSkqMnr6If7R4gWGvuo899ZWfbQ0W/SYW/bLAeLgGARBILAGIfmJ5Wjo3fojr4Ie4u0yVVKqVlnlmmPzicCxZsoS01lRXVxdHKqJwY/a5pw/Rj4siIoNA/AQyXvTjR5K5KVj0y0j3moepKdXEor8g3lbLg9ylS5fSUARfyjp0omPLtT/4s6zYKU7jgOgbGPACAkklANFPKl5rZc6iH9rTJ+Ump8cRT01F8MvLy0lG7YgtP560/rjo6ftJ4AwCqSWgUlscShtpAhFs+jL2MnDxqKjVrK6uptbWVpIz9W2XX3452e32PtfgJ9j0B2eEGMkikN35QvSz7P6HFf2HDjRT3uhrY0UhvXvp7QfGr6qqIofDEegV9fpfw43eIfWE+7Fbq6MmRCAIgMCwCED0h4Uv/RJr57hGNsSbbfh3/Mfv6NIv3ZXK1lz1yAtbjrR1Bdn0Fcbpp/ImoKysJADRz7Lbrp1ja0nTfaZmD2FGril9nI6uHr3lwoeeMwm+ZKFy1Bz3D26VyS7iHMkDZYNAxhKA6GfsrQ3fMH6YW0bBI3gk6nePbKGcvBAhlqBEH394bc+T3/7jm6YZwEpRq3vFwtjtQ4muFPIDgSwhANHPkhsd2EztHOchrccF+tFVVato4RP3mPyS42gtqXlWayKTwCvY8wkbCKSCgEpFIZlYRjq3SQf9a1bXqGLXy3N+0j3vpi/SqFx1VTLbtqP15G+efm3ftLpXPzLNvMVia8mkjrxBYIAARH+ARdZcsYnHTqTdWuWcbJm5bN+uaXcYI3c6unvev/WqSReNLchLCov2Mz3rnn/jyCLJvFf37n36zT37Xt71ybVs2sE/ZwkUHCCQAgIQ/RRAtmIRH638h+qWS777eHDd9pw4RVWfnU6JFn6t9Vv12w5PI0X8hUP9W1tnt+u7z++oxL9m9SPBRdoSSI+KQ/TT4z4lvJZrth+3644OF5GaQUHb/lOnuv6+rCQ3L9eWkPfH6+7j1Hqg82Ol1HlBRZEmvfz2eVOdwf5wgwAIJIdAQj7Uyakack02gTVbD5RpUg3hyhmdb6O5F9lpXNHwTD2rX99HHaeJCvNywxXTsnjelNJwAfADARBIDgGIfnK4pk2uLPxVLPwrI1X4yqldh6efO3Ey5RZEihLWv0frLa994D2y/1in6W8RAyJ7FenSynlT3QF+mX6J9oHAiBOA6I/4LRj5CjhXv/v27KnFMyPVZKw6RZeNO0oTCvXJ3BnXjokUj/1b+WHtm+/sPdW5+1DHjcH2ew73716VYyurvGYym5f8XjiDAAikggBEPxWULVyGo+ZPDq17dl0zfQLddUXJoDUdd+JdOrfAS51T5/123Lix4093dns6u3SHt73rsmMnui6IIvRG3sdPd9ILOw8se+obcx82PPACAiCQUgIQ/ZTiHrywVMdw3P9srSZtLMtwXcnkXbdfPn1w5R9iJT86cpKebP6Q2rt6PCpHlWPJhSGCRDIQGAYBiP4w4KV7Uoezwa7b2+SftIxhlH977QWuWVPtyXiw6j3d1fvYPz37xh2ayFjCWRG5qLCo3O0s9xA2EACBlBFQKSsJBVmOgOOB9dW6l4yx+jk2294ffumKaf5KXtHxwie782ZOOpLT7+UPiufs5V8RtbaCgtrKOcUex4PPllKPbmThN5aAUKTq3Y/dWhlPhogLAtlHILEtVonNDrmlEwHH/et3sQA7pM63zDx3800XTb1Oru29RzaXn/6Ncd2mR5/48HhR/sFJZfmnC8+V4MEPTWuV0vVUUFAvYh+YwFHzbJXWun+0kLLRUvejC2sD4+AaBEAgeQQg+slja+mcA8VXKeX9t9uuNHrfUum5HetcU7s/8pl5dm5opE8+MtbJOTOq+K3nPrftH3uJDDcFbDYiN+XkuGIZkeMIeI5AvPEXRLl7xaJGvsQOAiCQZAIQ/SQDtmr2jvvXb9dEhrCXThvfeM9V5xlCnq87XLe0/czwJ9m2/NTbvyKnsi1RTk+deA/34PJdXL5h3+e8PKqwqMQN+z6jGNKORCAQMwGIfsyoMieio2Zdmda+mbjSy//+F2dT4ag8o6c/s2vr5os7mw3TDu15bTO1vuK7VqpVOb2ORFGQh8jU3uZm4TfK5Teiy/3YwjmJyh/5gAAIhCfAn7XwAfDNXAKO+9fXs9gaM2XPtY/e/K2ymYaw21Tv3ttO/vvAk9stP99LusfnVralyulJqO098MtHaCusqS8YcIBAUgmopOaOzC1DwF8R/2Qsv/uhm2btnViUbwj7+d1vNs3u+MsCI+zYLhe98yefmYdt/kTKwaLvoQRvgSOIJGul1BL3ilsTYkKS/HCAAAiYCSizE65MJ+CoWV+nNRn/kDWhKL/5n26aZaylrxR5bz35M8qjDsPcQs2/clFXR5/o0xPKeaI6WWwCf3lwGZi4xRCwg0CyCED0k0XWgvmKHT3SZKxpPR80Xt3+rPEwlzpO7KXXfmP0/o1mKFuJcnqStjCa1Iva22T8vvFgl9+UmLhlgMcLCCSeAH+++jLFKeMJOGrWObVWy6Sh+bk5O1csnHOxXMtxc1vd3iLt8Qm96/eb6dQRw85PilZxL79K4iTzwMStZNJF3iAwQACiP8Ai469m3L/+ODfSzgdFmoxFob38cu7lN0qaZB8OTNxKNmLkDwIE0c+SN0GgoAYvubCg/amd43sO+Hr9AZOxSKkm5fT6TD4p4uTAxK0UkY6pGETKQAIQ/Qy8qeGa5AhYcuH68yY3LZ493RilY5qM1XPGS9uepIDJWJXK6akPl18y/Rw16xrZDGXUj8vxKJUzx73ii0l7psBlYAeBrCEA0c+CW80iGnEylmnJhSROxooHs8PZYCdM3IoHGeKCQMwEIPoxo0rfiI771zdoIsNMc+HksU3fmH+R0YseZDJWTEsuUJI2ebCre/R2f/b8Rq1zP7Zwid+NMwiAwNAI8GdpaAmRKj0IRJuMZVpy4eC7zfRhgzFmn5I4GSseapi4FQ8txAWB2AhA9GPjlLaxHDUDk7ECl1xQirwVJ2t9E7GkdebJWMuV84RTvEf6CKw/1wUTtxgCdhAYDoHki/5waoe0wyIQ3MsP/Gcs02SswCUXpMQkT8aSImI9+uz7gRO33FRYNMeNFTljRYh4IGAiANE34cgsBz/Adeq+yVhn5ee5Hvni5b5lFbiZC0/9zJvnX3JhBCZjcRVi3sW+j3/cihkXIoJAVAIQ/ah40jdQesiBSy58tdTRPM8x0bDZB/4zFoVOxipRTo/lhkc6HniuQvf2rvHfEaX0cveKRZYwQfnrhHPMBBBxBAlA9EcQfjKLdgTMbg2ejGVacmHH2iby7jNG8/AD3JRPxoqHgQMTt+LBhbggEJYARD8slvT3dARMxgpccqGITjbffOpJo8dPoZOxyrmX32jl1jtqMHHLyvcHdbM+AYi+9e9R3DUM7OUrpbyB/4xlmoz18eYm2v+mv5ef0H/GirvSQQkiOcVsRZi4FQkP/EFgUAIQ/UERpV8Ex/0Dk7FKp41vvOeq84yJWbmqe+eik//Xt8aONMv8z1gjOhlLqhPrIQ92MXErVlqIBwJmAhB9M4+0d7H5o3/JBWlM4D9jmSZjmZdc8Cqn11h9U9Kkw4GJW+lwl1BHKxJIX9G3Ik0L1MlRE34yVsiSC1t/sZN6uny9fkWWmYwVD8LAtnI6TNxiCNhBYDACEP3BCKVRePBkrMBefsTJWGzzpyT9/y0leeuz72PiVpI5I/vMIgDRz6D76QgY0hg4GUupoP+/fe03zdRxwjeCJ0X/jJUszGLfx8StZNFNu3xR4RgIQPRjgJQOUaTXGzgZK3DJhUm9+5quO/0H3yidNJmMFQ9zTNyKhxbiZjsBiH6GvAMcAf9/G3UylnnJhbXKeaIiExAE/sqR9iily90rFsU150A3OO3VLSXTn6i+503JAwcIZCIBiH6G3FVHhMlYpiUXZDLW1l8OrKypbOXK6YlLGK2Mi7/4GrVWvl80RGH/cYv6Nv2XBxZQD/EXnpb1iIwhrcTb37dc6nrhkwniR/zhcBEpN9l0PeUXrXVjkTfClv4EVPo3AS1wRFlywTQZa+eGRvrkI5/AKWXpJReGclfFxEVRJm7phhoHC/0y0krEPuwQ1UDRp6BNEbnIZlvufvSWlP+FJGEDgQQR4PdxgnJCNiNGwHH/+u2ayOidBk7GMv3/LfG25afegP+/TZvJWFzzmHd5sBs8cWvXF15bSt2dy4h09WAZ/X3LQE8/Ulz+0DSSb8G3xkhx4A8CViXA71+rVm2E6pVmxbJJo38yllLmJReiTMZKiyUXhnorAn/53DzpKP3fWTtPj7L1jo4lv1hE358Pf3jqqLBoqRtmHz8SnNOAAL9v06CWqGJEAtzLr9dEt0mEwH/GCpmMZV5yYSnb8mslTaYejpr1dfeV7L6n+rzd8TTRe/f2T7/40tHiRbEm4g+Qi4W/HMIfKzHEG2kCaqQrgPKHTiDaZCxTLz/wn7H41wCl6WQsimPreOHB9fmq99YoSbw0/oIXqWRBD9lLJpLKOYvjGiYyPnv4cB062Xnil00fqdVv7Cs5evrMZewXafeoHFXu/sGt/OA3UhT4pzGBjKo6RD+Nb6f0ZrWme6QJE4rym//pplnGhCulgiZjNf/KRV0dPkFT9IRynhjUti15puuhN9WsJE1VFH7z0oW3NND0664gpaaHjxLqu+fY6ecrf7x5zJG2rs+Ehho+HlVYVIIev8ECLxYmANG38M2JVjWHs8Gu29uO++METsYyLblw8tBOann6Yn88stD/3/bXKYEXeuMD/IWmHw+X5aaOT9Pln7390KSxhWeHC4/Bz7PpvcPb/lvdq/PYpDaOgjb+MMHUE8QETusR4Pep9SqFGg1OgB/gOnWE/781/TOWeTLWKu7lR+oBD16oxWPojTUyHLUhXDXX2r5A5fPm09jCvHDBcfmx2eeZLz7eNOfY6a5P+RP6z/yBqnM/tnCJ340zCFiNAL9HrVYl1CeQgN74ED+k7WUx0z7zDKlSavd46PX/dGzrnWlELRwz4VD7xXedfWDyjWTvPbK5/PRvrjMCQpdcmKOcHpcRloEv+oWaXaTIQcHbzNufpHOuujfYezju7l6945rvbbSHFf4hzAYeTl2QFgTiIaDiiYy4qSHg67Gq+7g0EXs7n017W9vpI0Xb6yaaPPscPeMvaM85+8JCmlBCtDOzJ2NRwKb/XFNFvbQywMt3OeP69WzDX+hzJPZVevxzv79pgSYymXr4Q9XIvf3yxJaG3EAgMQT4/ZmYjJDLIARiCPaJPS3jqCz2/BphP+jt7J6y48ncCME+77FTu+nkwQ7SWkalENvyK7mXX08ZuOkGp50fVG8P6eUXTW6meUvleUbIF2eiMLz0/pG1d/+qmX+NmXNUNlslZu6amcBlDQIQfQvcB0O0uju5l6orYqnOXs8ZmvbWL2OJ6oujbHtY8GMeqeJLlD6vEXv51z+wjvLHxjzmfogt9lz1yAtvB4/q4Q+Wi3v7c4aYJ5KBQNII8HszaXkj4xgI6IYHS6lbi+D32ewHTxS36JPaTUrdxsKfkfZ8/oVUz9TMve0pszfQZXd9nv2Tvu85dnrD9f/SEFKWKiwqdmO2btL5p3EBI1J1iP6IYPcV2if4DUQ6mvmhlcZf8Cadf0PbKTXu4neP9szp0b7bdl5hZ+cZ75H83A+fo0k7ftqR0+kp8OUc7lV5WPhlvR0RyHAR0tZPb3zgeAjD1PTy+5ld+fDGt4IncCmllrhX3FrXHwkXIGABAsoCdcjKKgwq+LlFb9GVS16jMeeKySfal4KPX1c70b7XiJ77NtHhd31+4V6VbU4m9fj1pgcq+LnFmqCmttKNj8rD1cG5ccLGxkYqLzc/d12wYAGJPwfHtP/rhp1P/bjhwzsCI/OHay2beOT+BXrjGgRGlAC/L0e0/Kws3LDhd3WEPnj00fDSlfc2UPEF8jA3JtHyJet77WrvoS21OdS4os8j+KSkx1+inB5PcEg6uvXGGifXexkf/btnfOnL9ivumN/vEceFx+MxvgBWrlxJpaWlMac8dKJ93bU/+Ivp+YEicrPol8ScSZiI8AKBRBPg92Wis0R+gxHQGx/YTqRDFUV6959Z+gnlFZm7nYNlGC7c/RLRU187Tu3HikODlYtNPeXpJvwOZ4OdOtsvN9rTy/wU2f/l0vcrvnLOIRPLbcWLae6VVxvR4n1xOp1GEv/ZcMT20uSoedb/By79KVofW6j6HbgAAQsQwBsyxTeBBb+aSD8eUqwI/oIHNSnbrJCwoXr0ntlHP5l/go58cGlIFoqWK+cJn8KFBKbeQxaPI6VnUK+2kyKfiGstv3aIN4cmCp10RUT/deUOmlvs5auB/Y8Ff0Vfvi5+jG632+jdy9lutw9kGOMVi35ITIh+CBJ4jDABiH4Kb4Bh1unu3MWiH6woXrrh+7uHJPiD1b+3ewf98CI7nT4atGSA8pBSKTHzOB54ztcD7uudsw1e2m8IO4u5X9gHa0nY8CcubqELx3SYwryfXtI+79KSQpNnDA7p3Yt5p7a2NobYoVFufXzzb5VN+aZJ9wV399I3N/yv617qc+IEAiNOQI14DbKoAjqM/dlo/vUPPkP5Y75kXCfjpe1oA/3reeUhWSsaVm8/fO+cWMy1iHrE3jkNYyvKz3NJ8nPGFHqL8nN17Yl/LHV0fSDlibdxtP71KzTjQpmTZThjfikpKaE1a9ZQPLb8wMzXbDvkZrfpF4kiXVI5b6r4cxB2EBh5AhD9FN4DHW5oYarGk6+/bxW9VndPSHOVrTicbb+/d069DtKKD0PIWdD5dwrRsHrnFGbLsdn2FuTlHJGgCyeO8cj5oklnFZ6VPyp/6tjCiROL8qeJX/BxxY77acY+8+Cd/V/dROfMjM+mLz18h8NBcg4uI0Z3K4v+jOC4i+dNUcF+cINAkglEzR5vyKh4EhcYYWihl8offpdy8uYmrqQIOYmZ55GJ09m0IkMZ+yP9omdh/Q+6/prdhqjbNVEpJXgr6uud2/PzTk0aU9A9Jj9XXThp7Dgp5oIJRSWFo/KMa3HHe1zy4Y/oUj4C0x36/C9Pnz3vKzH9PaI/ncvlorq6OhqqaYfzaWLR95mx2OHfIfp+EjhbhQBEP0V3Qr9QU0eK7jEVN/6CdXTFvYtMfkl0/Pm3P6Qb3n/EVMILvVfR35/5Xya/WB3Reucs7IWO8WfFb2OhQbcW/q3h4Vhu/oJyX/3mdy7/1P61Fewe2CfP3Ejf2HrTgEfyrzxt3esbdhwNWthNNy2eNzXhv4qS3xqUkMkEIPopurthTTvX/s/1NObcIKGIXCG3201Lly4l6ZWWlZXR448/Tna7PXKCoJBNb7xHNz5j/LlWf8gJKqLZHb/od/sv8nNzdubm2Nr9vXPxv2LaeKOw4fbOJa8wh5fF3CX+LOaNcrYRuUmOnBxP5TWTjTB2m3bttJeS7t1u8hTHPx99i2y50f7iUGIl7Nj8zvF1n5w4Y/4C1/TE4vlTqhNWSAIzQlbZSwCin4J7rxtqHNRNu4KK8tKNjx5nPwcfMe1z5syh++67j6qqqgwzhIh/XV1dTGkl0on2LlIrpusx6rTpvv9s8g92HJ56Y0+qeudSFxZ0Q9ipoMBVOafYI35DPbRznJu0NtnTj39ldWPxp28oG2qecaZrXbP10Dj+JWcPTKdsqrLy2rMzbtmLwDbiOv0ImD786Vf99KixDv+PTk0s+iE24GgtUkqxtnE/uC+SUmZ3n3fU07G6u2m8+xlTnJeu+Q86Mt78C8AUIbKjv3dOWrm00h4Wc1/vnNNUzpvayKek79o5tpY0yf8P9Je1P/+83rOWvmIbW5DX75esi/f3n1r79u6224Ly9y6eN8X0JRAUDicIjAgBiH4KsIcV/UmXuujyr5XGU7zdbjdMOw6Hg8TUU1JSYvoSiCWvg+tX0JTXHjVFfX3WCtp97mKTHxH5bOdaeVjMDdMKC7pfxN0s6CLuwWlGxM0mnjLSvQ3Bhb/w2afp5s/dGOydULfWek/9tsNjSJGdTJtetXje1CqTFxwgYAECEP0U3AQWfScXs4yPgf3ca1bRpZX3DHgMflVbW0tPPPEEVVVV0fbt26mlpYV27Qq2GkXPp3XjkzRji/nB7eEJ1619+eonayUli7lf2MWZNod2jmskrRcEVviEHq17vrXrTPGYgvxA/0Reb3nP88xhT2fIHAtFGJ+fSM7IK3EEIPqJYxkxp6e3HnAqUibRd5xduGpOydi4RF8KEDu+jCUvLS2l4uJi1rkBc4+ED3Y8uObNVb9t3mMqVym93L1ikXwxDZbcsuHffOChPz0x6kdfCK6gd9I1NPq/P095uTnBQcN2t35y+sk3Pjp5b2hG6OWHMoGPVQiooVcEKWMlsGbrgTJNqiEw/jnj813XXmQvDfQb7LqiooJqa2vJweaduro6amxsJDkPli4w/Ju/277hmZb9pj/8UEql9brvjvvXr9REVT/M+xl9OefFwOYa1/tnV9M5i2q6Ka8w+l9MGrFje9l/rON3ze977woT26sK8h3DfTgdJl94gUBCCED0E4IxeibhRJ9IN1XOnWIyR0TPhai+vp6cTmd/D1/cdrt9sGSm8Jseb2z+4FCb6akt9/TLuaffaIqYBg6HrLrZ3tbAgl8q1R2r2qih4DsdE/TxAnGbjgLmVLWeaEr8C7GZ8iHyvrvn1J/e29d2Z5C/4WSzzhI2kdUZDryAgAUJQPRTcFNY9B2aVIjxvXLu2a1cvGmoIbuTubc6ap4dxwWwAvJr356Oom+s+6N71mgiQ/CJt3Ptozc/coW67vpX/obyuk+yT5j9lsd20zVfl/aPDRMa1au7R29sfOeYPtnWfXPYiBiXT2G5wNNSBCD6Kbodq7cecBMpk8CXz5qw3l6UG/PkLBrmtufY6Q3X/0uD2bTDPVf3YwtFBIeZe+qSOx58tlT3aDGX9df7lkvP3XzTxVOvk1pM37eartxRI5dhj64xM7yHFv5m3HjHp2l0/qC2fm/7mZ4X3959Km/PkY4vhM1QPDWtXTx/SoVc4gABKxOA6Kfo7rDo809+ZXqAOmnsqHXXzSxelKIq0PfWv7v+l5s/XhhYnlK0yr1iYVWgn5WvHTXryrRWssJaWMGXuo/3uHYuaL7zU6R7B11/p33a9a7CK+84SBMv9NDoCbmdRZ+a0t6T92HHme4p+453nNp9uOMqztPBR5Rdr1IFBdWw40dBhCDLEIDop+hWrGk+VKF7tYiVqcRFV09uzs1RJhu7KUKCHN29+q0LHnxuGmfXL5Z8TSrVD3Gl0CEebJqq0lqv9Cfnunu/ef3FBwPX+Lnk459svuSDf5+ldK+YsSRqL7/Y+Ihpb77ip679k2/oNxkNlkgpWsrPZmoHi4dwELAKAYh+Cu/E6q0HPVycX4z4kmjaxFEbrr6g2GRyMQIS/PLt37c8/Yc39t4enK0qLCp2O8ulXsFBlnI77n/2Pk26X1yVUmEF/9L3aw0Tj1F5jkM22yLq7bmXNJl+ZRnhYV5iF33dqmy26kossxCGIrysTACin8K7E268vhT/hSsmrisclZM0M4/H9QyV/leo7Zof4KbF+HxH35BMYSWHLAa37ObLpgQuyXzDy7dtHnvi3UDBbyFSFcrp4WcpRDJrt0flfi+n98xnKMoWg+h7FelqjNCJAhFBliagrFe7zK3Rmu3H7bqjU0TI1NsnTZ6KuZP3cu814atC9hx8mxb+vIXebTcXyTfeS4VFDiv38h3GkMzTK7mH3/+A9Kz8PNeDN8w0rcEfQfDLWPA9ge+mNVsPVE049srKqYc20bSDz58p6Dw0KjBcriOKPj+o5S/JeiooqIftXkjhSFcC/NlP16qnZ73XbDtYrTU9Hlz7Ublqxy1XTmLdVwkT/p6TB3u+UvtC1xttEwqCy2MBs3Qv3yf4A2Pwpf4yJPNbZTP7e/P5XSe8Nzd+9mBuz+mBdfsVrSKyVQcLvqRn85qM+CmTa8W2+IrnL2kk6vV/obAdX9m3XvHzfQcnLTiX/AvI2WwuGjWqEUIv1HBkAgGVCY1Itzas3nqAxUaFTMwS4b+xdMLR/NwcQ5iG067Oo266u247vfJJSGeWclXvWz0FY653W9SWL0MyqUdzD59YiMnYLpw4tukb113UzyyS4CvniSojQdAL9/JNcyVUQX4xhDwIkoWdqFriCED0E8cy5px8Zp4OFwWN2yfZ2NTzmZnFjZPHjSpnp9kmwx4x7N7mnXvf+Lv/eKPsZHdOyP0dq07Tpvxv//bs5a3yH4kxZJfaKCL40cbgS21kSOZnm++cEjBCh0jZlnLvvpYibKbnKWyqWYwx9RFIwTvTCYSIQqY32CrtW/PK4VLd09vI9Qkr7Hm5avf8S4pfHn9W3jyOY5rUxe5wu/eDwyc33fnzbRcdbTsTca2B5/IfpJmKHysoWs69Yme4jEbKr29Ippi+jGGlSinvVy7/1HvzHJP7h7Sec/jPrmu2/0NJkOAvYcGvi1ZvNu3IjGiHxFH4cxPBgCNLCagsbbclmj2Y8BuV5J7/5OL8Fy+dVnS6IM9mzx9lG5OjVHdXj849fvqM3n309N4n/vz+6Jc+OPJZjm+IJZ9D9rG53fTPhb9/58td62f2BypbJYtlfb97BC/6BH/QMfghQzJJlXEbXBSl7mzaKdMDC97hz02isEJQ5hNQmd9Ea7eQBUlszSK8l8da05YDxxvrmj+K2e4/c0wb/XDm+yRnav6Vi7o6+mzlykNKlQ8mmrHWa6jxHPevf1wTVVPfxs80dn59/oUUOOlq9rsPN53f+pt+mz7X20sxCD7xxs9Q+FeA6hunj2WPGQn2LCagsrjtlml6n42f7dF+YYpetXhEP8/Wu+WV614ZVzyq2zcqqPuMl15ZeZJ6e6b5SlFuFtA5LPwenzu1ryz48sC2/+GrCH6MY/DLYqmzwba9cxcpMn4FqRzbnMprJvPzFMIGAllJQGVPq63fUu71sxmC2M6uBnq0FLrFIvpK6SZO6XSvWNSoG5x26u5ws9v3/ODkoZ305uoppLXPTcqllnvncHjKdocxBj90SOY/zL9wln/SlYzQKXu54r3R7Xv7bfqkFLdLyaSrmL6kmGmVJtVnNtKti+dNNez6KWsoCgIBixFQFqsPqsMEWKhE/Ln3q2QMeZ8wc0DfHkn0FRGbPKiRlK4VsaeATTc8WErdAQ+OD77bTB82DIgpUZ1afmIJpWCLJPjfKht8DL6KMCQzUrX5AW4DhxmmMKVoKdbJYRrYs5oA60RWt9/yjZeF2np7e0v5RhnCRaRKWfS3r2r+aA6Lu89MoW0usqlG96O31FOUTf+5pop6qa/XyxE/3txE+98c+FWhbEvYZML2bw5L0u4Isyzy9edNblo8e3p/PcZ7XDs/82oV5ZonXT2hnCf67f6xVI+/POV5yS5/XIX/rfWjwLmPQDaeWEuysdnZ22a9qaaWNN3XT8D1+8106kj/LFdStnIW/sb+8ARehBP8WwLWwZeiRPDDjMEf0pcRxuYLURwgYCYA0TfzyAqX3lgjvwhuMxorD3ZfXXWQerr6ljJQHlKqnIXf9yvCiDT8l1iHZJqWRVaKzVWqiusi9Y27EmzakV6+YcPnXj7+xjBugkiQiQRUJjYKbYpOwHiw29XRSIp8w0RF+JufpMAHu+QTfk/0nGILdQx1WWRSZSz4Q/ryYdMOPxdRYs+XSg59bL6kxgECGURAZVBb0JQ4COiGGgd1kwiq70Fx6IieerXcW0nD3BwxLIt8/atfa5p4dFu/TZ+UaiFSVUMVfOINY/MZAnYQCENAhfGDV5YQYDOPPBz294aJ9ry2mVpfCbDvU9wPT/3oHL4hmTLpqsrvl+gx+P58w51Xv3zwOGFsfjg08MtyAhD9Yb8B0juDkBE9O9Y2kXdfQK/btoR73HGN6OkT/AZN1Dfzlyjcssg3vnTTrlFnjvfHYZFeS2STHv6wzEps2sHYfMIGAuEJqPDe8M0WAvovDyygHqol0v3i621rb7t1W2nRNPUJB9m6PWrsLz/sOfd5Khzd5B5kOWYZoUMJXhaZ4ty4l1/PXyDGg2qFsflx0kP0TCcA0c/0OxymfYY9v4eWkVYVLPbG8gQUsJ3osvXMbpqfE+DVf6lI1ZNN17sfXbiq37PvQgRf92gxF/XnGeOQzKjLIvdlH9OJe/kYmx8TKURKJgEr562sXDnULbEEBsSe+u3sFGY70Z1LsxvnhgkZ8OI3jptstqX+CWGOB56r0L29MvHLEHyllPeLl5yz46aLp/Y/I0jkGPyBmpivTP9MpmntYqybbwYEV9YT4M9u1jPICgD80HYZN9TJx6B7LKLvz0Rxz9+m9MYeTT/u92PB/+b1Fx8MXCXzko9/sjnMssiyhk6jP10izhibnwiKyCOTCahMbhzaRqSNxdY62eQyYLMfjEs8oh+cl4zQ+XoCl0UOzj+au+//Cbb3xbH22Py+SuIEAqkmANFPNfEUlmcsstbVu4YfahqzUiMU7aWzpm6iGZ+10VmTvFQ44TLqard3tnkvOHbsEzre3kMvNL95+I+78ifv1RMjZOHzzs2xHXj487NG+1fJFN8bXr5t89gT7/abeEgpGYNfppwej4Qn8sDY/ETSRF6ZSgCin6F3tq+Hv4v7+oaNPUwzW+nTizfSlCuvJWWL+PeK/elOHjjzyYdvjKpZ9zH9+fR5/d7BF3dd4aBrpk8kWRb5ulfv3pEqwZd6rMbYfMGAAwSiEoDoR8UzkoFDL7tP8CObdBxlT9EFn7+WS4j2C4CDw+wdHvpo61q6bUMRnaLCkAiFeTlUPXfayXvfuGl/rnmVzFUqzmWRQzKP4rFm6wGMzY/CB0Eg4CcA0feTyKBzyEqaA23z0nXfWU8FxX894DW0q56Db9GXfu6it9uLQzKYoo53vZD/nbyx1OYLUzTkmb2+DAZ/5V5+PSnC2PzBUSFGlhOA6GfYG0BveqCCtF4TplleKnM2U27+zWHChublaaXv/7GZfvFhUUj6v819nv4599fEpqO4Z/RSnBv38jE2P05miJ6eBBJRa4h+IihaKA/9Qs0u7vEGm228dP2DTZQ/5kuJrqr0+G/7tZveOhb6Vro/7/ePfeN7v65JdJnB+WFsfjARuEEgMoHQT2rkuAixOIGQdXT89Z39V7+jybPu8jsTfe7c1UxX/7/ddEKPNmWtFK1yr1gYdSKYKcEQHRibP0RwSJaVBCD6GXTbw/byiyY307yl8gcpkUbxJITAS6t/Sne/Mj0kL6VyStwrvih/yh4SlgiP4LH5qiDfUTmn2JOIvNMyD1QaBAYhANEfBFC6BBtj8rt7/ROTBqo9/9sbaPT4zw94JOmK7fvz/6Wpd3/vBFtgCYrUE+7Hbq0O9Evk9eqtB+qI1D1kbHrV4nlTk/7LwigKLyCQpgRUmtYb1Q4ioIP/+1bCfb18GZoprqQf4Xr7/AZzux9bWJKswlcHjs0nXV45b2pCl3VIVr2RLwiMFAH+TI5U0Sg3kQT0xhoRu4F18CXzmbc/Sedcda9cDhzRr8rLy00RGhoaTO5ojvb3NtGldZ0hUVRhUbF7kCWZQxLF4LEGY/NjoIQoIGAmANE380hbF4u+Dql82bKNlFtwU4h/BI/Gxkaqrq6m2tra/hhlZWX917FcfPXhJ+mV01NMUZXS5e4VixpNnglwcC+/f2y+Jr389nlTnQnIFlmAQEYTgOhnwO2NYM9vpRsfnRFP80TsPR4PVbPw2+32eJL2x1315L/Tsg/O73fLBYv+chb9hAoy9/IdmtQuyV8ORbqETTtJe2AsZeAAgUwgEE70M6FdWdUG7uVLdzzYDtPEom829wxCpaqqiqS373A4yOVykXwJiB/Fsa156skTS7dPGRuYJCmiv+1gtdb0uK8c3cQPcIWBz4lXEACBiAQg+hHRpE9AWNEfwkPc+vp6EsEvLS0l6fE7+sRfzrHSeP31bR23/+FoQWD8ItXxs3dWfPl/BPoN9xpj84dLEOmzlQBEPwPufFjRt894na76+pXDaV5ZWRk5nU6SM8W4vdOyjW753VFT7OttOz78zaMPXGjyHIYDY/OHAW+oSZEuYwhA9DPgVoYVfaK4zTvSwxeRr6ioIOnpl5aWGmaeeOz76154nv7xLz0mqtW5T1N13pqlyukZeEJsihGfgx/g1pKi+3ypNMbm+0DgFQRiIgDRjwmTtSOFFX1NbrrpUQfFsbnYjl/Bgj9nzhzatWuX8UC3qqoqjhyIVtWvp2XbzG8rQ/RZ+EnZKln46+PKMExkFv3jLPp2CeIHuBibLyBwgECMBMyfzhgTIZr1CLDw65Ba3fC9LaRyPhPiP4hHY2MjlZWVDRIrONjnvv3f1h56/XDu2T6X7/X/jfo3utn2GjuUh5QqZ+F3sSNkN0YhaT1OAg6czq+Y/9LVbrIpX9z8wha3s9yzpvlQhe7VfauI6lZ+gOuQ+DhAAARiI6Bii4ZYViegX6hxkaLLTfVM8kJrprLY0dWjt1z40HMhXzJNo791YEbv/qkchXflJqXmsPB7dIPTTj2dtxHpMtKqgs9G750jGbtj08C/LIqHInLNmTZ+zOcunHL+ueNGk8bYfMGCAwTiIsCfo7jiI7JFCYRdhuGsKRtp7n0xT84abtOe33Hgd1//zzdMq3lOK+ikzZev30lvrp5Cfb14Gj1+G11553us2lXRygwW/cC440ePosJc27defujG/xPoj2sQAIHoBFIp+tFrgtBhETBMI+EWXItzVu4wKuG94uEXvMdOd5mW2vzb6fvpny/6mOjgu83kfvlaOmc2GUdu/qBFRRN9f2J+A7MJyLbU/egt9X4/nEEABCIT4M9M5ECEpBcBtuu7ucamWbifFM+vm3Tloqg9ak4z7P2tPSd+vfDHL30tOKPnrt1OM8f0/W1iT1cH5eSZxvAHxw90xyL6/vj8Rq5zP7Zwid+NMwiAQHgC/FkJHwDf9COgNz5QzXbxx6XmXarQ1VB4x8Q2m33ajZdPeHpMYe7t4p+MQ2v9Vv22w9N6qffU02/u2ffyrk+MlT2V0k27btziYjNO3/DKQUv3cgwXTbp0nFeP+fCRD86n3UdPlrzaevyU1moBh0Xd+c3sosKicnngGzUiAq1DADVJOQGV8hJRYNIIyIPR3u6ul5sLbuk8mHt+aX9BmjyLrpn8am6OSoZ937tpx9Hmk23dN/vLa+vsdj3Z/GGh+/jJr++6aYuDemmlPyzk3HNG06fm/4XOv7mN8sd8lsNND3PZbeynOnqONL57eGK9ax9t2nnI8Av3wm9oNwv/HAh/ODrwAwEi/owQtgwiYB7SONCwUblqxy1XTlK8XTbgO+wr75b3PE2HPZ2h/72raW1lW20tlxC8JhB78S5iX3i2otl3EtlNjwE4MPr+8eG2V/77f76qPzjUZvyiCI7Nb2r0+IOhwA0CfQT489F3hVPGEFi99UAjUag5RIT/c7MnuAtH5Syi4W8tLPitYQWfyFvW+ftFxV0HnmFzU2jPPbeAaPbd7TT+vMLBqxE5xp92HPjt//jPN/4qXAx+Y9fBxh+ODPyynQB/NrIdQea1f83243bd0eEiUqaHuiSbJs+8S+zbphTnz2PnOD7i3tvP9Kz7y5tHHWe69axwiZVNVVacqF1GpAdMTP6IY6aK4BMVFvt9hnU+dLLzmbnf37RAE4W0RdloqfvRhbXDKgCJQSDDCED0M+yG+pvTtygZ9/hDxVDijMqzbf7MJfaP7EV5FewOEUz2C9m7e/TGF98+7vWe7vpySGCfhyK9pOL0ExTWjl98XiPNWXIN2XJH90VPyCmK8HtUYVGJ21nuSUhByAQEMoBAJoh+BtyG5DRhMOHvK9U9fXLBa+dPKco/Kz9nMj/s7WB/6aHzLwWi05097Qc9Z469u+fkrEg9e45v7Ibgd/y8nro7dxFps1knt+gtWvCgJmUL++vAyGAYLy+9f2Tt3b9qvi04C6X08kT/gUtwGXCDQDoRgOin090aQl19wt9TT+FMPZS4TQS/ct7UOr2xxsm5LuPDvJd992nKHZ20YaNS2Dd/t33DMy37Py/XAQd6+wEwcAkCEP0seA8YNv72Tif1L0ec0Ea3qBxbVeU1k41fBvqFml1cjnkRtCmzN9BldwWLcUIrIZl19ejNFz303CwdZN+HbV/oZNmB5kYkANGPiCbzAtZsPVDGguikMCN7KP7Nq0nX3j5vqtOfNOJSEOUPb6OcvLn+eMk8/+LFj9Z+/7n3TGYeNvE0sYlnaMuGJrOyyBsERoAARH8EoI90kYb4a1XNPXKTOMZYrxalqI7y8+sq5xSbHpDqgBnB5N+GsOib/IFLS0sLjRs3jkpLS/05xXQ+1dG98TLnhpBJaPxAtxgPdGNCiEgZTkBlePvQvCgE1mw/bqeOjgqtVSkpXUrhfwG0EGmXUspFWtez3V7W96Fwm95Y08j+5uUS4lze2e12U1lZGVVVVZHL5SKHw0G1tbWcbez7lQ9vfOvo6TOmSWhc/yXuFbfWDeSCKxDITgIqO5uNVieDgN74wHH+grCb8i5f3kw5o641+UVxOJ1OI9R/ZrHm7xpt+MX68u3ftzz9hzf2mh4as4kHo3hiBYh4GU0Aop/Rtze1jdMba0LV+cZHXVyLUj5i2hsbG2np0qW0cuVKampqMs7S448pcV+kTe8c3PB3v37d9OAYot8HB6esJwDRj/wWQEgcBHRDjYO6aVdQEi/d+GhME7/86cSeX1lZafTu3WzqcTqdJKYef3gs5x37PKsW/WjLPYFxWfTxMDcQCK6zlgBEP2tvfWIbrn/9heto1JhHTLl2dX1Ef7PmXpPfII6KigoqY5t+dXW1EdPhcFB9fX1cD3QPe8/84SebPp5kZND30tHd89Fjd172d31OnEAgawlA9LP21ie24dppt5PuZZt+YL7KTU6PI9BnsGsRfOndy1niyjnQLX6DHZ62rlUNO46Zevr8rKFp8bypZYOlRTgIRCWQAYEqA9qAJliEgF42VodUxeltYb/L+Yhpl5E6a9eupWXLlpHX66X77ruPxKZv5++UmDLgSAeOd27YttNjsumTpicWz5/i+/nAcbCDQLYSgOhn651PQrvDiv5DB5opb3TMo3ekWmLOkUNMO1VVVSRn8Y/12L7rxCr3oXZTT1+TXh44kSzWvBAPBDKNAEQ/0+7oCLZHO8c1ktYLTFW44z9+R5d+6S6TX5Idz752eEfw4nD+tYGSXDQRoQQQsDYBiL61709a1U47xzrZjLLMVOnJMzfSN7aGzJA1xUmgQ5Z/Xvfq4ZDyVEF+cfAM4gQWi6xAIG0IQPTT5lZZv6L8MLeUdO/2kJp+98gWysn7TIh/Ejze339q7du7224Lyrpl8bwppUF+cIJAVhKA6Kf+tmd0ido5zk1am/+xa9aXN9DtT5ofrCaBgtb6rfpth6eRIjsFbErR0sq5U2oDvHAJAllLAKKftbc+OQ3X4Uw8UtQQHuhKsniOcA9wJT3b80uirRkkcXCAQLYQgOhny51OUTvZxMO9bC29/XGmIkdP3EHf+Wg6+5n92SMR+8n27qc3tRw1rbdj5IuhmgYGvFicQAqrB9FPIexsKSpib/+8G56hr62W0T0JFf6ubv36+lcPnx9s1mHeXn6A68ADXCaBHQT6CED0+0DglDgCfb19WYrZbNuXIhIs/J3dPY0bXUfPY+GXXxFSQv+Bsfn9KHABAv0EIPr9KHCRSAIs/KVEWsbth/bqJ1z4Dv3Dtl6y5ZrWvI+3/CMnzjz10tvHPx+mh89F09rF86dUxJundeOjZiCQGAIQ/cRwRC5hCLDwV5HuXRkmiL2Uh2794XN09d/JUM4Z7BHz3t2jm198+/ge7+muL0dI1MJmnTKYdSLQgXdWE1BZ3Xo0PukEWPirWfgfj1hQ4YTd9LkHN9Psr06i/LHXcLxxfITbWz2nu998e/cpfdjT+aVwEfr8vCrHVlZ5zWRZx7/PCycQAAE/AYi+n0T6ny3bAhb+Khb+CD3+wGorN02fd4SKHe4zU6869c7kr1J3b++UQ94zZ50503tZWDNOYHKiFkW6AsMzzVDgAoFAAirQgWsQSBYBFv7INv4whXaNKnat/1wzpwkTGNZLr1IFBdUw6YSFA08Q6CcA0e9HgYtkE2DhdxD1OkmTaQXMcOXGLvq6ld/ETu7d14XLB34gkNUEwjSePy9hfOEFAkkk0Cf+taQpeI2c/lJjEH2vJl2L5ZL7keECBGIiANGPCRMiJYOAT/ypgnv/ZRT0BRBe9HUrETUqm62+8tqz6wkbCIBA3AQg+nEjQ4JkEOAvADvn67fhl54cc2HuxvnPnGUjcpMcOTkejMhhEgnfkWG2EYDoZ9sdR3tBAASymgBEP6tvPxoPAiCQbQQg+tl2x+NvL1KAAAhkEAGIfgbdTDQFBEAABAYjANEfjBDCQQAEQCCDCCRE9DOIB5oCAiAAAhlNAKKf0bcXjQMBEAABMwGIvpkHXCAAAgkhgEysSgCib9U7g3qBAAiAQBIIQPSTABVZggAIgIBVCUD0rXpnMr9eaCEIgMAIEIDojwB0FAkCIAACI0UAoj9S5FEuCIAACIwAAUuL/gjwQJEgAAIgkNEEIPoZfXvROBAAARAwE4Dom3nABQIgYGkCqNxwCUD0h0sQ6UEABEAgjQhA9NPoZqGqIAACIDBcAhD94RJEeqsRQH1AAASiEIDoR4GDIBAAARDINAIQ/Uy7o2gPCIAACEQhkJWiH4UHgkAABEAgowlA9DP69qJxIAACIGAmANE384ALBEAgKwlkT6Mh+tlzr9FSEAABECCIPt4EIAACIJBFBCD6WXSz0dRhEUBiEMgIAhD9jLiNaAQIgAAIxEYAoh8bJ8QCARAAgYwgANFP4G1EViAAAiBgdQIQfavfIdQPBEAABBJIAKKfQJjICgRAAATMBKznguhb756gRiAAAiCQNAIQ/aShRcYgAAIgYD0CEH3r3RPUKLsIoLUgkFICEP2U4kZhIAACIDCyBCD6I8sfpYMACIBASglA9FOKe2iFIRUIgAAIJIoARD9RJJEPCIAACKQBAYh+GtwkVBEEQAAEzASG7oLoD50dUoIACIBA2hGA6KfdLUOFQQAEQGDoBCD6Q2eHlCBgZQKoGwiEJQDRD4sFniAAAiCQmQQg+pl5X9EqEAABEAhLAKIfFkt2eKKVIAAC2UcAop999xwtBgEQyGICEP0svvloOgiAQPYRiC762ccDLQYBEACBjCYA0c/o24vGgQAIgICZAETfzAMuEACB6AQQmuYEIPppfgNRfRAAARCIhwBEPx5aiAsCIAACaU4Aop/mN9CK1UedQAAErEsAom/de4OagQAIgEDCCUD0E44UGYIACICAdQmMjOhblwdqBgIgAAIZTQCin9G3F40DARAAATMBiL6ZB1wgAAIjQwClpogARD9FoFEMCIAACFiBAETfCncBdQABEACBFBGA6KcINIoZPgHkAAIgMHwCEP3hM0QOIAACIJA2BCD6aXOrUFEQAAEQGD6BzBL94fNADiAAAiCQ0QQg+hl9e9E4EAABEDAT+P98jUl3bu+RdgAAAABJRU5ErkJggg==", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 9, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -86,8 +94,16 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "e0d2ada7", + "execution_count": null, + "id": "ece8d8e5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "67ab6bf5", "metadata": {}, "outputs": [ { @@ -101,313 +117,475 @@ "data": { "application/vnd.vega.v5+json": { "$schema": "https://vega.github.io/schema/vega/v5.json", + "axes": [ + { + "labelOverlap": true, + "orient": "bottom", + "scale": "x", + "tickCount": { + "signal": "ceil(width/3)" + }, + "title": { + "signal": "x_name" + } + }, + { + "labelOverlap": true, + "orient": "left", + "scale": "y", + "tickCount": { + "signal": "ceil(height/3)" + }, + "title": { + "signal": "y_name" + } + } + ], "data": [ { - "name": "node-data", - "values": [ - { - "id": 0, - "label": "n0" - }, - { - "id": 1, - "label": "n1" - }, - { - "id": 2, - "label": "n2" - }, - { - "id": 3, - "label": "n3" - }, - { - "id": 4, - "label": "n4" - } - ] + "name": "points", + "values": "[{\"test4\":2.3389687606,\"test5\":0.8135953674},{\"test4\":2.6590271001,\"test5\":0.8008701805},{\"test4\":1.5129229361,\"test5\":0.4457111582},{\"test4\":1.5792187823,\"test5\":1.0142655819},{\"test4\":1.1095948425,\"test5\":0.5733811824},{\"test4\":2.0975157798,\"test5\":0.1534112432},{\"test4\":2.7084104667,\"test5\":2.3295966942},{\"test4\":0.7673074465,\"test5\":1.1011841738},{\"test4\":1.2916022411,\"test5\":1.6798882553},{\"test4\":2.2619399042,\"test5\":1.1336157932},{\"test4\":0.3490490415,\"test5\":2.6438989771},{\"test4\":2.369523497,\"test5\":0.0173215868},{\"test4\":1.409545432,\"test5\":2.8644457454},{\"test4\":0.6713249611,\"test5\":1.4244780962},{\"test4\":0.1995290119,\"test5\":0.2443084749},{\"test4\":2.009250694,\"test5\":0.0175584272},{\"test4\":1.7330245896,\"test5\":1.9141346469},{\"test4\":1.7095122416,\"test5\":0.4438142308},{\"test4\":2.2219451033,\"test5\":1.4426433642},{\"test4\":1.791603694,\"test5\":0.1059528426},{\"test4\":0.9976736508,\"test5\":2.3141953614},{\"test4\":0.3329174721,\"test5\":2.9381107853},{\"test4\":1.2378490977,\"test5\":0.5906726836},{\"test4\":1.9357938841,\"test5\":1.4413703738},{\"test4\":2.0795777934,\"test5\":1.5302922568},{\"test4\":1.9104009227,\"test5\":2.2640249273},{\"test4\":1.3427265772,\"test5\":1.3529534731},{\"test4\":0.6243170406,\"test5\":2.3369293035},{\"test4\":2.3196054845,\"test5\":0.6529682207},{\"test4\":0.4379418994,\"test5\":2.0458780632},{\"test4\":1.1110876532,\"test5\":2.5276283677},{\"test4\":1.7171992917,\"test5\":0.365961323},{\"test4\":2.2286924862,\"test5\":1.2884930194},{\"test4\":2.9636731127,\"test5\":1.3386296785},{\"test4\":0.5581887859,\"test5\":2.0154387421},{\"test4\":2.4237147704,\"test5\":1.7309904743},{\"test4\":1.5330007515,\"test5\":2.7450338213},{\"test4\":0.5926398152,\"test5\":0.2601606429},{\"test4\":2.812180343,\"test5\":1.2857042941},{\"test4\":2.873128607,\"test5\":0.1451823469},{\"test4\":0.4819888109,\"test5\":0.2048047378},{\"test4\":0.8609247717,\"test5\":1.0972223768},{\"test4\":1.8590556436,\"test5\":0.7894524992},{\"test4\":2.2176292392,\"test5\":0.8935714785},{\"test4\":0.6389085639,\"test5\":1.1659910188},{\"test4\":1.4302593762,\"test5\":0.470817026},{\"test4\":0.7352744897,\"test5\":0.6805254481},{\"test4\":2.2512617839,\"test5\":2.189420805},{\"test4\":2.9416590879,\"test5\":1.3487657259},{\"test4\":1.1982783015,\"test5\":0.3190258877},{\"test4\":0.258680436,\"test5\":1.4830344451},{\"test4\":0.3711074969,\"test5\":2.954386107},{\"test4\":1.2827942064,\"test5\":1.9168891227},{\"test4\":0.9064919469,\"test5\":2.5269335328},{\"test4\":1.0741613916,\"test5\":0.8028745748},{\"test4\":0.6803064717,\"test5\":1.4536172857},{\"test4\":1.5929456682,\"test5\":2.9292846673},{\"test4\":2.915067904,\"test5\":0.4514302463},{\"test4\":1.3420919367,\"test5\":2.6809294036},{\"test4\":0.2349473684,\"test5\":0.0294382082},{\"test4\":2.3193215735,\"test5\":0.678348888},{\"test4\":2.3824877179,\"test5\":2.928086999},{\"test4\":0.8153828838,\"test5\":2.7004967485},{\"test4\":1.8910190785,\"test5\":1.2285419434},{\"test4\":1.433852898,\"test5\":0.0720218565},{\"test4\":1.9979361969,\"test5\":1.173773258},{\"test4\":2.2055261698,\"test5\":2.39263459},{\"test4\":2.2018249135,\"test5\":1.6778292766},{\"test4\":2.2105904327,\"test5\":2.9360410422},{\"test4\":0.6425844405,\"test5\":2.1197513069},{\"test4\":0.388118192,\"test5\":2.3663092941},{\"test4\":0.399656878,\"test5\":0.9084511041},{\"test4\":2.5084152975,\"test5\":2.6823678454},{\"test4\":0.3359636684,\"test5\":2.958517299},{\"test4\":1.001495251,\"test5\":2.3272477655},{\"test4\":1.4292232351,\"test5\":1.9031796397},{\"test4\":1.5803799132,\"test5\":2.047472843},{\"test4\":0.6573489698,\"test5\":0.4850056588},{\"test4\":1.6404802787,\"test5\":2.6036623506},{\"test4\":1.5277439695,\"test5\":1.8232795582},{\"test4\":0.6505908459,\"test5\":0.9898401909},{\"test4\":2.8786042153,\"test5\":0.565570201},{\"test4\":0.6898245923,\"test5\":2.3044716285},{\"test4\":2.8000047146,\"test5\":2.7979682566},{\"test4\":2.6664899845,\"test5\":1.7664017917},{\"test4\":2.0439244494,\"test5\":2.9011884524},{\"test4\":0.1666099699,\"test5\":0.0000899551},{\"test4\":0.6689021089,\"test5\":0.0269741244},{\"test4\":2.3199668676,\"test5\":1.1715100677},{\"test4\":0.9318865658,\"test5\":0.702080737},{\"test4\":2.9961519277,\"test5\":1.8651330661},{\"test4\":2.229638752,\"test5\":0.5332356714},{\"test4\":0.7310253152,\"test5\":2.1742253292},{\"test4\":1.938257909,\"test5\":1.2598002619},{\"test4\":0.2268321785,\"test5\":1.6051635623},{\"test4\":0.7320925724,\"test5\":1.3185592757},{\"test4\":0.7082029917,\"test5\":1.5400348163},{\"test4\":0.8826482743,\"test5\":2.7594769883},{\"test4\":1.5060117976,\"test5\":2.8034319834},{\"test4\":2.7656685037,\"test5\":2.5497663169}]" }, { - "name": "link-data", - "values": [ - { - "source": 0, - "target": 1 - }, + "format": { + "type": "json" + }, + "name": "source_0", + "transform": [ { - "source": 0, - "target": 2 + "field": { + "signal": "x_name" + }, + "signal": "x_extent", + "type": "extent" }, { - "source": 0, - "target": 3 + "as": [ + "x_start", + "x_end" + ], + "extent": { + "signal": "x_extent" + }, + "field": { + "signal": "x_name" + }, + "maxbins": { + "signal": "bandwidthX" + }, + "signal": "x_bins", + "type": "bin" }, { - "source": 0, - "target": 4 + "field": { + "signal": "y_name" + }, + "signal": "y_extent", + "type": "extent" }, { - "source": 1, - "target": 4 + "as": [ + "y_start", + "y_end" + ], + "extent": { + "signal": "y_extent" + }, + "field": { + "signal": "y_name" + }, + "maxbins": { + "signal": "bandwidthY" + }, + "signal": "y_bins", + "type": "bin" }, { - "source": 3, - "target": 4 + "as": [ + "__count" + ], + "groupby": [ + "x_start", + "x_end", + "y_start", + "y_end" + ], + "ops": [ + "count" + ], + "type": "aggregate" } - ] + ], + "values": "[{\"test4\":2.3389687606,\"test5\":0.8135953674},{\"test4\":2.6590271001,\"test5\":0.8008701805},{\"test4\":1.5129229361,\"test5\":0.4457111582},{\"test4\":1.5792187823,\"test5\":1.0142655819},{\"test4\":1.1095948425,\"test5\":0.5733811824},{\"test4\":2.0975157798,\"test5\":0.1534112432},{\"test4\":2.7084104667,\"test5\":2.3295966942},{\"test4\":0.7673074465,\"test5\":1.1011841738},{\"test4\":1.2916022411,\"test5\":1.6798882553},{\"test4\":2.2619399042,\"test5\":1.1336157932},{\"test4\":0.3490490415,\"test5\":2.6438989771},{\"test4\":2.369523497,\"test5\":0.0173215868},{\"test4\":1.409545432,\"test5\":2.8644457454},{\"test4\":0.6713249611,\"test5\":1.4244780962},{\"test4\":0.1995290119,\"test5\":0.2443084749},{\"test4\":2.009250694,\"test5\":0.0175584272},{\"test4\":1.7330245896,\"test5\":1.9141346469},{\"test4\":1.7095122416,\"test5\":0.4438142308},{\"test4\":2.2219451033,\"test5\":1.4426433642},{\"test4\":1.791603694,\"test5\":0.1059528426},{\"test4\":0.9976736508,\"test5\":2.3141953614},{\"test4\":0.3329174721,\"test5\":2.9381107853},{\"test4\":1.2378490977,\"test5\":0.5906726836},{\"test4\":1.9357938841,\"test5\":1.4413703738},{\"test4\":2.0795777934,\"test5\":1.5302922568},{\"test4\":1.9104009227,\"test5\":2.2640249273},{\"test4\":1.3427265772,\"test5\":1.3529534731},{\"test4\":0.6243170406,\"test5\":2.3369293035},{\"test4\":2.3196054845,\"test5\":0.6529682207},{\"test4\":0.4379418994,\"test5\":2.0458780632},{\"test4\":1.1110876532,\"test5\":2.5276283677},{\"test4\":1.7171992917,\"test5\":0.365961323},{\"test4\":2.2286924862,\"test5\":1.2884930194},{\"test4\":2.9636731127,\"test5\":1.3386296785},{\"test4\":0.5581887859,\"test5\":2.0154387421},{\"test4\":2.4237147704,\"test5\":1.7309904743},{\"test4\":1.5330007515,\"test5\":2.7450338213},{\"test4\":0.5926398152,\"test5\":0.2601606429},{\"test4\":2.812180343,\"test5\":1.2857042941},{\"test4\":2.873128607,\"test5\":0.1451823469},{\"test4\":0.4819888109,\"test5\":0.2048047378},{\"test4\":0.8609247717,\"test5\":1.0972223768},{\"test4\":1.8590556436,\"test5\":0.7894524992},{\"test4\":2.2176292392,\"test5\":0.8935714785},{\"test4\":0.6389085639,\"test5\":1.1659910188},{\"test4\":1.4302593762,\"test5\":0.470817026},{\"test4\":0.7352744897,\"test5\":0.6805254481},{\"test4\":2.2512617839,\"test5\":2.189420805},{\"test4\":2.9416590879,\"test5\":1.3487657259},{\"test4\":1.1982783015,\"test5\":0.3190258877},{\"test4\":0.258680436,\"test5\":1.4830344451},{\"test4\":0.3711074969,\"test5\":2.954386107},{\"test4\":1.2827942064,\"test5\":1.9168891227},{\"test4\":0.9064919469,\"test5\":2.5269335328},{\"test4\":1.0741613916,\"test5\":0.8028745748},{\"test4\":0.6803064717,\"test5\":1.4536172857},{\"test4\":1.5929456682,\"test5\":2.9292846673},{\"test4\":2.915067904,\"test5\":0.4514302463},{\"test4\":1.3420919367,\"test5\":2.6809294036},{\"test4\":0.2349473684,\"test5\":0.0294382082},{\"test4\":2.3193215735,\"test5\":0.678348888},{\"test4\":2.3824877179,\"test5\":2.928086999},{\"test4\":0.8153828838,\"test5\":2.7004967485},{\"test4\":1.8910190785,\"test5\":1.2285419434},{\"test4\":1.433852898,\"test5\":0.0720218565},{\"test4\":1.9979361969,\"test5\":1.173773258},{\"test4\":2.2055261698,\"test5\":2.39263459},{\"test4\":2.2018249135,\"test5\":1.6778292766},{\"test4\":2.2105904327,\"test5\":2.9360410422},{\"test4\":0.6425844405,\"test5\":2.1197513069},{\"test4\":0.388118192,\"test5\":2.3663092941},{\"test4\":0.399656878,\"test5\":0.9084511041},{\"test4\":2.5084152975,\"test5\":2.6823678454},{\"test4\":0.3359636684,\"test5\":2.958517299},{\"test4\":1.001495251,\"test5\":2.3272477655},{\"test4\":1.4292232351,\"test5\":1.9031796397},{\"test4\":1.5803799132,\"test5\":2.047472843},{\"test4\":0.6573489698,\"test5\":0.4850056588},{\"test4\":1.6404802787,\"test5\":2.6036623506},{\"test4\":1.5277439695,\"test5\":1.8232795582},{\"test4\":0.6505908459,\"test5\":0.9898401909},{\"test4\":2.8786042153,\"test5\":0.565570201},{\"test4\":0.6898245923,\"test5\":2.3044716285},{\"test4\":2.8000047146,\"test5\":2.7979682566},{\"test4\":2.6664899845,\"test5\":1.7664017917},{\"test4\":2.0439244494,\"test5\":2.9011884524},{\"test4\":0.1666099699,\"test5\":0.0000899551},{\"test4\":0.6689021089,\"test5\":0.0269741244},{\"test4\":2.3199668676,\"test5\":1.1715100677},{\"test4\":0.9318865658,\"test5\":0.702080737},{\"test4\":2.9961519277,\"test5\":1.8651330661},{\"test4\":2.229638752,\"test5\":0.5332356714},{\"test4\":0.7310253152,\"test5\":2.1742253292},{\"test4\":1.938257909,\"test5\":1.2598002619},{\"test4\":0.2268321785,\"test5\":1.6051635623},{\"test4\":0.7320925724,\"test5\":1.3185592757},{\"test4\":0.7082029917,\"test5\":1.5400348163},{\"test4\":0.8826482743,\"test5\":2.7594769883},{\"test4\":1.5060117976,\"test5\":2.8034319834},{\"test4\":2.7656685037,\"test5\":2.5497663169}]" } ], - "description": "A node-link diagram with force-directed layout.", - "height": 300, + "height": 200, "legends": [ { - "stroke": "color", - "symbolType": "stroke", - "title": "Group" + "fill": "color", + "gradientLength": { + "signal": "height - 16" + }, + "title": "Count of Records" } ], "marks": [ { "encode": { - "enter": { + "update": { "fill": { - "field": "group", + "field": "__count", "scale": "color" }, - "stroke": { - "value": "white" - } - }, - "update": { - "cursor": { - "value": "pointer" + "x": { + "field": "x_end", + "scale": "x" }, - "size": { - "signal": "2 * nodeRadius * nodeRadius" + "x2": { + "field": "x_start", + "scale": "x" + }, + "y": { + "field": "y_end", + "scale": "y" + }, + "y2": { + "field": "y_start", + "scale": "y" } } }, "from": { - "data": "node-data" + "data": "source_0" }, - "name": "nodes", - "on": [ - { - "modify": "node", - "trigger": "fix", - "values": "fix === true ? {fx: node.x, fy: node.y} : {fx: fix[0], fy: fix[1]}" - }, - { - "modify": "node", - "trigger": "!fix", - "values": "{fx: null, fy: null}" - } + "name": "marks", + "style": [ + "rect" ], - "transform": [ - { - "forces": [ - { - "force": "center", - "x": { - "signal": "cx" - }, - "y": { - "signal": "cy" - } - }, - { - "force": "collide", - "radius": { - "signal": "nodeRadius" - } - }, - { - "force": "nbody", - "strength": { - "signal": "nodeCharge" - } - }, - { - "distance": { - "signal": "linkDistance" - }, - "force": "link", - "links": "link-data" - } - ], - "iterations": 300, - "restart": { - "signal": "restart" - }, - "signal": "force", - "static": { - "signal": "static" - }, - "type": "force" - } - ], - "type": "symbol", - "zindex": 1 + "type": "rect" }, { "encode": { "enter": { - "align": { - "value": "center" - }, - "baseline": { - "value": "middle" - }, "fill": { "value": "black" }, - "fontSize": { - "value": 15 - }, - "text": { - "field": "datum.label" + "fillOpacity": { + "value": 1 } }, "update": { + "size": { + "value": 10 + }, "x": { - "field": "x" + "field": { + "signal": "x_name" + }, + "scale": "x" }, "y": { - "field": "y" + "field": { + "signal": "y_name" + }, + "scale": "y" } } }, "from": { - "data": "nodes" + "data": "points" }, - "interactive": false, - "name": "labels", - "transform": [ + "type": "symbol" + } + ], + "scales": [ + { + "bins": { + "signal": "x_bins" + }, + "domain": { + "signal": "[x_bins.start, x_bins.stop]" + }, + "name": "x", + "range": [ + 0, { - "as": "y", - "expr": "datum.y", - "type": "formula" + "signal": "width" } ], - "type": "text", - "zindex": 2 + "type": "linear", + "zero": false }, { - "encode": { - "update": { - "stroke": { - "value": "#ccc" - }, - "strokeWidth": { - "value": 0.5 - } - } + "bins": { + "signal": "y_bins" }, - "from": { - "data": "link-data" + "domain": { + "signal": "[y_bins.start, y_bins.stop]" }, - "interactive": false, - "transform": [ + "name": "y", + "range": [ { - "require": { - "signal": "force" - }, - "shape": "line", - "sourceX": "datum.source.x", - "sourceY": "datum.source.y", - "targetX": "datum.target.x", - "targetY": "datum.target.y", - "type": "linkpath" - } + "signal": "height" + }, + 0 ], - "type": "path" - } - ], - "padding": 0, - "scales": [ + "type": "linear", + "zero": false + }, { "domain": { - "data": "node-data", - "field": "group" + "data": "source_0", + "field": "__count" }, + "interpolate": "hcl", "name": "color", - "range": { - "scheme": "category20c" - }, - "type": "ordinal" + "range": "heatmap", + "type": "linear", + "zero": false } ], "signals": [ { - "name": "cx", - "update": "width / 2" + "bind": { + "input": "range", + "max": 100, + "min": 1, + "step": 1 + }, + "name": "bandwidthX", + "value": 4 }, { - "name": "cy", - "update": "height / 2" + "bind": { + "input": "range", + "max": 100, + "min": 1, + "step": 1 + }, + "name": "bandwidthY", + "value": 4 }, { - "name": "nodeRadius", - "value": 15 + "bind": { + "input": "text" + }, + "name": "x_name", + "value": "test4" }, { - "name": "nodeCharge", - "value": -80 - }, + "bind": { + "input": "text" + }, + "name": "y_name", + "value": "test5" + } + ], + "width": 300 + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "df = pd.DataFrame(3*np.random.random((100, 2)), columns=['test4', 'test5'])\n", + "schema = plots.heatmap_scatter(data = df, x_bin=4, y_bin=4, x_name = \"test4\", y_name = \"test5\")\n", + "plots.save_schema(schema, \"_schema.json\")\n", + "plots.ipy_display(schema, format=\"interactive\")" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "6e083016", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "application/vnd.vega.v5+json": { + "$schema": "https://vega.github.io/schema/vega/v5.json", + "axes": [ { - "name": "linkDistance", - "value": 80 + "labelOverlap": true, + "orient": "bottom", + "scale": "x", + "tickCount": { + "signal": "ceil(width/3)" + }, + "title": "gamma" }, { - "bind": { - "input": "checkbox" + "labelOverlap": true, + "orient": "left", + "scale": "y", + "tickCount": { + "signal": "ceil(height/3)" }, - "name": "static", - "value": true + "title": "alpha" + } + ], + "data": [ + { + "name": "points", + "values": "[{\"alpha\":2.4941097556,\"gamma\":0.491877337},{\"alpha\":5.4916487786,\"gamma\":8.9050898135},{\"alpha\":6.1883209755,\"gamma\":5.3498343783},{\"alpha\":4.7133538111,\"gamma\":5.07601772},{\"alpha\":6.9510067267,\"gamma\":3.9905130078},{\"alpha\":6.1436310303,\"gamma\":6.5355283235},{\"alpha\":3.8140624404,\"gamma\":7.4253065041},{\"alpha\":2.0901248133,\"gamma\":4.4082673612},{\"alpha\":1.4948496831,\"gamma\":3.9158741426},{\"alpha\":5.7927646405,\"gamma\":3.665035212},{\"alpha\":7.5689618602,\"gamma\":3.0024591588},{\"alpha\":7.6967120977,\"gamma\":5.5251144463},{\"alpha\":8.9068707812,\"gamma\":5.3789684996},{\"alpha\":2.3915918903,\"gamma\":0.8804195483},{\"alpha\":4.810426372,\"gamma\":9.2174218496},{\"alpha\":8.0711734137,\"gamma\":6.861215942},{\"alpha\":6.8742253919,\"gamma\":0.6237200955},{\"alpha\":3.616352471,\"gamma\":1.137751595},{\"alpha\":4.5889754774,\"gamma\":3.7952866961},{\"alpha\":7.6747519139,\"gamma\":5.4623798626},{\"alpha\":1.8371159758,\"gamma\":1.7979114859},{\"alpha\":9.5101526501,\"gamma\":2.3681349063},{\"alpha\":8.8762298248,\"gamma\":5.6173989327},{\"alpha\":8.4458152765,\"gamma\":5.4789692721},{\"alpha\":0.5936206976,\"gamma\":2.7935126434},{\"alpha\":0.9399608247,\"gamma\":2.9486668502},{\"alpha\":8.8730104638,\"gamma\":3.0060695262},{\"alpha\":3.0482532488,\"gamma\":0.7507204902},{\"alpha\":2.7009099059,\"gamma\":6.9156236518},{\"alpha\":2.990995151,\"gamma\":5.0533098116},{\"alpha\":3.1705942034,\"gamma\":1.4672552159},{\"alpha\":8.0614988123,\"gamma\":2.2679368597},{\"alpha\":7.3581516116,\"gamma\":6.6820747045},{\"alpha\":4.7862411516,\"gamma\":1.9564610407},{\"alpha\":9.6320292894,\"gamma\":9.3978368623},{\"alpha\":0.1676171314,\"gamma\":8.5451876965},{\"alpha\":8.2748094882,\"gamma\":3.189858448},{\"alpha\":6.645866501,\"gamma\":3.2291098604},{\"alpha\":0.7263678212,\"gamma\":9.8736277711},{\"alpha\":7.8070406313,\"gamma\":5.0209342594},{\"alpha\":7.6395777059,\"gamma\":0.7078412009},{\"alpha\":3.82521828,\"gamma\":6.4122752046},{\"alpha\":8.9071189295,\"gamma\":4.3306041868},{\"alpha\":2.3144892359,\"gamma\":0.2914232245},{\"alpha\":6.8334065573,\"gamma\":3.1138831339},{\"alpha\":3.1762943228,\"gamma\":0.2760065385},{\"alpha\":1.7191606598,\"gamma\":3.8809438152},{\"alpha\":3.3716516674,\"gamma\":7.295586763},{\"alpha\":7.2307718636,\"gamma\":7.37477227},{\"alpha\":9.9772154144,\"gamma\":8.5787824983},{\"alpha\":9.7801721291,\"gamma\":6.993086164},{\"alpha\":4.0729674836,\"gamma\":6.2961698534},{\"alpha\":7.0760340847,\"gamma\":4.8946589306},{\"alpha\":4.0149378353,\"gamma\":6.2901621882},{\"alpha\":8.5456074673,\"gamma\":8.4753218054},{\"alpha\":2.3830719609,\"gamma\":2.053266005},{\"alpha\":2.2300239309,\"gamma\":3.5170155564},{\"alpha\":3.4145378956,\"gamma\":8.9175758379},{\"alpha\":7.0590733107,\"gamma\":2.4109639597},{\"alpha\":7.6135401028,\"gamma\":5.3587524014},{\"alpha\":7.5307127842,\"gamma\":2.3061359148},{\"alpha\":5.8493829052,\"gamma\":7.1777874375},{\"alpha\":5.6631203078,\"gamma\":5.9376530785},{\"alpha\":0.0396541392,\"gamma\":0.6871877632},{\"alpha\":2.9158901497,\"gamma\":0.5277294823},{\"alpha\":1.7390143669,\"gamma\":0.444961612},{\"alpha\":3.1793547476,\"gamma\":4.9615190538},{\"alpha\":7.3884184561,\"gamma\":7.927064496},{\"alpha\":4.5427318595,\"gamma\":3.5978711305},{\"alpha\":8.0158769277,\"gamma\":1.0399950251},{\"alpha\":6.0271425982,\"gamma\":3.7793291324},{\"alpha\":1.8198310623,\"gamma\":3.8102700274},{\"alpha\":1.5756943826,\"gamma\":9.7159209617},{\"alpha\":8.6255444448,\"gamma\":1.7088630709},{\"alpha\":9.8493764961,\"gamma\":5.0024870729},{\"alpha\":0.6498726295,\"gamma\":9.3333765068},{\"alpha\":0.6844310284,\"gamma\":8.9711999664},{\"alpha\":2.264712023,\"gamma\":4.7933726764},{\"alpha\":6.9167568633,\"gamma\":4.651737349},{\"alpha\":9.838691601,\"gamma\":5.7428742443},{\"alpha\":4.6197930688,\"gamma\":4.6284123258},{\"alpha\":5.5700571171,\"gamma\":0.5972053814},{\"alpha\":8.2028413893,\"gamma\":4.6035276279},{\"alpha\":2.7748939158,\"gamma\":6.3093007455},{\"alpha\":9.4974376085,\"gamma\":9.2595294571},{\"alpha\":3.1865525749,\"gamma\":8.8588040935},{\"alpha\":8.9274052928,\"gamma\":0.265350536},{\"alpha\":6.807803729,\"gamma\":7.3597290815},{\"alpha\":6.9678846986,\"gamma\":8.2881803482},{\"alpha\":3.8908313907,\"gamma\":4.1382519359},{\"alpha\":9.8205244882,\"gamma\":3.9370654163},{\"alpha\":7.322692264,\"gamma\":3.5530622598},{\"alpha\":9.43865899,\"gamma\":1.5541987867},{\"alpha\":8.9567845315,\"gamma\":3.8672708871},{\"alpha\":0.4816832432,\"gamma\":3.3268481028},{\"alpha\":4.4864633384,\"gamma\":8.7009567727},{\"alpha\":0.3118255398,\"gamma\":9.6427688565},{\"alpha\":9.7988478899,\"gamma\":9.4367764659},{\"alpha\":5.348588812,\"gamma\":7.6886534111},{\"alpha\":6.5146158684,\"gamma\":7.9278194852}]" }, { - "description": "State variable for active node fix status.", - "name": "fix", - "on": [ - { - "events": "symbol:mouseout[!event.buttons], window:mouseup", - "update": "false" - }, - { - "events": "symbol:mouseover", - "update": "fix || true" - }, - { - "events": "[symbol:mousedown, window:mouseup] > window:mousemove!", - "force": true, - "update": "xy()" + "format": { + "type": "json" + }, + "name": "mesh", + "values": "[{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":0.0},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":1.2345679012},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":4.9382716049},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":11.1111111111},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":19.7530864198},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":30.8641975309},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":44.4444444444},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":60.4938271605},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":79.012345679},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":-0.5555555556,\"y_end\":0.5555555556,\"__count\":100.0},{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":1.2345679012},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":2.4691358025},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":6.1728395062},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":12.3456790123},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":20.987654321},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":32.0987654321},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":45.6790123457},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":61.7283950617},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":80.2469135802},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":0.5555555556,\"y_end\":1.6666666667,\"__count\":101.2345679012},{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":4.9382716049},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":6.1728395062},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":9.8765432099},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":16.049382716},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":24.6913580247},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":35.8024691358},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":49.3827160494},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":65.4320987654},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":83.950617284},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":1.6666666667,\"y_end\":2.7777777778,\"__count\":104.9382716049},{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":11.1111111111},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":12.3456790123},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":16.049382716},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":22.2222222222},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":30.8641975309},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":41.975308642},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":55.5555555556},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":71.6049382716},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":90.1234567901},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":2.7777777778,\"y_end\":3.8888888889,\"__count\":111.1111111111},{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":19.7530864198},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":20.987654321},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":24.6913580247},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":30.8641975309},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":39.5061728395},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":50.6172839506},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":64.1975308642},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":80.2469135802},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":98.7654320988},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":3.8888888889,\"y_end\":5.0,\"__count\":119.7530864198},{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":30.8641975309},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":32.0987654321},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":35.8024691358},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":41.975308642},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":50.6172839506},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":61.7283950617},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":75.3086419753},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":91.3580246914},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":109.8765432099},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":5.0,\"y_end\":6.1111111111,\"__count\":130.8641975309},{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":44.4444444444},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":45.6790123457},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":49.3827160494},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":55.5555555556},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":64.1975308642},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":75.3086419753},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":88.8888888889},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":104.9382716049},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":123.4567901235},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":6.1111111111,\"y_end\":7.2222222222,\"__count\":144.4444444444},{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":60.4938271605},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":61.7283950617},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":65.4320987654},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":71.6049382716},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":80.2469135802},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":91.3580246914},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":104.9382716049},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":120.987654321},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":139.5061728395},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":7.2222222222,\"y_end\":8.3333333333,\"__count\":160.4938271605},{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":79.012345679},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":80.2469135802},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":83.950617284},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":90.1234567901},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":98.7654320988},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":109.8765432099},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":123.4567901235},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":139.5061728395},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":158.024691358},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":8.3333333333,\"y_end\":9.4444444444,\"__count\":179.012345679},{\"x_start\":-0.5555555556,\"x_end\":0.5555555556,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":100.0},{\"x_start\":0.5555555556,\"x_end\":1.6666666667,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":101.2345679012},{\"x_start\":1.6666666667,\"x_end\":2.7777777778,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":104.9382716049},{\"x_start\":2.7777777778,\"x_end\":3.8888888889,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":111.1111111111},{\"x_start\":3.8888888889,\"x_end\":5.0,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":119.7530864198},{\"x_start\":5.0,\"x_end\":6.1111111111,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":130.8641975309},{\"x_start\":6.1111111111,\"x_end\":7.2222222222,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":144.4444444444},{\"x_start\":7.2222222222,\"x_end\":8.3333333333,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":160.4938271605},{\"x_start\":8.3333333333,\"x_end\":9.4444444444,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":179.012345679},{\"x_start\":9.4444444444,\"x_end\":10.5555555556,\"y_start\":9.4444444444,\"y_end\":10.5555555556,\"__count\":200.0}]" + } + ], + "height": 200, + "legends": [ + { + "fill": "color", + "gradientLength": { + "signal": "height - 16" + }, + "title": "Histogram Values" + } + ], + "marks": [ + { + "encode": { + "update": { + "fill": { + "field": "__count", + "scale": "color" + }, + "x": { + "field": "x_end", + "scale": "x" + }, + "x2": { + "field": "x_start", + "scale": "x" + }, + "y": { + "field": "y_end", + "scale": "y" + }, + "y2": { + "field": "y_start", + "scale": "y" + } } + }, + "from": { + "data": "mesh" + }, + "name": "marks", + "style": [ + "rect" ], - "value": false + "type": "rect" }, { - "description": "Graph node most recently interacted with.", - "name": "node", - "on": [ + "encode": { + "enter": { + "fill": { + "value": "black" + }, + "fillOpacity": { + "value": 1 + } + }, + "update": { + "size": { + "value": 10 + }, + "x": { + "field": "gamma", + "scale": "x" + }, + "y": { + "field": "alpha", + "scale": "y" + } + } + }, + "from": { + "data": "points" + }, + "type": "symbol" + } + ], + "scales": [ + { + "domain": { + "fields": [ + { + "data": "points", + "field": "gamma" + }, + { + "data": "mesh", + "field": "x_start" + }, + { + "data": "mesh", + "field": "y_end" + } + ] + }, + "name": "x", + "range": [ + 0, { - "events": "symbol:mouseover", - "update": "fix === true ? item() : node" + "signal": "width" } ], - "value": null + "type": "linear" }, { - "description": "Flag to restart Force simulation upon data changes.", - "name": "restart", - "on": [ - { - "events": { - "signal": "fix" + "domain": { + "fields": [ + { + "data": "points", + "field": "alpha" }, - "update": "fix && fix.length" - } + { + "data": "mesh", + "field": "y_start" + }, + { + "data": "mesh", + "field": "y_end" + } + ] + }, + "name": "y", + "range": [ + { + "signal": "height" + }, + 0 ], - "value": false + "type": "linear" + }, + { + "domain": { + "data": "mesh", + "field": "__count" + }, + "interpolate": "hcl", + "name": "color", + "range": "heatmap", + "type": "linear", + "zero": false } ], "width": 300 @@ -418,20 +596,30 @@ } ], "source": [ - "g = nx.generators.barabasi_albert_graph(5, 3)\n", - "nx.set_node_attributes(g, {k:f\"n{i}\" for i, k in enumerate(g.nodes)}, \"label\")\n", - "schema = plots.spring_force_graph(g, node_labels=\"label\")\n", + "import numpy as np\n", + "import pandas as pd\n", + "from pyciemss.visuals import plots, vega\n", + "\n", + "def create_fake_data():\n", + " nx, ny = (10, 10)\n", + " x = np.linspace(0, 10, nx)\n", + " y, a = np.linspace(0, 10, ny, retstep = True)\n", + "\n", + " # create mesh data\n", + " xv, yv = np.meshgrid(x, y)\n", + " zz = xv**2 + yv**2\n", + "\n", + " # create scatter plot\n", + " df = pd.DataFrame(10*np.random.random((100, 2)), columns=['alpha', 'gamma'])\n", + " return (xv, yv, zz), df\n", + "\n", + "mesh_data, scatter_data = create_fake_data()\n", + "\n", + "\n", + "schema = plots.mesh_scatter(mesh_data = mesh_data, scatter_data = scatter_data)\n", "plots.save_schema(schema, \"_schema.json\")\n", "plots.ipy_display(schema, format=\"interactive\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ece8d8e5", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/src/pyciemss/visuals/graphs.py b/src/pyciemss/visuals/graphs.py index b152753af..69c93840f 100644 --- a/src/pyciemss/visuals/graphs.py +++ b/src/pyciemss/visuals/graphs.py @@ -71,4 +71,10 @@ def spring_force_graph( labels = vega.find_named(schema["marks"], "labels") labels["encode"]["enter"]["text"]["field"] = f"datum.{node_labels}" + if not directed_graph: + schema["marks"] = vega.delete_named(schema["marks"], "arrows") + return schema + + + diff --git a/src/pyciemss/visuals/histogram.py b/src/pyciemss/visuals/histogram.py index adea277b7..5f69a2239 100644 --- a/src/pyciemss/visuals/histogram.py +++ b/src/pyciemss/visuals/histogram.py @@ -81,3 +81,81 @@ def as_value_list(label, data): return schema, pd.DataFrame(desc).set_index(["bin0", "bin1"]) else: return schema + + + +def heatmap_scatter( + data: pd.DataFrame, + x_name: str = "x_name", + y_name: str = "y_name", + x_bin: int = 10, + y_bin: int = 10 +) -> vega.VegaSchema: + """ + **data -- Datasets as pandas dataframe, should contain x_name and y_name, + x_name: str name of column in dataset for x axis, + y_name: str, name of column in dataset for y axis, + x_bin: int = 10, max bins by x axis, + y_bin: int = 10, max bins by y axis, + """ + json_dict = data.to_json(orient = 'records') + schema = vega.load_schema("heatmap_scatter.vg.json") + + schema["data"] = vega.replace_named_with(schema["data"], "points", ["values"], json_dict) + + schema["data"] = vega.replace_named_with(schema["data"], "source_0", ["values"], json_dict) + + schema["signals"] = vega.replace_named_with( + schema["signals"], "bandwidthX", ["value"], x_bin + ) + schema["signals"] = vega.replace_named_with( + schema["signals"], "bandwidthY", ["value"], y_bin + ) + schema["signals"] = vega.replace_named_with( + schema["signals"], "x_name", ["value"], x_name + ) + + schema["signals"] = vega.replace_named_with( + schema["signals"], "y_name", ["value"], y_name + ) + + return schema + + + +def mesh_scatter( + mesh_data, + scatter_data: pd.DataFrame, +) -> vega.VegaSchema: + """ + **mesh_data -- input as mesh data, will be converted to grids + **scatter_data -- with alpha and gamma data + """ + + schema = vega.load_schema("mesh_scatter.vg.json") + + def mesh_to_heatmap(mesh_data): + """ + **mesh_data -- input as mesh data, will be converted to grids + adding half the difference in grid spacing to each coordinate + so point becomes center of a grid for heatmap + """ + xv, yv, zz = mesh_data + half_spacing_x = (xv[0, 1] - xv[0, 0])/2 + half_spacing_y = (yv[1, 0] - yv[0, 0])/2 + dataset = pd.DataFrame({"x_start": xv.ravel() - half_spacing_x, \ + "x_end": xv.ravel() + half_spacing_x, \ + "y_start": yv.ravel() - half_spacing_y, + "y_end": yv.ravel() + half_spacing_y, + '__count': zz.ravel()}) + return dataset.to_json(orient="records") + + # convert to json + json_heatmap = mesh_to_heatmap(mesh_data) + json_scatter = scatter_data.to_json(orient="records") + + # update data in schema + schema["data"] = vega.replace_named_with(schema["data"], "points", ["values"], json_scatter) + schema["data"] = vega.replace_named_with(schema["data"], "mesh", ["values"], json_heatmap) + + return schema \ No newline at end of file diff --git a/src/pyciemss/visuals/plots.py b/src/pyciemss/visuals/plots.py index c40895dde..ce57253f6 100644 --- a/src/pyciemss/visuals/plots.py +++ b/src/pyciemss/visuals/plots.py @@ -9,7 +9,7 @@ from .barycenter import triangle_contour from .trajectories import trajectories from .calibration import calibration -from .histogram import histogram_multi +from .histogram import histogram_multi, heatmap_scatter, mesh_scatter from .graphs import attributed_graph, spring_force_graph @@ -26,6 +26,8 @@ histogram_multi, attributed_graph, spring_force_graph, + heatmap_scatter, + mesh_scatter ] diff --git a/src/pyciemss/visuals/schemas/heatmap_scatter.vg.json b/src/pyciemss/visuals/schemas/heatmap_scatter.vg.json new file mode 100644 index 000000000..861186b14 --- /dev/null +++ b/src/pyciemss/visuals/schemas/heatmap_scatter.vg.json @@ -0,0 +1,191 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "width": 300, + "height": 200, + "signals": [ + { + "name": "bandwidthX", "value": 3, + "bind": {"input": "range", "min": 1, "max": 100, "step": 1} + }, + { + "name": "bandwidthY", "value": 3, + "bind": {"input": "range", "min": 1, "max": 100, "step": 1} + }, + { "name": "x_name", "value": "x_value", + "bind": {"input": "text"} + }, + + { "name": "y_name", "value": "y_value", + "bind": {"input": "text"} + } + ], + "data": [ + { + "name": "points", + "values": [ + {"x_value": 2, "y_value": 10}, + {"x_value": 3, "y_value": 5}, + {"x_value": 3, "y_value": 5}, + {"x_value": 10, "y_value": 6}, + {"x_value": 2, "y_value": 3}, + {"x_value": 4, "y_value": 10}, + {"x_value": 3, "y_value": 1} + ] + }, + { + "name": "source_0", + "values": [ + {"x_value": 2, "y_value": 10}, + {"x_value": 3, "y_value": 5}, + {"x_value": 3, "y_value": 5}, + {"x_value": 2, "y_value": 3}, + {"x_value": 4, "y_value": 10}, + {"x_value": 3, "y_value": 1} + ], + "format": {"type": "json"}, + "transform": [ + + { + "type": "extent", + "field": {"signal": "x_name"}, + "signal": "x_extent" + }, + { + "type": "bin", + "field": {"signal": "x_name"}, + "as": [ + "x_start", + "x_end" + ], + "signal": "x_bins", + "extent": {"signal": "x_extent"}, + "maxbins": {"signal": "bandwidthX"} + }, + { + "type": "extent", + "field": {"signal": "y_name"}, + "signal": "y_extent" + }, + { + "type": "bin", + "field": {"signal": "y_name"}, + "as": [ + "y_start", + "y_end" + ], + "signal": "y_bins", + "extent": {"signal": "y_extent"}, + "maxbins": {"signal": "bandwidthY"} + }, + { + "type": "aggregate", + "groupby": [ + "x_start", + "x_end", + "y_start", + "y_end" + ], + "ops": ["count"], + "as": ["__count"] + } + ] + } + ], + "marks": [ + { + "name": "marks", + "type": "rect", + "style": ["rect"], + "from": {"data": "source_0"}, + "encode": { + "update": { + "fill": {"scale": "color", "field": "__count"}, + "x2": { + "scale": "x", + "field": "x_start" + }, + "x": { + "scale": "x", + "field": "x_end" + }, + "y2": { + "scale": "y", + "field": "y_start" + }, + "y": { + "scale": "y", + "field": "y_end" + } + } + } + }, + { + "type": "symbol", + "from": {"data": "points"}, + "encode": { + "enter": { + "fillOpacity": {"value": 1}, + "fill": {"value": "black"} + }, + "update": { + "x": {"scale": "x", "field" : {"signal": "x_name"}}, + "y": {"scale": "y", "field" : {"signal": "y_name"}}, + "size": {"value": 10} + } + } + } + ], + "scales": [ + { + "name": "x", + "type": "linear", + "domain": { + "signal": "[x_bins.start, x_bins.stop]" + }, + "range": [0, {"signal": "width"}], + "bins": {"signal": "x_bins"}, + "zero": false + }, + { + "name": "y", + "type": "linear", + "domain": { + "signal": "[y_bins.start, y_bins.stop]" + }, + "range": [{"signal": "height"}, 0], + "bins": {"signal": "y_bins"}, + "zero": false + }, + { + "name": "color", + "type": "linear", + "domain": {"data": "source_0", "field": "__count"}, + "range": "heatmap", + "interpolate": "hcl", + "zero": false + } + ], + "axes": [ + { + "scale": "x", + "orient": "bottom", + "title": {"signal": "x_name"}, + "labelOverlap": true, + "tickCount": {"signal": "ceil(width/3)"} + }, + { + "scale": "y", + "orient": "left", + "title": {"signal": "y_name"}, + "labelOverlap": true, + "tickCount": {"signal": "ceil(height/3)"} + } + ], + "legends": [ + { + "fill": "color", + "gradientLength": {"signal": "height - 16"}, + "title": "Count of Records" + } + ] +} \ No newline at end of file diff --git a/src/pyciemss/visuals/schemas/mesh_scatter.vg.json b/src/pyciemss/visuals/schemas/mesh_scatter.vg.json new file mode 100644 index 000000000..d538a91d9 --- /dev/null +++ b/src/pyciemss/visuals/schemas/mesh_scatter.vg.json @@ -0,0 +1,125 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "width": 300, + "height": 200, + "data": [ + { + "name": "points", + "values": [ + {"gamma": 2, "alpha": 10}, + {"gamma": 3, "alpha": 5}, + {"gamma": 3, "alpha": 5}, + {"gamma": 10, "alpha": 6}, + {"gamma": 2, "alpha": 3}, + {"gamma": 4, "alpha": 10}, + {"gamma": 3, "alpha": 1} + ] + }, + { + "name": "mesh", + "values": [{"x_start":-0.5555555556,"x_end":0.5555555556,"y_start":0.5555555556, "y_end": 1, "__count":0.0}, + {"x_start":0.5555555556,"x_end":1.6666666667,"y_start":0.5555555556, "y_end": 1, "__count":1.1111111111}, + {"x_start":1.6666666667,"x_end":2.7777777778,"y_start":0.5555555556, "y_end": 1, "__count":2.2222222222} + ], + "format": {"type": "json"} + + } + ], + "marks": [ + { + "name": "marks", + "type": "rect", + "style": ["rect"], + "from": {"data": "mesh"}, + "encode": { + "update": { + "fill": {"scale": "color", "field": "__count"}, + "x2": { + "scale": "x", + "field": "x_start" + }, + "x": { + "scale": "x", + "field": "x_end" + }, + "y2": { + "scale": "y", + "field": "y_start" + }, + "y": { + "scale": "y", + "field": "y_end" + } + } + } + }, + { + "type": "symbol", + "from": {"data": "points"}, + "encode": { + "enter": { + "fillOpacity": {"value": 1}, + "fill": {"value": "black"} + }, + "update": { + "x": {"scale": "x", "field" : "gamma"}, + "y": {"scale": "y", "field" : "alpha"}, + "size": {"value": 10} + } + } + } + ], + "scales": [ + { + "name": "x", + "type": "linear", + "domain": + {"fields": [ + {"data": "points", "field": "gamma"}, + {"data": "mesh", "field": "x_start"}, + {"data": "mesh", "field": "y_end"}]}, + "range": [0, {"signal": "width"}] + }, + { + "name": "y", + "type": "linear", + "domain": + {"fields": [ + {"data": "points", "field": "alpha"}, + {"data": "mesh", "field": "y_start"}, + {"data": "mesh", "field": "y_end"}]}, + "range": [{"signal": "height"}, 0] + }, + { + "name": "color", + "type": "linear", + "domain": {"data": "mesh", "field": "__count"}, + "range": "heatmap", + "interpolate": "hcl", + "zero": false + } + ], + "axes": [ + { + "scale": "x", + "orient": "bottom", + "title": "gamma", + "labelOverlap": true, + "tickCount": {"signal": "ceil(width/3)"} + }, + { + "scale": "y", + "orient": "left", + "title": "alpha", + "labelOverlap": true, + "tickCount": {"signal": "ceil(height/3)"} + } + ], + "legends": [ + { + "fill": "color", + "gradientLength": {"signal": "height - 16"}, + "title": "Histogram Values" + } + ] +} \ No newline at end of file