diff --git a/html/CONTRIBUTING.html b/html/CONTRIBUTING.html index 1744013d..c7c82dfe 100644 --- a/html/CONTRIBUTING.html +++ b/html/CONTRIBUTING.html @@ -237,7 +237,7 @@

GitHub Workflows -
  • Client library push: The version must be set in client/setup.py

  • +
  • Client library push: The ‘version’ and the ‘install_requires’ must be set in client/setup.py (‘install_requires’ should match the list of library in requirements.txt).

  • Helm chart push: The chart version (version) and app version (AppVersion) of the server and the client must be updated in server/deploy/helm/charts/lomas_server/Chart.ymland client/deploy/helm/charts/lomas_client/Chart.yaml.

  • Documentation push: If a new version is released, it must be added to the docs/versions.yaml file. For more details on the generation of the documentation, please refer to docs and the docs/build_docs.py script.

  • @@ -366,7 +366,7 @@

    Adding a Data Connector (for private dataset in various databases)v0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/CONTRIBUTING_CLIENT.html b/html/CONTRIBUTING_CLIENT.html index 87478b29..f4df024b 100644 --- a/html/CONTRIBUTING_CLIENT.html +++ b/html/CONTRIBUTING_CLIENT.html @@ -173,7 +173,7 @@

    Pushing a new version to Pypiv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/CONTRIBUTING_SERVER.html b/html/CONTRIBUTING_SERVER.html index 3a9a4465..dc9c55d3 100644 --- a/html/CONTRIBUTING_SERVER.html +++ b/html/CONTRIBUTING_SERVER.html @@ -169,7 +169,7 @@

    Testsv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/_modules/index.html b/html/_modules/index.html index 5b07dd6e..9f7ce498 100644 --- a/html/_modules/index.html +++ b/html/_modules/index.html @@ -156,7 +156,7 @@

    All modules for which code is available

    v0.3.0
    -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/_modules/lomas_client/client.html b/html/_modules/lomas_client/client.html index 256f1747..c8e268a5 100644 --- a/html/_modules/lomas_client/client.html +++ b/html/_modules/lomas_client/client.html @@ -989,7 +989,7 @@

    Source code for lomas_client.client

             
               
    v0.3.0
    -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/_modules/lomas_client/utils.html b/html/_modules/lomas_client/utils.html index 00c9aee3..701dde1f 100644 --- a/html/_modules/lomas_client/utils.html +++ b/html/_modules/lomas_client/utils.html @@ -210,7 +210,7 @@

    Source code for lomas_client.utils

             
               
    v0.3.0
    -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/_modules/lomas_server/constants.html b/html/_modules/lomas_server/constants.html index bf776803..7925c9bb 100644 --- a/html/_modules/lomas_server/constants.html +++ b/html/_modules/lomas_server/constants.html @@ -477,7 +477,7 @@

    Source code for lomas_server.constants

             
               
    v0.3.0
    -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/_modules/lomas_server/dataset_store/data_connector_observer.html b/html/_modules/lomas_server/dataset_store/data_connector_observer.html index cd8ca5a9..800535f5 100644 --- a/html/_modules/lomas_server/dataset_store/data_connector_observer.html +++ b/html/_modules/lomas_server/dataset_store/data_connector_observer.html @@ -170,7 +170,7 @@

    Source code for lomas_server.dataset_store.data_connector_observer

    v0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/_modules/lomas_server/utils/collection_models.html b/html/_modules/lomas_server/utils/collection_models.html index d048a40d..c8f55d74 100644 --- a/html/_modules/lomas_server/utils/collection_models.html +++ b/html/_modules/lomas_server/utils/collection_models.html @@ -278,7 +278,7 @@

    Source code for lomas_server.utils.collection_models

    v0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/_modules/lomas_server/utils/query_examples.html b/html/_modules/lomas_server/utils/query_examples.html index 3ec9245d..fd4a71f4 100644 --- a/html/_modules/lomas_server/utils/query_examples.html +++ b/html/_modules/lomas_server/utils/query_examples.html @@ -262,7 +262,7 @@

    Source code for lomas_server.utils.query_examples

    v0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/_modules/lomas_server/utils/query_models.html b/html/_modules/lomas_server/utils/query_models.html index 8bad2725..83dac488 100644 --- a/html/_modules/lomas_server/utils/query_models.html +++ b/html/_modules/lomas_server/utils/query_models.html @@ -324,7 +324,7 @@

    Source code for lomas_server.utils.query_models

    <
    v0.3.0
    -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/_sources/CONTRIBUTING.md.txt b/html/_sources/CONTRIBUTING.md.txt index 63989f0c..c7f19ad8 100644 --- a/html/_sources/CONTRIBUTING.md.txt +++ b/html/_sources/CONTRIBUTING.md.txt @@ -70,7 +70,7 @@ The table below gives an overview of which workflows are triggered by what event Of these workflows, three of them need manual intervention to adjust the version number: -* **Client library push**: The version must be set in `client/setup.py` +* **Client library push**: The 'version' and the 'install_requires' must be set in `client/setup.py` ('install_requires' should match the list of library in requirements.txt). * **Helm chart push**: The chart version (`version`) and app version (`AppVersion`) of the server and the client must be updated in `server/deploy/helm/charts/lomas_server/Chart.yml`and `client/deploy/helm/charts/lomas_client/Chart.yaml`. * **Documentation push**: If a new version is released, it must be added to the `docs/versions.yaml` file. For more details on the generation of the documentation, please refer to `docs` and the `docs/build_docs.py` script. diff --git a/html/_sources/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb.txt b/html/_sources/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb.txt index 33d0c68b..b4068ff4 100644 --- a/html/_sources/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb.txt +++ b/html/_sources/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb.txt @@ -5,7 +5,7 @@ "id": "3f18d338", "metadata": {}, "source": [ - "# Secure Data Disclosure: Client side" + "# Lomas Client Side: Using Smartnoise-SQL" ] }, { @@ -13,7 +13,7 @@ "id": "1582a2ae", "metadata": {}, "source": [ - "This notebook showcases how researcher could use the Secure Data Disclosure system. It explains the different functionnalities provided by the dpserial client library to interact with the secure server.\n", + "This notebook showcases how researcher could use lomas platform with Smartnoise-SQL. It explains the different functionnalities provided by the `lomas-client` client library to interact with lomas server.\n", "\n", "The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.\n", "\n", @@ -25,13 +25,7 @@ "id": "5b73135c", "metadata": {}, "source": [ - "🐧🐧🐧\n", - "In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins dimensions.\n", - "\n", - "Therefore, the powerful queen Icerbegina 👑 had the data collected. But in order to get the penguins to agree to participate she promised them that no one would be able to look at the data and that no one would be able to guess the bill width of any specific penguin (which is very sensitive information) from the data. Nobody! Not even the researchers. The queen hence stored the data on the Secure Data Disclosure Server and only gave a small budget to Dr. Antarctica.\n", - "\n", - "This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library ofs_dpserial. \n", - "🐧🐧🐧" + "In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins data." ] }, { @@ -40,7 +34,7 @@ "metadata": {}, "source": [ "## Step 1: Install the library\n", - "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `fso_dpserial` on her local developping environment. \n", + "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `lomas-client` on her local developping environment. \n", "\n", "It can be installed via the pip command:" ] @@ -48,19 +42,36 @@ { "cell_type": "code", "execution_count": 1, + "id": "6f5d749c-0f39-4f78-8157-528bc39764b2", + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install lomas_client" + ] + }, + { + "cell_type": "markdown", + "id": "53cf3204-18a8-423c-9de2-c2966fdf84fb", + "metadata": {}, + "source": [ + "Or using a local version of the client" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "id": "98b4013c-ea93-4e4d-8885-15aac0039c12", "metadata": {}, "outputs": [], "source": [ "import sys\n", "import os\n", - "sys.path.append(os.path.abspath(os.path.join('..')))\n", - "# !pip install lomas_client" + "sys.path.append(os.path.abspath(os.path.join('..')))" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "9d96dcd7", "metadata": {}, "outputs": [], @@ -83,12 +94,12 @@ "- user_name: her name as registered in the database (Dr. Alice Antartica)\n", "- dataset_name: the name of the dataset that she wants to query (PENGUIN)\n", "\n", - "She will only be able to query on the real dataset if the queen Icergina has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some epsilon and delta credit. (As is done in the Secure Data Disclosure Notebook: Server side)." + "She will only be able to query on the real dataset if the administrator has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some $\\epsilon$, $\\delta$ privacy loss budget." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "941991f7", "metadata": {}, "outputs": [], @@ -104,7 +115,7 @@ "id": "0ec400c8", "metadata": {}, "source": [ - "And that's it for the preparation. She is now ready to use the various functionnalities offered by `fso_dpserial`." + "And that's it for the preparation. She is now ready to use the various functionnalities offered by `lomas-client`." ] }, { @@ -112,24 +123,12 @@ "id": "9b9a5f13", "metadata": {}, "source": [ - "## Step 3: Understand the functionnalities of the library" - ] - }, - { - "cell_type": "markdown", - "id": "c7cb5531", - "metadata": {}, - "source": [ - "### Getting dataset metadata\n", - "\n", - "Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the `get_dataset_metadata()` function of the client. As this is public information, this does not cost any budget.\n", - "\n", - "This function returns metadata information in the same format as [SmartnoiseSQL dictionary format](https://docs.smartnoise.org/sql/metadata.html#dictionary-format), where among other, there is information about all the available columns, their type, bound values (see Smartnoise page for more details)." + "## Step 3: Getting dataset metadata" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "d15cbe39", "metadata": {}, "outputs": [ @@ -155,7 +154,7 @@ " 'rows': 344}" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -165,1050 +164,859 @@ "metadata" ] }, - { - "cell_type": "markdown", - "id": "d338ed96", - "metadata": {}, - "source": [ - "Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds. She also knows based on the field `max_ids: 1` that each penguin can only be once in the dataset and on the field `row_privacy: True` that each row represents a single penguin. " - ] - }, - { - "cell_type": "markdown", - "id": "5a3c899d", - "metadata": {}, - "source": [ - "### Get a dummy dataset\n", - "\n", - "Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset. \n", - "\n", - "Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets.\n", - "Getting a dummy dataset does not affect the budget as there is no differential privacy here, it is not a synthetic dataset and all that could be learn here is already present in the public metadata.\n", - "\n", - "Dr. Antartica first create a dummy dataset with the default options." - ] - }, { "cell_type": "code", - "execution_count": 5, - "id": "be07091f", + "execution_count": 6, + "id": "ba329ffc-3eaa-4fdd-b526-c1b59c71ed3f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(100, 7)\n" + "Number of penguins: 344.\n" ] - }, + } + ], + "source": [ + "nb_penguin = metadata['rows']\n", + "print(f\"Number of penguins: {nb_penguin}.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "90e3edb2-54b1-476f-b362-a83e20084a74", + "metadata": {}, + "outputs": [ { "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
    0ChinstrapTorgersen43.10890413.314292214.2031652258.408606FEMALE
    1AdelieDream63.27500119.364104158.4139964656.773158FEMALE
    2AdelieDream55.61978816.143560166.1628714703.175608FEMALE
    3AdelieBiscoe50.95304718.085707239.8554195187.149507MALE
    4GentooTorgersen35.46065222.075665210.6429065630.456669MALE
    \n", - "
    " - ], "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Chinstrap Torgersen 43.108904 13.314292 214.203165 \n", - "1 Adelie Dream 63.275001 19.364104 158.413996 \n", - "2 Adelie Dream 55.619788 16.143560 166.162871 \n", - "3 Adelie Biscoe 50.953047 18.085707 239.855419 \n", - "4 Gentoo Torgersen 35.460652 22.075665 210.642906 \n", - "\n", - " body_mass_g sex \n", - "0 2258.408606 FEMALE \n", - "1 4656.773158 FEMALE \n", - "2 4703.175608 FEMALE \n", - "3 5187.149507 MALE \n", - "4 5630.456669 MALE " + "dict_keys(['species', 'island', 'bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g', 'sex'])" ] }, - "execution_count": 5, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_dummy = client.get_dummy_dataset()\n", - "print(df_dummy.shape)\n", - "df_dummy.head()" + "columns = metadata[\"columns\"].keys()\n", + "columns" ] }, { "cell_type": "markdown", - "id": "4f85e950", + "id": "5bf5b471-1495-4046-bec1-ddf96c98642f", "metadata": {}, "source": [ - "However, she would prefer to have a dataset with 200 rows and chooses a seed of 0, hence:" + "## Step 4: Average bill length with Smartnoise-SQL" + ] + }, + { + "cell_type": "markdown", + "id": "69dac96e", + "metadata": {}, + "source": [ + "### Query dummy dataset\n", + "\n", + "Now that she has an idea of what the data looks like, she wants to start querying the real dataset to for her research. However, before this, other tools are at her disposal to reduce potential error risks and avoid spending budget on irrelevant queries. Of course, this does not have any impact on the budget.\n", + "\n", + "It is possible to specify the flag `dummy=True` in the various queries to perform the query on the dummy dataset instead of the real dataset and ensure that the queries are doing what is expected of them. " ] }, { "cell_type": "code", - "execution_count": 6, - "id": "01f4365a", + "execution_count": 8, + "id": "3946425d", "metadata": {}, "outputs": [], "source": [ - "NB_ROWS = 200\n", - "SEED = 0" + "# Average bill length in mm\n", + "QUERY = \"SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df\"" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "3f553b29", + "execution_count": 9, + "id": "99494f15-727d-4d03-a099-5cfe5a0c8a27", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(200, 7)\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
    0GentooBiscoe49.20847316.117959190.1259502873.291927FEMALE
    1GentooTorgersen55.03162819.963435242.9291423639.940005FEMALE
    2ChinstrapTorgersen51.09671816.777518159.9614935401.743330MALE
    3AdelieBiscoe49.07091114.796037244.5301532316.038092MALE
    4ChinstrapBiscoe44.82791813.246787236.9488535036.246870FEMALE
    \n", - "
    " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Gentoo Biscoe 49.208473 16.117959 190.125950 \n", - "1 Gentoo Torgersen 55.031628 19.963435 242.929142 \n", - "2 Chinstrap Torgersen 51.096718 16.777518 159.961493 \n", - "3 Adelie Biscoe 49.070911 14.796037 244.530153 \n", - "4 Chinstrap Biscoe 44.827918 13.246787 236.948853 \n", - "\n", - " body_mass_g sex \n", - "0 2873.291927 FEMALE \n", - "1 3639.940005 FEMALE \n", - "2 5401.743330 MALE \n", - "3 2316.038092 MALE \n", - "4 5036.246870 FEMALE " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "df_dummy = client.get_dummy_dataset(nb_rows = NB_ROWS, seed = SEED)\n", - "print(df_dummy.shape)\n", - "df_dummy.head()" + "EPSILON = 0.5\n", + "DELTA = 1e-5" ] }, { - "cell_type": "markdown", - "id": "69dac96e", + "cell_type": "code", + "execution_count": 10, + "id": "90cf2a6d", "metadata": {}, + "outputs": [], "source": [ - "### Query dummy dataset\n", - "\n", - "Now that she has an idea of what the data looks like, she wants to start querying the real dataset to for her research. However, before this other tools are at her disposal to reduce potential error risks and avoid spending budget on irrelevant queries. Of course, this does not have any impact on the budget.\n", - "\n", - "It is possible to specify the flag `dummy=True` in the various queries to perform the query on the dummy dataset instead of the real dataset and ensure that the queries are doing what is expected of them. \n", - "\n", - "Therefore Dr. Antartica computes the results that she gets on the dummy dataframe that she created locally and on the same dummy dataframe in the server via a query and compare them to ensure that the query is well defined and works within the server.\n", - "\n", - "She tests with an example on the average bill length on the dataframe." + "# On the remote server dummy dataframe\n", + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON,\n", + " delta = DELTA,\n", + " dummy = True,\n", + ")" ] }, { "cell_type": "code", - "execution_count": 8, - "id": "b6caee55", + "execution_count": 11, + "id": "f3a736f7-be77-4214-8f77-6abc7db34793", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "47.51532" + "'Average bill length on dummy: 46.68mm.'" ] }, - "execution_count": 8, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# On the local dummy dataframe\n", - "result_local_dummy = round(df_dummy['bill_length_mm'].mean(), 5)\n", - "result_local_dummy" + "avg_bl_dummy = np.round(dummy_res['query_response'][\"avg_bill_length_mm\"][0], 2)\n", + "f\"Average bill length on dummy: {avg_bl_dummy}mm.\"" ] }, { "cell_type": "markdown", - "id": "c3a37d8d", + "id": "b746374c", "metadata": {}, "source": [ - "As the query on the server goes through the same workflow for dummies and real data, she still has to set values for theoratical budget to spend on the dummy query. Of course, this theoretical budget will NOT affect her real budget as this is on dummy data. \n", - "\n", - "It is recommended to use very high values on the budget parameters here to have little noise and small difference between the exact local result and the 'little noisy' server result. \n", - "\n", - "Also, make sure to use the same values of number of rows and seed to have the same dummy datasets." + "### Estimate cost of a query\n", + "Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an `epsilon` and a `delta`." ] }, { "cell_type": "code", - "execution_count": 9, - "id": "3946425d", + "execution_count": 12, + "id": "133020c6", "metadata": {}, "outputs": [], "source": [ - "# Average bill length in mm\n", - "QUERY = \"SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df\"" + "cost = client.estimate_smartnoise_sql_cost(\n", + " query = QUERY, \n", + " epsilon = EPSILON, \n", + " delta = DELTA,\n", + ")" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "90cf2a6d", + "execution_count": 13, + "id": "ff19802d-cb39-48ee-9874-340a4bf2cc31", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "47.51229381350249" + "'This query would actually cost her 1.0 epsilon and 5.000000000032756e-06 delta.'" ] }, - "execution_count": 10, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# On the remote server dummy dataframe\n", - "res = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = 100.0, # make sure to select high values of epsilon and delta to have small differences\n", - " delta = 2.0, # make sure to select high values of epsilon and delta to have small differences\n", - " dummy = True, \n", - " nb_rows = NB_ROWS,\n", - " seed = SEED\n", - ")\n", - "res_server_dummy = res['query_response'][\"avg_bill_length_mm\"][0]\n", - "res_server_dummy" + "f'This query would actually cost her {cost[\"epsilon_cost\"]} epsilon and {cost[\"delta_cost\"]} delta.'" ] }, { "cell_type": "markdown", - "id": "bb3fa8eb", + "id": "c255d210-7ba1-4152-8a30-97c7289dd361", "metadata": {}, "source": [ - "She then checks that the responses on the dummy locally and the dummy on the server are close enough (difference would be only due to small noise addition)." + "This is actually twice as much as what she initially put in. In the background, Smartnoise-SQL decomposes the DP query in multiple other queries and the budget given as input is spent on each of these sub-queries. Here for the average, we need a sum divided by a count, hence `EPSILON` is spent once for the sum and then once more for the count. (see NOTE below for tips and explanation)." ] }, { - "cell_type": "code", - "execution_count": 11, - "id": "0f2fff82", + "cell_type": "markdown", + "id": "4ec31515-39fe-426b-8339-fc2ac9c1e09e", "metadata": {}, - "outputs": [], "source": [ - "np.testing.assert_almost_equal(\n", - " result_local_dummy, \n", - " res_server_dummy,\n", - " decimal=2, \n", - " err_msg=\"Responses are different, either try with a bigger budget or query is not doing what is intended.\"\n", - ")" + "### Overide DP mechanism" ] }, { "cell_type": "markdown", - "id": "5a82abcd", + "id": "24b060d0-3c6f-4d35-824f-347ec5103723", "metadata": {}, "source": [ - "As you can see res_local and res_server are close. We can accept that the small difference is due to the small noise added due to the large values of $\\epsilon$ and $\\delta$." + "She wants to use another DP-mechanism for this query. She can change it via the `mechanism` argument. See Smartnoise-SQL documentation [here for overriding mechanisms](https://docs.smartnoise.org/sql/advanced.html#overriding-mechanisms)." ] }, { - "cell_type": "markdown", - "id": "324454ed", + "cell_type": "code", + "execution_count": 14, + "id": "1f726ce8-2e3d-462a-bbd8-598198935bc9", "metadata": {}, + "outputs": [], "source": [ - "### Get current budget\n", - "\n", - "It is the first time that Dr. Antartica connects to the server and she wants to know how much buget the queen assigned her.\n", - "Therefore, she calls the fonction `get_initial_budget`." + "# On the remote server dummy dataframe\n", + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON,\n", + " delta = DELTA,\n", + " mechanisms = {\"count\": \"gaussian\", \"sum_float\": \"laplace\"},\n", + " dummy = True,\n", + ")" ] }, { "cell_type": "code", - "execution_count": 12, - "id": "61a467f3", + "execution_count": 15, + "id": "46e064f0-f1e2-49af-8f14-fde44f981813", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'initial_epsilon': 10.0, 'initial_delta': 0.005}" + "'Average bill length on dummy: 50.83mm.'" ] }, - "execution_count": 12, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_initial_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "bc8f7a74", - "metadata": {}, - "source": [ - "She sees that she has 10.0 epsilon and 0.0004 epsilon at her disposal.\n", - "\n", - "Then she checks her total spent budget `get_total_spent_budget`. As she only did queries on metadata on dummy dataframes, this should still be 0." + "avg_bl_dummy = np.round(dummy_res['query_response'][\"avg_bill_length_mm\"][0], 2)\n", + "f\"Average bill length on dummy: {avg_bl_dummy}mm.\"" ] }, { "cell_type": "code", - "execution_count": 13, - "id": "afd22f84", + "execution_count": 16, + "id": "7e20014d-ad82-4a2d-88d9-ec981150e7db", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'total_spent_epsilon': 2.714285714286655, 'total_spent_delta': 0.0}" + "{'epsilon_cost': 1.0, 'delta_cost': 1.4999949999983109e-05}" ] }, - "execution_count": 13, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_total_spent_budget()" + "cost = client.estimate_smartnoise_sql_cost(\n", + " query = QUERY, \n", + " epsilon = EPSILON, \n", + " delta = DELTA,\n", + " mechanisms = {\"count\": \"gaussian\", \"sum_float\": \"laplace\"}\n", + ")\n", + "cost" ] }, { "cell_type": "markdown", - "id": "05daf5a4", + "id": "e5379edf", "metadata": {}, "source": [ - "It will also be useful to know what the remaining budget is. Therefore, she calls the function `get_remaining_budget`. It just substarcts the total spent budget from the initial budget." + "### Query real dataset\n", + "Dr. Antartica is ready to query the real dataset and get a differentially private response for the average bill length. The `dummy` flag is False by default, so setting it is optional. She uses the values of `epsilon` and `delta` that she selected just before.\n", + "\n", + "Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query." ] }, { "cell_type": "code", - "execution_count": 14, - "id": "6260cf54", + "execution_count": 17, + "id": "69767fac", + "metadata": {}, + "outputs": [], + "source": [ + "avg_bill_length_response = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON, \n", + " delta = DELTA,\n", + " mechanisms = {\"count\": \"gaussian\", \"sum_float\": \"laplace\"},\n", + " dummy = False\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6dbbdf93", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'remaining_epsilon': 7.285714285713345, 'remaining_delta': 0.005}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Average bill length on private data: 45.19mm.\n" + ] } ], "source": [ - "client.get_remaining_budget()" + "avg_bill_length = avg_bill_length_response['query_response']['avg_bill_length_mm'].iloc[0]\n", + "print(f\"Average bill length on private data: {np.round(avg_bill_length, 2)}mm.\")" ] }, { "cell_type": "markdown", - "id": "20298e00", + "id": "b2767e65", "metadata": {}, "source": [ - "As expected, for now the remaining budget is equal to the inital budget." + "After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:" ] }, { "cell_type": "markdown", - "id": "b746374c", + "id": "1472b825-bcea-458f-930e-41ff0f5d5f93", "metadata": {}, "source": [ - "### Estimate cost of a query\n", - "Another safeguard is the functionnality to estimate the cost of a query. As in OpenDP and SmartnoiseSQL, the budget that will by used by a query might be slightly different than what is asked by the user. The `estimate cost` function returns the estimated real cost of any query.\n", - "\n", - "Again, of course, this will not impact the user's budget.\n", - "\n", - "Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an `epsilon` and a `delta`." + "### Postprocess " + ] + }, + { + "cell_type": "markdown", + "id": "ab34449e-7456-4e5e-b5bb-4231204c4d7e", + "metadata": {}, + "source": [ + "It is also possible to use the 'postprocess' argument from Smartnoise-SQL [see its documentation here](https://docs.smartnoise.org/sql/advanced.html#postprocess) by specifying it in the query." ] }, { "cell_type": "code", - "execution_count": 15, - "id": "133020c6", + "execution_count": 19, + "id": "50c38d09-32ea-4269-9ca7-eacfd1d9ad96", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 2.0, 'delta_cost': 4.999999999999449e-05}" + "{'query_response': avg_bill_length_mm\n", + " 0 46.850983}" ] }, - "execution_count": 15, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 1.0, \n", - " delta = 1e-4\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "71580822", - "metadata": {}, - "source": [ - "So this query would actually cost her 3.0 epsilon and a little 1.499e-4 delta. As she does not want to spend to much budget here she tries other values of budget." + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON,\n", + " delta = DELTA,\n", + " postprocess = True,\n", + " dummy = True,\n", + ")\n", + "dummy_res" ] }, { "cell_type": "code", - "execution_count": 16, - "id": "df487c62", + "execution_count": 20, + "id": "df6f2526-612e-4f00-b15a-c0433573e652", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 0.4, 'delta_cost': 5.000000000032756e-06}" + "{'query_response': res_0 res_1\n", + " 0 4659.909203 96.041455}" ] }, - "execution_count": 16, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 0.2, \n", - " delta = 1e-5\n", - ")" + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON,\n", + " delta = DELTA,\n", + " postprocess = False,\n", + " dummy = True,\n", + ")\n", + "dummy_res" ] }, { "cell_type": "markdown", - "id": "3c6a3a8c", + "id": "04929993", "metadata": {}, "source": [ - "This query would actually cost her 0.6 epsilon and a similar delta. She decides that it is good enough." + "## Step 4: Penguin statistics" ] }, { - "cell_type": "code", - "execution_count": 17, - "id": "c9c8d3e7", + "cell_type": "markdown", + "id": "bbbca191", "metadata": {}, - "outputs": [], "source": [ - "EPSILON = 0.2\n", - "DELTA = 1e-5" + "### Confidence intervals for flipper length over the whole population" ] }, { "cell_type": "markdown", - "id": "e5379edf", + "id": "9d41bd58", "metadata": {}, "source": [ - "### Query real dataset\n", - "Now that all the safeguard functions were tested, Dr. Antartica is ready to query on the real dataset and get a differentially private response of the average bill length. By default, the flag `dummy` is False so setting it is optional. She uses the values of `epsilon` and `delta` that she selected just before.\n", - "\n", - "Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query." + "She is first interested to have a better idea of the distribution of bill length of all species. She already has the number of penguins (=number of rows as `max_ids=1`) from the metadata and the average bill length from step 3, so she just needs to compute the standard deviation. As it is just an exploration step, she uses very little budget values." ] }, { "cell_type": "code", - "execution_count": 18, - "id": "19e60263", + "execution_count": 21, + "id": "04b376ef", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 7.285714285713345, 'remaining_delta': 0.005}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "client.get_remaining_budget()" + "QUERY = \"SELECT STD(bill_length_mm) AS std_bill_length_mm FROM df\"" + ] + }, + { + "cell_type": "markdown", + "id": "0b041c81", + "metadata": {}, + "source": [ + "She again first verifies that her query works on the dummy dataset:" ] }, { "cell_type": "code", - "execution_count": 19, - "id": "69767fac", + "execution_count": 22, + "id": "5aa9c304", "metadata": {}, "outputs": [], "source": [ - "avg_bill_length_response = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = EPSILON, \n", - " delta = DELTA,\n", - " dummy = False\n", + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = 0.5, \n", + " delta = 1e-5, \n", + " dummy = True\n", ")" ] }, { "cell_type": "code", - "execution_count": 20, - "id": "6dbbdf93", + "execution_count": 23, + "id": "49e4ba47-adf3-471b-a35b-c44346ed12a8", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average bill length: 44.18mm.\n" - ] + "data": { + "text/plain": [ + "'The dummy standard variation is 16.64.'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "avg_bill_length = avg_bill_length_response['query_response']['avg_bill_length_mm'].iloc[0]\n", - "print(f\"Average bill length: {np.round(avg_bill_length, 2)}mm.\")" + "dummy_std = np.round(dummy_res['query_response']['std_bill_length_mm'].iloc[0], 2)\n", + "f\"The dummy standard variation is {dummy_std}.\"" ] }, { "cell_type": "markdown", - "id": "b2767e65", + "id": "74f68994", "metadata": {}, "source": [ - "After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:" + "The syntax of the query works, now she checks the budget:" ] }, { "cell_type": "code", - "execution_count": 21, - "id": "39701fe5", + "execution_count": 24, + "id": "a8fa2c49", + "metadata": {}, + "outputs": [], + "source": [ + "cost = client.estimate_smartnoise_sql_cost(\n", + " query = QUERY, \n", + " epsilon = 0.5, \n", + " delta = 1e-5\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "b3aa05ca-3243-4415-a8ec-fb5ad47d244d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'remaining_epsilon': 6.885714285713345,\n", - " 'remaining_delta': 0.004994999999999967}" + "'This query would actually cost her 1.5 epsilon and 5.000000000032756e-06 delta.'" ] }, - "execution_count": 21, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_remaining_budget()" + "f'This query would actually cost her {cost[\"epsilon_cost\"]} epsilon and {cost[\"delta_cost\"]} delta.'" ] }, { "cell_type": "markdown", - "id": "e37c587f", + "id": "884f0337-a960-460e-8797-84ddd77974a3", "metadata": {}, "source": [ - "As can be seen in `get_total_spent_budget()`, it is the budget estimated with `estimate_cost()` that was spent." + "This time it is three times the budget because the standard deviation needs the average, then a difference and a count again. " ] }, { "cell_type": "code", - "execution_count": 22, - "id": "487f835f", + "execution_count": 26, + "id": "534979fb", + "metadata": {}, + "outputs": [], + "source": [ + "response = client.smartnoise_sql_query(\n", + " query = QUERY,\n", + " epsilon = 0.5,\n", + " delta = 1e-5\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "674332e7", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'total_spent_epsilon': 3.114285714286655,\n", - " 'total_spent_delta': 5.000000000032756e-06}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Standard deviation of bill length: 8.83.\n" + ] } ], "source": [ - "client.get_total_spent_budget()" + "std_bill_length = response['query_response']['std_bill_length_mm'].iloc[0]\n", + "print(f\"Standard deviation of bill length: {np.round(std_bill_length, 2)}.\")" ] }, { "cell_type": "markdown", - "id": "eef4afcd", + "id": "367081be-1159-45d8-9129-88fba20fb697", "metadata": {}, "source": [ - "Dr. Antartica has now a differentially private estimation of the bill length of all birds and is confident to use the library for the rest of her analyses." + "She can now do all the postprocessing that she wants with the returned data without increasing the privacy risk. " ] }, { - "cell_type": "markdown", - "id": "04929993", + "cell_type": "code", + "execution_count": 28, + "id": "f72b19d0", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Standard error of bill length: 0.48.\n" + ] + } + ], "source": [ - "## Step 4: Penguin statistics" + "# Get standard error\n", + "standard_error = std_bill_length/np.sqrt(nb_penguin)\n", + "print(f\"Standard error of bill length: {np.round(standard_error, 2)}.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "62630a03", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The 95% confidence interval of the bill length of all penguins is [44.25, 46.12].\n" + ] + } + ], + "source": [ + " # Compute the 95% confidence interval\n", + "ZSCORE = 1.96\n", + "lower_bound, upper_bound = avg_bill_length - ZSCORE*standard_error, avg_bill_length + ZSCORE*standard_error\n", + "print(f\"The 95% confidence interval of the bill length of all penguins is [{np.round(lower_bound, 2)}, {np.round(upper_bound, 2)}].\")" ] }, { "cell_type": "markdown", - "id": "bbbca191", + "id": "26d04824-ff41-4d25-8a4e-1506a416dd0b", "metadata": {}, "source": [ - "### Confidence intervals for flipper length over the whole population" + "## Note on budget with Smartnoise-SQL (Advanced)" ] }, { "cell_type": "markdown", - "id": "9d41bd58", + "id": "c9aa0b56-bda3-405e-9f33-ae7135dbfeba", "metadata": {}, "source": [ - "She is first interested to have a better idea of the distribution of flipper length of all species. She already has the mean from step 3, so she just need to compute the standard deviation and know the number of penguins in the dataset. As it is just an exploration step, she uses very little budget values." + "All of these queries will cost the same budget in Smartnoise-SQL. The reason is that the smartnoise-sql translates the input query in sub queries, finds the answer for each sub query for the budget in input and then assembles the results. For the first 'standard deviation' query, it requires a count, an average, and only then the computation for the standard deviation. Hence, to save budget it is better to make a general query directly and retrieve all the 'sub-answers'." ] }, { "cell_type": "code", - "execution_count": 23, - "id": "04b376ef", + "execution_count": 30, + "id": "611df7d2-86eb-4710-a6eb-a3de214ece37", "metadata": {}, "outputs": [], "source": [ - "QUERY = \"SELECT COUNT(bill_length_mm) AS nb_penguin, STD(bill_length_mm) AS std_bill_length_mm FROM df\"" + "epsilon = 1.0\n", + "delta = 1e-5" ] }, { - "cell_type": "markdown", - "id": "0b041c81", + "cell_type": "code", + "execution_count": 31, + "id": "32b76d26-edce-4cf9-bab9-bf1ea936d288", "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "She again first verifies that her query works on the dummy dataset:" + "QUERY = \"SELECT STD(bill_length_mm) AS std_bill_length_mm FROM df\"\n", + "cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)\n", + "cost" ] }, { "cell_type": "code", - "execution_count": 24, - "id": "5aa9c304", + "execution_count": 32, + "id": "f84411ed-dab5-4acc-ab49-bfec9ebc3530", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    nb_penguinstd_bill_length_mm
    010010.332225
    \n", - "
    " - ], "text/plain": [ - " nb_penguin std_bill_length_mm\n", - "0 100 10.332225" + "{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}" ] }, - "execution_count": 24, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dummy_res = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = 100.0, \n", - " delta = 10.0, \n", - " dummy = True\n", - ")\n", - "dummy_res['query_response']" - ] - }, - { - "cell_type": "markdown", - "id": "74f68994", - "metadata": {}, - "source": [ - "The syntax of the query works, now she checks the budget:" + "QUERY = \"SELECT AVG(bill_length_mm) AS avg_bl, STD(bill_length_mm) as std_bl FROM df\"\n", + "cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)\n", + "cost" ] }, { "cell_type": "code", - "execution_count": 25, - "id": "a8fa2c49", + "execution_count": 33, + "id": "2454db71-4074-46dd-a863-c690c0160c51", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 1.5, 'delta_cost': 5.000000000032756e-06}" + "{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}" ] }, - "execution_count": 25, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 0.5, \n", - " delta = 1e-5\n", - ")" + "QUERY = \"SELECT COUNT(bill_length_mm) AS count_bl, AVG(bill_length_mm) AS avg_bl, STD(bill_length_mm) as std_bl FROM df\"\n", + "cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)\n", + "cost" ] }, { "cell_type": "markdown", - "id": "bed840d3", + "id": "73bd85ca-eed0-488f-807e-6f03f99898cb", "metadata": {}, "source": [ - "It is a bit too much, she decides to test for less:" + "A way to know the sub-queries of a query is to use the following Smartnoise-SQL code:" ] }, { "cell_type": "code", - "execution_count": 26, - "id": "edc97e73", + "execution_count": 34, + "id": "5b51cf35-68db-4b11-acbe-8df15b826d10", + "metadata": {}, + "outputs": [], + "source": [ + "# Convert metadata to Smartnoise-SQL compliant metadata\n", + "metadata = dict(metadata)\n", + "metadata.update(metadata[\"columns\"])\n", + "del metadata[\"columns\"]\n", + "snsql_metadata = {\"\": {\"\": {\"df\": metadata}}}" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "7ab04c8f-8d79-4871-bc16-1f0368fbd403", + "metadata": {}, + "outputs": [], + "source": [ + "# Write the query to inspect\n", + "QUERY = \"SELECT STD(bill_length_mm) as std_bl FROM df\"\n", + "#QUERY = \"SELECT COUNT(*) as nb_row FROM df\"" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "a78d7d86-ab95-4521-b84d-49ac795316c3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 0.75, 'delta_cost': 5.000000000032756e-06}" + "" ] }, - "execution_count": 26, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 0.25, \n", - " delta = 1e-5\n", - ")" + "from snsql.sql.private_rewriter import Rewriter\n", + "rewriter = Rewriter(snsql_metadata)\n", + "rewriter.options.row_privacy = metadata[\"row_privacy\"]\n", + "rewriter.options.max_contrib = metadata[\"max_ids\"]\n", + "dp_query = rewriter.query(QUERY)\n", + "dp_query" ] }, { "cell_type": "markdown", - "id": "da9f81c4", + "id": "2df6bf8c-d06e-4b5c-9509-b2ba01fef581", "metadata": {}, "source": [ - "That's fine, she is ready to query:" + "The original dp query is represented as one query:" ] }, { "cell_type": "code", - "execution_count": 27, - "id": "534979fb", + "execution_count": 37, + "id": "251b773a-864c-4852-ae89-1472ac768975", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    nb_penguinstd_bill_length_mm
    034313.064982
    \n", - "
    " - ], "text/plain": [ - " nb_penguin std_bill_length_mm\n", - "0 343 13.064982" + "{'std_bl': }" ] }, - "execution_count": 27, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "response = client.smartnoise_sql_query(query = QUERY, epsilon = 0.25, delta = 1e-5)\n", - "response = response['query_response']\n", - "response" + "dp_query._named_symbols" + ] + }, + { + "cell_type": "markdown", + "id": "c5830777-95fc-432e-b4c5-6bd59aac514f", + "metadata": {}, + "source": [ + "But has 4 named symbols inside: 2 alias for the 2 SQL subqueries \n", + "- 'keycount' for 'count_bill_length_mm',\n", + "- 'sum_alias_0xxxx' for 'sum_bill_length_mm'" ] }, { "cell_type": "code", - "execution_count": 28, - "id": "674332e7", + "execution_count": 38, + "id": "f4ac4261-e870-4f07-8264-9a2041a35abc", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of penguins: 343.\n", - "Standard deviation of bill length: 13.06.\n" - ] + "data": { + "text/plain": [ + "{'keycount': ,\n", + " 'sum_alias_0xde09': ,\n", + " 'count_bill_length_mm': ,\n", + " 'sum_bill_length_mm': }" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "nb_penguin = response['nb_penguin'].iloc[0]\n", - "print(f\"Number of penguins: {nb_penguin}.\")\n", - "\n", - "std_bill_length = response['std_bill_length_mm'].iloc[0]\n", - "print(f\"Standard deviation of bill length: {np.round(std_bill_length, 2)}.\")" + "subquery = dp_query.source.relations[0].primary.query\n", + "syms = subquery._named_symbols\n", + "syms" ] }, { "cell_type": "markdown", - "id": "367081be-1159-45d8-9129-88fba20fb697", + "id": "cc07d8c4-153f-4ad3-a977-a971b94d75aa", "metadata": {}, "source": [ - "She can now do all the postprocessing that she wants with the returned data without adding any privacy risk. " + "This last query with `group_by` will cost the same because `max_ids=1` (a penguin appears in the dataset at most once) and so the `group_by` is applied on different partitions of the population." ] }, { "cell_type": "code", - "execution_count": 29, - "id": "f72b19d0", + "execution_count": 39, + "id": "5b69f3f2-07dd-48b8-9cd5-64eee53331f7", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Standard error of bill length: 0.71.\n" - ] + "data": { + "text/plain": [ + "{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Get standard error\n", - "standard_error = std_bill_length/np.sqrt(nb_penguin)\n", - "print(f\"Standard error of bill length: {np.round(standard_error, 2)}.\")" + "QUERY = \"SELECT COUNT(bill_length_mm) AS count_bl, AVG(bill_length_mm) AS avg_bl, STD(bill_length_mm) as std_bl FROM df GROUP BY species\"\n", + "cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)\n", + "cost" ] }, { - "cell_type": "code", - "execution_count": 30, - "id": "62630a03", + "cell_type": "markdown", + "id": "e20c4673-2c7b-44d5-bd7f-be88d6432a70", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The 95% confidence interval of the bill length of all penguins is [42.8, 45.57].\n" - ] - } - ], "source": [ - " # Compute the 95% confidence interval\n", - "ZSCORE = 1.96\n", - "lower_bound, upper_bound = avg_bill_length - ZSCORE*standard_error, avg_bill_length + ZSCORE*standard_error\n", - "print(f\"The 95% confidence interval of the bill length of all penguins is [{np.round(lower_bound, 2)}, {np.round(upper_bound, 2)}].\")" + "NOTE: in the current code of Smartnoise-SQL, there is no odometer. Meaning all queries are independant. If someone first queries the private dataset for a count, then a second time for the average and then for the standard deviation then the total cost will be added: 3 count + 2 average + 1 std. That's why it is better to do everything in one query." ] }, { @@ -1236,7 +1044,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 40, "id": "7d9ae766-4c0d-4dc5-9c9a-5f7eb99718f9", "metadata": {}, "outputs": [], @@ -1246,7 +1054,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 41, "id": "5006201d", "metadata": {}, "outputs": [], @@ -1256,133 +1064,111 @@ " COUNT(bill_length_mm) AS nb_penguin, \\\n", " AVG(bill_length_mm) AS avg_bill_length_mm, \\\n", " STD(bill_length_mm) AS std_bill_length_mm \\\n", - " FROM df GROUP BY species\"" + " FROM df GROUP BY species\"" ] }, { "cell_type": "markdown", - "id": "e725eb3f-d12f-4f62-8f57-06fb00639f91", + "id": "37ce4596-7843-48dd-86cb-fb34b227db0e", "metadata": {}, "source": [ - "She estimates how much budget it would really cost:" + "She checks the remaining budget:" ] }, { "cell_type": "code", - "execution_count": 33, - "id": "0255550b-7fd2-4244-a8eb-da809ddc6a5b", + "execution_count": 42, + "id": "814883fa-a45a-43f2-852d-d5380beff8c0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 3.0, 'delta_cost': 4.999999999999449e-05}" + "{'remaining_epsilon': 7.5, 'remaining_delta': 0.004980000049999984}" ] }, - "execution_count": 33, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 1, delta = 1e-4)" + "client.get_remaining_budget()" ] }, { "cell_type": "markdown", - "id": "56bf804f-d877-48cb-b405-709b30cda3d1", + "id": "e725eb3f-d12f-4f62-8f57-06fb00639f91", "metadata": {}, "source": [ - "The real cost seems to be 3 times the epsilon that she sets. It is a lot but she tries on the dummy dataset to verify all is working properly." + "She estimates how much budget it would really cost:" ] }, { "cell_type": "code", - "execution_count": 34, - "id": "80d9933b", + "execution_count": 43, + "id": "0255550b-7fd2-4244-a8eb-da809ddc6a5b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'query_response': species nb_penguin avg_bill_length_mm std_bill_length_mm\n", - " 0 Adelie 39 45.659944 10.695675\n", - " 1 Chinstrap 33 45.690454 14.067739\n", - " 2 Gentoo 31 38.472887 14.542186}" + "{'epsilon_cost': 3.0, 'delta_cost': 4.999999999999449e-05}" ] }, - "execution_count": 34, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 1, delta = 1.0, dummy = True)\n", - "dummy_res" + "client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 1.0, delta = 1e-4)" ] }, { "cell_type": "markdown", - "id": "5691680f-8716-4a99-999a-a2bd5ef6a679", + "id": "56bf804f-d877-48cb-b405-709b30cda3d1", "metadata": {}, "source": [ - "She did not give enough budget for the query to work. This is why there are 'NANs' in the output. She has to spend more budget for the query to work." + "The real cost seems to be 3 times the epsilon that she sets. It is a lot but she tries on the dummy dataset to verify all is working properly." ] }, { "cell_type": "code", - "execution_count": 35, - "id": "6b014db4-acbd-4ae1-a3b6-397035851583", + "execution_count": 44, + "id": "80d9933b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'remaining_epsilon': 6.135714285713345,\n", - " 'remaining_delta': 0.004989999999999935}" + "{'query_response': species nb_penguin avg_bill_length_mm std_bill_length_mm\n", + " 0 Adelie 25 59.830486 27.444144\n", + " 1 Chinstrap 47 13.527649 28.501660\n", + " 2 Gentoo 28 42.375624 33.967001}" ] }, - "execution_count": 35, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_remaining_budget()" + "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 0.1, delta = 1e-8, dummy = True)\n", + "dummy_res" ] }, { "cell_type": "markdown", - "id": "43d3488d-3987-4fec-a840-78385e956832", - "metadata": {}, - "source": [ - "The maximum she can do with all her remaining budget of 7.4 is around 7.4/4 = 1.85. Let's check:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "99d7998d-daa1-4d5e-aa42-abc5aabdf2e3", + "id": "5691680f-8716-4a99-999a-a2bd5ef6a679", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 5.550000000000001, 'delta_cost': 4.999999999999449e-05}" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 7.4/4, delta = 1e-4)" + "She did not give enough budget for the query to work. This is why there are 'NANs' in the output. She has to spend more budget for the query to work." ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 45, "id": "0e07fde9-9430-4a12-8337-0503ac162c26", "metadata": {}, "outputs": [ @@ -1390,18 +1176,18 @@ "data": { "text/plain": [ "{'query_response': species nb_penguin avg_bill_length_mm std_bill_length_mm\n", - " 0 Adelie 37 48.755816 3.634415\n", - " 1 Chinstrap 33 46.912863 4.552931\n", - " 2 Gentoo 29 41.803438 17.566451}" + " 0 Adelie 36 49.021514 3.944748\n", + " 1 Chinstrap 31 49.048848 3.801831\n", + " 2 Gentoo 30 41.176308 7.628134}" ] }, - "execution_count": 43, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 7.4/4, delta = 1e-4, dummy = True)\n", + "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 7.5/3, delta = 1e-4, dummy = True)\n", "dummy_res" ] }, @@ -1415,12 +1201,12 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 46, "id": "59f2d665", "metadata": {}, "outputs": [], "source": [ - "flipper_length_response = client.smartnoise_sql_query(query = QUERY, epsilon = 7.4/4, delta = 1e-4)" + "flipper_length_response = client.smartnoise_sql_query(query = QUERY, epsilon = 7.5/3, delta = 1e-4)" ] }, { @@ -1431,28 +1217,6 @@ "And now she should not have any remaining budget:" ] }, - { - "cell_type": "code", - "execution_count": 45, - "id": "6eb20cfb-fa53-496f-940d-9b17b05fa074", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 0.5857142857133439,\n", - " 'remaining_delta': 0.00493999999999994}" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, { "cell_type": "markdown", "id": "cb96f406-d409-4531-ac86-05f1c9296705", @@ -1463,7 +1227,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 47, "id": "748f125f", "metadata": {}, "outputs": [ @@ -1498,23 +1262,23 @@ " \n", " 0\n", " Adelie\n", - " 150\n", - " 38.649887\n", - " 3.997587\n", + " 151\n", + " 38.362705\n", + " 5.465330\n", " \n", " \n", " 1\n", " Chinstrap\n", " 67\n", - " 49.285002\n", - " 5.859511\n", + " 48.867188\n", + " 3.828321\n", " \n", " \n", " 2\n", " Gentoo\n", - " 122\n", - " 47.557167\n", - " 4.643492\n", + " 123\n", + " 47.257728\n", + " 5.387484\n", " \n", " \n", "\n", @@ -1522,12 +1286,12 @@ ], "text/plain": [ " species nb_penguin avg_bill_length_mm std_bill_length_mm\n", - "0 Adelie 150 38.649887 3.997587\n", - "1 Chinstrap 67 49.285002 5.859511\n", - "2 Gentoo 122 47.557167 4.643492" + "0 Adelie 151 38.362705 5.465330\n", + "1 Chinstrap 67 48.867188 3.828321\n", + "2 Gentoo 123 47.257728 5.387484" ] }, - "execution_count": 46, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1547,7 +1311,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 48, "id": "0a7d7d4d", "metadata": {}, "outputs": [], @@ -1559,7 +1323,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 49, "id": "bc3ee48a", "metadata": {}, "outputs": [], @@ -1571,7 +1335,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 50, "id": "1717f9ea", "metadata": {}, "outputs": [ @@ -1579,9 +1343,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "T test between specie 0 and specie 1: -15.84. Reject null hypothesis: True.\n", - "T test between specie 0 and specie 2: -17.04. Reject null hypothesis: True.\n", - "T test between specie 1 and specie 2: 2.24. Reject null hypothesis: True.\n" + "T test between specie 0 and specie 1: -14.41. Reject null hypothesis: True.\n", + "T test between specie 0 and specie 2: -13.49. Reject null hypothesis: True.\n", + "T test between specie 1 and specie 2: 2.19. Reject null hypothesis: True.\n" ] } ], @@ -1590,9 +1354,9 @@ "t_02 = t_test(avg_0, avg_2, std_0, std_2, nb_0, nb_2)\n", "t_12 = t_test(avg_1, avg_2, std_1, std_2, nb_1, nb_2)\n", "\n", - "print(f\"T test between specie 0 and specie 1: {np.round(t_01, 2)}. Reject null hypothesis: {abs(t_01) > CRITICAL_VALUE}.\")\n", - "print(f\"T test between specie 0 and specie 2: {np.round(t_02, 2)}. Reject null hypothesis: {abs(t_02) > CRITICAL_VALUE}.\")\n", - "print(f\"T test between specie 1 and specie 2: {np.round(t_12, 2)}. Reject null hypothesis: {abs(t_12) > CRITICAL_VALUE}.\")" + "print(f\"T test between species 0 and specie 1: {np.round(t_01, 2)}. Reject null hypothesis: {abs(t_01) > CRITICAL_VALUE}.\")\n", + "print(f\"T test between species 0 and specie 2: {np.round(t_02, 2)}. Reject null hypothesis: {abs(t_02) > CRITICAL_VALUE}.\")\n", + "print(f\"T test between species 1 and specie 2: {np.round(t_12, 2)}. Reject null hypothesis: {abs(t_12) > CRITICAL_VALUE}.\")" ] }, { @@ -1613,7 +1377,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 51, "id": "9289bc26", "metadata": {}, "outputs": [ @@ -1651,32 +1415,32 @@ " \n", " 0\n", " Adelie\n", - " 150\n", - " 38.649887\n", - " 3.997587\n", - " 0.326402\n", - " 38.010140\n", - " 39.289634\n", + " 151\n", + " 38.362705\n", + " 5.465330\n", + " 0.444762\n", + " 37.490971\n", + " 39.234439\n", " \n", " \n", " 1\n", " Chinstrap\n", " 67\n", - " 49.285002\n", - " 5.859511\n", - " 0.715853\n", - " 47.881930\n", - " 50.688074\n", + " 48.867188\n", + " 3.828321\n", + " 0.467704\n", + " 47.950489\n", + " 49.783888\n", " \n", " \n", " 2\n", " Gentoo\n", - " 122\n", - " 47.557167\n", - " 4.643492\n", - " 0.420402\n", - " 46.733179\n", - " 48.381155\n", + " 123\n", + " 47.257728\n", + " 5.387484\n", + " 0.485773\n", + " 46.305613\n", + " 48.209843\n", " \n", " \n", "\n", @@ -1684,17 +1448,17 @@ ], "text/plain": [ " species nb_penguin avg_bill_length_mm std_bill_length_mm \\\n", - "0 Adelie 150 38.649887 3.997587 \n", - "1 Chinstrap 67 49.285002 5.859511 \n", - "2 Gentoo 122 47.557167 4.643492 \n", + "0 Adelie 151 38.362705 5.465330 \n", + "1 Chinstrap 67 48.867188 3.828321 \n", + "2 Gentoo 123 47.257728 5.387484 \n", "\n", " standard_error ci_95_lower_bound ci_95_upper_bound \n", - "0 0.326402 38.010140 39.289634 \n", - "1 0.715853 47.881930 50.688074 \n", - "2 0.420402 46.733179 48.381155 " + "0 0.444762 37.490971 39.234439 \n", + "1 0.467704 47.950489 49.783888 \n", + "2 0.485773 46.305613 48.209843 " ] }, - "execution_count": 50, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -1707,14 +1471,6 @@ "df_flipper" ] }, - { - "cell_type": "markdown", - "id": "f79e8333-1f06-4019-af3c-94ff2362d036", - "metadata": {}, - "source": [ - "She can now go and present her findings to queen Icebergina." - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/html/api.html b/html/api.html index 5baea24d..b47fa85d 100644 --- a/html/api.html +++ b/html/api.html @@ -174,7 +174,7 @@

    API Documentationv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/client_api.html b/html/client_api.html index cd1cb9e5..97a29a7f 100644 --- a/html/client_api.html +++ b/html/client_api.html @@ -174,7 +174,7 @@

    Client APIv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/client_errors.html b/html/client_errors.html index 2f8e84a6..2dfb26c8 100644 --- a/html/client_errors.html +++ b/html/client_errors.html @@ -216,7 +216,7 @@

    Errors<
    v0.3.0
    -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/client_examples.html b/html/client_examples.html index 2e03fdcd..c31e42b1 100644 --- a/html/client_examples.html +++ b/html/client_examples.html @@ -54,7 +54,7 @@
  • Quickstart
  • Examples
  • -
  • Secure Data Disclosure: Client side
      +
    • Lomas Client Side: Using Smartnoise-SQL
    • Lomas Client Side: Using DiffPrivlib
        @@ -219,7 +221,7 @@

        Examples
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/client_modules.html b/html/client_modules.html index 4bdf64d8..7dad2fd7 100644 --- a/html/client_modules.html +++ b/html/client_modules.html @@ -225,7 +225,7 @@

        lomas_clientv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/client_quickstart.html b/html/client_quickstart.html index 097f96b3..75d961ad 100644 --- a/html/client_quickstart.html +++ b/html/client_quickstart.html @@ -207,7 +207,7 @@

        First stepsv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/CONTRIBUTING.html b/html/develop/en/CONTRIBUTING.html index cd45c019..ba48a2aa 100644 --- a/html/develop/en/CONTRIBUTING.html +++ b/html/develop/en/CONTRIBUTING.html @@ -366,7 +366,7 @@

        Adding a Data Connector (for private dataset in various databases)v0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/CONTRIBUTING_CLIENT.html b/html/develop/en/CONTRIBUTING_CLIENT.html index 720572d2..c9579d3b 100644 --- a/html/develop/en/CONTRIBUTING_CLIENT.html +++ b/html/develop/en/CONTRIBUTING_CLIENT.html @@ -173,7 +173,7 @@

        Pushing a new version to Pypiv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/CONTRIBUTING_SERVER.html b/html/develop/en/CONTRIBUTING_SERVER.html index e85980b5..1c2cc9bb 100644 --- a/html/develop/en/CONTRIBUTING_SERVER.html +++ b/html/develop/en/CONTRIBUTING_SERVER.html @@ -169,7 +169,7 @@

        Testsv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/_modules/index.html b/html/develop/en/_modules/index.html index a4c122df..1bb2d4c2 100644 --- a/html/develop/en/_modules/index.html +++ b/html/develop/en/_modules/index.html @@ -156,7 +156,7 @@

        All modules for which code is available

        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/_modules/lomas_client/client.html b/html/develop/en/_modules/lomas_client/client.html index a7fa4aca..a21744d1 100644 --- a/html/develop/en/_modules/lomas_client/client.html +++ b/html/develop/en/_modules/lomas_client/client.html @@ -989,7 +989,7 @@

        Source code for lomas_client.client

                 
                   
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/_modules/lomas_client/utils.html b/html/develop/en/_modules/lomas_client/utils.html index aea4fadb..beb2bfec 100644 --- a/html/develop/en/_modules/lomas_client/utils.html +++ b/html/develop/en/_modules/lomas_client/utils.html @@ -210,7 +210,7 @@

        Source code for lomas_client.utils

                 
                   
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/_modules/lomas_server/constants.html b/html/develop/en/_modules/lomas_server/constants.html index 5f66e6fa..9f9d673e 100644 --- a/html/develop/en/_modules/lomas_server/constants.html +++ b/html/develop/en/_modules/lomas_server/constants.html @@ -477,7 +477,7 @@

        Source code for lomas_server.constants

                 
                   
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/_modules/lomas_server/dataset_store/data_connector_observer.html b/html/develop/en/_modules/lomas_server/dataset_store/data_connector_observer.html index e7bcc83b..c64b987c 100644 --- a/html/develop/en/_modules/lomas_server/dataset_store/data_connector_observer.html +++ b/html/develop/en/_modules/lomas_server/dataset_store/data_connector_observer.html @@ -170,7 +170,7 @@

        Source code for lomas_server.dataset_store.data_connector_observer

        v0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/_modules/lomas_server/utils/collection_models.html b/html/develop/en/_modules/lomas_server/utils/collection_models.html index d11f3982..eb9aa119 100644 --- a/html/develop/en/_modules/lomas_server/utils/collection_models.html +++ b/html/develop/en/_modules/lomas_server/utils/collection_models.html @@ -278,7 +278,7 @@

        Source code for lomas_server.utils.collection_models

        v0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/_modules/lomas_server/utils/query_examples.html b/html/develop/en/_modules/lomas_server/utils/query_examples.html index ca69be08..44afa32a 100644 --- a/html/develop/en/_modules/lomas_server/utils/query_examples.html +++ b/html/develop/en/_modules/lomas_server/utils/query_examples.html @@ -262,7 +262,7 @@

        Source code for lomas_server.utils.query_examples

        v0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/_modules/lomas_server/utils/query_models.html b/html/develop/en/_modules/lomas_server/utils/query_models.html index 926611c5..e4ed8d0d 100644 --- a/html/develop/en/_modules/lomas_server/utils/query_models.html +++ b/html/develop/en/_modules/lomas_server/utils/query_models.html @@ -324,7 +324,7 @@

        Source code for lomas_server.utils.query_models

        <
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/api.html b/html/develop/en/api.html index 37871bc4..044a1547 100644 --- a/html/develop/en/api.html +++ b/html/develop/en/api.html @@ -174,7 +174,7 @@

        API Documentationv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/client_api.html b/html/develop/en/client_api.html index bb1ad71e..f752fbb8 100644 --- a/html/develop/en/client_api.html +++ b/html/develop/en/client_api.html @@ -174,7 +174,7 @@

        Client APIv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/client_errors.html b/html/develop/en/client_errors.html index ca497021..2d3067f7 100644 --- a/html/develop/en/client_errors.html +++ b/html/develop/en/client_errors.html @@ -216,7 +216,7 @@

        Errors<
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/client_examples.html b/html/develop/en/client_examples.html index ef56e2d6..1903ac25 100644 --- a/html/develop/en/client_examples.html +++ b/html/develop/en/client_examples.html @@ -221,7 +221,7 @@

        Examples
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/client_modules.html b/html/develop/en/client_modules.html index 36206346..100d352c 100644 --- a/html/develop/en/client_modules.html +++ b/html/develop/en/client_modules.html @@ -225,7 +225,7 @@

        lomas_clientv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/client_quickstart.html b/html/develop/en/client_quickstart.html index 4c89e144..1b0aeaab 100644 --- a/html/develop/en/client_quickstart.html +++ b/html/develop/en/client_quickstart.html @@ -207,7 +207,7 @@

        First stepsv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/genindex.html b/html/develop/en/genindex.html index f41c75e3..20ac49bd 100644 --- a/html/develop/en/genindex.html +++ b/html/develop/en/genindex.html @@ -1181,7 +1181,7 @@

        Z

        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/index.html b/html/develop/en/index.html index 4ddacebe..9ffc84c6 100644 --- a/html/develop/en/index.html +++ b/html/develop/en/index.html @@ -240,7 +240,7 @@

        Indices and tablesv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/index_under_construction.html b/html/develop/en/index_under_construction.html index 4e810701..592fc9f8 100644 --- a/html/develop/en/index_under_construction.html +++ b/html/develop/en/index_under_construction.html @@ -154,7 +154,7 @@

        Welcome to Lomas documentationv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_client.html b/html/develop/en/lomas_client.html index 3ae8f431..b5e6cfdd 100644 --- a/html/develop/en/lomas_client.html +++ b/html/develop/en/lomas_client.html @@ -741,7 +741,7 @@

        Submodulesv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.admin_database.html b/html/develop/en/lomas_server.admin_database.html index aafc0325..01df7699 100644 --- a/html/develop/en/lomas_server.admin_database.html +++ b/html/develop/en/lomas_server.admin_database.html @@ -193,7 +193,7 @@

        lomas_server.admin_database.yaml_database modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.administration.html b/html/develop/en/lomas_server.administration.html index 58c11480..3982aad8 100644 --- a/html/develop/en/lomas_server.administration.html +++ b/html/develop/en/lomas_server.administration.html @@ -175,7 +175,7 @@

        lomas_server.administration packagev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.data_connector.html b/html/develop/en/lomas_server.data_connector.html index 1d67647a..e190bbed 100644 --- a/html/develop/en/lomas_server.data_connector.html +++ b/html/develop/en/lomas_server.data_connector.html @@ -193,7 +193,7 @@

        lomas_server.data_connector.s3_connector modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.dataset_store.html b/html/develop/en/lomas_server.dataset_store.html index 52122353..b2129491 100644 --- a/html/develop/en/lomas_server.dataset_store.html +++ b/html/develop/en/lomas_server.dataset_store.html @@ -209,7 +209,7 @@

        lomas_server.dataset_store.lru_dataset_store modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.dp_queries.dp_libraries.html b/html/develop/en/lomas_server.dp_queries.dp_libraries.html index c058da6e..39b3c42a 100644 --- a/html/develop/en/lomas_server.dp_queries.dp_libraries.html +++ b/html/develop/en/lomas_server.dp_queries.dp_libraries.html @@ -197,7 +197,7 @@

        lomas_server.dp_queries.dp_libraries.utils modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.dp_queries.html b/html/develop/en/lomas_server.dp_queries.html index c8467646..d088315a 100644 --- a/html/develop/en/lomas_server.dp_queries.html +++ b/html/develop/en/lomas_server.dp_queries.html @@ -205,7 +205,7 @@

        lomas_server.dp_queries.dummy_dataset modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.html b/html/develop/en/lomas_server.html index 28e285d9..626a7614 100644 --- a/html/develop/en/lomas_server.html +++ b/html/develop/en/lomas_server.html @@ -867,7 +867,7 @@

        lomas_server.uvicorn_serve modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.routes.html b/html/develop/en/lomas_server.routes.html index 4a304388..acaf96b9 100644 --- a/html/develop/en/lomas_server.routes.html +++ b/html/develop/en/lomas_server.routes.html @@ -187,7 +187,7 @@

        lomas_server.routes.utils modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.tests.html b/html/develop/en/lomas_server.tests.html index 6b5eebd7..36e51ee9 100644 --- a/html/develop/en/lomas_server.tests.html +++ b/html/develop/en/lomas_server.tests.html @@ -199,7 +199,7 @@

        lomas_server.tests.test_mongodb_admin_cli modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/lomas_server.utils.html b/html/develop/en/lomas_server.utils.html index a460ba44..b7a31fa9 100644 --- a/html/develop/en/lomas_server.utils.html +++ b/html/develop/en/lomas_server.utils.html @@ -1286,7 +1286,7 @@

        lomas_server.utils.error_handler modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/notebooks/Demo_Client_Notebook.html b/html/develop/en/notebooks/Demo_Client_Notebook.html index cbd91a52..940350d1 100644 --- a/html/develop/en/notebooks/Demo_Client_Notebook.html +++ b/html/develop/en/notebooks/Demo_Client_Notebook.html @@ -2448,7 +2448,7 @@

        Step 4: See archives of queriesv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html b/html/develop/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html index c2ac7a0f..2c76fd3b 100644 --- a/html/develop/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html +++ b/html/develop/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html @@ -2517,7 +2517,7 @@

        Step 6: See archives of queriesv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html b/html/develop/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html index 1750e4cf..a05a06b9 100644 --- a/html/develop/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html +++ b/html/develop/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html @@ -1210,7 +1210,7 @@

        Hypothesis testingv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html b/html/develop/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html index 2bd71ef0..73b1a1a0 100644 --- a/html/develop/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html +++ b/html/develop/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html @@ -2070,7 +2070,7 @@

        Step 6: See archives of queriesv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/notebooks/local_admin_notebook.html b/html/develop/en/notebooks/local_admin_notebook.html index ea18691b..a5b43b8b 100644 --- a/html/develop/en/notebooks/local_admin_notebook.html +++ b/html/develop/en/notebooks/local_admin_notebook.html @@ -1460,7 +1460,7 @@

        Stop the server: do not do it now !v0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/notebooks/s3_example_notebook.html b/html/develop/en/notebooks/s3_example_notebook.html index a7797329..1bd94461 100644 --- a/html/develop/en/notebooks/s3_example_notebook.html +++ b/html/develop/en/notebooks/s3_example_notebook.html @@ -911,7 +911,7 @@

        Confidence intervals for age over the whole populationv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/objects.inv b/html/develop/en/objects.inv index 44ea7a0d..a7ab25b6 100644 Binary files a/html/develop/en/objects.inv and b/html/develop/en/objects.inv differ diff --git a/html/develop/en/poster.html b/html/develop/en/poster.html index be7054db..fb2a1e02 100644 --- a/html/develop/en/poster.html +++ b/html/develop/en/poster.html @@ -157,7 +157,7 @@

        Poster<
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/py-modindex.html b/html/develop/en/py-modindex.html index e8d8a3ce..c67cfd62 100644 --- a/html/develop/en/py-modindex.html +++ b/html/develop/en/py-modindex.html @@ -265,7 +265,7 @@

        Python Module Index

        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/search.html b/html/develop/en/search.html index 12c64533..15eb0ae5 100644 --- a/html/develop/en/search.html +++ b/html/develop/en/search.html @@ -162,7 +162,7 @@
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/server_administration.html b/html/develop/en/server_administration.html index 6adddb88..33304940 100644 --- a/html/develop/en/server_administration.html +++ b/html/develop/en/server_administration.html @@ -189,7 +189,7 @@

        Administrationv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/server_api.html b/html/develop/en/server_api.html index 7317337d..26e920e0 100644 --- a/html/develop/en/server_api.html +++ b/html/develop/en/server_api.html @@ -174,7 +174,7 @@

        Server APIv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/server_cli.html b/html/develop/en/server_cli.html index 808f2f63..aef6f26f 100644 --- a/html/develop/en/server_cli.html +++ b/html/develop/en/server_cli.html @@ -420,7 +420,7 @@

        Examples
        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/server_dashboard.html b/html/develop/en/server_dashboard.html index 204552c6..272aa68c 100644 --- a/html/develop/en/server_dashboard.html +++ b/html/develop/en/server_dashboard.html @@ -185,7 +185,7 @@

        Access via Onyxia Platformv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/server_deployment.html b/html/develop/en/server_deployment.html index 36b76872..263b5cdf 100644 --- a/html/develop/en/server_deployment.html +++ b/html/develop/en/server_deployment.html @@ -205,7 +205,7 @@

        Deploymentv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/server_kubernetes.html b/html/develop/en/server_kubernetes.html index d5077379..5bac6a9d 100644 --- a/html/develop/en/server_kubernetes.html +++ b/html/develop/en/server_kubernetes.html @@ -244,7 +244,7 @@

        Installing the Helm Chartv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/server_local.html b/html/develop/en/server_local.html index 69a47950..a6a60daf 100644 --- a/html/develop/en/server_local.html +++ b/html/develop/en/server_local.html @@ -223,7 +223,7 @@

        Steps to Deploy Locallyv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/server_modules.html b/html/develop/en/server_modules.html index 9b6912f9..ba66c36b 100644 --- a/html/develop/en/server_modules.html +++ b/html/develop/en/server_modules.html @@ -350,7 +350,7 @@

        lomas_serverv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/develop/en/server_onyxia.html b/html/develop/en/server_onyxia.html index 64bd02b6..2676cddc 100644 --- a/html/develop/en/server_onyxia.html +++ b/html/develop/en/server_onyxia.html @@ -199,7 +199,7 @@

        Deploying Lomas on Onyxiav0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/genindex.html b/html/genindex.html index dd3eda12..52e07e52 100644 --- a/html/genindex.html +++ b/html/genindex.html @@ -1181,7 +1181,7 @@

        Z

        v0.3.0
        -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/index.html b/html/index.html index 16f07d44..2fcaf906 100644 --- a/html/index.html +++ b/html/index.html @@ -240,7 +240,7 @@

        Indices and tablesv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/index_under_construction.html b/html/index_under_construction.html index 476c3971..8c85bf90 100644 --- a/html/index_under_construction.html +++ b/html/index_under_construction.html @@ -154,7 +154,7 @@

        Welcome to Lomas documentationv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_client.html b/html/lomas_client.html index ae3fba21..988ef390 100644 --- a/html/lomas_client.html +++ b/html/lomas_client.html @@ -741,7 +741,7 @@

        Submodulesv0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.admin_database.html b/html/lomas_server.admin_database.html index 33b12f49..b33b51fd 100644 --- a/html/lomas_server.admin_database.html +++ b/html/lomas_server.admin_database.html @@ -193,7 +193,7 @@

        lomas_server.admin_database.yaml_database modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.administration.html b/html/lomas_server.administration.html index 0548514f..2fe16db3 100644 --- a/html/lomas_server.administration.html +++ b/html/lomas_server.administration.html @@ -175,7 +175,7 @@

        lomas_server.administration packagev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.data_connector.html b/html/lomas_server.data_connector.html index dc51eeca..56a899c5 100644 --- a/html/lomas_server.data_connector.html +++ b/html/lomas_server.data_connector.html @@ -193,7 +193,7 @@

        lomas_server.data_connector.s3_connector modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.dataset_store.html b/html/lomas_server.dataset_store.html index 06769d6c..f68d2ce3 100644 --- a/html/lomas_server.dataset_store.html +++ b/html/lomas_server.dataset_store.html @@ -209,7 +209,7 @@

        lomas_server.dataset_store.lru_dataset_store modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.dp_queries.dp_libraries.html b/html/lomas_server.dp_queries.dp_libraries.html index d73c275b..35549c00 100644 --- a/html/lomas_server.dp_queries.dp_libraries.html +++ b/html/lomas_server.dp_queries.dp_libraries.html @@ -197,7 +197,7 @@

        lomas_server.dp_queries.dp_libraries.utils modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.dp_queries.html b/html/lomas_server.dp_queries.html index 45a3aaea..953b560f 100644 --- a/html/lomas_server.dp_queries.html +++ b/html/lomas_server.dp_queries.html @@ -205,7 +205,7 @@

        lomas_server.dp_queries.dummy_dataset modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.html b/html/lomas_server.html index fdb1ac54..b13d7a82 100644 --- a/html/lomas_server.html +++ b/html/lomas_server.html @@ -867,7 +867,7 @@

        lomas_server.uvicorn_serve modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.routes.html b/html/lomas_server.routes.html index 22b9a87c..eba9cb94 100644 --- a/html/lomas_server.routes.html +++ b/html/lomas_server.routes.html @@ -187,7 +187,7 @@

        lomas_server.routes.utils modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.tests.html b/html/lomas_server.tests.html index 3e8237fb..b888324a 100644 --- a/html/lomas_server.tests.html +++ b/html/lomas_server.tests.html @@ -199,7 +199,7 @@

        lomas_server.tests.test_mongodb_admin_cli modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/lomas_server.utils.html b/html/lomas_server.utils.html index 2236a71b..a2beddaa 100644 --- a/html/lomas_server.utils.html +++ b/html/lomas_server.utils.html @@ -1286,7 +1286,7 @@

        lomas_server.utils.error_handler modulev0.3.0 -
        v0.3.1
        +
        v0.3.2
        diff --git a/html/notebooks/Demo_Client_Notebook.html b/html/notebooks/Demo_Client_Notebook.html index 9a9379ab..07f0fe71 100644 --- a/html/notebooks/Demo_Client_Notebook.html +++ b/html/notebooks/Demo_Client_Notebook.html @@ -23,7 +23,7 @@ - + @@ -73,7 +73,7 @@
      • Step 4: See archives of queries
    • -
    • Secure Data Disclosure: Client side
    • +
    • Lomas Client Side: Using Smartnoise-SQL
    • Lomas Client Side: Using DiffPrivlib
    • Lomas Client Side: Using Smartnoise-Synth
    • S3 example
    • @@ -2397,7 +2397,7 @@

      Step 4: See archives of queries - +


  • @@ -2448,7 +2448,7 @@

    Step 4: See archives of queriesv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/notebooks/Demo_Client_Notebook_DiffPrivLib.html b/html/notebooks/Demo_Client_Notebook_DiffPrivLib.html index f6d62531..2b1f44b7 100644 --- a/html/notebooks/Demo_Client_Notebook_DiffPrivLib.html +++ b/html/notebooks/Demo_Client_Notebook_DiffPrivLib.html @@ -24,7 +24,7 @@ - + @@ -55,7 +55,7 @@
  • Quickstart
  • Examples
  • @@ -2517,7 +2517,7 @@

    Step 6: See archives of queriesv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html b/html/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html index e454eb85..36a4ef6c 100644 --- a/html/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html +++ b/html/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html @@ -6,7 +6,7 @@ - Secure Data Disclosure: Client side — Lomas 0.0.1 documentation + Lomas Client Side: Using Smartnoise-SQL — Lomas 0.0.1 documentation @@ -55,20 +55,23 @@
  • Quickstart
  • Examples
    • Lomas: Client demo
    • -
    • Secure Data Disclosure: Client side
        +
      • Lomas Client Side: Using Smartnoise-SQL
        • Step 1: Install the library
        • Step 2: Initialise the client
        • -
        • Step 3: Understand the functionnalities of the library
            -
          • Getting dataset metadata
          • -
          • Get a dummy dataset
          • +
          • Step 3: Getting dataset metadata
          • +
          • Step 4: Average bill length with Smartnoise-SQL
          • Step 4: Penguin statistics +
          • +
          • Note on budget with Smartnoise-SQL (Advanced)
          • @@ -117,7 +120,7 @@
            • - +
            • View page source
            • @@ -127,31 +130,37 @@
              -
              -

              Secure Data Disclosure: Client side

              -

              This notebook showcases how researcher could use the Secure Data Disclosure system. It explains the different functionnalities provided by the dpserial client library to interact with the secure server.

              +
              +

              Lomas Client Side: Using Smartnoise-SQL

              +

              This notebook showcases how researcher could use lomas platform with Smartnoise-SQL. It explains the different functionnalities provided by the lomas-client client library to interact with lomas server.

              The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.

              Each user has access to one or multiple projects and for each dataset has a limited budget \(\epsilon\), \(\delta\).

              -

              🐧🐧🐧 In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins dimensions.

              -

              Therefore, the powerful queen Icerbegina 👑 had the data collected. But in order to get the penguins to agree to participate she promised them that no one would be able to look at the data and that no one would be able to guess the bill width of any specific penguin (which is very sensitive information) from the data. Nobody! Not even the researchers. The queen hence stored the data on the Secure Data Disclosure Server and only gave a small budget to Dr. Antarctica.

              -

              This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library ofs_dpserial. 🐧🐧🐧

              +

              In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins data.

              Step 1: Install the library

              -

              To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library fso_dpserial on her local developping environment.

              +

              To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library lomas-client on her local developping environment.

              It can be installed via the pip command:

              [1]:
               
              +
              # !pip install lomas_client
              +
              +
              +
              +

              Or using a local version of the client

              +
              +
              [2]:
              +
              +
              import sys
               import os
               sys.path.append(os.path.abspath(os.path.join('..')))
              -# !pip install lomas_client
               
              -
              [2]:
              +
              [3]:
               
              from lomas_client.client import Client
              @@ -164,9 +173,9 @@ 

              Step 1: Install the library

              Once the library is installed, a Client object must be created. It is responsible for sending sending requests to the server and processing responses in the local environment. It enables a seamless interaction with the server.

              To create the client, Dr. Antartica needs to give it a few parameters: - a url: the root application endpoint to the remote secure server. - user_name: her name as registered in the database (Dr. Alice Antartica) - dataset_name: the name of the dataset that she wants to query (PENGUIN)

              -

              She will only be able to query on the real dataset if the queen Icergina has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some epsilon and delta credit. (As is done in the Secure Data Disclosure Notebook: Server side).

              +

              She will only be able to query on the real dataset if the administrator has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some \(\epsilon\), \(\delta\) privacy loss budget.

              -
              [3]:
              +
              [4]:
               
              -
              -

              Step 3: Understand the functionnalities of the library

              -
              -

              Getting dataset metadata

              -

              Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the get_dataset_metadata() function of the client. As this is public information, this does not cost any budget.

              -

              This function returns metadata information in the same format as SmartnoiseSQL dictionary format, where among other, there is information about all the available columns, their type, bound values (see Smartnoise page for more details).

              +
              +

              Step 3: Getting dataset metadata

              -
              -

              Get a dummy dataset

              -

              Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset.

              -

              Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets. Getting a dummy dataset does not affect the budget as there is no differential privacy here, it is not a synthetic dataset and all that could be learn here is already present in the public metadata.

              -

              Dr. Antartica first create a dummy dataset with the default options.

              -
              [5]:
              +
              [6]:
               
              -
              df_dummy = client.get_dummy_dataset()
              -print(df_dummy.shape)
              -df_dummy.head()
              +
              nb_penguin = metadata['rows']
              +print(f"Number of penguins: {nb_penguin}.")
               
              -
              +
              -(100, 7)
              +Number of penguins: 344.
               
              +
              +
              [7]:
              +
              +
              +
              columns = metadata["columns"].keys()
              +columns
              +
              +
              +
              -
              [5]:
              +
              [7]:
               
              -
              -
              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
              speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
              0ChinstrapTorgersen43.10890413.314292214.2031652258.408606FEMALE
              1AdelieDream63.27500119.364104158.4139964656.773158FEMALE
              2AdelieDream55.61978816.143560166.1628714703.175608FEMALE
              3AdelieBiscoe50.95304718.085707239.8554195187.149507MALE
              4GentooTorgersen35.46065222.075665210.6429065630.456669MALE
              -
              +
              +
              +dict_keys(['species', 'island', 'bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g', 'sex'])
              +
              -

              However, she would prefer to have a dataset with 200 rows and chooses a seed of 0, hence:

              +
              +
              +

              Step 4: Average bill length with Smartnoise-SQL

              +
              +

              Query dummy dataset

              +

              Now that she has an idea of what the data looks like, she wants to start querying the real dataset to for her research. However, before this, other tools are at her disposal to reduce potential error risks and avoid spending budget on irrelevant queries. Of course, this does not have any impact on the budget.

              +

              It is possible to specify the flag dummy=True in the various queries to perform the query on the dummy dataset instead of the real dataset and ensure that the queries are doing what is expected of them.

              -
              [6]:
              +
              [8]:
               
              -
              NB_ROWS = 200
              -SEED = 0
              +
              # Average bill length in mm
              +QUERY = "SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df"
               
              -
              -
              [7]:
              +
              +
              [9]:
               
              -
              df_dummy = client.get_dummy_dataset(nb_rows = NB_ROWS, seed = SEED)
              -print(df_dummy.shape)
              -df_dummy.head()
              +
              EPSILON = 0.5
              +DELTA = 1e-5
               
              -
              -
              -
              -
              -
              -(200, 7)
              -
              +
              +
              [10]:
              +
              -
              -
              [7]:
              +
              # On the remote server dummy dataframe
              +dummy_res = client.smartnoise_sql_query(
              +    query = QUERY,
              +    epsilon = EPSILON,
              +    delta = DELTA,
              +    dummy = True,
              +)
               
              -
              -
              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
              speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
              0GentooBiscoe49.20847316.117959190.1259502873.291927FEMALE
              1GentooTorgersen55.03162819.963435242.9291423639.940005FEMALE
              2ChinstrapTorgersen51.09671816.777518159.9614935401.743330MALE
              3AdelieBiscoe49.07091114.796037244.5301532316.038092MALE
              4ChinstrapBiscoe44.82791813.246787236.9488535036.246870FEMALE
              -
              -
              -
              -

              Query dummy dataset

              -

              Now that she has an idea of what the data looks like, she wants to start querying the real dataset to for her research. However, before this other tools are at her disposal to reduce potential error risks and avoid spending budget on irrelevant queries. Of course, this does not have any impact on the budget.

              -

              It is possible to specify the flag dummy=True in the various queries to perform the query on the dummy dataset instead of the real dataset and ensure that the queries are doing what is expected of them.

              -

              Therefore Dr. Antartica computes the results that she gets on the dummy dataframe that she created locally and on the same dummy dataframe in the server via a query and compare them to ensure that the query is well defined and works within the server.

              -

              She tests with an example on the average bill length on the dataframe.

              -
              [8]:
              +
              [11]:
               
              -
              # On the local dummy dataframe
              -result_local_dummy = round(df_dummy['bill_length_mm'].mean(), 5)
              -result_local_dummy
              +
              avg_bl_dummy = np.round(dummy_res['query_response']["avg_bill_length_mm"][0], 2)
              +f"Average bill length on dummy: {avg_bl_dummy}mm."
               
              -
              [8]:
              +
              [11]:
               
              -47.51532
              +'Average bill length on dummy: 46.68mm.'
               
              -

              As the query on the server goes through the same workflow for dummies and real data, she still has to set values for theoratical budget to spend on the dummy query. Of course, this theoretical budget will NOT affect her real budget as this is on dummy data.

              -

              It is recommended to use very high values on the budget parameters here to have little noise and small difference between the exact local result and the ‘little noisy’ server result.

              -

              Also, make sure to use the same values of number of rows and seed to have the same dummy datasets.

              +
              +
              +

              Estimate cost of a query

              +

              Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an epsilon and a delta.

              -
              [9]:
              +
              [12]:
               
              -
              # Average bill length in mm
              -QUERY = "SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df"
              +
              cost = client.estimate_smartnoise_sql_cost(
              +    query = QUERY,
              +    epsilon = EPSILON,
              +    delta = DELTA,
              +)
               
              -
              [10]:
              +
              [13]:
               
              -
              # On the remote server dummy dataframe
              -res = client.smartnoise_sql_query(
              -    query = QUERY,
              -    epsilon = 100.0, # make sure to select high values of epsilon and delta to have small differences
              -    delta = 2.0,    # make sure to select high values of epsilon and delta to have small differences
              -    dummy = True,
              -    nb_rows = NB_ROWS,
              -    seed = SEED
              -)
              -res_server_dummy = res['query_response']["avg_bill_length_mm"][0]
              -res_server_dummy
              +
              f'This query would actually cost her {cost["epsilon_cost"]} epsilon and {cost["delta_cost"]} delta.'
               
              -
              [10]:
              +
              [13]:
               
              -47.51229381350249
              +'This query would actually cost her 1.0 epsilon and 5.000000000032756e-06 delta.'
               
              -

              She then checks that the responses on the dummy locally and the dummy on the server are close enough (difference would be only due to small noise addition).

              +

              This is actually twice as much as what she initially put in. In the background, Smartnoise-SQL decomposes the DP query in multiple other queries and the budget given as input is spent on each of these sub-queries. Here for the average, we need a sum divided by a count, hence EPSILON is spent once for the sum and then once more for the count. (see NOTE below for tips and explanation).

              +
              +
              +

              Overide DP mechanism

              +

              She wants to use another DP-mechanism for this query. She can change it via the mechanism argument. See Smartnoise-SQL documentation here for overriding mechanisms.

              -
              [11]:
              +
              [14]:
               
              -
              np.testing.assert_almost_equal(
              -    result_local_dummy,
              -    res_server_dummy,
              -    decimal=2,
              -    err_msg="Responses are different, either try with a bigger budget or query is not doing what is intended."
              +
              # On the remote server dummy dataframe
              +dummy_res = client.smartnoise_sql_query(
              +    query = QUERY,
              +    epsilon = EPSILON,
              +    delta = DELTA,
              +    mechanisms = {"count": "gaussian", "sum_float": "laplace"},
              +    dummy = True,
               )
               
              -

              As you can see res_local and res_server are close. We can accept that the small difference is due to the small noise added due to the large values of \(\epsilon\) and \(\delta\).

              -
              -
              -

              Get current budget

              -

              It is the first time that Dr. Antartica connects to the server and she wants to know how much buget the queen assigned her. Therefore, she calls the fonction get_initial_budget.

              -
              [12]:
              +
              [15]:
               
              -
              client.get_initial_budget()
              +
              avg_bl_dummy = np.round(dummy_res['query_response']["avg_bill_length_mm"][0], 2)
              +f"Average bill length on dummy: {avg_bl_dummy}mm."
               
              -
              [12]:
              +
              [15]:
               
              -{'initial_epsilon': 10.0, 'initial_delta': 0.005}
              +'Average bill length on dummy: 50.83mm.'
               
              -

              She sees that she has 10.0 epsilon and 0.0004 epsilon at her disposal.

              -

              Then she checks her total spent budget get_total_spent_budget. As she only did queries on metadata on dummy dataframes, this should still be 0.

              -
              [13]:
              +
              [16]:
               
              -
              client.get_total_spent_budget()
              +
              cost = client.estimate_smartnoise_sql_cost(
              +    query = QUERY,
              +    epsilon = EPSILON,
              +    delta = DELTA,
              +    mechanisms = {"count": "gaussian", "sum_float": "laplace"}
              +)
              +cost
               
              -
              [13]:
              +
              [16]:
               
              -{'total_spent_epsilon': 2.714285714286655, 'total_spent_delta': 0.0}
              +{'epsilon_cost': 1.0, 'delta_cost': 1.4999949999983109e-05}
               
              -

              It will also be useful to know what the remaining budget is. Therefore, she calls the function get_remaining_budget. It just substarcts the total spent budget from the initial budget.

              +
              +
              +

              Query real dataset

              +

              Dr. Antartica is ready to query the real dataset and get a differentially private response for the average bill length. The dummy flag is False by default, so setting it is optional. She uses the values of epsilon and delta that she selected just before.

              +

              Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query.

              +
              +
              [17]:
              +
              +
              +
              avg_bill_length_response = client.smartnoise_sql_query(
              +    query = QUERY,
              +    epsilon = EPSILON,
              +    delta = DELTA,
              +    mechanisms = {"count": "gaussian", "sum_float": "laplace"},
              +    dummy = False
              +)
              +
              +
              +
              -
              [14]:
              +
              [18]:
               
              -
              client.get_remaining_budget()
              +
              avg_bill_length = avg_bill_length_response['query_response']['avg_bill_length_mm'].iloc[0]
              +print(f"Average bill length on private data: {np.round(avg_bill_length, 2)}mm.")
               
              -
              [14]:
              -
              +
              -{'remaining_epsilon': 7.285714285713345, 'remaining_delta': 0.005}
              +Average bill length on private data: 45.19mm.
               
              -

              As expected, for now the remaining budget is equal to the inital budget.

              +

              After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:

              -
              -

              Estimate cost of a query

              -

              Another safeguard is the functionnality to estimate the cost of a query. As in OpenDP and SmartnoiseSQL, the budget that will by used by a query might be slightly different than what is asked by the user. The estimate cost function returns the estimated real cost of any query.

              -

              Again, of course, this will not impact the user’s budget.

              -

              Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an epsilon and a delta.

              +
              +

              Postprocess

              +

              It is also possible to use the ‘postprocess’ argument from Smartnoise-SQL see its documentation here by specifying it in the query.

              -
              [15]:
              +
              [19]:
               
              -
              client.estimate_smartnoise_sql_cost(
              +
              dummy_res = client.smartnoise_sql_query(
                   query = QUERY,
              -    epsilon = 1.0,
              -    delta = 1e-4
              +    epsilon = EPSILON,
              +    delta = DELTA,
              +    postprocess = True,
              +    dummy = True,
               )
              +dummy_res
               
              -
              [15]:
              +
              [19]:
               
              -{'epsilon_cost': 2.0, 'delta_cost': 4.999999999999449e-05}
              +{'query_response':    avg_bill_length_mm
              + 0           46.850983}
               
              -

              So this query would actually cost her 3.0 epsilon and a little 1.499e-4 delta. As she does not want to spend to much budget here she tries other values of budget.

              -
              [16]:
              +
              [20]:
               
              -
              client.estimate_smartnoise_sql_cost(
              +
              dummy_res = client.smartnoise_sql_query(
                   query = QUERY,
              -    epsilon = 0.2,
              -    delta = 1e-5
              +    epsilon = EPSILON,
              +    delta = DELTA,
              +    postprocess = False,
              +    dummy = True,
               )
              +dummy_res
               
              -
              [16]:
              +
              [20]:
               
              -{'epsilon_cost': 0.4, 'delta_cost': 5.000000000032756e-06}
              +{'query_response':          res_0      res_1
              + 0  4659.909203  96.041455}
               
              -

              This query would actually cost her 0.6 epsilon and a similar delta. She decides that it is good enough.

              +
              +
              +
              +

              Step 4: Penguin statistics

              +
              +

              Confidence intervals for flipper length over the whole population

              +

              She is first interested to have a better idea of the distribution of bill length of all species. She already has the number of penguins (=number of rows as max_ids=1) from the metadata and the average bill length from step 3, so she just needs to compute the standard deviation. As it is just an exploration step, she uses very little budget values.

              -
              [17]:
              +
              [21]:
              +
              +
              +
              QUERY = "SELECT STD(bill_length_mm) AS std_bill_length_mm FROM df"
              +
              +
              +
              +

              She again first verifies that her query works on the dummy dataset:

              +
              +
              [22]:
              +
              +
              +
              dummy_res = client.smartnoise_sql_query(
              +    query = QUERY,
              +    epsilon = 0.5,
              +    delta = 1e-5,
              +    dummy = True
              +)
              +
              +
              +
              +
              +
              [23]:
              +
              +
              +
              dummy_std = np.round(dummy_res['query_response']['std_bill_length_mm'].iloc[0], 2)
              +f"The dummy standard variation is {dummy_std}."
              +
              +
              +
              +
              +
              [23]:
              +
              +
              +
              +
              +'The dummy standard variation is 16.64.'
              +
              +
              +

              The syntax of the query works, now she checks the budget:

              +
              +
              [24]:
               
              -
              EPSILON = 0.2
              -DELTA = 1e-5
              +
              cost = client.estimate_smartnoise_sql_cost(
              +    query = QUERY,
              +    epsilon = 0.5,
              +    delta = 1e-5
              +)
               
              -
              -
              -

              Query real dataset

              -

              Now that all the safeguard functions were tested, Dr. Antartica is ready to query on the real dataset and get a differentially private response of the average bill length. By default, the flag dummy is False so setting it is optional. She uses the values of epsilon and delta that she selected just before.

              -

              Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query.

              -
              [18]:
              +
              [25]:
               
              -
              client.get_remaining_budget()
              +
              f'This query would actually cost her {cost["epsilon_cost"]} epsilon and {cost["delta_cost"]} delta.'
               
              -
              [18]:
              +
              [25]:
               
              -{'remaining_epsilon': 7.285714285713345, 'remaining_delta': 0.005}
              +'This query would actually cost her 1.5 epsilon and 5.000000000032756e-06 delta.'
               
              +

              This time it is three times the budget because the standard deviation needs the average, then a difference and a count again.

              -
              [19]:
              +
              [26]:
               
              -
              avg_bill_length_response = client.smartnoise_sql_query(
              +
              response = client.smartnoise_sql_query(
                   query = QUERY,
              -    epsilon = EPSILON,
              -    delta = DELTA,
              -    dummy = False
              +    epsilon = 0.5,
              +    delta = 1e-5
               )
               
              -
              [20]:
              +
              [27]:
               
              -
              avg_bill_length = avg_bill_length_response['query_response']['avg_bill_length_mm'].iloc[0]
              -print(f"Average bill length: {np.round(avg_bill_length, 2)}mm.")
              +
              std_bill_length = response['query_response']['std_bill_length_mm'].iloc[0]
              +print(f"Standard deviation of bill length: {np.round(std_bill_length, 2)}.")
               
              @@ -692,267 +604,225 @@

              Query real dataset
              -Average bill length: 44.18mm.
              +Standard deviation of bill length: 8.83.
               

              -

              After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:

              +

              She can now do all the postprocessing that she wants with the returned data without increasing the privacy risk.

              -
              [21]:
              +
              [28]:
               
              -
              client.get_remaining_budget()
              +
              # Get standard error
              +standard_error = std_bill_length/np.sqrt(nb_penguin)
              +print(f"Standard error of bill length: {np.round(standard_error, 2)}.")
               
              -
              [21]:
              -
              +
              -{'remaining_epsilon': 6.885714285713345,
              - 'remaining_delta': 0.004994999999999967}
              +Standard error of bill length: 0.48.
               
              -

              As can be seen in get_total_spent_budget(), it is the budget estimated with estimate_cost() that was spent.

              -
              [22]:
              +
              [29]:
               
              -
              client.get_total_spent_budget()
              +
               # Compute the 95% confidence interval
              +ZSCORE = 1.96
              +lower_bound, upper_bound = avg_bill_length - ZSCORE*standard_error, avg_bill_length + ZSCORE*standard_error
              +print(f"The 95% confidence interval of the bill length of all penguins is [{np.round(lower_bound, 2)}, {np.round(upper_bound, 2)}].")
               
              -
              [22]:
              -
              +
              -{'total_spent_epsilon': 3.114285714286655,
              - 'total_spent_delta': 5.000000000032756e-06}
              +The 95% confidence interval of the bill length of all penguins is [44.25, 46.12].
               
              -

              Dr. Antartica has now a differentially private estimation of the bill length of all birds and is confident to use the library for the rest of her analyses.

              -
              -

              Step 4: Penguin statistics

              -
              -

              Confidence intervals for flipper length over the whole population

              -

              She is first interested to have a better idea of the distribution of flipper length of all species. She already has the mean from step 3, so she just need to compute the standard deviation and know the number of penguins in the dataset. As it is just an exploration step, she uses very little budget values.

              +
              +

              Note on budget with Smartnoise-SQL (Advanced)

              +

              All of these queries will cost the same budget in Smartnoise-SQL. The reason is that the smartnoise-sql translates the input query in sub queries, finds the answer for each sub query for the budget in input and then assembles the results. For the first ‘standard deviation’ query, it requires a count, an average, and only then the computation for the standard deviation. Hence, to save budget it is better to make a general query directly and retrieve all the ‘sub-answers’.

              -
              [23]:
              +
              [30]:
               
              -
              QUERY = "SELECT COUNT(bill_length_mm) AS nb_penguin, STD(bill_length_mm) AS std_bill_length_mm FROM df"
              +
              epsilon = 1.0
              +delta = 1e-5
               
              -

              She again first verifies that her query works on the dummy dataset:

              -
              [24]:
              +
              [31]:
               
              -
              dummy_res = client.smartnoise_sql_query(
              -    query = QUERY,
              -    epsilon = 100.0,
              -    delta = 10.0,
              -    dummy = True
              -)
              -dummy_res['query_response']
              +
              QUERY = "SELECT STD(bill_length_mm) AS std_bill_length_mm FROM df"
              +cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)
              +cost
               
              -
              [24]:
              +
              [31]:
               
              -
              -
              - - - - - - - - - - - - - - - - -
              nb_penguinstd_bill_length_mm
              010010.332225
              -
              +
              +
              +{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}
              +
              -

              The syntax of the query works, now she checks the budget:

              -
              [25]:
              +
              [32]:
               
              -
              client.estimate_smartnoise_sql_cost(
              -    query = QUERY,
              -    epsilon = 0.5,
              -    delta = 1e-5
              -)
              +
              QUERY = "SELECT AVG(bill_length_mm) AS avg_bl, STD(bill_length_mm) as std_bl FROM df"
              +cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)
              +cost
               
              -
              [25]:
              +
              [32]:
               
              -{'epsilon_cost': 1.5, 'delta_cost': 5.000000000032756e-06}
              +{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}
               
              -

              It is a bit too much, she decides to test for less:

              -
              [26]:
              +
              [33]:
               
              -
              client.estimate_smartnoise_sql_cost(
              -    query = QUERY,
              -    epsilon = 0.25,
              -    delta = 1e-5
              -)
              +
              QUERY = "SELECT COUNT(bill_length_mm) AS count_bl, AVG(bill_length_mm) AS avg_bl, STD(bill_length_mm) as std_bl FROM df"
              +cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)
              +cost
               
              -
              [26]:
              +
              [33]:
               
              -{'epsilon_cost': 0.75, 'delta_cost': 5.000000000032756e-06}
              +{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}
               
              -

              That’s fine, she is ready to query:

              +

              A way to know the sub-queries of a query is to use the following Smartnoise-SQL code:

              +
              +
              [34]:
              +
              +
              +
              # Convert metadata to Smartnoise-SQL compliant metadata
              +metadata = dict(metadata)
              +metadata.update(metadata["columns"])
              +del metadata["columns"]
              +snsql_metadata = {"": {"": {"df": metadata}}}
              +
              +
              +
              +
              +
              [35]:
              +
              +
              +
              # Write the query to inspect
              +QUERY = "SELECT STD(bill_length_mm) as std_bl FROM df"
              +#QUERY = "SELECT COUNT(*) as nb_row FROM df"
              +
              +
              +
              -
              [27]:
              +
              [36]:
               
              -
              response = client.smartnoise_sql_query(query = QUERY, epsilon = 0.25, delta = 1e-5)
              -response = response['query_response']
              -response
              +
              from snsql.sql.private_rewriter import Rewriter
              +rewriter = Rewriter(snsql_metadata)
              +rewriter.options.row_privacy = metadata["row_privacy"]
              +rewriter.options.max_contrib = metadata["max_ids"]
              +dp_query = rewriter.query(QUERY)
              +dp_query
               
              -
              [27]:
              +
              [36]:
               
              -
              -
              - - - - - - - - - - - - - - - - -
              nb_penguinstd_bill_length_mm
              034313.064982
              -
              +
              +
              +<snsql._ast.ast.Query at 0x70772e4e5310>
              +
              +

              The original dp query is represented as one query:

              -
              [28]:
              +
              [37]:
               
              -
              nb_penguin = response['nb_penguin'].iloc[0]
              -print(f"Number of penguins: {nb_penguin}.")
              -
              -std_bill_length = response['std_bill_length_mm'].iloc[0]
              -print(f"Standard deviation of bill length: {np.round(std_bill_length, 2)}.")
              +
              dp_query._named_symbols
               
              -
              +
              [37]:
              +
              -Number of penguins: 343.
              -Standard deviation of bill length: 13.06.
              +{'std_bl': <snsql._ast.tokens.Symbol at 0x70772e4f5a90>}
               
              -

              She can now do all the postprocessing that she wants with the returned data without adding any privacy risk.

              +

              But has 4 named symbols inside: 2 alias for the 2 SQL subqueries - ‘keycount’ for ‘count_bill_length_mm’, - ‘sum_alias_0xxxx’ for ‘sum_bill_length_mm’

              -
              [29]:
              +
              [38]:
               
              -
              # Get standard error
              -standard_error = std_bill_length/np.sqrt(nb_penguin)
              -print(f"Standard error of bill length: {np.round(standard_error, 2)}.")
              +
              subquery = dp_query.source.relations[0].primary.query
              +syms = subquery._named_symbols
              +syms
               
              -
              +
              [38]:
              +
              -Standard error of bill length: 0.71.
              +{'keycount': <snsql._ast.tokens.Symbol at 0x70772f81b410>,
              + 'sum_alias_0xde09': <snsql._ast.tokens.Symbol at 0x70772e4e7990>,
              + 'count_bill_length_mm': <snsql._ast.tokens.Symbol at 0x70772e4e7a10>,
              + 'sum_bill_length_mm': <snsql._ast.tokens.Symbol at 0x70772e4779d0>}
               
              +

              This last query with group_by will cost the same because max_ids=1 (a penguin appears in the dataset at most once) and so the group_by is applied on different partitions of the population.

              -
              [30]:
              +
              [39]:
               
              -
               # Compute the 95% confidence interval
              -ZSCORE = 1.96
              -lower_bound, upper_bound = avg_bill_length - ZSCORE*standard_error, avg_bill_length + ZSCORE*standard_error
              -print(f"The 95% confidence interval of the bill length of all penguins is [{np.round(lower_bound, 2)}, {np.round(upper_bound, 2)}].")
              +
              QUERY = "SELECT COUNT(bill_length_mm) AS count_bl, AVG(bill_length_mm) AS avg_bl, STD(bill_length_mm) as std_bl FROM df GROUP BY species"
              +cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)
              +cost
               
              -
              +
              [39]:
              +
              -The 95% confidence interval of the bill length of all penguins is [42.8, 45.57].
              +{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}
               
              -
              +

              NOTE: in the current code of Smartnoise-SQL, there is no odometer. Meaning all queries are independant. If someone first queries the private dataset for a count, then a second time for the average and then for the standard deviation then the total cost will be added: 3 count + 2 average + 1 std. That’s why it is better to do everything in one query.

              Hypothesis testing

              So, Dr. Antartica has now the opportunity to study the various penguins dimensions and will do an hypotheses testing analysis to discover if flipper length differ between the penguins species.

              @@ -963,7 +833,7 @@

              Hypothesis testing -
              [31]:
              +
              [40]:
               
              CRITICAL_VALUE = 0.05
              @@ -971,7 +841,7 @@ 

              Hypothesis testing -
              -

              She estimates how much budget it would really cost:

              -
              -
              [33]:
              -
              -
              -
              client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 1, delta = 1e-4)
              -
              -
              -
              -
              -
              [33]:
              +        FROM df GROUP BY species"
               
              -
              -
              -{'epsilon_cost': 3.0, 'delta_cost': 4.999999999999449e-05}
              -
              -

              The real cost seems to be 3 times the epsilon that she sets. It is a lot but she tries on the dummy dataset to verify all is working properly.

              +

              She checks the remaining budget:

              -
              [34]:
              +
              [42]:
               
              -
              dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 1, delta = 1.0, dummy = True)
              -dummy_res
              +
              client.get_remaining_budget()
               
              -
              [34]:
              +
              [42]:
               
              -{'query_response':      species  nb_penguin  avg_bill_length_mm  std_bill_length_mm
              - 0     Adelie          39           45.659944           10.695675
              - 1  Chinstrap          33           45.690454           14.067739
              - 2     Gentoo          31           38.472887           14.542186}
              +{'remaining_epsilon': 7.5, 'remaining_delta': 0.004980000049999984}
               
              -

              She did not give enough budget for the query to work. This is why there are ‘NANs’ in the output. She has to spend more budget for the query to work.

              +

              She estimates how much budget it would really cost:

              -
              [35]:
              +
              [43]:
               
              -
              client.get_remaining_budget()
              +
              client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 1.0, delta = 1e-4)
               
              -
              [35]:
              +
              [43]:
               
              -{'remaining_epsilon': 6.135714285713345,
              - 'remaining_delta': 0.004989999999999935}
              +{'epsilon_cost': 3.0, 'delta_cost': 4.999999999999449e-05}
               
              -

              The maximum she can do with all her remaining budget of 7.4 is around 7.4/4 = 1.85. Let’s check:

              +

              The real cost seems to be 3 times the epsilon that she sets. It is a lot but she tries on the dummy dataset to verify all is working properly.

              -
              [42]:
              +
              [44]:
               
              -
              client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 7.4/4, delta = 1e-4)
              +
              dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 0.1, delta = 1e-8, dummy = True)
              +dummy_res
               
              -
              [42]:
              +
              [44]:
               
              -{'epsilon_cost': 5.550000000000001, 'delta_cost': 4.999999999999449e-05}
              +{'query_response':      species  nb_penguin  avg_bill_length_mm  std_bill_length_mm
              + 0     Adelie          25           59.830486           27.444144
              + 1  Chinstrap          47           13.527649           28.501660
              + 2     Gentoo          28           42.375624           33.967001}
               
              +

              She did not give enough budget for the query to work. This is why there are ‘NANs’ in the output. She has to spend more budget for the query to work.

              -
              [43]:
              +
              [45]:
               
              -
              dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 7.4/4, delta = 1e-4, dummy = True)
              +
              dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 7.5/3, delta = 1e-4, dummy = True)
               dummy_res
               
              -
              [43]:
              +
              [45]:
               
               {'query_response':      species  nb_penguin  avg_bill_length_mm  std_bill_length_mm
              - 0     Adelie          37           48.755816            3.634415
              - 1  Chinstrap          33           46.912863            4.552931
              - 2     Gentoo          29           41.803438           17.566451}
              + 0     Adelie          36           49.021514            3.944748
              + 1  Chinstrap          31           49.048848            3.801831
              + 2     Gentoo          30           41.176308            7.628134}
               

              If it errors, she might need to re-run the query a few times until it works. The budget is not affected by dummy queries anyway.

              -
              [44]:
              +
              [46]:
               
              -
              flipper_length_response = client.smartnoise_sql_query(query = QUERY, epsilon = 7.4/4, delta = 1e-4)
              +
              flipper_length_response = client.smartnoise_sql_query(query = QUERY, epsilon = 7.5/3, delta = 1e-4)
               

              And now she should not have any remaining budget:

              -
              -
              [45]:
              -
              -
              -
              client.get_remaining_budget()
              -
              -
              -
              -
              -
              [45]:
              -
              -
              -
              -
              -{'remaining_epsilon': 0.5857142857133439,
              - 'remaining_delta': 0.00493999999999994}
              -
              -

              But she can do her post-processing and hypothesis analysis.

              -
              [46]:
              +
              [47]:
               
              df_flipper = flipper_length_response['query_response']
              @@ -1120,7 +954,7 @@ 

              Hypothesis testing -
              [46]:
              +
              [47]:
               
              @@ -1152,23 +986,23 @@

              Hypothesis testing\(t\)-test:

              -
              [47]:
              +
              [48]:
               
              def t_test(avg_1, avg_2, std_1, std_2, nb_1, nb_2):
              @@ -1186,7 +1020,7 @@ 

              Hypothesis testing -
              [48]:
              +
              [49]:
               
              nb_0, avg_0, std_0 = df_flipper[['nb_penguin', 'avg_bill_length_mm', 'std_bill_length_mm']].iloc[0]
              @@ -1196,16 +1030,16 @@ 

              Hypothesis testing -

              All t-tests are above the critical value of 0.5. She can reject the null hypothesis.

              She finally computes the confidence intervals for the flipper length of each species

              -
              [50]:
              +
              [51]:
               
              ZSCORE = 1.96
              @@ -1234,7 +1068,7 @@ 

              Hypothesis testing -
              [50]:
              +
              [51]:
               
              @@ -1269,38 +1103,37 @@

              Hypothesis testing
              [ ]:
               
              @@ -1377,7 +1210,7 @@

              Hypothesis testingv0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb b/html/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb index 33d0c68b..b4068ff4 100644 --- a/html/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb +++ b/html/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb @@ -5,7 +5,7 @@ "id": "3f18d338", "metadata": {}, "source": [ - "# Secure Data Disclosure: Client side" + "# Lomas Client Side: Using Smartnoise-SQL" ] }, { @@ -13,7 +13,7 @@ "id": "1582a2ae", "metadata": {}, "source": [ - "This notebook showcases how researcher could use the Secure Data Disclosure system. It explains the different functionnalities provided by the dpserial client library to interact with the secure server.\n", + "This notebook showcases how researcher could use lomas platform with Smartnoise-SQL. It explains the different functionnalities provided by the `lomas-client` client library to interact with lomas server.\n", "\n", "The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.\n", "\n", @@ -25,13 +25,7 @@ "id": "5b73135c", "metadata": {}, "source": [ - "🐧🐧🐧\n", - "In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins dimensions.\n", - "\n", - "Therefore, the powerful queen Icerbegina 👑 had the data collected. But in order to get the penguins to agree to participate she promised them that no one would be able to look at the data and that no one would be able to guess the bill width of any specific penguin (which is very sensitive information) from the data. Nobody! Not even the researchers. The queen hence stored the data on the Secure Data Disclosure Server and only gave a small budget to Dr. Antarctica.\n", - "\n", - "This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library ofs_dpserial. \n", - "🐧🐧🐧" + "In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins data." ] }, { @@ -40,7 +34,7 @@ "metadata": {}, "source": [ "## Step 1: Install the library\n", - "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `fso_dpserial` on her local developping environment. \n", + "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `lomas-client` on her local developping environment. \n", "\n", "It can be installed via the pip command:" ] @@ -48,19 +42,36 @@ { "cell_type": "code", "execution_count": 1, + "id": "6f5d749c-0f39-4f78-8157-528bc39764b2", + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install lomas_client" + ] + }, + { + "cell_type": "markdown", + "id": "53cf3204-18a8-423c-9de2-c2966fdf84fb", + "metadata": {}, + "source": [ + "Or using a local version of the client" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "id": "98b4013c-ea93-4e4d-8885-15aac0039c12", "metadata": {}, "outputs": [], "source": [ "import sys\n", "import os\n", - "sys.path.append(os.path.abspath(os.path.join('..')))\n", - "# !pip install lomas_client" + "sys.path.append(os.path.abspath(os.path.join('..')))" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "9d96dcd7", "metadata": {}, "outputs": [], @@ -83,12 +94,12 @@ "- user_name: her name as registered in the database (Dr. Alice Antartica)\n", "- dataset_name: the name of the dataset that she wants to query (PENGUIN)\n", "\n", - "She will only be able to query on the real dataset if the queen Icergina has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some epsilon and delta credit. (As is done in the Secure Data Disclosure Notebook: Server side)." + "She will only be able to query on the real dataset if the administrator has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some $\\epsilon$, $\\delta$ privacy loss budget." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "941991f7", "metadata": {}, "outputs": [], @@ -104,7 +115,7 @@ "id": "0ec400c8", "metadata": {}, "source": [ - "And that's it for the preparation. She is now ready to use the various functionnalities offered by `fso_dpserial`." + "And that's it for the preparation. She is now ready to use the various functionnalities offered by `lomas-client`." ] }, { @@ -112,24 +123,12 @@ "id": "9b9a5f13", "metadata": {}, "source": [ - "## Step 3: Understand the functionnalities of the library" - ] - }, - { - "cell_type": "markdown", - "id": "c7cb5531", - "metadata": {}, - "source": [ - "### Getting dataset metadata\n", - "\n", - "Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the `get_dataset_metadata()` function of the client. As this is public information, this does not cost any budget.\n", - "\n", - "This function returns metadata information in the same format as [SmartnoiseSQL dictionary format](https://docs.smartnoise.org/sql/metadata.html#dictionary-format), where among other, there is information about all the available columns, their type, bound values (see Smartnoise page for more details)." + "## Step 3: Getting dataset metadata" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "d15cbe39", "metadata": {}, "outputs": [ @@ -155,7 +154,7 @@ " 'rows': 344}" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -165,1050 +164,859 @@ "metadata" ] }, - { - "cell_type": "markdown", - "id": "d338ed96", - "metadata": {}, - "source": [ - "Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds. She also knows based on the field `max_ids: 1` that each penguin can only be once in the dataset and on the field `row_privacy: True` that each row represents a single penguin. " - ] - }, - { - "cell_type": "markdown", - "id": "5a3c899d", - "metadata": {}, - "source": [ - "### Get a dummy dataset\n", - "\n", - "Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset. \n", - "\n", - "Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets.\n", - "Getting a dummy dataset does not affect the budget as there is no differential privacy here, it is not a synthetic dataset and all that could be learn here is already present in the public metadata.\n", - "\n", - "Dr. Antartica first create a dummy dataset with the default options." - ] - }, { "cell_type": "code", - "execution_count": 5, - "id": "be07091f", + "execution_count": 6, + "id": "ba329ffc-3eaa-4fdd-b526-c1b59c71ed3f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(100, 7)\n" + "Number of penguins: 344.\n" ] - }, + } + ], + "source": [ + "nb_penguin = metadata['rows']\n", + "print(f\"Number of penguins: {nb_penguin}.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "90e3edb2-54b1-476f-b362-a83e20084a74", + "metadata": {}, + "outputs": [ { "data": { - "text/html": [ - "
              \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
              speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
              0ChinstrapTorgersen43.10890413.314292214.2031652258.408606FEMALE
              1AdelieDream63.27500119.364104158.4139964656.773158FEMALE
              2AdelieDream55.61978816.143560166.1628714703.175608FEMALE
              3AdelieBiscoe50.95304718.085707239.8554195187.149507MALE
              4GentooTorgersen35.46065222.075665210.6429065630.456669MALE
              \n", - "
              " - ], "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Chinstrap Torgersen 43.108904 13.314292 214.203165 \n", - "1 Adelie Dream 63.275001 19.364104 158.413996 \n", - "2 Adelie Dream 55.619788 16.143560 166.162871 \n", - "3 Adelie Biscoe 50.953047 18.085707 239.855419 \n", - "4 Gentoo Torgersen 35.460652 22.075665 210.642906 \n", - "\n", - " body_mass_g sex \n", - "0 2258.408606 FEMALE \n", - "1 4656.773158 FEMALE \n", - "2 4703.175608 FEMALE \n", - "3 5187.149507 MALE \n", - "4 5630.456669 MALE " + "dict_keys(['species', 'island', 'bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g', 'sex'])" ] }, - "execution_count": 5, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_dummy = client.get_dummy_dataset()\n", - "print(df_dummy.shape)\n", - "df_dummy.head()" + "columns = metadata[\"columns\"].keys()\n", + "columns" ] }, { "cell_type": "markdown", - "id": "4f85e950", + "id": "5bf5b471-1495-4046-bec1-ddf96c98642f", "metadata": {}, "source": [ - "However, she would prefer to have a dataset with 200 rows and chooses a seed of 0, hence:" + "## Step 4: Average bill length with Smartnoise-SQL" + ] + }, + { + "cell_type": "markdown", + "id": "69dac96e", + "metadata": {}, + "source": [ + "### Query dummy dataset\n", + "\n", + "Now that she has an idea of what the data looks like, she wants to start querying the real dataset to for her research. However, before this, other tools are at her disposal to reduce potential error risks and avoid spending budget on irrelevant queries. Of course, this does not have any impact on the budget.\n", + "\n", + "It is possible to specify the flag `dummy=True` in the various queries to perform the query on the dummy dataset instead of the real dataset and ensure that the queries are doing what is expected of them. " ] }, { "cell_type": "code", - "execution_count": 6, - "id": "01f4365a", + "execution_count": 8, + "id": "3946425d", "metadata": {}, "outputs": [], "source": [ - "NB_ROWS = 200\n", - "SEED = 0" + "# Average bill length in mm\n", + "QUERY = \"SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df\"" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "3f553b29", + "execution_count": 9, + "id": "99494f15-727d-4d03-a099-5cfe5a0c8a27", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(200, 7)\n" - ] - }, - { - "data": { - "text/html": [ - "
              \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
              speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
              0GentooBiscoe49.20847316.117959190.1259502873.291927FEMALE
              1GentooTorgersen55.03162819.963435242.9291423639.940005FEMALE
              2ChinstrapTorgersen51.09671816.777518159.9614935401.743330MALE
              3AdelieBiscoe49.07091114.796037244.5301532316.038092MALE
              4ChinstrapBiscoe44.82791813.246787236.9488535036.246870FEMALE
              \n", - "
              " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Gentoo Biscoe 49.208473 16.117959 190.125950 \n", - "1 Gentoo Torgersen 55.031628 19.963435 242.929142 \n", - "2 Chinstrap Torgersen 51.096718 16.777518 159.961493 \n", - "3 Adelie Biscoe 49.070911 14.796037 244.530153 \n", - "4 Chinstrap Biscoe 44.827918 13.246787 236.948853 \n", - "\n", - " body_mass_g sex \n", - "0 2873.291927 FEMALE \n", - "1 3639.940005 FEMALE \n", - "2 5401.743330 MALE \n", - "3 2316.038092 MALE \n", - "4 5036.246870 FEMALE " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "df_dummy = client.get_dummy_dataset(nb_rows = NB_ROWS, seed = SEED)\n", - "print(df_dummy.shape)\n", - "df_dummy.head()" + "EPSILON = 0.5\n", + "DELTA = 1e-5" ] }, { - "cell_type": "markdown", - "id": "69dac96e", + "cell_type": "code", + "execution_count": 10, + "id": "90cf2a6d", "metadata": {}, + "outputs": [], "source": [ - "### Query dummy dataset\n", - "\n", - "Now that she has an idea of what the data looks like, she wants to start querying the real dataset to for her research. However, before this other tools are at her disposal to reduce potential error risks and avoid spending budget on irrelevant queries. Of course, this does not have any impact on the budget.\n", - "\n", - "It is possible to specify the flag `dummy=True` in the various queries to perform the query on the dummy dataset instead of the real dataset and ensure that the queries are doing what is expected of them. \n", - "\n", - "Therefore Dr. Antartica computes the results that she gets on the dummy dataframe that she created locally and on the same dummy dataframe in the server via a query and compare them to ensure that the query is well defined and works within the server.\n", - "\n", - "She tests with an example on the average bill length on the dataframe." + "# On the remote server dummy dataframe\n", + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON,\n", + " delta = DELTA,\n", + " dummy = True,\n", + ")" ] }, { "cell_type": "code", - "execution_count": 8, - "id": "b6caee55", + "execution_count": 11, + "id": "f3a736f7-be77-4214-8f77-6abc7db34793", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "47.51532" + "'Average bill length on dummy: 46.68mm.'" ] }, - "execution_count": 8, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# On the local dummy dataframe\n", - "result_local_dummy = round(df_dummy['bill_length_mm'].mean(), 5)\n", - "result_local_dummy" + "avg_bl_dummy = np.round(dummy_res['query_response'][\"avg_bill_length_mm\"][0], 2)\n", + "f\"Average bill length on dummy: {avg_bl_dummy}mm.\"" ] }, { "cell_type": "markdown", - "id": "c3a37d8d", + "id": "b746374c", "metadata": {}, "source": [ - "As the query on the server goes through the same workflow for dummies and real data, she still has to set values for theoratical budget to spend on the dummy query. Of course, this theoretical budget will NOT affect her real budget as this is on dummy data. \n", - "\n", - "It is recommended to use very high values on the budget parameters here to have little noise and small difference between the exact local result and the 'little noisy' server result. \n", - "\n", - "Also, make sure to use the same values of number of rows and seed to have the same dummy datasets." + "### Estimate cost of a query\n", + "Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an `epsilon` and a `delta`." ] }, { "cell_type": "code", - "execution_count": 9, - "id": "3946425d", + "execution_count": 12, + "id": "133020c6", "metadata": {}, "outputs": [], "source": [ - "# Average bill length in mm\n", - "QUERY = \"SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df\"" + "cost = client.estimate_smartnoise_sql_cost(\n", + " query = QUERY, \n", + " epsilon = EPSILON, \n", + " delta = DELTA,\n", + ")" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "90cf2a6d", + "execution_count": 13, + "id": "ff19802d-cb39-48ee-9874-340a4bf2cc31", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "47.51229381350249" + "'This query would actually cost her 1.0 epsilon and 5.000000000032756e-06 delta.'" ] }, - "execution_count": 10, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# On the remote server dummy dataframe\n", - "res = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = 100.0, # make sure to select high values of epsilon and delta to have small differences\n", - " delta = 2.0, # make sure to select high values of epsilon and delta to have small differences\n", - " dummy = True, \n", - " nb_rows = NB_ROWS,\n", - " seed = SEED\n", - ")\n", - "res_server_dummy = res['query_response'][\"avg_bill_length_mm\"][0]\n", - "res_server_dummy" + "f'This query would actually cost her {cost[\"epsilon_cost\"]} epsilon and {cost[\"delta_cost\"]} delta.'" ] }, { "cell_type": "markdown", - "id": "bb3fa8eb", + "id": "c255d210-7ba1-4152-8a30-97c7289dd361", "metadata": {}, "source": [ - "She then checks that the responses on the dummy locally and the dummy on the server are close enough (difference would be only due to small noise addition)." + "This is actually twice as much as what she initially put in. In the background, Smartnoise-SQL decomposes the DP query in multiple other queries and the budget given as input is spent on each of these sub-queries. Here for the average, we need a sum divided by a count, hence `EPSILON` is spent once for the sum and then once more for the count. (see NOTE below for tips and explanation)." ] }, { - "cell_type": "code", - "execution_count": 11, - "id": "0f2fff82", + "cell_type": "markdown", + "id": "4ec31515-39fe-426b-8339-fc2ac9c1e09e", "metadata": {}, - "outputs": [], "source": [ - "np.testing.assert_almost_equal(\n", - " result_local_dummy, \n", - " res_server_dummy,\n", - " decimal=2, \n", - " err_msg=\"Responses are different, either try with a bigger budget or query is not doing what is intended.\"\n", - ")" + "### Overide DP mechanism" ] }, { "cell_type": "markdown", - "id": "5a82abcd", + "id": "24b060d0-3c6f-4d35-824f-347ec5103723", "metadata": {}, "source": [ - "As you can see res_local and res_server are close. We can accept that the small difference is due to the small noise added due to the large values of $\\epsilon$ and $\\delta$." + "She wants to use another DP-mechanism for this query. She can change it via the `mechanism` argument. See Smartnoise-SQL documentation [here for overriding mechanisms](https://docs.smartnoise.org/sql/advanced.html#overriding-mechanisms)." ] }, { - "cell_type": "markdown", - "id": "324454ed", + "cell_type": "code", + "execution_count": 14, + "id": "1f726ce8-2e3d-462a-bbd8-598198935bc9", "metadata": {}, + "outputs": [], "source": [ - "### Get current budget\n", - "\n", - "It is the first time that Dr. Antartica connects to the server and she wants to know how much buget the queen assigned her.\n", - "Therefore, she calls the fonction `get_initial_budget`." + "# On the remote server dummy dataframe\n", + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON,\n", + " delta = DELTA,\n", + " mechanisms = {\"count\": \"gaussian\", \"sum_float\": \"laplace\"},\n", + " dummy = True,\n", + ")" ] }, { "cell_type": "code", - "execution_count": 12, - "id": "61a467f3", + "execution_count": 15, + "id": "46e064f0-f1e2-49af-8f14-fde44f981813", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'initial_epsilon': 10.0, 'initial_delta': 0.005}" + "'Average bill length on dummy: 50.83mm.'" ] }, - "execution_count": 12, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_initial_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "bc8f7a74", - "metadata": {}, - "source": [ - "She sees that she has 10.0 epsilon and 0.0004 epsilon at her disposal.\n", - "\n", - "Then she checks her total spent budget `get_total_spent_budget`. As she only did queries on metadata on dummy dataframes, this should still be 0." + "avg_bl_dummy = np.round(dummy_res['query_response'][\"avg_bill_length_mm\"][0], 2)\n", + "f\"Average bill length on dummy: {avg_bl_dummy}mm.\"" ] }, { "cell_type": "code", - "execution_count": 13, - "id": "afd22f84", + "execution_count": 16, + "id": "7e20014d-ad82-4a2d-88d9-ec981150e7db", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'total_spent_epsilon': 2.714285714286655, 'total_spent_delta': 0.0}" + "{'epsilon_cost': 1.0, 'delta_cost': 1.4999949999983109e-05}" ] }, - "execution_count": 13, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_total_spent_budget()" + "cost = client.estimate_smartnoise_sql_cost(\n", + " query = QUERY, \n", + " epsilon = EPSILON, \n", + " delta = DELTA,\n", + " mechanisms = {\"count\": \"gaussian\", \"sum_float\": \"laplace\"}\n", + ")\n", + "cost" ] }, { "cell_type": "markdown", - "id": "05daf5a4", + "id": "e5379edf", "metadata": {}, "source": [ - "It will also be useful to know what the remaining budget is. Therefore, she calls the function `get_remaining_budget`. It just substarcts the total spent budget from the initial budget." + "### Query real dataset\n", + "Dr. Antartica is ready to query the real dataset and get a differentially private response for the average bill length. The `dummy` flag is False by default, so setting it is optional. She uses the values of `epsilon` and `delta` that she selected just before.\n", + "\n", + "Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query." ] }, { "cell_type": "code", - "execution_count": 14, - "id": "6260cf54", + "execution_count": 17, + "id": "69767fac", + "metadata": {}, + "outputs": [], + "source": [ + "avg_bill_length_response = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON, \n", + " delta = DELTA,\n", + " mechanisms = {\"count\": \"gaussian\", \"sum_float\": \"laplace\"},\n", + " dummy = False\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6dbbdf93", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'remaining_epsilon': 7.285714285713345, 'remaining_delta': 0.005}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Average bill length on private data: 45.19mm.\n" + ] } ], "source": [ - "client.get_remaining_budget()" + "avg_bill_length = avg_bill_length_response['query_response']['avg_bill_length_mm'].iloc[0]\n", + "print(f\"Average bill length on private data: {np.round(avg_bill_length, 2)}mm.\")" ] }, { "cell_type": "markdown", - "id": "20298e00", + "id": "b2767e65", "metadata": {}, "source": [ - "As expected, for now the remaining budget is equal to the inital budget." + "After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:" ] }, { "cell_type": "markdown", - "id": "b746374c", + "id": "1472b825-bcea-458f-930e-41ff0f5d5f93", "metadata": {}, "source": [ - "### Estimate cost of a query\n", - "Another safeguard is the functionnality to estimate the cost of a query. As in OpenDP and SmartnoiseSQL, the budget that will by used by a query might be slightly different than what is asked by the user. The `estimate cost` function returns the estimated real cost of any query.\n", - "\n", - "Again, of course, this will not impact the user's budget.\n", - "\n", - "Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an `epsilon` and a `delta`." + "### Postprocess " + ] + }, + { + "cell_type": "markdown", + "id": "ab34449e-7456-4e5e-b5bb-4231204c4d7e", + "metadata": {}, + "source": [ + "It is also possible to use the 'postprocess' argument from Smartnoise-SQL [see its documentation here](https://docs.smartnoise.org/sql/advanced.html#postprocess) by specifying it in the query." ] }, { "cell_type": "code", - "execution_count": 15, - "id": "133020c6", + "execution_count": 19, + "id": "50c38d09-32ea-4269-9ca7-eacfd1d9ad96", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 2.0, 'delta_cost': 4.999999999999449e-05}" + "{'query_response': avg_bill_length_mm\n", + " 0 46.850983}" ] }, - "execution_count": 15, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 1.0, \n", - " delta = 1e-4\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "71580822", - "metadata": {}, - "source": [ - "So this query would actually cost her 3.0 epsilon and a little 1.499e-4 delta. As she does not want to spend to much budget here she tries other values of budget." + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON,\n", + " delta = DELTA,\n", + " postprocess = True,\n", + " dummy = True,\n", + ")\n", + "dummy_res" ] }, { "cell_type": "code", - "execution_count": 16, - "id": "df487c62", + "execution_count": 20, + "id": "df6f2526-612e-4f00-b15a-c0433573e652", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 0.4, 'delta_cost': 5.000000000032756e-06}" + "{'query_response': res_0 res_1\n", + " 0 4659.909203 96.041455}" ] }, - "execution_count": 16, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 0.2, \n", - " delta = 1e-5\n", - ")" + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = EPSILON,\n", + " delta = DELTA,\n", + " postprocess = False,\n", + " dummy = True,\n", + ")\n", + "dummy_res" ] }, { "cell_type": "markdown", - "id": "3c6a3a8c", + "id": "04929993", "metadata": {}, "source": [ - "This query would actually cost her 0.6 epsilon and a similar delta. She decides that it is good enough." + "## Step 4: Penguin statistics" ] }, { - "cell_type": "code", - "execution_count": 17, - "id": "c9c8d3e7", + "cell_type": "markdown", + "id": "bbbca191", "metadata": {}, - "outputs": [], "source": [ - "EPSILON = 0.2\n", - "DELTA = 1e-5" + "### Confidence intervals for flipper length over the whole population" ] }, { "cell_type": "markdown", - "id": "e5379edf", + "id": "9d41bd58", "metadata": {}, "source": [ - "### Query real dataset\n", - "Now that all the safeguard functions were tested, Dr. Antartica is ready to query on the real dataset and get a differentially private response of the average bill length. By default, the flag `dummy` is False so setting it is optional. She uses the values of `epsilon` and `delta` that she selected just before.\n", - "\n", - "Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query." + "She is first interested to have a better idea of the distribution of bill length of all species. She already has the number of penguins (=number of rows as `max_ids=1`) from the metadata and the average bill length from step 3, so she just needs to compute the standard deviation. As it is just an exploration step, she uses very little budget values." ] }, { "cell_type": "code", - "execution_count": 18, - "id": "19e60263", + "execution_count": 21, + "id": "04b376ef", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 7.285714285713345, 'remaining_delta': 0.005}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "client.get_remaining_budget()" + "QUERY = \"SELECT STD(bill_length_mm) AS std_bill_length_mm FROM df\"" + ] + }, + { + "cell_type": "markdown", + "id": "0b041c81", + "metadata": {}, + "source": [ + "She again first verifies that her query works on the dummy dataset:" ] }, { "cell_type": "code", - "execution_count": 19, - "id": "69767fac", + "execution_count": 22, + "id": "5aa9c304", "metadata": {}, "outputs": [], "source": [ - "avg_bill_length_response = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = EPSILON, \n", - " delta = DELTA,\n", - " dummy = False\n", + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = 0.5, \n", + " delta = 1e-5, \n", + " dummy = True\n", ")" ] }, { "cell_type": "code", - "execution_count": 20, - "id": "6dbbdf93", + "execution_count": 23, + "id": "49e4ba47-adf3-471b-a35b-c44346ed12a8", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average bill length: 44.18mm.\n" - ] + "data": { + "text/plain": [ + "'The dummy standard variation is 16.64.'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "avg_bill_length = avg_bill_length_response['query_response']['avg_bill_length_mm'].iloc[0]\n", - "print(f\"Average bill length: {np.round(avg_bill_length, 2)}mm.\")" + "dummy_std = np.round(dummy_res['query_response']['std_bill_length_mm'].iloc[0], 2)\n", + "f\"The dummy standard variation is {dummy_std}.\"" ] }, { "cell_type": "markdown", - "id": "b2767e65", + "id": "74f68994", "metadata": {}, "source": [ - "After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:" + "The syntax of the query works, now she checks the budget:" ] }, { "cell_type": "code", - "execution_count": 21, - "id": "39701fe5", + "execution_count": 24, + "id": "a8fa2c49", + "metadata": {}, + "outputs": [], + "source": [ + "cost = client.estimate_smartnoise_sql_cost(\n", + " query = QUERY, \n", + " epsilon = 0.5, \n", + " delta = 1e-5\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "b3aa05ca-3243-4415-a8ec-fb5ad47d244d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'remaining_epsilon': 6.885714285713345,\n", - " 'remaining_delta': 0.004994999999999967}" + "'This query would actually cost her 1.5 epsilon and 5.000000000032756e-06 delta.'" ] }, - "execution_count": 21, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_remaining_budget()" + "f'This query would actually cost her {cost[\"epsilon_cost\"]} epsilon and {cost[\"delta_cost\"]} delta.'" ] }, { "cell_type": "markdown", - "id": "e37c587f", + "id": "884f0337-a960-460e-8797-84ddd77974a3", "metadata": {}, "source": [ - "As can be seen in `get_total_spent_budget()`, it is the budget estimated with `estimate_cost()` that was spent." + "This time it is three times the budget because the standard deviation needs the average, then a difference and a count again. " ] }, { "cell_type": "code", - "execution_count": 22, - "id": "487f835f", + "execution_count": 26, + "id": "534979fb", + "metadata": {}, + "outputs": [], + "source": [ + "response = client.smartnoise_sql_query(\n", + " query = QUERY,\n", + " epsilon = 0.5,\n", + " delta = 1e-5\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "674332e7", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'total_spent_epsilon': 3.114285714286655,\n", - " 'total_spent_delta': 5.000000000032756e-06}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Standard deviation of bill length: 8.83.\n" + ] } ], "source": [ - "client.get_total_spent_budget()" + "std_bill_length = response['query_response']['std_bill_length_mm'].iloc[0]\n", + "print(f\"Standard deviation of bill length: {np.round(std_bill_length, 2)}.\")" ] }, { "cell_type": "markdown", - "id": "eef4afcd", + "id": "367081be-1159-45d8-9129-88fba20fb697", "metadata": {}, "source": [ - "Dr. Antartica has now a differentially private estimation of the bill length of all birds and is confident to use the library for the rest of her analyses." + "She can now do all the postprocessing that she wants with the returned data without increasing the privacy risk. " ] }, { - "cell_type": "markdown", - "id": "04929993", + "cell_type": "code", + "execution_count": 28, + "id": "f72b19d0", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Standard error of bill length: 0.48.\n" + ] + } + ], "source": [ - "## Step 4: Penguin statistics" + "# Get standard error\n", + "standard_error = std_bill_length/np.sqrt(nb_penguin)\n", + "print(f\"Standard error of bill length: {np.round(standard_error, 2)}.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "62630a03", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The 95% confidence interval of the bill length of all penguins is [44.25, 46.12].\n" + ] + } + ], + "source": [ + " # Compute the 95% confidence interval\n", + "ZSCORE = 1.96\n", + "lower_bound, upper_bound = avg_bill_length - ZSCORE*standard_error, avg_bill_length + ZSCORE*standard_error\n", + "print(f\"The 95% confidence interval of the bill length of all penguins is [{np.round(lower_bound, 2)}, {np.round(upper_bound, 2)}].\")" ] }, { "cell_type": "markdown", - "id": "bbbca191", + "id": "26d04824-ff41-4d25-8a4e-1506a416dd0b", "metadata": {}, "source": [ - "### Confidence intervals for flipper length over the whole population" + "## Note on budget with Smartnoise-SQL (Advanced)" ] }, { "cell_type": "markdown", - "id": "9d41bd58", + "id": "c9aa0b56-bda3-405e-9f33-ae7135dbfeba", "metadata": {}, "source": [ - "She is first interested to have a better idea of the distribution of flipper length of all species. She already has the mean from step 3, so she just need to compute the standard deviation and know the number of penguins in the dataset. As it is just an exploration step, she uses very little budget values." + "All of these queries will cost the same budget in Smartnoise-SQL. The reason is that the smartnoise-sql translates the input query in sub queries, finds the answer for each sub query for the budget in input and then assembles the results. For the first 'standard deviation' query, it requires a count, an average, and only then the computation for the standard deviation. Hence, to save budget it is better to make a general query directly and retrieve all the 'sub-answers'." ] }, { "cell_type": "code", - "execution_count": 23, - "id": "04b376ef", + "execution_count": 30, + "id": "611df7d2-86eb-4710-a6eb-a3de214ece37", "metadata": {}, "outputs": [], "source": [ - "QUERY = \"SELECT COUNT(bill_length_mm) AS nb_penguin, STD(bill_length_mm) AS std_bill_length_mm FROM df\"" + "epsilon = 1.0\n", + "delta = 1e-5" ] }, { - "cell_type": "markdown", - "id": "0b041c81", + "cell_type": "code", + "execution_count": 31, + "id": "32b76d26-edce-4cf9-bab9-bf1ea936d288", "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "She again first verifies that her query works on the dummy dataset:" + "QUERY = \"SELECT STD(bill_length_mm) AS std_bill_length_mm FROM df\"\n", + "cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)\n", + "cost" ] }, { "cell_type": "code", - "execution_count": 24, - "id": "5aa9c304", + "execution_count": 32, + "id": "f84411ed-dab5-4acc-ab49-bfec9ebc3530", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
              \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
              nb_penguinstd_bill_length_mm
              010010.332225
              \n", - "
              " - ], "text/plain": [ - " nb_penguin std_bill_length_mm\n", - "0 100 10.332225" + "{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}" ] }, - "execution_count": 24, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dummy_res = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = 100.0, \n", - " delta = 10.0, \n", - " dummy = True\n", - ")\n", - "dummy_res['query_response']" - ] - }, - { - "cell_type": "markdown", - "id": "74f68994", - "metadata": {}, - "source": [ - "The syntax of the query works, now she checks the budget:" + "QUERY = \"SELECT AVG(bill_length_mm) AS avg_bl, STD(bill_length_mm) as std_bl FROM df\"\n", + "cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)\n", + "cost" ] }, { "cell_type": "code", - "execution_count": 25, - "id": "a8fa2c49", + "execution_count": 33, + "id": "2454db71-4074-46dd-a863-c690c0160c51", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 1.5, 'delta_cost': 5.000000000032756e-06}" + "{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}" ] }, - "execution_count": 25, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 0.5, \n", - " delta = 1e-5\n", - ")" + "QUERY = \"SELECT COUNT(bill_length_mm) AS count_bl, AVG(bill_length_mm) AS avg_bl, STD(bill_length_mm) as std_bl FROM df\"\n", + "cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)\n", + "cost" ] }, { "cell_type": "markdown", - "id": "bed840d3", + "id": "73bd85ca-eed0-488f-807e-6f03f99898cb", "metadata": {}, "source": [ - "It is a bit too much, she decides to test for less:" + "A way to know the sub-queries of a query is to use the following Smartnoise-SQL code:" ] }, { "cell_type": "code", - "execution_count": 26, - "id": "edc97e73", + "execution_count": 34, + "id": "5b51cf35-68db-4b11-acbe-8df15b826d10", + "metadata": {}, + "outputs": [], + "source": [ + "# Convert metadata to Smartnoise-SQL compliant metadata\n", + "metadata = dict(metadata)\n", + "metadata.update(metadata[\"columns\"])\n", + "del metadata[\"columns\"]\n", + "snsql_metadata = {\"\": {\"\": {\"df\": metadata}}}" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "7ab04c8f-8d79-4871-bc16-1f0368fbd403", + "metadata": {}, + "outputs": [], + "source": [ + "# Write the query to inspect\n", + "QUERY = \"SELECT STD(bill_length_mm) as std_bl FROM df\"\n", + "#QUERY = \"SELECT COUNT(*) as nb_row FROM df\"" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "a78d7d86-ab95-4521-b84d-49ac795316c3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 0.75, 'delta_cost': 5.000000000032756e-06}" + "" ] }, - "execution_count": 26, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 0.25, \n", - " delta = 1e-5\n", - ")" + "from snsql.sql.private_rewriter import Rewriter\n", + "rewriter = Rewriter(snsql_metadata)\n", + "rewriter.options.row_privacy = metadata[\"row_privacy\"]\n", + "rewriter.options.max_contrib = metadata[\"max_ids\"]\n", + "dp_query = rewriter.query(QUERY)\n", + "dp_query" ] }, { "cell_type": "markdown", - "id": "da9f81c4", + "id": "2df6bf8c-d06e-4b5c-9509-b2ba01fef581", "metadata": {}, "source": [ - "That's fine, she is ready to query:" + "The original dp query is represented as one query:" ] }, { "cell_type": "code", - "execution_count": 27, - "id": "534979fb", + "execution_count": 37, + "id": "251b773a-864c-4852-ae89-1472ac768975", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
              \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
              nb_penguinstd_bill_length_mm
              034313.064982
              \n", - "
              " - ], "text/plain": [ - " nb_penguin std_bill_length_mm\n", - "0 343 13.064982" + "{'std_bl': }" ] }, - "execution_count": 27, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "response = client.smartnoise_sql_query(query = QUERY, epsilon = 0.25, delta = 1e-5)\n", - "response = response['query_response']\n", - "response" + "dp_query._named_symbols" + ] + }, + { + "cell_type": "markdown", + "id": "c5830777-95fc-432e-b4c5-6bd59aac514f", + "metadata": {}, + "source": [ + "But has 4 named symbols inside: 2 alias for the 2 SQL subqueries \n", + "- 'keycount' for 'count_bill_length_mm',\n", + "- 'sum_alias_0xxxx' for 'sum_bill_length_mm'" ] }, { "cell_type": "code", - "execution_count": 28, - "id": "674332e7", + "execution_count": 38, + "id": "f4ac4261-e870-4f07-8264-9a2041a35abc", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of penguins: 343.\n", - "Standard deviation of bill length: 13.06.\n" - ] + "data": { + "text/plain": [ + "{'keycount': ,\n", + " 'sum_alias_0xde09': ,\n", + " 'count_bill_length_mm': ,\n", + " 'sum_bill_length_mm': }" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "nb_penguin = response['nb_penguin'].iloc[0]\n", - "print(f\"Number of penguins: {nb_penguin}.\")\n", - "\n", - "std_bill_length = response['std_bill_length_mm'].iloc[0]\n", - "print(f\"Standard deviation of bill length: {np.round(std_bill_length, 2)}.\")" + "subquery = dp_query.source.relations[0].primary.query\n", + "syms = subquery._named_symbols\n", + "syms" ] }, { "cell_type": "markdown", - "id": "367081be-1159-45d8-9129-88fba20fb697", + "id": "cc07d8c4-153f-4ad3-a977-a971b94d75aa", "metadata": {}, "source": [ - "She can now do all the postprocessing that she wants with the returned data without adding any privacy risk. " + "This last query with `group_by` will cost the same because `max_ids=1` (a penguin appears in the dataset at most once) and so the `group_by` is applied on different partitions of the population." ] }, { "cell_type": "code", - "execution_count": 29, - "id": "f72b19d0", + "execution_count": 39, + "id": "5b69f3f2-07dd-48b8-9cd5-64eee53331f7", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Standard error of bill length: 0.71.\n" - ] + "data": { + "text/plain": [ + "{'epsilon_cost': 3.0, 'delta_cost': 5.000000000032756e-06}" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Get standard error\n", - "standard_error = std_bill_length/np.sqrt(nb_penguin)\n", - "print(f\"Standard error of bill length: {np.round(standard_error, 2)}.\")" + "QUERY = \"SELECT COUNT(bill_length_mm) AS count_bl, AVG(bill_length_mm) AS avg_bl, STD(bill_length_mm) as std_bl FROM df GROUP BY species\"\n", + "cost = client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = epsilon, delta = delta)\n", + "cost" ] }, { - "cell_type": "code", - "execution_count": 30, - "id": "62630a03", + "cell_type": "markdown", + "id": "e20c4673-2c7b-44d5-bd7f-be88d6432a70", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The 95% confidence interval of the bill length of all penguins is [42.8, 45.57].\n" - ] - } - ], "source": [ - " # Compute the 95% confidence interval\n", - "ZSCORE = 1.96\n", - "lower_bound, upper_bound = avg_bill_length - ZSCORE*standard_error, avg_bill_length + ZSCORE*standard_error\n", - "print(f\"The 95% confidence interval of the bill length of all penguins is [{np.round(lower_bound, 2)}, {np.round(upper_bound, 2)}].\")" + "NOTE: in the current code of Smartnoise-SQL, there is no odometer. Meaning all queries are independant. If someone first queries the private dataset for a count, then a second time for the average and then for the standard deviation then the total cost will be added: 3 count + 2 average + 1 std. That's why it is better to do everything in one query." ] }, { @@ -1236,7 +1044,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 40, "id": "7d9ae766-4c0d-4dc5-9c9a-5f7eb99718f9", "metadata": {}, "outputs": [], @@ -1246,7 +1054,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 41, "id": "5006201d", "metadata": {}, "outputs": [], @@ -1256,133 +1064,111 @@ " COUNT(bill_length_mm) AS nb_penguin, \\\n", " AVG(bill_length_mm) AS avg_bill_length_mm, \\\n", " STD(bill_length_mm) AS std_bill_length_mm \\\n", - " FROM df GROUP BY species\"" + " FROM df GROUP BY species\"" ] }, { "cell_type": "markdown", - "id": "e725eb3f-d12f-4f62-8f57-06fb00639f91", + "id": "37ce4596-7843-48dd-86cb-fb34b227db0e", "metadata": {}, "source": [ - "She estimates how much budget it would really cost:" + "She checks the remaining budget:" ] }, { "cell_type": "code", - "execution_count": 33, - "id": "0255550b-7fd2-4244-a8eb-da809ddc6a5b", + "execution_count": 42, + "id": "814883fa-a45a-43f2-852d-d5380beff8c0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 3.0, 'delta_cost': 4.999999999999449e-05}" + "{'remaining_epsilon': 7.5, 'remaining_delta': 0.004980000049999984}" ] }, - "execution_count": 33, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 1, delta = 1e-4)" + "client.get_remaining_budget()" ] }, { "cell_type": "markdown", - "id": "56bf804f-d877-48cb-b405-709b30cda3d1", + "id": "e725eb3f-d12f-4f62-8f57-06fb00639f91", "metadata": {}, "source": [ - "The real cost seems to be 3 times the epsilon that she sets. It is a lot but she tries on the dummy dataset to verify all is working properly." + "She estimates how much budget it would really cost:" ] }, { "cell_type": "code", - "execution_count": 34, - "id": "80d9933b", + "execution_count": 43, + "id": "0255550b-7fd2-4244-a8eb-da809ddc6a5b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'query_response': species nb_penguin avg_bill_length_mm std_bill_length_mm\n", - " 0 Adelie 39 45.659944 10.695675\n", - " 1 Chinstrap 33 45.690454 14.067739\n", - " 2 Gentoo 31 38.472887 14.542186}" + "{'epsilon_cost': 3.0, 'delta_cost': 4.999999999999449e-05}" ] }, - "execution_count": 34, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 1, delta = 1.0, dummy = True)\n", - "dummy_res" + "client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 1.0, delta = 1e-4)" ] }, { "cell_type": "markdown", - "id": "5691680f-8716-4a99-999a-a2bd5ef6a679", + "id": "56bf804f-d877-48cb-b405-709b30cda3d1", "metadata": {}, "source": [ - "She did not give enough budget for the query to work. This is why there are 'NANs' in the output. She has to spend more budget for the query to work." + "The real cost seems to be 3 times the epsilon that she sets. It is a lot but she tries on the dummy dataset to verify all is working properly." ] }, { "cell_type": "code", - "execution_count": 35, - "id": "6b014db4-acbd-4ae1-a3b6-397035851583", + "execution_count": 44, + "id": "80d9933b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'remaining_epsilon': 6.135714285713345,\n", - " 'remaining_delta': 0.004989999999999935}" + "{'query_response': species nb_penguin avg_bill_length_mm std_bill_length_mm\n", + " 0 Adelie 25 59.830486 27.444144\n", + " 1 Chinstrap 47 13.527649 28.501660\n", + " 2 Gentoo 28 42.375624 33.967001}" ] }, - "execution_count": 35, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_remaining_budget()" + "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 0.1, delta = 1e-8, dummy = True)\n", + "dummy_res" ] }, { "cell_type": "markdown", - "id": "43d3488d-3987-4fec-a840-78385e956832", - "metadata": {}, - "source": [ - "The maximum she can do with all her remaining budget of 7.4 is around 7.4/4 = 1.85. Let's check:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "99d7998d-daa1-4d5e-aa42-abc5aabdf2e3", + "id": "5691680f-8716-4a99-999a-a2bd5ef6a679", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 5.550000000000001, 'delta_cost': 4.999999999999449e-05}" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 7.4/4, delta = 1e-4)" + "She did not give enough budget for the query to work. This is why there are 'NANs' in the output. She has to spend more budget for the query to work." ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 45, "id": "0e07fde9-9430-4a12-8337-0503ac162c26", "metadata": {}, "outputs": [ @@ -1390,18 +1176,18 @@ "data": { "text/plain": [ "{'query_response': species nb_penguin avg_bill_length_mm std_bill_length_mm\n", - " 0 Adelie 37 48.755816 3.634415\n", - " 1 Chinstrap 33 46.912863 4.552931\n", - " 2 Gentoo 29 41.803438 17.566451}" + " 0 Adelie 36 49.021514 3.944748\n", + " 1 Chinstrap 31 49.048848 3.801831\n", + " 2 Gentoo 30 41.176308 7.628134}" ] }, - "execution_count": 43, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 7.4/4, delta = 1e-4, dummy = True)\n", + "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 7.5/3, delta = 1e-4, dummy = True)\n", "dummy_res" ] }, @@ -1415,12 +1201,12 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 46, "id": "59f2d665", "metadata": {}, "outputs": [], "source": [ - "flipper_length_response = client.smartnoise_sql_query(query = QUERY, epsilon = 7.4/4, delta = 1e-4)" + "flipper_length_response = client.smartnoise_sql_query(query = QUERY, epsilon = 7.5/3, delta = 1e-4)" ] }, { @@ -1431,28 +1217,6 @@ "And now she should not have any remaining budget:" ] }, - { - "cell_type": "code", - "execution_count": 45, - "id": "6eb20cfb-fa53-496f-940d-9b17b05fa074", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 0.5857142857133439,\n", - " 'remaining_delta': 0.00493999999999994}" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, { "cell_type": "markdown", "id": "cb96f406-d409-4531-ac86-05f1c9296705", @@ -1463,7 +1227,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 47, "id": "748f125f", "metadata": {}, "outputs": [ @@ -1498,23 +1262,23 @@ " \n", " 0\n", " Adelie\n", - " 150\n", - " 38.649887\n", - " 3.997587\n", + " 151\n", + " 38.362705\n", + " 5.465330\n", " \n", " \n", " 1\n", " Chinstrap\n", " 67\n", - " 49.285002\n", - " 5.859511\n", + " 48.867188\n", + " 3.828321\n", " \n", " \n", " 2\n", " Gentoo\n", - " 122\n", - " 47.557167\n", - " 4.643492\n", + " 123\n", + " 47.257728\n", + " 5.387484\n", " \n", " \n", "\n", @@ -1522,12 +1286,12 @@ ], "text/plain": [ " species nb_penguin avg_bill_length_mm std_bill_length_mm\n", - "0 Adelie 150 38.649887 3.997587\n", - "1 Chinstrap 67 49.285002 5.859511\n", - "2 Gentoo 122 47.557167 4.643492" + "0 Adelie 151 38.362705 5.465330\n", + "1 Chinstrap 67 48.867188 3.828321\n", + "2 Gentoo 123 47.257728 5.387484" ] }, - "execution_count": 46, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1547,7 +1311,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 48, "id": "0a7d7d4d", "metadata": {}, "outputs": [], @@ -1559,7 +1323,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 49, "id": "bc3ee48a", "metadata": {}, "outputs": [], @@ -1571,7 +1335,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 50, "id": "1717f9ea", "metadata": {}, "outputs": [ @@ -1579,9 +1343,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "T test between specie 0 and specie 1: -15.84. Reject null hypothesis: True.\n", - "T test between specie 0 and specie 2: -17.04. Reject null hypothesis: True.\n", - "T test between specie 1 and specie 2: 2.24. Reject null hypothesis: True.\n" + "T test between specie 0 and specie 1: -14.41. Reject null hypothesis: True.\n", + "T test between specie 0 and specie 2: -13.49. Reject null hypothesis: True.\n", + "T test between specie 1 and specie 2: 2.19. Reject null hypothesis: True.\n" ] } ], @@ -1590,9 +1354,9 @@ "t_02 = t_test(avg_0, avg_2, std_0, std_2, nb_0, nb_2)\n", "t_12 = t_test(avg_1, avg_2, std_1, std_2, nb_1, nb_2)\n", "\n", - "print(f\"T test between specie 0 and specie 1: {np.round(t_01, 2)}. Reject null hypothesis: {abs(t_01) > CRITICAL_VALUE}.\")\n", - "print(f\"T test between specie 0 and specie 2: {np.round(t_02, 2)}. Reject null hypothesis: {abs(t_02) > CRITICAL_VALUE}.\")\n", - "print(f\"T test between specie 1 and specie 2: {np.round(t_12, 2)}. Reject null hypothesis: {abs(t_12) > CRITICAL_VALUE}.\")" + "print(f\"T test between species 0 and specie 1: {np.round(t_01, 2)}. Reject null hypothesis: {abs(t_01) > CRITICAL_VALUE}.\")\n", + "print(f\"T test between species 0 and specie 2: {np.round(t_02, 2)}. Reject null hypothesis: {abs(t_02) > CRITICAL_VALUE}.\")\n", + "print(f\"T test between species 1 and specie 2: {np.round(t_12, 2)}. Reject null hypothesis: {abs(t_12) > CRITICAL_VALUE}.\")" ] }, { @@ -1613,7 +1377,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 51, "id": "9289bc26", "metadata": {}, "outputs": [ @@ -1651,32 +1415,32 @@ " \n", " 0\n", " Adelie\n", - " 150\n", - " 38.649887\n", - " 3.997587\n", - " 0.326402\n", - " 38.010140\n", - " 39.289634\n", + " 151\n", + " 38.362705\n", + " 5.465330\n", + " 0.444762\n", + " 37.490971\n", + " 39.234439\n", " \n", " \n", " 1\n", " Chinstrap\n", " 67\n", - " 49.285002\n", - " 5.859511\n", - " 0.715853\n", - " 47.881930\n", - " 50.688074\n", + " 48.867188\n", + " 3.828321\n", + " 0.467704\n", + " 47.950489\n", + " 49.783888\n", " \n", " \n", " 2\n", " Gentoo\n", - " 122\n", - " 47.557167\n", - " 4.643492\n", - " 0.420402\n", - " 46.733179\n", - " 48.381155\n", + " 123\n", + " 47.257728\n", + " 5.387484\n", + " 0.485773\n", + " 46.305613\n", + " 48.209843\n", " \n", " \n", "\n", @@ -1684,17 +1448,17 @@ ], "text/plain": [ " species nb_penguin avg_bill_length_mm std_bill_length_mm \\\n", - "0 Adelie 150 38.649887 3.997587 \n", - "1 Chinstrap 67 49.285002 5.859511 \n", - "2 Gentoo 122 47.557167 4.643492 \n", + "0 Adelie 151 38.362705 5.465330 \n", + "1 Chinstrap 67 48.867188 3.828321 \n", + "2 Gentoo 123 47.257728 5.387484 \n", "\n", " standard_error ci_95_lower_bound ci_95_upper_bound \n", - "0 0.326402 38.010140 39.289634 \n", - "1 0.715853 47.881930 50.688074 \n", - "2 0.420402 46.733179 48.381155 " + "0 0.444762 37.490971 39.234439 \n", + "1 0.467704 47.950489 49.783888 \n", + "2 0.485773 46.305613 48.209843 " ] }, - "execution_count": 50, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -1707,14 +1471,6 @@ "df_flipper" ] }, - { - "cell_type": "markdown", - "id": "f79e8333-1f06-4019-af3c-94ff2362d036", - "metadata": {}, - "source": [ - "She can now go and present her findings to queen Icebergina." - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/html/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html b/html/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html index f0b09b9d..38ec4331 100644 --- a/html/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html +++ b/html/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html @@ -55,7 +55,7 @@
            • Quickstart
            • Examples
              • Lomas: Client demo
              • -
              • Secure Data Disclosure: Client side
              • +
              • Lomas Client Side: Using Smartnoise-SQL
              • Lomas Client Side: Using DiffPrivlib
              • Lomas Client Side: Using Smartnoise-Synth
                • Step 1: Install the library
                • @@ -2070,7 +2070,7 @@

                  Step 6: See archives of queriesv0.3.0 -
                  v0.3.1
                  +
                  v0.3.2
                  diff --git a/html/notebooks/local_admin_notebook.html b/html/notebooks/local_admin_notebook.html index 6eb24419..91a8188e 100644 --- a/html/notebooks/local_admin_notebook.html +++ b/html/notebooks/local_admin_notebook.html @@ -1460,7 +1460,7 @@

                  Stop the server: do not do it now !v0.3.0 -
                  v0.3.1
                  +
                  v0.3.2
                  diff --git a/html/notebooks/s3_example_notebook.html b/html/notebooks/s3_example_notebook.html index a006c0a1..0bdadfa8 100644 --- a/html/notebooks/s3_example_notebook.html +++ b/html/notebooks/s3_example_notebook.html @@ -55,7 +55,7 @@
                • Quickstart
                • Examples
                  • Lomas: Client demo
                  • -
                  • Secure Data Disclosure: Client side
                  • +
                  • Lomas Client Side: Using Smartnoise-SQL
                  • Lomas Client Side: Using DiffPrivlib
                  • Lomas Client Side: Using Smartnoise-Synth
                  • S3 example
                      @@ -911,7 +911,7 @@

                      Confidence intervals for age over the whole populationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/objects.inv b/html/objects.inv index c09fc2f1..a7ab25b6 100644 Binary files a/html/objects.inv and b/html/objects.inv differ diff --git a/html/poster.html b/html/poster.html index b44a0579..756bd0e9 100644 --- a/html/poster.html +++ b/html/poster.html @@ -157,7 +157,7 @@

                      Poster<
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/py-modindex.html b/html/py-modindex.html index d3842d59..0ee8040a 100644 --- a/html/py-modindex.html +++ b/html/py-modindex.html @@ -265,7 +265,7 @@

                      Python Module Index

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/search.html b/html/search.html index a898632a..70863876 100644 --- a/html/search.html +++ b/html/search.html @@ -162,7 +162,7 @@
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/searchindex.js b/html/searchindex.js index dfc64131..d3378e3f 100644 --- a/html/searchindex.js +++ b/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"AIM: Adaptive Iterative Mechanism": [[25, "AIM:-Adaptive-Iterative-Mechanism"]], "API Documentation": [[3, null]], "Access the server to administrate the mongoDB": [[26, "Access-the-server-to-administrate-the-mongoDB"]], "Access via Kubernetes": [[32, "access-via-kubernetes"]], "Access via Onyxia Platform": [[32, "access-via-onyxia-platform"]], "Accessing the Helm Chart": [[34, "accessing-the-helm-chart"]], "Add user": [[26, "Add-user"]], "Adding a DP Library": [[0, "adding-a-dp-library"]], "Adding a Data Connector (for private dataset in various databases)": [[0, "adding-a-data-connector-for-private-dataset-in-various-databases"]], "Adding a Dataset Store": [[0, "adding-a-dataset-store"]], "Administration": [[29, null]], "Archives of queries": [[26, "Archives-of-queries"]], "Average and number of rows with smartnoise-sql library on remote dummy": [[27, "Average-and-number-of-rows-with-smartnoise-sql-library-on-remote-dummy"]], "CLI": [[31, null]], "Change budget": [[26, "Change-budget"]], "Classification: Gaussian Naive Bayes": [[23, "Classification:-Gaussian-Naive-Bayes"]], "Classification: Logistic Regression": [[23, "Classification:-Logistic-Regression"]], "Client": [[8, "client"], [9, "client"]], "Client API": [[4, null]], "Clustering: K-Means": [[23, "Clustering:-K-Means"]], "Collections": [[31, "collections"]], "Confidence intervals for age over the whole population": [[27, "Confidence-intervals-for-age-over-the-whole-population"]], "Confidence intervals for flipper length over the whole population": [[24, "Confidence-intervals-for-flipper-length-over-the-whole-population"]], "Create a docker volume": [[26, "Create-a-docker-volume"]], "DPCTGAN: Differentially Private Conditional Tabular GAN": [[25, "DPCTGAN:-Differentially-Private-Conditional-Tabular-GAN"]], "DPGAN: DIfferentially Private GAN": [[25, "DPGAN:-DIfferentially-Private-GAN"]], "Dashboard": [[32, null]], "Datasets": [[31, "datasets"]], "Datasets (add and drop)": [[26, "Datasets-(add-and-drop)"]], "Decision Tree Classifier": [[23, "Decision-Tree-Classifier"]], "Deploying Lomas on Onyxia": [[37, "deploying-lomas-on-onyxia"]], "Deploying the Service on Kubernetes": [[34, "deploying-the-service-on-kubernetes"]], "Deployment": [[33, null]], "Detailed description:": [[9, "detailed-description"]], "Dimensionality Reduction: PCA": [[23, "Dimensionality-Reduction:-PCA"]], "Errors": [[5, null]], "Estimate budget of Linear Regression with DiffPrivLib": [[22, "Estimate-budget-of-Linear-Regression-with-DiffPrivLib"]], "Estimate cost of a query": [[24, "Estimate-cost-of-a-query"], [27, "Estimate-cost-of-a-query"]], "Estimate cost of a query with smartnoise-sql": [[22, "Estimate-cost-of-a-query-with-smartnoise-sql"]], "Estimate cost of training patectgan synthesizer with Smartnoise-Synth": [[22, "Estimate-cost-of-training-patectgan-synthesizer-with-Smartnoise-Synth"]], "Estimate cost with opendp": [[22, "Estimate-cost-with-opendp"]], "Examples": [[6, null], [31, "examples"]], "Execute pipeline on real dataset with opendp": [[22, "Execute-pipeline-on-real-dataset-with-opendp"]], "External Loggers": [[0, "external-loggers"]], "ExternalLibraryException": [[5, "externallibraryexception"]], "Finally all can be loaded fom a file direcly": [[26, "Finally-all-can-be-loaded-fom-a-file-direcly"]], "First steps": [[8, "first-steps"]], "Get a dummy dataset": [[24, "Get-a-dummy-dataset"], [27, "Get-a-dummy-dataset"]], "Get current budget": [[24, "Get-current-budget"], [27, "Get-current-budget"]], "Getting dataset metadata": [[23, "Getting-dataset-metadata"], [24, "Getting-dataset-metadata"], [25, "Getting-dataset-metadata"], [27, "Getting-dataset-metadata"]], "Git Branches": [[0, "git-branches"]], "GitHub Workflows": [[0, "github-workflows"]], "History": [[9, "history"]], "Hypothesis testing": [[24, "Hypothesis-testing"]], "Indices and tables": [[9, "indices-and-tables"]], "Installation": [[8, "installation"]], "Installing the Helm Chart": [[34, "installing-the-helm-chart"]], "InternalServerException": [[5, "internalserverexception"]], "Introduction": [[37, "introduction"]], "InvalidQueryException": [[5, "invalidqueryexception"]], "Kubernetes": [[34, null]], "Linting and Other Checks": [[0, "linting-and-other-checks"]], "Local": [[35, null]], "Local Access via Docker": [[32, "local-access-via-docker"]], "Lomas Client Side: Using DiffPrivlib": [[23, null]], "Lomas Client Side: Using Smartnoise-Synth": [[25, null]], "Lomas-server: CLI administration": [[26, null]], "Lomas: Client demo": [[22, null]], "Lomas: The Data Oases Hidden Behind the Mist.": [[9, null]], "MST: Maximum Spanning Tree": [[25, "MST:-Maximum-Spanning-Tree"]], "MWEM: Multiplicative Weights Exponential Mechanism": [[25, "MWEM:-Multiplicative-Weights-Exponential-Mechanism"]], "Modifying the ingress Section": [[34, "modifying-the-ingress-section"]], "Modifying values.yaml": [[34, "modifying-values-yaml"]], "Module contents": [[11, "module-lomas_client"], [12, "module-lomas_server"], [13, "module-lomas_server.admin_database"], [14, "module-lomas_server.administration"], [15, "module-lomas_server.data_connector"], [16, "module-lomas_server.dataset_store"], [17, "module-lomas_server.dp_queries"], [18, "module-lomas_server.dp_queries.dp_libraries"], [19, "module-lomas_server.routes"], [20, "module-lomas_server.tests"], [21, "module-lomas_server.utils"]], "MongoDB Administration": [[31, "mongodb-administration"]], "MongoDB Connection": [[31, "mongodb-connection"]], "Notes for Client Contributors": [[1, null]], "Notes for Contributors": [[0, null]], "Notes for Server Contributors": [[2, null]], "Onyxia": [[37, null]], "Overview": [[31, "overview"]], "PATECTGAN: Conditional tabular GAN using Private Aggregation of Teacher Ensembles": [[25, "PATECTGAN:-Conditional-tabular-GAN-using-Private-Aggregation-of-Teacher-Ensembles"]], "PATEGAN: Private Aggregation of Teacher Ensembles": [[25, "PATEGAN:-Private-Aggregation-of-Teacher-Ensembles"]], "Poster": [[28, null]], "Postprocessing: no additional provacy risk with DP": [[22, "Postprocessing:-no-additional-provacy-risk-with-DP"]], "Prepare linear regression pipeline on dummy with DiffPrivLib": [[22, "Prepare-linear-regression-pipeline-on-dummy-with-DiffPrivLib"]], "Prepare opendp pipeline and verify on dummy": [[22, "Prepare-opendp-pipeline-and-verify-on-dummy"]], "Prepare the database": [[26, "Prepare-the-database"]], "Prerequisites": [[34, "prerequisites"], [35, "prerequisites"]], "Pushing a new version to Pypi": [[1, "pushing-a-new-version-to-pypi"]], "Query average bill length on dummy dataset with smartnoise-sql": [[22, "Query-average-bill-length-on-dummy-dataset-with-smartnoise-sql"]], "Query average bill length on private dataset with smartnoise-sql": [[22, "Query-average-bill-length-on-private-dataset-with-smartnoise-sql"]], "Query dummy dataset": [[24, "Query-dummy-dataset"]], "Query on dummy dataset": [[27, "Query-on-dummy-dataset"]], "Query on real private dataset with smartnoise-sql.": [[27, "Query-on-real-private-dataset-with-smartnoise-sql."]], "Query real dataset": [[24, "Query-real-dataset"]], "Quickstart": [[8, null]], "Random Forest": [[23, "Random-Forest"]], "Regression: Linear Regression": [[23, "Regression:-Linear-Regression"]], "Release Workflow": [[0, "release-workflow"]], "Remove user": [[26, "Remove-user"]], "S3 example": [[27, null]], "Secure Data Disclosure: Client side": [[24, null]], "Server": [[9, "server"]], "Server API": [[30, null]], "She can now estimated the cost of this pipeline": [[23, "She-can-now-estimated-the-cost-of-this-pipeline"]], "She starts to write the associated DiffPrivLib pipeline and tries it on the dummy.": [[23, "She-starts-to-write-the-associated-DiffPrivLib-pipeline-and-tries-it-on-the-dummy."]], "Start server": [[26, "Start-server"]], "Start the server": [[26, "Start-the-server"]], "Step 1: Install the library": [[22, "Step-1:-Install-the-library"], [23, "Step-1:-Install-the-library"], [24, "Step-1:-Install-the-library"], [25, "Step-1:-Install-the-library"], [27, "Step-1:-Install-the-library"]], "Step 2: Initialise the client": [[22, "Step-2:-Initialise-the-client"], [23, "Step-2:-Initialise-the-client"], [24, "Step-2:-Initialise-the-client"], [25, "Step-2:-Initialise-the-client"], [27, "Step-2:-Initialise-the-client"]], "Step 3: Create a Synthetic Dataset keeping all default parameters": [[25, "Step-3:-Create-a-Synthetic-Dataset-keeping-all-default-parameters"]], "Step 3: Metadata and dummy dataset": [[23, "Step-3:-Metadata-and-dummy-dataset"], [25, "Step-3:-Metadata-and-dummy-dataset"]], "Step 3: Understand the functionnalities of the library": [[22, "Step-3:-Understand-the-functionnalities-of-the-library"], [24, "Step-3:-Understand-the-functionnalities-of-the-library"], [27, "Step-3:-Understand-the-functionnalities-of-the-library"]], "Step 4: Penguin statistics": [[24, "Step-4:-Penguin-statistics"]], "Step 4: See archives of queries": [[22, "Step-4:-See-archives-of-queries"]], "Step 4: Titanic statistics with opendp": [[27, "Step-4:-Titanic-statistics-with-opendp"]], "Step 4: Train Logistic Regression model with DiffPrivLib": [[23, "Step-4:-Train-Logistic-Regression-model-with-DiffPrivLib"]], "Step 4: Use DP libraries to analyse the dataset": [[22, "Step-4:-Use-DP-libraries-to-analyse-the-dataset"]], "Step 5: Train other models with DiffPrivLib": [[23, "Step-5:-Train-other-models-with-DiffPrivLib"]], "Step 6: See archives of queries": [[23, "Step-6:-See-archives-of-queries"], [25, "Step-6:-See-archives-of-queries"]], "Steps to Deploy Locally": [[35, "steps-to-deploy-locally"]], "Stop the server: do not do it now !": [[26, "Stop-the-server:-do-not-do-it-now-!"]], "Submodules": [[11, "submodules"], [12, "submodules"], [13, "submodules"], [15, "submodules"], [16, "submodules"], [17, "submodules"], [18, "submodules"], [19, "submodules"], [20, "submodules"], [21, "submodules"]], "Subpackages": [[12, "subpackages"], [17, "subpackages"]], "Technical Overview:": [[9, "technical-overview"]], "Tests": [[2, "tests"]], "Train linear regression on sensitive data with DiffPrivLib": [[22, "Train-linear-regression-on-sensitive-data-with-DiffPrivLib"]], "Train patectgan synthesizer on dummy data with Smartnoise-Synth": [[22, "Train-patectgan-synthesizer-on-dummy-data-with-Smartnoise-Synth"]], "Train patectgan synthesizer on private data with Smartnoise-Synth": [[22, "Train-patectgan-synthesizer-on-private-data-with-Smartnoise-Synth"]], "UnauthorizedAccessException": [[5, "unauthorizedaccessexception"]], "Users": [[26, "Users"], [31, "users"]], "Visualise all options": [[26, "Visualise-all-options"]], "Welcome to Lomas documentation": [[10, null]], "a. Compute average bill length with Smartnoise-SQL": [[22, "a.-Compute-average-bill-length-with-Smartnoise-SQL"]], "a. Getting dataset metadata": [[22, "a.-Getting-dataset-metadata"]], "b. Compute confidence interval with opendp": [[22, "b.-Compute-confidence-interval-with-opendp"]], "b. Get a dummy dataset": [[22, "b.-Get-a-dummy-dataset"]], "c. Check privacy loss budget \u03b5, \u03b4 (initial, current, remaining)": [[22, "c.-Check-privacy-loss-budget-\u03b5,-\u03b4-(initial,-current,-remaining)"]], "c. Train a DP Machine Learning model with DiffPrivLib": [[22, "c.-Train-a-DP-Machine-Learning-model-with-DiffPrivLib"]], "d. Get a Synthetic Dataset with Smartnoise-Synth": [[22, "d.-Get-a-Synthetic-Dataset-with-Smartnoise-Synth"]], "lomas_client": [[7, null]], "lomas_client package": [[11, null]], "lomas_client.client module": [[11, "module-lomas_client.client"]], "lomas_client.utils module": [[11, "module-lomas_client.utils"]], "lomas_server": [[36, null]], "lomas_server package": [[12, null]], "lomas_server.admin_database package": [[13, null]], "lomas_server.admin_database.admin_database module": [[13, "lomas-server-admin-database-admin-database-module"]], "lomas_server.admin_database.factory module": [[13, "lomas-server-admin-database-factory-module"]], "lomas_server.admin_database.mongodb_database module": [[13, "lomas-server-admin-database-mongodb-database-module"]], "lomas_server.admin_database.utils module": [[13, "lomas-server-admin-database-utils-module"]], "lomas_server.admin_database.yaml_database module": [[13, "lomas-server-admin-database-yaml-database-module"]], "lomas_server.administration package": [[14, null]], "lomas_server.app module": [[12, "lomas-server-app-module"]], "lomas_server.constants module": [[12, "module-lomas_server.constants"]], "lomas_server.data_connector package": [[15, null]], "lomas_server.data_connector.data_connector module": [[15, "lomas-server-data-connector-data-connector-module"]], "lomas_server.data_connector.factory module": [[15, "lomas-server-data-connector-factory-module"]], "lomas_server.data_connector.in_memory_connector module": [[15, "lomas-server-data-connector-in-memory-connector-module"]], "lomas_server.data_connector.path_connector module": [[15, "lomas-server-data-connector-path-connector-module"]], "lomas_server.data_connector.s3_connector module": [[15, "lomas-server-data-connector-s3-connector-module"]], "lomas_server.dataset_store package": [[16, null]], "lomas_server.dataset_store.basic_dataset_store module": [[16, "lomas-server-dataset-store-basic-dataset-store-module"]], "lomas_server.dataset_store.data_connector_observer module": [[16, "module-lomas_server.dataset_store.data_connector_observer"]], "lomas_server.dataset_store.dataset_store module": [[16, "lomas-server-dataset-store-dataset-store-module"]], "lomas_server.dataset_store.factory module": [[16, "lomas-server-dataset-store-factory-module"]], "lomas_server.dataset_store.lru_dataset_store module": [[16, "lomas-server-dataset-store-lru-dataset-store-module"]], "lomas_server.dp_queries package": [[17, null]], "lomas_server.dp_queries.dp_libraries package": [[18, null]], "lomas_server.dp_queries.dp_libraries.diffprivlib module": [[18, "lomas-server-dp-queries-dp-libraries-diffprivlib-module"]], "lomas_server.dp_queries.dp_libraries.factory module": [[18, "lomas-server-dp-queries-dp-libraries-factory-module"]], "lomas_server.dp_queries.dp_libraries.opendp module": [[18, "lomas-server-dp-queries-dp-libraries-opendp-module"]], "lomas_server.dp_queries.dp_libraries.smartnoise_sql module": [[18, "lomas-server-dp-queries-dp-libraries-smartnoise-sql-module"]], "lomas_server.dp_queries.dp_libraries.smartnoise_synth module": [[18, "lomas-server-dp-queries-dp-libraries-smartnoise-synth-module"]], "lomas_server.dp_queries.dp_libraries.utils module": [[18, "lomas-server-dp-queries-dp-libraries-utils-module"]], "lomas_server.dp_queries.dp_logic module": [[17, "lomas-server-dp-queries-dp-logic-module"]], "lomas_server.dp_queries.dp_querier module": [[17, "lomas-server-dp-queries-dp-querier-module"]], "lomas_server.dp_queries.dummy_dataset module": [[17, "lomas-server-dp-queries-dummy-dataset-module"]], "lomas_server.mongodb_admin module": [[12, "lomas-server-mongodb-admin-module"]], "lomas_server.mongodb_admin_cli module": [[12, "lomas-server-mongodb-admin-cli-module"]], "lomas_server.routes package": [[19, null]], "lomas_server.routes.routes_admin module": [[19, "lomas-server-routes-routes-admin-module"]], "lomas_server.routes.routes_dp module": [[19, "lomas-server-routes-routes-dp-module"]], "lomas_server.routes.utils module": [[19, "lomas-server-routes-utils-module"]], "lomas_server.tests package": [[20, null]], "lomas_server.tests.constants module": [[20, "module-lomas_server.tests.constants"]], "lomas_server.tests.test_api module": [[20, "lomas-server-tests-test-api-module"]], "lomas_server.tests.test_api_diffprivlib module": [[20, "lomas-server-tests-test-api-diffprivlib-module"]], "lomas_server.tests.test_api_smartnoise_synth module": [[20, "lomas-server-tests-test-api-smartnoise-synth-module"]], "lomas_server.tests.test_dummy_generation module": [[20, "lomas-server-tests-test-dummy-generation-module"]], "lomas_server.tests.test_mongodb_admin module": [[20, "lomas-server-tests-test-mongodb-admin-module"]], "lomas_server.tests.test_mongodb_admin_cli module": [[20, "lomas-server-tests-test-mongodb-admin-cli-module"]], "lomas_server.utils package": [[21, null]], "lomas_server.utils.anti_timing_att module": [[21, "lomas-server-utils-anti-timing-att-module"]], "lomas_server.utils.collection_models module": [[21, "module-lomas_server.utils.collection_models"]], "lomas_server.utils.config module": [[21, "lomas-server-utils-config-module"]], "lomas_server.utils.error_handler module": [[21, "lomas-server-utils-error-handler-module"]], "lomas_server.utils.logger module": [[21, "module-lomas_server.utils.logger"]], "lomas_server.utils.query_examples module": [[21, "module-lomas_server.utils.query_examples"]], "lomas_server.utils.query_models module": [[21, "module-lomas_server.utils.query_models"]], "lomas_server.uvicorn_serve module": [[12, "lomas-server-uvicorn-serve-module"]]}, "docnames": ["CONTRIBUTING", "CONTRIBUTING_CLIENT", "CONTRIBUTING_SERVER", "api", "client_api", "client_errors", "client_examples", "client_modules", "client_quickstart", "index", "index_under_construction", "lomas_client", "lomas_server", "lomas_server.admin_database", "lomas_server.administration", "lomas_server.data_connector", "lomas_server.dataset_store", "lomas_server.dp_queries", "lomas_server.dp_queries.dp_libraries", "lomas_server.routes", "lomas_server.tests", "lomas_server.utils", "notebooks/Demo_Client_Notebook", "notebooks/Demo_Client_Notebook_DiffPrivLib", "notebooks/Demo_Client_Notebook_Smartnoise-SQL", "notebooks/Demo_Client_Notebook_Smartnoise-Synth", "notebooks/local_admin_notebook", "notebooks/s3_example_notebook", "poster", "server_administration", "server_api", "server_cli", "server_dashboard", "server_deployment", "server_kubernetes", "server_local", "server_modules", "server_onyxia"], "envversion": {"nbsphinx": 4, "sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1}, "filenames": ["CONTRIBUTING.md", "CONTRIBUTING_CLIENT.md", "CONTRIBUTING_SERVER.md", "api.rst", "client_api.rst", "client_errors.rst", "client_examples.rst", "client_modules.rst", "client_quickstart.rst", "index.rst", "index_under_construction.rst", "lomas_client.rst", "lomas_server.rst", "lomas_server.admin_database.rst", "lomas_server.administration.rst", "lomas_server.data_connector.rst", "lomas_server.dataset_store.rst", "lomas_server.dp_queries.rst", "lomas_server.dp_queries.dp_libraries.rst", "lomas_server.routes.rst", "lomas_server.tests.rst", "lomas_server.utils.rst", "notebooks/Demo_Client_Notebook.ipynb", "notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb", "notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb", "notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb", "notebooks/local_admin_notebook.ipynb", "notebooks/s3_example_notebook.ipynb", "poster.rst", "server_administration.rst", "server_api.rst", "server_cli.rst", "server_dashboard.rst", "server_deployment.rst", "server_kubernetes.rst", "server_local.rst", "server_modules.rst", "server_onyxia.rst"], "indexentries": {"access_key_id (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.access_key_id", false]], "admindbtype (class in lomas_server.constants)": [[12, "lomas_server.constants.AdminDBType", false]], "aim (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.AIM", false]], "aim (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.AIM", false]], "basic (lomas_server.constants.datasetstoretype attribute)": [[12, "lomas_server.constants.DatasetStoreType.BASIC", false]], "bucket (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.bucket", false]], "bucket (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.bucket", false]], "categorical (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.CATEGORICAL", false]], "censor_dims (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.censor_dims", false]], "change_one_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.CHANGE_ONE_DISTANCE", false]], "client (class in lomas_client.client)": [[11, "lomas_client.client.Client", false]], "columns (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.columns", false]], "condition (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.condition", false]], "configkeys (class in lomas_server.constants)": [[12, "lomas_server.constants.ConfigKeys", false]], "constraints (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.constraints", false]], "continuous (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.CONTINUOUS", false]], "credentials_name (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.credentials_name", false]], "credentials_name (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.credentials_name", false]], "cube (lomas_server.constants.ssynthtabletransstyle attribute)": [[12, "lomas_server.constants.SSynthTableTransStyle.CUBE", false]], "database_type (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.database_type", false]], "database_type (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.database_type", false]], "database_type (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.database_type", false]], "database_type (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.database_type", false]], "dataconnectorobserver (class in lomas_server.dataset_store.data_connector_observer)": [[16, "lomas_server.dataset_store.data_connector_observer.DataConnectorObserver", false]], "dataset (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.Dataset", false]], "dataset_name (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.dataset_name", false]], "dataset_name (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.getdbdata attribute)": [[21, "lomas_server.utils.query_models.GetDbData.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.dataset_name", false]], "dataset_path (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.dataset_path", false]], "dataset_store (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DATASET_STORE", false]], "dataset_store_type (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DATASET_STORE_TYPE", false]], "datasetofpathdb (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB", false]], "datasetofs3db (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB", false]], "datasetofuser (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.DatasetOfUser", false]], "datasets (lomas_server.utils.collection_models.datasetscollection attribute)": [[21, "lomas_server.utils.collection_models.DatasetsCollection.datasets", false]], "datasets_list (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.datasets_list", false]], "datasetscollection (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.DatasetsCollection", false]], "datasetstoretype (class in lomas_server.constants)": [[12, "lomas_server.constants.DatasetStoreType", false]], "datetime (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.DATETIME", false]], "db (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DB", false]], "db_type (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DB_TYPE", false]], "db_type_mongodb (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DB_TYPE_MONGODB", false]], "delta (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.delta", false]], "delta (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.delta", false]], "delta (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.delta", false]], "delta (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.delta", false]], "develop_mode (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DEVELOP_MODE", false]], "diffprivlib (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.DIFFPRIVLIB", false]], "diffprivlib (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.DIFFPRIVLIB", false]], "diffprivlib_json (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.diffprivlib_json", false]], "diffprivlib_json (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.diffprivlib_json", false]], "diffprivlib_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.diffprivlib_query", false]], "diffprivlibmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel", false]], "dp_ctgan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.DP_CTGAN", false]], "dp_ctgan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.DP_CTGAN", false]], "dp_gan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.DP_GAN", false]], "dp_gan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.DP_GAN", false]], "dp_library (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DP_LIBRARY", false]], "dplibraries (class in lomas_client.client)": [[11, "lomas_client.client.DPLibraries", false]], "dplibraries (class in lomas_server.constants)": [[12, "lomas_server.constants.DPLibraries", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.dummy_nb_rows", false]], "dummy_seed (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.dummy_seed", false]], "dummydiffprivlibmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel", false]], "dummyopendpmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel", false]], "dummysmartnoisesqlmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel", false]], "dummysmartnoisesynthquerymodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel", false]], "endpoint_url (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.endpoint_url", false]], "endpoint_url (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.endpoint_url", false]], "epsilon (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.epsilon", false]], "epsilon (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.epsilon", false]], "epsilon (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.epsilon", false]], "epsilon (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.epsilon", false]], "error_message() (in module lomas_client.client)": [[11, "lomas_client.client.error_message", false]], "estimate_diffprivlib_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_diffprivlib_cost", false]], "estimate_opendp_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_opendp_cost", false]], "estimate_smartnoise_sql_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_smartnoise_sql_cost", false]], "estimate_smartnoise_synth_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_smartnoise_synth_cost", false]], "feature_columns (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.feature_columns", false]], "feature_columns (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.feature_columns", false]], "fixed_delta (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.fixed_delta", false]], "fixed_delta (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.fixed_delta", false]], "fixed_smoothed_max_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.FIXED_SMOOTHED_MAX_DIVERGENCE", false]], "gan (lomas_server.constants.ssynthtabletransstyle attribute)": [[12, "lomas_server.constants.SSynthTableTransStyle.GAN", false]], "get_dataset_metadata() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_dataset_metadata", false]], "get_dummy_dataset() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_dummy_dataset", false]], "get_initial_budget() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_initial_budget", false]], "get_previous_queries() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_previous_queries", false]], "get_remaining_budget() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_remaining_budget", false]], "get_total_spent_budget() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_total_spent_budget", false]], "getdbdata (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.GetDbData", false]], "getdummydataset (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.GetDummyDataset", false]], "hamming_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.HAMMING_DISTANCE", false]], "imputer_strategy (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.imputer_strategy", false]], "imputer_strategy (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.imputer_strategy", false]], "initial_delta (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.initial_delta", false]], "initial_epsilon (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.initial_epsilon", false]], "insert_delete_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.INSERT_DELETE_DISTANCE", false]], "int_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.INT_DISTANCE", false]], "jitter (lomas_server.constants.timeattackmethod attribute)": [[12, "lomas_server.constants.TimeAttackMethod.JITTER", false]], "key (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.key", false]], "key (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.key", false]], "lomas_client": [[11, "module-lomas_client", false]], "lomas_client.client": [[11, "module-lomas_client.client", false]], "lomas_client.utils": [[11, "module-lomas_client.utils", false]], "lomas_server": [[12, "module-lomas_server", false]], "lomas_server.admin_database": [[13, "module-lomas_server.admin_database", false]], "lomas_server.administration": [[14, "module-lomas_server.administration", false]], "lomas_server.constants": [[12, "module-lomas_server.constants", false]], "lomas_server.data_connector": [[15, "module-lomas_server.data_connector", false]], "lomas_server.dataset_store": [[16, "module-lomas_server.dataset_store", false]], "lomas_server.dataset_store.data_connector_observer": [[16, "module-lomas_server.dataset_store.data_connector_observer", false]], "lomas_server.dp_queries": [[17, "module-lomas_server.dp_queries", false]], "lomas_server.dp_queries.dp_libraries": [[18, "module-lomas_server.dp_queries.dp_libraries", false]], "lomas_server.routes": [[19, "module-lomas_server.routes", false]], "lomas_server.tests": [[20, "module-lomas_server.tests", false]], "lomas_server.tests.constants": [[20, "module-lomas_server.tests.constants", false]], "lomas_server.utils": [[21, "module-lomas_server.utils", false]], "lomas_server.utils.collection_models": [[21, "module-lomas_server.utils.collection_models", false]], "lomas_server.utils.logger": [[21, "module-lomas_server.utils.logger", false]], "lomas_server.utils.query_examples": [[21, "module-lomas_server.utils.query_examples", false]], "lomas_server.utils.query_models": [[21, "module-lomas_server.utils.query_models", false]], "lru (lomas_server.constants.datasetstoretype attribute)": [[12, "lomas_server.constants.DatasetStoreType.LRU", false]], "lru_dataset_store_max_size (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.LRU_DATASET_STORE_MAX_SIZE", false]], "make_dummy() (in module lomas_server.utils.query_examples)": [[21, "lomas_server.utils.query_examples.make_dummy", false]], "max_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.MAX_DIVERGENCE", false]], "max_ids (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.max_ids", false]], "may_query (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.may_query", false]], "mechanisms (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.mechanisms", false]], "mechanisms (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.mechanisms", false]], "mechanisms (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.mechanisms", false]], "metadata (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.Metadata", false]], "metadata (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.metadata", false]], "metadata_path (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.metadata_path", false]], "metadataofdataset (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.MetadataOfDataset", false]], "metadataofpathdb (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB", false]], "metadataofs3db (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB", false]], "model_computed_fields (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetscollection attribute)": [[21, "lomas_server.utils.collection_models.DatasetsCollection.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadataofdataset attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfDataset.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.usercollection attribute)": [[21, "lomas_server.utils.collection_models.UserCollection.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.getdbdata attribute)": [[21, "lomas_server.utils.query_models.GetDbData.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.model_computed_fields", false]], "model_config (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetscollection attribute)": [[21, "lomas_server.utils.collection_models.DatasetsCollection.model_config", false]], "model_config (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.model_config", false]], "model_config (lomas_server.utils.collection_models.metadataofdataset attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfDataset.model_config", false]], "model_config (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.model_config", false]], "model_config (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.model_config", false]], "model_config (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.model_config", false]], "model_config (lomas_server.utils.collection_models.usercollection attribute)": [[21, "lomas_server.utils.collection_models.UserCollection.model_config", false]], "model_config (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.model_config", false]], "model_config (lomas_server.utils.query_models.getdbdata attribute)": [[21, "lomas_server.utils.query_models.GetDbData.model_config", false]], "model_config (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.model_config", false]], "model_config (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.model_config", false]], "model_fields (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetscollection attribute)": [[21, "lomas_server.utils.collection_models.DatasetsCollection.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadataofdataset attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfDataset.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.model_fields", false]], "model_fields (lomas_server.utils.collection_models.usercollection attribute)": [[21, "lomas_server.utils.collection_models.UserCollection.model_fields", false]], "model_fields (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.getdbdata attribute)": [[21, "lomas_server.utils.query_models.GetDbData.model_fields", false]], "model_fields (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.model_fields", false]], "model_fields (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.model_fields", false]], "module": [[11, "module-lomas_client", false], [11, "module-lomas_client.client", false], [11, "module-lomas_client.utils", false], [12, "module-lomas_server", false], [12, "module-lomas_server.constants", false], [13, "module-lomas_server.admin_database", false], [14, "module-lomas_server.administration", false], [15, "module-lomas_server.data_connector", false], [16, "module-lomas_server.dataset_store", false], [16, "module-lomas_server.dataset_store.data_connector_observer", false], [17, "module-lomas_server.dp_queries", false], [18, "module-lomas_server.dp_queries.dp_libraries", false], [19, "module-lomas_server.routes", false], [20, "module-lomas_server.tests", false], [20, "module-lomas_server.tests.constants", false], [21, "module-lomas_server.utils", false], [21, "module-lomas_server.utils.collection_models", false], [21, "module-lomas_server.utils.logger", false], [21, "module-lomas_server.utils.query_examples", false], [21, "module-lomas_server.utils.query_models", false]], "mongodb (lomas_server.constants.admindbtype attribute)": [[12, "lomas_server.constants.AdminDBType.MONGODB", false]], "mongodb_addr (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.MONGODB_ADDR", false]], "mongodb_port (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.MONGODB_PORT", false]], "mst (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.MST", false]], "mst (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.MST", false]], "mwem (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.MWEM", false]], "mwem (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.MWEM", false]], "nb_samples (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.nb_samples", false]], "nullable (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.nullable", false]], "opendp (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.OPENDP", false]], "opendp (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.OPENDP", false]], "opendp_json (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.opendp_json", false]], "opendp_json (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.opendp_json", false]], "opendp_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.opendp_query", false]], "opendpdatasetinputmetric (class in lomas_server.constants)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric", false]], "opendpmeasurement (class in lomas_server.constants)": [[12, "lomas_server.constants.OpenDPMeasurement", false]], "opendpmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.OpenDPModel", false]], "pac_synth (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.PAC_SYNTH", false]], "pac_synth (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.PAC_SYNTH", false]], "pate_ctgan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.PATE_CTGAN", false]], "pate_ctgan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.PATE_CTGAN", false]], "pate_gan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.PATE_GAN", false]], "pate_gan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.PATE_GAN", false]], "path (lomas_server.constants.privatedatabasetype attribute)": [[12, "lomas_server.constants.PrivateDatabaseType.PATH", false]], "postprocess (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.postprocess", false]], "postprocess (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.postprocess", false]], "private_id (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.PRIVATE_ID", false]], "privatedatabasetype (class in lomas_server.constants)": [[12, "lomas_server.constants.PrivateDatabaseType", false]], "query_str (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.query_str", false]], "query_str (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.query_str", false]], "query_str (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.query_str", false]], "return_model (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.return_model", false]], "row_privacy (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.row_privacy", false]], "runtime_args (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.RUNTIME_ARGS", false]], "s3 (lomas_server.constants.privatedatabasetype attribute)": [[12, "lomas_server.constants.PrivateDatabaseType.S3", false]], "secret_access_key (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.secret_access_key", false]], "select_cols (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.select_cols", false]], "server (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.SERVER", false]], "settings (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.SETTINGS", false]], "smartnoise_sql (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.SMARTNOISE_SQL", false]], "smartnoise_sql (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.SMARTNOISE_SQL", false]], "smartnoise_sql_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.smartnoise_sql_query", false]], "smartnoise_synth (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.SMARTNOISE_SYNTH", false]], "smartnoise_synth (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.SMARTNOISE_SYNTH", false]], "smartnoise_synth_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.smartnoise_synth_query", false]], "smartnoisesqlcostmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel", false]], "smartnoisesqlmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel", false]], "smartnoisesynthcostmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel", false]], "smartnoisesynthquerymodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel", false]], "smoothed_max_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.SMOOTHED_MAX_DIVERGENCE", false]], "ssynthcolumntype (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthColumnType", false]], "ssynthgansynthesizer (class in lomas_client.utils)": [[11, "lomas_client.utils.SSynthGanSynthesizer", false]], "ssynthgansynthesizer (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthGanSynthesizer", false]], "ssynthmarginalsynthesizer (class in lomas_client.utils)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer", false]], "ssynthmarginalsynthesizer (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer", false]], "ssynthtabletransstyle (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthTableTransStyle", false]], "stall (lomas_server.constants.timeattackmethod attribute)": [[12, "lomas_server.constants.TimeAttackMethod.STALL", false]], "submit_limit (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.SUBMIT_LIMIT", false]], "symmetric_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.SYMMETRIC_DISTANCE", false]], "synth_name (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.synth_name", false]], "synth_params (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.synth_params", false]], "target_columns (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.target_columns", false]], "target_columns (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.target_columns", false]], "test_size (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.test_size", false]], "test_size (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.test_size", false]], "test_train_split_seed (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.test_train_split_seed", false]], "test_train_split_seed (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.test_train_split_seed", false]], "time_attack (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.TIME_ATTACK", false]], "timeattackmethod (class in lomas_server.constants)": [[12, "lomas_server.constants.TimeAttackMethod", false]], "total_spent_delta (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.total_spent_delta", false]], "total_spent_epsilon (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.total_spent_epsilon", false]], "update_memory_usage() (lomas_server.dataset_store.data_connector_observer.dataconnectorobserver method)": [[16, "lomas_server.dataset_store.data_connector_observer.DataConnectorObserver.update_memory_usage", false]], "user (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.User", false]], "user_name (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.user_name", false]], "usercollection (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.UserCollection", false]], "users (lomas_server.utils.collection_models.usercollection attribute)": [[21, "lomas_server.utils.collection_models.UserCollection.users", false]], "validate_synthesizer() (in module lomas_client.utils)": [[11, "lomas_client.utils.validate_synthesizer", false]], "yaml (lomas_server.constants.admindbtype attribute)": [[12, "lomas_server.constants.AdminDBType.YAML", false]], "zero_concentrated_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.ZERO_CONCENTRATED_DIVERGENCE", false]]}, "objects": {"": [[11, 0, 0, "-", "lomas_client"], [12, 0, 0, "-", "lomas_server"]], "lomas_client": [[11, 0, 0, "-", "client"], [11, 0, 0, "-", "utils"]], "lomas_client.client": [[11, 1, 1, "", "Client"], [11, 1, 1, "", "DPLibraries"], [11, 4, 1, "", "error_message"]], "lomas_client.client.Client": [[11, 2, 1, "", "diffprivlib_query"], [11, 2, 1, "", "estimate_diffprivlib_cost"], [11, 2, 1, "", "estimate_opendp_cost"], [11, 2, 1, "", "estimate_smartnoise_sql_cost"], [11, 2, 1, "", "estimate_smartnoise_synth_cost"], [11, 2, 1, "", "get_dataset_metadata"], [11, 2, 1, "", "get_dummy_dataset"], [11, 2, 1, "", "get_initial_budget"], [11, 2, 1, "", "get_previous_queries"], [11, 2, 1, "", "get_remaining_budget"], [11, 2, 1, "", "get_total_spent_budget"], [11, 2, 1, "", "opendp_query"], [11, 2, 1, "", "smartnoise_sql_query"], [11, 2, 1, "", "smartnoise_synth_query"]], "lomas_client.client.DPLibraries": [[11, 3, 1, "", "DIFFPRIVLIB"], [11, 3, 1, "", "OPENDP"], [11, 3, 1, "", "SMARTNOISE_SQL"], [11, 3, 1, "", "SMARTNOISE_SYNTH"]], "lomas_client.utils": [[11, 1, 1, "", "SSynthGanSynthesizer"], [11, 1, 1, "", "SSynthMarginalSynthesizer"], [11, 4, 1, "", "validate_synthesizer"]], "lomas_client.utils.SSynthGanSynthesizer": [[11, 3, 1, "", "DP_CTGAN"], [11, 3, 1, "", "DP_GAN"], [11, 3, 1, "", "PATE_CTGAN"], [11, 3, 1, "", "PATE_GAN"]], "lomas_client.utils.SSynthMarginalSynthesizer": [[11, 3, 1, "", "AIM"], [11, 3, 1, "", "MST"], [11, 3, 1, "", "MWEM"], [11, 3, 1, "", "PAC_SYNTH"]], "lomas_server": [[13, 0, 0, "-", "admin_database"], [14, 0, 0, "-", "administration"], [12, 0, 0, "-", "constants"], [15, 0, 0, "-", "data_connector"], [16, 0, 0, "-", "dataset_store"], [17, 0, 0, "-", "dp_queries"], [19, 0, 0, "-", "routes"], [20, 0, 0, "-", "tests"], [21, 0, 0, "-", "utils"]], "lomas_server.constants": [[12, 1, 1, "", "AdminDBType"], [12, 1, 1, "", "ConfigKeys"], [12, 1, 1, "", "DPLibraries"], [12, 1, 1, "", "DatasetStoreType"], [12, 1, 1, "", "OpenDPDatasetInputMetric"], [12, 1, 1, "", "OpenDPMeasurement"], [12, 1, 1, "", "PrivateDatabaseType"], [12, 1, 1, "", "SSynthColumnType"], [12, 1, 1, "", "SSynthGanSynthesizer"], [12, 1, 1, "", "SSynthMarginalSynthesizer"], [12, 1, 1, "", "SSynthTableTransStyle"], [12, 1, 1, "", "TimeAttackMethod"]], "lomas_server.constants.AdminDBType": [[12, 3, 1, "", "MONGODB"], [12, 3, 1, "", "YAML"]], "lomas_server.constants.ConfigKeys": [[12, 3, 1, "", "DATASET_STORE"], [12, 3, 1, "", "DATASET_STORE_TYPE"], [12, 3, 1, "", "DB"], [12, 3, 1, "", "DB_TYPE"], [12, 3, 1, "", "DB_TYPE_MONGODB"], [12, 3, 1, "", "DEVELOP_MODE"], [12, 3, 1, "", "DP_LIBRARY"], [12, 3, 1, "", "LRU_DATASET_STORE_MAX_SIZE"], [12, 3, 1, "", "MONGODB_ADDR"], [12, 3, 1, "", "MONGODB_PORT"], [12, 3, 1, "", "RUNTIME_ARGS"], [12, 3, 1, "", "SERVER"], [12, 3, 1, "", "SETTINGS"], [12, 3, 1, "", "SUBMIT_LIMIT"], [12, 3, 1, "", "TIME_ATTACK"]], "lomas_server.constants.DPLibraries": [[12, 3, 1, "", "DIFFPRIVLIB"], [12, 3, 1, "", "OPENDP"], [12, 3, 1, "", "SMARTNOISE_SQL"], [12, 3, 1, "", "SMARTNOISE_SYNTH"]], "lomas_server.constants.DatasetStoreType": [[12, 3, 1, "", "BASIC"], [12, 3, 1, "", "LRU"]], "lomas_server.constants.OpenDPDatasetInputMetric": [[12, 3, 1, "", "CHANGE_ONE_DISTANCE"], [12, 3, 1, "", "HAMMING_DISTANCE"], [12, 3, 1, "", "INSERT_DELETE_DISTANCE"], [12, 3, 1, "", "INT_DISTANCE"], [12, 3, 1, "", "SYMMETRIC_DISTANCE"]], "lomas_server.constants.OpenDPMeasurement": [[12, 3, 1, "", "FIXED_SMOOTHED_MAX_DIVERGENCE"], [12, 3, 1, "", "MAX_DIVERGENCE"], [12, 3, 1, "", "SMOOTHED_MAX_DIVERGENCE"], [12, 3, 1, "", "ZERO_CONCENTRATED_DIVERGENCE"]], "lomas_server.constants.PrivateDatabaseType": [[12, 3, 1, "", "PATH"], [12, 3, 1, "", "S3"]], "lomas_server.constants.SSynthColumnType": [[12, 3, 1, "", "CATEGORICAL"], [12, 3, 1, "", "CONTINUOUS"], [12, 3, 1, "", "DATETIME"], [12, 3, 1, "", "PRIVATE_ID"]], "lomas_server.constants.SSynthGanSynthesizer": [[12, 3, 1, "", "DP_CTGAN"], [12, 3, 1, "", "DP_GAN"], [12, 3, 1, "", "PATE_CTGAN"], [12, 3, 1, "", "PATE_GAN"]], "lomas_server.constants.SSynthMarginalSynthesizer": [[12, 3, 1, "", "AIM"], [12, 3, 1, "", "MST"], [12, 3, 1, "", "MWEM"], [12, 3, 1, "", "PAC_SYNTH"]], "lomas_server.constants.SSynthTableTransStyle": [[12, 3, 1, "", "CUBE"], [12, 3, 1, "", "GAN"]], "lomas_server.constants.TimeAttackMethod": [[12, 3, 1, "", "JITTER"], [12, 3, 1, "", "STALL"]], "lomas_server.dataset_store": [[16, 0, 0, "-", "data_connector_observer"]], "lomas_server.dataset_store.data_connector_observer": [[16, 1, 1, "", "DataConnectorObserver"]], "lomas_server.dataset_store.data_connector_observer.DataConnectorObserver": [[16, 2, 1, "", "update_memory_usage"]], "lomas_server.dp_queries": [[18, 0, 0, "-", "dp_libraries"]], "lomas_server.tests": [[20, 0, 0, "-", "constants"]], "lomas_server.utils": [[21, 0, 0, "-", "collection_models"], [21, 0, 0, "-", "logger"], [21, 0, 0, "-", "query_examples"], [21, 0, 0, "-", "query_models"]], "lomas_server.utils.collection_models": [[21, 1, 1, "", "Dataset"], [21, 1, 1, "", "DatasetOfPathDB"], [21, 1, 1, "", "DatasetOfS3DB"], [21, 1, 1, "", "DatasetOfUser"], [21, 1, 1, "", "DatasetsCollection"], [21, 1, 1, "", "Metadata"], [21, 1, 1, "", "MetadataOfDataset"], [21, 1, 1, "", "MetadataOfPathDB"], [21, 1, 1, "", "MetadataOfS3DB"], [21, 1, 1, "", "User"], [21, 1, 1, "", "UserCollection"]], "lomas_server.utils.collection_models.Dataset": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "metadata"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.DatasetOfPathDB": [[21, 3, 1, "", "database_type"], [21, 3, 1, "", "dataset_path"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.DatasetOfS3DB": [[21, 3, 1, "", "bucket"], [21, 3, 1, "", "credentials_name"], [21, 3, 1, "", "database_type"], [21, 3, 1, "", "endpoint_url"], [21, 3, 1, "", "key"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.DatasetOfUser": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "initial_delta"], [21, 3, 1, "", "initial_epsilon"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "total_spent_delta"], [21, 3, 1, "", "total_spent_epsilon"]], "lomas_server.utils.collection_models.DatasetsCollection": [[21, 3, 1, "", "datasets"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.Metadata": [[21, 3, 1, "", "censor_dims"], [21, 3, 1, "", "columns"], [21, 3, 1, "", "max_ids"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "row_privacy"]], "lomas_server.utils.collection_models.MetadataOfDataset": [[21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.MetadataOfPathDB": [[21, 3, 1, "", "database_type"], [21, 3, 1, "", "metadata_path"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.MetadataOfS3DB": [[21, 3, 1, "", "access_key_id"], [21, 3, 1, "", "bucket"], [21, 3, 1, "", "credentials_name"], [21, 3, 1, "", "database_type"], [21, 3, 1, "", "endpoint_url"], [21, 3, 1, "", "key"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "secret_access_key"]], "lomas_server.utils.collection_models.User": [[21, 3, 1, "", "datasets_list"], [21, 3, 1, "", "may_query"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "user_name"]], "lomas_server.utils.collection_models.UserCollection": [[21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "users"]], "lomas_server.utils.query_examples": [[21, 4, 1, "", "make_dummy"]], "lomas_server.utils.query_models": [[21, 1, 1, "", "DiffPrivLibModel"], [21, 1, 1, "", "DummyDiffPrivLibModel"], [21, 1, 1, "", "DummyOpenDPModel"], [21, 1, 1, "", "DummySmartnoiseSQLModel"], [21, 1, 1, "", "DummySmartnoiseSynthQueryModel"], [21, 1, 1, "", "GetDbData"], [21, 1, 1, "", "GetDummyDataset"], [21, 1, 1, "", "OpenDPModel"], [21, 1, 1, "", "SmartnoiseSQLCostModel"], [21, 1, 1, "", "SmartnoiseSQLModel"], [21, 1, 1, "", "SmartnoiseSynthCostModel"], [21, 1, 1, "", "SmartnoiseSynthQueryModel"]], "lomas_server.utils.query_models.DiffPrivLibModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "diffprivlib_json"], [21, 3, 1, "", "feature_columns"], [21, 3, 1, "", "imputer_strategy"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "target_columns"], [21, 3, 1, "", "test_size"], [21, 3, 1, "", "test_train_split_seed"]], "lomas_server.utils.query_models.DummyDiffPrivLibModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "diffprivlib_json"], [21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "feature_columns"], [21, 3, 1, "", "imputer_strategy"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "target_columns"], [21, 3, 1, "", "test_size"], [21, 3, 1, "", "test_train_split_seed"]], "lomas_server.utils.query_models.DummyOpenDPModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "fixed_delta"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "opendp_json"]], "lomas_server.utils.query_models.DummySmartnoiseSQLModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "delta"], [21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "epsilon"], [21, 3, 1, "", "mechanisms"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "postprocess"], [21, 3, 1, "", "query_str"]], "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel": [[21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.query_models.GetDbData": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.query_models.GetDummyDataset": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.query_models.OpenDPModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "fixed_delta"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "opendp_json"]], "lomas_server.utils.query_models.SmartnoiseSQLCostModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "delta"], [21, 3, 1, "", "epsilon"], [21, 3, 1, "", "mechanisms"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "query_str"]], "lomas_server.utils.query_models.SmartnoiseSQLModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "delta"], [21, 3, 1, "", "epsilon"], [21, 3, 1, "", "mechanisms"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "postprocess"], [21, 3, 1, "", "query_str"]], "lomas_server.utils.query_models.SmartnoiseSynthCostModel": [[21, 3, 1, "", "constraints"], [21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "delta"], [21, 3, 1, "", "epsilon"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "nullable"], [21, 3, 1, "", "select_cols"], [21, 3, 1, "", "synth_name"], [21, 3, 1, "", "synth_params"]], "lomas_server.utils.query_models.SmartnoiseSynthQueryModel": [[21, 3, 1, "", "condition"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "nb_samples"], [21, 3, 1, "", "return_model"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function"}, "terms": {"": [0, 2, 9, 22, 23, 24, 25, 26, 27, 37], "0": [0, 11, 21, 22, 23, 24, 25, 26, 27, 31, 35], "00": 26, "000000": 25, "000000000032756e": 24, "0001": [22, 23, 25, 26], "00014999500000001387": 27, "00015673368198174188": [22, 25], "0003": 25, "0004": [21, 24], "0005": 26, "001": 26, "004345": 22, "00493999999999994": 24, "004950000000000006": 22, "004989999999999935": 24, "004994999999999967": 24, "005": [22, 24, 26], "0064163": 23, "009962": 22, "01": 27, "010140": 24, "015296": 25, "019657": 25, "021906": 25, "02257092": 23, "029771": 25, "03": 9, "03063776": 23, "031628": [22, 24], "037792": 25, "038092": 24, "039871": 25, "04": 24, "0403549": 23, "040502": 25, "040945": 22, "04333305": 23, "05": [22, 24, 25, 26], "051061": 27, "057986": 25, "058849": 22, "06": [24, 26], "06269805": 23, "064838": 25, "064982": 24, "065695": 25, "067739": 24, "07": 26, "070911": [22, 24], "075665": 24, "0776813": 22, "0791934": 23, "08181725": 23, "085707": 24, "09": [23, 26], "09042376": 23, "092630": 25, "095856": 25, "096718": [22, 24], "0x75edc6883650": 25, "0x75edc6e1ffd0": 25, "1": [6, 8, 11, 12, 21, 26, 31, 35], "10": [22, 23, 24, 25, 26, 27], "100": [11, 22, 23, 24, 25, 26, 27], "1000": 26, "100000": 26, "1047": 23, "10520211": 23, "108904": 24, "11": [22, 23, 24, 25, 26, 27], "112": 23, "113": 23, "114": 23, "114285714286655": 24, "115": 23, "115118": 25, "116": 23, "116608": 25, "117": 23, "117959": 24, "118": 23, "119": 23, "119691": 25, "12": [22, 23, 24, 25, 26, 27], "120": 23, "12087": 23, "121": 23, "122": [23, 24], "123": 23, "125": 25, "125950": 24, "126": 23, "126229": 22, "127": [23, 35], "128": [23, 25], "12818723": 23, "13": [22, 23, 24, 25, 26, 27], "133": 27, "135689": 25, "135714285713345": 24, "136712": 25, "13806414": 23, "14": [22, 24, 25, 26, 27], "143560": 24, "143633": 27, "149507": 24, "15": [22, 23, 24, 25, 26, 27], "150": [22, 23, 24, 25, 26], "152": 22, "154047": 25, "155": 25, "155779": 25, "158": 24, "159": 24, "16": [22, 23, 24, 25, 26, 27], "160858": 27, "162871": 24, "164572": 25, "1653635": 23, "166": 24, "167": 22, "17": [22, 23, 24, 25, 26, 27], "170": 22, "17087": 9, "1724943669": 25, "1725364882": 22, "1725364890": 22, "1725364897": 22, "1725364925": 22, "1725375748": 23, "1725375760": 23, "1725375769": 23, "17307692307692307": 23, "174224": 22, "175608": 24, "176": 25, "1789": 23, "179": 23, "179588": 22, "18": [22, 23, 24, 25, 26, 27], "180": 25, "181": 22, "182522": 25, "184": 25, "187": 22, "188": 25, "189": 25, "18mm": 24, "19": [22, 24, 25, 26, 27], "190": [24, 25], "192": 25, "193": 25, "195": [22, 25], "195120": 25, "196": [22, 25], "196980": 25, "197": [22, 25], "198": [22, 23], "199": [22, 27], "199850005": 27, "1e": [11, 22, 23, 24, 25, 26, 27], "2": [6, 8, 11, 26], "20": [22, 23, 24, 25, 26, 27], "200": [11, 22, 24, 25, 27], "2000": [22, 23, 24, 25, 26], "2017": 22, "202": 25, "2020": 22, "2022": [9, 22], "2024": [9, 22, 26], "203": 25, "203165": 24, "205857": 22, "206": 25, "208380": 25, "208473": [22, 24], "209": 25, "21": [22, 23, 24, 25, 26, 27], "210": 24, "210038": 22, "213206": 25, "214": 24, "214375": 22, "215": 25, "215382": 25, "21843151": 23, "219": [22, 25], "22": [22, 23, 24, 25, 26, 27], "220": 25, "224480": 25, "2250": 25, "2258": 24, "22857142857142856": 23, "23": [22, 23, 24, 25, 26, 27], "2316": 24, "233215": 25, "235": 25, "23529411764705882": 22, "236": 24, "236663": 22, "239": 24, "24": [22, 23, 24, 25, 26, 27], "240181818190626": 27, "2405": 22, "2406": 9, "242": 24, "2421": 27, "244": 24, "2464255812": 27, "246787": 24, "246870": 24, "246992": 27, "248922": 25, "25": [22, 23, 24, 25, 26, 27], "250": [22, 23, 24, 25, 26], "2503": 27, "256": 25, "2562": 27, "26": [22, 23, 24, 25, 26, 27], "2619": 23, "27": [22, 23, 24, 25, 26, 27], "27017": [26, 31], "2733": 27, "273981": 25, "2750": 25, "275001": 24, "28": [22, 23, 24, 25, 26, 27], "285002": 24, "285714285713345": 24, "2873": 24, "289634": 24, "29": [22, 23, 24, 25, 26, 27], "291927": 24, "293022": 25, "2964165": 23, "29748358": 23, "298139": 25, "3": [6, 8, 26], "30": [22, 23, 24, 25, 26, 27], "300": 26, "300011": 22, "303064": 25, "31": [22, 24, 25, 26, 27], "310123": 25, "314292": 24, "318067": 25, "32": [22, 23, 24, 25, 26, 27], "322245": 25, "326402": 24, "3265": 27, "3280285": 23, "3299136": 22, "33": [22, 23, 24, 25, 26], "332225": 24, "332719": 25, "334219": 25, "3379": 25, "34": [22, 23, 24, 25, 26, 27], "340155": 22, "343": 24, "344": [22, 23, 24, 25], "346262": 25, "35": [22, 23, 24, 26], "3503": 25, "351940": 22, "36": [22, 23, 25, 26], "3639": 24, "364104": 24, "3655": 25, "3665": 22, "3677": 25, "37": [22, 23, 24, 25, 26], "371106": 25, "3719": 25, "3729": 25, "375": 25, "38": [22, 23, 24, 26, 27], "380197": 25, "381155": 24, "38324636": 23, "386925": 25, "386937": 25, "39": [22, 23, 24, 25, 26, 27], "392393": 25, "393938": 25, "396": 26, "399": 27, "4": [5, 6, 25, 26], "40": [22, 23, 26], "400": [22, 27], "403337": 25, "4036": 22, "4078": 27, "4079": 25, "408606": 24, "409859": 25, "41": [22, 23, 24, 25, 26], "4114": 25, "413996": 24, "4144": 23, "418": 26, "418710": 25, "42": [11, 22, 23, 24, 25, 26], "420402": 24, "4207": 23, "422": [23, 25], "42783671": 23, "43": [22, 23, 24, 25, 26, 27], "437214": 25, "4394": 25, "44": [22, 23, 24, 25, 26], "441730": 25, "4419": 25, "442156": 22, "442859": 22, "444863": 25, "4452": 27, "445511": 25, "4458": 25, "4478": 25, "45": [22, 23, 24, 25, 26, 27], "450379": 25, "4523578": 25, "452576": 25, "453384": 25, "4534618": 23, "456669": 24, "46": [22, 23, 24, 25, 26], "460652": 24, "461": 26, "4611": 27, "46118653": 23, "4627": 25, "464": 26, "4653": 25, "4656": 24, "466": 26, "467873": 22, "47": [22, 23, 24, 25, 26], "4703": 24, "472887": 24, "4772062": 23, "48": [22, 24, 25, 26], "482846": 25, "4833": 27, "485997": 25, "4860": 27, "487531": 22, "4887658": 23, "489978": 25, "49": [22, 24, 25, 26, 27], "4925373134328358": 23, "494324": 25, "495445": 25, "496153": 25, "499e": 24, "5": [6, 11, 21, 22, 24, 25, 26, 27, 31], "50": [22, 24, 25, 26], "500": 25, "5000": [22, 25], "5012": 25, "5036": 24, "504224": 25, "505892": 25, "506950": 22, "5085": 25, "51": [22, 23, 24, 25, 26], "511585": 22, "511754": 25, "51229381350249": 24, "513633": 22, "515079": 25, "5152": 25, "51532": 24, "5187": 24, "52": [22, 25, 26], "5250": 25, "5256": 25, "526961": 23, "527822": 25, "53": [22, 25], "530153": 24, "534705": 22, "5361": 25, "536535": 25, "538643": 25, "5387": 25, "54": [22, 25, 26], "5401": 24, "5405": [25, 27], "542186": 24, "54397209": 23, "548207": 25, "548540": 25, "5486": 25, "548668": 25, "54mm": 22, "55": [22, 24], "550000000000001": 24, "5514": 25, "552031": 22, "552931": 24, "557167": 24, "559502": 22, "56": [22, 23], "5630": [24, 27], "565315": 22, "56533889": 23, "566451": 24, "57": [22, 23, 24, 25], "573335": 22, "58": [22, 23, 25], "5857142857133439": 24, "586326": 25, "5870": 22, "589007": 25, "59": [22, 23, 26], "596290": 22, "597868": 22, "6": [6, 22, 24, 26, 27], "60": 22, "600734": 25, "6048": 25, "61": 22, "61111848": 23, "6134": 25, "6183": 25, "619788": 24, "62": [22, 23], "621885": 22, "625": 25, "627252": 25, "627506": 25, "6291": 25, "63": [23, 24, 25], "632390": 22, "6332": 25, "633310": 25, "634349": 22, "634415": 24, "6345": 25, "6358": 25, "63708804": 23, "639037": 25, "6397": 27, "64": 25, "641046": 23, "642906": 24, "643492": 24, "644815": 25, "649727": 25, "649887": 24, "65": [22, 23, 24, 25, 26], "6532": 22, "6542": 25, "659944": 24, "6634": 27, "666000": 25, "667682": 25, "667950": 25, "67": 24, "673375": 22, "6743": 27, "677968": 22, "678": 26, "687155": 22, "688074": 24, "690454": 24, "6916816": 22, "69469642643347": 23, "695215": 25, "695675": 24, "7": [22, 23, 24, 25, 26, 27], "7000": [22, 23, 24, 25, 26], "700080": 22, "703": 26, "70486754": 23, "706083": 25, "71": [23, 24], "710": 26, "7122093023265228": 22, "712894": 25, "714285714286655": 24, "715853": 24, "72": 23, "725760": 22, "726": 26, "73": 23, "733179": 24, "73642974": 23, "74": 23, "741": 26, "74222011": 23, "743330": 24, "749": 26, "75": [23, 24, 25], "755": 26, "755816": 24, "76": 23, "769447201112094": 22, "77": [22, 23], "773158": 24, "775184": 22, "777496": 22, "777518": 24, "778165": 22, "778699": 25, "783114": 25, "785036": 25, "785941": 27, "788893": 25, "79": [23, 27], "792230": 25, "796037": 24, "799114": 25, "8": [22, 23, 24, 25, 26, 27], "80": [23, 25], "800": 22, "803438": 24, "809876": 25, "809981": 25, "811036": 25, "813858": 22, "81874155": 23, "82": 23, "825123": 25, "825255002419716": 22, "8266": 27, "827918": [22, 24], "828992": 25, "83": [22, 23], "830853": 22, "833": 23, "834249": 25, "83563483": 23, "836150": 25, "83mm": 22, "84": 24, "840851": 25, "847898": 25, "85": 24, "8501": [32, 35], "852415": 25, "855419": 24, "858690": 25, "859511": 24, "860750": 25, "865149": 25, "874247": 25, "875": 25, "877035": 22, "881930": 24, "885068": 22, "885714285713345": 24, "8888": 35, "88939657": 23, "890809": 22, "891": 27, "892826": 25, "9": [22, 23, 24, 25, 26, 27], "90": 23, "9000": 35, "9001": 35, "907485": 25, "911177": 25, "912863": 24, "914762": 25, "917": 26, "9226": 27, "928019": 27, "929142": 24, "929629": 25, "934119": 22, "935352": 27, "936950": 27, "94": 27, "940005": 24, "940040": 25, "940338": 27, "941920": 25, "943369": 25, "947320": 25, "948853": 24, "95": [22, 24, 27], "953047": 24, "958753": 25, "96": [22, 24, 27], "960368": 22, "961493": 24, "9621": 27, "963435": 24, "967093": 25, "96890848": 23, "971380": 25, "979574": 25, "982129": 27, "9846": 27, "98950874": 23, "99": 22, "996525": 25, "997587": 24, "999999999999449e": [22, 24], "9am": 0, "A": [9, 11, 21, 22, 24, 25, 26, 27, 34, 35], "AND": 0, "AS": [22, 24, 27], "And": [22, 23, 24, 25, 26], "As": [0, 22, 23, 24, 25, 27], "BY": 24, "But": [22, 24], "By": [22, 23, 24, 25, 26, 34], "For": [0, 9, 11, 22, 23, 25, 26], "IT": 9, "If": [0, 1, 11, 23, 24, 26, 32, 34, 35], "In": [0, 1, 5, 6, 9, 11, 22, 23, 24, 25, 26, 29, 32, 34, 35], "It": [0, 2, 9, 22, 23, 24, 25, 26, 27, 29, 31], "Its": 9, "NOT": [22, 24], "No": [0, 22, 26], "Not": [11, 22, 24], "ON": [22, 35], "Of": [0, 24], "On": [9, 22, 23, 24, 27], "One": [0, 2, 25, 27, 35], "Or": [23, 25, 26], "That": 24, "The": [0, 2, 5, 10, 11, 22, 23, 24, 25, 26, 27, 31, 32, 34, 35], "Then": [0, 1, 22, 24, 25, 26], "There": [0, 25], "These": [0, 6, 26, 29, 31], "To": [0, 8, 22, 23, 24, 25, 26, 27, 29, 32, 34, 37], "WILL": 22, "With": [22, 23, 25, 27, 35], "__fields__": 21, "__init__": [25, 26], "__name__": 26, "__pycache__": 26, "__token__": 1, "_add_dataset": 0, "_dpl_instanc": [22, 23], "_dpl_type": [22, 23], "_item": [22, 23], "_tupl": [22, 23], "aadd": 0, "ab": [9, 24], "abc": 16, "abl": [22, 23, 24, 25, 26, 27], "about": [0, 9, 21, 22, 24, 25, 26, 31], "abov": [0, 24], "abspath": [23, 24, 25], "abstract": 16, "accept": [11, 24], "access": [5, 8, 9, 22, 23, 24, 25, 29, 31, 33, 35], "access_key_id": [12, 21, 31], "accord": 37, "accordingli": 26, "account": [11, 22, 23, 24, 25], "accuraci": [22, 23], "acknowledg": 5, "across": [0, 35], "action": 0, "activ": [2, 32], "actual": [22, 24], "ad": [22, 24, 25, 26, 29, 31, 35], "adapt": [9, 26, 34], "add": [0, 22, 25, 27, 31, 35], "add_dataset": [26, 31], "add_dataset_to_us": [26, 31], "add_datasets_via_yaml": [26, 31], "add_us": [26, 31], "add_user_with_budget": [26, 31], "add_users_via_yaml": [26, 31], "addit": [0, 6, 9, 23, 24, 25, 26, 29, 35], "addition": 5, "address": [12, 31, 35], "adeli": [22, 23, 24, 25, 26], "adjust": 0, "admin": [0, 9, 22, 23, 25, 26, 35], "admin123": 26, "admin_databas": [12, 26, 36], "admindbtyp": [12, 36], "administr": [2, 5, 9, 12, 35, 36, 37], "adminyamldatabas": 2, "advanc": [22, 25], "advis": [9, 25], "affect": [22, 24], "after": [22, 24, 26, 27], "afterward": [22, 24, 27], "ag": 26, "again": [2, 10, 22, 23, 24, 27], "against": 12, "age_max": 27, "age_min": 27, "age_transformation_pipelin": 27, "aggreg": 6, "agre": [22, 24], "ahead": 0, "aim": [7, 9, 11, 12, 22, 23, 24, 26, 36], "aimsynthes": 25, "ak": 34, "algorithm": 25, "alic": [22, 23, 24, 25, 26], "all": [0, 6, 8, 9, 11, 22, 23, 24, 27, 31], "alloc": [9, 26], "allow": [22, 26, 27, 31, 37], "alreadi": [9, 22, 24, 26], "alreai": 26, "also": [0, 2, 6, 9, 22, 23, 24, 25, 26, 27, 29, 35], "altern": [24, 26], "alwai": [0, 11, 23, 31], "among": [22, 24, 25, 26], "an": [0, 2, 5, 11, 21, 22, 23, 24, 25, 26, 35], "analys": [6, 9, 24], "analysi": [0, 22, 24], "ani": [8, 9, 11, 22, 23, 24, 25, 26, 27], "annot": 21, "anonimizationtransform": 11, "anoth": [0, 22, 23, 24, 25, 26, 27], "antarctica": [22, 23, 24], "antartica": [22, 23, 24, 25, 26], "anti_timing_att": [12, 36], "any_queri": 8, "anywai": 24, "api": [0, 9, 12, 26, 32, 35], "app": [0, 26, 31, 36], "app_url": [8, 22, 23, 24, 25, 27], "append": [23, 24, 25], "appli": [22, 23, 27], "applic": [6, 22, 23, 24, 25, 27, 35], "approv": 0, "appvers": 0, "ar": [0, 1, 2, 5, 6, 9, 11, 22, 23, 24, 25, 26, 27, 32], "architectur": 9, "archiv": [0, 6, 9, 31], "arg": [23, 26], "argument": [11, 23, 26], "around": 24, "arrai": [22, 23], "arxiv": 9, "ask": [22, 24, 27], "aspect": 9, "assert_almost_equ": 24, "assign": [22, 24, 26], "associ": [0, 8, 9, 22, 24, 25, 26], "ast": 26, "atomdomain": 22, "attack": 12, "attent": 9, "authent": 9, "authoris": 5, "autom": [0, 1], "automat": [0, 2, 25, 35], "avail": [9, 11, 22, 23, 24, 25, 26, 29, 32, 34, 35], "avala": 0, "averag": 24, "avg": [22, 24, 27], "avg_0": 24, "avg_1": 24, "avg_2": 24, "avg_ag": 27, "avg_bill_length": [22, 24], "avg_bill_length_mm": [22, 24], "avg_bill_length_queri": 22, "avg_bill_length_respons": 24, "avoid": [11, 24], "aw": 31, "aws_access_key_id": 26, "aws_secret_access_kei": 26, "b": 0, "back": [23, 25], "base": [2, 5, 11, 12, 16, 21, 22, 23, 24, 25, 26, 27, 31], "baselmodel": 0, "basemodel": [0, 21], "basic": [12, 36], "basic_dataset_stor": [12, 36], "batch_siz": 25, "bd_bound": 25, "becaus": [22, 23, 25, 27], "beeen": 22, "been": [9, 23, 26], "befor": [0, 22, 24, 25, 26, 34], "begin": 34, "behaviour": [22, 23], "being": 8, "below": [0, 8, 9, 22, 34], "best": [22, 23, 33], "better": [22, 24], "between": [23, 24, 25], "bf": 9, "big": 22, "bigger": 24, "biggest": 23, "bill": [23, 24], "bill_depth_meta": 23, "bill_depth_mm": [22, 23, 24, 25, 26], "bill_length": 25, "bill_length_max": 22, "bill_length_meta": 23, "bill_length_min": 22, "bill_length_mm": [22, 23, 24, 25, 26], "bill_length_transformation_pipelin": 22, "bin": 25, "bind": 26, "bintransform": 25, "bird": 24, "bisco": [22, 23, 24, 25, 26], "bit": [24, 26], "bl_bound": 25, "black": 0, "blob": 12, "blocker": 23, "blog": 9, "bob": 26, "bodi": [22, 23, 24], "body_mass_g": [22, 23, 24, 25, 26], "bool": [11, 21], "boolean": [26, 27], "both": 0, "bound": [22, 23, 24, 25, 26, 27], "boundari": [11, 12], "bounds_i": 23, "bounds_x": 23, "breviti": 9, "broken": 22, "browser": 35, "bucket": [12, 21, 26, 31, 35], "budget": [0, 5, 9, 11, 23, 25, 29, 31], "budgetaccount": [22, 23], "bug": 9, "buget": [22, 24], "build": 0, "build_doc": 0, "built": 35, "button": 37, "c": [0, 23, 26, 27, 31], "cabin": [26, 27], "cach": 16, "call": [9, 22, 23, 24, 25, 26, 27], "can": [0, 2, 6, 8, 9, 11, 16, 22, 24, 25, 27, 29, 32, 33, 34, 35, 37], "cannot": [22, 23, 27], "capabl": 22, "cardin": [22, 23, 24, 25, 26, 27], "care": [0, 9, 22, 24], "carri": 26, "case": [0, 11, 22, 23, 25], "categor": [12, 23, 25, 36], "categori": [22, 23, 24, 25, 26, 27], "cd": [0, 35], "cell": [11, 22, 23], "censor_dim": [12, 21, 22, 23, 24, 25, 26], "center": 23, "certain": [11, 25, 26, 29], "certifi": 22, "ch": [0, 9, 35], "chaintransform": 25, "chang": [16, 22, 24, 34], "change_one_dist": [12, 36], "changeonedist": 12, "chapter": [34, 35], "charset": 22, "chart": [0, 9, 33], "check": [1, 5, 23, 24, 25, 26, 27], "chekck": 25, "chinstrap": [22, 23, 24, 25, 26], "chmod": 0, "choic": 31, "choos": [22, 23, 24, 25, 33, 37], "ci": 0, "ci_95_lower_bound": 24, "ci_95_upper_bound": 24, "clamp": 25, "clamptransform": 25, "class": [0, 11, 12, 16, 21, 22, 23], "classic": 9, "classif": 22, "classifi": 22, "classvar": 21, "clean": [26, 31], "cleaner": 26, "clear": 26, "cli": 29, "click": 37, "client": [0, 3, 6, 7, 26], "client_input": [22, 23, 25], "clone": 35, "close": [22, 24], "cloud": 34, "cluster": [9, 33, 34], "code": [0, 8, 9, 11, 22, 23, 25, 26], "codebas": 26, "codeql": 0, "col": [22, 23], "col_nam": [22, 27], "coldheart": 26, "collect": [21, 22, 24, 26], "collection_model": [12, 36], "cols_metadata": [22, 23], "column": [11, 12, 21, 22, 23, 24, 25, 26, 27], "column_nam": 22, "com": [0, 9, 12, 26, 35], "come": 5, "command": [0, 8, 22, 23, 24, 25, 26, 27, 29, 31, 34, 35], "commonli": 9, "commun": 34, "compar": [22, 24], "complet": [0, 26], "compon": 9, "components_": 23, "compos": [9, 26, 32, 35], "comput": [21, 23, 24, 25, 27], "computedfieldinfo": 21, "concept": 9, "condit": [6, 11, 12, 21, 22], "config": [2, 12, 26, 35, 36], "configdict": 21, "configkei": [12, 36], "configur": [0, 9, 12, 21, 26, 32, 34], "conflict": 22, "conform": 21, "connect": [9, 22, 24, 29], "consist": 0, "consol": 35, "constant": [0, 22, 26, 27, 36], "constraint": [0, 11, 12, 21, 22, 25], "construct": 10, "constructor": 11, "contact": 5, "contain": [0, 11, 26, 34, 35], "content": [7, 36], "continu": [9, 12, 25, 36], "contribut": 0, "convert": 11, "copi": 23, "correct": 9, "correspond": 21, "cost": [0, 11, 21, 25], "cost_r": [22, 23, 27], "could": [22, 23, 24, 25, 26], "count": [24, 27], "cours": [22, 24, 27], "cover": 29, "creat": [0, 6, 22, 23, 24, 27, 31, 32, 35], "creation": 26, "credenti": 9, "credentials_nam": [12, 21], "credit": [22, 23, 24, 25], "critic": 24, "critical_valu": 24, "cryptograph": [11, 25], "csv": 26, "ctrl": 26, "cube": [12, 36], "curios": 22, "current": [9, 11, 26], "custom": [0, 5, 11, 34, 37], "d": [26, 31], "d_path": [26, 31], "dai": 26, "daisi": 26, "dashboard": 29, "data": [6, 11, 12, 23, 25, 26, 27, 29, 31, 35], "data_connector": [0, 12, 26, 36], "data_connector_factori": 0, "data_connector_observ": [12, 36], "data_norm": 23, "databas": [2, 5, 9, 12, 22, 23, 24, 25, 27, 29, 31, 35], "database_typ": [12, 21, 26, 31], "dataconnector": [0, 16], "dataconnectorobserv": [12, 16], "datafram": [0, 5, 11, 22, 23, 24, 25, 27], "datalab": 37, "dataset": [5, 6, 8, 9, 11, 12, 16, 21, 35], "dataset_collect": 26, "dataset_nam": [8, 11, 12, 21, 22, 23, 24, 25, 26, 27, 31], "dataset_path": [12, 21, 26, 31], "dataset_stor": [0, 12, 26, 36], "dataset_store_factori": 0, "dataset_store_typ": [12, 36], "datasetofpathdb": [12, 21], "datasetofs3db": [12, 21], "datasetofus": [12, 21], "datasets_list": [12, 21, 26], "datasetscollect": [12, 21], "datasetstor": [0, 16], "datasetstoretyp": [0, 12, 36], "date": [0, 1], "datetim": [12, 36], "dateutil": 22, "db": [12, 26, 31, 36], "db_a": 31, "db_n": 31, "db_name": 31, "db_p": 31, "db_pwd": 31, "db_type": [12, 36], "db_type_mongodb": [12, 36], "db_u": 31, "de": 28, "decid": [22, 23, 24, 25, 26], "decim": 24, "decisiontreeclassifi": 23, "decod": [25, 26], "decreas": [5, 25], "deduc": 22, "def": [22, 23, 24, 26], "default": [0, 6, 11, 21, 22, 23, 24, 26, 31, 32, 34, 35], "defaultdb": 31, "defin": [21, 22, 23, 24], "del": 31, "del_dataset": [26, 31], "del_dataset_to_us": [26, 31], "del_us": [26, 31], "delet": [1, 26, 31], "delta": [11, 12, 21, 22, 23, 24, 25, 26, 27, 31], "delta_cost": [22, 23, 24, 25, 27], "demand": 37, "demo": 6, "demo_client_notebook_newlibrari": 0, "demonstr": [6, 26, 29], "dep": 0, "depend": [0, 32, 35, 37], "deploi": [0, 5, 9, 32, 33], "deploy": [0, 9, 32, 35, 37], "depth": [22, 23, 24, 25], "describ": [5, 11], "deseri": [9, 11], "deserialis": [0, 11], "detail": [0, 22, 24, 25, 26, 31], "determin": 23, "develop": [0, 9, 22, 23, 24, 25, 26, 27, 35, 37], "develop_mod": [12, 36], "deviat": 24, "df": [11, 22, 24, 27], "df_dummi": [22, 24, 27], "df_flipper": 24, "dict": [0, 11, 21], "dictionari": [11, 21, 22, 24, 25, 26], "dictionnari": [11, 25], "did": [22, 23, 24, 25], "differ": [0, 2, 6, 9, 11, 22, 23, 24, 25, 26, 27], "differenti": [5, 6, 9, 22, 23, 24, 27], "diffprivlib": [0, 6, 7, 11, 12, 17, 21, 36], "diffprivlib_json": [12, 21, 22, 23], "diffprivlib_logg": 0, "diffprivlib_queri": [7, 11, 22, 23], "diffprivlibcompatibilitywarn": [11, 23], "diffprivlibmodel": [12, 21], "diffprivlip": 11, "dimens": [22, 23, 24], "dimensinn": 23, "direct": 9, "directli": [0, 25, 31, 32], "directori": [2, 34, 35], "disabl": 25, "disabled_dp": 11, "disclaim": 9, "disclosur": [6, 22, 25], "discov": [2, 24, 33], "discrimin": 21, "discriminator_decai": 25, "discriminator_dim": 25, "discriminator_lr": 25, "displai": 22, "dispos": [22, 24], "dist": 1, "distribut": 24, "diverg": 12, "divers": 9, "do": [0, 2, 5, 8, 22, 23, 24, 25, 31], "doc": [0, 11, 12], "docker": [0, 29, 31, 33, 35], "dockercli": 26, "dockerfil": 35, "document": [0, 1, 9, 11, 22, 23, 25, 33], "doe": [5, 11, 22, 23, 24, 25], "don": [22, 34], "done": [22, 23, 24, 25, 26], "down": 26, "download": 9, "dp": [6, 11, 12, 27], "dp_ctgan": [7, 11, 12, 36], "dp_gan": [7, 11, 12, 36], "dp_librairi": [22, 23, 25], "dp_librari": [0, 12, 17, 36], "dp_logic": [12, 36], "dp_queri": [0, 12, 26, 36], "dp_querier": [0, 12, 36], "dpctgan": [6, 11, 12], "dpgan": [6, 11, 12], "dpl_pipelin": [22, 23], "dplibrari": [0, 7, 11, 12, 36], "dpquerier": 0, "dpserial": 24, "dr": [22, 23, 24, 25, 26], "dream": [22, 23, 24, 25, 26], "drop": [11, 22, 23, 31], "drop_collect": [26, 31], "ds_store_typ": 12, "dscc": [0, 9, 35], "dtc": 23, "due": [5, 11, 24], "dummi": [0, 6, 11, 21], "dummmi": 25, "dummy_dataset": [12, 36], "dummy_nb_row": [11, 12, 21], "dummy_new_library_queri": 0, "dummy_r": [22, 24, 27], "dummy_respons": [22, 23], "dummy_se": [11, 12, 21], "dummy_synth_df": 22, "dummy_var_r": [22, 27], "dummydiffprivlibmodel": [12, 21], "dummynewlibrarymodel": 0, "dummyopendpmodel": [12, 21], "dummysmartnoisesqlmodel": [12, 21], "dummysmartnoisesynthquerymodel": [12, 21], "dure": [0, 2, 11], "e": [9, 11, 22, 31], "each": [9, 22, 23, 24, 25, 26, 27], "easili": 37, "eco_branch": 26, "edit": 34, "educ": 26, "effect": 22, "effici": [9, 31], "either": 24, "ek": 34, "embark": [26, 27], "embedding_dim": 25, "empti": 26, "en": [9, 12], "enabl": [9, 22, 23, 24, 25, 27], "encount": [11, 23, 27], "end": 11, "endpoint": [0, 22, 23, 24, 25, 27, 31, 35], "endpoint_url": [12, 21, 26, 31], "engin": 26, "enhanc": 9, "enough": [5, 11, 22, 24], "ensembl": 6, "ensur": [0, 9, 11, 22, 23, 24, 26, 32, 35], "entir": 0, "enum": 11, "environ": [0, 2, 9, 22, 23, 24, 25, 27, 31, 35], "epsilon": [11, 12, 21, 22, 23, 24, 25, 26, 27, 31], "epsilon_cost": [22, 23, 24, 25, 27], "equal": [22, 24, 27], "err_msg": 24, "error": [0, 11, 22, 23, 24, 25, 26, 27], "error_handl": [12, 36], "error_messag": [7, 11], "escal": 5, "especi": 34, "establish": 31, "estim": [0, 11, 25], "estimate_cost": 24, "estimate_diffprivlib_cost": [7, 11, 22, 23], "estimate_new_library_cost": 0, "estimate_opendp_cost": [7, 11, 22, 27], "estimate_smartnoise_cost": 22, "estimate_smartnoise_sql_cost": [7, 11, 22, 24, 27], "estimate_smartnoise_synth_cost": [7, 11, 22, 25], "etc": [0, 2, 9, 29], "even": [22, 24], "event": [0, 2], "everi": [0, 22, 24, 26], "everyth": [22, 26], "exact": 24, "exactli": 22, "exampl": [0, 5, 9, 21, 23, 24, 26, 29, 35], "example_config": 26, "example_dummy_new_librari": 0, "example_new_librari": 0, "example_queri": 21, "except": [2, 11, 22, 23], "exec_run": 26, "execresult": 26, "execut": [0, 2, 9, 11, 25, 26, 27, 32], "exisit": 26, "exist": [1, 5, 26, 31], "exit": 26, "expect": [0, 22, 23, 24, 26, 27], "experi": 25, "explain": [0, 22, 23, 24, 25, 26, 29], "explained_variance_": 23, "explained_variance_ratio_": 23, "explan": [0, 25], "explor": [24, 33], "extens": 9, "extern": [5, 9], "externallibraryexcept": [23, 25], "f": [22, 23, 24, 27, 31, 34], "f64": 22, "face": 9, "facilit": [9, 29], "factori": [0, 12, 17, 36], "fail": [0, 5, 22, 27], "failur": 5, "fall": 23, "fals": [11, 21, 22, 23, 24, 25, 26, 27, 31], "familiar": 29, "far": 9, "fare": [26, 27], "fastapi": [0, 9], "featur": [0, 6, 11, 22, 23], "feature_column": [11, 12, 21, 22, 23], "feder": 9, "feedback": 9, "femal": [22, 23, 24, 25, 26, 27], "fetch": 26, "few": [22, 23, 24, 25, 26, 27, 35], "field": [11, 21, 22, 24, 26, 31], "fieldinfo": 21, "file": [0, 9, 12, 31, 34, 35], "filenam": 22, "fill": 23, "final": [22, 23, 24, 25], "find": [6, 24, 37], "fine": [24, 37], "finish": [0, 26], "first": [0, 22, 23, 24, 25, 26, 27, 35], "fit": [23, 25, 33, 34], "fit_intercept": 23, "fix": [0, 5], "fixed_delta": [11, 12, 21, 22], "fixed_smoothed_max_diverg": [12, 36], "flag": [22, 24, 25], "flake8": 0, "flipper": [22, 23], "flipper_length_mm": [22, 23, 24, 25, 26], "flipper_length_respons": 24, "float": [11, 21, 22, 23, 24, 25, 26, 27], "fly": 22, "folder": 0, "follow": [0, 1, 8, 9, 22, 26, 34, 35, 37], "folow": 37, "fonction": [22, 24], "forc": 11, "forest": 22, "forget": [0, 22], "format": [0, 11, 21, 22, 24, 25, 26], "found": [26, 29], "fr": 26, "franc": 37, "frequent": [11, 23], "from": [0, 2, 5, 8, 9, 11, 21, 22, 23, 24, 25, 26, 27, 31], "frostina": 26, "fso": [8, 26], "fso_dpseri": 24, "fso_income_synthet": 26, "fso_income_synthetic_metadata": 26, "full": 23, "func": 26, "function": [0, 8, 9, 11, 22, 23, 24, 25, 26, 27, 31], "function_map": 26, "functionn": [0, 6, 23, 25], "further": [0, 11], "futur": 9, "g": [9, 11, 27], "gan": [6, 11, 12, 36], "gaussiannb": 23, "gave": [22, 24], "gener": [0, 2, 11, 22, 25], "generator_decai": 25, "generator_dim": 25, "generator_lr": 25, "gentoo": [22, 23, 24, 25, 26], "get": [1, 11, 21, 26, 31, 34, 35], "get_arch": [26, 31], "get_bound": [22, 23], "get_collect": [26, 31], "get_dataset": [26, 31], "get_dataset_metadata": [7, 11, 22, 23, 24, 25, 27], "get_dummy_dataset": [7, 11, 22, 24, 27], "get_initial_budget": [7, 11, 22, 24, 27], "get_metadata": [26, 31], "get_pandas_df": 0, "get_previous_queri": [7, 11, 22, 23, 25], "get_queri": 0, "get_remaining_budget": [7, 11, 22, 24, 27], "get_total_spent_budget": [7, 11, 22, 24, 27], "get_us": [26, 31], "get_user_dataset": [26, 31], "getdbdata": [12, 21], "getdummydataset": [12, 21], "git": 35, "github": [1, 2, 6, 9, 12, 22, 23, 29, 35], "githubusercont": 26, "give": [0, 22, 23, 24, 25, 26, 27], "given": [0, 9, 22, 23, 24, 25, 26, 31], "gke": 34, "go": [24, 25, 26, 35], "goe": 24, "good": [22, 24], "got": 1, "gramm": 22, "grounbdbreak": [22, 23, 24], "group": 24, "gt": [21, 22, 25, 26], "guess": [22, 23, 24], "guid": [8, 34], "guidanc": 33, "h": [26, 27], "h_0": 24, "h_a": 24, "ha": [9, 11, 22, 23, 24, 25, 26], "hackathon": 9, "had": [22, 24, 26], "hamming_dist": [12, 36], "hammingdist": 12, "handl": [0, 9, 11, 12], "handler": 0, "happen": [5, 22], "harsh": 22, "hasn": 23, "have": [0, 2, 5, 8, 22, 23, 24, 26, 27, 34, 35], "haven": 34, "he": 26, "head": [0, 22, 24, 25, 27], "heard": 26, "helm": [0, 9, 33], "help": [5, 6, 26], "henc": [22, 24, 25], "her": [22, 23, 24, 25, 26, 27], "here": [0, 6, 9, 11, 22, 23, 24, 25, 32, 34], "hesit": 26, "hi": 26, "high": [22, 24, 27], "him": 26, "hold": 26, "home": 9, "how": [0, 6, 9, 22, 23, 24, 25, 26, 29, 31, 33, 35], "howev": [9, 22, 24], "html": [9, 11, 12, 22, 23], "http": [0, 9, 11, 12, 22, 23, 24, 25, 26, 27, 35], "hypothes": 24, "i": [0, 1, 2, 5, 8, 9, 10, 11, 22, 23, 24, 25, 26, 27, 31, 32, 34, 35, 37], "icebergina": 24, "icerbegina": [22, 24], "icergina": [22, 23, 24, 25], "id": 31, "idea": [22, 24], "idna": 22, "ignor": [0, 23], "iloc": [22, 24, 27], "imag": [0, 22, 35], "image_demo_cli": 22, "impact": [22, 24, 27], "implement": [9, 16], "import": [8, 22, 23, 24, 25, 26, 27], "improv": 9, "imput": [11, 23], "imputer_strategi": [11, 12, 21, 22, 23], "in_memory_connector": [12, 36], "includ": [9, 11], "incom": [9, 26], "income_synthetic_data": 26, "incompat": 23, "inde": 26, "index": [9, 11, 22], "index_nam": 22, "infer": 11, "info": 26, "inform": [0, 2, 9, 21, 22, 23, 24, 25, 26, 27, 31], "infrastructur": [9, 33], "inherit": 0, "ini": 0, "init": [22, 24, 27], "initi": [8, 11, 24, 26, 27, 31, 37], "initial_delta": [12, 21, 22, 24, 26, 27, 31], "initial_epsilon": [12, 21, 22, 24, 26, 27, 31], "initialis": [6, 8], "inptu": 22, "input": [0, 9, 12, 21], "input_domain": 22, "input_metr": 22, "inse": 37, "insert_delete_dist": [12, 36], "insertdeletedist": 12, "insid": [0, 26, 35], "instal": [0, 2, 6, 9, 26, 33, 35], "instanc": [5, 16, 25, 35], "instanti": [22, 27], "instead": [22, 24, 31], "instruct": [8, 22, 31, 33, 34, 35], "int": [11, 21, 26, 27], "int_dist": [12, 36], "integr": [2, 9], "intend": [11, 24], "intent": 26, "interact": [9, 22, 23, 24, 25, 26, 27, 31, 32, 35], "interest": [24, 26], "intern": 5, "intervent": 0, "introduct": 33, "invalid": [5, 27], "invalidqueryexcept": [22, 27], "investig": 26, "io": 22, "ipykernel_1062": 27, "ipynb": 0, "ipython": 22, "iri": 26, "iris_metadata": 26, "irrelev": 24, "island": [22, 23, 24, 25, 26], "issu": [0, 5, 9, 23], "item": 0, "its": [8, 9, 11, 25, 26, 35], "jack": [26, 27], "jax": 25, "jaxlib": 25, "jitter": [12, 36], "joblib": 22, "join": [23, 24, 25], "journ\u00e9": 28, "jupyt": [22, 23, 26, 35], "just": [22, 23, 24, 25, 26, 27], "keep": [6, 22, 26], "kei": [12, 21, 22, 26, 27, 31], "kept": [22, 23, 25], "keyword": 11, "kind": 34, "kmean": 23, "kmeanskmean": 23, "know": [22, 24, 25, 27], "kubectl": 34, "kubernet": [9, 29, 33], "l": [26, 27], "l2": 23, "lab": [9, 26], "label": 22, "labeltransform": 25, "lambda": [11, 26], "lancer": 37, "laplacian": [22, 27], "larg": 24, "last": [25, 26, 35], "last_queri": 25, "later": [10, 26], "latest": 0, "layer": 9, "le": 21, "leak": 23, "leakag": 23, "learn": [24, 33], "len": [22, 26], "length": 23, "less": 24, "let": [0, 24, 25, 26], "level": 24, "lib": [22, 23, 25], "librair": 22, "librairi": [11, 22], "librari": [5, 6, 8, 9, 11, 12, 26], "like": [22, 23, 24, 25, 34], "limit": [22, 23, 24, 25], "linalg": 23, "line": [26, 31, 34], "linearregress": 23, "link": [0, 9, 37], "linter": 0, "linux": 2, "list": [0, 11, 21, 22, 25, 26, 31], "list_synthes": 25, "liter": 21, "literal_ev": 26, "littl": 24, "load": [22, 23], "local": [0, 2, 9, 21, 22, 23, 24, 25, 27, 29, 33, 34], "localhost": [32, 35], "locat": [35, 37], "logger": [12, 22, 36], "logic": [9, 23], "logist": 6, "logisticregress": 23, "loma": [0, 1, 2, 6, 8, 11, 27, 31, 33, 34, 35], "lomas_cli": [0, 3, 4, 8, 9, 22, 23, 24, 25, 27], "lomas_client_dev": 26, "lomas_serv": [0, 2, 3, 11, 22, 23, 24, 25, 27, 30], "lomas_server_dev": 26, "lomas_streamlit_dev": 26, "long": 8, "look": [22, 24, 26], "lord": 26, "loss": 23, "lot": 24, "lower": [22, 23, 24, 25, 26, 27], "lower_bound": [22, 24, 27], "lr": 23, "lru": [12, 36], "lru_cach": 12, "lru_dataset_stor": [12, 36], "lru_dataset_store_max_s": [12, 36], "lrudatasetstor": 16, "lt": [21, 22, 25, 26], "m": 2, "m_db": [26, 31], "m_s3_ak": 31, "m_s3_sak": 31, "m_s3_url": 31, "m_s3b": 31, "m_s3k": 31, "machin": [33, 34, 35], "madam": 26, "made": [0, 22, 23, 24, 25], "mai": [5, 11, 26, 31, 37], "main": [0, 9, 12], "maintain": 35, "make": [0, 2, 21, 22, 23, 24, 26, 27, 29, 34, 35], "make_dummi": [12, 21], "make_gaussian": 11, "make_select_column": [22, 27], "make_split_datafram": [22, 27], "make_zcdp_to_approxdp": 11, "male": [22, 23, 24, 25, 26, 27], "malici": 26, "manag": [9, 22, 23, 25, 26, 29, 31], "mani": 9, "manual": 0, "map": 21, "margin": [11, 12], "mass": [22, 23, 24], "master": [0, 9, 26], "match": 11, "max": 23, "max_depth": [22, 23], "max_diverg": [12, 36], "max_id": [12, 21, 22, 23, 24, 25, 26, 27], "max_it": 23, "max_memory_usag": 12, "max_model_s": 25, "max_retries_exp_mechan": 25, "maxdiverg": 22, "maximum": 24, "may_queri": [12, 21, 26], "mbi": 25, "mcfreez": 26, "md": [1, 9], "mea": [22, 27], "mean": [11, 22, 24], "mean_": 23, "measur": [5, 11, 12, 22, 27], "measure_onli": 25, "mechan": [5, 11, 12, 21, 22], "medata": 26, "median": [11, 23], "memori": [0, 12, 16], "merg": 0, "messag": [5, 11, 23, 25, 26], "meta": 26, "metadata": [6, 9, 11, 12, 21, 26, 31, 35], "metadata_access_key_id": 31, "metadata_bucket": 31, "metadata_database_typ": 31, "metadata_endpoint_url": 31, "metadata_kei": 31, "metadata_path": [12, 21, 26, 31], "metadata_secret_access_kei": 31, "metadataofdataset": [12, 21], "metadataofpathdb": [12, 21], "metadataofs3db": [12, 21], "metatada": 31, "method": [0, 12, 16, 23, 26, 32, 33], "metric": [12, 22], "micro": 9, "might": [22, 24, 26, 27], "mind": 26, "minikub": 34, "minio": [26, 35], "miss": [11, 23, 25], "mistak": 22, "mixtureinfer": 25, "ml": 23, "mm": [22, 24], "mod": 12, "mode": [26, 35], "model": [6, 9, 11, 12, 21, 25], "model_computed_field": [12, 21], "model_config": [12, 21], "model_field": [12, 21], "model_input_to_lib": 0, "model_scor": 22, "modifi": [22, 23, 25, 26, 33], "modul": [7, 9, 22, 23, 26, 36], "mondai": 0, "mongo": 26, "mongodata": [26, 35], "mongodb": [2, 5, 9, 12, 29, 35, 36], "mongodb_addr": [12, 36], "mongodb_admin": [2, 26, 36], "mongodb_admin_cli": [26, 31, 36], "mongodb_databas": [12, 36], "mongodb_port": [12, 36], "more": [0, 2, 22, 23, 24, 25, 26], "most": [11, 23, 26], "most_frequ": [11, 23], "mount": 26, "move": 35, "mp": [26, 31], "mr": 26, "mst": [7, 11, 12, 36], "much": [22, 23, 24], "multi": 22, "multipl": [22, 23, 24, 26, 29], "must": [0, 11, 22, 23, 24, 25, 26, 27, 31, 35], "mwaskom": 26, "mwem": [7, 11, 12, 36], "my_own_constraint": 25, "mypi": 0, "n": [22, 23], "n_cluster": 23, "n_compon": 23, "n_components_": 23, "n_estim": [22, 23], "n_job": [22, 23], "name": [0, 8, 9, 11, 12, 21, 22, 23, 24, 25, 26, 27, 31], "name_of_dataset_you_want_to_queri": 8, "nan": [24, 27], "navig": [34, 35], "nb_0": 24, "nb_1": 24, "nb_2": 24, "nb_passeng": 27, "nb_penguin": [22, 24], "nb_row": [11, 22, 23, 24, 27], "nb_sampl": [11, 12, 21, 22, 25], "nbsp": [22, 23], "nbviewer": [22, 23], "necessari": [0, 9], "need": [0, 1, 22, 23, 24, 25, 26, 27, 33, 34, 35, 37], "needi": 25, "network": 35, "never": [0, 5, 9, 22, 23, 24, 25], "new": [0, 22, 26], "new_data_connector": 0, "new_dataset_stor": 0, "new_librari": 0, "new_library_queri": 0, "newdataconnector": 0, "newdatasetstor": 0, "newlibrari": 0, "newlibrarycostmodel": 0, "newlibrarymodel": 0, "newlibraryqueri": 0, "nobodi": [22, 24], "nois": [22, 24, 25, 27], "noise_variance_": 23, "noisi": 24, "none": [11, 12, 16, 21, 22, 23, 25], "nonetyp": 21, "norm": 23, "normal": 22, "note": [11, 25, 26, 31], "notebook": [0, 6, 22, 23, 24, 25, 26, 29, 35], "noth": 26, "notic": 22, "notifi": 16, "now": [8, 22, 24, 25, 27, 31, 35], "np": [22, 23, 24, 25, 27], "nso": 9, "null": [11, 22, 23, 24], "nullabl": [11, 12, 21, 22, 25], "number": [0, 11, 22, 24, 25, 35], "numpi": [22, 23, 24, 25, 27], "o": [23, 24, 25, 27, 31], "object": [0, 11, 16, 21, 22, 23, 24, 25, 26, 27], "oblivi": 9, "obtain": [22, 24], "occur": 5, "od": [26, 31], "off": 0, "offer": [22, 23, 24, 25, 26], "offic": 9, "offici": 34, "ofs_dpseri": 24, "ok": 25, "old": 27, "om": [26, 31], "onc": [0, 22, 23, 24, 25, 26, 27, 34, 35, 37], "one": [0, 1, 8, 22, 23, 24, 25, 26, 27, 34], "ones": 26, "onli": [0, 9, 11, 22, 23, 24, 25, 26, 27, 32, 35], "onyxia": [29, 33], "open": [8, 9, 35], "opendp": [0, 5, 6, 7, 9, 11, 12, 17, 21, 24, 36], "opendp_json": [12, 21, 22], "opendp_logg": 0, "opendp_pipelin": [11, 22, 27], "opendp_queri": [7, 11, 22, 27], "opendpdatasetinputmetr": [12, 36], "opendpmeasur": [12, 36], "opendpmodel": [12, 21], "oper": [5, 26], "opportun": 24, "option": [0, 11, 22, 24, 25, 31, 33, 37], "optionn": 27, "optionnali": 22, "order": [0, 22, 24, 26], "org": [9, 11, 12, 22, 23], "origin": 9, "other": [6, 9, 16, 22, 24, 25, 26], "otherwis": [0, 11, 26], "our": [6, 9, 26, 28, 29], "out": [22, 26], "output": [24, 26], "output_measur": 22, "overal": 9, "overview": [0, 29], "overwrit": [26, 31], "overwrite_dataset": [26, 31], "overwrite_metadata": [26, 31], "own": [0, 9, 25, 26], "owner": [9, 26, 29, 31], "p": [1, 26, 27], "pac_synth": [7, 11, 12, 36], "packag": [0, 4, 7, 22, 23, 25, 30, 36], "pacsynth": [11, 12, 25], "page": [0, 9, 10, 22, 23, 24, 25, 26], "panda": [11, 22, 23], "panic": 11, "paper": 9, "param": [22, 23], "paramat": 25, "paramet": [0, 5, 6, 8, 11, 22, 23, 24, 26, 27, 31, 37], "parch": [26, 27], "part": [0, 9], "particip": [22, 24], "particularli": [22, 27], "pass": [0, 11, 26], "passeng": 27, "passengerid": [26, 27], "password": 31, "pate_ctgan": [7, 11, 12, 36], "pate_gan": [7, 11, 12, 36], "patectgan": [6, 11, 12], "pategan": [6, 11, 12], "path": [12, 21, 23, 24, 25, 26, 31, 36], "path_connector": [12, 36], "path_db": [12, 21, 26, 31], "patient": 35, "pca_model": 23, "pcaifittedpca": 23, "pclass": [26, 27], "pd": [11, 22, 23], "penguin": [6, 22, 23, 25, 26], "penguin_metadata": [22, 23, 25, 26], "perform": [0, 23, 24, 26, 31], "permiss": [9, 22], "persist": [26, 35], "pet": 9, "petal_length": 26, "petal_width": 26, "pip": [0, 8, 22, 23, 24, 25, 26, 27], "pipelin": [0, 5, 11, 25, 27], "pipelineifittedpipelin": [22, 23], "place": [0, 26], "platform": [9, 22, 23, 29, 37], "pleas": [0, 2, 9, 10, 11, 22, 23, 25, 35], "png": 22, "point": 9, "port": [12, 26, 31], "possibl": [0, 2, 12, 22, 23, 24, 25, 27, 31], "post": 24, "post0": 22, "postprocess": [11, 12, 21, 24], "potenti": [9, 24, 25], "power": [22, 24], "pr": 0, "practic": [6, 22], "pre": 12, "predefin": 0, "predict": [11, 22, 23], "prefer": 24, "prepar": [0, 9, 23, 24, 25, 31], "prerequisit": 33, "present": [8, 22, 24, 28], "previou": [0, 11, 22, 26, 27, 31], "previous": [22, 23, 24, 25], "previous_queri": [22, 23, 25], "primari": 9, "print": [22, 24, 26, 27, 31], "prior": 23, "prioriti": 9, "privaci": [0, 5, 9, 11, 23, 24], "privacyleakwarn": [11, 23], "privat": [6, 9, 11, 12, 23, 24], "private_id": [12, 36], "privatedatabasetyp": [12, 21, 36], "problem": [22, 24], "proce": 34, "process": [0, 1, 9, 12, 22, 23, 24, 25, 27, 34, 35, 37], "profess": 26, "project": [0, 9, 22, 23, 24, 25, 37], "promis": [22, 24], "proof": 9, "properli": [22, 24], "proport": 11, "protect": [9, 23], "provid": [8, 9, 11, 22, 23, 24, 25, 26, 27, 29, 31, 33, 34, 35], "pseudo": 25, "public": [22, 23, 24, 25], "publish": 0, "pull": [0, 2, 35], "purpos": 26, "push": [0, 2], "py": [0, 1, 23, 25, 26, 27, 31], "pydant": [0, 21], "pylint": 0, "pylintrc": 0, "pymongo": 5, "pypa": 22, "pypi": 9, "pypi_token": 1, "pyproject": 0, "python": [1, 2, 8, 12, 22, 26, 31], "python3": [22, 23, 25], "pytorch": 25, "pytz": 22, "q": [26, 27], "quail": 11, "qualiti": 0, "qualnam": [11, 12], "queen": [22, 23, 24, 25], "queri": [0, 5, 6, 9, 11, 12, 21, 31], "querier": 0, "querier_factori": 0, "queries_arch": 31, "query_1": 23, "query_2": 23, "query_3": 23, "query_exampl": [0, 12, 36], "query_model": [0, 12, 36], "query_respons": [22, 23, 24, 25, 27], "query_str": [12, 21, 22], "quit": 0, "r": 12, "rais": [11, 23, 26], "random": [11, 22, 24, 25], "random_st": [11, 22, 23], "randomforestclassifi": [22, 23], "randomforestclassifierrandomforestclassifi": 22, "randomli": 22, "randomst": 11, "rang": 22, "raw": 26, "re": [8, 11, 22, 23, 24, 25, 26], "readi": [22, 23, 24, 25, 26], "readili": 0, "readm": [1, 9], "real": [0, 23, 25], "realli": [22, 24], "reasearch": 9, "reason": [5, 22, 23], "rebas": 0, "receiv": 25, "recent": 26, "recommend": [22, 24], "reduc": [23, 24], "refer": [0, 2, 9, 11], "reg_bill_length_queri": 22, "regard": 9, "region": 26, "regist": [22, 23, 24, 25, 27], "regress": 6, "reject": 24, "relat": 9, "releas": 22, "relev": [5, 11, 22], "reli": [0, 35], "reliabl": 25, "remain": [0, 9, 11, 24, 27], "remaining_delta": [22, 24, 27], "remaining_epsilon": [22, 24, 27], "remot": [9, 22, 23, 24, 25], "remov": 23, "render": [22, 23], "replac": [11, 21, 23, 26], "repo": 0, "report": 9, "repositori": [6, 9, 29, 35], "repres": [11, 22, 24, 25], "represent": [22, 23], "reproduc": [22, 24], "request": [0, 2, 5, 9, 11, 22, 23, 24, 25, 27], "requested_bi": [22, 23, 25], "requir": [0, 2, 8, 9, 21, 22, 25, 26, 31, 33, 34, 37], "rerun": [22, 23], "res_cost": [22, 25], "res_dummi": [22, 25], "res_loc": 24, "res_serv": 24, "res_server_dummi": 24, "research": [22, 23, 24, 25, 26, 27], "resolv": 23, "respect": [22, 25], "respons": [5, 9, 11, 22, 23, 24, 25, 26, 27], "rest": [9, 22, 24, 26], "restart": 35, "result": [0, 11, 22, 23, 24, 25, 26, 27], "result_local_dummi": 24, "retriev": [11, 26], "return": [0, 11, 22, 23, 24, 25, 26, 27], "return_model": [11, 12, 21, 22, 25], "reveal": 26, "rf": [22, 23], "right": 5, "risk": 24, "rng": 25, "root": [22, 23, 24, 25, 27], "round": [22, 24, 27], "rout": [0, 12, 36], "routes_admin": [12, 36], "routes_dp": [0, 12, 36], "row": [11, 22, 23, 24, 25], "row_privaci": [12, 21, 22, 23, 24, 25, 26, 27], "run": [0, 1, 2, 8, 22, 24, 25, 26, 32, 34, 35], "run_basic_test": 2, "run_command": 26, "run_lint": 0, "run_tests_and_converag": 2, "runtim": 37, "runtime_arg": [12, 36], "runtimewarn": 27, "rust": [11, 12], "s3": [6, 9, 12, 21, 31, 36], "s3_ak": 31, "s3_connector": [12, 36], "s3_db": [12, 21, 26, 31], "s3_sak": 31, "s3_url": 31, "s3b": 31, "s3k": 31, "safeguard": [22, 24, 27], "sai": 0, "same": [22, 23, 24, 25, 26, 35], "sampl": [11, 24, 25], "sample_r": 25, "satisfi": [22, 37], "save": 34, "scale": [22, 23, 27], "scaler": 23, "scenario": 6, "schema": 26, "scienc": 9, "scientist": 9, "scikit": 22, "scipi": 22, "scope": 26, "score": [22, 23], "script": [0, 2, 26], "sdist": 1, "seaborn": 26, "seamless": [9, 22, 23, 24, 25, 27], "seamlessli": 0, "search": 9, "second": 26, "secret": 31, "secret_access_kei": [12, 21, 31], "section": [0, 6, 9, 29, 31], "secur": [0, 6, 9, 11, 22, 23, 25, 26, 27], "see": [0, 6, 9, 11, 12, 24, 26, 28], "seed": [11, 22, 23, 24, 27], "seem": [23, 24], "seen": [22, 23, 24, 25, 27], "select": [11, 22, 24, 25, 27, 37], "select_col": [11, 12, 21, 22, 25], "semver": 0, "send": [0, 11, 22, 23, 24, 25, 27], "sens": 23, "sensit": [9, 11, 24], "sent": [9, 22], "sepal_length": 26, "sepal_width": 26, "separ": [22, 27], "serial": 9, "serialis": [0, 11], "serv": 9, "server": [0, 3, 5, 11, 12, 22, 23, 24, 25, 27, 31, 32, 33, 34, 35, 36, 37], "server_contain": 26, "servic": [9, 26, 33, 35, 37], "session": 26, "set": [0, 8, 11, 12, 22, 23, 24, 25, 26, 31, 32, 34, 35, 36, 37], "set_budget_field": [26, 31], "set_may_queri": [26, 31], "setosa": 26, "setup": [0, 1, 8, 32], "setuptool": 22, "sever": [0, 34], "sex": [22, 23, 24, 25, 26, 27], "sh": [0, 2], "sha": 0, "shape": [22, 24, 27], "share": 9, "she": [22, 24, 25], "short": [0, 9], "should": [0, 5, 21, 22, 23, 24, 26, 27, 35], "show": [22, 23, 26, 31, 34], "showcas": [22, 23, 24, 25, 26], "shown": 31, "shuffl": [22, 23, 25], "sibsp": [26, 27], "side": [6, 9], "signific": 24, "similar": [22, 24], "simpl": 2, "simpli": [0, 32], "simplifi": [32, 34], "sinc": 35, "singl": [22, 24], "singular_values_": 23, "site": [22, 23, 25], "six": 22, "size": [22, 27], "sklearn": [11, 22, 23], "slightli": [22, 24, 27], "small": [22, 24, 27], "smallest": 23, "smarnois": 21, "smarntois": 25, "smartnois": [0, 5, 6, 11, 12, 24, 26], "smartnoise_queri": 22, "smartnoise_sql": [7, 11, 12, 17, 22, 36], "smartnoise_sql_queri": [7, 11, 22, 24, 27], "smartnoise_synth": [0, 7, 11, 12, 17, 22, 25, 36], "smartnoise_synth_logg": 0, "smartnoise_synth_queri": [7, 11, 22, 25], "smartnoisesql": [9, 22, 24, 25, 26, 27], "smartnoisesqlcostmodel": [12, 21], "smartnoisesqlmodel": [12, 21], "smartnoisesynth": 12, "smartnoisesynthcostmodel": [12, 21], "smartnoisesynthquerymodel": [12, 21], "smoothed_max_diverg": [12, 36], "smoothedmaxdiverg": 11, "snsynth": 25, "snsynth_default_symples_nb": 11, "so": [2, 9, 16, 22, 23, 24, 25, 26, 35], "solut": [22, 24], "some": [0, 6, 11, 22, 23, 24, 25, 29, 35], "sourc": [11, 12, 16, 21], "space": 26, "speci": [22, 23, 24, 25, 26], "special": 25, "specif": [0, 5, 9, 22, 24, 25, 26, 34, 37], "specifi": [11, 23, 24, 25, 26, 31], "specifii": 25, "spend": [22, 24], "spent": [11, 22, 24, 27], "spent_budget": [22, 23], "spent_delta": [22, 23, 25], "spent_epsilon": [22, 23, 25], "split": [9, 11, 23, 26], "spread": 23, "sql": [5, 11, 21, 25], "sqrt": [22, 23, 24, 27], "src": 12, "sspcloud": 26, "ssynthcolumntyp": [12, 36], "ssynthgansynthes": [7, 11, 12, 21, 36], "ssynthmarginalsynthes": [7, 11, 12, 21, 36], "ssynthtabletransstyl": [12, 36], "stabl": [0, 12], "stai": [9, 26], "stall": [12, 36], "standard": [2, 22, 23, 24, 27], "standard_error": [22, 24, 27], "standardscal": [11, 23], "start": [0, 9, 11, 12, 22, 24, 25, 31, 35, 37], "startup": 5, "state": [9, 26, 35], "static": 0, "statist": [6, 9, 22], "statistiqu": 28, "statu": [11, 22, 23, 25, 27], "std": 24, "std_0": 24, "std_1": 24, "std_2": 24, "std_bill_length": 24, "std_bill_length_mm": 24, "step": [0, 1, 6, 11, 26, 33, 34, 37], "still": [9, 10, 22, 24], "stop": [25, 31], "storag": 26, "store": [9, 22, 23, 24, 25, 26, 27, 31], "str": [11, 12, 21, 22, 27], "strategi": 11, "streamlin": 0, "streamlit": [26, 31, 35], "strenum": [0, 11, 12], "string": [11, 22, 23, 24, 25, 26, 27], "strip": 26, "strongli": 9, "studi": 24, "style": [0, 12], "subcommand": 26, "submit_limit": [12, 36], "submodul": [7, 36], "subpackag": 36, "subscrib": 16, "subsequ": 0, "subset": [22, 25], "substarct": [22, 24, 27], "successfulli": 34, "suffici": 5, "suggest": 9, "suiss": 28, "suit": 33, "summari": 22, "support": 11, "suppress": 23, "sure": [0, 2, 24, 26, 27, 34, 35], "surviv": [26, 27], "svd_solver": 23, "swiss": 9, "sy": [23, 24, 25], "symmetric_dist": [12, 36], "symmetricdist": [12, 22], "syntax": 24, "synth": [0, 6, 11, 12, 21], "synth_df": 22, "synth_mean": 22, "synth_nam": [11, 12, 21, 22, 25], "synth_param": [11, 12, 21, 22, 25], "synth_vari": 22, "synthes": [11, 12, 25], "synthet": [6, 11, 24], "system": [22, 24, 25, 35], "sysynth_queri": 22, "t": [22, 23, 24, 26, 34], "t_01": 24, "t_02": 24, "t_12": 24, "t_test": 24, "tabl": [0, 11, 26], "tabular": 6, "tag": 0, "tail": 24, "take": [0, 9, 35], "target": 11, "target_column": [11, 12, 21, 22, 23], "task": [0, 9, 29, 31], "teacher": 6, "team": 5, "tear": 26, "term": 25, "termin": [8, 26, 35], "test": [0, 1, 9, 11, 12, 22, 23, 26, 36], "test_api": [12, 36], "test_api_diffprivlib": [12, 36], "test_api_smartnoise_synth": [12, 36], "test_config": 2, "test_dummy_gener": [12, 36], "test_mongodb_admin": [12, 36], "test_mongodb_admin_cli": [12, 36], "test_new_librari": 0, "test_siz": [11, 12, 21, 22, 23], "test_train_split_se": [11, 12, 21, 22, 23], "text": 11, "than": [22, 24, 27], "thank": [22, 24], "thei": [0, 5, 9, 16, 22, 23, 24, 25, 26], "them": [0, 22, 23, 24, 26], "then_cast_default": [22, 27], "then_clamp": [22, 27], "then_laplac": [22, 27], "then_res": [22, 27], "then_vari": [22, 27], "theorat": 24, "theoret": 24, "therefor": [22, 23, 24, 25, 26, 27], "thi": [0, 1, 5, 6, 8, 9, 10, 11, 16, 21, 22, 24, 25, 26, 27, 29, 31, 32, 33, 34, 35, 37], "those": [0, 2, 11, 25, 37], "though": 32, "threadpoolctl": 22, "three": [0, 11, 22], "through": [24, 26, 34, 35], "thu": 9, "ticket": [26, 27], "time": [0, 12, 22, 23, 24, 25, 35], "time_attack": [12, 36], "timeattackmethod": [12, 36], "timestamp": [22, 23, 25], "titan": [6, 26, 35], "titanic_metadata": [26, 27], "tmp": 27, "to_dict": 26, "toa": [22, 27], "token": 1, "tol": 23, "tolist": 27, "toml": 0, "too": 24, "tool": [0, 24, 29, 34], "torgersen": [22, 23, 24, 25, 26], "total": [11, 16, 22, 24, 26, 27], "total_spent_delta": [12, 21, 22, 24, 26, 27], "total_spent_epsilon": [12, 21, 22, 24, 26, 27], "traceback": 26, "train": [6, 11, 25], "tran": [22, 27], "transform": [0, 11, 12, 22, 25, 27], "treat": 11, "tree": 9, "tri": [5, 22, 24, 25], "trigger": [0, 5], "true": [11, 21, 22, 23, 24, 25, 26, 27, 31, 32], "trust": [22, 23], "try": [10, 22, 23, 24, 25], "tune": 37, "twine": 1, "two": [9, 22, 24, 25], "txt": 0, "type": [0, 11, 12, 22, 23, 24, 25, 26, 27, 31], "typic": 9, "tzdata": 22, "u": [1, 9, 26, 27, 31], "u32": 12, "un": 9, "unabl": [22, 23], "unavail": 11, "under": [9, 10, 11], "understand": [6, 23, 25], "understood": [22, 24, 25], "uneth": 26, "unfortunatelli": 25, "union": [11, 21], "unittest": 2, "unknown": 11, "unless": 26, "until": [24, 26], "up": [0, 1, 26, 34, 35], "updat": [0, 1, 9, 16, 22, 24, 26], "update_memory_usag": [12, 16], "upgrad": 22, "upload": 1, "upper": [22, 23, 24, 25, 26, 27], "upper_bound": [22, 24, 27], "url": [8, 11, 22, 23, 24, 25, 27, 31], "urllib3": 22, "us": [0, 2, 6, 8, 9, 11, 12, 16, 24, 26, 27, 29, 31, 32, 33, 34, 35], "usag": [8, 16, 26], "user": [5, 9, 11, 12, 21, 22, 23, 24, 25, 27, 29, 32, 35], "user_collect": 26, "user_nam": [8, 11, 12, 21, 22, 23, 24, 25, 26, 27], "user_pwd": 31, "usercollect": [12, 21], "usernam": 31, "userwarn": 25, "usr": [22, 23, 25], "usual": 9, "utf": 26, "util": [0, 5, 7, 9, 12, 17, 23, 25, 26, 36], "uvicorn_serv": [26, 36], "v": 31, "v1": 21, "valid": [0, 11, 25], "validate_synthes": [7, 11], "valu": [0, 5, 11, 12, 22, 23, 24, 25, 26, 27, 31, 32, 33], "valuabl": 9, "valueerror": [11, 26], "vanilla": 25, "var": 22, "var_ag": 27, "var_age_transformation_pipelin": 27, "var_bill_length": 22, "var_bill_length_measurement_pipelin": 22, "var_bill_length_queri": 22, "var_r": [22, 27], "var_smooth": 23, "vari": 32, "variabl": [22, 24, 32], "varianc": [22, 27], "variou": [6, 22, 23, 24, 25, 29, 31, 33], "venv": [2, 22], "verbos": [22, 23], "veri": [22, 24, 25], "verifi": [0, 1, 23, 24, 25], "versicolor": 26, "version": [0, 10, 22, 23, 25], "versu": 23, "via": [0, 1, 9, 22, 23, 24, 25, 27, 29], "virginica": 26, "virtual": 22, "visibl": [22, 23, 24, 25], "visualis": 31, "volum": [31, 35], "vx": 0, "wa": [9, 22, 24, 25, 26, 27], "wait": 26, "want": [22, 23, 24, 25, 26, 27], "warm_start": [22, 23], "warn": [0, 11, 22, 23, 25], "wast": 22, "we": [0, 9, 16, 22, 23, 24, 25, 26, 27, 29, 34], "web": 35, "welcom": 9, "well": [0, 9, 24], "were": [22, 24], "what": [0, 5, 11, 22, 23, 24, 25, 27], "when": [0, 5, 16, 22, 32], "where": [22, 24, 25, 26, 31, 35], "whether": 11, "which": [0, 5, 9, 22, 23, 24, 25, 26, 27], "while": [5, 9, 23], "white": 9, "whole": 22, "why": [5, 23, 24], "width": [22, 24], "wip_xx": 0, "wish": 1, "with_mean": 23, "with_std": 23, "within": [5, 9, 22, 23, 24, 31, 37], "without": [2, 5, 22, 24, 25, 26], "won": [22, 26], "work": [2, 11, 22, 23, 24, 25], "workflow": [1, 2, 24, 25], "worri": 22, "would": [22, 23, 24, 25], "wrapper_decor": 26, "write": [5, 22], "writeconcernerror": 5, "written": 26, "wrong": 23, "www": 9, "x": [0, 22, 27], "x27": [22, 23], "x_to_predict": [22, 23], "xx": 0, "y": 0, "yaml": [0, 2, 12, 26, 31, 32, 33, 36], "yaml_databas": [12, 36], "yaml_fil": 31, "ye": 0, "year": 27, "yet": [26, 34], "yf": [26, 31], "yml": 0, "you": [0, 6, 8, 24, 26, 32, 33, 34, 35, 37], "your": [0, 8, 26, 32, 33, 34, 35, 37], "your_deployement_url": 8, "your_nam": 8, "yourself": 29, "z": 0, "zero_concentrated_diverg": [12, 36], "zeroconcentrateddiverg": 11, "zscore": [22, 24, 27]}, "titles": ["Notes for Contributors", "Notes for Client Contributors", "Notes for Server Contributors", "API Documentation", "Client API", "Errors", "Examples", "lomas_client", "Quickstart", "Lomas: The Data Oases Hidden Behind the Mist.", "Welcome to Lomas documentation", "lomas_client package", "lomas_server package", "lomas_server.admin_database package", "lomas_server.administration package", "lomas_server.data_connector package", "lomas_server.dataset_store package", "lomas_server.dp_queries package", "lomas_server.dp_queries.dp_libraries package", "lomas_server.routes package", "lomas_server.tests package", "lomas_server.utils package", "Lomas: Client demo", "Lomas Client Side: Using DiffPrivlib", "Secure Data Disclosure: Client side", "Lomas Client Side: Using Smartnoise-Synth", "Lomas-server: CLI administration", "S3 example", "Poster", "Administration", "Server API", "CLI", "Dashboard", "Deployment", "Kubernetes", "Local", "lomas_server", "Onyxia"], "titleterms": {"1": [22, 23, 24, 25, 27], "2": [22, 23, 24, 25, 27], "3": [22, 23, 24, 25, 27], "4": [22, 23, 24, 27], "5": 23, "6": [23, 25], "The": 9, "access": [26, 32, 34], "ad": 0, "adapt": 25, "add": 26, "addit": 22, "admin_databas": 13, "administr": [14, 26, 29, 31], "ag": 27, "aggreg": 25, "aim": 25, "all": [25, 26], "analys": 22, "anti_timing_att": 21, "api": [3, 4, 30], "app": 12, "archiv": [22, 23, 25, 26], "associ": 23, "averag": [22, 27], "b": 22, "basic_dataset_stor": 16, "bay": 23, "behind": 9, "bill": 22, "branch": 0, "budget": [22, 24, 26, 27], "c": 22, "can": [23, 26], "chang": 26, "chart": 34, "check": [0, 22], "classif": 23, "classifi": 23, "cli": [26, 31], "client": [1, 4, 8, 9, 11, 22, 23, 24, 25, 27], "cluster": 23, "collect": 31, "collection_model": 21, "comput": 22, "condit": 25, "confid": [22, 24, 27], "config": 21, "connect": 31, "connector": 0, "constant": [12, 20], "content": [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "contributor": [0, 1, 2], "cost": [22, 23, 24, 27], "creat": [25, 26], "current": [22, 24, 27], "d": 22, "dashboard": 32, "data": [0, 9, 22, 24], "data_connector": 15, "data_connector_observ": 16, "databas": [0, 26], "dataset": [0, 22, 23, 24, 25, 26, 27, 31], "dataset_stor": 16, "decis": 23, "default": 25, "demo": 22, "deploi": [34, 35, 37], "deploy": 33, "descript": 9, "detail": 9, "differenti": 25, "diffprivlib": [18, 22, 23], "dimension": 23, "direcli": 26, "disclosur": 24, "do": 26, "docker": [26, 32], "document": [3, 10], "dp": [0, 22], "dp_librari": 18, "dp_logic": 17, "dp_queri": [17, 18], "dp_querier": 17, "dpctgan": 25, "dpgan": 25, "drop": 26, "dummi": [22, 23, 24, 25, 27], "dummy_dataset": 17, "ensembl": 25, "error": 5, "error_handl": 21, "estim": [22, 23, 24, 27], "exampl": [6, 27, 31], "execut": 22, "exponenti": 25, "extern": 0, "externallibraryexcept": 5, "factori": [13, 15, 16, 18], "file": 26, "final": 26, "first": 8, "flipper": 24, "fom": 26, "forest": 23, "functionn": [22, 24, 27], "gan": 25, "gaussian": 23, "get": [22, 23, 24, 25, 27], "git": 0, "github": 0, "helm": 34, "hidden": 9, "histori": 9, "hypothesi": 24, "in_memory_connector": 15, "indic": 9, "ingress": 34, "initi": 22, "initialis": [22, 23, 24, 25, 27], "instal": [8, 22, 23, 24, 25, 27, 34], "internalserverexcept": 5, "interv": [22, 24, 27], "introduct": 37, "invalidqueryexcept": 5, "iter": 25, "k": 23, "keep": 25, "kubernet": [32, 34], "learn": 22, "length": [22, 24], "librari": [0, 22, 23, 24, 25, 27], "linear": [22, 23], "lint": 0, "load": 26, "local": [32, 35], "logger": [0, 21], "logist": 23, "loma": [9, 10, 22, 23, 25, 26, 37], "lomas_cli": [7, 11], "lomas_serv": [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 36], "loss": 22, "lru_dataset_stor": 16, "machin": 22, "maximum": 25, "mean": 23, "mechan": 25, "metadata": [22, 23, 24, 25, 27], "mist": 9, "model": [22, 23], "modifi": 34, "modul": [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "mongodb": [26, 31], "mongodb_admin": 12, "mongodb_admin_cli": 12, "mongodb_databas": 13, "mst": 25, "multipl": 25, "mwem": 25, "naiv": 23, "new": 1, "note": [0, 1, 2], "now": [23, 26], "number": 27, "oas": 9, "onyxia": [32, 37], "opendp": [18, 22, 27], "option": 26, "other": [0, 23], "over": [24, 27], "overview": [9, 31], "packag": [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "paramet": 25, "patectgan": [22, 25], "pategan": 25, "path_connector": 15, "pca": 23, "penguin": 24, "pipelin": [22, 23], "platform": 32, "popul": [24, 27], "poster": 28, "postprocess": 22, "prepar": [22, 26], "prerequisit": [34, 35], "privaci": 22, "privat": [0, 22, 25, 27], "provaci": 22, "push": 1, "pypi": 1, "queri": [22, 23, 24, 25, 26, 27], "query_exampl": 21, "query_model": 21, "quickstart": 8, "random": 23, "real": [22, 24, 27], "reduct": 23, "regress": [22, 23], "releas": 0, "remain": 22, "remot": 27, "remov": 26, "risk": 22, "rout": 19, "routes_admin": 19, "routes_dp": 19, "row": 27, "s3": 27, "s3_connector": 15, "section": 34, "secur": 24, "see": [22, 23, 25], "sensit": 22, "server": [2, 9, 26, 30], "servic": 34, "she": 23, "side": [23, 24, 25], "smartnois": [22, 25, 27], "smartnoise_sql": 18, "smartnoise_synth": 18, "span": 25, "sql": [22, 27], "start": [23, 26], "statist": [24, 27], "step": [8, 22, 23, 24, 25, 27, 35], "stop": 26, "store": 0, "submodul": [11, 12, 13, 15, 16, 17, 18, 19, 20, 21], "subpackag": [12, 17], "synth": [22, 25], "synthes": 22, "synthet": [22, 25], "tabl": 9, "tabular": 25, "teacher": 25, "technic": 9, "test": [2, 20, 24], "test_api": 20, "test_api_diffprivlib": 20, "test_api_smartnoise_synth": 20, "test_dummy_gener": 20, "test_mongodb_admin": 20, "test_mongodb_admin_cli": 20, "thi": 23, "titan": 27, "train": [22, 23], "tree": [23, 25], "tri": 23, "unauthorizedaccessexcept": 5, "understand": [22, 24, 27], "us": [22, 23, 25], "user": [26, 31], "util": [11, 13, 18, 19, 21], "uvicorn_serv": 12, "valu": 34, "variou": 0, "verifi": 22, "version": 1, "via": 32, "visualis": 26, "volum": 26, "weight": 25, "welcom": 10, "whole": [24, 27], "workflow": 0, "write": 23, "yaml": 34, "yaml_databas": 13, "\u03b4": 22, "\u03b5": 22}}) \ No newline at end of file +Search.setIndex({"alltitles": {"AIM: Adaptive Iterative Mechanism": [[25, "AIM:-Adaptive-Iterative-Mechanism"]], "API Documentation": [[3, null]], "Access the server to administrate the mongoDB": [[26, "Access-the-server-to-administrate-the-mongoDB"]], "Access via Kubernetes": [[32, "access-via-kubernetes"]], "Access via Onyxia Platform": [[32, "access-via-onyxia-platform"]], "Accessing the Helm Chart": [[34, "accessing-the-helm-chart"]], "Add user": [[26, "Add-user"]], "Adding a DP Library": [[0, "adding-a-dp-library"]], "Adding a Data Connector (for private dataset in various databases)": [[0, "adding-a-data-connector-for-private-dataset-in-various-databases"]], "Adding a Dataset Store": [[0, "adding-a-dataset-store"]], "Administration": [[29, null]], "Archives of queries": [[26, "Archives-of-queries"]], "Average and number of rows with smartnoise-sql library on remote dummy": [[27, "Average-and-number-of-rows-with-smartnoise-sql-library-on-remote-dummy"]], "CLI": [[31, null]], "Change budget": [[26, "Change-budget"]], "Classification: Gaussian Naive Bayes": [[23, "Classification:-Gaussian-Naive-Bayes"]], "Classification: Logistic Regression": [[23, "Classification:-Logistic-Regression"]], "Client": [[8, "client"], [9, "client"]], "Client API": [[4, null]], "Clustering: K-Means": [[23, "Clustering:-K-Means"]], "Collections": [[31, "collections"]], "Confidence intervals for age over the whole population": [[27, "Confidence-intervals-for-age-over-the-whole-population"]], "Confidence intervals for flipper length over the whole population": [[24, "Confidence-intervals-for-flipper-length-over-the-whole-population"]], "Create a docker volume": [[26, "Create-a-docker-volume"]], "DPCTGAN: Differentially Private Conditional Tabular GAN": [[25, "DPCTGAN:-Differentially-Private-Conditional-Tabular-GAN"]], "DPGAN: DIfferentially Private GAN": [[25, "DPGAN:-DIfferentially-Private-GAN"]], "Dashboard": [[32, null]], "Datasets": [[31, "datasets"]], "Datasets (add and drop)": [[26, "Datasets-(add-and-drop)"]], "Decision Tree Classifier": [[23, "Decision-Tree-Classifier"]], "Deploying Lomas on Onyxia": [[37, "deploying-lomas-on-onyxia"]], "Deploying the Service on Kubernetes": [[34, "deploying-the-service-on-kubernetes"]], "Deployment": [[33, null]], "Detailed description:": [[9, "detailed-description"]], "Dimensionality Reduction: PCA": [[23, "Dimensionality-Reduction:-PCA"]], "Errors": [[5, null]], "Estimate budget of Linear Regression with DiffPrivLib": [[22, "Estimate-budget-of-Linear-Regression-with-DiffPrivLib"]], "Estimate cost of a query": [[24, "Estimate-cost-of-a-query"], [27, "Estimate-cost-of-a-query"]], "Estimate cost of a query with smartnoise-sql": [[22, "Estimate-cost-of-a-query-with-smartnoise-sql"]], "Estimate cost of training patectgan synthesizer with Smartnoise-Synth": [[22, "Estimate-cost-of-training-patectgan-synthesizer-with-Smartnoise-Synth"]], "Estimate cost with opendp": [[22, "Estimate-cost-with-opendp"]], "Examples": [[6, null], [31, "examples"]], "Execute pipeline on real dataset with opendp": [[22, "Execute-pipeline-on-real-dataset-with-opendp"]], "External Loggers": [[0, "external-loggers"]], "ExternalLibraryException": [[5, "externallibraryexception"]], "Finally all can be loaded fom a file direcly": [[26, "Finally-all-can-be-loaded-fom-a-file-direcly"]], "First steps": [[8, "first-steps"]], "Get a dummy dataset": [[27, "Get-a-dummy-dataset"]], "Get current budget": [[27, "Get-current-budget"]], "Getting dataset metadata": [[23, "Getting-dataset-metadata"], [25, "Getting-dataset-metadata"], [27, "Getting-dataset-metadata"]], "Git Branches": [[0, "git-branches"]], "GitHub Workflows": [[0, "github-workflows"]], "History": [[9, "history"]], "Hypothesis testing": [[24, "Hypothesis-testing"]], "Indices and tables": [[9, "indices-and-tables"]], "Installation": [[8, "installation"]], "Installing the Helm Chart": [[34, "installing-the-helm-chart"]], "InternalServerException": [[5, "internalserverexception"]], "Introduction": [[37, "introduction"]], "InvalidQueryException": [[5, "invalidqueryexception"]], "Kubernetes": [[34, null]], "Linting and Other Checks": [[0, "linting-and-other-checks"]], "Local": [[35, null]], "Local Access via Docker": [[32, "local-access-via-docker"]], "Lomas Client Side: Using DiffPrivlib": [[23, null]], "Lomas Client Side: Using Smartnoise-SQL": [[24, null]], "Lomas Client Side: Using Smartnoise-Synth": [[25, null]], "Lomas-server: CLI administration": [[26, null]], "Lomas: Client demo": [[22, null]], "Lomas: The Data Oases Hidden Behind the Mist.": [[9, null]], "MST: Maximum Spanning Tree": [[25, "MST:-Maximum-Spanning-Tree"]], "MWEM: Multiplicative Weights Exponential Mechanism": [[25, "MWEM:-Multiplicative-Weights-Exponential-Mechanism"]], "Modifying the ingress Section": [[34, "modifying-the-ingress-section"]], "Modifying values.yaml": [[34, "modifying-values-yaml"]], "Module contents": [[11, "module-lomas_client"], [12, "module-lomas_server"], [13, "module-lomas_server.admin_database"], [14, "module-lomas_server.administration"], [15, "module-lomas_server.data_connector"], [16, "module-lomas_server.dataset_store"], [17, "module-lomas_server.dp_queries"], [18, "module-lomas_server.dp_queries.dp_libraries"], [19, "module-lomas_server.routes"], [20, "module-lomas_server.tests"], [21, "module-lomas_server.utils"]], "MongoDB Administration": [[31, "mongodb-administration"]], "MongoDB Connection": [[31, "mongodb-connection"]], "Note on budget with Smartnoise-SQL (Advanced)": [[24, "Note-on-budget-with-Smartnoise-SQL-(Advanced)"]], "Notes for Client Contributors": [[1, null]], "Notes for Contributors": [[0, null]], "Notes for Server Contributors": [[2, null]], "Onyxia": [[37, null]], "Overide DP mechanism": [[24, "Overide-DP-mechanism"]], "Overview": [[31, "overview"]], "PATECTGAN: Conditional tabular GAN using Private Aggregation of Teacher Ensembles": [[25, "PATECTGAN:-Conditional-tabular-GAN-using-Private-Aggregation-of-Teacher-Ensembles"]], "PATEGAN: Private Aggregation of Teacher Ensembles": [[25, "PATEGAN:-Private-Aggregation-of-Teacher-Ensembles"]], "Poster": [[28, null]], "Postprocess": [[24, "Postprocess"]], "Postprocessing: no additional provacy risk with DP": [[22, "Postprocessing:-no-additional-provacy-risk-with-DP"]], "Prepare linear regression pipeline on dummy with DiffPrivLib": [[22, "Prepare-linear-regression-pipeline-on-dummy-with-DiffPrivLib"]], "Prepare opendp pipeline and verify on dummy": [[22, "Prepare-opendp-pipeline-and-verify-on-dummy"]], "Prepare the database": [[26, "Prepare-the-database"]], "Prerequisites": [[34, "prerequisites"], [35, "prerequisites"]], "Pushing a new version to Pypi": [[1, "pushing-a-new-version-to-pypi"]], "Query average bill length on dummy dataset with smartnoise-sql": [[22, "Query-average-bill-length-on-dummy-dataset-with-smartnoise-sql"]], "Query average bill length on private dataset with smartnoise-sql": [[22, "Query-average-bill-length-on-private-dataset-with-smartnoise-sql"]], "Query dummy dataset": [[24, "Query-dummy-dataset"]], "Query on dummy dataset": [[27, "Query-on-dummy-dataset"]], "Query on real private dataset with smartnoise-sql.": [[27, "Query-on-real-private-dataset-with-smartnoise-sql."]], "Query real dataset": [[24, "Query-real-dataset"]], "Quickstart": [[8, null]], "Random Forest": [[23, "Random-Forest"]], "Regression: Linear Regression": [[23, "Regression:-Linear-Regression"]], "Release Workflow": [[0, "release-workflow"]], "Remove user": [[26, "Remove-user"]], "S3 example": [[27, null]], "Server": [[9, "server"]], "Server API": [[30, null]], "She can now estimated the cost of this pipeline": [[23, "She-can-now-estimated-the-cost-of-this-pipeline"]], "She starts to write the associated DiffPrivLib pipeline and tries it on the dummy.": [[23, "She-starts-to-write-the-associated-DiffPrivLib-pipeline-and-tries-it-on-the-dummy."]], "Start server": [[26, "Start-server"]], "Start the server": [[26, "Start-the-server"]], "Step 1: Install the library": [[22, "Step-1:-Install-the-library"], [23, "Step-1:-Install-the-library"], [24, "Step-1:-Install-the-library"], [25, "Step-1:-Install-the-library"], [27, "Step-1:-Install-the-library"]], "Step 2: Initialise the client": [[22, "Step-2:-Initialise-the-client"], [23, "Step-2:-Initialise-the-client"], [24, "Step-2:-Initialise-the-client"], [25, "Step-2:-Initialise-the-client"], [27, "Step-2:-Initialise-the-client"]], "Step 3: Create a Synthetic Dataset keeping all default parameters": [[25, "Step-3:-Create-a-Synthetic-Dataset-keeping-all-default-parameters"]], "Step 3: Getting dataset metadata": [[24, "Step-3:-Getting-dataset-metadata"]], "Step 3: Metadata and dummy dataset": [[23, "Step-3:-Metadata-and-dummy-dataset"], [25, "Step-3:-Metadata-and-dummy-dataset"]], "Step 3: Understand the functionnalities of the library": [[22, "Step-3:-Understand-the-functionnalities-of-the-library"], [27, "Step-3:-Understand-the-functionnalities-of-the-library"]], "Step 4: Average bill length with Smartnoise-SQL": [[24, "Step-4:-Average-bill-length-with-Smartnoise-SQL"]], "Step 4: Penguin statistics": [[24, "Step-4:-Penguin-statistics"]], "Step 4: See archives of queries": [[22, "Step-4:-See-archives-of-queries"]], "Step 4: Titanic statistics with opendp": [[27, "Step-4:-Titanic-statistics-with-opendp"]], "Step 4: Train Logistic Regression model with DiffPrivLib": [[23, "Step-4:-Train-Logistic-Regression-model-with-DiffPrivLib"]], "Step 4: Use DP libraries to analyse the dataset": [[22, "Step-4:-Use-DP-libraries-to-analyse-the-dataset"]], "Step 5: Train other models with DiffPrivLib": [[23, "Step-5:-Train-other-models-with-DiffPrivLib"]], "Step 6: See archives of queries": [[23, "Step-6:-See-archives-of-queries"], [25, "Step-6:-See-archives-of-queries"]], "Steps to Deploy Locally": [[35, "steps-to-deploy-locally"]], "Stop the server: do not do it now !": [[26, "Stop-the-server:-do-not-do-it-now-!"]], "Submodules": [[11, "submodules"], [12, "submodules"], [13, "submodules"], [15, "submodules"], [16, "submodules"], [17, "submodules"], [18, "submodules"], [19, "submodules"], [20, "submodules"], [21, "submodules"]], "Subpackages": [[12, "subpackages"], [17, "subpackages"]], "Technical Overview:": [[9, "technical-overview"]], "Tests": [[2, "tests"]], "Train linear regression on sensitive data with DiffPrivLib": [[22, "Train-linear-regression-on-sensitive-data-with-DiffPrivLib"]], "Train patectgan synthesizer on dummy data with Smartnoise-Synth": [[22, "Train-patectgan-synthesizer-on-dummy-data-with-Smartnoise-Synth"]], "Train patectgan synthesizer on private data with Smartnoise-Synth": [[22, "Train-patectgan-synthesizer-on-private-data-with-Smartnoise-Synth"]], "UnauthorizedAccessException": [[5, "unauthorizedaccessexception"]], "Users": [[26, "Users"], [31, "users"]], "Visualise all options": [[26, "Visualise-all-options"]], "Welcome to Lomas documentation": [[10, null]], "a. Compute average bill length with Smartnoise-SQL": [[22, "a.-Compute-average-bill-length-with-Smartnoise-SQL"]], "a. Getting dataset metadata": [[22, "a.-Getting-dataset-metadata"]], "b. Compute confidence interval with opendp": [[22, "b.-Compute-confidence-interval-with-opendp"]], "b. Get a dummy dataset": [[22, "b.-Get-a-dummy-dataset"]], "c. Check privacy loss budget \u03b5, \u03b4 (initial, current, remaining)": [[22, "c.-Check-privacy-loss-budget-\u03b5,-\u03b4-(initial,-current,-remaining)"]], "c. Train a DP Machine Learning model with DiffPrivLib": [[22, "c.-Train-a-DP-Machine-Learning-model-with-DiffPrivLib"]], "d. Get a Synthetic Dataset with Smartnoise-Synth": [[22, "d.-Get-a-Synthetic-Dataset-with-Smartnoise-Synth"]], "lomas_client": [[7, null]], "lomas_client package": [[11, null]], "lomas_client.client module": [[11, "module-lomas_client.client"]], "lomas_client.utils module": [[11, "module-lomas_client.utils"]], "lomas_server": [[36, null]], "lomas_server package": [[12, null]], "lomas_server.admin_database package": [[13, null]], "lomas_server.admin_database.admin_database module": [[13, "lomas-server-admin-database-admin-database-module"]], "lomas_server.admin_database.factory module": [[13, "lomas-server-admin-database-factory-module"]], "lomas_server.admin_database.mongodb_database module": [[13, "lomas-server-admin-database-mongodb-database-module"]], "lomas_server.admin_database.utils module": [[13, "lomas-server-admin-database-utils-module"]], "lomas_server.admin_database.yaml_database module": [[13, "lomas-server-admin-database-yaml-database-module"]], "lomas_server.administration package": [[14, null]], "lomas_server.app module": [[12, "lomas-server-app-module"]], "lomas_server.constants module": [[12, "module-lomas_server.constants"]], "lomas_server.data_connector package": [[15, null]], "lomas_server.data_connector.data_connector module": [[15, "lomas-server-data-connector-data-connector-module"]], "lomas_server.data_connector.factory module": [[15, "lomas-server-data-connector-factory-module"]], "lomas_server.data_connector.in_memory_connector module": [[15, "lomas-server-data-connector-in-memory-connector-module"]], "lomas_server.data_connector.path_connector module": [[15, "lomas-server-data-connector-path-connector-module"]], "lomas_server.data_connector.s3_connector module": [[15, "lomas-server-data-connector-s3-connector-module"]], "lomas_server.dataset_store package": [[16, null]], "lomas_server.dataset_store.basic_dataset_store module": [[16, "lomas-server-dataset-store-basic-dataset-store-module"]], "lomas_server.dataset_store.data_connector_observer module": [[16, "module-lomas_server.dataset_store.data_connector_observer"]], "lomas_server.dataset_store.dataset_store module": [[16, "lomas-server-dataset-store-dataset-store-module"]], "lomas_server.dataset_store.factory module": [[16, "lomas-server-dataset-store-factory-module"]], "lomas_server.dataset_store.lru_dataset_store module": [[16, "lomas-server-dataset-store-lru-dataset-store-module"]], "lomas_server.dp_queries package": [[17, null]], "lomas_server.dp_queries.dp_libraries package": [[18, null]], "lomas_server.dp_queries.dp_libraries.diffprivlib module": [[18, "lomas-server-dp-queries-dp-libraries-diffprivlib-module"]], "lomas_server.dp_queries.dp_libraries.factory module": [[18, "lomas-server-dp-queries-dp-libraries-factory-module"]], "lomas_server.dp_queries.dp_libraries.opendp module": [[18, "lomas-server-dp-queries-dp-libraries-opendp-module"]], "lomas_server.dp_queries.dp_libraries.smartnoise_sql module": [[18, "lomas-server-dp-queries-dp-libraries-smartnoise-sql-module"]], "lomas_server.dp_queries.dp_libraries.smartnoise_synth module": [[18, "lomas-server-dp-queries-dp-libraries-smartnoise-synth-module"]], "lomas_server.dp_queries.dp_libraries.utils module": [[18, "lomas-server-dp-queries-dp-libraries-utils-module"]], "lomas_server.dp_queries.dp_logic module": [[17, "lomas-server-dp-queries-dp-logic-module"]], "lomas_server.dp_queries.dp_querier module": [[17, "lomas-server-dp-queries-dp-querier-module"]], "lomas_server.dp_queries.dummy_dataset module": [[17, "lomas-server-dp-queries-dummy-dataset-module"]], "lomas_server.mongodb_admin module": [[12, "lomas-server-mongodb-admin-module"]], "lomas_server.mongodb_admin_cli module": [[12, "lomas-server-mongodb-admin-cli-module"]], "lomas_server.routes package": [[19, null]], "lomas_server.routes.routes_admin module": [[19, "lomas-server-routes-routes-admin-module"]], "lomas_server.routes.routes_dp module": [[19, "lomas-server-routes-routes-dp-module"]], "lomas_server.routes.utils module": [[19, "lomas-server-routes-utils-module"]], "lomas_server.tests package": [[20, null]], "lomas_server.tests.constants module": [[20, "module-lomas_server.tests.constants"]], "lomas_server.tests.test_api module": [[20, "lomas-server-tests-test-api-module"]], "lomas_server.tests.test_api_diffprivlib module": [[20, "lomas-server-tests-test-api-diffprivlib-module"]], "lomas_server.tests.test_api_smartnoise_synth module": [[20, "lomas-server-tests-test-api-smartnoise-synth-module"]], "lomas_server.tests.test_dummy_generation module": [[20, "lomas-server-tests-test-dummy-generation-module"]], "lomas_server.tests.test_mongodb_admin module": [[20, "lomas-server-tests-test-mongodb-admin-module"]], "lomas_server.tests.test_mongodb_admin_cli module": [[20, "lomas-server-tests-test-mongodb-admin-cli-module"]], "lomas_server.utils package": [[21, null]], "lomas_server.utils.anti_timing_att module": [[21, "lomas-server-utils-anti-timing-att-module"]], "lomas_server.utils.collection_models module": [[21, "module-lomas_server.utils.collection_models"]], "lomas_server.utils.config module": [[21, "lomas-server-utils-config-module"]], "lomas_server.utils.error_handler module": [[21, "lomas-server-utils-error-handler-module"]], "lomas_server.utils.logger module": [[21, "module-lomas_server.utils.logger"]], "lomas_server.utils.query_examples module": [[21, "module-lomas_server.utils.query_examples"]], "lomas_server.utils.query_models module": [[21, "module-lomas_server.utils.query_models"]], "lomas_server.uvicorn_serve module": [[12, "lomas-server-uvicorn-serve-module"]]}, "docnames": ["CONTRIBUTING", "CONTRIBUTING_CLIENT", "CONTRIBUTING_SERVER", "api", "client_api", "client_errors", "client_examples", "client_modules", "client_quickstart", "index", "index_under_construction", "lomas_client", "lomas_server", "lomas_server.admin_database", "lomas_server.administration", "lomas_server.data_connector", "lomas_server.dataset_store", "lomas_server.dp_queries", "lomas_server.dp_queries.dp_libraries", "lomas_server.routes", "lomas_server.tests", "lomas_server.utils", "notebooks/Demo_Client_Notebook", "notebooks/Demo_Client_Notebook_DiffPrivLib", "notebooks/Demo_Client_Notebook_Smartnoise-SQL", "notebooks/Demo_Client_Notebook_Smartnoise-Synth", "notebooks/local_admin_notebook", "notebooks/s3_example_notebook", "poster", "server_administration", "server_api", "server_cli", "server_dashboard", "server_deployment", "server_kubernetes", "server_local", "server_modules", "server_onyxia"], "envversion": {"nbsphinx": 4, "sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1}, "filenames": ["CONTRIBUTING.md", "CONTRIBUTING_CLIENT.md", "CONTRIBUTING_SERVER.md", "api.rst", "client_api.rst", "client_errors.rst", "client_examples.rst", "client_modules.rst", "client_quickstart.rst", "index.rst", "index_under_construction.rst", "lomas_client.rst", "lomas_server.rst", "lomas_server.admin_database.rst", "lomas_server.administration.rst", "lomas_server.data_connector.rst", "lomas_server.dataset_store.rst", "lomas_server.dp_queries.rst", "lomas_server.dp_queries.dp_libraries.rst", "lomas_server.routes.rst", "lomas_server.tests.rst", "lomas_server.utils.rst", "notebooks/Demo_Client_Notebook.ipynb", "notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb", "notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb", "notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb", "notebooks/local_admin_notebook.ipynb", "notebooks/s3_example_notebook.ipynb", "poster.rst", "server_administration.rst", "server_api.rst", "server_cli.rst", "server_dashboard.rst", "server_deployment.rst", "server_kubernetes.rst", "server_local.rst", "server_modules.rst", "server_onyxia.rst"], "indexentries": {"access_key_id (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.access_key_id", false]], "admindbtype (class in lomas_server.constants)": [[12, "lomas_server.constants.AdminDBType", false]], "aim (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.AIM", false]], "aim (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.AIM", false]], "basic (lomas_server.constants.datasetstoretype attribute)": [[12, "lomas_server.constants.DatasetStoreType.BASIC", false]], "bucket (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.bucket", false]], "bucket (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.bucket", false]], "categorical (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.CATEGORICAL", false]], "censor_dims (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.censor_dims", false]], "change_one_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.CHANGE_ONE_DISTANCE", false]], "client (class in lomas_client.client)": [[11, "lomas_client.client.Client", false]], "columns (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.columns", false]], "condition (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.condition", false]], "configkeys (class in lomas_server.constants)": [[12, "lomas_server.constants.ConfigKeys", false]], "constraints (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.constraints", false]], "continuous (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.CONTINUOUS", false]], "credentials_name (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.credentials_name", false]], "credentials_name (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.credentials_name", false]], "cube (lomas_server.constants.ssynthtabletransstyle attribute)": [[12, "lomas_server.constants.SSynthTableTransStyle.CUBE", false]], "database_type (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.database_type", false]], "database_type (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.database_type", false]], "database_type (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.database_type", false]], "database_type (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.database_type", false]], "dataconnectorobserver (class in lomas_server.dataset_store.data_connector_observer)": [[16, "lomas_server.dataset_store.data_connector_observer.DataConnectorObserver", false]], "dataset (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.Dataset", false]], "dataset_name (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.dataset_name", false]], "dataset_name (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.getdbdata attribute)": [[21, "lomas_server.utils.query_models.GetDbData.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.dataset_name", false]], "dataset_path (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.dataset_path", false]], "dataset_store (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DATASET_STORE", false]], "dataset_store_type (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DATASET_STORE_TYPE", false]], "datasetofpathdb (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB", false]], "datasetofs3db (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB", false]], "datasetofuser (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.DatasetOfUser", false]], "datasets (lomas_server.utils.collection_models.datasetscollection attribute)": [[21, "lomas_server.utils.collection_models.DatasetsCollection.datasets", false]], "datasets_list (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.datasets_list", false]], "datasetscollection (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.DatasetsCollection", false]], "datasetstoretype (class in lomas_server.constants)": [[12, "lomas_server.constants.DatasetStoreType", false]], "datetime (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.DATETIME", false]], "db (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DB", false]], "db_type (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DB_TYPE", false]], "db_type_mongodb (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DB_TYPE_MONGODB", false]], "delta (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.delta", false]], "delta (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.delta", false]], "delta (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.delta", false]], "delta (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.delta", false]], "develop_mode (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DEVELOP_MODE", false]], "diffprivlib (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.DIFFPRIVLIB", false]], "diffprivlib (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.DIFFPRIVLIB", false]], "diffprivlib_json (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.diffprivlib_json", false]], "diffprivlib_json (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.diffprivlib_json", false]], "diffprivlib_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.diffprivlib_query", false]], "diffprivlibmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel", false]], "dp_ctgan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.DP_CTGAN", false]], "dp_ctgan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.DP_CTGAN", false]], "dp_gan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.DP_GAN", false]], "dp_gan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.DP_GAN", false]], "dp_library (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DP_LIBRARY", false]], "dplibraries (class in lomas_client.client)": [[11, "lomas_client.client.DPLibraries", false]], "dplibraries (class in lomas_server.constants)": [[12, "lomas_server.constants.DPLibraries", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.dummy_nb_rows", false]], "dummy_seed (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.dummy_seed", false]], "dummydiffprivlibmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel", false]], "dummyopendpmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel", false]], "dummysmartnoisesqlmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel", false]], "dummysmartnoisesynthquerymodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel", false]], "endpoint_url (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.endpoint_url", false]], "endpoint_url (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.endpoint_url", false]], "epsilon (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.epsilon", false]], "epsilon (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.epsilon", false]], "epsilon (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.epsilon", false]], "epsilon (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.epsilon", false]], "error_message() (in module lomas_client.client)": [[11, "lomas_client.client.error_message", false]], "estimate_diffprivlib_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_diffprivlib_cost", false]], "estimate_opendp_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_opendp_cost", false]], "estimate_smartnoise_sql_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_smartnoise_sql_cost", false]], "estimate_smartnoise_synth_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_smartnoise_synth_cost", false]], "feature_columns (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.feature_columns", false]], "feature_columns (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.feature_columns", false]], "fixed_delta (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.fixed_delta", false]], "fixed_delta (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.fixed_delta", false]], "fixed_smoothed_max_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.FIXED_SMOOTHED_MAX_DIVERGENCE", false]], "gan (lomas_server.constants.ssynthtabletransstyle attribute)": [[12, "lomas_server.constants.SSynthTableTransStyle.GAN", false]], "get_dataset_metadata() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_dataset_metadata", false]], "get_dummy_dataset() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_dummy_dataset", false]], "get_initial_budget() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_initial_budget", false]], "get_previous_queries() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_previous_queries", false]], "get_remaining_budget() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_remaining_budget", false]], "get_total_spent_budget() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_total_spent_budget", false]], "getdbdata (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.GetDbData", false]], "getdummydataset (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.GetDummyDataset", false]], "hamming_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.HAMMING_DISTANCE", false]], "imputer_strategy (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.imputer_strategy", false]], "imputer_strategy (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.imputer_strategy", false]], "initial_delta (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.initial_delta", false]], "initial_epsilon (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.initial_epsilon", false]], "insert_delete_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.INSERT_DELETE_DISTANCE", false]], "int_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.INT_DISTANCE", false]], "jitter (lomas_server.constants.timeattackmethod attribute)": [[12, "lomas_server.constants.TimeAttackMethod.JITTER", false]], "key (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.key", false]], "key (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.key", false]], "lomas_client": [[11, "module-lomas_client", false]], "lomas_client.client": [[11, "module-lomas_client.client", false]], "lomas_client.utils": [[11, "module-lomas_client.utils", false]], "lomas_server": [[12, "module-lomas_server", false]], "lomas_server.admin_database": [[13, "module-lomas_server.admin_database", false]], "lomas_server.administration": [[14, "module-lomas_server.administration", false]], "lomas_server.constants": [[12, "module-lomas_server.constants", false]], "lomas_server.data_connector": [[15, "module-lomas_server.data_connector", false]], "lomas_server.dataset_store": [[16, "module-lomas_server.dataset_store", false]], "lomas_server.dataset_store.data_connector_observer": [[16, "module-lomas_server.dataset_store.data_connector_observer", false]], "lomas_server.dp_queries": [[17, "module-lomas_server.dp_queries", false]], "lomas_server.dp_queries.dp_libraries": [[18, "module-lomas_server.dp_queries.dp_libraries", false]], "lomas_server.routes": [[19, "module-lomas_server.routes", false]], "lomas_server.tests": [[20, "module-lomas_server.tests", false]], "lomas_server.tests.constants": [[20, "module-lomas_server.tests.constants", false]], "lomas_server.utils": [[21, "module-lomas_server.utils", false]], "lomas_server.utils.collection_models": [[21, "module-lomas_server.utils.collection_models", false]], "lomas_server.utils.logger": [[21, "module-lomas_server.utils.logger", false]], "lomas_server.utils.query_examples": [[21, "module-lomas_server.utils.query_examples", false]], "lomas_server.utils.query_models": [[21, "module-lomas_server.utils.query_models", false]], "lru (lomas_server.constants.datasetstoretype attribute)": [[12, "lomas_server.constants.DatasetStoreType.LRU", false]], "lru_dataset_store_max_size (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.LRU_DATASET_STORE_MAX_SIZE", false]], "make_dummy() (in module lomas_server.utils.query_examples)": [[21, "lomas_server.utils.query_examples.make_dummy", false]], "max_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.MAX_DIVERGENCE", false]], "max_ids (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.max_ids", false]], "may_query (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.may_query", false]], "mechanisms (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.mechanisms", false]], "mechanisms (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.mechanisms", false]], "mechanisms (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.mechanisms", false]], "metadata (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.Metadata", false]], "metadata (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.metadata", false]], "metadata_path (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.metadata_path", false]], "metadataofdataset (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.MetadataOfDataset", false]], "metadataofpathdb (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB", false]], "metadataofs3db (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB", false]], "model_computed_fields (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetscollection attribute)": [[21, "lomas_server.utils.collection_models.DatasetsCollection.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadataofdataset attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfDataset.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.usercollection attribute)": [[21, "lomas_server.utils.collection_models.UserCollection.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.getdbdata attribute)": [[21, "lomas_server.utils.query_models.GetDbData.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.model_computed_fields", false]], "model_config (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetscollection attribute)": [[21, "lomas_server.utils.collection_models.DatasetsCollection.model_config", false]], "model_config (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.model_config", false]], "model_config (lomas_server.utils.collection_models.metadataofdataset attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfDataset.model_config", false]], "model_config (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.model_config", false]], "model_config (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.model_config", false]], "model_config (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.model_config", false]], "model_config (lomas_server.utils.collection_models.usercollection attribute)": [[21, "lomas_server.utils.collection_models.UserCollection.model_config", false]], "model_config (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.model_config", false]], "model_config (lomas_server.utils.query_models.getdbdata attribute)": [[21, "lomas_server.utils.query_models.GetDbData.model_config", false]], "model_config (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.model_config", false]], "model_config (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.model_config", false]], "model_fields (lomas_server.utils.collection_models.dataset attribute)": [[21, "lomas_server.utils.collection_models.Dataset.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfPathDB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetofs3db attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfS3DB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetscollection attribute)": [[21, "lomas_server.utils.collection_models.DatasetsCollection.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadataofdataset attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfDataset.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfPathDB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.model_fields", false]], "model_fields (lomas_server.utils.collection_models.usercollection attribute)": [[21, "lomas_server.utils.collection_models.UserCollection.model_fields", false]], "model_fields (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.getdbdata attribute)": [[21, "lomas_server.utils.query_models.GetDbData.model_fields", false]], "model_fields (lomas_server.utils.query_models.getdummydataset attribute)": [[21, "lomas_server.utils.query_models.GetDummyDataset.model_fields", false]], "model_fields (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.model_fields", false]], "module": [[11, "module-lomas_client", false], [11, "module-lomas_client.client", false], [11, "module-lomas_client.utils", false], [12, "module-lomas_server", false], [12, "module-lomas_server.constants", false], [13, "module-lomas_server.admin_database", false], [14, "module-lomas_server.administration", false], [15, "module-lomas_server.data_connector", false], [16, "module-lomas_server.dataset_store", false], [16, "module-lomas_server.dataset_store.data_connector_observer", false], [17, "module-lomas_server.dp_queries", false], [18, "module-lomas_server.dp_queries.dp_libraries", false], [19, "module-lomas_server.routes", false], [20, "module-lomas_server.tests", false], [20, "module-lomas_server.tests.constants", false], [21, "module-lomas_server.utils", false], [21, "module-lomas_server.utils.collection_models", false], [21, "module-lomas_server.utils.logger", false], [21, "module-lomas_server.utils.query_examples", false], [21, "module-lomas_server.utils.query_models", false]], "mongodb (lomas_server.constants.admindbtype attribute)": [[12, "lomas_server.constants.AdminDBType.MONGODB", false]], "mongodb_addr (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.MONGODB_ADDR", false]], "mongodb_port (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.MONGODB_PORT", false]], "mst (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.MST", false]], "mst (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.MST", false]], "mwem (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.MWEM", false]], "mwem (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.MWEM", false]], "nb_samples (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.nb_samples", false]], "nullable (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.nullable", false]], "opendp (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.OPENDP", false]], "opendp (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.OPENDP", false]], "opendp_json (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[21, "lomas_server.utils.query_models.DummyOpenDPModel.opendp_json", false]], "opendp_json (lomas_server.utils.query_models.opendpmodel attribute)": [[21, "lomas_server.utils.query_models.OpenDPModel.opendp_json", false]], "opendp_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.opendp_query", false]], "opendpdatasetinputmetric (class in lomas_server.constants)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric", false]], "opendpmeasurement (class in lomas_server.constants)": [[12, "lomas_server.constants.OpenDPMeasurement", false]], "opendpmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.OpenDPModel", false]], "pac_synth (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.PAC_SYNTH", false]], "pac_synth (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.PAC_SYNTH", false]], "pate_ctgan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.PATE_CTGAN", false]], "pate_ctgan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.PATE_CTGAN", false]], "pate_gan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.PATE_GAN", false]], "pate_gan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.PATE_GAN", false]], "path (lomas_server.constants.privatedatabasetype attribute)": [[12, "lomas_server.constants.PrivateDatabaseType.PATH", false]], "postprocess (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.postprocess", false]], "postprocess (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.postprocess", false]], "private_id (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.PRIVATE_ID", false]], "privatedatabasetype (class in lomas_server.constants)": [[12, "lomas_server.constants.PrivateDatabaseType", false]], "query_str (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.query_str", false]], "query_str (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.query_str", false]], "query_str (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel.query_str", false]], "return_model (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.return_model", false]], "row_privacy (lomas_server.utils.collection_models.metadata attribute)": [[21, "lomas_server.utils.collection_models.Metadata.row_privacy", false]], "runtime_args (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.RUNTIME_ARGS", false]], "s3 (lomas_server.constants.privatedatabasetype attribute)": [[12, "lomas_server.constants.PrivateDatabaseType.S3", false]], "secret_access_key (lomas_server.utils.collection_models.metadataofs3db attribute)": [[21, "lomas_server.utils.collection_models.MetadataOfS3DB.secret_access_key", false]], "select_cols (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.select_cols", false]], "server (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.SERVER", false]], "settings (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.SETTINGS", false]], "smartnoise_sql (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.SMARTNOISE_SQL", false]], "smartnoise_sql (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.SMARTNOISE_SQL", false]], "smartnoise_sql_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.smartnoise_sql_query", false]], "smartnoise_synth (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.SMARTNOISE_SYNTH", false]], "smartnoise_synth (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.SMARTNOISE_SYNTH", false]], "smartnoise_synth_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.smartnoise_synth_query", false]], "smartnoisesqlcostmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLCostModel", false]], "smartnoisesqlmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.SmartnoiseSQLModel", false]], "smartnoisesynthcostmodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel", false]], "smartnoisesynthquerymodel (class in lomas_server.utils.query_models)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel", false]], "smoothed_max_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.SMOOTHED_MAX_DIVERGENCE", false]], "ssynthcolumntype (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthColumnType", false]], "ssynthgansynthesizer (class in lomas_client.utils)": [[11, "lomas_client.utils.SSynthGanSynthesizer", false]], "ssynthgansynthesizer (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthGanSynthesizer", false]], "ssynthmarginalsynthesizer (class in lomas_client.utils)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer", false]], "ssynthmarginalsynthesizer (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer", false]], "ssynthtabletransstyle (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthTableTransStyle", false]], "stall (lomas_server.constants.timeattackmethod attribute)": [[12, "lomas_server.constants.TimeAttackMethod.STALL", false]], "submit_limit (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.SUBMIT_LIMIT", false]], "symmetric_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.SYMMETRIC_DISTANCE", false]], "synth_name (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.synth_name", false]], "synth_params (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[21, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.synth_params", false]], "target_columns (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.target_columns", false]], "target_columns (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.target_columns", false]], "test_size (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.test_size", false]], "test_size (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.test_size", false]], "test_train_split_seed (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DiffPrivLibModel.test_train_split_seed", false]], "test_train_split_seed (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[21, "lomas_server.utils.query_models.DummyDiffPrivLibModel.test_train_split_seed", false]], "time_attack (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.TIME_ATTACK", false]], "timeattackmethod (class in lomas_server.constants)": [[12, "lomas_server.constants.TimeAttackMethod", false]], "total_spent_delta (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.total_spent_delta", false]], "total_spent_epsilon (lomas_server.utils.collection_models.datasetofuser attribute)": [[21, "lomas_server.utils.collection_models.DatasetOfUser.total_spent_epsilon", false]], "update_memory_usage() (lomas_server.dataset_store.data_connector_observer.dataconnectorobserver method)": [[16, "lomas_server.dataset_store.data_connector_observer.DataConnectorObserver.update_memory_usage", false]], "user (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.User", false]], "user_name (lomas_server.utils.collection_models.user attribute)": [[21, "lomas_server.utils.collection_models.User.user_name", false]], "usercollection (class in lomas_server.utils.collection_models)": [[21, "lomas_server.utils.collection_models.UserCollection", false]], "users (lomas_server.utils.collection_models.usercollection attribute)": [[21, "lomas_server.utils.collection_models.UserCollection.users", false]], "validate_synthesizer() (in module lomas_client.utils)": [[11, "lomas_client.utils.validate_synthesizer", false]], "yaml (lomas_server.constants.admindbtype attribute)": [[12, "lomas_server.constants.AdminDBType.YAML", false]], "zero_concentrated_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.ZERO_CONCENTRATED_DIVERGENCE", false]]}, "objects": {"": [[11, 0, 0, "-", "lomas_client"], [12, 0, 0, "-", "lomas_server"]], "lomas_client": [[11, 0, 0, "-", "client"], [11, 0, 0, "-", "utils"]], "lomas_client.client": [[11, 1, 1, "", "Client"], [11, 1, 1, "", "DPLibraries"], [11, 4, 1, "", "error_message"]], "lomas_client.client.Client": [[11, 2, 1, "", "diffprivlib_query"], [11, 2, 1, "", "estimate_diffprivlib_cost"], [11, 2, 1, "", "estimate_opendp_cost"], [11, 2, 1, "", "estimate_smartnoise_sql_cost"], [11, 2, 1, "", "estimate_smartnoise_synth_cost"], [11, 2, 1, "", "get_dataset_metadata"], [11, 2, 1, "", "get_dummy_dataset"], [11, 2, 1, "", "get_initial_budget"], [11, 2, 1, "", "get_previous_queries"], [11, 2, 1, "", "get_remaining_budget"], [11, 2, 1, "", "get_total_spent_budget"], [11, 2, 1, "", "opendp_query"], [11, 2, 1, "", "smartnoise_sql_query"], [11, 2, 1, "", "smartnoise_synth_query"]], "lomas_client.client.DPLibraries": [[11, 3, 1, "", "DIFFPRIVLIB"], [11, 3, 1, "", "OPENDP"], [11, 3, 1, "", "SMARTNOISE_SQL"], [11, 3, 1, "", "SMARTNOISE_SYNTH"]], "lomas_client.utils": [[11, 1, 1, "", "SSynthGanSynthesizer"], [11, 1, 1, "", "SSynthMarginalSynthesizer"], [11, 4, 1, "", "validate_synthesizer"]], "lomas_client.utils.SSynthGanSynthesizer": [[11, 3, 1, "", "DP_CTGAN"], [11, 3, 1, "", "DP_GAN"], [11, 3, 1, "", "PATE_CTGAN"], [11, 3, 1, "", "PATE_GAN"]], "lomas_client.utils.SSynthMarginalSynthesizer": [[11, 3, 1, "", "AIM"], [11, 3, 1, "", "MST"], [11, 3, 1, "", "MWEM"], [11, 3, 1, "", "PAC_SYNTH"]], "lomas_server": [[13, 0, 0, "-", "admin_database"], [14, 0, 0, "-", "administration"], [12, 0, 0, "-", "constants"], [15, 0, 0, "-", "data_connector"], [16, 0, 0, "-", "dataset_store"], [17, 0, 0, "-", "dp_queries"], [19, 0, 0, "-", "routes"], [20, 0, 0, "-", "tests"], [21, 0, 0, "-", "utils"]], "lomas_server.constants": [[12, 1, 1, "", "AdminDBType"], [12, 1, 1, "", "ConfigKeys"], [12, 1, 1, "", "DPLibraries"], [12, 1, 1, "", "DatasetStoreType"], [12, 1, 1, "", "OpenDPDatasetInputMetric"], [12, 1, 1, "", "OpenDPMeasurement"], [12, 1, 1, "", "PrivateDatabaseType"], [12, 1, 1, "", "SSynthColumnType"], [12, 1, 1, "", "SSynthGanSynthesizer"], [12, 1, 1, "", "SSynthMarginalSynthesizer"], [12, 1, 1, "", "SSynthTableTransStyle"], [12, 1, 1, "", "TimeAttackMethod"]], "lomas_server.constants.AdminDBType": [[12, 3, 1, "", "MONGODB"], [12, 3, 1, "", "YAML"]], "lomas_server.constants.ConfigKeys": [[12, 3, 1, "", "DATASET_STORE"], [12, 3, 1, "", "DATASET_STORE_TYPE"], [12, 3, 1, "", "DB"], [12, 3, 1, "", "DB_TYPE"], [12, 3, 1, "", "DB_TYPE_MONGODB"], [12, 3, 1, "", "DEVELOP_MODE"], [12, 3, 1, "", "DP_LIBRARY"], [12, 3, 1, "", "LRU_DATASET_STORE_MAX_SIZE"], [12, 3, 1, "", "MONGODB_ADDR"], [12, 3, 1, "", "MONGODB_PORT"], [12, 3, 1, "", "RUNTIME_ARGS"], [12, 3, 1, "", "SERVER"], [12, 3, 1, "", "SETTINGS"], [12, 3, 1, "", "SUBMIT_LIMIT"], [12, 3, 1, "", "TIME_ATTACK"]], "lomas_server.constants.DPLibraries": [[12, 3, 1, "", "DIFFPRIVLIB"], [12, 3, 1, "", "OPENDP"], [12, 3, 1, "", "SMARTNOISE_SQL"], [12, 3, 1, "", "SMARTNOISE_SYNTH"]], "lomas_server.constants.DatasetStoreType": [[12, 3, 1, "", "BASIC"], [12, 3, 1, "", "LRU"]], "lomas_server.constants.OpenDPDatasetInputMetric": [[12, 3, 1, "", "CHANGE_ONE_DISTANCE"], [12, 3, 1, "", "HAMMING_DISTANCE"], [12, 3, 1, "", "INSERT_DELETE_DISTANCE"], [12, 3, 1, "", "INT_DISTANCE"], [12, 3, 1, "", "SYMMETRIC_DISTANCE"]], "lomas_server.constants.OpenDPMeasurement": [[12, 3, 1, "", "FIXED_SMOOTHED_MAX_DIVERGENCE"], [12, 3, 1, "", "MAX_DIVERGENCE"], [12, 3, 1, "", "SMOOTHED_MAX_DIVERGENCE"], [12, 3, 1, "", "ZERO_CONCENTRATED_DIVERGENCE"]], "lomas_server.constants.PrivateDatabaseType": [[12, 3, 1, "", "PATH"], [12, 3, 1, "", "S3"]], "lomas_server.constants.SSynthColumnType": [[12, 3, 1, "", "CATEGORICAL"], [12, 3, 1, "", "CONTINUOUS"], [12, 3, 1, "", "DATETIME"], [12, 3, 1, "", "PRIVATE_ID"]], "lomas_server.constants.SSynthGanSynthesizer": [[12, 3, 1, "", "DP_CTGAN"], [12, 3, 1, "", "DP_GAN"], [12, 3, 1, "", "PATE_CTGAN"], [12, 3, 1, "", "PATE_GAN"]], "lomas_server.constants.SSynthMarginalSynthesizer": [[12, 3, 1, "", "AIM"], [12, 3, 1, "", "MST"], [12, 3, 1, "", "MWEM"], [12, 3, 1, "", "PAC_SYNTH"]], "lomas_server.constants.SSynthTableTransStyle": [[12, 3, 1, "", "CUBE"], [12, 3, 1, "", "GAN"]], "lomas_server.constants.TimeAttackMethod": [[12, 3, 1, "", "JITTER"], [12, 3, 1, "", "STALL"]], "lomas_server.dataset_store": [[16, 0, 0, "-", "data_connector_observer"]], "lomas_server.dataset_store.data_connector_observer": [[16, 1, 1, "", "DataConnectorObserver"]], "lomas_server.dataset_store.data_connector_observer.DataConnectorObserver": [[16, 2, 1, "", "update_memory_usage"]], "lomas_server.dp_queries": [[18, 0, 0, "-", "dp_libraries"]], "lomas_server.tests": [[20, 0, 0, "-", "constants"]], "lomas_server.utils": [[21, 0, 0, "-", "collection_models"], [21, 0, 0, "-", "logger"], [21, 0, 0, "-", "query_examples"], [21, 0, 0, "-", "query_models"]], "lomas_server.utils.collection_models": [[21, 1, 1, "", "Dataset"], [21, 1, 1, "", "DatasetOfPathDB"], [21, 1, 1, "", "DatasetOfS3DB"], [21, 1, 1, "", "DatasetOfUser"], [21, 1, 1, "", "DatasetsCollection"], [21, 1, 1, "", "Metadata"], [21, 1, 1, "", "MetadataOfDataset"], [21, 1, 1, "", "MetadataOfPathDB"], [21, 1, 1, "", "MetadataOfS3DB"], [21, 1, 1, "", "User"], [21, 1, 1, "", "UserCollection"]], "lomas_server.utils.collection_models.Dataset": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "metadata"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.DatasetOfPathDB": [[21, 3, 1, "", "database_type"], [21, 3, 1, "", "dataset_path"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.DatasetOfS3DB": [[21, 3, 1, "", "bucket"], [21, 3, 1, "", "credentials_name"], [21, 3, 1, "", "database_type"], [21, 3, 1, "", "endpoint_url"], [21, 3, 1, "", "key"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.DatasetOfUser": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "initial_delta"], [21, 3, 1, "", "initial_epsilon"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "total_spent_delta"], [21, 3, 1, "", "total_spent_epsilon"]], "lomas_server.utils.collection_models.DatasetsCollection": [[21, 3, 1, "", "datasets"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.Metadata": [[21, 3, 1, "", "censor_dims"], [21, 3, 1, "", "columns"], [21, 3, 1, "", "max_ids"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "row_privacy"]], "lomas_server.utils.collection_models.MetadataOfDataset": [[21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.MetadataOfPathDB": [[21, 3, 1, "", "database_type"], [21, 3, 1, "", "metadata_path"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.MetadataOfS3DB": [[21, 3, 1, "", "access_key_id"], [21, 3, 1, "", "bucket"], [21, 3, 1, "", "credentials_name"], [21, 3, 1, "", "database_type"], [21, 3, 1, "", "endpoint_url"], [21, 3, 1, "", "key"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "secret_access_key"]], "lomas_server.utils.collection_models.User": [[21, 3, 1, "", "datasets_list"], [21, 3, 1, "", "may_query"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "user_name"]], "lomas_server.utils.collection_models.UserCollection": [[21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "users"]], "lomas_server.utils.query_examples": [[21, 4, 1, "", "make_dummy"]], "lomas_server.utils.query_models": [[21, 1, 1, "", "DiffPrivLibModel"], [21, 1, 1, "", "DummyDiffPrivLibModel"], [21, 1, 1, "", "DummyOpenDPModel"], [21, 1, 1, "", "DummySmartnoiseSQLModel"], [21, 1, 1, "", "DummySmartnoiseSynthQueryModel"], [21, 1, 1, "", "GetDbData"], [21, 1, 1, "", "GetDummyDataset"], [21, 1, 1, "", "OpenDPModel"], [21, 1, 1, "", "SmartnoiseSQLCostModel"], [21, 1, 1, "", "SmartnoiseSQLModel"], [21, 1, 1, "", "SmartnoiseSynthCostModel"], [21, 1, 1, "", "SmartnoiseSynthQueryModel"]], "lomas_server.utils.query_models.DiffPrivLibModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "diffprivlib_json"], [21, 3, 1, "", "feature_columns"], [21, 3, 1, "", "imputer_strategy"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "target_columns"], [21, 3, 1, "", "test_size"], [21, 3, 1, "", "test_train_split_seed"]], "lomas_server.utils.query_models.DummyDiffPrivLibModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "diffprivlib_json"], [21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "feature_columns"], [21, 3, 1, "", "imputer_strategy"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "target_columns"], [21, 3, 1, "", "test_size"], [21, 3, 1, "", "test_train_split_seed"]], "lomas_server.utils.query_models.DummyOpenDPModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "fixed_delta"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "opendp_json"]], "lomas_server.utils.query_models.DummySmartnoiseSQLModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "delta"], [21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "epsilon"], [21, 3, 1, "", "mechanisms"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "postprocess"], [21, 3, 1, "", "query_str"]], "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel": [[21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.query_models.GetDbData": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.query_models.GetDummyDataset": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "dummy_nb_rows"], [21, 3, 1, "", "dummy_seed"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"]], "lomas_server.utils.query_models.OpenDPModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "fixed_delta"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "opendp_json"]], "lomas_server.utils.query_models.SmartnoiseSQLCostModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "delta"], [21, 3, 1, "", "epsilon"], [21, 3, 1, "", "mechanisms"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "query_str"]], "lomas_server.utils.query_models.SmartnoiseSQLModel": [[21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "delta"], [21, 3, 1, "", "epsilon"], [21, 3, 1, "", "mechanisms"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "postprocess"], [21, 3, 1, "", "query_str"]], "lomas_server.utils.query_models.SmartnoiseSynthCostModel": [[21, 3, 1, "", "constraints"], [21, 3, 1, "", "dataset_name"], [21, 3, 1, "", "delta"], [21, 3, 1, "", "epsilon"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "nullable"], [21, 3, 1, "", "select_cols"], [21, 3, 1, "", "synth_name"], [21, 3, 1, "", "synth_params"]], "lomas_server.utils.query_models.SmartnoiseSynthQueryModel": [[21, 3, 1, "", "condition"], [21, 3, 1, "", "model_computed_fields"], [21, 3, 1, "", "model_config"], [21, 3, 1, "", "model_fields"], [21, 3, 1, "", "nb_samples"], [21, 3, 1, "", "return_model"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function"}, "terms": {"": [0, 2, 9, 22, 23, 24, 25, 26, 27, 37], "0": [0, 11, 21, 22, 23, 24, 25, 26, 27, 31, 35], "00": 26, "000000": 25, "000000000032756e": 24, "0001": [22, 23, 25, 26], "00014999500000001387": 27, "00015673368198174188": [22, 25], "0003": 25, "0004": 21, "0005": 26, "001": 26, "004345": 22, "004950000000000006": 22, "004980000049999984": 24, "005": [22, 26], "0064163": 23, "009962": 22, "01": 27, "015296": 25, "019657": 25, "021514": 24, "021906": 25, "02257092": 23, "029771": 25, "03": 9, "03063776": 23, "031628": 22, "037792": 25, "039871": 25, "0403549": 23, "040502": 25, "040945": 22, "041455": 24, "04333305": 23, "048848": 24, "05": [22, 24, 25, 26], "051061": 27, "057986": 25, "058849": 22, "06": [24, 26], "06269805": 23, "064838": 25, "065695": 25, "07": 26, "070911": 22, "0776813": 22, "0791934": 23, "08181725": 23, "09": [23, 26], "09042376": 23, "092630": 25, "095856": 25, "096718": 22, "0x70772e4779d0": 24, "0x70772e4e5310": 24, "0x70772e4e7990": 24, "0x70772e4e7a10": 24, "0x70772e4f5a90": 24, "0x70772f81b410": 24, "0x75edc6883650": 25, "0x75edc6e1ffd0": 25, "1": [6, 8, 11, 12, 21, 26, 31, 35], "10": [22, 23, 24, 25, 26, 27], "100": [11, 22, 23, 25, 26, 27], "1000": 26, "100000": 26, "1047": 23, "10520211": 23, "11": [22, 23, 24, 25, 26, 27], "112": 23, "113": 23, "114": 23, "115": 23, "115118": 25, "116": 23, "116608": 25, "117": 23, "118": 23, "119": 23, "119691": 25, "12": [22, 23, 24, 25, 26, 27], "120": 23, "12087": 23, "121": 23, "122": 23, "123": [23, 24], "125": 25, "126": 23, "126229": 22, "127": [23, 35], "128": [23, 25], "12818723": 23, "13": [22, 23, 24, 25, 26, 27], "133": 27, "135689": 25, "136712": 25, "13806414": 23, "14": [22, 24, 25, 26, 27], "143633": 27, "15": [22, 23, 24, 25, 26, 27], "150": [22, 23, 24, 25, 26], "151": 24, "152": 22, "154047": 25, "155": 25, "155779": 25, "16": [22, 23, 24, 25, 26, 27], "160858": 27, "164572": 25, "1653635": 23, "167": 22, "17": [22, 23, 24, 25, 26, 27], "170": 22, "17087": 9, "1724943669": 25, "1725364882": 22, "1725364890": 22, "1725364897": 22, "1725364925": 22, "1725375748": 23, "1725375760": 23, "1725375769": 23, "17307692307692307": 23, "174224": 22, "176": 25, "176308": 24, "1789": 23, "179": 23, "179588": 22, "18": [22, 23, 24, 25, 26, 27], "180": 25, "181": 22, "182522": 25, "184": 25, "187": 22, "188": 25, "189": 25, "19": [22, 24, 25, 26, 27], "190": 25, "192": 25, "193": 25, "195": [22, 25], "195120": 25, "196": [22, 25], "196980": 25, "197": [22, 25], "198": [22, 23], "199": [22, 27], "199850005": 27, "19mm": 24, "1e": [11, 22, 23, 24, 25, 26, 27], "2": [6, 8, 11, 26], "20": [22, 23, 24, 25, 26, 27], "200": [11, 22, 25, 27], "2000": [22, 23, 24, 25, 26], "2017": 22, "202": 25, "2020": 22, "2022": [9, 22], "2024": [9, 22, 26], "203": 25, "205857": 22, "206": 25, "208380": 25, "208473": 22, "209": 25, "209843": 24, "21": [22, 23, 24, 25, 26, 27], "210038": 22, "213206": 25, "214375": 22, "215": 25, "215382": 25, "21843151": 23, "219": [22, 25], "22": [22, 23, 24, 25, 26, 27], "220": 25, "224480": 25, "2250": 25, "22857142857142856": 23, "23": [22, 23, 24, 25, 26, 27], "233215": 25, "234439": 24, "235": 25, "23529411764705882": 22, "236663": 22, "24": [22, 23, 24, 25, 26, 27], "240181818190626": 27, "2405": 22, "2406": 9, "2421": 27, "2464255812": 27, "246992": 27, "248922": 25, "25": [22, 23, 24, 25, 26, 27], "250": [22, 23, 24, 25, 26], "2503": 27, "256": 25, "2562": 27, "257728": 24, "26": [22, 23, 24, 25, 26, 27], "2619": 23, "27": [22, 23, 24, 25, 26, 27], "27017": [26, 31], "2733": 27, "273981": 25, "2750": 25, "28": [22, 23, 24, 25, 26, 27], "29": [22, 23, 24, 25, 26, 27], "293022": 25, "2964165": 23, "29748358": 23, "298139": 25, "3": [6, 8, 26], "30": [22, 23, 24, 25, 26, 27], "300": 26, "300011": 22, "303064": 25, "305613": 24, "31": [22, 24, 25, 26, 27], "310123": 25, "318067": 25, "32": [22, 23, 24, 25, 26, 27], "322245": 25, "3265": 27, "3280285": 23, "3299136": 22, "33": [22, 23, 24, 25, 26], "332719": 25, "334219": 25, "3379": 25, "34": [22, 23, 24, 25, 26, 27], "340155": 22, "344": [22, 23, 24, 25], "346262": 25, "35": [22, 23, 24, 26], "3503": 25, "351940": 22, "36": [22, 23, 24, 25, 26], "362705": 24, "3655": 25, "3665": 22, "3677": 25, "37": [22, 23, 24, 25, 26], "371106": 25, "3719": 25, "3729": 25, "375": 25, "375624": 24, "38": [22, 23, 24, 26, 27], "380197": 25, "38324636": 23, "386925": 25, "386937": 25, "387484": 24, "39": [22, 23, 24, 25, 26, 27], "392393": 25, "393938": 25, "396": 26, "399": 27, "4": [5, 6, 25, 26], "40": [22, 23, 24, 26], "400": [22, 27], "403337": 25, "4036": 22, "4078": 27, "4079": 25, "409859": 25, "41": [22, 23, 24, 25, 26], "4114": 25, "4144": 23, "418": 26, "418710": 25, "42": [11, 22, 23, 24, 25, 26], "4207": 23, "422": [23, 25], "42783671": 23, "43": [22, 23, 24, 25, 26, 27], "437214": 25, "4394": 25, "44": [22, 23, 24, 25, 26], "441730": 25, "4419": 25, "442156": 22, "442859": 22, "444144": 24, "444762": 24, "444863": 25, "4452": 27, "445511": 25, "4458": 25, "4478": 25, "45": [22, 23, 24, 25, 26, 27], "450379": 25, "4523578": 25, "452576": 25, "453384": 25, "4534618": 23, "46": [22, 23, 24, 25, 26], "461": 26, "4611": 27, "46118653": 23, "4627": 25, "464": 26, "4653": 25, "465330": 24, "4659": 24, "466": 26, "467704": 24, "467873": 22, "47": [22, 23, 24, 25, 26], "4772062": 23, "48": [22, 24, 25, 26], "482846": 25, "4833": 27, "485773": 24, "485997": 25, "4860": 27, "487531": 22, "4887658": 23, "489978": 25, "49": [22, 24, 25, 26, 27], "490971": 24, "4925373134328358": 23, "494324": 25, "495445": 25, "496153": 25, "4999949999983109e": 24, "5": [6, 11, 21, 22, 24, 25, 26, 27, 31], "50": [22, 24, 25, 26], "500": 25, "5000": [22, 25], "5012": 25, "501660": 24, "504224": 25, "505892": 25, "506950": 22, "5085": 25, "51": [22, 23, 24, 25, 26], "511585": 22, "511754": 25, "513633": 22, "515079": 25, "5152": 25, "52": [22, 25, 26], "5250": 25, "5256": 25, "526961": 23, "527649": 24, "527822": 25, "53": [22, 25], "534705": 22, "5361": 25, "536535": 25, "538643": 25, "5387": 25, "54": [22, 25, 26], "5405": [25, 27], "54397209": 23, "548207": 25, "548540": 25, "5486": 25, "548668": 25, "54mm": 22, "55": 22, "5514": 25, "552031": 22, "559502": 22, "56": [22, 23], "5630": 27, "565315": 22, "56533889": 23, "57": [22, 23, 25], "573335": 22, "58": [22, 23, 25], "586326": 25, "5870": 22, "589007": 25, "59": [22, 23, 24, 26], "596290": 22, "597868": 22, "6": [6, 22, 24, 26, 27], "60": 22, "600734": 25, "6048": 25, "61": 22, "61111848": 23, "6134": 25, "6183": 25, "62": [22, 23], "621885": 22, "625": 25, "627252": 25, "627506": 25, "628134": 24, "6291": 25, "63": [23, 25], "632390": 22, "6332": 25, "633310": 25, "634349": 22, "6345": 25, "6358": 25, "63708804": 23, "639037": 25, "6397": 27, "64": [24, 25], "641046": 23, "644815": 25, "649727": 25, "65": [22, 23, 24, 25, 26], "6532": 22, "6542": 25, "6634": 27, "666000": 25, "667682": 25, "667950": 25, "67": 24, "673375": 22, "6743": 27, "677968": 22, "678": 26, "687155": 22, "68mm": 24, "6916816": 22, "69469642643347": 23, "695215": 25, "7": [22, 23, 24, 25, 26, 27], "7000": [22, 23, 24, 25, 26], "700080": 22, "703": 26, "70486754": 23, "706083": 25, "71": 23, "710": 26, "7122093023265228": 22, "712894": 25, "72": 23, "725760": 22, "726": 26, "73": 23, "73642974": 23, "74": 23, "741": 26, "74222011": 23, "749": 26, "75": [23, 25], "755": 26, "76": 23, "769447201112094": 22, "77": [22, 23], "775184": 22, "777496": 22, "778165": 22, "778699": 25, "783114": 25, "783888": 24, "785036": 25, "785941": 27, "788893": 25, "79": [23, 27], "792230": 25, "799114": 25, "8": [22, 23, 24, 25, 26, 27], "80": [23, 25], "800": 22, "801831": 24, "809876": 25, "809981": 25, "811036": 25, "813858": 22, "81874155": 23, "82": 23, "825123": 25, "825255002419716": 22, "8266": 27, "827918": 22, "828321": 24, "828992": 25, "83": [22, 23, 24], "830486": 24, "830853": 22, "833": 23, "834249": 25, "83563483": 23, "836150": 25, "83mm": [22, 24], "840851": 25, "847898": 25, "8501": [32, 35], "850983": 24, "852415": 25, "858690": 25, "860750": 25, "865149": 25, "867188": 24, "874247": 25, "875": 25, "877035": 22, "885068": 22, "8888": 35, "88939657": 23, "890809": 22, "891": 27, "892826": 25, "9": [22, 23, 24, 25, 26, 27], "90": 23, "9000": 35, "9001": 35, "907485": 25, "909203": 24, "911177": 25, "914762": 25, "917": 26, "9226": 27, "928019": 27, "929629": 25, "934119": 22, "935352": 27, "936950": 27, "94": 27, "940040": 25, "940338": 27, "941920": 25, "943369": 25, "944748": 24, "947320": 25, "95": [22, 24, 27], "950489": 24, "958753": 25, "96": [22, 24, 27], "960368": 22, "9621": 27, "967001": 24, "967093": 25, "96890848": 23, "971380": 25, "979574": 25, "982129": 27, "9846": 27, "98950874": 23, "99": 22, "996525": 25, "999999999999449e": [22, 24], "9am": 0, "A": [9, 11, 21, 22, 24, 25, 26, 27, 34, 35], "AND": 0, "AS": [22, 24, 27], "And": [22, 23, 24, 25, 26], "As": [0, 22, 23, 24, 25, 27], "BY": 24, "But": [22, 24], "By": [22, 23, 25, 26, 34], "For": [0, 9, 11, 22, 23, 24, 25, 26], "IT": 9, "If": [0, 1, 11, 23, 24, 26, 32, 34, 35], "In": [0, 1, 5, 6, 9, 11, 22, 23, 24, 25, 26, 29, 32, 34, 35], "It": [0, 2, 9, 22, 23, 24, 25, 26, 27, 29, 31], "Its": 9, "NOT": 22, "No": [0, 22, 26], "Not": [11, 22], "ON": [22, 35], "Of": [0, 24], "On": [9, 22, 23, 24, 27], "One": [0, 2, 25, 27, 35], "Or": [23, 24, 25, 26], "That": 24, "The": [0, 2, 5, 10, 11, 22, 23, 24, 25, 26, 27, 31, 32, 34, 35], "Then": [0, 1, 22, 25, 26], "There": [0, 25], "These": [0, 6, 26, 29, 31], "To": [0, 8, 22, 23, 24, 25, 26, 27, 29, 32, 34, 37], "WILL": 22, "With": [22, 23, 25, 27, 35], "__fields__": 21, "__init__": [25, 26], "__name__": 26, "__pycache__": 26, "__token__": 1, "_add_dataset": 0, "_ast": 24, "_dpl_instanc": [22, 23], "_dpl_type": [22, 23], "_item": [22, 23], "_named_symbol": 24, "_tupl": [22, 23], "aadd": 0, "ab": [9, 24], "abc": 16, "abl": [22, 23, 24, 25, 26, 27], "about": [0, 9, 21, 22, 25, 26, 31], "abov": [0, 24], "abspath": [23, 24, 25], "abstract": 16, "accept": 11, "access": [5, 8, 9, 22, 23, 24, 25, 29, 31, 33, 35], "access_key_id": [12, 21, 31], "accord": 37, "accordingli": 26, "account": [11, 22, 23, 24, 25], "accuraci": [22, 23], "acknowledg": 5, "across": [0, 35], "action": 0, "activ": [2, 32], "actual": [22, 24], "ad": [22, 24, 25, 26, 29, 31, 35], "adapt": [9, 26, 34], "add": [0, 22, 25, 27, 31, 35], "add_dataset": [26, 31], "add_dataset_to_us": [26, 31], "add_datasets_via_yaml": [26, 31], "add_us": [26, 31], "add_user_with_budget": [26, 31], "add_users_via_yaml": [26, 31], "addit": [0, 6, 9, 23, 25, 26, 29, 35], "addition": 5, "address": [12, 31, 35], "adeli": [22, 23, 24, 25, 26], "adjust": 0, "admin": [0, 9, 22, 23, 25, 26, 35], "admin123": 26, "admin_databas": [12, 26, 36], "admindbtyp": [12, 36], "administr": [2, 5, 9, 12, 24, 35, 36, 37], "adminyamldatabas": 2, "advanc": [6, 22, 25], "advis": [9, 25], "affect": [22, 24], "after": [22, 24, 26, 27], "afterward": [22, 24, 27], "ag": 26, "again": [2, 10, 22, 23, 24, 27], "against": 12, "age_max": 27, "age_min": 27, "age_transformation_pipelin": 27, "aggreg": 6, "agre": 22, "ahead": 0, "aim": [7, 9, 11, 12, 22, 23, 24, 26, 36], "aimsynthes": 25, "ak": 34, "algorithm": 25, "alia": 24, "alic": [22, 23, 24, 25, 26], "all": [0, 6, 8, 9, 11, 22, 23, 24, 27, 31], "alloc": [9, 26], "allow": [22, 26, 27, 31, 37], "alreadi": [9, 22, 24, 26], "alreai": 26, "also": [0, 2, 6, 9, 22, 23, 24, 25, 26, 27, 29, 35], "altern": [24, 26], "alwai": [0, 11, 23, 31], "among": [22, 25, 26], "an": [0, 2, 5, 11, 21, 22, 23, 24, 25, 26, 35], "analys": [6, 9], "analysi": [0, 22, 24], "ani": [8, 9, 11, 22, 23, 24, 25, 26, 27], "annot": 21, "anonimizationtransform": 11, "anoth": [0, 22, 23, 24, 25, 26, 27], "answer": 24, "antarctica": [22, 23, 24], "antartica": [22, 23, 24, 25, 26], "anti_timing_att": [12, 36], "any_queri": 8, "anywai": 24, "api": [0, 9, 12, 26, 32, 35], "app": [0, 26, 31, 36], "app_url": [8, 22, 23, 24, 25, 27], "appear": 24, "append": [23, 24, 25], "appli": [22, 23, 24, 27], "applic": [6, 22, 23, 24, 25, 27, 35], "approv": 0, "appvers": 0, "ar": [0, 1, 2, 5, 6, 9, 11, 22, 23, 24, 25, 26, 27, 32], "architectur": 9, "archiv": [0, 6, 9, 31], "arg": [23, 26], "argument": [11, 23, 24, 26], "arrai": [22, 23], "arxiv": 9, "ask": [22, 24, 27], "aspect": 9, "assembl": 24, "assign": [22, 26], "associ": [0, 8, 9, 22, 25, 26], "ast": [24, 26], "atomdomain": 22, "attack": 12, "attent": 9, "authent": 9, "authoris": 5, "autom": [0, 1], "automat": [0, 2, 25, 35], "avail": [9, 11, 22, 23, 25, 26, 29, 32, 34, 35], "avala": 0, "averag": 6, "avg": [22, 24, 27], "avg_0": 24, "avg_1": 24, "avg_2": 24, "avg_ag": 27, "avg_bill_length": [22, 24], "avg_bill_length_mm": [22, 24], "avg_bill_length_queri": 22, "avg_bill_length_respons": 24, "avg_bl": 24, "avg_bl_dummi": 24, "avoid": [11, 24], "aw": 31, "aws_access_key_id": 26, "aws_secret_access_kei": 26, "b": 0, "back": [23, 25], "background": 24, "base": [2, 5, 11, 12, 16, 21, 22, 23, 25, 26, 27, 31], "baselmodel": 0, "basemodel": [0, 21], "basic": [12, 36], "basic_dataset_stor": [12, 36], "batch_siz": 25, "bd_bound": 25, "becaus": [22, 23, 24, 25, 27], "beeen": 22, "been": [9, 23, 26], "befor": [0, 22, 24, 25, 26, 34], "begin": 34, "behaviour": [22, 23], "being": 8, "below": [0, 8, 9, 22, 24, 34], "best": [22, 23, 33], "better": [22, 24], "between": [23, 24, 25], "bf": 9, "big": 22, "biggest": 23, "bill": [6, 23], "bill_depth_meta": 23, "bill_depth_mm": [22, 23, 24, 25, 26], "bill_length": 25, "bill_length_max": 22, "bill_length_meta": 23, "bill_length_min": 22, "bill_length_mm": [22, 23, 24, 25, 26], "bill_length_transformation_pipelin": 22, "bin": 25, "bind": 26, "bintransform": 25, "bisco": [22, 23, 24, 25, 26], "bit": 26, "bl_bound": 25, "black": 0, "blob": 12, "blocker": 23, "blog": 9, "bob": 26, "bodi": [22, 23], "body_mass_g": [22, 23, 24, 25, 26], "bool": [11, 21], "boolean": [26, 27], "both": 0, "bound": [22, 23, 25, 26, 27], "boundari": [11, 12], "bounds_i": 23, "bounds_x": 23, "breviti": 9, "broken": 22, "browser": 35, "bucket": [12, 21, 26, 31, 35], "budget": [0, 5, 6, 9, 11, 23, 25, 29, 31], "budgetaccount": [22, 23], "bug": 9, "buget": 22, "build": 0, "build_doc": 0, "built": 35, "button": 37, "c": [0, 23, 26, 27, 31], "cabin": [26, 27], "cach": 16, "call": [9, 22, 23, 25, 26, 27], "can": [0, 2, 6, 8, 9, 11, 16, 22, 24, 25, 27, 29, 32, 33, 34, 35, 37], "cannot": [22, 23, 27], "capabl": 22, "cardin": [22, 23, 24, 25, 26, 27], "care": [0, 9, 22, 24], "carri": 26, "case": [0, 11, 22, 23, 25], "categor": [12, 23, 25, 36], "categori": [22, 23, 24, 25, 26, 27], "cd": [0, 35], "cell": [11, 22, 23], "censor_dim": [12, 21, 22, 23, 24, 25, 26], "center": 23, "certain": [11, 25, 26, 29], "certifi": 22, "ch": [0, 9, 35], "chaintransform": 25, "chang": [16, 22, 24, 34], "change_one_dist": [12, 36], "changeonedist": 12, "chapter": [34, 35], "charset": 22, "chart": [0, 9, 33], "check": [1, 5, 23, 24, 25, 26, 27], "chekck": 25, "chinstrap": [22, 23, 24, 25, 26], "chmod": 0, "choic": 31, "choos": [22, 23, 25, 33, 37], "ci": 0, "ci_95_lower_bound": 24, "ci_95_upper_bound": 24, "clamp": 25, "clamptransform": 25, "class": [0, 11, 12, 16, 21, 22, 23], "classic": 9, "classif": 22, "classifi": 22, "classvar": 21, "clean": [26, 31], "cleaner": 26, "clear": 26, "cli": 29, "click": 37, "client": [0, 3, 6, 7, 26], "client_input": [22, 23, 25], "clone": 35, "close": 22, "cloud": 34, "cluster": [9, 33, 34], "code": [0, 8, 9, 11, 22, 23, 24, 25, 26], "codebas": 26, "codeql": 0, "col": [22, 23], "col_nam": [22, 27], "coldheart": 26, "collect": [21, 22, 26], "collection_model": [12, 36], "cols_metadata": [22, 23], "column": [11, 12, 21, 22, 23, 24, 25, 26, 27], "column_nam": 22, "com": [0, 9, 12, 26, 35], "come": 5, "command": [0, 8, 22, 23, 24, 25, 26, 27, 29, 31, 34, 35], "commonli": 9, "commun": 34, "compar": 22, "complet": [0, 26], "compliant": 24, "compon": 9, "components_": 23, "compos": [9, 26, 32, 35], "comput": [21, 23, 24, 25, 27], "computedfieldinfo": 21, "concept": 9, "condit": [6, 11, 12, 21, 22], "config": [2, 12, 26, 35, 36], "configdict": 21, "configkei": [12, 36], "configur": [0, 9, 12, 21, 26, 32, 34], "conflict": 22, "conform": 21, "connect": [9, 22, 29], "consist": 0, "consol": 35, "constant": [0, 22, 26, 27, 36], "constraint": [0, 11, 12, 21, 22, 25], "construct": 10, "constructor": 11, "contact": 5, "contain": [0, 11, 26, 34, 35], "content": [7, 36], "continu": [9, 12, 25, 36], "contribut": 0, "convert": [11, 24], "copi": 23, "correct": 9, "correspond": 21, "cost": [0, 11, 21, 25], "cost_r": [22, 23, 27], "could": [22, 23, 24, 25, 26], "count": [24, 27], "count_bill_length_mm": 24, "count_bl": 24, "cours": [22, 24, 27], "cover": 29, "creat": [0, 6, 22, 23, 24, 27, 31, 32, 35], "creation": 26, "credenti": 9, "credentials_nam": [12, 21], "credit": [22, 23, 25], "critic": 24, "critical_valu": 24, "cryptograph": [11, 25], "csv": 26, "ctrl": 26, "cube": [12, 36], "curios": 22, "current": [9, 11, 24, 26], "custom": [0, 5, 11, 34, 37], "d": [26, 31], "d_path": [26, 31], "dai": 26, "daisi": 26, "dashboard": 29, "data": [11, 12, 23, 24, 25, 26, 27, 29, 31, 35], "data_connector": [0, 12, 26, 36], "data_connector_factori": 0, "data_connector_observ": [12, 36], "data_norm": 23, "databas": [2, 5, 9, 12, 22, 23, 24, 25, 27, 29, 31, 35], "database_typ": [12, 21, 26, 31], "dataconnector": [0, 16], "dataconnectorobserv": [12, 16], "datafram": [0, 5, 11, 22, 23, 24, 25, 27], "datalab": 37, "dataset": [5, 6, 8, 9, 11, 12, 16, 21, 35], "dataset_collect": 26, "dataset_nam": [8, 11, 12, 21, 22, 23, 24, 25, 26, 27, 31], "dataset_path": [12, 21, 26, 31], "dataset_stor": [0, 12, 26, 36], "dataset_store_factori": 0, "dataset_store_typ": [12, 36], "datasetofpathdb": [12, 21], "datasetofs3db": [12, 21], "datasetofus": [12, 21], "datasets_list": [12, 21, 26], "datasetscollect": [12, 21], "datasetstor": [0, 16], "datasetstoretyp": [0, 12, 36], "date": [0, 1], "datetim": [12, 36], "dateutil": 22, "db": [12, 26, 31, 36], "db_a": 31, "db_n": 31, "db_name": 31, "db_p": 31, "db_pwd": 31, "db_type": [12, 36], "db_type_mongodb": [12, 36], "db_u": 31, "de": 28, "decid": [22, 23, 25, 26], "decisiontreeclassifi": 23, "decod": [25, 26], "decompos": 24, "decreas": [5, 25], "deduc": 22, "def": [22, 23, 24, 26], "default": [0, 6, 11, 21, 22, 23, 24, 26, 31, 32, 34, 35], "defaultdb": 31, "defin": [21, 22, 23], "del": [24, 31], "del_dataset": [26, 31], "del_dataset_to_us": [26, 31], "del_us": [26, 31], "delet": [1, 26, 31], "delta": [11, 12, 21, 22, 23, 24, 25, 26, 27, 31], "delta_cost": [22, 23, 24, 25, 27], "demand": 37, "demo": 6, "demo_client_notebook_newlibrari": 0, "demonstr": [6, 26, 29], "dep": 0, "depend": [0, 32, 35, 37], "deploi": [0, 5, 9, 32, 33], "deploy": [0, 9, 32, 35, 37], "depth": [22, 23, 25], "describ": [5, 11], "deseri": [9, 11], "deserialis": [0, 11], "detail": [0, 22, 25, 26, 31], "determin": 23, "develop": [0, 9, 22, 23, 24, 25, 26, 27, 35, 37], "develop_mod": [12, 36], "deviat": 24, "df": [11, 22, 24, 27], "df_dummi": [22, 27], "df_flipper": 24, "dict": [0, 11, 21, 24], "dict_kei": 24, "dictionari": [11, 21, 22, 25, 26], "dictionnari": [11, 25], "did": [22, 23, 24, 25], "differ": [0, 2, 6, 9, 11, 22, 23, 24, 25, 26, 27], "differenti": [5, 6, 9, 22, 23, 24, 27], "diffprivlib": [0, 6, 7, 11, 12, 17, 21, 36], "diffprivlib_json": [12, 21, 22, 23], "diffprivlib_logg": 0, "diffprivlib_queri": [7, 11, 22, 23], "diffprivlibcompatibilitywarn": [11, 23], "diffprivlibmodel": [12, 21], "diffprivlip": 11, "dimens": [22, 23, 24], "dimensinn": 23, "direct": 9, "directli": [0, 24, 25, 31, 32], "directori": [2, 34, 35], "disabl": 25, "disabled_dp": 11, "disclaim": 9, "disclosur": [22, 25], "discov": [2, 24, 33], "discrimin": 21, "discriminator_decai": 25, "discriminator_dim": 25, "discriminator_lr": 25, "displai": 22, "dispos": [22, 24], "dist": 1, "distribut": 24, "diverg": 12, "divers": 9, "divid": 24, "do": [0, 2, 5, 8, 22, 23, 24, 25, 31], "doc": [0, 11, 12], "docker": [0, 29, 31, 33, 35], "dockercli": 26, "dockerfil": 35, "document": [0, 1, 9, 11, 22, 23, 24, 25, 33], "doe": [5, 11, 22, 23, 24, 25], "don": [22, 34], "done": [22, 23, 25, 26], "down": 26, "download": 9, "dp": [6, 11, 12, 27], "dp_ctgan": [7, 11, 12, 36], "dp_gan": [7, 11, 12, 36], "dp_librairi": [22, 23, 25], "dp_librari": [0, 12, 17, 36], "dp_logic": [12, 36], "dp_queri": [0, 12, 24, 26, 36], "dp_querier": [0, 12, 36], "dpctgan": [6, 11, 12], "dpgan": [6, 11, 12], "dpl_pipelin": [22, 23], "dplibrari": [0, 7, 11, 12, 36], "dpquerier": 0, "dr": [22, 23, 24, 25, 26], "dream": [22, 23, 24, 25, 26], "drop": [11, 22, 23, 31], "drop_collect": [26, 31], "ds_store_typ": 12, "dscc": [0, 9, 35], "dtc": 23, "due": [5, 11], "dummi": [0, 6, 11, 21], "dummmi": 25, "dummy_dataset": [12, 36], "dummy_nb_row": [11, 12, 21], "dummy_new_library_queri": 0, "dummy_r": [22, 24, 27], "dummy_respons": [22, 23], "dummy_se": [11, 12, 21], "dummy_std": 24, "dummy_synth_df": 22, "dummy_var_r": [22, 27], "dummydiffprivlibmodel": [12, 21], "dummynewlibrarymodel": 0, "dummyopendpmodel": [12, 21], "dummysmartnoisesqlmodel": [12, 21], "dummysmartnoisesynthquerymodel": [12, 21], "dure": [0, 2, 11], "e": [9, 11, 22, 31], "each": [9, 22, 23, 24, 25, 26, 27], "easili": 37, "eco_branch": 26, "edit": 34, "educ": 26, "effect": 22, "effici": [9, 31], "ek": 34, "embark": [26, 27], "embedding_dim": 25, "empti": 26, "en": [9, 12], "enabl": [9, 22, 23, 24, 25, 27], "encount": [11, 23, 27], "end": 11, "endpoint": [0, 22, 23, 24, 25, 27, 31, 35], "endpoint_url": [12, 21, 26, 31], "engin": 26, "enhanc": 9, "enough": [5, 11, 22, 24], "ensembl": 6, "ensur": [0, 9, 11, 22, 23, 24, 26, 32, 35], "entir": 0, "enum": 11, "environ": [0, 2, 9, 22, 23, 24, 25, 27, 31, 35], "epsilon": [11, 12, 21, 22, 23, 24, 25, 26, 27, 31], "epsilon_cost": [22, 23, 24, 25, 27], "equal": [22, 27], "error": [0, 11, 22, 23, 24, 25, 26, 27], "error_handl": [12, 36], "error_messag": [7, 11], "escal": 5, "especi": 34, "establish": 31, "estim": [0, 11, 25], "estimate_diffprivlib_cost": [7, 11, 22, 23], "estimate_new_library_cost": 0, "estimate_opendp_cost": [7, 11, 22, 27], "estimate_smartnoise_cost": 22, "estimate_smartnoise_sql_cost": [7, 11, 22, 24, 27], "estimate_smartnoise_synth_cost": [7, 11, 22, 25], "etc": [0, 2, 9, 29], "even": 22, "event": [0, 2], "everi": [0, 22, 24, 26], "everyth": [22, 24, 26], "exactli": 22, "exampl": [0, 5, 9, 21, 23, 26, 29, 35], "example_config": 26, "example_dummy_new_librari": 0, "example_new_librari": 0, "example_queri": 21, "except": [2, 11, 22, 23], "exec_run": 26, "execresult": 26, "execut": [0, 2, 9, 11, 25, 26, 27, 32], "exisit": 26, "exist": [1, 5, 26, 31], "exit": 26, "expect": [0, 22, 23, 24, 26, 27], "experi": 25, "explain": [0, 22, 23, 24, 25, 26, 29], "explained_variance_": 23, "explained_variance_ratio_": 23, "explan": [0, 24, 25], "explor": [24, 33], "extens": 9, "extern": [5, 9], "externallibraryexcept": [23, 25], "f": [22, 23, 24, 27, 31, 34], "f64": 22, "face": 9, "facilit": [9, 29], "factori": [0, 12, 17, 36], "fail": [0, 5, 22, 27], "failur": 5, "fall": 23, "fals": [11, 21, 22, 23, 24, 25, 26, 27, 31], "familiar": 29, "far": 9, "fare": [26, 27], "fastapi": [0, 9], "featur": [0, 6, 11, 22, 23], "feature_column": [11, 12, 21, 22, 23], "feder": 9, "feedback": 9, "femal": [22, 23, 24, 25, 26, 27], "fetch": 26, "few": [22, 23, 24, 25, 26, 27, 35], "field": [11, 21, 22, 26, 31], "fieldinfo": 21, "file": [0, 9, 12, 31, 34, 35], "filenam": 22, "fill": 23, "final": [22, 23, 24, 25], "find": [6, 24, 37], "fine": 37, "finish": [0, 26], "first": [0, 22, 23, 24, 25, 26, 27, 35], "fit": [23, 25, 33, 34], "fit_intercept": 23, "fix": [0, 5], "fixed_delta": [11, 12, 21, 22], "fixed_smoothed_max_diverg": [12, 36], "flag": [22, 24, 25], "flake8": 0, "flipper": [22, 23], "flipper_length_mm": [22, 23, 24, 25, 26], "flipper_length_respons": 24, "float": [11, 21, 22, 23, 24, 25, 26, 27], "fly": 22, "folder": 0, "follow": [0, 1, 8, 9, 22, 24, 26, 34, 35, 37], "folow": 37, "fonction": 22, "forc": 11, "forest": 22, "forget": [0, 22], "format": [0, 11, 21, 22, 25, 26], "found": [26, 29], "fr": 26, "franc": 37, "frequent": [11, 23], "from": [0, 2, 5, 8, 9, 11, 21, 22, 23, 24, 25, 26, 27, 31], "frostina": 26, "fso": [8, 26], "fso_income_synthet": 26, "fso_income_synthetic_metadata": 26, "full": 23, "func": 26, "function": [0, 8, 9, 11, 22, 23, 25, 26, 27, 31], "function_map": 26, "functionn": [0, 6, 23, 24, 25], "further": [0, 11], "futur": 9, "g": [9, 11, 27], "gan": [6, 11, 12, 36], "gaussian": 24, "gaussiannb": 23, "gave": 22, "gener": [0, 2, 11, 22, 24, 25], "generator_decai": 25, "generator_dim": 25, "generator_lr": 25, "gentoo": [22, 23, 24, 25, 26], "get": [1, 6, 11, 21, 26, 31, 34, 35], "get_arch": [26, 31], "get_bound": [22, 23], "get_collect": [26, 31], "get_dataset": [26, 31], "get_dataset_metadata": [7, 11, 22, 23, 24, 25, 27], "get_dummy_dataset": [7, 11, 22, 27], "get_initial_budget": [7, 11, 22, 27], "get_metadata": [26, 31], "get_pandas_df": 0, "get_previous_queri": [7, 11, 22, 23, 25], "get_queri": 0, "get_remaining_budget": [7, 11, 22, 24, 27], "get_total_spent_budget": [7, 11, 22, 27], "get_us": [26, 31], "get_user_dataset": [26, 31], "getdbdata": [12, 21], "getdummydataset": [12, 21], "git": 35, "github": [1, 2, 6, 9, 12, 22, 23, 29, 35], "githubusercont": 26, "give": [0, 22, 23, 24, 25, 26, 27], "given": [0, 9, 22, 23, 24, 25, 26, 31], "gke": 34, "go": [25, 26, 35], "good": 22, "got": 1, "gramm": 22, "grounbdbreak": [22, 23, 24], "group": 24, "group_bi": 24, "gt": [21, 22, 24, 25, 26], "guess": [22, 23], "guid": [8, 34], "guidanc": 33, "h": [26, 27], "h_0": 24, "h_a": 24, "ha": [9, 11, 22, 23, 24, 25, 26], "hackathon": 9, "had": [22, 26], "hamming_dist": [12, 36], "hammingdist": 12, "handl": [0, 9, 11, 12], "handler": 0, "happen": [5, 22], "harsh": 22, "hasn": 23, "have": [0, 2, 5, 8, 22, 23, 24, 26, 27, 34, 35], "haven": 34, "he": 26, "head": [0, 22, 25, 27], "heard": 26, "helm": [0, 9, 33], "help": [5, 6, 26], "henc": [22, 24, 25], "her": [22, 23, 24, 25, 26, 27], "here": [0, 6, 9, 11, 22, 23, 24, 25, 32, 34], "hesit": 26, "hi": 26, "high": [22, 27], "him": 26, "hold": 26, "home": 9, "how": [0, 6, 9, 22, 23, 24, 25, 26, 29, 31, 33, 35], "howev": [9, 22, 24], "html": [9, 11, 12, 22, 23], "http": [0, 9, 11, 12, 22, 23, 24, 25, 26, 27, 35], "hypothes": 24, "i": [0, 1, 2, 5, 8, 9, 10, 11, 22, 23, 24, 25, 26, 27, 31, 32, 34, 35, 37], "icerbegina": 22, "icergina": [22, 23, 25], "id": 31, "idea": [22, 24], "idna": 22, "ignor": [0, 23], "iloc": [22, 24, 27], "imag": [0, 22, 35], "image_demo_cli": 22, "impact": [22, 24, 27], "implement": [9, 16], "import": [8, 22, 23, 24, 25, 26, 27], "improv": 9, "imput": [11, 23], "imputer_strategi": [11, 12, 21, 22, 23], "in_memory_connector": [12, 36], "includ": [9, 11], "incom": [9, 26], "income_synthetic_data": 26, "incompat": 23, "increas": 24, "inde": 26, "independ": 24, "index": [9, 11, 22], "index_nam": 22, "infer": 11, "info": 26, "inform": [0, 2, 9, 21, 22, 23, 24, 25, 26, 27, 31], "infrastructur": [9, 33], "inherit": 0, "ini": 0, "init": [22, 27], "initi": [8, 11, 24, 26, 27, 31, 37], "initial_delta": [12, 21, 22, 26, 27, 31], "initial_epsilon": [12, 21, 22, 26, 27, 31], "initialis": [6, 8], "inptu": 22, "input": [0, 9, 12, 21, 24], "input_domain": 22, "input_metr": 22, "inse": 37, "insert_delete_dist": [12, 36], "insertdeletedist": 12, "insid": [0, 24, 26, 35], "inspect": 24, "instal": [0, 2, 6, 9, 26, 33, 35], "install_requir": 0, "instanc": [5, 16, 25, 35], "instanti": [22, 27], "instead": [22, 24, 31], "instruct": [8, 22, 31, 33, 34, 35], "int": [11, 21, 26, 27], "int_dist": [12, 36], "integr": [2, 9], "intend": 11, "intent": 26, "interact": [9, 22, 23, 24, 25, 26, 27, 31, 32, 35], "interest": [24, 26], "intern": 5, "intervent": 0, "introduct": 33, "invalid": [5, 27], "invalidqueryexcept": [22, 27], "investig": 26, "io": 22, "ipykernel_1062": 27, "ipynb": 0, "ipython": 22, "iri": 26, "iris_metadata": 26, "irrelev": 24, "island": [22, 23, 24, 25, 26], "issu": [0, 5, 9, 23], "item": 0, "its": [8, 9, 11, 24, 25, 26, 35], "jack": [26, 27], "jax": 25, "jaxlib": 25, "jitter": [12, 36], "joblib": 22, "join": [23, 24, 25], "journ\u00e9": 28, "jupyt": [22, 23, 26, 35], "just": [22, 23, 24, 25, 26, 27], "keep": [6, 22, 26], "kei": [12, 21, 22, 24, 26, 27, 31], "kept": [22, 23, 25], "keycount": 24, "keyword": 11, "kind": 34, "kmean": 23, "kmeanskmean": 23, "know": [22, 24, 25, 27], "kubectl": 34, "kubernet": [9, 29, 33], "l": [26, 27], "l2": 23, "lab": [9, 26], "label": 22, "labeltransform": 25, "lambda": [11, 26], "lancer": 37, "laplac": 24, "laplacian": [22, 27], "last": [24, 25, 26, 35], "last_queri": 25, "later": [10, 26], "latest": 0, "layer": 9, "le": 21, "leak": 23, "leakag": 23, "learn": 33, "len": [22, 26], "length": [6, 23], "let": [0, 25, 26], "level": 24, "lib": [22, 23, 25], "librair": 22, "librairi": [11, 22], "librari": [5, 6, 8, 9, 11, 12, 26], "like": [22, 23, 24, 25, 34], "limit": [22, 23, 24, 25], "linalg": 23, "line": [26, 31, 34], "linearregress": 23, "link": [0, 9, 37], "linter": 0, "linux": 2, "list": [0, 11, 21, 22, 25, 26, 31], "list_synthes": 25, "liter": 21, "literal_ev": 26, "littl": 24, "load": [22, 23], "local": [0, 2, 9, 21, 22, 23, 24, 25, 27, 29, 33, 34], "localhost": [32, 35], "locat": [35, 37], "logger": [12, 22, 36], "logic": [9, 23], "logist": 6, "logisticregress": 23, "loma": [0, 1, 2, 6, 8, 11, 27, 31, 33, 34, 35], "lomas_cli": [0, 3, 4, 8, 9, 22, 23, 24, 25, 27], "lomas_client_dev": 26, "lomas_serv": [0, 2, 3, 11, 22, 23, 24, 25, 27, 30], "lomas_server_dev": 26, "lomas_streamlit_dev": 26, "long": 8, "look": [22, 24, 26], "lord": 26, "loss": [23, 24], "lot": 24, "lower": [22, 23, 24, 25, 26, 27], "lower_bound": [22, 24, 27], "lr": 23, "lru": [12, 36], "lru_cach": 12, "lru_dataset_stor": [12, 36], "lru_dataset_store_max_s": [12, 36], "lrudatasetstor": 16, "lt": [21, 22, 24, 25, 26], "m": 2, "m_db": [26, 31], "m_s3_ak": 31, "m_s3_sak": 31, "m_s3_url": 31, "m_s3b": 31, "m_s3k": 31, "machin": [33, 34, 35], "madam": 26, "made": [0, 22, 23, 24, 25], "mai": [5, 11, 26, 31, 37], "main": [0, 9, 12], "maintain": 35, "make": [0, 2, 21, 22, 23, 24, 26, 27, 29, 34, 35], "make_dummi": [12, 21], "make_gaussian": 11, "make_select_column": [22, 27], "make_split_datafram": [22, 27], "make_zcdp_to_approxdp": 11, "male": [22, 23, 24, 25, 26, 27], "malici": 26, "manag": [9, 22, 23, 25, 26, 29, 31], "mani": 9, "manual": 0, "map": 21, "margin": [11, 12], "mass": [22, 23], "master": [0, 9, 26], "match": [0, 11], "max": 23, "max_contrib": 24, "max_depth": [22, 23], "max_diverg": [12, 36], "max_id": [12, 21, 22, 23, 24, 25, 26, 27], "max_it": 23, "max_memory_usag": 12, "max_model_s": 25, "max_retries_exp_mechan": 25, "maxdiverg": 22, "may_queri": [12, 21, 26], "mbi": 25, "mcfreez": 26, "md": [1, 9], "mea": [22, 27], "mean": [11, 22, 24], "mean_": 23, "measur": [5, 11, 12, 22, 27], "measure_onli": 25, "mechan": [5, 11, 12, 21, 22], "medata": 26, "median": [11, 23], "memori": [0, 12, 16], "merg": 0, "messag": [5, 11, 23, 25, 26], "meta": 26, "metadata": [6, 9, 11, 12, 21, 26, 31, 35], "metadata_access_key_id": 31, "metadata_bucket": 31, "metadata_database_typ": 31, "metadata_endpoint_url": 31, "metadata_kei": 31, "metadata_path": [12, 21, 26, 31], "metadata_secret_access_kei": 31, "metadataofdataset": [12, 21], "metadataofpathdb": [12, 21], "metadataofs3db": [12, 21], "metatada": 31, "method": [0, 12, 16, 23, 26, 32, 33], "metric": [12, 22], "micro": 9, "might": [22, 24, 26, 27], "mind": 26, "minikub": 34, "minio": [26, 35], "miss": [11, 23, 25], "mistak": 22, "mixtureinfer": 25, "ml": 23, "mm": [22, 24], "mod": 12, "mode": [26, 35], "model": [6, 9, 11, 12, 21, 25], "model_computed_field": [12, 21], "model_config": [12, 21], "model_field": [12, 21], "model_input_to_lib": 0, "model_scor": 22, "modifi": [22, 23, 25, 26, 33], "modul": [7, 9, 22, 23, 26, 36], "mondai": 0, "mongo": 26, "mongodata": [26, 35], "mongodb": [2, 5, 9, 12, 29, 35, 36], "mongodb_addr": [12, 36], "mongodb_admin": [2, 26, 36], "mongodb_admin_cli": [26, 31, 36], "mongodb_databas": [12, 36], "mongodb_port": [12, 36], "more": [0, 2, 22, 23, 24, 25, 26], "most": [11, 23, 24, 26], "most_frequ": [11, 23], "mount": 26, "move": 35, "mp": [26, 31], "mr": 26, "mst": [7, 11, 12, 36], "much": [22, 23, 24], "multi": 22, "multipl": [22, 23, 24, 26, 29], "must": [0, 11, 22, 23, 24, 25, 26, 27, 31, 35], "mwaskom": 26, "mwem": [7, 11, 12, 36], "my_own_constraint": 25, "mypi": 0, "n": [22, 23], "n_cluster": 23, "n_compon": 23, "n_components_": 23, "n_estim": [22, 23], "n_job": [22, 23], "name": [0, 8, 9, 11, 12, 21, 22, 23, 24, 25, 26, 27, 31], "name_of_dataset_you_want_to_queri": 8, "nan": [24, 27], "navig": [34, 35], "nb_0": 24, "nb_1": 24, "nb_2": 24, "nb_passeng": 27, "nb_penguin": [22, 24], "nb_row": [11, 22, 23, 24, 27], "nb_sampl": [11, 12, 21, 22, 25], "nbsp": [22, 23], "nbviewer": [22, 23], "necessari": [0, 9], "need": [0, 1, 22, 23, 24, 25, 26, 27, 33, 34, 35, 37], "needi": 25, "network": 35, "never": [0, 5, 9, 22, 23, 24, 25], "new": [0, 22, 26], "new_data_connector": 0, "new_dataset_stor": 0, "new_librari": 0, "new_library_queri": 0, "newdataconnector": 0, "newdatasetstor": 0, "newlibrari": 0, "newlibrarycostmodel": 0, "newlibrarymodel": 0, "newlibraryqueri": 0, "nobodi": 22, "nois": [22, 25, 27], "noise_variance_": 23, "none": [11, 12, 16, 21, 22, 23, 25], "nonetyp": 21, "norm": 23, "normal": 22, "note": [6, 11, 25, 26, 31], "notebook": [0, 6, 22, 23, 24, 25, 26, 29, 35], "noth": 26, "notic": 22, "notifi": 16, "now": [8, 22, 24, 25, 27, 31, 35], "np": [22, 23, 24, 25, 27], "nso": 9, "null": [11, 22, 23, 24], "nullabl": [11, 12, 21, 22, 25], "number": [0, 11, 22, 24, 25, 35], "numpi": [22, 23, 24, 25, 27], "o": [23, 24, 25, 27, 31], "object": [0, 11, 16, 21, 22, 23, 24, 25, 26, 27], "oblivi": 9, "obtain": 22, "occur": 5, "od": [26, 31], "odomet": 24, "off": 0, "offer": [22, 23, 24, 25, 26], "offic": 9, "offici": 34, "ok": 25, "old": 27, "om": [26, 31], "onc": [0, 22, 23, 24, 25, 26, 27, 34, 35, 37], "one": [0, 1, 8, 22, 23, 24, 25, 26, 27, 34], "ones": 26, "onli": [0, 9, 11, 22, 23, 24, 25, 26, 27, 32, 35], "onyxia": [29, 33], "open": [8, 9, 35], "opendp": [0, 5, 6, 7, 9, 11, 12, 17, 21, 36], "opendp_json": [12, 21, 22], "opendp_logg": 0, "opendp_pipelin": [11, 22, 27], "opendp_queri": [7, 11, 22, 27], "opendpdatasetinputmetr": [12, 36], "opendpmeasur": [12, 36], "opendpmodel": [12, 21], "oper": [5, 26], "opportun": 24, "option": [0, 11, 22, 24, 25, 31, 33, 37], "optionn": 27, "optionnali": 22, "order": [0, 22, 26], "org": [9, 11, 12, 22, 23], "origin": [9, 24], "other": [6, 9, 16, 22, 24, 25, 26], "otherwis": [0, 11, 26], "our": [6, 9, 26, 28, 29], "out": [22, 26], "output": [24, 26], "output_measur": 22, "overal": 9, "overrid": 24, "overview": [0, 29], "overwrit": [26, 31], "overwrite_dataset": [26, 31], "overwrite_metadata": [26, 31], "own": [0, 9, 25, 26], "owner": [9, 26, 29, 31], "p": [1, 26, 27], "pac_synth": [7, 11, 12, 36], "packag": [0, 4, 7, 22, 23, 25, 30, 36], "pacsynth": [11, 12, 25], "page": [0, 9, 10, 22, 23, 25, 26], "panda": [11, 22, 23], "panic": 11, "paper": 9, "param": [22, 23], "paramat": 25, "paramet": [0, 5, 6, 8, 11, 22, 23, 24, 26, 27, 31, 37], "parch": [26, 27], "part": [0, 9], "particip": 22, "particularli": [22, 27], "partit": 24, "pass": [0, 11, 26], "passeng": 27, "passengerid": [26, 27], "password": 31, "pate_ctgan": [7, 11, 12, 36], "pate_gan": [7, 11, 12, 36], "patectgan": [6, 11, 12], "pategan": [6, 11, 12], "path": [12, 21, 23, 24, 25, 26, 31, 36], "path_connector": [12, 36], "path_db": [12, 21, 26, 31], "patient": 35, "pca_model": 23, "pcaifittedpca": 23, "pclass": [26, 27], "pd": [11, 22, 23], "penguin": [6, 22, 23, 25, 26], "penguin_metadata": [22, 23, 25, 26], "perform": [0, 23, 24, 26, 31], "permiss": [9, 22], "persist": [26, 35], "pet": 9, "petal_length": 26, "petal_width": 26, "pip": [0, 8, 22, 23, 24, 25, 26, 27], "pipelin": [0, 5, 11, 25, 27], "pipelineifittedpipelin": [22, 23], "place": [0, 26], "platform": [9, 22, 23, 24, 29, 37], "pleas": [0, 2, 9, 10, 11, 22, 23, 25, 35], "png": 22, "point": 9, "port": [12, 26, 31], "possibl": [0, 2, 12, 22, 23, 24, 25, 27, 31], "post": 24, "post0": 22, "postprocess": [11, 12, 21], "potenti": [9, 24, 25], "power": 22, "pr": 0, "practic": [6, 22], "pre": 12, "predefin": 0, "predict": [11, 22, 23], "prepar": [0, 9, 23, 24, 25, 31], "prerequisit": 33, "present": [8, 22, 28], "previou": [0, 11, 22, 26, 27, 31], "previous": [22, 23, 24, 25], "previous_queri": [22, 23, 25], "primari": [9, 24], "print": [22, 24, 26, 27, 31], "prior": 23, "prioriti": 9, "privaci": [0, 5, 9, 11, 23, 24], "privacyleakwarn": [11, 23], "privat": [6, 9, 11, 12, 23, 24], "private_id": [12, 36], "private_rewrit": 24, "privatedatabasetyp": [12, 21, 36], "problem": 22, "proce": 34, "process": [0, 1, 9, 12, 22, 23, 24, 25, 27, 34, 35, 37], "profess": 26, "project": [0, 9, 22, 23, 24, 25, 37], "promis": 22, "proof": 9, "properli": [22, 24], "proport": 11, "protect": [9, 23], "provid": [8, 9, 11, 22, 23, 24, 25, 26, 27, 29, 31, 33, 34, 35], "pseudo": 25, "public": [22, 23, 25], "publish": 0, "pull": [0, 2, 35], "purpos": 26, "push": [0, 2], "put": 24, "py": [0, 1, 23, 25, 26, 27, 31], "pydant": [0, 21], "pylint": 0, "pylintrc": 0, "pymongo": 5, "pypa": 22, "pypi": 9, "pypi_token": 1, "pyproject": 0, "python": [1, 2, 8, 12, 22, 26, 31], "python3": [22, 23, 25], "pytorch": 25, "pytz": 22, "q": [26, 27], "quail": 11, "qualiti": 0, "qualnam": [11, 12], "queen": [22, 23, 25], "queri": [0, 5, 6, 9, 11, 12, 21, 31], "querier": 0, "querier_factori": 0, "queries_arch": 31, "query_1": 23, "query_2": 23, "query_3": 23, "query_exampl": [0, 12, 36], "query_model": [0, 12, 36], "query_respons": [22, 23, 24, 25, 27], "query_str": [12, 21, 22], "quit": 0, "r": 12, "rais": [11, 23, 26], "random": [11, 22, 25], "random_st": [11, 22, 23], "randomforestclassifi": [22, 23], "randomforestclassifierrandomforestclassifi": 22, "randomli": 22, "randomst": 11, "rang": 22, "raw": 26, "re": [8, 11, 22, 23, 24, 25, 26], "readi": [22, 23, 24, 25, 26], "readili": 0, "readm": [1, 9], "real": [0, 23, 25], "realli": [22, 24], "reasearch": 9, "reason": [5, 22, 23, 24], "rebas": 0, "receiv": 25, "recent": 26, "recommend": 22, "reduc": [23, 24], "refer": [0, 2, 9, 11], "reg_bill_length_queri": 22, "regard": 9, "region": 26, "regist": [22, 23, 24, 25, 27], "regress": 6, "reject": 24, "relat": [9, 24], "releas": 22, "relev": [5, 11, 22], "reli": [0, 35], "reliabl": 25, "remain": [0, 9, 11, 24, 27], "remaining_delta": [22, 24, 27], "remaining_epsilon": [22, 24, 27], "remot": [9, 22, 23, 24, 25], "remov": 23, "render": [22, 23], "replac": [11, 21, 23, 26], "repo": 0, "report": 9, "repositori": [6, 9, 29, 35], "repres": [11, 22, 24, 25], "represent": [22, 23], "reproduc": 22, "request": [0, 2, 5, 9, 11, 22, 23, 24, 25, 27], "requested_bi": [22, 23, 25], "requir": [0, 2, 8, 9, 21, 22, 24, 25, 26, 31, 33, 34, 37], "rerun": [22, 23], "res_0": 24, "res_1": 24, "res_cost": [22, 25], "res_dummi": [22, 25], "research": [22, 23, 24, 25, 26, 27], "resolv": 23, "respect": [22, 25], "respons": [5, 9, 11, 22, 23, 24, 25, 26, 27], "rest": [9, 22, 26], "restart": 35, "result": [0, 11, 22, 23, 24, 25, 26, 27], "retriev": [11, 24, 26], "return": [0, 11, 22, 23, 24, 25, 26, 27], "return_model": [11, 12, 21, 22, 25], "reveal": 26, "rewrit": 24, "rf": [22, 23], "right": 5, "risk": 24, "rng": 25, "root": [22, 23, 24, 25, 27], "round": [22, 24, 27], "rout": [0, 12, 36], "routes_admin": [12, 36], "routes_dp": [0, 12, 36], "row": [11, 22, 23, 24, 25], "row_privaci": [12, 21, 22, 23, 24, 25, 26, 27], "run": [0, 1, 2, 8, 22, 24, 25, 26, 32, 34, 35], "run_basic_test": 2, "run_command": 26, "run_lint": 0, "run_tests_and_converag": 2, "runtim": 37, "runtime_arg": [12, 36], "runtimewarn": 27, "rust": [11, 12], "s3": [6, 9, 12, 21, 31, 36], "s3_ak": 31, "s3_connector": [12, 36], "s3_db": [12, 21, 26, 31], "s3_sak": 31, "s3_url": 31, "s3b": 31, "s3k": 31, "safeguard": [22, 27], "sai": 0, "same": [22, 23, 24, 25, 26, 35], "sampl": [11, 24, 25], "sample_r": 25, "satisfi": [22, 37], "save": [24, 34], "scale": [22, 23, 27], "scaler": 23, "scenario": 6, "schema": 26, "scienc": 9, "scientist": 9, "scikit": 22, "scipi": 22, "scope": 26, "score": [22, 23], "script": [0, 2, 26], "sdist": 1, "seaborn": 26, "seamless": [9, 22, 23, 24, 25, 27], "seamlessli": 0, "search": 9, "second": [24, 26], "secret": 31, "secret_access_kei": [12, 21, 31], "section": [0, 6, 9, 29, 31], "secur": [0, 9, 11, 22, 23, 24, 25, 26, 27], "see": [0, 6, 9, 11, 12, 24, 26, 28], "seed": [11, 22, 23, 27], "seem": [23, 24], "seen": [22, 23, 25, 27], "select": [11, 22, 24, 25, 27, 37], "select_col": [11, 12, 21, 22, 25], "semver": 0, "send": [0, 11, 22, 23, 24, 25, 27], "sens": 23, "sensit": [9, 11], "sent": [9, 22], "sepal_length": 26, "sepal_width": 26, "separ": [22, 27], "serial": 9, "serialis": [0, 11], "serv": 9, "server": [0, 3, 5, 11, 12, 22, 23, 24, 25, 27, 31, 32, 33, 34, 35, 36, 37], "server_contain": 26, "servic": [9, 26, 33, 35, 37], "session": 26, "set": [0, 8, 11, 12, 22, 23, 24, 25, 26, 31, 32, 34, 35, 36, 37], "set_budget_field": [26, 31], "set_may_queri": [26, 31], "setosa": 26, "setup": [0, 1, 8, 32], "setuptool": 22, "sever": [0, 34], "sex": [22, 23, 24, 25, 26, 27], "sh": [0, 2], "sha": 0, "shape": [22, 27], "share": 9, "she": [22, 24, 25], "short": [0, 9], "should": [0, 5, 21, 22, 23, 24, 26, 27, 35], "show": [22, 23, 26, 31, 34], "showcas": [22, 23, 24, 25, 26], "shown": 31, "shuffl": [22, 23, 25], "sibsp": [26, 27], "side": [6, 9], "signific": 24, "similar": 22, "simpl": 2, "simpli": [0, 32], "simplifi": [32, 34], "sinc": 35, "singl": 22, "singular_values_": 23, "site": [22, 23, 25], "six": 22, "size": [22, 27], "sklearn": [11, 22, 23], "slightli": [22, 27], "small": [22, 27], "smallest": 23, "smarnois": 21, "smarntois": 25, "smartnois": [0, 5, 6, 11, 12, 26], "smartnoise_queri": 22, "smartnoise_sql": [7, 11, 12, 17, 22, 36], "smartnoise_sql_queri": [7, 11, 22, 24, 27], "smartnoise_synth": [0, 7, 11, 12, 17, 22, 25, 36], "smartnoise_synth_logg": 0, "smartnoise_synth_queri": [7, 11, 22, 25], "smartnoisesql": [9, 22, 25, 26, 27], "smartnoisesqlcostmodel": [12, 21], "smartnoisesqlmodel": [12, 21], "smartnoisesynth": 12, "smartnoisesynthcostmodel": [12, 21], "smartnoisesynthquerymodel": [12, 21], "smoothed_max_diverg": [12, 36], "smoothedmaxdiverg": 11, "snsql": 24, "snsql_metadata": 24, "snsynth": 25, "snsynth_default_symples_nb": 11, "so": [2, 9, 16, 22, 23, 24, 25, 26, 35], "solut": 22, "some": [0, 6, 11, 22, 23, 24, 25, 29, 35], "someon": 24, "sourc": [11, 12, 16, 21, 24], "space": 26, "speci": [22, 23, 24, 25, 26], "special": 25, "specif": [0, 5, 9, 22, 25, 26, 34, 37], "specifi": [11, 23, 24, 25, 26, 31], "specifii": 25, "spend": [22, 24], "spent": [11, 22, 24, 27], "spent_budget": [22, 23], "spent_delta": [22, 23, 25], "spent_epsilon": [22, 23, 25], "split": [9, 11, 23, 26], "spread": 23, "sql": [5, 6, 11, 21, 25], "sqrt": [22, 23, 24, 27], "src": 12, "sspcloud": 26, "ssynthcolumntyp": [12, 36], "ssynthgansynthes": [7, 11, 12, 21, 36], "ssynthmarginalsynthes": [7, 11, 12, 21, 36], "ssynthtabletransstyl": [12, 36], "stabl": [0, 12], "stai": [9, 26], "stall": [12, 36], "standard": [2, 22, 23, 24, 27], "standard_error": [22, 24, 27], "standardscal": [11, 23], "start": [0, 9, 11, 12, 22, 24, 25, 31, 35, 37], "startup": 5, "state": [9, 26, 35], "static": 0, "statist": [6, 9, 22], "statistiqu": 28, "statu": [11, 22, 23, 25, 27], "std": 24, "std_0": 24, "std_1": 24, "std_2": 24, "std_bill_length": 24, "std_bill_length_mm": 24, "std_bl": 24, "step": [0, 1, 6, 11, 26, 33, 34, 37], "still": [9, 10, 22], "stop": [25, 31], "storag": 26, "store": [9, 22, 23, 24, 25, 26, 27, 31], "str": [11, 12, 21, 22, 27], "strategi": 11, "streamlin": 0, "streamlit": [26, 31, 35], "strenum": [0, 11, 12], "string": [11, 22, 23, 24, 25, 26, 27], "strip": 26, "strongli": 9, "studi": 24, "style": [0, 12], "sub": 24, "subcommand": 26, "submit_limit": [12, 36], "submodul": [7, 36], "subpackag": 36, "subqueri": 24, "subscrib": 16, "subsequ": 0, "subset": [22, 25], "substarct": [22, 27], "successfulli": 34, "suffici": 5, "suggest": 9, "suiss": 28, "suit": 33, "sum": 24, "sum_alias_0xde09": 24, "sum_alias_0xxxx": 24, "sum_bill_length_mm": 24, "sum_float": 24, "summari": 22, "support": 11, "suppress": 23, "sure": [0, 2, 26, 27, 34, 35], "surviv": [26, 27], "svd_solver": 23, "swiss": 9, "sy": [23, 24, 25], "sym": 24, "symbol": 24, "symmetric_dist": [12, 36], "symmetricdist": [12, 22], "syntax": 24, "synth": [0, 6, 11, 12, 21], "synth_df": 22, "synth_mean": 22, "synth_nam": [11, 12, 21, 22, 25], "synth_param": [11, 12, 21, 22, 25], "synth_vari": 22, "synthes": [11, 12, 25], "synthet": [6, 11], "system": [22, 25, 35], "sysynth_queri": 22, "t": [22, 23, 24, 26, 34], "t_01": 24, "t_02": 24, "t_12": 24, "t_test": 24, "tabl": [0, 11, 26], "tabular": 6, "tag": 0, "tail": 24, "take": [0, 9, 35], "target": 11, "target_column": [11, 12, 21, 22, 23], "task": [0, 9, 29, 31], "teacher": 6, "team": 5, "tear": 26, "term": 25, "termin": [8, 26, 35], "test": [0, 1, 9, 11, 12, 22, 23, 26, 36], "test_api": [12, 36], "test_api_diffprivlib": [12, 36], "test_api_smartnoise_synth": [12, 36], "test_config": 2, "test_dummy_gener": [12, 36], "test_mongodb_admin": [12, 36], "test_mongodb_admin_cli": [12, 36], "test_new_librari": 0, "test_siz": [11, 12, 21, 22, 23], "test_train_split_se": [11, 12, 21, 22, 23], "text": 11, "than": [22, 27], "thank": 22, "thei": [0, 5, 9, 16, 22, 23, 24, 25, 26], "them": [0, 22, 23, 24, 26], "then_cast_default": [22, 27], "then_clamp": [22, 27], "then_laplac": [22, 27], "then_res": [22, 27], "then_vari": [22, 27], "therefor": [22, 23, 25, 26, 27], "thi": [0, 1, 5, 6, 8, 9, 10, 11, 16, 21, 22, 24, 25, 26, 27, 29, 31, 32, 33, 34, 35, 37], "those": [0, 2, 11, 25, 37], "though": 32, "threadpoolctl": 22, "three": [0, 11, 22, 24], "through": [26, 34, 35], "thu": 9, "ticket": [26, 27], "time": [0, 12, 22, 23, 24, 25, 35], "time_attack": [12, 36], "timeattackmethod": [12, 36], "timestamp": [22, 23, 25], "tip": 24, "titan": [6, 26, 35], "titanic_metadata": [26, 27], "tmp": 27, "to_dict": 26, "toa": [22, 27], "token": [1, 24], "tol": 23, "tolist": 27, "toml": 0, "tool": [0, 24, 29, 34], "torgersen": [22, 23, 24, 25, 26], "total": [11, 16, 22, 24, 26, 27], "total_spent_delta": [12, 21, 22, 26, 27], "total_spent_epsilon": [12, 21, 22, 26, 27], "traceback": 26, "train": [6, 11, 25], "tran": [22, 27], "transform": [0, 11, 12, 22, 25, 27], "translat": 24, "treat": 11, "tree": 9, "tri": [5, 22, 24, 25], "trigger": [0, 5], "true": [11, 21, 22, 23, 24, 25, 26, 27, 31, 32], "trust": [22, 23], "try": [10, 22, 23, 25], "tune": 37, "twice": 24, "twine": 1, "two": [9, 22, 24, 25], "txt": 0, "type": [0, 11, 12, 22, 23, 24, 25, 26, 27, 31], "typic": 9, "tzdata": 22, "u": [1, 9, 26, 27, 31], "u32": 12, "un": 9, "unabl": [22, 23], "unavail": 11, "under": [9, 10, 11], "understand": [6, 23, 25], "understood": [22, 25], "uneth": 26, "unfortunatelli": 25, "union": [11, 21], "unittest": 2, "unknown": 11, "unless": 26, "until": [24, 26], "up": [0, 1, 26, 34, 35], "updat": [0, 1, 9, 16, 22, 24, 26], "update_memory_usag": [12, 16], "upgrad": 22, "upload": 1, "upper": [22, 23, 24, 25, 26, 27], "upper_bound": [22, 24, 27], "url": [8, 11, 22, 23, 24, 25, 27, 31], "urllib3": 22, "us": [0, 2, 6, 8, 9, 11, 12, 16, 26, 27, 29, 31, 32, 33, 34, 35], "usag": [8, 16, 26], "user": [5, 9, 11, 12, 21, 22, 23, 24, 25, 27, 29, 32, 35], "user_collect": 26, "user_nam": [8, 11, 12, 21, 22, 23, 24, 25, 26, 27], "user_pwd": 31, "usercollect": [12, 21], "usernam": 31, "userwarn": 25, "usr": [22, 23, 25], "usual": 9, "utf": 26, "util": [0, 5, 7, 9, 12, 17, 23, 25, 26, 36], "uvicorn_serv": [26, 36], "v": 31, "v1": 21, "valid": [0, 11, 25], "validate_synthes": [7, 11], "valu": [0, 5, 11, 12, 22, 23, 24, 25, 26, 27, 31, 32, 33], "valuabl": 9, "valueerror": [11, 26], "vanilla": 25, "var": 22, "var_ag": 27, "var_age_transformation_pipelin": 27, "var_bill_length": 22, "var_bill_length_measurement_pipelin": 22, "var_bill_length_queri": 22, "var_r": [22, 27], "var_smooth": 23, "vari": 32, "variabl": [22, 32], "varianc": [22, 27], "variat": 24, "variou": [6, 22, 23, 24, 25, 29, 31, 33], "venv": [2, 22], "verbos": [22, 23], "veri": [22, 24, 25], "verifi": [0, 1, 23, 24, 25], "versicolor": 26, "version": [0, 10, 22, 23, 24, 25], "versu": 23, "via": [0, 1, 9, 22, 23, 24, 25, 27, 29], "virginica": 26, "virtual": 22, "visibl": [22, 23, 24, 25], "visualis": 31, "volum": [31, 35], "vx": 0, "wa": [9, 22, 25, 26, 27], "wai": 24, "wait": 26, "want": [22, 23, 24, 25, 26, 27], "warm_start": [22, 23], "warn": [0, 11, 22, 23, 25], "wast": 22, "we": [0, 9, 16, 22, 23, 24, 25, 26, 27, 29, 34], "web": 35, "welcom": 9, "well": [0, 9], "were": 22, "what": [0, 5, 11, 22, 23, 24, 25, 27], "when": [0, 5, 16, 22, 32], "where": [22, 25, 26, 31, 35], "whether": 11, "which": [0, 5, 9, 22, 23, 24, 25, 26, 27], "while": [5, 9, 23], "white": 9, "whole": 22, "why": [5, 23, 24], "width": 22, "wip_xx": 0, "wish": 1, "with_mean": 23, "with_std": 23, "within": [5, 9, 22, 23, 31, 37], "without": [2, 5, 22, 24, 25, 26], "won": [22, 26], "work": [2, 11, 22, 23, 24, 25], "workflow": [1, 2, 25], "worri": 22, "would": [22, 23, 24, 25], "wrapper_decor": 26, "write": [5, 22, 24], "writeconcernerror": 5, "written": 26, "wrong": 23, "www": 9, "x": [0, 22, 27], "x27": [22, 23], "x_to_predict": [22, 23], "xx": 0, "y": 0, "yaml": [0, 2, 12, 26, 31, 32, 33, 36], "yaml_databas": [12, 36], "yaml_fil": 31, "ye": 0, "year": 27, "yet": [26, 34], "yf": [26, 31], "yml": 0, "you": [0, 6, 8, 26, 32, 33, 34, 35, 37], "your": [0, 8, 26, 32, 33, 34, 35, 37], "your_deployement_url": 8, "your_nam": 8, "yourself": 29, "z": 0, "zero_concentrated_diverg": [12, 36], "zeroconcentrateddiverg": 11, "zscore": [22, 24, 27]}, "titles": ["Notes for Contributors", "Notes for Client Contributors", "Notes for Server Contributors", "API Documentation", "Client API", "Errors", "Examples", "lomas_client", "Quickstart", "Lomas: The Data Oases Hidden Behind the Mist.", "Welcome to Lomas documentation", "lomas_client package", "lomas_server package", "lomas_server.admin_database package", "lomas_server.administration package", "lomas_server.data_connector package", "lomas_server.dataset_store package", "lomas_server.dp_queries package", "lomas_server.dp_queries.dp_libraries package", "lomas_server.routes package", "lomas_server.tests package", "lomas_server.utils package", "Lomas: Client demo", "Lomas Client Side: Using DiffPrivlib", "Lomas Client Side: Using Smartnoise-SQL", "Lomas Client Side: Using Smartnoise-Synth", "Lomas-server: CLI administration", "S3 example", "Poster", "Administration", "Server API", "CLI", "Dashboard", "Deployment", "Kubernetes", "Local", "lomas_server", "Onyxia"], "titleterms": {"1": [22, 23, 24, 25, 27], "2": [22, 23, 24, 25, 27], "3": [22, 23, 24, 25, 27], "4": [22, 23, 24, 27], "5": 23, "6": [23, 25], "The": 9, "access": [26, 32, 34], "ad": 0, "adapt": 25, "add": 26, "addit": 22, "admin_databas": 13, "administr": [14, 26, 29, 31], "advanc": 24, "ag": 27, "aggreg": 25, "aim": 25, "all": [25, 26], "analys": 22, "anti_timing_att": 21, "api": [3, 4, 30], "app": 12, "archiv": [22, 23, 25, 26], "associ": 23, "averag": [22, 24, 27], "b": 22, "basic_dataset_stor": 16, "bay": 23, "behind": 9, "bill": [22, 24], "branch": 0, "budget": [22, 24, 26, 27], "c": 22, "can": [23, 26], "chang": 26, "chart": 34, "check": [0, 22], "classif": 23, "classifi": 23, "cli": [26, 31], "client": [1, 4, 8, 9, 11, 22, 23, 24, 25, 27], "cluster": 23, "collect": 31, "collection_model": 21, "comput": 22, "condit": 25, "confid": [22, 24, 27], "config": 21, "connect": 31, "connector": 0, "constant": [12, 20], "content": [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "contributor": [0, 1, 2], "cost": [22, 23, 24, 27], "creat": [25, 26], "current": [22, 27], "d": 22, "dashboard": 32, "data": [0, 9, 22], "data_connector": 15, "data_connector_observ": 16, "databas": [0, 26], "dataset": [0, 22, 23, 24, 25, 26, 27, 31], "dataset_stor": 16, "decis": 23, "default": 25, "demo": 22, "deploi": [34, 35, 37], "deploy": 33, "descript": 9, "detail": 9, "differenti": 25, "diffprivlib": [18, 22, 23], "dimension": 23, "direcli": 26, "do": 26, "docker": [26, 32], "document": [3, 10], "dp": [0, 22, 24], "dp_librari": 18, "dp_logic": 17, "dp_queri": [17, 18], "dp_querier": 17, "dpctgan": 25, "dpgan": 25, "drop": 26, "dummi": [22, 23, 24, 25, 27], "dummy_dataset": 17, "ensembl": 25, "error": 5, "error_handl": 21, "estim": [22, 23, 24, 27], "exampl": [6, 27, 31], "execut": 22, "exponenti": 25, "extern": 0, "externallibraryexcept": 5, "factori": [13, 15, 16, 18], "file": 26, "final": 26, "first": 8, "flipper": 24, "fom": 26, "forest": 23, "functionn": [22, 27], "gan": 25, "gaussian": 23, "get": [22, 23, 24, 25, 27], "git": 0, "github": 0, "helm": 34, "hidden": 9, "histori": 9, "hypothesi": 24, "in_memory_connector": 15, "indic": 9, "ingress": 34, "initi": 22, "initialis": [22, 23, 24, 25, 27], "instal": [8, 22, 23, 24, 25, 27, 34], "internalserverexcept": 5, "interv": [22, 24, 27], "introduct": 37, "invalidqueryexcept": 5, "iter": 25, "k": 23, "keep": 25, "kubernet": [32, 34], "learn": 22, "length": [22, 24], "librari": [0, 22, 23, 24, 25, 27], "linear": [22, 23], "lint": 0, "load": 26, "local": [32, 35], "logger": [0, 21], "logist": 23, "loma": [9, 10, 22, 23, 24, 25, 26, 37], "lomas_cli": [7, 11], "lomas_serv": [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 36], "loss": 22, "lru_dataset_stor": 16, "machin": 22, "maximum": 25, "mean": 23, "mechan": [24, 25], "metadata": [22, 23, 24, 25, 27], "mist": 9, "model": [22, 23], "modifi": 34, "modul": [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "mongodb": [26, 31], "mongodb_admin": 12, "mongodb_admin_cli": 12, "mongodb_databas": 13, "mst": 25, "multipl": 25, "mwem": 25, "naiv": 23, "new": 1, "note": [0, 1, 2, 24], "now": [23, 26], "number": 27, "oas": 9, "onyxia": [32, 37], "opendp": [18, 22, 27], "option": 26, "other": [0, 23], "over": [24, 27], "overid": 24, "overview": [9, 31], "packag": [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], "paramet": 25, "patectgan": [22, 25], "pategan": 25, "path_connector": 15, "pca": 23, "penguin": 24, "pipelin": [22, 23], "platform": 32, "popul": [24, 27], "poster": 28, "postprocess": [22, 24], "prepar": [22, 26], "prerequisit": [34, 35], "privaci": 22, "privat": [0, 22, 25, 27], "provaci": 22, "push": 1, "pypi": 1, "queri": [22, 23, 24, 25, 26, 27], "query_exampl": 21, "query_model": 21, "quickstart": 8, "random": 23, "real": [22, 24, 27], "reduct": 23, "regress": [22, 23], "releas": 0, "remain": 22, "remot": 27, "remov": 26, "risk": 22, "rout": 19, "routes_admin": 19, "routes_dp": 19, "row": 27, "s3": 27, "s3_connector": 15, "section": 34, "see": [22, 23, 25], "sensit": 22, "server": [2, 9, 26, 30], "servic": 34, "she": 23, "side": [23, 24, 25], "smartnois": [22, 24, 25, 27], "smartnoise_sql": 18, "smartnoise_synth": 18, "span": 25, "sql": [22, 24, 27], "start": [23, 26], "statist": [24, 27], "step": [8, 22, 23, 24, 25, 27, 35], "stop": 26, "store": 0, "submodul": [11, 12, 13, 15, 16, 17, 18, 19, 20, 21], "subpackag": [12, 17], "synth": [22, 25], "synthes": 22, "synthet": [22, 25], "tabl": 9, "tabular": 25, "teacher": 25, "technic": 9, "test": [2, 20, 24], "test_api": 20, "test_api_diffprivlib": 20, "test_api_smartnoise_synth": 20, "test_dummy_gener": 20, "test_mongodb_admin": 20, "test_mongodb_admin_cli": 20, "thi": 23, "titan": 27, "train": [22, 23], "tree": [23, 25], "tri": 23, "unauthorizedaccessexcept": 5, "understand": [22, 27], "us": [22, 23, 24, 25], "user": [26, 31], "util": [11, 13, 18, 19, 21], "uvicorn_serv": 12, "valu": 34, "variou": 0, "verifi": 22, "version": 1, "via": 32, "visualis": 26, "volum": 26, "weight": 25, "welcom": 10, "whole": [24, 27], "workflow": 0, "write": 23, "yaml": 34, "yaml_databas": 13, "\u03b4": 22, "\u03b5": 22}}) \ No newline at end of file diff --git a/html/server_administration.html b/html/server_administration.html index fafb9165..ba15315c 100644 --- a/html/server_administration.html +++ b/html/server_administration.html @@ -189,7 +189,7 @@

                      Administrationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/server_api.html b/html/server_api.html index 463afb88..71ffcf5b 100644 --- a/html/server_api.html +++ b/html/server_api.html @@ -174,7 +174,7 @@

                      Server APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/server_cli.html b/html/server_cli.html index a2c8ffa4..45a0710c 100644 --- a/html/server_cli.html +++ b/html/server_cli.html @@ -420,7 +420,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/server_dashboard.html b/html/server_dashboard.html index 7dc8cbe8..1d4f9e18 100644 --- a/html/server_dashboard.html +++ b/html/server_dashboard.html @@ -185,7 +185,7 @@

                      Access via Onyxia Platformv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/server_deployment.html b/html/server_deployment.html index 366927dc..ea0fc5ef 100644 --- a/html/server_deployment.html +++ b/html/server_deployment.html @@ -205,7 +205,7 @@

                      Deploymentv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/server_kubernetes.html b/html/server_kubernetes.html index 21a63362..56281861 100644 --- a/html/server_kubernetes.html +++ b/html/server_kubernetes.html @@ -244,7 +244,7 @@

                      Installing the Helm Chartv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/server_local.html b/html/server_local.html index da0b7627..8a0fb600 100644 --- a/html/server_local.html +++ b/html/server_local.html @@ -223,7 +223,7 @@

                      Steps to Deploy Locallyv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/server_modules.html b/html/server_modules.html index b8727e6b..7c8cba1c 100644 --- a/html/server_modules.html +++ b/html/server_modules.html @@ -350,7 +350,7 @@

                      lomas_serverv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/server_onyxia.html b/html/server_onyxia.html index 2793b0c4..9f13ce1f 100644 --- a/html/server_onyxia.html +++ b/html/server_onyxia.html @@ -199,7 +199,7 @@

                      Deploying Lomas on Onyxiav0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/CONTRIBUTING.html b/html/v0.1.0/en/CONTRIBUTING.html index 05d5515c..68bd9859 100644 --- a/html/v0.1.0/en/CONTRIBUTING.html +++ b/html/v0.1.0/en/CONTRIBUTING.html @@ -283,7 +283,7 @@

                      Release Workflowv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/CONTRIBUTING_CLIENT.html b/html/v0.1.0/en/CONTRIBUTING_CLIENT.html index 4ee56ee5..e33fef4c 100644 --- a/html/v0.1.0/en/CONTRIBUTING_CLIENT.html +++ b/html/v0.1.0/en/CONTRIBUTING_CLIENT.html @@ -168,7 +168,7 @@

                      Pushing a new version to Pypiv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/CONTRIBUTING_SERVER.html b/html/v0.1.0/en/CONTRIBUTING_SERVER.html index c6c37abe..8eab5ecf 100644 --- a/html/v0.1.0/en/CONTRIBUTING_SERVER.html +++ b/html/v0.1.0/en/CONTRIBUTING_SERVER.html @@ -201,7 +201,7 @@

                      Testsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/index.html b/html/v0.1.0/en/_modules/index.html index 0e83cb19..ca71d940 100644 --- a/html/v0.1.0/en/_modules/index.html +++ b/html/v0.1.0/en/_modules/index.html @@ -170,7 +170,7 @@

                      All modules for which code is available

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_client/client.html b/html/v0.1.0/en/_modules/lomas_client/client.html index 603e8ac5..106ec7bd 100644 --- a/html/v0.1.0/en/_modules/lomas_client/client.html +++ b/html/v0.1.0/en/_modules/lomas_client/client.html @@ -620,7 +620,7 @@

                      Source code for lomas_client.client

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/admin_database/admin_database.html b/html/v0.1.0/en/_modules/lomas_server/admin_database/admin_database.html index 43c1d0f5..7e8da0c4 100644 --- a/html/v0.1.0/en/_modules/lomas_server/admin_database/admin_database.html +++ b/html/v0.1.0/en/_modules/lomas_server/admin_database/admin_database.html @@ -686,7 +686,7 @@

                      Source code for lomas_server.admin_database.admin_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/admin_database/mongodb_database.html b/html/v0.1.0/en/_modules/lomas_server/admin_database/mongodb_database.html index c0dece88..9c825460 100644 --- a/html/v0.1.0/en/_modules/lomas_server/admin_database/mongodb_database.html +++ b/html/v0.1.0/en/_modules/lomas_server/admin_database/mongodb_database.html @@ -462,7 +462,7 @@

                      Source code for lomas_server.admin_database.mongodb_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/admin_database/utils.html b/html/v0.1.0/en/_modules/lomas_server/admin_database/utils.html index c95c03b6..65d925e0 100644 --- a/html/v0.1.0/en/_modules/lomas_server/admin_database/utils.html +++ b/html/v0.1.0/en/_modules/lomas_server/admin_database/utils.html @@ -236,7 +236,7 @@

                      Source code for lomas_server.admin_database.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/admin_database/yaml_database.html b/html/v0.1.0/en/_modules/lomas_server/admin_database/yaml_database.html index 36bc873d..d8696334 100644 --- a/html/v0.1.0/en/_modules/lomas_server/admin_database/yaml_database.html +++ b/html/v0.1.0/en/_modules/lomas_server/admin_database/yaml_database.html @@ -454,7 +454,7 @@

                      Source code for lomas_server.admin_database.yaml_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/app.html b/html/v0.1.0/en/_modules/lomas_server/app.html index fb92300f..ac0ffeee 100644 --- a/html/v0.1.0/en/_modules/lomas_server/app.html +++ b/html/v0.1.0/en/_modules/lomas_server/app.html @@ -1087,7 +1087,7 @@

                      Source code for lomas_server.app

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/constants.html b/html/v0.1.0/en/_modules/lomas_server/constants.html index ed340811..28ed68d5 100644 --- a/html/v0.1.0/en/_modules/lomas_server/constants.html +++ b/html/v0.1.0/en/_modules/lomas_server/constants.html @@ -301,7 +301,7 @@

                      Source code for lomas_server.constants

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/dataset_store/basic_dataset_store.html b/html/v0.1.0/en/_modules/lomas_server/dataset_store/basic_dataset_store.html index 518e5d2d..94dff715 100644 --- a/html/v0.1.0/en/_modules/lomas_server/dataset_store/basic_dataset_store.html +++ b/html/v0.1.0/en/_modules/lomas_server/dataset_store/basic_dataset_store.html @@ -222,7 +222,7 @@

                      Source code for lomas_server.dataset_store.basic_dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/dataset_store/dataset_store.html b/html/v0.1.0/en/_modules/lomas_server/dataset_store/dataset_store.html index ac1f66b6..23bc1354 100644 --- a/html/v0.1.0/en/_modules/lomas_server/dataset_store/dataset_store.html +++ b/html/v0.1.0/en/_modules/lomas_server/dataset_store/dataset_store.html @@ -193,7 +193,7 @@

                      Source code for lomas_server.dataset_store.dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/dataset_store/lru_dataset_store.html b/html/v0.1.0/en/_modules/lomas_server/dataset_store/lru_dataset_store.html index 41413f31..c197911c 100644 --- a/html/v0.1.0/en/_modules/lomas_server/dataset_store/lru_dataset_store.html +++ b/html/v0.1.0/en/_modules/lomas_server/dataset_store/lru_dataset_store.html @@ -268,7 +268,7 @@

                      Source code for lomas_server.dataset_store.lru_dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html index 1af8853c..3549957a 100644 --- a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html +++ b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html @@ -412,7 +412,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.opendp

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html index 27355093..ffd2288e 100644 --- a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html +++ b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html @@ -307,7 +307,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.smartnoise_sql

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html index dfa4f64b..6c8b0e13 100644 --- a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html +++ b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html @@ -180,7 +180,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_logic.html b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_logic.html index 4f0b9c43..3cc52293 100644 --- a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_logic.html +++ b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_logic.html @@ -358,7 +358,7 @@

                      Source code for lomas_server.dp_queries.dp_logic

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_querier.html b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_querier.html index 45648c3b..b2c7b622 100644 --- a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_querier.html +++ b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dp_querier.html @@ -205,7 +205,7 @@

                      Source code for lomas_server.dp_queries.dp_querier

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dummy_dataset.html b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dummy_dataset.html index 1190cd6d..7aeceb29 100644 --- a/html/v0.1.0/en/_modules/lomas_server/dp_queries/dummy_dataset.html +++ b/html/v0.1.0/en/_modules/lomas_server/dp_queries/dummy_dataset.html @@ -303,7 +303,7 @@

                      Source code for lomas_server.dp_queries.dummy_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/mongodb_admin.html b/html/v0.1.0/en/_modules/lomas_server/mongodb_admin.html index 96d920d3..a94c8b6e 100644 --- a/html/v0.1.0/en/_modules/lomas_server/mongodb_admin.html +++ b/html/v0.1.0/en/_modules/lomas_server/mongodb_admin.html @@ -1076,7 +1076,7 @@

                      Source code for lomas_server.mongodb_admin

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/private_dataset/in_memory_dataset.html b/html/v0.1.0/en/_modules/lomas_server/private_dataset/in_memory_dataset.html index d8d9afa2..8a509d98 100644 --- a/html/v0.1.0/en/_modules/lomas_server/private_dataset/in_memory_dataset.html +++ b/html/v0.1.0/en/_modules/lomas_server/private_dataset/in_memory_dataset.html @@ -186,7 +186,7 @@

                      Source code for lomas_server.private_dataset.in_memory_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/private_dataset/path_dataset.html b/html/v0.1.0/en/_modules/lomas_server/private_dataset/path_dataset.html index c7f2b750..04754491 100644 --- a/html/v0.1.0/en/_modules/lomas_server/private_dataset/path_dataset.html +++ b/html/v0.1.0/en/_modules/lomas_server/private_dataset/path_dataset.html @@ -211,7 +211,7 @@

                      Source code for lomas_server.private_dataset.path_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/private_dataset/private_dataset.html b/html/v0.1.0/en/_modules/lomas_server/private_dataset/private_dataset.html index aec1b214..153cdad9 100644 --- a/html/v0.1.0/en/_modules/lomas_server/private_dataset/private_dataset.html +++ b/html/v0.1.0/en/_modules/lomas_server/private_dataset/private_dataset.html @@ -242,7 +242,7 @@

                      Source code for lomas_server.private_dataset.private_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/private_dataset/s3_dataset.html b/html/v0.1.0/en/_modules/lomas_server/private_dataset/s3_dataset.html index 97b65b9c..0fa6823b 100644 --- a/html/v0.1.0/en/_modules/lomas_server/private_dataset/s3_dataset.html +++ b/html/v0.1.0/en/_modules/lomas_server/private_dataset/s3_dataset.html @@ -214,7 +214,7 @@

                      Source code for lomas_server.private_dataset.s3_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/private_dataset/utils.html b/html/v0.1.0/en/_modules/lomas_server/private_dataset/utils.html index a2e82b82..0f3d05fa 100644 --- a/html/v0.1.0/en/_modules/lomas_server/private_dataset/utils.html +++ b/html/v0.1.0/en/_modules/lomas_server/private_dataset/utils.html @@ -213,7 +213,7 @@

                      Source code for lomas_server.private_dataset.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/tests/test_dummy_generation.html b/html/v0.1.0/en/_modules/lomas_server/tests/test_dummy_generation.html index f0a20cf3..2e39f0f6 100644 --- a/html/v0.1.0/en/_modules/lomas_server/tests/test_dummy_generation.html +++ b/html/v0.1.0/en/_modules/lomas_server/tests/test_dummy_generation.html @@ -337,7 +337,7 @@

                      Source code for lomas_server.tests.test_dummy_generation

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/utils/anti_timing_att.html b/html/v0.1.0/en/_modules/lomas_server/utils/anti_timing_att.html index c6676bd2..47db8c0f 100644 --- a/html/v0.1.0/en/_modules/lomas_server/utils/anti_timing_att.html +++ b/html/v0.1.0/en/_modules/lomas_server/utils/anti_timing_att.html @@ -199,7 +199,7 @@

                      Source code for lomas_server.utils.anti_timing_att

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/utils/config.html b/html/v0.1.0/en/_modules/lomas_server/utils/config.html index d40d7996..304a9750 100644 --- a/html/v0.1.0/en/_modules/lomas_server/utils/config.html +++ b/html/v0.1.0/en/_modules/lomas_server/utils/config.html @@ -481,7 +481,7 @@

                      Source code for lomas_server.utils.config

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/_modules/lomas_server/utils/error_handler.html b/html/v0.1.0/en/_modules/lomas_server/utils/error_handler.html index d13c88fa..fa67f099 100644 --- a/html/v0.1.0/en/_modules/lomas_server/utils/error_handler.html +++ b/html/v0.1.0/en/_modules/lomas_server/utils/error_handler.html @@ -284,7 +284,7 @@

                      Source code for lomas_server.utils.error_handler

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/api.html b/html/v0.1.0/en/api.html index d365889c..ddeecd78 100644 --- a/html/v0.1.0/en/api.html +++ b/html/v0.1.0/en/api.html @@ -169,7 +169,7 @@

                      API Documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/client_api.html b/html/v0.1.0/en/client_api.html index 7fffad76..6ab94448 100644 --- a/html/v0.1.0/en/client_api.html +++ b/html/v0.1.0/en/client_api.html @@ -169,7 +169,7 @@

                      Client APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/client_errors.html b/html/v0.1.0/en/client_errors.html index 53f3b88e..6ca6d4e8 100644 --- a/html/v0.1.0/en/client_errors.html +++ b/html/v0.1.0/en/client_errors.html @@ -211,7 +211,7 @@

                      Errors<
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/client_examples.html b/html/v0.1.0/en/client_examples.html index 194f32b3..bc2a6ff0 100644 --- a/html/v0.1.0/en/client_examples.html +++ b/html/v0.1.0/en/client_examples.html @@ -183,7 +183,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/client_modules.html b/html/v0.1.0/en/client_modules.html index 265e64e7..49b92ba8 100644 --- a/html/v0.1.0/en/client_modules.html +++ b/html/v0.1.0/en/client_modules.html @@ -197,7 +197,7 @@

                      lomas_clientv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/client_quickstart.html b/html/v0.1.0/en/client_quickstart.html index 32667b24..c7e8ad9d 100644 --- a/html/v0.1.0/en/client_quickstart.html +++ b/html/v0.1.0/en/client_quickstart.html @@ -202,7 +202,7 @@

                      First stepsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/genindex.html b/html/v0.1.0/en/genindex.html index 4d43030a..7530eb6d 100644 --- a/html/v0.1.0/en/genindex.html +++ b/html/v0.1.0/en/genindex.html @@ -1339,7 +1339,7 @@

                      Z

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/index.html b/html/v0.1.0/en/index.html index dfd1f1ea..a8e23c48 100644 --- a/html/v0.1.0/en/index.html +++ b/html/v0.1.0/en/index.html @@ -226,7 +226,7 @@

                      Indices and tablesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/index_under_construction.html b/html/v0.1.0/en/index_under_construction.html index 21b085a9..90c937f3 100644 --- a/html/v0.1.0/en/index_under_construction.html +++ b/html/v0.1.0/en/index_under_construction.html @@ -149,7 +149,7 @@

                      Welcome to Lomas documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_client.html b/html/v0.1.0/en/lomas_client.html index 36230170..9327f0c3 100644 --- a/html/v0.1.0/en/lomas_client.html +++ b/html/v0.1.0/en/lomas_client.html @@ -431,7 +431,7 @@

                      lomas_client.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.admin_database.html b/html/v0.1.0/en/lomas_server.admin_database.html index 66aee4af..20518bf7 100644 --- a/html/v0.1.0/en/lomas_server.admin_database.html +++ b/html/v0.1.0/en/lomas_server.admin_database.html @@ -1161,7 +1161,7 @@

                      lomas_server.admin_database.factory modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.administration.html b/html/v0.1.0/en/lomas_server.administration.html index aad79bfd..03f45079 100644 --- a/html/v0.1.0/en/lomas_server.administration.html +++ b/html/v0.1.0/en/lomas_server.administration.html @@ -170,7 +170,7 @@

                      lomas_server.administration packagev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.data_connector.html b/html/v0.1.0/en/lomas_server.data_connector.html index 7e4d351e..7749d420 100644 --- a/html/v0.1.0/en/lomas_server.data_connector.html +++ b/html/v0.1.0/en/lomas_server.data_connector.html @@ -188,7 +188,7 @@

                      lomas_server.data_connector.s3_connector modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.dataset_store.html b/html/v0.1.0/en/lomas_server.dataset_store.html index 348b032c..207795d0 100644 --- a/html/v0.1.0/en/lomas_server.dataset_store.html +++ b/html/v0.1.0/en/lomas_server.dataset_store.html @@ -304,7 +304,7 @@

                      lomas_server.dataset_store.factory modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.dp_queries.dp_libraries.html b/html/v0.1.0/en/lomas_server.dp_queries.dp_libraries.html index f29e7584..6e9a2c74 100644 --- a/html/v0.1.0/en/lomas_server.dp_queries.dp_libraries.html +++ b/html/v0.1.0/en/lomas_server.dp_queries.dp_libraries.html @@ -436,7 +436,7 @@

                      lomas_server.dp_queries.dp_libraries.smartnoise_synth modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.dp_queries.html b/html/v0.1.0/en/lomas_server.dp_queries.html index 14b7fcce..8ac356d0 100644 --- a/html/v0.1.0/en/lomas_server.dp_queries.html +++ b/html/v0.1.0/en/lomas_server.dp_queries.html @@ -404,7 +404,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.html b/html/v0.1.0/en/lomas_server.html index 6bcee8c5..618b35c6 100644 --- a/html/v0.1.0/en/lomas_server.html +++ b/html/v0.1.0/en/lomas_server.html @@ -1829,7 +1829,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.private_dataset.html b/html/v0.1.0/en/lomas_server.private_dataset.html index 93d9eb67..f5d25d8a 100644 --- a/html/v0.1.0/en/lomas_server.private_dataset.html +++ b/html/v0.1.0/en/lomas_server.private_dataset.html @@ -333,7 +333,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.routes.html b/html/v0.1.0/en/lomas_server.routes.html index b13efe10..d2f494b4 100644 --- a/html/v0.1.0/en/lomas_server.routes.html +++ b/html/v0.1.0/en/lomas_server.routes.html @@ -182,7 +182,7 @@

                      lomas_server.routes.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.tests.html b/html/v0.1.0/en/lomas_server.tests.html index 392066fe..85088c0b 100644 --- a/html/v0.1.0/en/lomas_server.tests.html +++ b/html/v0.1.0/en/lomas_server.tests.html @@ -241,7 +241,7 @@

                      lomas_server.tests.test_mongodb_admin_cli modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/lomas_server.utils.html b/html/v0.1.0/en/lomas_server.utils.html index 3614481b..998f2430 100644 --- a/html/v0.1.0/en/lomas_server.utils.html +++ b/html/v0.1.0/en/lomas_server.utils.html @@ -738,7 +738,7 @@

                      lomas_server.utils.query_models modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/notebooks/Demo_Client_Notebook.html b/html/v0.1.0/en/notebooks/Demo_Client_Notebook.html index 77f47870..cedc50c9 100644 --- a/html/v0.1.0/en/notebooks/Demo_Client_Notebook.html +++ b/html/v0.1.0/en/notebooks/Demo_Client_Notebook.html @@ -1124,7 +1124,7 @@

                      Step 5: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html b/html/v0.1.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html index bae6862d..86cafced 100644 --- a/html/v0.1.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html +++ b/html/v0.1.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html @@ -2477,7 +2477,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html b/html/v0.1.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html index a31d6b6f..4748b2d7 100644 --- a/html/v0.1.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html +++ b/html/v0.1.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html @@ -1171,7 +1171,7 @@

                      Hypothesis testingv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html b/html/v0.1.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html index 93906465..c2d12e8e 100644 --- a/html/v0.1.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html +++ b/html/v0.1.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html @@ -2033,7 +2033,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/notebooks/local_admin_notebook.html b/html/v0.1.0/en/notebooks/local_admin_notebook.html index 2a9bd9d7..268bb943 100644 --- a/html/v0.1.0/en/notebooks/local_admin_notebook.html +++ b/html/v0.1.0/en/notebooks/local_admin_notebook.html @@ -1455,7 +1455,7 @@

                      Stop the server: do not do it now !v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/notebooks/s3_example_notebook.html b/html/v0.1.0/en/notebooks/s3_example_notebook.html index a97fb811..f4f9928a 100644 --- a/html/v0.1.0/en/notebooks/s3_example_notebook.html +++ b/html/v0.1.0/en/notebooks/s3_example_notebook.html @@ -903,7 +903,7 @@

                      Confidence intervals for age over the whole populationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/objects.inv b/html/v0.1.0/en/objects.inv index beae7104..93c346b5 100644 Binary files a/html/v0.1.0/en/objects.inv and b/html/v0.1.0/en/objects.inv differ diff --git a/html/v0.1.0/en/py-modindex.html b/html/v0.1.0/en/py-modindex.html index 6d360a83..15508fdd 100644 --- a/html/v0.1.0/en/py-modindex.html +++ b/html/v0.1.0/en/py-modindex.html @@ -365,7 +365,7 @@

                      Python Module Index

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/search.html b/html/v0.1.0/en/search.html index 2da2931e..c22e6aae 100644 --- a/html/v0.1.0/en/search.html +++ b/html/v0.1.0/en/search.html @@ -157,7 +157,7 @@
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/server_administration.html b/html/v0.1.0/en/server_administration.html index 9a42ea7e..56431675 100644 --- a/html/v0.1.0/en/server_administration.html +++ b/html/v0.1.0/en/server_administration.html @@ -184,7 +184,7 @@

                      Administrationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/server_api.html b/html/v0.1.0/en/server_api.html index f71ff646..ede1528a 100644 --- a/html/v0.1.0/en/server_api.html +++ b/html/v0.1.0/en/server_api.html @@ -169,7 +169,7 @@

                      Server APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/server_cli.html b/html/v0.1.0/en/server_cli.html index e3a60857..f87fcc58 100644 --- a/html/v0.1.0/en/server_cli.html +++ b/html/v0.1.0/en/server_cli.html @@ -415,7 +415,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/server_dashboard.html b/html/v0.1.0/en/server_dashboard.html index 761bf2a9..8530afbf 100644 --- a/html/v0.1.0/en/server_dashboard.html +++ b/html/v0.1.0/en/server_dashboard.html @@ -180,7 +180,7 @@

                      Access via Onyxia Platformv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/server_deployment.html b/html/v0.1.0/en/server_deployment.html index 99fd28d7..e69ad63c 100644 --- a/html/v0.1.0/en/server_deployment.html +++ b/html/v0.1.0/en/server_deployment.html @@ -200,7 +200,7 @@

                      Deploymentv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/server_kubernetes.html b/html/v0.1.0/en/server_kubernetes.html index d3314de9..3baac5e9 100644 --- a/html/v0.1.0/en/server_kubernetes.html +++ b/html/v0.1.0/en/server_kubernetes.html @@ -239,7 +239,7 @@

                      Installing the Helm Chartv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/server_local.html b/html/v0.1.0/en/server_local.html index 0cc95394..854c4506 100644 --- a/html/v0.1.0/en/server_local.html +++ b/html/v0.1.0/en/server_local.html @@ -208,7 +208,7 @@

                      Steps to Deploy Locallyv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/server_modules.html b/html/v0.1.0/en/server_modules.html index 67a3077b..fe47d4ff 100644 --- a/html/v0.1.0/en/server_modules.html +++ b/html/v0.1.0/en/server_modules.html @@ -361,7 +361,7 @@

                      lomas_serverv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.0/en/server_onyxia.html b/html/v0.1.0/en/server_onyxia.html index 498fe918..1e2327dd 100644 --- a/html/v0.1.0/en/server_onyxia.html +++ b/html/v0.1.0/en/server_onyxia.html @@ -194,7 +194,7 @@

                      Deploying Lomas on Onyxiav0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/CONTRIBUTING.html b/html/v0.1.1/en/CONTRIBUTING.html index 83b6ee8e..ca6f40b7 100644 --- a/html/v0.1.1/en/CONTRIBUTING.html +++ b/html/v0.1.1/en/CONTRIBUTING.html @@ -283,7 +283,7 @@

                      Release Workflowv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/CONTRIBUTING_CLIENT.html b/html/v0.1.1/en/CONTRIBUTING_CLIENT.html index e9872bb8..b4083aec 100644 --- a/html/v0.1.1/en/CONTRIBUTING_CLIENT.html +++ b/html/v0.1.1/en/CONTRIBUTING_CLIENT.html @@ -168,7 +168,7 @@

                      Pushing a new version to Pypiv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/CONTRIBUTING_SERVER.html b/html/v0.1.1/en/CONTRIBUTING_SERVER.html index 1ae7261d..b08f8589 100644 --- a/html/v0.1.1/en/CONTRIBUTING_SERVER.html +++ b/html/v0.1.1/en/CONTRIBUTING_SERVER.html @@ -162,7 +162,7 @@

                      Testsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/index.html b/html/v0.1.1/en/_modules/index.html index 0e8e4349..ae468094 100644 --- a/html/v0.1.1/en/_modules/index.html +++ b/html/v0.1.1/en/_modules/index.html @@ -170,7 +170,7 @@

                      All modules for which code is available

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_client/client.html b/html/v0.1.1/en/_modules/lomas_client/client.html index 88653415..49bb5fc3 100644 --- a/html/v0.1.1/en/_modules/lomas_client/client.html +++ b/html/v0.1.1/en/_modules/lomas_client/client.html @@ -620,7 +620,7 @@

                      Source code for lomas_client.client

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/admin_database/admin_database.html b/html/v0.1.1/en/_modules/lomas_server/admin_database/admin_database.html index 5f65faea..5cb5d104 100644 --- a/html/v0.1.1/en/_modules/lomas_server/admin_database/admin_database.html +++ b/html/v0.1.1/en/_modules/lomas_server/admin_database/admin_database.html @@ -686,7 +686,7 @@

                      Source code for lomas_server.admin_database.admin_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/admin_database/mongodb_database.html b/html/v0.1.1/en/_modules/lomas_server/admin_database/mongodb_database.html index cacf4315..cebaf389 100644 --- a/html/v0.1.1/en/_modules/lomas_server/admin_database/mongodb_database.html +++ b/html/v0.1.1/en/_modules/lomas_server/admin_database/mongodb_database.html @@ -462,7 +462,7 @@

                      Source code for lomas_server.admin_database.mongodb_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/admin_database/utils.html b/html/v0.1.1/en/_modules/lomas_server/admin_database/utils.html index 734318f4..091eac34 100644 --- a/html/v0.1.1/en/_modules/lomas_server/admin_database/utils.html +++ b/html/v0.1.1/en/_modules/lomas_server/admin_database/utils.html @@ -236,7 +236,7 @@

                      Source code for lomas_server.admin_database.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/admin_database/yaml_database.html b/html/v0.1.1/en/_modules/lomas_server/admin_database/yaml_database.html index 2d84ae61..aecb8245 100644 --- a/html/v0.1.1/en/_modules/lomas_server/admin_database/yaml_database.html +++ b/html/v0.1.1/en/_modules/lomas_server/admin_database/yaml_database.html @@ -454,7 +454,7 @@

                      Source code for lomas_server.admin_database.yaml_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/app.html b/html/v0.1.1/en/_modules/lomas_server/app.html index e8be604d..79c4047e 100644 --- a/html/v0.1.1/en/_modules/lomas_server/app.html +++ b/html/v0.1.1/en/_modules/lomas_server/app.html @@ -1087,7 +1087,7 @@

                      Source code for lomas_server.app

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/constants.html b/html/v0.1.1/en/_modules/lomas_server/constants.html index dbcdc74f..37240bfb 100644 --- a/html/v0.1.1/en/_modules/lomas_server/constants.html +++ b/html/v0.1.1/en/_modules/lomas_server/constants.html @@ -301,7 +301,7 @@

                      Source code for lomas_server.constants

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/dataset_store/basic_dataset_store.html b/html/v0.1.1/en/_modules/lomas_server/dataset_store/basic_dataset_store.html index f799504e..64c27c4d 100644 --- a/html/v0.1.1/en/_modules/lomas_server/dataset_store/basic_dataset_store.html +++ b/html/v0.1.1/en/_modules/lomas_server/dataset_store/basic_dataset_store.html @@ -222,7 +222,7 @@

                      Source code for lomas_server.dataset_store.basic_dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/dataset_store/dataset_store.html b/html/v0.1.1/en/_modules/lomas_server/dataset_store/dataset_store.html index f95a0176..4ea6cf18 100644 --- a/html/v0.1.1/en/_modules/lomas_server/dataset_store/dataset_store.html +++ b/html/v0.1.1/en/_modules/lomas_server/dataset_store/dataset_store.html @@ -193,7 +193,7 @@

                      Source code for lomas_server.dataset_store.dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/dataset_store/lru_dataset_store.html b/html/v0.1.1/en/_modules/lomas_server/dataset_store/lru_dataset_store.html index 5b118c4a..5f126fe8 100644 --- a/html/v0.1.1/en/_modules/lomas_server/dataset_store/lru_dataset_store.html +++ b/html/v0.1.1/en/_modules/lomas_server/dataset_store/lru_dataset_store.html @@ -268,7 +268,7 @@

                      Source code for lomas_server.dataset_store.lru_dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html index 632cd89b..242138bf 100644 --- a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html +++ b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html @@ -412,7 +412,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.opendp

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html index 8c5036aa..50b64f57 100644 --- a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html +++ b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html @@ -307,7 +307,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.smartnoise_sql

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html index 7d83d3cc..b0e72737 100644 --- a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html +++ b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html @@ -180,7 +180,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_logic.html b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_logic.html index 5c5614da..5529708f 100644 --- a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_logic.html +++ b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_logic.html @@ -358,7 +358,7 @@

                      Source code for lomas_server.dp_queries.dp_logic

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_querier.html b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_querier.html index 35bde88d..7e913d6c 100644 --- a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_querier.html +++ b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dp_querier.html @@ -205,7 +205,7 @@

                      Source code for lomas_server.dp_queries.dp_querier

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dummy_dataset.html b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dummy_dataset.html index f36233c2..c79835dd 100644 --- a/html/v0.1.1/en/_modules/lomas_server/dp_queries/dummy_dataset.html +++ b/html/v0.1.1/en/_modules/lomas_server/dp_queries/dummy_dataset.html @@ -303,7 +303,7 @@

                      Source code for lomas_server.dp_queries.dummy_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/mongodb_admin.html b/html/v0.1.1/en/_modules/lomas_server/mongodb_admin.html index cbfefc47..845aa577 100644 --- a/html/v0.1.1/en/_modules/lomas_server/mongodb_admin.html +++ b/html/v0.1.1/en/_modules/lomas_server/mongodb_admin.html @@ -1076,7 +1076,7 @@

                      Source code for lomas_server.mongodb_admin

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/private_dataset/in_memory_dataset.html b/html/v0.1.1/en/_modules/lomas_server/private_dataset/in_memory_dataset.html index e68c593d..4b0dbb96 100644 --- a/html/v0.1.1/en/_modules/lomas_server/private_dataset/in_memory_dataset.html +++ b/html/v0.1.1/en/_modules/lomas_server/private_dataset/in_memory_dataset.html @@ -186,7 +186,7 @@

                      Source code for lomas_server.private_dataset.in_memory_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/private_dataset/path_dataset.html b/html/v0.1.1/en/_modules/lomas_server/private_dataset/path_dataset.html index c1780308..2c547279 100644 --- a/html/v0.1.1/en/_modules/lomas_server/private_dataset/path_dataset.html +++ b/html/v0.1.1/en/_modules/lomas_server/private_dataset/path_dataset.html @@ -211,7 +211,7 @@

                      Source code for lomas_server.private_dataset.path_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/private_dataset/private_dataset.html b/html/v0.1.1/en/_modules/lomas_server/private_dataset/private_dataset.html index cfa4d5d9..78cd97af 100644 --- a/html/v0.1.1/en/_modules/lomas_server/private_dataset/private_dataset.html +++ b/html/v0.1.1/en/_modules/lomas_server/private_dataset/private_dataset.html @@ -242,7 +242,7 @@

                      Source code for lomas_server.private_dataset.private_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/private_dataset/s3_dataset.html b/html/v0.1.1/en/_modules/lomas_server/private_dataset/s3_dataset.html index 4a6bc87e..1478e32a 100644 --- a/html/v0.1.1/en/_modules/lomas_server/private_dataset/s3_dataset.html +++ b/html/v0.1.1/en/_modules/lomas_server/private_dataset/s3_dataset.html @@ -214,7 +214,7 @@

                      Source code for lomas_server.private_dataset.s3_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/private_dataset/utils.html b/html/v0.1.1/en/_modules/lomas_server/private_dataset/utils.html index c3fe6157..0bb6af6a 100644 --- a/html/v0.1.1/en/_modules/lomas_server/private_dataset/utils.html +++ b/html/v0.1.1/en/_modules/lomas_server/private_dataset/utils.html @@ -213,7 +213,7 @@

                      Source code for lomas_server.private_dataset.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/tests/test_dummy_generation.html b/html/v0.1.1/en/_modules/lomas_server/tests/test_dummy_generation.html index 8fe4a752..1462759b 100644 --- a/html/v0.1.1/en/_modules/lomas_server/tests/test_dummy_generation.html +++ b/html/v0.1.1/en/_modules/lomas_server/tests/test_dummy_generation.html @@ -337,7 +337,7 @@

                      Source code for lomas_server.tests.test_dummy_generation

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/utils/anti_timing_att.html b/html/v0.1.1/en/_modules/lomas_server/utils/anti_timing_att.html index 4ca8490e..3177e669 100644 --- a/html/v0.1.1/en/_modules/lomas_server/utils/anti_timing_att.html +++ b/html/v0.1.1/en/_modules/lomas_server/utils/anti_timing_att.html @@ -199,7 +199,7 @@

                      Source code for lomas_server.utils.anti_timing_att

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/utils/config.html b/html/v0.1.1/en/_modules/lomas_server/utils/config.html index b12a1583..ee43bde3 100644 --- a/html/v0.1.1/en/_modules/lomas_server/utils/config.html +++ b/html/v0.1.1/en/_modules/lomas_server/utils/config.html @@ -481,7 +481,7 @@

                      Source code for lomas_server.utils.config

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/_modules/lomas_server/utils/error_handler.html b/html/v0.1.1/en/_modules/lomas_server/utils/error_handler.html index 93ea0b55..95067bb4 100644 --- a/html/v0.1.1/en/_modules/lomas_server/utils/error_handler.html +++ b/html/v0.1.1/en/_modules/lomas_server/utils/error_handler.html @@ -284,7 +284,7 @@

                      Source code for lomas_server.utils.error_handler

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/api.html b/html/v0.1.1/en/api.html index 6982b455..a3cb05a5 100644 --- a/html/v0.1.1/en/api.html +++ b/html/v0.1.1/en/api.html @@ -169,7 +169,7 @@

                      API Documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/client_api.html b/html/v0.1.1/en/client_api.html index 83eeaa17..6874e6bc 100644 --- a/html/v0.1.1/en/client_api.html +++ b/html/v0.1.1/en/client_api.html @@ -169,7 +169,7 @@

                      Client APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/client_errors.html b/html/v0.1.1/en/client_errors.html index cf8be572..b3234a08 100644 --- a/html/v0.1.1/en/client_errors.html +++ b/html/v0.1.1/en/client_errors.html @@ -211,7 +211,7 @@

                      Errors<
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/client_examples.html b/html/v0.1.1/en/client_examples.html index cbb6124b..ad44c001 100644 --- a/html/v0.1.1/en/client_examples.html +++ b/html/v0.1.1/en/client_examples.html @@ -183,7 +183,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/client_modules.html b/html/v0.1.1/en/client_modules.html index 527acaf7..fe446a7c 100644 --- a/html/v0.1.1/en/client_modules.html +++ b/html/v0.1.1/en/client_modules.html @@ -197,7 +197,7 @@

                      lomas_clientv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/client_quickstart.html b/html/v0.1.1/en/client_quickstart.html index ec16a338..100754a4 100644 --- a/html/v0.1.1/en/client_quickstart.html +++ b/html/v0.1.1/en/client_quickstart.html @@ -202,7 +202,7 @@

                      First stepsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/genindex.html b/html/v0.1.1/en/genindex.html index e6481016..03151a6a 100644 --- a/html/v0.1.1/en/genindex.html +++ b/html/v0.1.1/en/genindex.html @@ -1339,7 +1339,7 @@

                      Z

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/index.html b/html/v0.1.1/en/index.html index 82c94a3d..b030657a 100644 --- a/html/v0.1.1/en/index.html +++ b/html/v0.1.1/en/index.html @@ -226,7 +226,7 @@

                      Indices and tablesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/index_under_construction.html b/html/v0.1.1/en/index_under_construction.html index 0d448d3d..a6281702 100644 --- a/html/v0.1.1/en/index_under_construction.html +++ b/html/v0.1.1/en/index_under_construction.html @@ -149,7 +149,7 @@

                      Welcome to Lomas documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_client.html b/html/v0.1.1/en/lomas_client.html index 41d744f2..a101af98 100644 --- a/html/v0.1.1/en/lomas_client.html +++ b/html/v0.1.1/en/lomas_client.html @@ -431,7 +431,7 @@

                      lomas_client.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.admin_database.html b/html/v0.1.1/en/lomas_server.admin_database.html index a0300c20..1497998a 100644 --- a/html/v0.1.1/en/lomas_server.admin_database.html +++ b/html/v0.1.1/en/lomas_server.admin_database.html @@ -1161,7 +1161,7 @@

                      lomas_server.admin_database.factory modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.administration.html b/html/v0.1.1/en/lomas_server.administration.html index 3a668991..2f728b5b 100644 --- a/html/v0.1.1/en/lomas_server.administration.html +++ b/html/v0.1.1/en/lomas_server.administration.html @@ -170,7 +170,7 @@

                      lomas_server.administration packagev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.data_connector.html b/html/v0.1.1/en/lomas_server.data_connector.html index ebd4a3ba..658847a0 100644 --- a/html/v0.1.1/en/lomas_server.data_connector.html +++ b/html/v0.1.1/en/lomas_server.data_connector.html @@ -188,7 +188,7 @@

                      lomas_server.data_connector.s3_connector modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.dataset_store.html b/html/v0.1.1/en/lomas_server.dataset_store.html index 7f247d56..9a265d45 100644 --- a/html/v0.1.1/en/lomas_server.dataset_store.html +++ b/html/v0.1.1/en/lomas_server.dataset_store.html @@ -304,7 +304,7 @@

                      lomas_server.dataset_store.factory modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.dp_queries.dp_libraries.html b/html/v0.1.1/en/lomas_server.dp_queries.dp_libraries.html index d6b0882a..e302db35 100644 --- a/html/v0.1.1/en/lomas_server.dp_queries.dp_libraries.html +++ b/html/v0.1.1/en/lomas_server.dp_queries.dp_libraries.html @@ -436,7 +436,7 @@

                      lomas_server.dp_queries.dp_libraries.smartnoise_synth modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.dp_queries.html b/html/v0.1.1/en/lomas_server.dp_queries.html index a4d48c13..6c31d8b2 100644 --- a/html/v0.1.1/en/lomas_server.dp_queries.html +++ b/html/v0.1.1/en/lomas_server.dp_queries.html @@ -404,7 +404,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.html b/html/v0.1.1/en/lomas_server.html index 2f104b50..6ccf0c53 100644 --- a/html/v0.1.1/en/lomas_server.html +++ b/html/v0.1.1/en/lomas_server.html @@ -1829,7 +1829,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.private_dataset.html b/html/v0.1.1/en/lomas_server.private_dataset.html index 38e343c8..23782342 100644 --- a/html/v0.1.1/en/lomas_server.private_dataset.html +++ b/html/v0.1.1/en/lomas_server.private_dataset.html @@ -333,7 +333,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.routes.html b/html/v0.1.1/en/lomas_server.routes.html index 783acc16..906d66a8 100644 --- a/html/v0.1.1/en/lomas_server.routes.html +++ b/html/v0.1.1/en/lomas_server.routes.html @@ -182,7 +182,7 @@

                      lomas_server.routes.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.tests.html b/html/v0.1.1/en/lomas_server.tests.html index f9f9b5bc..1241afd6 100644 --- a/html/v0.1.1/en/lomas_server.tests.html +++ b/html/v0.1.1/en/lomas_server.tests.html @@ -241,7 +241,7 @@

                      lomas_server.tests.test_mongodb_admin_cli modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/lomas_server.utils.html b/html/v0.1.1/en/lomas_server.utils.html index 456c7d2d..f0210a85 100644 --- a/html/v0.1.1/en/lomas_server.utils.html +++ b/html/v0.1.1/en/lomas_server.utils.html @@ -738,7 +738,7 @@

                      lomas_server.utils.query_models modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/notebooks/Demo_Client_Notebook.html b/html/v0.1.1/en/notebooks/Demo_Client_Notebook.html index 4d338405..893a787d 100644 --- a/html/v0.1.1/en/notebooks/Demo_Client_Notebook.html +++ b/html/v0.1.1/en/notebooks/Demo_Client_Notebook.html @@ -1124,7 +1124,7 @@

                      Step 5: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html b/html/v0.1.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html index 40ada534..05cb981c 100644 --- a/html/v0.1.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html +++ b/html/v0.1.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html @@ -2477,7 +2477,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html b/html/v0.1.1/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html index a55ca5c5..cd3dbab2 100644 --- a/html/v0.1.1/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html +++ b/html/v0.1.1/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html @@ -1171,7 +1171,7 @@

                      Hypothesis testingv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html b/html/v0.1.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html index fb531094..9c3d38c9 100644 --- a/html/v0.1.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html +++ b/html/v0.1.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html @@ -2033,7 +2033,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/notebooks/local_admin_notebook.html b/html/v0.1.1/en/notebooks/local_admin_notebook.html index c42993a9..cd33c3d4 100644 --- a/html/v0.1.1/en/notebooks/local_admin_notebook.html +++ b/html/v0.1.1/en/notebooks/local_admin_notebook.html @@ -1455,7 +1455,7 @@

                      Stop the server: do not do it now !v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/notebooks/s3_example_notebook.html b/html/v0.1.1/en/notebooks/s3_example_notebook.html index 3ef89da3..e788ea8e 100644 --- a/html/v0.1.1/en/notebooks/s3_example_notebook.html +++ b/html/v0.1.1/en/notebooks/s3_example_notebook.html @@ -903,7 +903,7 @@

                      Confidence intervals for age over the whole populationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/objects.inv b/html/v0.1.1/en/objects.inv index ee92ab81..c658699a 100644 Binary files a/html/v0.1.1/en/objects.inv and b/html/v0.1.1/en/objects.inv differ diff --git a/html/v0.1.1/en/py-modindex.html b/html/v0.1.1/en/py-modindex.html index 4cbfbdb2..cf5b0b49 100644 --- a/html/v0.1.1/en/py-modindex.html +++ b/html/v0.1.1/en/py-modindex.html @@ -365,7 +365,7 @@

                      Python Module Index

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/search.html b/html/v0.1.1/en/search.html index 27482363..aa46879a 100644 --- a/html/v0.1.1/en/search.html +++ b/html/v0.1.1/en/search.html @@ -157,7 +157,7 @@
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/server_administration.html b/html/v0.1.1/en/server_administration.html index e8561174..73b691f1 100644 --- a/html/v0.1.1/en/server_administration.html +++ b/html/v0.1.1/en/server_administration.html @@ -184,7 +184,7 @@

                      Administrationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/server_api.html b/html/v0.1.1/en/server_api.html index 46644a10..46800af4 100644 --- a/html/v0.1.1/en/server_api.html +++ b/html/v0.1.1/en/server_api.html @@ -169,7 +169,7 @@

                      Server APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/server_cli.html b/html/v0.1.1/en/server_cli.html index 0119e67f..efc90488 100644 --- a/html/v0.1.1/en/server_cli.html +++ b/html/v0.1.1/en/server_cli.html @@ -415,7 +415,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/server_dashboard.html b/html/v0.1.1/en/server_dashboard.html index c3112594..89d6cb5c 100644 --- a/html/v0.1.1/en/server_dashboard.html +++ b/html/v0.1.1/en/server_dashboard.html @@ -180,7 +180,7 @@

                      Access via Onyxia Platformv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/server_deployment.html b/html/v0.1.1/en/server_deployment.html index ecf3d77d..e53d188d 100644 --- a/html/v0.1.1/en/server_deployment.html +++ b/html/v0.1.1/en/server_deployment.html @@ -200,7 +200,7 @@

                      Deploymentv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/server_kubernetes.html b/html/v0.1.1/en/server_kubernetes.html index e50482c1..a76a6c40 100644 --- a/html/v0.1.1/en/server_kubernetes.html +++ b/html/v0.1.1/en/server_kubernetes.html @@ -239,7 +239,7 @@

                      Installing the Helm Chartv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/server_local.html b/html/v0.1.1/en/server_local.html index 734fb146..fb2efe9a 100644 --- a/html/v0.1.1/en/server_local.html +++ b/html/v0.1.1/en/server_local.html @@ -218,7 +218,7 @@

                      Steps to Deploy Locallyv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/server_modules.html b/html/v0.1.1/en/server_modules.html index 4dba6807..a9b26af7 100644 --- a/html/v0.1.1/en/server_modules.html +++ b/html/v0.1.1/en/server_modules.html @@ -361,7 +361,7 @@

                      lomas_serverv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.1/en/server_onyxia.html b/html/v0.1.1/en/server_onyxia.html index 0f518a6d..553efad7 100644 --- a/html/v0.1.1/en/server_onyxia.html +++ b/html/v0.1.1/en/server_onyxia.html @@ -194,7 +194,7 @@

                      Deploying Lomas on Onyxiav0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/CONTRIBUTING.html b/html/v0.1.2/en/CONTRIBUTING.html index 62d81dbb..2d34470c 100644 --- a/html/v0.1.2/en/CONTRIBUTING.html +++ b/html/v0.1.2/en/CONTRIBUTING.html @@ -283,7 +283,7 @@

                      Release Workflowv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/CONTRIBUTING_CLIENT.html b/html/v0.1.2/en/CONTRIBUTING_CLIENT.html index 8a5f7824..fc785622 100644 --- a/html/v0.1.2/en/CONTRIBUTING_CLIENT.html +++ b/html/v0.1.2/en/CONTRIBUTING_CLIENT.html @@ -168,7 +168,7 @@

                      Pushing a new version to Pypiv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/CONTRIBUTING_SERVER.html b/html/v0.1.2/en/CONTRIBUTING_SERVER.html index bb2a8114..5d492039 100644 --- a/html/v0.1.2/en/CONTRIBUTING_SERVER.html +++ b/html/v0.1.2/en/CONTRIBUTING_SERVER.html @@ -162,7 +162,7 @@

                      Testsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/index.html b/html/v0.1.2/en/_modules/index.html index 8aad892a..ab923171 100644 --- a/html/v0.1.2/en/_modules/index.html +++ b/html/v0.1.2/en/_modules/index.html @@ -170,7 +170,7 @@

                      All modules for which code is available

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_client/client.html b/html/v0.1.2/en/_modules/lomas_client/client.html index 34b2ddb1..6b9e5bb2 100644 --- a/html/v0.1.2/en/_modules/lomas_client/client.html +++ b/html/v0.1.2/en/_modules/lomas_client/client.html @@ -620,7 +620,7 @@

                      Source code for lomas_client.client

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/admin_database/admin_database.html b/html/v0.1.2/en/_modules/lomas_server/admin_database/admin_database.html index 93254d4a..27b19e3f 100644 --- a/html/v0.1.2/en/_modules/lomas_server/admin_database/admin_database.html +++ b/html/v0.1.2/en/_modules/lomas_server/admin_database/admin_database.html @@ -686,7 +686,7 @@

                      Source code for lomas_server.admin_database.admin_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/admin_database/mongodb_database.html b/html/v0.1.2/en/_modules/lomas_server/admin_database/mongodb_database.html index 1012c214..91f99aeb 100644 --- a/html/v0.1.2/en/_modules/lomas_server/admin_database/mongodb_database.html +++ b/html/v0.1.2/en/_modules/lomas_server/admin_database/mongodb_database.html @@ -462,7 +462,7 @@

                      Source code for lomas_server.admin_database.mongodb_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/admin_database/utils.html b/html/v0.1.2/en/_modules/lomas_server/admin_database/utils.html index e0f3fcc7..c85641e3 100644 --- a/html/v0.1.2/en/_modules/lomas_server/admin_database/utils.html +++ b/html/v0.1.2/en/_modules/lomas_server/admin_database/utils.html @@ -236,7 +236,7 @@

                      Source code for lomas_server.admin_database.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/admin_database/yaml_database.html b/html/v0.1.2/en/_modules/lomas_server/admin_database/yaml_database.html index 9bf072d8..8bcd9f96 100644 --- a/html/v0.1.2/en/_modules/lomas_server/admin_database/yaml_database.html +++ b/html/v0.1.2/en/_modules/lomas_server/admin_database/yaml_database.html @@ -454,7 +454,7 @@

                      Source code for lomas_server.admin_database.yaml_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/app.html b/html/v0.1.2/en/_modules/lomas_server/app.html index 485c7339..b8bb526a 100644 --- a/html/v0.1.2/en/_modules/lomas_server/app.html +++ b/html/v0.1.2/en/_modules/lomas_server/app.html @@ -1087,7 +1087,7 @@

                      Source code for lomas_server.app

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/constants.html b/html/v0.1.2/en/_modules/lomas_server/constants.html index 25a0c29d..71c87f06 100644 --- a/html/v0.1.2/en/_modules/lomas_server/constants.html +++ b/html/v0.1.2/en/_modules/lomas_server/constants.html @@ -301,7 +301,7 @@

                      Source code for lomas_server.constants

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/dataset_store/basic_dataset_store.html b/html/v0.1.2/en/_modules/lomas_server/dataset_store/basic_dataset_store.html index 30657c0e..e845e2ea 100644 --- a/html/v0.1.2/en/_modules/lomas_server/dataset_store/basic_dataset_store.html +++ b/html/v0.1.2/en/_modules/lomas_server/dataset_store/basic_dataset_store.html @@ -222,7 +222,7 @@

                      Source code for lomas_server.dataset_store.basic_dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/dataset_store/dataset_store.html b/html/v0.1.2/en/_modules/lomas_server/dataset_store/dataset_store.html index 9b0578de..c1950cc5 100644 --- a/html/v0.1.2/en/_modules/lomas_server/dataset_store/dataset_store.html +++ b/html/v0.1.2/en/_modules/lomas_server/dataset_store/dataset_store.html @@ -193,7 +193,7 @@

                      Source code for lomas_server.dataset_store.dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/dataset_store/lru_dataset_store.html b/html/v0.1.2/en/_modules/lomas_server/dataset_store/lru_dataset_store.html index cd79949e..bdb4604c 100644 --- a/html/v0.1.2/en/_modules/lomas_server/dataset_store/lru_dataset_store.html +++ b/html/v0.1.2/en/_modules/lomas_server/dataset_store/lru_dataset_store.html @@ -268,7 +268,7 @@

                      Source code for lomas_server.dataset_store.lru_dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html index 747b7749..fc292312 100644 --- a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html +++ b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html @@ -412,7 +412,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.opendp

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html index 119cbdfb..280b60e2 100644 --- a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html +++ b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html @@ -307,7 +307,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.smartnoise_sql

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html index 1a5932e3..fb3e6e6c 100644 --- a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html +++ b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html @@ -180,7 +180,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_logic.html b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_logic.html index b7e35f9d..3c311f72 100644 --- a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_logic.html +++ b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_logic.html @@ -358,7 +358,7 @@

                      Source code for lomas_server.dp_queries.dp_logic

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_querier.html b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_querier.html index 0f87717b..dc102c0d 100644 --- a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_querier.html +++ b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dp_querier.html @@ -205,7 +205,7 @@

                      Source code for lomas_server.dp_queries.dp_querier

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dummy_dataset.html b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dummy_dataset.html index a4dcdaf1..32e844e4 100644 --- a/html/v0.1.2/en/_modules/lomas_server/dp_queries/dummy_dataset.html +++ b/html/v0.1.2/en/_modules/lomas_server/dp_queries/dummy_dataset.html @@ -303,7 +303,7 @@

                      Source code for lomas_server.dp_queries.dummy_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/mongodb_admin.html b/html/v0.1.2/en/_modules/lomas_server/mongodb_admin.html index 99c339a4..1308d219 100644 --- a/html/v0.1.2/en/_modules/lomas_server/mongodb_admin.html +++ b/html/v0.1.2/en/_modules/lomas_server/mongodb_admin.html @@ -1076,7 +1076,7 @@

                      Source code for lomas_server.mongodb_admin

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/private_dataset/in_memory_dataset.html b/html/v0.1.2/en/_modules/lomas_server/private_dataset/in_memory_dataset.html index 42639d48..225d0630 100644 --- a/html/v0.1.2/en/_modules/lomas_server/private_dataset/in_memory_dataset.html +++ b/html/v0.1.2/en/_modules/lomas_server/private_dataset/in_memory_dataset.html @@ -186,7 +186,7 @@

                      Source code for lomas_server.private_dataset.in_memory_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/private_dataset/path_dataset.html b/html/v0.1.2/en/_modules/lomas_server/private_dataset/path_dataset.html index bde9edf4..af0d558e 100644 --- a/html/v0.1.2/en/_modules/lomas_server/private_dataset/path_dataset.html +++ b/html/v0.1.2/en/_modules/lomas_server/private_dataset/path_dataset.html @@ -211,7 +211,7 @@

                      Source code for lomas_server.private_dataset.path_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/private_dataset/private_dataset.html b/html/v0.1.2/en/_modules/lomas_server/private_dataset/private_dataset.html index 9dd653aa..61234a6e 100644 --- a/html/v0.1.2/en/_modules/lomas_server/private_dataset/private_dataset.html +++ b/html/v0.1.2/en/_modules/lomas_server/private_dataset/private_dataset.html @@ -242,7 +242,7 @@

                      Source code for lomas_server.private_dataset.private_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/private_dataset/s3_dataset.html b/html/v0.1.2/en/_modules/lomas_server/private_dataset/s3_dataset.html index 8d40e733..7474181f 100644 --- a/html/v0.1.2/en/_modules/lomas_server/private_dataset/s3_dataset.html +++ b/html/v0.1.2/en/_modules/lomas_server/private_dataset/s3_dataset.html @@ -214,7 +214,7 @@

                      Source code for lomas_server.private_dataset.s3_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/private_dataset/utils.html b/html/v0.1.2/en/_modules/lomas_server/private_dataset/utils.html index c9b0de1c..fc8d5381 100644 --- a/html/v0.1.2/en/_modules/lomas_server/private_dataset/utils.html +++ b/html/v0.1.2/en/_modules/lomas_server/private_dataset/utils.html @@ -213,7 +213,7 @@

                      Source code for lomas_server.private_dataset.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/tests/test_dummy_generation.html b/html/v0.1.2/en/_modules/lomas_server/tests/test_dummy_generation.html index 7d023f99..b382d089 100644 --- a/html/v0.1.2/en/_modules/lomas_server/tests/test_dummy_generation.html +++ b/html/v0.1.2/en/_modules/lomas_server/tests/test_dummy_generation.html @@ -337,7 +337,7 @@

                      Source code for lomas_server.tests.test_dummy_generation

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/utils/anti_timing_att.html b/html/v0.1.2/en/_modules/lomas_server/utils/anti_timing_att.html index bb747448..817440e0 100644 --- a/html/v0.1.2/en/_modules/lomas_server/utils/anti_timing_att.html +++ b/html/v0.1.2/en/_modules/lomas_server/utils/anti_timing_att.html @@ -199,7 +199,7 @@

                      Source code for lomas_server.utils.anti_timing_att

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/utils/config.html b/html/v0.1.2/en/_modules/lomas_server/utils/config.html index aacdfdcb..e584eb0e 100644 --- a/html/v0.1.2/en/_modules/lomas_server/utils/config.html +++ b/html/v0.1.2/en/_modules/lomas_server/utils/config.html @@ -481,7 +481,7 @@

                      Source code for lomas_server.utils.config

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/_modules/lomas_server/utils/error_handler.html b/html/v0.1.2/en/_modules/lomas_server/utils/error_handler.html index 88e26c82..e74697b0 100644 --- a/html/v0.1.2/en/_modules/lomas_server/utils/error_handler.html +++ b/html/v0.1.2/en/_modules/lomas_server/utils/error_handler.html @@ -284,7 +284,7 @@

                      Source code for lomas_server.utils.error_handler

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/api.html b/html/v0.1.2/en/api.html index 4d65532f..aa03b703 100644 --- a/html/v0.1.2/en/api.html +++ b/html/v0.1.2/en/api.html @@ -169,7 +169,7 @@

                      API Documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/client_api.html b/html/v0.1.2/en/client_api.html index 8b6002d5..1927adf9 100644 --- a/html/v0.1.2/en/client_api.html +++ b/html/v0.1.2/en/client_api.html @@ -169,7 +169,7 @@

                      Client APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/client_errors.html b/html/v0.1.2/en/client_errors.html index d7254508..e6e11543 100644 --- a/html/v0.1.2/en/client_errors.html +++ b/html/v0.1.2/en/client_errors.html @@ -211,7 +211,7 @@

                      Errors<
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/client_examples.html b/html/v0.1.2/en/client_examples.html index 8fb5a5c8..31c9d33c 100644 --- a/html/v0.1.2/en/client_examples.html +++ b/html/v0.1.2/en/client_examples.html @@ -183,7 +183,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/client_modules.html b/html/v0.1.2/en/client_modules.html index c5689aed..4cda1da1 100644 --- a/html/v0.1.2/en/client_modules.html +++ b/html/v0.1.2/en/client_modules.html @@ -197,7 +197,7 @@

                      lomas_clientv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/client_quickstart.html b/html/v0.1.2/en/client_quickstart.html index 1405e53f..cbcb7aeb 100644 --- a/html/v0.1.2/en/client_quickstart.html +++ b/html/v0.1.2/en/client_quickstart.html @@ -202,7 +202,7 @@

                      First stepsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/genindex.html b/html/v0.1.2/en/genindex.html index c196ad1c..09a23731 100644 --- a/html/v0.1.2/en/genindex.html +++ b/html/v0.1.2/en/genindex.html @@ -1339,7 +1339,7 @@

                      Z

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/index.html b/html/v0.1.2/en/index.html index 4ec338b8..0097e47e 100644 --- a/html/v0.1.2/en/index.html +++ b/html/v0.1.2/en/index.html @@ -226,7 +226,7 @@

                      Indices and tablesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/index_under_construction.html b/html/v0.1.2/en/index_under_construction.html index 0033c887..b93ff3c4 100644 --- a/html/v0.1.2/en/index_under_construction.html +++ b/html/v0.1.2/en/index_under_construction.html @@ -149,7 +149,7 @@

                      Welcome to Lomas documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_client.html b/html/v0.1.2/en/lomas_client.html index 17cba85a..decad78c 100644 --- a/html/v0.1.2/en/lomas_client.html +++ b/html/v0.1.2/en/lomas_client.html @@ -431,7 +431,7 @@

                      lomas_client.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.admin_database.html b/html/v0.1.2/en/lomas_server.admin_database.html index d5d30783..8be5845b 100644 --- a/html/v0.1.2/en/lomas_server.admin_database.html +++ b/html/v0.1.2/en/lomas_server.admin_database.html @@ -1161,7 +1161,7 @@

                      lomas_server.admin_database.factory modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.administration.html b/html/v0.1.2/en/lomas_server.administration.html index 4262dda6..5e2d99d9 100644 --- a/html/v0.1.2/en/lomas_server.administration.html +++ b/html/v0.1.2/en/lomas_server.administration.html @@ -170,7 +170,7 @@

                      lomas_server.administration packagev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.data_connector.html b/html/v0.1.2/en/lomas_server.data_connector.html index 718455f4..b03b3502 100644 --- a/html/v0.1.2/en/lomas_server.data_connector.html +++ b/html/v0.1.2/en/lomas_server.data_connector.html @@ -188,7 +188,7 @@

                      lomas_server.data_connector.s3_connector modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.dataset_store.html b/html/v0.1.2/en/lomas_server.dataset_store.html index 2ab93d78..4b1aa644 100644 --- a/html/v0.1.2/en/lomas_server.dataset_store.html +++ b/html/v0.1.2/en/lomas_server.dataset_store.html @@ -304,7 +304,7 @@

                      lomas_server.dataset_store.factory modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.dp_queries.dp_libraries.html b/html/v0.1.2/en/lomas_server.dp_queries.dp_libraries.html index e23431c3..4147d0d7 100644 --- a/html/v0.1.2/en/lomas_server.dp_queries.dp_libraries.html +++ b/html/v0.1.2/en/lomas_server.dp_queries.dp_libraries.html @@ -436,7 +436,7 @@

                      lomas_server.dp_queries.dp_libraries.smartnoise_synth modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.dp_queries.html b/html/v0.1.2/en/lomas_server.dp_queries.html index fcc93ed1..ebcc41b8 100644 --- a/html/v0.1.2/en/lomas_server.dp_queries.html +++ b/html/v0.1.2/en/lomas_server.dp_queries.html @@ -404,7 +404,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.html b/html/v0.1.2/en/lomas_server.html index 4cf43e79..cfcdca43 100644 --- a/html/v0.1.2/en/lomas_server.html +++ b/html/v0.1.2/en/lomas_server.html @@ -1829,7 +1829,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.private_dataset.html b/html/v0.1.2/en/lomas_server.private_dataset.html index b0adae08..3aac2958 100644 --- a/html/v0.1.2/en/lomas_server.private_dataset.html +++ b/html/v0.1.2/en/lomas_server.private_dataset.html @@ -333,7 +333,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.routes.html b/html/v0.1.2/en/lomas_server.routes.html index 39915e4b..200d0c1a 100644 --- a/html/v0.1.2/en/lomas_server.routes.html +++ b/html/v0.1.2/en/lomas_server.routes.html @@ -182,7 +182,7 @@

                      lomas_server.routes.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.tests.html b/html/v0.1.2/en/lomas_server.tests.html index 4cabdb19..48539d68 100644 --- a/html/v0.1.2/en/lomas_server.tests.html +++ b/html/v0.1.2/en/lomas_server.tests.html @@ -241,7 +241,7 @@

                      lomas_server.tests.test_mongodb_admin_cli modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/lomas_server.utils.html b/html/v0.1.2/en/lomas_server.utils.html index 660ae0ba..6bc7cf66 100644 --- a/html/v0.1.2/en/lomas_server.utils.html +++ b/html/v0.1.2/en/lomas_server.utils.html @@ -738,7 +738,7 @@

                      lomas_server.utils.query_models modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/notebooks/Demo_Client_Notebook.html b/html/v0.1.2/en/notebooks/Demo_Client_Notebook.html index 4e6def93..2bca744e 100644 --- a/html/v0.1.2/en/notebooks/Demo_Client_Notebook.html +++ b/html/v0.1.2/en/notebooks/Demo_Client_Notebook.html @@ -1124,7 +1124,7 @@

                      Step 5: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html b/html/v0.1.2/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html index b13163a8..352b0166 100644 --- a/html/v0.1.2/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html +++ b/html/v0.1.2/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html @@ -2477,7 +2477,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html b/html/v0.1.2/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html index 0c2a8618..8a4f43a6 100644 --- a/html/v0.1.2/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html +++ b/html/v0.1.2/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html @@ -1171,7 +1171,7 @@

                      Hypothesis testingv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html b/html/v0.1.2/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html index 159ca58f..38c09a3e 100644 --- a/html/v0.1.2/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html +++ b/html/v0.1.2/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html @@ -2033,7 +2033,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/notebooks/local_admin_notebook.html b/html/v0.1.2/en/notebooks/local_admin_notebook.html index 99ec3b3b..77025bc6 100644 --- a/html/v0.1.2/en/notebooks/local_admin_notebook.html +++ b/html/v0.1.2/en/notebooks/local_admin_notebook.html @@ -1455,7 +1455,7 @@

                      Stop the server: do not do it now !v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/notebooks/s3_example_notebook.html b/html/v0.1.2/en/notebooks/s3_example_notebook.html index 869e8191..76809cca 100644 --- a/html/v0.1.2/en/notebooks/s3_example_notebook.html +++ b/html/v0.1.2/en/notebooks/s3_example_notebook.html @@ -903,7 +903,7 @@

                      Confidence intervals for age over the whole populationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/objects.inv b/html/v0.1.2/en/objects.inv index ee92ab81..c658699a 100644 Binary files a/html/v0.1.2/en/objects.inv and b/html/v0.1.2/en/objects.inv differ diff --git a/html/v0.1.2/en/py-modindex.html b/html/v0.1.2/en/py-modindex.html index e77957ec..ece9528a 100644 --- a/html/v0.1.2/en/py-modindex.html +++ b/html/v0.1.2/en/py-modindex.html @@ -365,7 +365,7 @@

                      Python Module Index

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/search.html b/html/v0.1.2/en/search.html index 6912442b..64e328b7 100644 --- a/html/v0.1.2/en/search.html +++ b/html/v0.1.2/en/search.html @@ -157,7 +157,7 @@
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/server_administration.html b/html/v0.1.2/en/server_administration.html index b2fa28d3..ab966fca 100644 --- a/html/v0.1.2/en/server_administration.html +++ b/html/v0.1.2/en/server_administration.html @@ -184,7 +184,7 @@

                      Administrationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/server_api.html b/html/v0.1.2/en/server_api.html index f16da928..6af59c7d 100644 --- a/html/v0.1.2/en/server_api.html +++ b/html/v0.1.2/en/server_api.html @@ -169,7 +169,7 @@

                      Server APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/server_cli.html b/html/v0.1.2/en/server_cli.html index 40fe6d07..5c819d2c 100644 --- a/html/v0.1.2/en/server_cli.html +++ b/html/v0.1.2/en/server_cli.html @@ -415,7 +415,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/server_dashboard.html b/html/v0.1.2/en/server_dashboard.html index 24632c13..0433af27 100644 --- a/html/v0.1.2/en/server_dashboard.html +++ b/html/v0.1.2/en/server_dashboard.html @@ -180,7 +180,7 @@

                      Access via Onyxia Platformv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/server_deployment.html b/html/v0.1.2/en/server_deployment.html index b5890db3..21b3dbdb 100644 --- a/html/v0.1.2/en/server_deployment.html +++ b/html/v0.1.2/en/server_deployment.html @@ -200,7 +200,7 @@

                      Deploymentv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/server_kubernetes.html b/html/v0.1.2/en/server_kubernetes.html index d408d7a9..fa86e635 100644 --- a/html/v0.1.2/en/server_kubernetes.html +++ b/html/v0.1.2/en/server_kubernetes.html @@ -239,7 +239,7 @@

                      Installing the Helm Chartv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/server_local.html b/html/v0.1.2/en/server_local.html index 93f4baf5..2db35da2 100644 --- a/html/v0.1.2/en/server_local.html +++ b/html/v0.1.2/en/server_local.html @@ -218,7 +218,7 @@

                      Steps to Deploy Locallyv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/server_modules.html b/html/v0.1.2/en/server_modules.html index ed8bfc9d..8ab40c91 100644 --- a/html/v0.1.2/en/server_modules.html +++ b/html/v0.1.2/en/server_modules.html @@ -361,7 +361,7 @@

                      lomas_serverv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.1.2/en/server_onyxia.html b/html/v0.1.2/en/server_onyxia.html index 07906a36..52e4ceb0 100644 --- a/html/v0.1.2/en/server_onyxia.html +++ b/html/v0.1.2/en/server_onyxia.html @@ -194,7 +194,7 @@

                      Deploying Lomas on Onyxiav0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/CONTRIBUTING.html b/html/v0.2.0/en/CONTRIBUTING.html index ac7289d3..d231c0be 100644 --- a/html/v0.2.0/en/CONTRIBUTING.html +++ b/html/v0.2.0/en/CONTRIBUTING.html @@ -303,7 +303,7 @@

                      Release Workflowv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/CONTRIBUTING_CLIENT.html b/html/v0.2.0/en/CONTRIBUTING_CLIENT.html index 9290ecf0..787e5f12 100644 --- a/html/v0.2.0/en/CONTRIBUTING_CLIENT.html +++ b/html/v0.2.0/en/CONTRIBUTING_CLIENT.html @@ -168,7 +168,7 @@

                      Pushing a new version to Pypiv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/CONTRIBUTING_SERVER.html b/html/v0.2.0/en/CONTRIBUTING_SERVER.html index 4298231c..5758b5f4 100644 --- a/html/v0.2.0/en/CONTRIBUTING_SERVER.html +++ b/html/v0.2.0/en/CONTRIBUTING_SERVER.html @@ -162,7 +162,7 @@

                      Testsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/index.html b/html/v0.2.0/en/_modules/index.html index ec20ec47..4302febb 100644 --- a/html/v0.2.0/en/_modules/index.html +++ b/html/v0.2.0/en/_modules/index.html @@ -171,7 +171,7 @@

                      All modules for which code is available

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_client/client.html b/html/v0.2.0/en/_modules/lomas_client/client.html index 3a53a188..784e6edb 100644 --- a/html/v0.2.0/en/_modules/lomas_client/client.html +++ b/html/v0.2.0/en/_modules/lomas_client/client.html @@ -756,7 +756,7 @@

                      Source code for lomas_client.client

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/admin_database/admin_database.html b/html/v0.2.0/en/_modules/lomas_server/admin_database/admin_database.html index 8679b31d..67d3c268 100644 --- a/html/v0.2.0/en/_modules/lomas_server/admin_database/admin_database.html +++ b/html/v0.2.0/en/_modules/lomas_server/admin_database/admin_database.html @@ -679,7 +679,7 @@

                      Source code for lomas_server.admin_database.admin_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/admin_database/mongodb_database.html b/html/v0.2.0/en/_modules/lomas_server/admin_database/mongodb_database.html index 1524cdc6..995ccc66 100644 --- a/html/v0.2.0/en/_modules/lomas_server/admin_database/mongodb_database.html +++ b/html/v0.2.0/en/_modules/lomas_server/admin_database/mongodb_database.html @@ -468,7 +468,7 @@

                      Source code for lomas_server.admin_database.mongodb_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/admin_database/utils.html b/html/v0.2.0/en/_modules/lomas_server/admin_database/utils.html index 67d32874..e5f1a3da 100644 --- a/html/v0.2.0/en/_modules/lomas_server/admin_database/utils.html +++ b/html/v0.2.0/en/_modules/lomas_server/admin_database/utils.html @@ -236,7 +236,7 @@

                      Source code for lomas_server.admin_database.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/admin_database/yaml_database.html b/html/v0.2.0/en/_modules/lomas_server/admin_database/yaml_database.html index 50dbfa95..68584ec0 100644 --- a/html/v0.2.0/en/_modules/lomas_server/admin_database/yaml_database.html +++ b/html/v0.2.0/en/_modules/lomas_server/admin_database/yaml_database.html @@ -459,7 +459,7 @@

                      Source code for lomas_server.admin_database.yaml_database

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/app.html b/html/v0.2.0/en/_modules/lomas_server/app.html index b8c2ebb3..75dc5d91 100644 --- a/html/v0.2.0/en/_modules/lomas_server/app.html +++ b/html/v0.2.0/en/_modules/lomas_server/app.html @@ -315,7 +315,7 @@

                      Source code for lomas_server.app

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/constants.html b/html/v0.2.0/en/_modules/lomas_server/constants.html index 81452f23..28f40d4b 100644 --- a/html/v0.2.0/en/_modules/lomas_server/constants.html +++ b/html/v0.2.0/en/_modules/lomas_server/constants.html @@ -314,7 +314,7 @@

                      Source code for lomas_server.constants

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dataset_store/basic_dataset_store.html b/html/v0.2.0/en/_modules/lomas_server/dataset_store/basic_dataset_store.html index 7f01ba46..845941f5 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dataset_store/basic_dataset_store.html +++ b/html/v0.2.0/en/_modules/lomas_server/dataset_store/basic_dataset_store.html @@ -222,7 +222,7 @@

                      Source code for lomas_server.dataset_store.basic_dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dataset_store/dataset_store.html b/html/v0.2.0/en/_modules/lomas_server/dataset_store/dataset_store.html index 42a07021..a606025e 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dataset_store/dataset_store.html +++ b/html/v0.2.0/en/_modules/lomas_server/dataset_store/dataset_store.html @@ -193,7 +193,7 @@

                      Source code for lomas_server.dataset_store.dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dataset_store/lru_dataset_store.html b/html/v0.2.0/en/_modules/lomas_server/dataset_store/lru_dataset_store.html index e756ffe4..d5cd6051 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dataset_store/lru_dataset_store.html +++ b/html/v0.2.0/en/_modules/lomas_server/dataset_store/lru_dataset_store.html @@ -268,7 +268,7 @@

                      Source code for lomas_server.dataset_store.lru_dataset_store

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/diffprivlib.html b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/diffprivlib.html index 77e29abb..37bf8095 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/diffprivlib.html +++ b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/diffprivlib.html @@ -282,7 +282,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.diffprivlib

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html index 9357ec61..06a16e55 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html +++ b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/opendp.html @@ -412,7 +412,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.opendp

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html index e06b271d..87bb4aae 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html +++ b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/smartnoise_sql.html @@ -307,7 +307,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.smartnoise_sql

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html index 7ec7b8fb..4e24753d 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html +++ b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_libraries/utils.html @@ -184,7 +184,7 @@

                      Source code for lomas_server.dp_queries.dp_libraries.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_logic.html b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_logic.html index d1843c75..40cb1787 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_logic.html +++ b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_logic.html @@ -358,7 +358,7 @@

                      Source code for lomas_server.dp_queries.dp_logic

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_querier.html b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_querier.html index 7ccd7382..bde6f657 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_querier.html +++ b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dp_querier.html @@ -205,7 +205,7 @@

                      Source code for lomas_server.dp_queries.dp_querier

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dummy_dataset.html b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dummy_dataset.html index a5a7ad4b..f5c0a373 100644 --- a/html/v0.2.0/en/_modules/lomas_server/dp_queries/dummy_dataset.html +++ b/html/v0.2.0/en/_modules/lomas_server/dp_queries/dummy_dataset.html @@ -303,7 +303,7 @@

                      Source code for lomas_server.dp_queries.dummy_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/mongodb_admin.html b/html/v0.2.0/en/_modules/lomas_server/mongodb_admin.html index 88144a92..99aa5268 100644 --- a/html/v0.2.0/en/_modules/lomas_server/mongodb_admin.html +++ b/html/v0.2.0/en/_modules/lomas_server/mongodb_admin.html @@ -1076,7 +1076,7 @@

                      Source code for lomas_server.mongodb_admin

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/private_dataset/in_memory_dataset.html b/html/v0.2.0/en/_modules/lomas_server/private_dataset/in_memory_dataset.html index 48dfe685..4549c151 100644 --- a/html/v0.2.0/en/_modules/lomas_server/private_dataset/in_memory_dataset.html +++ b/html/v0.2.0/en/_modules/lomas_server/private_dataset/in_memory_dataset.html @@ -186,7 +186,7 @@

                      Source code for lomas_server.private_dataset.in_memory_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/private_dataset/path_dataset.html b/html/v0.2.0/en/_modules/lomas_server/private_dataset/path_dataset.html index 2a7b1d64..c8097a5f 100644 --- a/html/v0.2.0/en/_modules/lomas_server/private_dataset/path_dataset.html +++ b/html/v0.2.0/en/_modules/lomas_server/private_dataset/path_dataset.html @@ -211,7 +211,7 @@

                      Source code for lomas_server.private_dataset.path_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/private_dataset/private_dataset.html b/html/v0.2.0/en/_modules/lomas_server/private_dataset/private_dataset.html index 0cd542f5..607488e2 100644 --- a/html/v0.2.0/en/_modules/lomas_server/private_dataset/private_dataset.html +++ b/html/v0.2.0/en/_modules/lomas_server/private_dataset/private_dataset.html @@ -242,7 +242,7 @@

                      Source code for lomas_server.private_dataset.private_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/private_dataset/s3_dataset.html b/html/v0.2.0/en/_modules/lomas_server/private_dataset/s3_dataset.html index 49a26fae..e6108080 100644 --- a/html/v0.2.0/en/_modules/lomas_server/private_dataset/s3_dataset.html +++ b/html/v0.2.0/en/_modules/lomas_server/private_dataset/s3_dataset.html @@ -214,7 +214,7 @@

                      Source code for lomas_server.private_dataset.s3_dataset

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/private_dataset/utils.html b/html/v0.2.0/en/_modules/lomas_server/private_dataset/utils.html index a26aab0a..6372eb9d 100644 --- a/html/v0.2.0/en/_modules/lomas_server/private_dataset/utils.html +++ b/html/v0.2.0/en/_modules/lomas_server/private_dataset/utils.html @@ -213,7 +213,7 @@

                      Source code for lomas_server.private_dataset.utils

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/tests/test_dummy_generation.html b/html/v0.2.0/en/_modules/lomas_server/tests/test_dummy_generation.html index d18c2e85..ccb0ccb9 100644 --- a/html/v0.2.0/en/_modules/lomas_server/tests/test_dummy_generation.html +++ b/html/v0.2.0/en/_modules/lomas_server/tests/test_dummy_generation.html @@ -337,7 +337,7 @@

                      Source code for lomas_server.tests.test_dummy_generation

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/utils/anti_timing_att.html b/html/v0.2.0/en/_modules/lomas_server/utils/anti_timing_att.html index dfd79ba7..7ddef08d 100644 --- a/html/v0.2.0/en/_modules/lomas_server/utils/anti_timing_att.html +++ b/html/v0.2.0/en/_modules/lomas_server/utils/anti_timing_att.html @@ -199,7 +199,7 @@

                      Source code for lomas_server.utils.anti_timing_att

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/utils/config.html b/html/v0.2.0/en/_modules/lomas_server/utils/config.html index 0c176591..046c55fe 100644 --- a/html/v0.2.0/en/_modules/lomas_server/utils/config.html +++ b/html/v0.2.0/en/_modules/lomas_server/utils/config.html @@ -480,7 +480,7 @@

                      Source code for lomas_server.utils.config

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/_modules/lomas_server/utils/error_handler.html b/html/v0.2.0/en/_modules/lomas_server/utils/error_handler.html index ece2a78b..176e56e5 100644 --- a/html/v0.2.0/en/_modules/lomas_server/utils/error_handler.html +++ b/html/v0.2.0/en/_modules/lomas_server/utils/error_handler.html @@ -284,7 +284,7 @@

                      Source code for lomas_server.utils.error_handler

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/api.html b/html/v0.2.0/en/api.html index 7d7979f4..46105771 100644 --- a/html/v0.2.0/en/api.html +++ b/html/v0.2.0/en/api.html @@ -169,7 +169,7 @@

                      API Documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/client_api.html b/html/v0.2.0/en/client_api.html index 1b5b66f7..92c67d56 100644 --- a/html/v0.2.0/en/client_api.html +++ b/html/v0.2.0/en/client_api.html @@ -169,7 +169,7 @@

                      Client APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/client_errors.html b/html/v0.2.0/en/client_errors.html index a68d31b4..3f3e4ec7 100644 --- a/html/v0.2.0/en/client_errors.html +++ b/html/v0.2.0/en/client_errors.html @@ -211,7 +211,7 @@

                      Errors<
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/client_examples.html b/html/v0.2.0/en/client_examples.html index d2ee6e7c..456e1e9c 100644 --- a/html/v0.2.0/en/client_examples.html +++ b/html/v0.2.0/en/client_examples.html @@ -183,7 +183,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/client_modules.html b/html/v0.2.0/en/client_modules.html index 443001d5..01825fd5 100644 --- a/html/v0.2.0/en/client_modules.html +++ b/html/v0.2.0/en/client_modules.html @@ -200,7 +200,7 @@

                      lomas_clientv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/client_quickstart.html b/html/v0.2.0/en/client_quickstart.html index 3e668e61..2c8c3c8b 100644 --- a/html/v0.2.0/en/client_quickstart.html +++ b/html/v0.2.0/en/client_quickstart.html @@ -202,7 +202,7 @@

                      First stepsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/genindex.html b/html/v0.2.0/en/genindex.html index 2b34469d..836b19d7 100644 --- a/html/v0.2.0/en/genindex.html +++ b/html/v0.2.0/en/genindex.html @@ -1328,7 +1328,7 @@

                      Z

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/index.html b/html/v0.2.0/en/index.html index 46d44b4e..e6382a88 100644 --- a/html/v0.2.0/en/index.html +++ b/html/v0.2.0/en/index.html @@ -229,7 +229,7 @@

                      Indices and tablesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/index_under_construction.html b/html/v0.2.0/en/index_under_construction.html index 497c9610..59f5ef13 100644 --- a/html/v0.2.0/en/index_under_construction.html +++ b/html/v0.2.0/en/index_under_construction.html @@ -149,7 +149,7 @@

                      Welcome to Lomas documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_client.html b/html/v0.2.0/en/lomas_client.html index 4a5ccfc7..5c9f5e68 100644 --- a/html/v0.2.0/en/lomas_client.html +++ b/html/v0.2.0/en/lomas_client.html @@ -520,7 +520,7 @@

                      lomas_client.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.admin_database.html b/html/v0.2.0/en/lomas_server.admin_database.html index ce247ac1..a8416e99 100644 --- a/html/v0.2.0/en/lomas_server.admin_database.html +++ b/html/v0.2.0/en/lomas_server.admin_database.html @@ -1161,7 +1161,7 @@

                      lomas_server.admin_database.factory modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.administration.html b/html/v0.2.0/en/lomas_server.administration.html index 818de474..35486941 100644 --- a/html/v0.2.0/en/lomas_server.administration.html +++ b/html/v0.2.0/en/lomas_server.administration.html @@ -170,7 +170,7 @@

                      lomas_server.administration packagev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.data_connector.html b/html/v0.2.0/en/lomas_server.data_connector.html index 2fa2a7dd..296d2748 100644 --- a/html/v0.2.0/en/lomas_server.data_connector.html +++ b/html/v0.2.0/en/lomas_server.data_connector.html @@ -188,7 +188,7 @@

                      lomas_server.data_connector.s3_connector modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.dataset_store.html b/html/v0.2.0/en/lomas_server.dataset_store.html index 11b9d803..320ca632 100644 --- a/html/v0.2.0/en/lomas_server.dataset_store.html +++ b/html/v0.2.0/en/lomas_server.dataset_store.html @@ -304,7 +304,7 @@

                      lomas_server.dataset_store.factory modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.dp_queries.dp_libraries.html b/html/v0.2.0/en/lomas_server.dp_queries.dp_libraries.html index 54ba5a78..d3289caa 100644 --- a/html/v0.2.0/en/lomas_server.dp_queries.dp_libraries.html +++ b/html/v0.2.0/en/lomas_server.dp_queries.dp_libraries.html @@ -516,7 +516,7 @@

                      lomas_server.dp_queries.dp_libraries.smartnoise_synth modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.dp_queries.html b/html/v0.2.0/en/lomas_server.dp_queries.html index 415b0444..12104d90 100644 --- a/html/v0.2.0/en/lomas_server.dp_queries.html +++ b/html/v0.2.0/en/lomas_server.dp_queries.html @@ -412,7 +412,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.html b/html/v0.2.0/en/lomas_server.html index c09cb465..726c6deb 100644 --- a/html/v0.2.0/en/lomas_server.html +++ b/html/v0.2.0/en/lomas_server.html @@ -1236,7 +1236,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.private_dataset.html b/html/v0.2.0/en/lomas_server.private_dataset.html index 34b14d5b..2aa5f1ca 100644 --- a/html/v0.2.0/en/lomas_server.private_dataset.html +++ b/html/v0.2.0/en/lomas_server.private_dataset.html @@ -333,7 +333,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.routes.html b/html/v0.2.0/en/lomas_server.routes.html index 89276b3b..7938d2af 100644 --- a/html/v0.2.0/en/lomas_server.routes.html +++ b/html/v0.2.0/en/lomas_server.routes.html @@ -182,7 +182,7 @@

                      lomas_server.routes.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.tests.html b/html/v0.2.0/en/lomas_server.tests.html index 724e79f3..0b0082b2 100644 --- a/html/v0.2.0/en/lomas_server.tests.html +++ b/html/v0.2.0/en/lomas_server.tests.html @@ -241,7 +241,7 @@

                      lomas_server.tests.test_mongodb_admin_cli modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/lomas_server.utils.html b/html/v0.2.0/en/lomas_server.utils.html index 69e266dc..533178bc 100644 --- a/html/v0.2.0/en/lomas_server.utils.html +++ b/html/v0.2.0/en/lomas_server.utils.html @@ -738,7 +738,7 @@

                      lomas_server.utils.query_models modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/notebooks/Demo_Client_Notebook.html b/html/v0.2.0/en/notebooks/Demo_Client_Notebook.html index 6769ed82..7394ff8f 100644 --- a/html/v0.2.0/en/notebooks/Demo_Client_Notebook.html +++ b/html/v0.2.0/en/notebooks/Demo_Client_Notebook.html @@ -1160,7 +1160,7 @@

                      Step 5: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html b/html/v0.2.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html index bc131650..b92b2b39 100644 --- a/html/v0.2.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html +++ b/html/v0.2.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html @@ -2955,7 +2955,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html b/html/v0.2.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html index 5ea89a1f..f0c00588 100644 --- a/html/v0.2.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html +++ b/html/v0.2.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html @@ -1171,7 +1171,7 @@

                      Hypothesis testingv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html b/html/v0.2.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html index 73183684..b753c7a8 100644 --- a/html/v0.2.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html +++ b/html/v0.2.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html @@ -2033,7 +2033,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/notebooks/local_admin_notebook.html b/html/v0.2.0/en/notebooks/local_admin_notebook.html index 41b43990..dfef208f 100644 --- a/html/v0.2.0/en/notebooks/local_admin_notebook.html +++ b/html/v0.2.0/en/notebooks/local_admin_notebook.html @@ -1455,7 +1455,7 @@

                      Stop the server: do not do it now !v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/notebooks/s3_example_notebook.html b/html/v0.2.0/en/notebooks/s3_example_notebook.html index 9e6d1c8f..c648c1ec 100644 --- a/html/v0.2.0/en/notebooks/s3_example_notebook.html +++ b/html/v0.2.0/en/notebooks/s3_example_notebook.html @@ -903,7 +903,7 @@

                      Confidence intervals for age over the whole populationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/objects.inv b/html/v0.2.0/en/objects.inv index 77378f98..5bda2328 100644 Binary files a/html/v0.2.0/en/objects.inv and b/html/v0.2.0/en/objects.inv differ diff --git a/html/v0.2.0/en/py-modindex.html b/html/v0.2.0/en/py-modindex.html index bd2c5e4f..de61805d 100644 --- a/html/v0.2.0/en/py-modindex.html +++ b/html/v0.2.0/en/py-modindex.html @@ -370,7 +370,7 @@

                      Python Module Index

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/search.html b/html/v0.2.0/en/search.html index b49b86e3..4a700faa 100644 --- a/html/v0.2.0/en/search.html +++ b/html/v0.2.0/en/search.html @@ -157,7 +157,7 @@
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/server_administration.html b/html/v0.2.0/en/server_administration.html index 71c93954..2f8ef46c 100644 --- a/html/v0.2.0/en/server_administration.html +++ b/html/v0.2.0/en/server_administration.html @@ -184,7 +184,7 @@

                      Administrationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/server_api.html b/html/v0.2.0/en/server_api.html index dd3e86d3..1dc566ff 100644 --- a/html/v0.2.0/en/server_api.html +++ b/html/v0.2.0/en/server_api.html @@ -169,7 +169,7 @@

                      Server APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/server_cli.html b/html/v0.2.0/en/server_cli.html index 3cb98de3..7e9ff0af 100644 --- a/html/v0.2.0/en/server_cli.html +++ b/html/v0.2.0/en/server_cli.html @@ -415,7 +415,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/server_dashboard.html b/html/v0.2.0/en/server_dashboard.html index b9d344cb..0ee7409e 100644 --- a/html/v0.2.0/en/server_dashboard.html +++ b/html/v0.2.0/en/server_dashboard.html @@ -180,7 +180,7 @@

                      Access via Onyxia Platformv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/server_deployment.html b/html/v0.2.0/en/server_deployment.html index 1cbbb678..9357d98a 100644 --- a/html/v0.2.0/en/server_deployment.html +++ b/html/v0.2.0/en/server_deployment.html @@ -200,7 +200,7 @@

                      Deploymentv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/server_kubernetes.html b/html/v0.2.0/en/server_kubernetes.html index 1171d4c3..f4fe0127 100644 --- a/html/v0.2.0/en/server_kubernetes.html +++ b/html/v0.2.0/en/server_kubernetes.html @@ -239,7 +239,7 @@

                      Installing the Helm Chartv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/server_local.html b/html/v0.2.0/en/server_local.html index 77082f68..7ab9db09 100644 --- a/html/v0.2.0/en/server_local.html +++ b/html/v0.2.0/en/server_local.html @@ -218,7 +218,7 @@

                      Steps to Deploy Locallyv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/server_modules.html b/html/v0.2.0/en/server_modules.html index d36f47fd..f6ad924f 100644 --- a/html/v0.2.0/en/server_modules.html +++ b/html/v0.2.0/en/server_modules.html @@ -347,7 +347,7 @@

                      lomas_serverv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.2.0/en/server_onyxia.html b/html/v0.2.0/en/server_onyxia.html index 049c8519..d1076402 100644 --- a/html/v0.2.0/en/server_onyxia.html +++ b/html/v0.2.0/en/server_onyxia.html @@ -194,7 +194,7 @@

                      Deploying Lomas on Onyxiav0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/CONTRIBUTING.html b/html/v0.3.0/en/CONTRIBUTING.html index b09a519d..d1e9e1d6 100644 --- a/html/v0.3.0/en/CONTRIBUTING.html +++ b/html/v0.3.0/en/CONTRIBUTING.html @@ -366,7 +366,7 @@

                      Adding a Data Connector (for private dataset in various databases)v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/CONTRIBUTING_CLIENT.html b/html/v0.3.0/en/CONTRIBUTING_CLIENT.html index 0fba4f7d..4578fe73 100644 --- a/html/v0.3.0/en/CONTRIBUTING_CLIENT.html +++ b/html/v0.3.0/en/CONTRIBUTING_CLIENT.html @@ -173,7 +173,7 @@

                      Pushing a new version to Pypiv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/CONTRIBUTING_SERVER.html b/html/v0.3.0/en/CONTRIBUTING_SERVER.html index a1b4aae5..bd978dd6 100644 --- a/html/v0.3.0/en/CONTRIBUTING_SERVER.html +++ b/html/v0.3.0/en/CONTRIBUTING_SERVER.html @@ -169,7 +169,7 @@

                      Testsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/_modules/index.html b/html/v0.3.0/en/_modules/index.html index d983ef8d..b07188e8 100644 --- a/html/v0.3.0/en/_modules/index.html +++ b/html/v0.3.0/en/_modules/index.html @@ -155,7 +155,7 @@

                      All modules for which code is available

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/_modules/lomas_client/client.html b/html/v0.3.0/en/_modules/lomas_client/client.html index ba348d03..fe17994b 100644 --- a/html/v0.3.0/en/_modules/lomas_client/client.html +++ b/html/v0.3.0/en/_modules/lomas_client/client.html @@ -989,7 +989,7 @@

                      Source code for lomas_client.client

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/_modules/lomas_client/utils.html b/html/v0.3.0/en/_modules/lomas_client/utils.html index 2eab29eb..7325dd36 100644 --- a/html/v0.3.0/en/_modules/lomas_client/utils.html +++ b/html/v0.3.0/en/_modules/lomas_client/utils.html @@ -210,7 +210,7 @@

                      Source code for lomas_client.utils

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/_modules/lomas_server/constants.html b/html/v0.3.0/en/_modules/lomas_server/constants.html index caea50a9..d883f231 100644 --- a/html/v0.3.0/en/_modules/lomas_server/constants.html +++ b/html/v0.3.0/en/_modules/lomas_server/constants.html @@ -477,7 +477,7 @@

                      Source code for lomas_server.constants

                               
                                 
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/_modules/lomas_server/utils/collection_models.html b/html/v0.3.0/en/_modules/lomas_server/utils/collection_models.html index 640b73a1..281ac63a 100644 --- a/html/v0.3.0/en/_modules/lomas_server/utils/collection_models.html +++ b/html/v0.3.0/en/_modules/lomas_server/utils/collection_models.html @@ -278,7 +278,7 @@

                      Source code for lomas_server.utils.collection_models

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/_modules/lomas_server/utils/query_examples.html b/html/v0.3.0/en/_modules/lomas_server/utils/query_examples.html index 619decb8..7eb08e59 100644 --- a/html/v0.3.0/en/_modules/lomas_server/utils/query_examples.html +++ b/html/v0.3.0/en/_modules/lomas_server/utils/query_examples.html @@ -262,7 +262,7 @@

                      Source code for lomas_server.utils.query_examples

                      v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/_modules/lomas_server/utils/query_models.html b/html/v0.3.0/en/_modules/lomas_server/utils/query_models.html index 6938d4c4..602d0396 100644 --- a/html/v0.3.0/en/_modules/lomas_server/utils/query_models.html +++ b/html/v0.3.0/en/_modules/lomas_server/utils/query_models.html @@ -324,7 +324,7 @@

                      Source code for lomas_server.utils.query_models

                      <
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/api.html b/html/v0.3.0/en/api.html index 10bf0366..6b49abc5 100644 --- a/html/v0.3.0/en/api.html +++ b/html/v0.3.0/en/api.html @@ -174,7 +174,7 @@

                      API Documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/client_api.html b/html/v0.3.0/en/client_api.html index 3c05b442..abf1fe06 100644 --- a/html/v0.3.0/en/client_api.html +++ b/html/v0.3.0/en/client_api.html @@ -174,7 +174,7 @@

                      Client APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/client_errors.html b/html/v0.3.0/en/client_errors.html index fe8ac591..02be4628 100644 --- a/html/v0.3.0/en/client_errors.html +++ b/html/v0.3.0/en/client_errors.html @@ -216,7 +216,7 @@

                      Errors<
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/client_examples.html b/html/v0.3.0/en/client_examples.html index e8a9d45f..e993c174 100644 --- a/html/v0.3.0/en/client_examples.html +++ b/html/v0.3.0/en/client_examples.html @@ -219,7 +219,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/client_modules.html b/html/v0.3.0/en/client_modules.html index bb7ddff6..6b011232 100644 --- a/html/v0.3.0/en/client_modules.html +++ b/html/v0.3.0/en/client_modules.html @@ -225,7 +225,7 @@

                      lomas_clientv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/client_quickstart.html b/html/v0.3.0/en/client_quickstart.html index 465959d9..0b2c09e8 100644 --- a/html/v0.3.0/en/client_quickstart.html +++ b/html/v0.3.0/en/client_quickstart.html @@ -207,7 +207,7 @@

                      First stepsv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/genindex.html b/html/v0.3.0/en/genindex.html index 35ffb9c5..11b68cc0 100644 --- a/html/v0.3.0/en/genindex.html +++ b/html/v0.3.0/en/genindex.html @@ -1177,7 +1177,7 @@

                      Z

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/index.html b/html/v0.3.0/en/index.html index e5fcab9d..4a606463 100644 --- a/html/v0.3.0/en/index.html +++ b/html/v0.3.0/en/index.html @@ -240,7 +240,7 @@

                      Indices and tablesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/index_under_construction.html b/html/v0.3.0/en/index_under_construction.html index 386ff680..c367bee9 100644 --- a/html/v0.3.0/en/index_under_construction.html +++ b/html/v0.3.0/en/index_under_construction.html @@ -154,7 +154,7 @@

                      Welcome to Lomas documentationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_client.html b/html/v0.3.0/en/lomas_client.html index 1fd1126e..e699f4ae 100644 --- a/html/v0.3.0/en/lomas_client.html +++ b/html/v0.3.0/en/lomas_client.html @@ -741,7 +741,7 @@

                      Submodulesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.admin_database.html b/html/v0.3.0/en/lomas_server.admin_database.html index ab3d3381..82093e3a 100644 --- a/html/v0.3.0/en/lomas_server.admin_database.html +++ b/html/v0.3.0/en/lomas_server.admin_database.html @@ -193,7 +193,7 @@

                      lomas_server.admin_database.yaml_database modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.administration.html b/html/v0.3.0/en/lomas_server.administration.html index 193c3bf5..0a0f596c 100644 --- a/html/v0.3.0/en/lomas_server.administration.html +++ b/html/v0.3.0/en/lomas_server.administration.html @@ -175,7 +175,7 @@

                      lomas_server.administration packagev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.data_connector.html b/html/v0.3.0/en/lomas_server.data_connector.html index 59019ca4..41ffea41 100644 --- a/html/v0.3.0/en/lomas_server.data_connector.html +++ b/html/v0.3.0/en/lomas_server.data_connector.html @@ -193,7 +193,7 @@

                      lomas_server.data_connector.s3_connector modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.dataset_store.html b/html/v0.3.0/en/lomas_server.dataset_store.html index 04616bae..75cf626d 100644 --- a/html/v0.3.0/en/lomas_server.dataset_store.html +++ b/html/v0.3.0/en/lomas_server.dataset_store.html @@ -193,7 +193,7 @@

                      lomas_server.dataset_store.lru_dataset_store modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.dp_queries.dp_libraries.html b/html/v0.3.0/en/lomas_server.dp_queries.dp_libraries.html index 2cbec2df..5b987973 100644 --- a/html/v0.3.0/en/lomas_server.dp_queries.dp_libraries.html +++ b/html/v0.3.0/en/lomas_server.dp_queries.dp_libraries.html @@ -197,7 +197,7 @@

                      lomas_server.dp_queries.dp_libraries.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.dp_queries.html b/html/v0.3.0/en/lomas_server.dp_queries.html index b3982bfd..97263fa3 100644 --- a/html/v0.3.0/en/lomas_server.dp_queries.html +++ b/html/v0.3.0/en/lomas_server.dp_queries.html @@ -205,7 +205,7 @@

                      lomas_server.dp_queries.dummy_dataset modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.html b/html/v0.3.0/en/lomas_server.html index abee63a4..e16a14f2 100644 --- a/html/v0.3.0/en/lomas_server.html +++ b/html/v0.3.0/en/lomas_server.html @@ -861,7 +861,7 @@

                      lomas_server.uvicorn_serve modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.private_dataset.html b/html/v0.3.0/en/lomas_server.private_dataset.html index cfe3152b..bd2cc2c9 100644 --- a/html/v0.3.0/en/lomas_server.private_dataset.html +++ b/html/v0.3.0/en/lomas_server.private_dataset.html @@ -174,7 +174,7 @@

                      lomas_server.private_dataset.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.routes.html b/html/v0.3.0/en/lomas_server.routes.html index e07c6844..947c864a 100644 --- a/html/v0.3.0/en/lomas_server.routes.html +++ b/html/v0.3.0/en/lomas_server.routes.html @@ -187,7 +187,7 @@

                      lomas_server.routes.utils modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.tests.html b/html/v0.3.0/en/lomas_server.tests.html index 853d73d0..582d32df 100644 --- a/html/v0.3.0/en/lomas_server.tests.html +++ b/html/v0.3.0/en/lomas_server.tests.html @@ -199,7 +199,7 @@

                      lomas_server.tests.test_mongodb_admin_cli modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/lomas_server.utils.html b/html/v0.3.0/en/lomas_server.utils.html index 7952e5e6..ef86cb4f 100644 --- a/html/v0.3.0/en/lomas_server.utils.html +++ b/html/v0.3.0/en/lomas_server.utils.html @@ -1286,7 +1286,7 @@

                      lomas_server.utils.error_handler modulev0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/notebooks/Demo_Client_Notebook.html b/html/v0.3.0/en/notebooks/Demo_Client_Notebook.html index 70f0bfac..7917d604 100644 --- a/html/v0.3.0/en/notebooks/Demo_Client_Notebook.html +++ b/html/v0.3.0/en/notebooks/Demo_Client_Notebook.html @@ -1168,7 +1168,7 @@

                      Step 5: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html b/html/v0.3.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html index f605700f..f9ccda59 100644 --- a/html/v0.3.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html +++ b/html/v0.3.0/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html @@ -2996,7 +2996,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html b/html/v0.3.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html index 59410eda..1dc2702c 100644 --- a/html/v0.3.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html +++ b/html/v0.3.0/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.html @@ -1377,7 +1377,7 @@

                      Hypothesis testingv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html b/html/v0.3.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html index a8fe5555..3ef0b482 100644 --- a/html/v0.3.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html +++ b/html/v0.3.0/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html @@ -2210,7 +2210,7 @@

                      Step 6: See archives of queriesv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/notebooks/local_admin_notebook.html b/html/v0.3.0/en/notebooks/local_admin_notebook.html index 817bd6fe..17096cc6 100644 --- a/html/v0.3.0/en/notebooks/local_admin_notebook.html +++ b/html/v0.3.0/en/notebooks/local_admin_notebook.html @@ -1460,7 +1460,7 @@

                      Stop the server: do not do it now !v0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/notebooks/s3_example_notebook.html b/html/v0.3.0/en/notebooks/s3_example_notebook.html index b9a222fc..cd46afd4 100644 --- a/html/v0.3.0/en/notebooks/s3_example_notebook.html +++ b/html/v0.3.0/en/notebooks/s3_example_notebook.html @@ -911,7 +911,7 @@

                      Confidence intervals for age over the whole populationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/objects.inv b/html/v0.3.0/en/objects.inv index 1c9400ac..06538317 100644 Binary files a/html/v0.3.0/en/objects.inv and b/html/v0.3.0/en/objects.inv differ diff --git a/html/v0.3.0/en/poster.html b/html/v0.3.0/en/poster.html index 5fdca5f7..a792738e 100644 --- a/html/v0.3.0/en/poster.html +++ b/html/v0.3.0/en/poster.html @@ -157,7 +157,7 @@

                      Poster<
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/py-modindex.html b/html/v0.3.0/en/py-modindex.html index aee7f33c..4837f51f 100644 --- a/html/v0.3.0/en/py-modindex.html +++ b/html/v0.3.0/en/py-modindex.html @@ -265,7 +265,7 @@

                      Python Module Index

                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/search.html b/html/v0.3.0/en/search.html index cb5b8901..a590424d 100644 --- a/html/v0.3.0/en/search.html +++ b/html/v0.3.0/en/search.html @@ -162,7 +162,7 @@
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/server_administration.html b/html/v0.3.0/en/server_administration.html index b5cab94a..f3f57e61 100644 --- a/html/v0.3.0/en/server_administration.html +++ b/html/v0.3.0/en/server_administration.html @@ -189,7 +189,7 @@

                      Administrationv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/server_api.html b/html/v0.3.0/en/server_api.html index 7df117fc..022c27e3 100644 --- a/html/v0.3.0/en/server_api.html +++ b/html/v0.3.0/en/server_api.html @@ -174,7 +174,7 @@

                      Server APIv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/server_cli.html b/html/v0.3.0/en/server_cli.html index c2d9a871..5078a047 100644 --- a/html/v0.3.0/en/server_cli.html +++ b/html/v0.3.0/en/server_cli.html @@ -420,7 +420,7 @@

                      Examples
                      v0.3.0
                      -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/server_dashboard.html b/html/v0.3.0/en/server_dashboard.html index 6a1b591d..c068af6f 100644 --- a/html/v0.3.0/en/server_dashboard.html +++ b/html/v0.3.0/en/server_dashboard.html @@ -185,7 +185,7 @@

                      Access via Onyxia Platformv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/server_deployment.html b/html/v0.3.0/en/server_deployment.html index 0204a170..4de95a31 100644 --- a/html/v0.3.0/en/server_deployment.html +++ b/html/v0.3.0/en/server_deployment.html @@ -205,7 +205,7 @@

                      Deploymentv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/server_kubernetes.html b/html/v0.3.0/en/server_kubernetes.html index ee7955e0..9ae919f0 100644 --- a/html/v0.3.0/en/server_kubernetes.html +++ b/html/v0.3.0/en/server_kubernetes.html @@ -244,7 +244,7 @@

                      Installing the Helm Chartv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/server_local.html b/html/v0.3.0/en/server_local.html index 973d8a30..7ca343dc 100644 --- a/html/v0.3.0/en/server_local.html +++ b/html/v0.3.0/en/server_local.html @@ -223,7 +223,7 @@

                      Steps to Deploy Locallyv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/server_modules.html b/html/v0.3.0/en/server_modules.html index d4804f0e..67dda4f2 100644 --- a/html/v0.3.0/en/server_modules.html +++ b/html/v0.3.0/en/server_modules.html @@ -350,7 +350,7 @@

                      lomas_serverv0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.0/en/server_onyxia.html b/html/v0.3.0/en/server_onyxia.html index b7545831..d5d747fe 100644 --- a/html/v0.3.0/en/server_onyxia.html +++ b/html/v0.3.0/en/server_onyxia.html @@ -199,7 +199,7 @@

                      Deploying Lomas on Onyxiav0.3.0 -
                      v0.3.1
                      +
                      v0.3.2
                      diff --git a/html/v0.3.1/en/_sources/index.rst.txt b/html/v0.3.1/en/_sources/index.rst.txt deleted file mode 100644 index bd5037f3..00000000 --- a/html/v0.3.1/en/_sources/index.rst.txt +++ /dev/null @@ -1,134 +0,0 @@ -.. Lomas documentation master file, created by - sphinx-quickstart on Wed May 28 09:18:59 2024. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Lomas: The Data Oases Hidden Behind the Mist. -======================================== -Lomas is a platform for remote data science, enabling sensitive data to be queried remotely while staying protected by a layer of differential privacy. - -Technical Overview: -------------- - -The lomas platform follows a classic server/client model. -On the client side, the user prepares queries for statistical analyses which are sent to the service's REST API via HTTP. The user never has direct access to the sensitive data. -On the server side, the service is implemented in a micro-service architecture and is thus split into two parts: the administration database and the client-facing HTTP server (which we call server for brevity) that implements the service logic. -The server is responsible for processing the client requests and updating its own state as well as administrative data (users data, budgets, query archives, etc.) in the administration database. - -The service is not responsible for storing and managing private datasets, these are usually already stored on the provider's infrastructure. - -Detailed description: -------------- - -For a detailed description, please see the links below. - -* **Lomas Project White Paper**: https://arxiv.org/abs/2406.17087 -* **Swiss Federal Statistical Office Blog**: https://www.bfs.admin.ch/bfs/en/home/dscc/blog/2024-03-lomas.html -* **GitHub repository**: https://github.com/dscc-admin-ch/lomas/tree/master/ - - -Client -======== -The ``lomas_client`` library is a client to interact with the Lomas server. It is available on -Pypi. Reasearcher and Data Scientists 'using' the service to query the sensitive data will -only interact with the client and never with the server. - -Utilizing this client library is strongly advised for querying and interacting with the -server, as it takes care of all the necessary tasks such as serialization, deserialization, -REST API calls, and ensures the correct installation of other required libraries. In short, -it enables a seamless interaction with the server. - -For additional informations about the client, please see the -`README.md `_ of -the client and for additional examples please see the -:doc:`examples ` section. - - -Server -======== -The server side, implemented in a micro-service architecture, is composed of two main services: - -- A client-facing HTTP server, that uses FastAPI for processing user requests and executing diverse queries. -Its primary function is to efficiently handle incoming requests from the client (user) and to execute the different -queries (SmartnoiseSQL, OpenDP, etc.). - -- A MongoDB administration database to manage the server state. This database serves as a repository for user and metadata about the dataset. User-related data include access permissions to specific datasets, allocated budgets for each user, remaining budgets and queries executed so far by the user (that we also refer to as "archives"). Dataset-related data includes details such as dataset names, information and credentials for accessing the sensitive dataset (e.g., S3, local, HTTP), and references to associated metadata. - - -The server connects to external databases, typically deployed by a data owner, to download the -sensitive datasets for query execution. Currently, the server can manage adapters to S3, -http file download and local files. - -For extensive informations about how to administrate the MongoDB database, -please refer to :doc:`Administration ` section. - -We aim to facilitate the platform configuration, deployment and testing on commonly available -IT infrastructure for NSOs and other potential users. - -In this regard, we provide two Helm charts for deploying the server components (server and -MongoDB database) and a client development environment in a Kubernetes cluster. - -For extensive informations about how to deploy, please refer to :doc:`Deployment ` -documentation. - -## Disclaimer -Lomas is a Proof of Concept that is still under development. - -The overall infrastructure security is not our current priority. While attention has been given to the 'logical' aspects within the server, many security aspects are not handled. For example, user authentication is not implemented. However, Lomas can be integrated into other secure infrastructures. - -We welcome any feedback or suggestions for future improvements. External input is valuable as we continue to enhance the security and functionality of Lomas. Please open a bug report or issue here: https://github.com/dscc-admin-ch/lomas/issues.open. - -History -======== -The starting point of our platform was the code shared to us by `Oblivious `_. - -They originally developed a client/server platform for the `UN PET Lab Hackathon 2022 `_. - -.. toctree:: - :maxdepth: 2 - :caption: Client - :hidden: - - client_quickstart - client_examples - client_errors - -.. toctree:: - :maxdepth: 2 - :caption: Server - :hidden: - - server_deployment - server_administration - -.. toctree:: - :maxdepth: 2 - :caption: Python API - :hidden: - - api - -.. toctree:: - :maxdepth: 2 - :caption: Contributing - :hidden: - - CONTRIBUTING.md - CONTRIBUTING_CLIENT.md - CONTRIBUTING_SERVER.md - - poster - -.. toctree:: - :maxdepth: 2 - :caption: poster - :hidden: - - poster - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb.txt b/html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb.txt deleted file mode 100644 index 3dfd5e79..00000000 --- a/html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb.txt +++ /dev/null @@ -1,2857 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3f18d338", - "metadata": {}, - "source": [ - "# Lomas Client Side: Using DiffPrivlib" - ] - }, - { - "cell_type": "markdown", - "id": "1582a2ae", - "metadata": {}, - "source": [ - "This notebook showcases how researcher could use lomas platform with DiffPrivLib. It explains the different functionnalities provided by the `lomas-client` client library to interact with lomas server.\n", - "\n", - "The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.\n", - "\n", - "Each user has access to one or multiple projects and for each dataset has a limited budget with $\\epsilon$ and $\\delta$ values." - ] - }, - { - "cell_type": "markdown", - "id": "5b73135c", - "metadata": {}, - "source": [ - "In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins data." - ] - }, - { - "cell_type": "markdown", - "id": "01ae30d2", - "metadata": {}, - "source": [ - "## Step 1: Install the library\n", - "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `lomas-client` on her local developping environment. \n", - "\n", - "It can be installed via the pip command:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "8b340f40-32c9-487b-bc0c-a76593d43980", - "metadata": {}, - "outputs": [], - "source": [ - "# !pip install lomas_client" - ] - }, - { - "cell_type": "markdown", - "id": "46c4f70b-1491-4162-930c-e0a86406ba69", - "metadata": {}, - "source": [ - "Or using a local version of the client" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "36d508bf-6cc3-4034-8e11-fffe858552f9", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "import os\n", - "sys.path.append(os.path.abspath(os.path.join('..')))" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "9535e92e-620e-4df4-92dd-4ea2c653e4ab", - "metadata": {}, - "outputs": [], - "source": [ - "from lomas_client import Client\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "id": "9c63718b", - "metadata": {}, - "source": [ - "## Step 2: Initialise the client\n", - "\n", - "Once the library is installed, a Client object must be created. It is responsible for sending sending requests to the server and processing responses in the local environment. It enables a seamless interaction with the server. \n", - "\n", - "To create the client, Dr. Antartica needs to give it a few parameters:\n", - "- a url: the root application endpoint to the remote secure server.\n", - "- user_name: her name as registered in the database (Dr. Alice Antartica)\n", - "- dataset_name: the name of the dataset that she wants to query (PENGUIN)\n", - "\n", - "She will only be able to query on the real dataset if the queen Icergina has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some epsilon and delta credit (as is done in the Admin Notebook for Users and Datasets management)." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "941991f7", - "metadata": {}, - "outputs": [], - "source": [ - "APP_URL = \"http://lomas_server\"\n", - "USER_NAME = \"Dr. Antartica\"\n", - "DATASET_NAME = \"PENGUIN\"\n", - "client = Client(url=APP_URL, user_name = USER_NAME, dataset_name = DATASET_NAME)" - ] - }, - { - "cell_type": "markdown", - "id": "0ec400c8", - "metadata": {}, - "source": [ - "And that's it for the preparation. She is now ready to use the various functionnalities offered by `lomas-client`." - ] - }, - { - "cell_type": "markdown", - "id": "9b9a5f13", - "metadata": {}, - "source": [ - "## Step 3: Metadata and dummy dataset" - ] - }, - { - "cell_type": "markdown", - "id": "c7cb5531", - "metadata": {}, - "source": [ - "### Getting dataset metadata\n", - "\n", - "Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the `get_dataset_metadata()` function of the client. As this is public information, this does not cost any budget." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "0fdebac9-57fc-4410-878b-5a77425af634", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'censor_dims': False,\n", - " 'columns': {'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Adelie', 'Chinstrap', 'Gentoo']},\n", - " 'island': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Torgersen', 'Biscoe', 'Dream']},\n", - " 'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},\n", - " 'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},\n", - " 'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},\n", - " 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},\n", - " 'sex': {'type': 'string',\n", - " 'cardinality': 2,\n", - " 'categories': ['MALE', 'FEMALE']}},\n", - " 'rows': 344}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "penguin_metadata = client.get_dataset_metadata()\n", - "penguin_metadata" - ] - }, - { - "cell_type": "markdown", - "id": "9e7ca7ae-bf17-40c8-aa75-2d72fcdd3088", - "metadata": {}, - "source": [ - "## Step 4: Train Logistic Regression model with DiffPrivLib" - ] - }, - { - "cell_type": "markdown", - "id": "2de1389c-53a7-4098-bc3c-397c12a4b869", - "metadata": {}, - "source": [ - "We want to train an ML model to guess the species of penguins based on their bill length and depth, flipper length and body mass.\n", - "\n", - "Therefore, we use a DiffPrivLib pipeline which:\n", - "- standard scales the dimensions between the metadata bounds\n", - "- and then performs a logistic regression\n", - "to predict the species of penguins." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "2864729f-2ce4-4d81-a446-8e3f2c1493b3", - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.pipeline import Pipeline\n", - "from diffprivlib import models\n", - "import pandas as pd" - ] - }, - { - "cell_type": "markdown", - "id": "a06365e9-4076-4592-871a-31af91d6a05d", - "metadata": {}, - "source": [ - "### Classification: Logistic Regression" - ] - }, - { - "cell_type": "markdown", - "id": "ea567662-6518-4c10-bd87-0fb6028db263", - "metadata": {}, - "source": [ - "Dr. Antartica wants to do a logistic regression on the feature columns 'bill_length_mm', 'bill_depth_mm', 'flipper_length_mm' and'body_mass_g' to predict penguin species." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "bda4884f-bce2-43b3-875e-dbb135492e79", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']\n", - "target_columns = ['species']" - ] - }, - { - "cell_type": "markdown", - "id": "2fe9db5e-9c57-41f3-a444-c9f67100ba81", - "metadata": {}, - "source": [ - "#### She starts to write the associated DiffPrivLib pipeline and tries it on the dummy." - ] - }, - { - "cell_type": "markdown", - "id": "eead3541-66e5-4c0f-aa5b-7b97821afe39", - "metadata": {}, - "source": [ - "If the DiffprivlibCompatibilityWarning is raised by DiffPrivLib library, an warning will be raised the first time (as in DiffPrivLib) then the 'wrong' parameters will be ignored within the server." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "804f31cd-f277-47d4-9648-a51872eccf29", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.11/site-packages/diffprivlib/utils.py:71: DiffprivlibCompatibilityWarning: Parameter 'svd_solver' is not functional in diffprivlib. Remove this parameter to suppress this warning.\n", - " warnings.warn(f\"Parameter '{arg}' is not functional in diffprivlib. Remove this parameter to suppress this \"\n" - ] - } - ], - "source": [ - "# DiffprivlibCompatibilityWarning Error expected\n", - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5)),\n", - " ('classifier', models.LogisticRegression(epsilon = 1.0, svd_solver='full'))\n", - "])" - ] - }, - { - "cell_type": "markdown", - "id": "15dd0c42-3e20-4b27-95b3-9b55622b4bfd", - "metadata": {}, - "source": [ - "To resolve the DiffprivlibCompatibilityWarning issue, the svd_solver should not be set as it is incompatible with DiffPrivLib. If these warnings are ignore by the user, the default behaviour of DiffPrivLib will be applied." - ] - }, - { - "cell_type": "markdown", - "id": "9c5d7fa4-cfe6-4a4f-88ff-8e88ca31dfed", - "metadata": {}, - "source": [ - "If PrivacyLeakWarning are encountered, then the query will not be processed by the server and will return an error." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "f1c9cffb-8327-400d-ab9d-35c5450fd4d6", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5)),\n", - " ('classifier', models.LogisticRegression(epsilon = 1.0))\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "db1ddfbc-de3e-43fe-9958-49f9e6dad89f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error while processing DiffPrivLib request in server status code: 422 message: {\"ExternalLibraryException\":\"PrivacyLeakWarning: Bounds parameter hasn't been specified, so falling back to determining bounds from the data.\\n This will result in additional privacy leakage. To ensure differential privacy with no additional privacy loss, specify `bounds` for each valued returned by np.mean().. Lomas server cannot fit pipeline on data, PrivacyLeakWarning is a blocker.\",\"library\":\"diffprivlib\"}\n" - ] - } - ], - "source": [ - "# Expect PrivacyLeakWarning Error\n", - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "c9d58006-89d5-4110-9657-641256bafaf9", - "metadata": {}, - "source": [ - "Diffprivlib requests that have **PrivacyLeakWarning** will not be processed in the server. \n", - "In lomas, the bounds must always be specified. For most model, it is best to use **the standard scaler must always be used as a first step** and fill it based on the metadata values." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "87384eb3-6b6c-44f8-b653-af471b234a2d", - "metadata": {}, - "outputs": [], - "source": [ - "def get_bounds(cols_metadata, columns):\n", - " lower = [cols_metadata[col][\"lower\"] for col in columns]\n", - " upper = [cols_metadata[col][\"upper\"] for col in columns]\n", - " return (lower, upper)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "12d1faa1-f88a-49bb-911a-83f879ca10b6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)\n", - "bounds" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "1ca11e06-0b1e-4238-a5c1-1e52a6569431", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5, bounds=bounds)),\n", - " ('classifier', models.LogisticRegression(epsilon = 1.0))\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "235d7da6-f6bd-4e71-9b07-84cbe283b74e", - "metadata": {}, - "outputs": [], - "source": [ - "# Expect PrivacyLeakWarning Error\n", - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "c47aec3e-15ea-476d-9dcb-5b2f4888e355", - "metadata": {}, - "source": [ - "Again, we have a Privacy Leak. For the same reason, the data_norm should be computed based on metadata and given as argument as explained in the error message." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "25a72ad9-d3f3-478a-8d33-c07bedbf4f66", - "metadata": {}, - "outputs": [], - "source": [ - "# The max l2 norm of any row of the data. This defines the spread of data that will be protected by differential privacy.\n", - "data_norm = np.sqrt(np.linalg.norm(bounds[1]))" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "828a743e-960f-4713-a6ed-a0bd243a13e3", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5, bounds=bounds)),\n", - " ('classifier', models.LogisticRegression(epsilon = 1.0, data_norm = data_norm))\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "c9c13dfe-0266-4cd8-b126-2accee6c1136", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "2ccdb7f5-5968-47e7-99d4-16067b8645a2", - "metadata": {}, - "source": [ - "The pipeline worked, she can check that she has a dummy model and a dummy score associated. In the case of a Logistic Regression the score is a mean accuracy as specified [here](https://diffprivlib.readthedocs.io/en/latest/modules/models.html#diffprivlib.models.LogisticRegression.score).\n", - "Each model return an associated score. The associated documentation is in the DiffPrivLib documentation in the `score` method of each model." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "3c38f919-7ca1-455c-9b0f-bc2b56f60c0f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'score': 0.3,\n", - " 'model': Pipeline(steps=[('scaler',\n", - " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " epsilon=0.5)),\n", - " ('classifier',\n", - " LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", - " data_norm=83.69469642643347))])}" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dummy_response['query_response']" - ] - }, - { - "cell_type": "markdown", - "id": "6a61629d-b96f-4114-8bc2-eccf34d69d2b", - "metadata": {}, - "source": [ - "Now that the pipeline seems to work, she also wants to choose another data imputation method: be default the missing data are dropped but she wants the replace them with the mean. Therefore, she uses the `imputer_strategy` argument." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "547935ca-0932-4476-8ace-3644c7e0a08d", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"mean\",\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "4587385a-b76e-45f4-a1d9-af0a88a1181f", - "metadata": {}, - "source": [ - "It also works. It she wanted she could replace by the mean value with `imputer_strategy = \"mean\"` or the most frequent value with `imputer_strategy = \"most_frequent\"` (most_frequent makes more sense in the case of categorical columns). " - ] - }, - { - "cell_type": "markdown", - "id": "381cd096-bde3-474b-b24d-7fcb4c6ae49f", - "metadata": {}, - "source": [ - "Finally, she wants to use as much data as possible to train the model so she decides to reduce the `test_size` to 0.1 (meaning that 10% of the data will be used as the test set and 90% and the training set). Also she modifies the seed for the random split between training and testing data `test_train_split_seed` because why not. By default `test_size = 0.2` and `test_train_split_seed = 1`." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "73e8b9ab-2d93-4333-ace3-c94c714410dc", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.1,\n", - " test_train_split_seed = 4,\n", - " imputer_strategy = \"mean\",\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "4f9c2330-15f3-46f9-94c1-d62ea350e2e8", - "metadata": {}, - "source": [ - "#### She can now estimated the cost of this pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "e036b55f-6c3d-4212-8d91-9ece8223cf69", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 1.5, 'delta_cost': 0.0}" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = client.estimate_diffprivlib_cost(\n", - " dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.1,\n", - " test_train_split_seed = 4,\n", - " imputer_strategy = \"mean\",\n", - ")\n", - "res" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "4398755f-348f-47e2-9329-80c34897e16b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'The cost will be 1.5 epsilon and 0.0 delta.'" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f\"The cost will be {res['epsilon_cost']} epsilon and {res['delta_cost']} delta.\"" - ] - }, - { - "cell_type": "markdown", - "id": "8aad5f86-20f7-42fe-8efd-56c96f6beb41", - "metadata": {}, - "source": [ - "Now we train the same pipeline on the real dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "b823db85-d993-4a36-9dea-bf5989c543f8", - "metadata": {}, - "outputs": [], - "source": [ - "res = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.1,\n", - " test_train_split_seed = 4,\n", - " imputer_strategy = \"mean\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "6c071425-5364-4d79-8ccf-4f46018ac849", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'The accuracy score of the model trained on real data is 0.22857142857142856.'" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f\"The accuracy score of the model trained on real data is {res['query_response']['score']}.\"" - ] - }, - { - "cell_type": "markdown", - "id": "9cea3fc7-4331-4387-a19f-6afcaa21b6bc", - "metadata": {}, - "source": [ - "The model is with different trained parameters is also available:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "b646cd08-504b-4846-88ba-a3557ee4b2fd", - "metadata": {}, - "outputs": [], - "source": [ - "model = res['query_response']['model']" - ] - }, - { - "cell_type": "markdown", - "id": "a581f47d-f1c7-4121-9f8f-e496e9023d58", - "metadata": {}, - "source": [ - "We predict what would be the specie of the smallest possible penguin in all dimension versus to biggest possible penguin in all dimensions." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "65413ef0-317b-431d-9ed8-6ffabe85c1b2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmflipper_length_mmbody_mass_gpredictions
                      030.013.0150.02000.0Chinstrap
                      165.023.0250.07000.0Gentoo
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm flipper_length_mm body_mass_g predictions\n", - "0 30.0 13.0 150.0 2000.0 Chinstrap\n", - "1 65.0 23.0 250.0 7000.0 Gentoo" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'bill_depth_mm': [bounds[0][1], bounds[1][1]] , \n", - " 'flipper_length_mm': [bounds[0][2], bounds[1][2]], \n", - " 'body_mass_g': [bounds[0][3], bounds[1][3]]\n", - "})\n", - "\n", - "predictions = model.predict(x_to_predict)\n", - "x_to_predict[\"predictions\"] = predictions\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "839ba199-3014-4e39-8f0a-aecf15241b11", - "metadata": {}, - "source": [ - "## Step 5: Train other models with DiffPrivLib" - ] - }, - { - "cell_type": "markdown", - "id": "4f161f96-e240-45b2-bb60-002870196158", - "metadata": {}, - "source": [ - "The logic is always the same for all the models. The `pipeline` and `feature_columns` arguments must always be specified for all models. The `target_columns` must be specified except for Clustering (K-Means) and Dimensinnality reduction (PCA).\n", - "\n", - "Here are examples of each on dummy dataframes." - ] - }, - { - "cell_type": "markdown", - "id": "fef35343-cdf6-4e86-a54a-4bcf6568f2ac", - "metadata": {}, - "source": [ - "### Classification: Gaussian Naive Bayes" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "f8a5ddc0-61bb-44c0-a14b-5ac3278ff539", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm']\n", - "target_columns = ['species']" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "4f4b9789-7da1-4abe-9dd6-dd1472a4e217", - "metadata": {}, - "outputs": [], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "9dd37857-0ef2-44d5-b206-092262c9cea1", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5, bounds=bounds)),\n", - " ('gaussian', models.GaussianNB(epsilon = 1.0, bounds=bounds, priors = (0.3, 0.3, 0.4))),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "8e2c07c6-20f4-473c-80f6-b4b558191530", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.15,\n", - " imputer_strategy = \"median\",\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "550868df-5476-496e-849d-8787da9eb27e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 1.5, 'delta_cost': 0.0}" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost_res = client.estimate_diffprivlib_cost(\n", - " dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.15,\n", - " imputer_strategy = \"median\",\n", - ")\n", - "cost_res" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "934a1237-68d1-4796-838e-e8c370068f5d", - "metadata": {}, - "outputs": [], - "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"median\",\n", - " test_size = 0.15,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "81708812-897a-4357-af06-139220538831", - "metadata": {}, - "outputs": [], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'bill_depth_mm': [bounds[0][1], bounds[1][1]] , \n", - " 'flipper_length_mm': [bounds[0][2], bounds[1][2]], \n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "ec3c98d3-cb5d-4a96-9ada-ea9904326aec", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmflipper_length_mmpredictions
                      030.013.0150.0Chinstrap
                      165.023.0250.0Chinstrap
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm flipper_length_mm predictions\n", - "0 30.0 13.0 150.0 Chinstrap\n", - "1 65.0 23.0 250.0 Chinstrap" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "predictions = response['query_response']['model'].predict(x_to_predict)\n", - "x_to_predict[\"predictions\"] = predictions\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "c1224c94-d995-40f1-967d-b7afb21bce48", - "metadata": {}, - "source": [ - "### Random Forest" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "980f4494-4b1f-4cb0-b288-ddc672231b1f", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'body_mass_g']\n", - "target_columns = ['island']" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "e91f9a5c-14ea-4e48-8e42-fa50152767b7", - "metadata": {}, - "outputs": [], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "d4f036a7-0405-4f4b-a4a0-3fe1b0b8d4d0", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " (\n", - " 'rf', \n", - " models.RandomForestClassifier(\n", - " n_estimators=10, \n", - " epsilon = 2.0, \n", - " bounds=bounds, \n", - " classes=penguin_metadata['columns']['island']['categories']\n", - " )\n", - " ),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "c969d488-e1a2-445a-a269-681d96343b9f", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"drop\", #default\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "de94f0a5-6e9d-4eac-aa77-b98892ed41fc", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 2.0, 'delta_cost': 0.0}" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost_res = client.estimate_diffprivlib_cost(\n", - " dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"drop\", #default\n", - ")\n", - "cost_res" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "40f25e33-a644-4938-8adb-a7bbe5306ee2", - "metadata": {}, - "outputs": [], - "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"drop\", #default\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "4f5fad30-991e-45f3-a7e3-1ae04bedd8a1", - "metadata": {}, - "outputs": [], - "source": [ - "model = response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "96562928-73e8-48b1-b8a5-97245c7da8d2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmbody_mass_gpredictions
                      030.013.02000.0Torgersen
                      165.023.07000.0Torgersen
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm body_mass_g predictions\n", - "0 30.0 13.0 2000.0 Torgersen\n", - "1 65.0 23.0 7000.0 Torgersen" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'bill_depth_mm': [bounds[0][1], bounds[1][1]] , \n", - " 'body_mass_g': [bounds[0][2], bounds[1][2]]\n", - "})\n", - "predictions = model.predict(x_to_predict)\n", - "x_to_predict[\"predictions\"] = predictions\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "020ceeb1-7a78-4036-8ece-0afa88e49342", - "metadata": {}, - "source": [ - "### Decision Tree Classifier" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "c5400d29-8303-4714-8617-8a2b26b0aa2e", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'body_mass_g']\n", - "target_columns = ['species']" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "1760f475-6326-41e5-945a-66882183bc00", - "metadata": {}, - "outputs": [], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "22b5c5ae-b008-4980-8767-47e7a1ad3301", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " (\n", - " 'dtc', \n", - " models.DecisionTreeClassifier(\n", - " epsilon = 2.0, \n", - " bounds=bounds, \n", - " classes=penguin_metadata['columns']['species']['categories']\n", - " )\n", - " ),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "70b73ba0-67dc-4594-820c-0128916fafc8", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.2,\n", - " test_train_split_seed = 1,\n", - " dummy = True,\n", - " nb_rows = 100,\n", - " seed = 42\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "736e8283-604a-4e45-9e98-7da5cc03e1b0", - "metadata": {}, - "outputs": [], - "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.2,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "66bfe1a9-7982-4d6b-ac0b-32a4412f29bf", - "metadata": {}, - "outputs": [], - "source": [ - "model = response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "a3719359-58a6-4271-9a34-4b49e0d7188e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbody_mass_gpredictions
                      030.02000.0Adelie
                      165.07000.0Chinstrap
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm body_mass_g predictions\n", - "0 30.0 2000.0 Adelie\n", - "1 65.0 7000.0 Chinstrap" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'body_mass_g': [bounds[0][1], bounds[1][1]] , \n", - "})\n", - "x_to_predict[\"predictions\"] = model.predict(x_to_predict)\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "4e72e9fc-bb5b-49d9-b4e6-543bdaf93f69", - "metadata": {}, - "source": [ - "### Regression: Linear Regression" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "c893cbb0-26b7-4367-ab67-1ccc88f951ed", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm']\n", - "target_columns = ['bill_depth_mm']" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "c7c66418-74b3-4887-bb99-3d8b6ea7af3d", - "metadata": {}, - "outputs": [], - "source": [ - "bill_length_meta = penguin_metadata['columns']['bill_length_mm']\n", - "bill_depth_meta = penguin_metadata['columns']['bill_depth_mm']" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "907e6f6c-a3da-4f7c-8d85-b0a7b8c018d1", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " (\n", - " 'lr', \n", - " models.LinearRegression(\n", - " epsilon = 2.0, \n", - " bounds_X=(bill_length_meta['lower'], bill_length_meta['upper']), \n", - " bounds_y=(bill_depth_meta['lower'], bill_depth_meta['upper'])\n", - " )\n", - " ),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "58011a7d-7c03-4872-a032-5d93c55c1d5f", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " dummy = True\n", - ")\n", - "model = dummy_response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "e28b1bd0-0e73-49db-a2d3-e7f06dc39d49", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmpredictions
                      030.017.641046
                      165.018.526961
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm predictions\n", - "0 30.0 17.641046\n", - "1 65.0 18.526961" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Dummy model predictions\n", - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bill_length_meta['lower'], bill_length_meta['upper']], \n", - "})\n", - "x_to_predict[\"predictions\"] = model.predict(x_to_predict)\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "ec9e921d-1640-4379-84e5-65b93a1ff203", - "metadata": {}, - "source": [ - "### Clustering: K-Means" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "2491d06f-3c40-4649-b419-ccd9b39f0764", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "10acc43d-ff2e-4d7a-9c52-361ffb80e0da", - "metadata": {}, - "outputs": [], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "1e830a01-7800-4701-aef2-11dbfc517f61", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('kmeans', models.KMeans(n_clusters = 8, epsilon = 2.0, bounds=bounds)),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "cb5e3e1f-2d48-4d5e-992a-c0e0cb6add3b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      Pipeline(steps=[('kmeans',\n",
                      -       "                 KMeans(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n",
                      -       "                        bounds=(array([  30.,   13.,  150., 2000.]),\n",
                      -       "                                array([  65.,   23.,  250., 7000.])),\n",
                      -       "                        epsilon=2.0))])
                      In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
                      On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
                      " - ], - "text/plain": [ - "Pipeline(steps=[('kmeans',\n", - " KMeans(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " epsilon=2.0))])" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " dummy = True\n", - ")\n", - "model = dummy_response['query_response']['model']\n", - "model" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "a0612b10-de7a-4355-8268-09a46c30056a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmflipper_length_mmbody_mass_gpredictions
                      030.013.0150.02000.05
                      165.023.0250.07000.06
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm flipper_length_mm body_mass_g predictions\n", - "0 30.0 13.0 150.0 2000.0 5\n", - "1 65.0 23.0 250.0 7000.0 6" - ] - }, - "execution_count": 82, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Dummy model predictions\n", - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'bill_depth_mm': [bounds[0][1], bounds[1][1]] , \n", - " 'flipper_length_mm': [bounds[0][2], bounds[1][2]], \n", - " 'body_mass_g': [bounds[0][3], bounds[1][3]]\n", - "})\n", - "x_to_predict[\"predictions\"] = model.predict(x_to_predict)\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "6021b034-b15d-4826-8de3-80b99afc838d", - "metadata": {}, - "source": [ - "### Dimensionality Reduction: PCA" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "id": "fd8347be-5951-419d-820c-26655db5ea8c", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']\n", - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "id": "f9a4cbaf-b994-41c0-a0e9-81674c6657fb", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " (\n", - " 'pca', \n", - " models.PCA(\n", - " n_components=None, \n", - " epsilon = 1.0, \n", - " bounds=bounds, \n", - " data_norm=100, \n", - " centered=False\n", - " )\n", - " ),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "id": "4681cc17-6285-4b9b-a26d-837d6a79e1c3", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " dummy = True\n", - ")\n", - "model = dummy_response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "id": "e2d6912e-f97c-4ac6-9085-c7379136628c", - "metadata": {}, - "outputs": [], - "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - ")\n", - "model = response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "id": "e2c0cafa-49f6-48de-aa1a-4e84bbbf97cf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      PCA(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n",
                      -       "    bounds=(array([  30.,   13.,  150., 2000.]),\n",
                      -       "            array([  65.,   23.,  250., 7000.])),\n",
                      -       "    data_norm=100)
                      In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
                      On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
                      " - ], - "text/plain": [ - "PCA(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " data_norm=100)" - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model = model.steps[0][1]\n", - "pca_model" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "id": "b1ac9784-bd0e-41c6-bb54-8201d9ab13ad", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 0.06269805, -0.02257092, 0.12818723, 0.98950874],\n", - " [ 0.54397209, 0.70486754, -0.4534618 , 0.0403549 ],\n", - " [-0.04333305, 0.56533889, 0.81874155, -0.09042376],\n", - " [ 0.83563483, -0.42783671, 0.3280285 , -0.10520211]])" - ] - }, - "execution_count": 116, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.components_" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "id": "d7cf2790-1938-48b1-83b3-3b17b06953fc", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([12087.46118653, 4144.29748358, 2619.4887658 , 121.73642974])" - ] - }, - "execution_count": 117, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.explained_variance_" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "id": "91992588-2eb5-4b6b-9f30-ccaa272c593a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.63708804, 0.21843151, 0.13806414, 0.0064163 ])" - ] - }, - "execution_count": 118, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.explained_variance_ratio_" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "id": "9e76a632-114b-428f-ad78-d83fdcd00d56", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1789.74222011, 179.61111848, 1047.96890848, 833.1653635 ])" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.singular_values_" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "id": "fc13910b-b892-4a46-bff9-c3df4cc6ed72", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 44.38324636, 16.88939657, 198.03063776, 4207.08181725])" - ] - }, - "execution_count": 120, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.mean_" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "id": "bd11a051-1452-4b59-8c18-622737986125", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.n_components_" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "id": "282d55e9-0968-4528-b2d4-4d87d64d4c1a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0" - ] - }, - "execution_count": 122, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.noise_variance_" - ] - }, - { - "cell_type": "markdown", - "id": "94eaf59b-c108-424c-8978-b1c86e141ccb", - "metadata": {}, - "source": [ - "## Step 6: See archives of queries" - ] - }, - { - "cell_type": "markdown", - "id": "64003c53-de56-4bdc-a3c2-0c3e40031919", - "metadata": {}, - "source": [ - "She now wants to verify all the queries that she did on the real data. It is possible because an archive of all queries is kept in a secure database. With a function call she can see her queries, budget and associated responses." - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "id": "008fd230-cdfd-4e03-91ce-5a60b06c106d", - "metadata": {}, - "outputs": [], - "source": [ - "previous_queries = client.get_previous_queries()" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "id": "1795a54b-d04e-4687-8649-93982c84ad30", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'diffprivlib',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'diffprivlib_json': '{\"module\": \"diffprivlib\", \"version\": \"0.6.4\", \"pipeline\": [{\"type\": \"_dpl_type:StandardScaler\", \"name\": \"scaler\", \"params\": {\"with_mean\": true, \"with_std\": true, \"copy\": true, \"epsilon\": 0.5, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0]]}, \"random_state\": null, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}, {\"type\": \"_dpl_type:LogisticRegression\", \"name\": \"classifier\", \"params\": {\"tol\": 0.0001, \"C\": 1.0, \"fit_intercept\": true, \"random_state\": null, \"max_iter\": 100, \"verbose\": 0, \"warm_start\": false, \"n_jobs\": null, \"epsilon\": 1.0, \"data_norm\": 83.69469642643347, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}]}',\n", - " 'feature_columns': ['bill_length_mm',\n", - " 'bill_depth_mm',\n", - " 'flipper_length_mm',\n", - " 'body_mass_g'],\n", - " 'target_columns': ['species'],\n", - " 'test_size': 0.1,\n", - " 'test_train_split_seed': 4,\n", - " 'imputer_strategy': 'mean'},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'score': 0.22857142857142856,\n", - " 'model': Pipeline(steps=[('scaler',\n", - " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " epsilon=0.5)),\n", - " ('classifier',\n", - " LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", - " data_norm=83.69469642643347))])},\n", - " 'spent_epsilon': 1.5,\n", - " 'spent_delta': 0.0},\n", - " 'timestamp': 1725375748.4772062}" - ] - }, - "execution_count": 126, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query_1 = previous_queries[0]\n", - "query_1" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "id": "ef251e47-67d8-426b-9655-c16d32778579", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'diffprivlib',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'diffprivlib_json': '{\"module\": \"diffprivlib\", \"version\": \"0.6.4\", \"pipeline\": [{\"type\": \"_dpl_type:StandardScaler\", \"name\": \"scaler\", \"params\": {\"with_mean\": true, \"with_std\": true, \"copy\": true, \"epsilon\": 0.5, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 150.0], [65.0, 23.0, 250.0]]}, \"random_state\": null, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}, {\"type\": \"_dpl_type:GaussianNB\", \"name\": \"gaussian\", \"params\": {\"priors\": {\"_tuple\": true, \"_items\": [0.3, 0.3, 0.4]}, \"var_smoothing\": 1e-09, \"epsilon\": 1.0, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 150.0], [65.0, 23.0, 250.0]]}, \"random_state\": null, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}]}',\n", - " 'feature_columns': ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],\n", - " 'target_columns': ['species'],\n", - " 'test_size': 0.15,\n", - " 'test_train_split_seed': 1,\n", - " 'imputer_strategy': 'median'},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'score': 0.17307692307692307,\n", - " 'model': Pipeline(steps=[('scaler',\n", - " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", - " bounds=(array([ 30., 13., 150.]),\n", - " array([ 65., 23., 250.])),\n", - " epsilon=0.5)),\n", - " ('gaussian',\n", - " GaussianNB(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", - " bounds=(array([ 30., 13., 150.]),\n", - " array([ 65., 23., 250.])),\n", - " priors=(0.3, 0.3, 0.4)))])},\n", - " 'spent_epsilon': 1.5,\n", - " 'spent_delta': 0.0},\n", - " 'timestamp': 1725375760.2964165}" - ] - }, - "execution_count": 127, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query_2 = previous_queries[1]\n", - "query_2" - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "id": "b2fa8943-f0e0-4902-9001-bd10fb22a653", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'diffprivlib',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'diffprivlib_json': '{\"module\": \"diffprivlib\", \"version\": \"0.6.4\", \"pipeline\": [{\"type\": \"_dpl_type:RandomForestClassifier\", \"name\": \"rf\", \"params\": {\"n_estimators\": 10, \"n_jobs\": 1, \"random_state\": null, \"verbose\": 0, \"warm_start\": false, \"max_depth\": 5, \"epsilon\": 2.0, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 2000.0], [65.0, 23.0, 7000.0]]}, \"classes\": [\"Torgersen\", \"Biscoe\", \"Dream\"], \"shuffle\": false, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}]}',\n", - " 'feature_columns': ['bill_length_mm', 'bill_depth_mm', 'body_mass_g'],\n", - " 'target_columns': ['island'],\n", - " 'test_size': 0.2,\n", - " 'test_train_split_seed': 1,\n", - " 'imputer_strategy': 'drop'},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'score': 0.4925373134328358,\n", - " 'model': Pipeline(steps=[('rf',\n", - " RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", - " bounds=(array([ 30., 13., 2000.]),\n", - " array([ 65., 23., 7000.])),\n", - " classes=['Torgersen', 'Biscoe',\n", - " 'Dream'],\n", - " epsilon=2.0))])},\n", - " 'spent_epsilon': 2.0,\n", - " 'spent_delta': 0.0},\n", - " 'timestamp': 1725375769.0791934}" - ] - }, - "execution_count": 128, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query_3 = previous_queries[2]\n", - "query_3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e2c8d40d-94b3-4d69-af99-0ec2936f233e", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/html/v0.3.1/en/index_under_construction.html b/html/v0.3.1/en/index_under_construction.html deleted file mode 100644 index 75fa2866..00000000 --- a/html/v0.3.1/en/index_under_construction.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - Welcome to Lomas documentation — Lomas 0.0.1 documentation - - - - - - - - - - - - - - - - -
                      - - -
                      - -
                      -
                      -
                      - -
                      -
                      -
                      -
                      - -
                      -

                      Welcome to Lomas documentation

                      -

                      The page for this version is still under construction. Please try again later!

                      -
                      - - -
                      -
                      - -
                      -
                      -
                      -
                      -
                      - - Version: v0.3.1 - - -
                      - -
                      -
                      Languages
                      - -
                      en
                      - -
                      - - -
                      -
                      Versions
                      - -
                      stable
                      - -
                      develop
                      - -
                      v0.1.0
                      - -
                      v0.1.1
                      - -
                      v0.1.2
                      - -
                      v0.2.0
                      - -
                      v0.3.0
                      - -
                      v0.3.1
                      - -
                      - -
                      - -
                      -
                      - - - \ No newline at end of file diff --git a/html/v0.3.1/en/notebooks/Demo_Client_Notebook.html b/html/v0.3.1/en/notebooks/Demo_Client_Notebook.html deleted file mode 100644 index 7e899449..00000000 --- a/html/v0.3.1/en/notebooks/Demo_Client_Notebook.html +++ /dev/null @@ -1,2465 +0,0 @@ - - - - - - - - - Lomas: Client demo — Lomas 0.0.1 documentation - - - - - - - - - - - - - - - - - - - - - -
                      - - -
                      - -
                      -
                      -
                      - -
                      -
                      -
                      -
                      - -
                      -

                      Lomas: Client demo

                      -

                      This notebook showcases how researcher could use the Lomas platform. It explains the different functionnalities provided by the lomas-client library to interact with the secure server.

                      -

                      The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.

                      -

                      Each user has access to one or multiple projects and for each dataset has a limited budget with \(\epsilon\) and \(\delta\) values.

                      -
                      -
                      [1]:
                      -
                      -
                      -
                      from IPython.display import Image
                      -Image(filename="images/image_demo_client.png", width=800)
                      -
                      -
                      -
                      -
                      -
                      [1]:
                      -
                      -
                      -
                      -../_images/notebooks_Demo_Client_Notebook_2_0.png -
                      -
                      -

                      🐧🐧🐧 In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins dimensions.

                      -

                      Therefore, the powerful queen Icerbegina 👑 had the data collected. But in order to get the penguins to agree to participate she promised them that no one would be able to look at the data and that no one would be able to guess the bill width of any specific penguin (which is very sensitive information) from the data. Nobody! Not even the researchers. The queen hence stored the data on the Secure Data Disclosure Server and only gave a small budget to Dr. Antarctica.

                      -

                      This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library lomas-client. 🐧🐧🐧

                      -
                      -

                      Step 1: Install the library

                      -

                      To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library lomas-client on her local developping environment.

                      -

                      It can be installed via the pip command:

                      -
                      -
                      [2]:
                      -
                      -
                      -
                      !pip install lomas-client
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -Requirement already satisfied: lomas-client in /usr/local/lib/python3.11/site-packages (0.3.0)
                      -Requirement already satisfied: diffprivlib>=0.6.4 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.6.4)
                      -Requirement already satisfied: diffprivlib-logger>=0.0.3 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.0.3)
                      -Requirement already satisfied: numpy>=1.24.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (1.24.0)
                      -Requirement already satisfied: opendp==0.10.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.10.0)
                      -Requirement already satisfied: opendp-logger==0.3.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.3.0)
                      -Requirement already satisfied: pandas>=2.2.2 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.2.2)
                      -Requirement already satisfied: requests>=2.32.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.32.0)
                      -Requirement already satisfied: scikit-learn==1.4.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (1.4.0)
                      -Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.11/site-packages (from scikit-learn==1.4.0->lomas-client) (1.14.1)
                      -Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/site-packages (from scikit-learn==1.4.0->lomas-client) (1.4.2)
                      -Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.11/site-packages (from scikit-learn==1.4.0->lomas-client) (3.5.0)
                      -Requirement already satisfied: setuptools>=49.0.0 in /usr/local/lib/python3.11/site-packages (from diffprivlib>=0.6.4->lomas-client) (65.5.1)
                      -Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/site-packages (from pandas>=2.2.2->lomas-client) (2.9.0.post0)
                      -Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/site-packages (from pandas>=2.2.2->lomas-client) (2024.1)
                      -Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/site-packages (from pandas>=2.2.2->lomas-client) (2024.1)
                      -Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (3.3.2)
                      -Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (3.8)
                      -Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (2.2.2)
                      -Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (2024.8.30)
                      -Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=2.2.2->lomas-client) (1.16.0)
                      -WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
                      -
                      -[notice] A new release of pip is available: 24.0 -> 24.2
                      -[notice] To update, run: pip install --upgrade pip
                      -
                      -
                      -
                      -
                      [3]:
                      -
                      -
                      -
                      from lomas_client import Client
                      -import numpy as np
                      -
                      -
                      -
                      -
                      -
                      -

                      Step 2: Initialise the client

                      -

                      Once the library is installed, a Client object must be created. It is responsible for sending sending requests to the server and processing responses in the local environment. It enables a seamless interaction with the server.

                      -

                      To create the client, Dr. Antartica needs to give it a few parameters: - a url: the root application endpoint to the remote secure server. - user_name: her name as registered in the database (Dr. Alice Antartica) - dataset_name: the name of the dataset that she wants to query (PENGUIN)

                      -

                      She will only be able to query on the real dataset if the queen Icergina has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some epsilon and delta credit (as is done in the Admin Notebook for Users and Datasets management).

                      -
                      -
                      [4]:
                      -
                      -
                      -
                      APP_URL = "http://lomas_server"
                      -USER_NAME = "Dr. Antartica"
                      -DATASET_NAME = "PENGUIN"
                      -client = Client(url=APP_URL, user_name = USER_NAME, dataset_name = DATASET_NAME)
                      -
                      -
                      -
                      -

                      And that’s it for the preparation. She is now ready to use the various functionnalities offered by lomas_client.

                      -
                      -
                      -

                      Step 3: Understand the functionnalities of the library

                      -
                      -

                      a. Getting dataset metadata

                      -

                      Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the get_dataset_metadata() function of the client. As this is public information, this does not cost any budget.

                      -

                      This function returns metadata information in a format based on SmartnoiseSQL dictionary format, where among other, there is information about all the available columns, their type, bound values (see Smartnoise page for more details). Any metadata is required for Smartnoise-SQL is also required here and additional information such that the different categories in a string type column column can be added.

                      -
                      -
                      [5]:
                      -
                      -
                      -
                      penguin_metadata = client.get_dataset_metadata()
                      -penguin_metadata
                      -
                      -
                      -
                      -
                      -
                      [5]:
                      -
                      -
                      -
                      -
                      -{'max_ids': 1,
                      - 'row_privacy': True,
                      - 'censor_dims': False,
                      - 'columns': {'species': {'type': 'string',
                      -   'cardinality': 3,
                      -   'categories': ['Adelie', 'Chinstrap', 'Gentoo']},
                      -  'island': {'type': 'string',
                      -   'cardinality': 3,
                      -   'categories': ['Torgersen', 'Biscoe', 'Dream']},
                      -  'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},
                      -  'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},
                      -  'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},
                      -  'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},
                      -  'sex': {'type': 'string',
                      -   'cardinality': 2,
                      -   'categories': ['MALE', 'FEMALE']}},
                      - 'rows': 344}
                      -
                      -
                      -

                      Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) with their associated categories (i.e. the species column has 3 possibilities: ‘Adelie’, ‘Chinstrap’, ‘Gentoo’) and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds (i.e. the body mass of penguin ranges from 2000 to 7000 gramms). She also knows based on the field max_ids: 1 that each penguin can only be once in the dataset and on the field -row_privacy: True that each row represents a single penguin. Finally, she learns that there are 344 rows in the dataset and hence 344 penguins.

                      -
                      -
                      [6]:
                      -
                      -
                      -
                      NB_PENGUINS = penguin_metadata["rows"]
                      -
                      -
                      -
                      -
                      -
                      -

                      b. Get a dummy dataset

                      -

                      Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset.

                      -

                      Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets. Getting a dummy dataset does not affect the budget as there is no differential privacy here. It is not a synthetic dataset and all that could be learn here is already present in the public metadata (it is created randomly on the fly based on the -metadata).

                      -

                      Dr. Antartica first create a dummy dataset with 100 rows and chooses a seed of 0.

                      -
                      -
                      [7]:
                      -
                      -
                      -
                      NB_ROWS = 100
                      -SEED = 0
                      -
                      -
                      -
                      -
                      -
                      [8]:
                      -
                      -
                      -
                      df_dummy = client.get_dummy_dataset(
                      -    nb_rows = NB_ROWS,
                      -    seed = SEED
                      -)
                      -
                      -print(df_dummy.shape)
                      -df_dummy.head()
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -(100, 7)
                      -
                      -
                      -
                      -
                      [8]:
                      -
                      -
                      -
                      -
                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
                      0GentooBiscoe49.20847319.778165181.1795886532.777496MALE
                      1GentooDream55.03162815.700080219.6343495870.236663MALE
                      2ChinstrapTorgersen51.09671820.351940187.7751843665.725760MALE
                      3AdelieDream49.07091122.621885167.9603682405.506950FEMALE
                      4ChinstrapTorgersen44.82791815.487531152.4678734036.205857MALE
                      -
                      -
                      -
                      -
                      -

                      c. Check privacy loss budget ε, δ (initial, current, remaining)

                      -

                      It is the first time that Dr. Antartica connects to the server and she wants to know how much buget has beeen assigned to her. Therefore, she calls the fonction get_initial_budget.

                      -
                      -
                      [9]:
                      -
                      -
                      -
                      client.get_initial_budget()
                      -
                      -
                      -
                      -
                      -
                      [9]:
                      -
                      -
                      -
                      -
                      -{'initial_epsilon': 10.0, 'initial_delta': 0.005}
                      -
                      -
                      -

                      She sees that she has 10.0 epsilon and 0.005 epsilon at her disposal.

                      -

                      Then she checks her total spent budget get_total_spent_budget. As she only did queries on metadata on dummy dataframes, this should still be 0.

                      -
                      -
                      [10]:
                      -
                      -
                      -
                      client.get_total_spent_budget()
                      -
                      -
                      -
                      -
                      -
                      [10]:
                      -
                      -
                      -
                      -
                      -{'total_spent_epsilon': 0.0, 'total_spent_delta': 0.0}
                      -
                      -
                      -

                      It will also be useful to know what the remaining budget is. Therefore, she calls the function get_remaining_budget. It just substarcts the total spent budget from the initial budget.

                      -
                      -
                      [11]:
                      -
                      -
                      -
                      client.get_remaining_budget()
                      -
                      -
                      -
                      -
                      -
                      [11]:
                      -
                      -
                      -
                      -
                      -{'remaining_epsilon': 10.0, 'remaining_delta': 0.005}
                      -
                      -
                      -

                      As expected, for now the remaining budget is equal to the inital budget.

                      -
                      -
                      -
                      -

                      Step 4: Use DP libraries to analyse the dataset

                      -

                      Available DP libraires are: - Smartnoise-SQL for SQL-like queries - Smartnoise-Synth for generating synthetic datasets - OpenDP for summary statistics - DiffPrivLib for training Machine Learning models

                      -

                      For each library, there are three possibilities: - estimate the cost of a query (will NOT spend privacy loss budget) - query on a ‘dummy’ dataset (explained below) (will NOT spend privacy loss budget) - query on the private dataset (WILL SPEND PRIVACY LOSS BUDGET)

                      -
                      -

                      a. Compute average bill length with Smartnoise-SQL

                      -

                      Dr. Antartica wants to know the average bill length of penguins. Therefore, she will use smartnoise-sql library and write the associated SQL command.

                      -
                      -
                      [12]:
                      -
                      -
                      -
                      # Average bill length in mm
                      -QUERY = "SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df"
                      -
                      -
                      -
                      -
                      -

                      Estimate cost of a query with smartnoise-sql

                      -

                      She will then estimate the cost of this query. In the various DP librairies the budget that will by used by a query in the server might be slightly different than what is asked by the user in inptu. The estimate cost function of each library returns the cost that will effectively be sent and deduced if the query is applied on the sensitive dataset.

                      -

                      The user can then decide to use the budget or modify it. Again, of course, this will not impact the user’s budget.

                      -

                      Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an epsilon and a delta.

                      -
                      -
                      [13]:
                      -
                      -
                      -
                      EPSILON = 0.5
                      -DELTA = 1e-4
                      -
                      -
                      -
                      -
                      -
                      [14]:
                      -
                      -
                      -
                      cost = client.estimate_smartnoise_sql_cost(
                      -    query = QUERY,
                      -    epsilon = EPSILON,
                      -    delta = DELTA
                      -)
                      -cost
                      -
                      -
                      -
                      -
                      -
                      [14]:
                      -
                      -
                      -
                      -
                      -{'epsilon_cost': 1.0, 'delta_cost': 4.999999999999449e-05}
                      -
                      -
                      -
                      -
                      [15]:
                      -
                      -
                      -
                      print(f"This query would actually cost her {cost['epsilon_cost']} epsilon and {cost['delta_cost']} delta.")
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -This query would actually cost her 1.0 epsilon and 4.999999999999449e-05 delta.
                      -
                      -
                      -

                      She decides that it is good enough.

                      -
                      -
                      -

                      Query average bill length on dummy dataset with smartnoise-sql

                      -

                      She now wants to start querying the real dataset for her research.

                      -

                      However, her budget is limited and it would be a waste to spend it by mistake on a coding error. Therefore the client/server pipeline has functionnal testing capabilities for the users. It is possible to test a query on a dummy dataset to ensure that everything is working properly. Dr. Antartica will not be able to use the results of a dummy query for her analysis (as the data is random) but if the query on the dummy dataset works, she can be confident that her query will also work on the -real dataset. This functionnal testing on the dummy does not have any impact on the budget as it is on random data only.

                      -

                      To test on the dummy data instead of the real data, the function call is exactly the same with the only exception of the flag dummy=True. In the following cell, she will test with smartnoise_query but it is the same flag for opendp_query. She can optionnaly give two additional parameters to set the seed and the number of rows of the dummy dataset.

                      -

                      Another more advanced possibility for functionnal tests with the dummy is to compare results of queries on a local dummy and the remote dummy with a very high budget: - create a local dummy on the notebook with a specific seed and number of rows - compute locally the wanted query on this local dummy with python functions like numpy - query the server on the same remote dummy with (dummy=True, same seed and same number of row) and a very big buget to limit noise as much as possible (don’t -worry this won’t cost any real budget) - compare and verify that the local and remote dummy have similar results.

                      -

                      Dr. Antartica will follow the best practice and now try the query to get the average bill length (in mm) on the dummy dataset. She does not forget to - set the dummy flag to True - set very high budget values to be able to compare results with a similar local dummy (with the same seed and number of rows) if she wants to verify that the function do what is expected. Here she will just check that the number of rows is close to what she sets as parameter.

                      -
                      -
                      [16]:
                      -
                      -
                      -
                      # On the remote server dummy dataframe
                      -dummy_res = client.smartnoise_sql_query(
                      -    query = QUERY,
                      -    epsilon = 100.0,
                      -    delta = 0.99,
                      -    dummy = True,
                      -    nb_rows = NB_ROWS,
                      -    seed = SEED
                      -)
                      -
                      -
                      -
                      -
                      -
                      [17]:
                      -
                      -
                      -
                      print(f"Average bill length in remote dummy: {np.round(dummy_res['query_response']['avg_bill_length_mm'][0], 2)}mm.")
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -Average bill length in remote dummy: 46.54mm.
                      -
                      -
                      -

                      No functionnal errors happened and the average bill length is within reasonable bounds. She is now even more confident in using her query on the server.

                      -
                      -
                      -

                      Query average bill length on private dataset with smartnoise-sql

                      -

                      Now that all the safeguard functions were tested, Dr. Antartica is ready to query on the real dataset and get a differentially private response of the number of penguins and average bill length. By default, the flag dummy is False so setting it is optional. She uses the values of epsilon and delta that she selected just before.

                      -

                      Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query.

                      -
                      -
                      [18]:
                      -
                      -
                      -
                      client.get_remaining_budget()
                      -
                      -
                      -
                      -
                      -
                      [18]:
                      -
                      -
                      -
                      -
                      -{'remaining_epsilon': 10.0, 'remaining_delta': 0.005}
                      -
                      -
                      -
                      -
                      [19]:
                      -
                      -
                      -
                      response = client.smartnoise_sql_query(
                      -    query = QUERY,
                      -    epsilon = EPSILON,
                      -    delta = DELTA,
                      -    dummy = False # APPLIED ON SENSITIVE DATA, WILL SPEND BUDGET
                      -)
                      -
                      -
                      -
                      -
                      -
                      [20]:
                      -
                      -
                      -
                      avg_bill_length = np.round(response['query_response']['avg_bill_length_mm'].iloc[0], 2)
                      -print(f"Average bill length of penguins in real data: {avg_bill_length}mm.")
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -Average bill length of penguins in real data: 43.83mm.
                      -
                      -
                      -

                      After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:

                      -
                      -
                      [21]:
                      -
                      -
                      -
                      client.get_remaining_budget()
                      -
                      -
                      -
                      -
                      -
                      [21]:
                      -
                      -
                      -
                      -
                      -{'remaining_epsilon': 9.0, 'remaining_delta': 0.004950000000000006}
                      -
                      -
                      -

                      As can be seen in get_total_spent_budget(), it is the budget estimated with estimate_smartnoise_cost() that was spent.

                      -
                      -
                      [22]:
                      -
                      -
                      -
                      client.get_total_spent_budget()
                      -
                      -
                      -
                      -
                      -
                      [22]:
                      -
                      -
                      -
                      -
                      -{'total_spent_epsilon': 1.0, 'total_spent_delta': 4.999999999999449e-05}
                      -
                      -
                      -

                      Dr. Antartica has now a differentially private estimation of the number of penguins in the dataset and is confident to use the library for the rest of her analyses.

                      -
                      -
                      -
                      -

                      b. Compute confidence interval with opendp

                      -
                      -
                      [23]:
                      -
                      -
                      -
                      import opendp as dp
                      -import opendp.transformations as trans
                      -import opendp.measurements as meas
                      -
                      -
                      -
                      -

                      She now wants the confidence interval of bill length in mm. She already has the number of penguins and the average from the metadata and previous smartnoise-sql queries respectively. She now needs the variance value.

                      -
                      -

                      Prepare opendp pipeline and verify on dummy

                      -

                      She checks the metadata of the columns again to use the relevant values in the pipeline.

                      -
                      -
                      [24]:
                      -
                      -
                      -
                      penguin_metadata["columns"]
                      -
                      -
                      -
                      -
                      -
                      [24]:
                      -
                      -
                      -
                      -
                      -{'species': {'type': 'string',
                      -  'cardinality': 3,
                      -  'categories': ['Adelie', 'Chinstrap', 'Gentoo']},
                      - 'island': {'type': 'string',
                      -  'cardinality': 3,
                      -  'categories': ['Torgersen', 'Biscoe', 'Dream']},
                      - 'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},
                      - 'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},
                      - 'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},
                      - 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},
                      - 'sex': {'type': 'string', 'cardinality': 2, 'categories': ['MALE', 'FEMALE']}}
                      -
                      -
                      -

                      She can define the columns names and the bounds of the relevant column.

                      -
                      -
                      [25]:
                      -
                      -
                      -
                      columns = list(penguin_metadata["columns"].keys())
                      -
                      -
                      -
                      -
                      -
                      [26]:
                      -
                      -
                      -
                      bill_length_min = penguin_metadata['columns']['bill_length_mm']['lower']
                      -bill_length_max = penguin_metadata['columns']['bill_length_mm']['upper']
                      -bill_length_min, bill_length_max
                      -
                      -
                      -
                      -
                      -
                      [26]:
                      -
                      -
                      -
                      -
                      -(30.0, 65.0)
                      -
                      -
                      -

                      She can now define the pipeline of the transformation to have the variance that she wants on the data:

                      -
                      -
                      [27]:
                      -
                      -
                      -
                      bill_length_transformation_pipeline = (
                      -    trans.make_split_dataframe(separator=",", col_names=columns) >>
                      -    trans.make_select_column(key="bill_length_mm", TOA=str) >>
                      -    trans.then_cast_default(TOA=float) >>
                      -    trans.then_clamp(bounds=(bill_length_min, bill_length_max)) >>
                      -    trans.then_resize(size=NB_PENGUINS, constant=avg_bill_length) >>
                      -    trans.then_variance()
                      -)
                      -
                      -
                      -
                      -

                      However, when she tries to execute it on the server, she has an error (see below).

                      -
                      -
                      [28]:
                      -
                      -
                      -
                      # No instruction for noise addition mechanism: Expect to fail !!!
                      -client.opendp_query(
                      -    opendp_pipeline = bill_length_transformation_pipeline,
                      -    dummy=True
                      -)
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -Server error status 400: {"InvalidQueryException":"The pipeline provided is not a measurement. It cannot be processed in this server."}
                      -
                      -
                      -

                      This is because the server will only allow measurement pipeline with differentially private results. She adds Laplacian noise to the pipeline and should be able to instantiate the pipeline.

                      -
                      -
                      [29]:
                      -
                      -
                      -
                      var_bill_length_measurement_pipeline = (
                      -    bill_length_transformation_pipeline >>
                      -    meas.then_laplace(scale=5.0) # Noise addition mechanism instructions
                      -)
                      -
                      -
                      -
                      -

                      Now that there is a measurement, she is able to apply the pipeline on the dummy dataset of the server.

                      -
                      -
                      [30]:
                      -
                      -
                      -
                      dummy_var_res = client.opendp_query(
                      -    opendp_pipeline = var_bill_length_measurement_pipeline,
                      -    dummy=True
                      -)
                      -print(f"Dummy result for variance: {np.round(dummy_var_res['query_response'], 2)}")
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -Dummy result for variance: 35.5
                      -
                      -
                      -
                      -
                      -

                      Estimate cost with opendp

                      -

                      With opendp, the function estimate_opendp_cost is particularly useful to estimate the used epsilon and delta based on the scale value.

                      -
                      -
                      [31]:
                      -
                      -
                      -
                      cost_res = client.estimate_opendp_cost(
                      -    opendp_pipeline = var_bill_length_measurement_pipeline
                      -)
                      -cost_res
                      -
                      -
                      -
                      -
                      -
                      [31]:
                      -
                      -
                      -
                      -
                      -{'epsilon_cost': 0.7122093023265228, 'delta_cost': 0}
                      -
                      -
                      -
                      -
                      -

                      Execute pipeline on real dataset with opendp

                      -

                      She can now execute the query on the real dataset.

                      -
                      -
                      [32]:
                      -
                      -
                      -
                      var_res = client.opendp_query(
                      -    opendp_pipeline = var_bill_length_measurement_pipeline,
                      -)
                      -
                      -
                      -
                      -
                      -
                      [33]:
                      -
                      -
                      -
                      var_bill_length = np.round(var_res['query_response'], 2)
                      -print(f"Variance of bill length: {var_bill_length} (from opendp query).")
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -Variance of bill length: 34.77 (from opendp query).
                      -
                      -
                      -
                      -
                      -

                      Postprocessing: no additional provacy risk with DP

                      -

                      She can now do all the postprocessing that she wants with the returned data without adding any privacy risk.

                      -
                      -
                      [34]:
                      -
                      -
                      -
                      # Get standard error
                      -standard_error = np.sqrt(var_bill_length / NB_PENGUINS)
                      -print(f"Standard error of bill length: {np.round(standard_error, 2)}.")
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -Standard error of bill length: 0.32.
                      -
                      -
                      -
                      -
                      [35]:
                      -
                      -
                      -
                       # Compute the 95% confidence interval
                      -ZSCORE = 1.96
                      -lower_bound = np.round(avg_bill_length - ZSCORE * standard_error, 2)
                      -upper_bound = np.round(avg_bill_length + ZSCORE * standard_error, 2)
                      -print(f"The 95% confidence interval of the bill length of all penguins is [{lower_bound}, {upper_bound}].")
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -The 95% confidence interval of the bill length of all penguins is [43.21, 44.45].
                      -
                      -
                      -
                      -
                      -
                      -

                      c. Train a DP Machine Learning model with DiffPrivLib

                      -
                      -
                      [36]:
                      -
                      -
                      -
                      from sklearn.pipeline import Pipeline
                      -from diffprivlib import models
                      -import pandas as pd
                      -
                      -
                      -
                      -

                      She now wants a model to predict the species of a penguin based on bill depth. Therefore, she uses a Random Forest classifier from DiffPrivLib library.

                      -
                      -

                      Prepare linear regression pipeline on dummy with DiffPrivLib

                      -
                      -
                      [37]:
                      -
                      -
                      -
                      feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']
                      -target_columns = ['species']
                      -
                      -
                      -
                      -
                      -
                      [38]:
                      -
                      -
                      -
                      def get_bounds(cols_metadata, columns):
                      -    lower = [cols_metadata[col]["lower"] for col in columns]
                      -    upper = [cols_metadata[col]["upper"] for col in columns]
                      -    return (lower, upper)
                      -
                      -
                      -
                      -
                      -
                      [39]:
                      -
                      -
                      -
                      bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)
                      -bounds
                      -
                      -
                      -
                      -
                      -
                      [39]:
                      -
                      -
                      -
                      -
                      -([30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0])
                      -
                      -
                      -
                      -
                      [40]:
                      -
                      -
                      -
                      dpl_pipeline = Pipeline([
                      -    ('rf', models.RandomForestClassifier(
                      -        n_estimators=10,
                      -        epsilon = 2.0,
                      -        bounds=bounds,
                      -        classes=['Adelie', 'Chinstrap', 'Gentoo'])
                      -    ),
                      -])
                      -
                      -
                      -
                      -
                      -
                      [41]:
                      -
                      -
                      -
                      dummy_response = client.diffprivlib_query(
                      -    pipeline = dpl_pipeline,
                      -    feature_columns = feature_columns,
                      -    target_columns = target_columns,
                      -    test_size = 0.2,
                      -    test_train_split_seed = 1,
                      -    dummy = True
                      -)
                      -model = dummy_response['query_response']['model']
                      -model
                      -
                      -
                      -
                      -
                      -
                      [41]:
                      -
                      -
                      -
                      -
                      Pipeline(steps=[('rf',
                      -                 RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),
                      -                                        bounds=(array([  30.,   13.,  150., 2000.]),
                      -                                                array([  65.,   23.,  250., 7000.])),
                      -                                        classes=['Adelie', 'Chinstrap',
                      -                                                 'Gentoo'],
                      -                                        epsilon=2.0))])
                      In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
                      On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
                      -
                      -
                      -
                      -

                      Estimate budget of Linear Regression with DiffPrivLib

                      -
                      -
                      [42]:
                      -
                      -
                      -
                      cost_res = client.estimate_diffprivlib_cost(
                      -    dpl_pipeline,
                      -    feature_columns = feature_columns,
                      -    target_columns = target_columns,
                      -    test_size = 0.2,
                      -    test_train_split_seed = 1
                      -)
                      -cost_res
                      -
                      -
                      -
                      -
                      -
                      [42]:
                      -
                      -
                      -
                      -
                      -{'epsilon_cost': 2.0, 'delta_cost': 0.0}
                      -
                      -
                      -
                      -
                      -

                      Train linear regression on sensitive data with DiffPrivLib

                      -
                      -
                      [43]:
                      -
                      -
                      -
                      response = client.diffprivlib_query(
                      -    pipeline = dpl_pipeline,
                      -    feature_columns = feature_columns,
                      -    target_columns = target_columns,
                      -    test_size = 0.1,
                      -    test_train_split_seed = 1,
                      -    dummy = False
                      -)
                      -
                      -
                      -
                      -
                      -
                      [44]:
                      -
                      -
                      -
                      # Return the mean accuracy.
                      -model_score = response['query_response']['score']
                      -
                      -
                      -
                      -
                      -
                      [45]:
                      -
                      -
                      -
                      f"The model has a mean accuracy of {np.round(model_score, 2)}. It is a harsh metric because we are in a multi-label classification case."
                      -
                      -
                      -
                      -
                      -
                      [45]:
                      -
                      -
                      -
                      -
                      -'The model has a mean accuracy of 0.24. It is a harsh metric because we are in a multi-label classification case.'
                      -
                      -
                      -
                      -
                      [46]:
                      -
                      -
                      -
                      model = response['query_response']['model']
                      -model
                      -
                      -
                      -
                      -
                      -
                      [46]:
                      -
                      -
                      -
                      -
                      Pipeline(steps=[('rf',
                      -                 RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),
                      -                                        bounds=(array([  30.,   13.,  150., 2000.]),
                      -                                                array([  65.,   23.,  250., 7000.])),
                      -                                        classes=['Adelie', 'Chinstrap',
                      -                                                 'Gentoo'],
                      -                                        epsilon=2.0))])
                      In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
                      On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
                      -
                      -
                      -
                      [47]:
                      -
                      -
                      -
                      x_to_predict = pd.DataFrame({
                      -    'bill_length_mm': [30.0], 'bill_depth_mm': [20.0], 'flipper_length_mm': [170.0], 'body_mass_g': [5000.0]
                      -})
                      -predictions = model.predict(x_to_predict)[0]
                      -f"For these feature values, the predicted species is is {predictions}."
                      -
                      -
                      -
                      -
                      -
                      [47]:
                      -
                      -
                      -
                      -
                      -'For these feature values, the predicted species is is Adelie.'
                      -
                      -
                      -
                      -
                      -
                      -

                      d. Get a Synthetic Dataset with Smartnoise-Synth

                      -

                      Finally she gets a synthetic dataset to do the rest of her analysis. She chooses to only train on a subset on 3 columns: “island”, “bill_length_mm” and “bill_depth_mm” but if we wanted she could train on the whole dataset. She also decides to use the patectgan synthesizer and keep all other default parameters.

                      -
                      -

                      Train patectgan synthesizer on dummy data with Smartnoise-Synth

                      -
                      -
                      [50]:
                      -
                      -
                      -
                      res_dummy = client.smartnoise_synth_query(
                      -    synth_name="patectgan",
                      -    select_cols = ["island", "bill_length_mm", "bill_depth_mm"],
                      -    epsilon=1.0,
                      -    dummy=True,
                      -)
                      -dummy_synth_df = res_dummy['query_response']
                      -
                      -
                      -
                      -
                      -
                      [51]:
                      -
                      -
                      -
                      dummy_synth_df.head()
                      -
                      -
                      -
                      -
                      -
                      [51]:
                      -
                      -
                      -
                      -
                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      islandbill_length_mmbill_depth_mm
                      0Dream48.51158514.830853
                      1Dream46.05884921.126229
                      2Dream43.44215619.632390
                      3Dream37.87703521.214375
                      4Dream52.55203119.885068
                      -
                      -
                      -
                      -
                      -

                      Estimate cost of training patectgan synthesizer with Smartnoise-Synth

                      -
                      -
                      [52]:
                      -
                      -
                      -
                      res_cost = client.estimate_smartnoise_synth_cost(
                      -    synth_name="patectgan",
                      -    epsilon=1.0,
                      -    select_cols = ["island", "bill_length_mm", "bill_depth_mm"],
                      -)
                      -res_cost
                      -
                      -
                      -
                      -
                      -
                      [52]:
                      -
                      -
                      -
                      -
                      -{'epsilon_cost': 1.0, 'delta_cost': 0.00015673368198174188}
                      -
                      -
                      -
                      -
                      -

                      Train patectgan synthesizer on private data with Smartnoise-Synth

                      -
                      -
                      [53]:
                      -
                      -
                      -
                      res = client.smartnoise_synth_query(
                      -    synth_name="patectgan",
                      -    select_cols = ["island", "bill_length_mm", "bill_depth_mm"],
                      -    epsilon=1.0,
                      -    dummy=False,
                      -)
                      -synth_df = res['query_response']
                      -
                      -
                      -
                      -
                      -
                      [54]:
                      -
                      -
                      -
                      synth_df.head()
                      -
                      -
                      -
                      -
                      -
                      [54]:
                      -
                      -
                      -
                      -
                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      islandbill_length_mmbill_depth_mm
                      0Dream52.04094515.677968
                      1Dream47.59786817.673375
                      2Torgersen57.00434515.573335
                      3Biscoe37.55950219.513633
                      4Dream46.81385815.565315
                      -
                      -
                      -

                      Out of curiosity, she checks the average bill length and variance of bill length on this dataset.

                      -
                      -
                      [55]:
                      -
                      -
                      -
                      synth_mean = np.round(synth_df["bill_length_mm"].mean(), 2)
                      -synth_variance = np.round(synth_df["bill_length_mm"].var(), 2)
                      -
                      -
                      -
                      -
                      -
                      [56]:
                      -
                      -
                      -
                      print(
                      -    f"The average with Smartnoise-SQL on private data was {avg_bill_length}.\n"
                      -    + f"The average with Smartnoise-Synth on synthetic data is {synth_mean}."
                      -)
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -The average with Smartnoise-SQL on private data was 43.83.
                      -The average with Smartnoise-Synth on synthetic data is 44.65.
                      -
                      -
                      -
                      -
                      [57]:
                      -
                      -
                      -
                      print(
                      -    f"The variance with opendp on private data was {var_bill_length}.\n"
                      -    + f"The variance with Smartnoise-Synth on synthetic data is {synth_variance}."
                      -)
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -
                      -The variance with opendp on private data was 34.77.
                      -The variance with Smartnoise-Synth on synthetic data is 36.15.
                      -
                      -
                      -
                      -
                      -
                      -
                      -

                      Step 4: See archives of queries

                      -

                      She now wants to verify all the queries that she did on the real data. It is possible because an archive of all queries is kept in a secure database. With a function call she can see her queries, budget and associated responses.

                      -
                      -
                      [58]:
                      -
                      -
                      -
                      previous_queries = client.get_previous_queries()
                      -len(previous_queries)
                      -
                      -
                      -
                      -
                      -
                      [58]:
                      -
                      -
                      -
                      -
                      -4
                      -
                      -
                      -
                      -
                      [59]:
                      -
                      -
                      -
                      # Smartnoise-SQL
                      -avg_bill_length_query = previous_queries[0]
                      -avg_bill_length_query
                      -
                      -
                      -
                      -
                      -
                      [59]:
                      -
                      -
                      -
                      -
                      -{'user_name': 'Dr. Antartica',
                      - 'dataset_name': 'PENGUIN',
                      - 'dp_librairy': 'smartnoise_sql',
                      - 'client_input': {'query_str': 'SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df',
                      -  'dataset_name': 'PENGUIN',
                      -  'epsilon': 0.5,
                      -  'delta': 0.0001,
                      -  'mechanisms': {},
                      -  'postprocess': True},
                      - 'response': {'requested_by': 'Dr. Antartica',
                      -  'query_response': {'index': [0],
                      -   'columns': ['avg_bill_length_mm'],
                      -   'data': [[43.825255002419716]],
                      -   'index_names': [None],
                      -   'column_names': [None]},
                      -  'spent_epsilon': 1.0,
                      -  'spent_delta': 4.999999999999449e-05},
                      - 'timestamp': 1725364882.6916816}
                      -
                      -
                      -
                      -
                      [60]:
                      -
                      -
                      -
                      # OpenDP
                      -var_bill_length_query = previous_queries[1]
                      -var_bill_length_query
                      -
                      -
                      -
                      -
                      -
                      [60]:
                      -
                      -
                      -
                      -
                      -{'user_name': 'Dr. Antartica',
                      - 'dataset_name': 'PENGUIN',
                      - 'dp_librairy': 'opendp',
                      - 'client_input': {'dataset_name': 'PENGUIN',
                      -  'opendp_json': Measurement(
                      -      input_domain   = AtomDomain(T=String),
                      -      input_metric   = SymmetricDistance(),
                      -      output_measure = MaxDivergence(f64)),
                      -  'fixed_delta': None},
                      - 'response': {'requested_by': 'Dr. Antartica',
                      -  'query_response': 34.769447201112094,
                      -  'spent_epsilon': 0.7122093023265228,
                      -  'spent_delta': 0},
                      - 'timestamp': 1725364890.340155}
                      -
                      -
                      -
                      -
                      [61]:
                      -
                      -
                      -
                      # DiffPrivLib
                      -reg_bill_length_query = previous_queries[2]
                      -reg_bill_length_query
                      -
                      -
                      -
                      -
                      -
                      [61]:
                      -
                      -
                      -
                      -
                      -{'user_name': 'Dr. Antartica',
                      - 'dataset_name': 'PENGUIN',
                      - 'dp_librairy': 'diffprivlib',
                      - 'client_input': {'dataset_name': 'PENGUIN',
                      -  'diffprivlib_json': '{"module": "diffprivlib", "version": "0.6.4", "pipeline": [{"type": "_dpl_type:RandomForestClassifier", "name": "rf", "params": {"n_estimators": 10, "n_jobs": 1, "random_state": null, "verbose": 0, "warm_start": false, "max_depth": 5, "epsilon": 2.0, "bounds": {"_tuple": true, "_items": [[30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0]]}, "classes": ["Adelie", "Chinstrap", "Gentoo"], "shuffle": false, "accountant": "_dpl_instance:BudgetAccountant"}}]}',
                      -  'feature_columns': ['bill_length_mm',
                      -   'bill_depth_mm',
                      -   'flipper_length_mm',
                      -   'body_mass_g'],
                      -  'target_columns': ['species'],
                      -  'test_size': 0.1,
                      -  'test_train_split_seed': 1,
                      -  'imputer_strategy': 'drop'},
                      - 'response': {'requested_by': 'Dr. Antartica',
                      -  'query_response': {'score': 0.23529411764705882,
                      -   'model': Pipeline(steps=[('rf',
                      -                    RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),
                      -                                           bounds=(array([  30.,   13.,  150., 2000.]),
                      -                                                   array([  65.,   23.,  250., 7000.])),
                      -                                           classes=['Adelie', 'Chinstrap',
                      -                                                    'Gentoo'],
                      -                                           epsilon=2.0))])},
                      -  'spent_epsilon': 2.0,
                      -  'spent_delta': 0.0},
                      - 'timestamp': 1725364897.0776813}
                      -
                      -
                      -
                      -
                      [62]:
                      -
                      -
                      -
                      # Smartnoise-Synth
                      -sysynth_query = previous_queries[3]
                      -sysynth_query
                      -
                      -
                      -
                      -
                      -
                      [62]:
                      -
                      -
                      -
                      -
                      -{'user_name': 'Dr. Antartica',
                      - 'dataset_name': 'PENGUIN',
                      - 'dp_librairy': 'smartnoise_synth',
                      - 'client_input': {'dataset_name': 'PENGUIN',
                      -  'synth_name': 'patectgan',
                      -  'epsilon': 1.0,
                      -  'delta': None,
                      -  'select_cols': ['island', 'bill_length_mm', 'bill_depth_mm'],
                      -  'synth_params': {},
                      -  'nullable': True,
                      -  'constraints': '',
                      -  'return_model': False,
                      -  'condition': '',
                      -  'nb_samples': 200},
                      - 'response': {'requested_by': 'Dr. Antartica',
                      -  'query_response':         island  bill_length_mm  bill_depth_mm
                      -  0        Dream       52.040945      15.677968
                      -  1        Dream       47.597868      17.673375
                      -  2    Torgersen       57.004345      15.573335
                      -  3       Biscoe       37.559502      19.513633
                      -  4        Dream       46.813858      15.565315
                      -  ..         ...             ...            ...
                      -  195      Dream       41.009962      18.210038
                      -  196      Dream       50.174224      18.534705
                      -  197     Biscoe       42.890809      15.596290
                      -  198  Torgersen       47.442859      15.934119
                      -  199     Biscoe       45.300011      18.687155
                      -
                      -  [200 rows x 3 columns],
                      -  'spent_epsilon': 1.0,
                      -  'spent_delta': 0.00015673368198174188},
                      - 'timestamp': 1725364925.3299136}
                      -
                      -
                      -
                      -
                      [ ]:
                      -
                      -
                      -
                      
                      -
                      -
                      -
                      -
                      -
                      - - -
                      -
                      - -
                      -
                      -
                      -
                      -
                      - - Version: v0.3.1 - - -
                      - -
                      -
                      Languages
                      - -
                      en
                      - -
                      - - -
                      -
                      Versions
                      - -
                      stable
                      - -
                      develop
                      - -
                      v0.1.0
                      - -
                      v0.1.1
                      - -
                      v0.1.2
                      - -
                      v0.2.0
                      - -
                      v0.3.0
                      - -
                      v0.3.1
                      - -
                      - -
                      - -
                      -
                      - - - \ No newline at end of file diff --git a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb b/html/v0.3.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb deleted file mode 100644 index 3dfd5e79..00000000 --- a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb +++ /dev/null @@ -1,2857 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3f18d338", - "metadata": {}, - "source": [ - "# Lomas Client Side: Using DiffPrivlib" - ] - }, - { - "cell_type": "markdown", - "id": "1582a2ae", - "metadata": {}, - "source": [ - "This notebook showcases how researcher could use lomas platform with DiffPrivLib. It explains the different functionnalities provided by the `lomas-client` client library to interact with lomas server.\n", - "\n", - "The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.\n", - "\n", - "Each user has access to one or multiple projects and for each dataset has a limited budget with $\\epsilon$ and $\\delta$ values." - ] - }, - { - "cell_type": "markdown", - "id": "5b73135c", - "metadata": {}, - "source": [ - "In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins data." - ] - }, - { - "cell_type": "markdown", - "id": "01ae30d2", - "metadata": {}, - "source": [ - "## Step 1: Install the library\n", - "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `lomas-client` on her local developping environment. \n", - "\n", - "It can be installed via the pip command:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "8b340f40-32c9-487b-bc0c-a76593d43980", - "metadata": {}, - "outputs": [], - "source": [ - "# !pip install lomas_client" - ] - }, - { - "cell_type": "markdown", - "id": "46c4f70b-1491-4162-930c-e0a86406ba69", - "metadata": {}, - "source": [ - "Or using a local version of the client" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "36d508bf-6cc3-4034-8e11-fffe858552f9", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "import os\n", - "sys.path.append(os.path.abspath(os.path.join('..')))" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "9535e92e-620e-4df4-92dd-4ea2c653e4ab", - "metadata": {}, - "outputs": [], - "source": [ - "from lomas_client import Client\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "id": "9c63718b", - "metadata": {}, - "source": [ - "## Step 2: Initialise the client\n", - "\n", - "Once the library is installed, a Client object must be created. It is responsible for sending sending requests to the server and processing responses in the local environment. It enables a seamless interaction with the server. \n", - "\n", - "To create the client, Dr. Antartica needs to give it a few parameters:\n", - "- a url: the root application endpoint to the remote secure server.\n", - "- user_name: her name as registered in the database (Dr. Alice Antartica)\n", - "- dataset_name: the name of the dataset that she wants to query (PENGUIN)\n", - "\n", - "She will only be able to query on the real dataset if the queen Icergina has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some epsilon and delta credit (as is done in the Admin Notebook for Users and Datasets management)." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "941991f7", - "metadata": {}, - "outputs": [], - "source": [ - "APP_URL = \"http://lomas_server\"\n", - "USER_NAME = \"Dr. Antartica\"\n", - "DATASET_NAME = \"PENGUIN\"\n", - "client = Client(url=APP_URL, user_name = USER_NAME, dataset_name = DATASET_NAME)" - ] - }, - { - "cell_type": "markdown", - "id": "0ec400c8", - "metadata": {}, - "source": [ - "And that's it for the preparation. She is now ready to use the various functionnalities offered by `lomas-client`." - ] - }, - { - "cell_type": "markdown", - "id": "9b9a5f13", - "metadata": {}, - "source": [ - "## Step 3: Metadata and dummy dataset" - ] - }, - { - "cell_type": "markdown", - "id": "c7cb5531", - "metadata": {}, - "source": [ - "### Getting dataset metadata\n", - "\n", - "Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the `get_dataset_metadata()` function of the client. As this is public information, this does not cost any budget." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "0fdebac9-57fc-4410-878b-5a77425af634", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'censor_dims': False,\n", - " 'columns': {'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Adelie', 'Chinstrap', 'Gentoo']},\n", - " 'island': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Torgersen', 'Biscoe', 'Dream']},\n", - " 'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},\n", - " 'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},\n", - " 'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},\n", - " 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},\n", - " 'sex': {'type': 'string',\n", - " 'cardinality': 2,\n", - " 'categories': ['MALE', 'FEMALE']}},\n", - " 'rows': 344}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "penguin_metadata = client.get_dataset_metadata()\n", - "penguin_metadata" - ] - }, - { - "cell_type": "markdown", - "id": "9e7ca7ae-bf17-40c8-aa75-2d72fcdd3088", - "metadata": {}, - "source": [ - "## Step 4: Train Logistic Regression model with DiffPrivLib" - ] - }, - { - "cell_type": "markdown", - "id": "2de1389c-53a7-4098-bc3c-397c12a4b869", - "metadata": {}, - "source": [ - "We want to train an ML model to guess the species of penguins based on their bill length and depth, flipper length and body mass.\n", - "\n", - "Therefore, we use a DiffPrivLib pipeline which:\n", - "- standard scales the dimensions between the metadata bounds\n", - "- and then performs a logistic regression\n", - "to predict the species of penguins." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "2864729f-2ce4-4d81-a446-8e3f2c1493b3", - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.pipeline import Pipeline\n", - "from diffprivlib import models\n", - "import pandas as pd" - ] - }, - { - "cell_type": "markdown", - "id": "a06365e9-4076-4592-871a-31af91d6a05d", - "metadata": {}, - "source": [ - "### Classification: Logistic Regression" - ] - }, - { - "cell_type": "markdown", - "id": "ea567662-6518-4c10-bd87-0fb6028db263", - "metadata": {}, - "source": [ - "Dr. Antartica wants to do a logistic regression on the feature columns 'bill_length_mm', 'bill_depth_mm', 'flipper_length_mm' and'body_mass_g' to predict penguin species." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "bda4884f-bce2-43b3-875e-dbb135492e79", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']\n", - "target_columns = ['species']" - ] - }, - { - "cell_type": "markdown", - "id": "2fe9db5e-9c57-41f3-a444-c9f67100ba81", - "metadata": {}, - "source": [ - "#### She starts to write the associated DiffPrivLib pipeline and tries it on the dummy." - ] - }, - { - "cell_type": "markdown", - "id": "eead3541-66e5-4c0f-aa5b-7b97821afe39", - "metadata": {}, - "source": [ - "If the DiffprivlibCompatibilityWarning is raised by DiffPrivLib library, an warning will be raised the first time (as in DiffPrivLib) then the 'wrong' parameters will be ignored within the server." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "804f31cd-f277-47d4-9648-a51872eccf29", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.11/site-packages/diffprivlib/utils.py:71: DiffprivlibCompatibilityWarning: Parameter 'svd_solver' is not functional in diffprivlib. Remove this parameter to suppress this warning.\n", - " warnings.warn(f\"Parameter '{arg}' is not functional in diffprivlib. Remove this parameter to suppress this \"\n" - ] - } - ], - "source": [ - "# DiffprivlibCompatibilityWarning Error expected\n", - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5)),\n", - " ('classifier', models.LogisticRegression(epsilon = 1.0, svd_solver='full'))\n", - "])" - ] - }, - { - "cell_type": "markdown", - "id": "15dd0c42-3e20-4b27-95b3-9b55622b4bfd", - "metadata": {}, - "source": [ - "To resolve the DiffprivlibCompatibilityWarning issue, the svd_solver should not be set as it is incompatible with DiffPrivLib. If these warnings are ignore by the user, the default behaviour of DiffPrivLib will be applied." - ] - }, - { - "cell_type": "markdown", - "id": "9c5d7fa4-cfe6-4a4f-88ff-8e88ca31dfed", - "metadata": {}, - "source": [ - "If PrivacyLeakWarning are encountered, then the query will not be processed by the server and will return an error." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "f1c9cffb-8327-400d-ab9d-35c5450fd4d6", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5)),\n", - " ('classifier', models.LogisticRegression(epsilon = 1.0))\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "db1ddfbc-de3e-43fe-9958-49f9e6dad89f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Error while processing DiffPrivLib request in server status code: 422 message: {\"ExternalLibraryException\":\"PrivacyLeakWarning: Bounds parameter hasn't been specified, so falling back to determining bounds from the data.\\n This will result in additional privacy leakage. To ensure differential privacy with no additional privacy loss, specify `bounds` for each valued returned by np.mean().. Lomas server cannot fit pipeline on data, PrivacyLeakWarning is a blocker.\",\"library\":\"diffprivlib\"}\n" - ] - } - ], - "source": [ - "# Expect PrivacyLeakWarning Error\n", - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "c9d58006-89d5-4110-9657-641256bafaf9", - "metadata": {}, - "source": [ - "Diffprivlib requests that have **PrivacyLeakWarning** will not be processed in the server. \n", - "In lomas, the bounds must always be specified. For most model, it is best to use **the standard scaler must always be used as a first step** and fill it based on the metadata values." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "87384eb3-6b6c-44f8-b653-af471b234a2d", - "metadata": {}, - "outputs": [], - "source": [ - "def get_bounds(cols_metadata, columns):\n", - " lower = [cols_metadata[col][\"lower\"] for col in columns]\n", - " upper = [cols_metadata[col][\"upper\"] for col in columns]\n", - " return (lower, upper)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "12d1faa1-f88a-49bb-911a-83f879ca10b6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)\n", - "bounds" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "1ca11e06-0b1e-4238-a5c1-1e52a6569431", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5, bounds=bounds)),\n", - " ('classifier', models.LogisticRegression(epsilon = 1.0))\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "235d7da6-f6bd-4e71-9b07-84cbe283b74e", - "metadata": {}, - "outputs": [], - "source": [ - "# Expect PrivacyLeakWarning Error\n", - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "c47aec3e-15ea-476d-9dcb-5b2f4888e355", - "metadata": {}, - "source": [ - "Again, we have a Privacy Leak. For the same reason, the data_norm should be computed based on metadata and given as argument as explained in the error message." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "25a72ad9-d3f3-478a-8d33-c07bedbf4f66", - "metadata": {}, - "outputs": [], - "source": [ - "# The max l2 norm of any row of the data. This defines the spread of data that will be protected by differential privacy.\n", - "data_norm = np.sqrt(np.linalg.norm(bounds[1]))" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "828a743e-960f-4713-a6ed-a0bd243a13e3", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5, bounds=bounds)),\n", - " ('classifier', models.LogisticRegression(epsilon = 1.0, data_norm = data_norm))\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "c9c13dfe-0266-4cd8-b126-2accee6c1136", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "2ccdb7f5-5968-47e7-99d4-16067b8645a2", - "metadata": {}, - "source": [ - "The pipeline worked, she can check that she has a dummy model and a dummy score associated. In the case of a Logistic Regression the score is a mean accuracy as specified [here](https://diffprivlib.readthedocs.io/en/latest/modules/models.html#diffprivlib.models.LogisticRegression.score).\n", - "Each model return an associated score. The associated documentation is in the DiffPrivLib documentation in the `score` method of each model." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "3c38f919-7ca1-455c-9b0f-bc2b56f60c0f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'score': 0.3,\n", - " 'model': Pipeline(steps=[('scaler',\n", - " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " epsilon=0.5)),\n", - " ('classifier',\n", - " LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", - " data_norm=83.69469642643347))])}" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dummy_response['query_response']" - ] - }, - { - "cell_type": "markdown", - "id": "6a61629d-b96f-4114-8bc2-eccf34d69d2b", - "metadata": {}, - "source": [ - "Now that the pipeline seems to work, she also wants to choose another data imputation method: be default the missing data are dropped but she wants the replace them with the mean. Therefore, she uses the `imputer_strategy` argument." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "547935ca-0932-4476-8ace-3644c7e0a08d", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"mean\",\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "4587385a-b76e-45f4-a1d9-af0a88a1181f", - "metadata": {}, - "source": [ - "It also works. It she wanted she could replace by the mean value with `imputer_strategy = \"mean\"` or the most frequent value with `imputer_strategy = \"most_frequent\"` (most_frequent makes more sense in the case of categorical columns). " - ] - }, - { - "cell_type": "markdown", - "id": "381cd096-bde3-474b-b24d-7fcb4c6ae49f", - "metadata": {}, - "source": [ - "Finally, she wants to use as much data as possible to train the model so she decides to reduce the `test_size` to 0.1 (meaning that 10% of the data will be used as the test set and 90% and the training set). Also she modifies the seed for the random split between training and testing data `test_train_split_seed` because why not. By default `test_size = 0.2` and `test_train_split_seed = 1`." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "73e8b9ab-2d93-4333-ace3-c94c714410dc", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.1,\n", - " test_train_split_seed = 4,\n", - " imputer_strategy = \"mean\",\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "4f9c2330-15f3-46f9-94c1-d62ea350e2e8", - "metadata": {}, - "source": [ - "#### She can now estimated the cost of this pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "e036b55f-6c3d-4212-8d91-9ece8223cf69", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 1.5, 'delta_cost': 0.0}" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = client.estimate_diffprivlib_cost(\n", - " dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.1,\n", - " test_train_split_seed = 4,\n", - " imputer_strategy = \"mean\",\n", - ")\n", - "res" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "4398755f-348f-47e2-9329-80c34897e16b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'The cost will be 1.5 epsilon and 0.0 delta.'" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f\"The cost will be {res['epsilon_cost']} epsilon and {res['delta_cost']} delta.\"" - ] - }, - { - "cell_type": "markdown", - "id": "8aad5f86-20f7-42fe-8efd-56c96f6beb41", - "metadata": {}, - "source": [ - "Now we train the same pipeline on the real dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "b823db85-d993-4a36-9dea-bf5989c543f8", - "metadata": {}, - "outputs": [], - "source": [ - "res = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.1,\n", - " test_train_split_seed = 4,\n", - " imputer_strategy = \"mean\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "6c071425-5364-4d79-8ccf-4f46018ac849", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'The accuracy score of the model trained on real data is 0.22857142857142856.'" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f\"The accuracy score of the model trained on real data is {res['query_response']['score']}.\"" - ] - }, - { - "cell_type": "markdown", - "id": "9cea3fc7-4331-4387-a19f-6afcaa21b6bc", - "metadata": {}, - "source": [ - "The model is with different trained parameters is also available:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "b646cd08-504b-4846-88ba-a3557ee4b2fd", - "metadata": {}, - "outputs": [], - "source": [ - "model = res['query_response']['model']" - ] - }, - { - "cell_type": "markdown", - "id": "a581f47d-f1c7-4121-9f8f-e496e9023d58", - "metadata": {}, - "source": [ - "We predict what would be the specie of the smallest possible penguin in all dimension versus to biggest possible penguin in all dimensions." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "65413ef0-317b-431d-9ed8-6ffabe85c1b2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmflipper_length_mmbody_mass_gpredictions
                      030.013.0150.02000.0Chinstrap
                      165.023.0250.07000.0Gentoo
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm flipper_length_mm body_mass_g predictions\n", - "0 30.0 13.0 150.0 2000.0 Chinstrap\n", - "1 65.0 23.0 250.0 7000.0 Gentoo" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'bill_depth_mm': [bounds[0][1], bounds[1][1]] , \n", - " 'flipper_length_mm': [bounds[0][2], bounds[1][2]], \n", - " 'body_mass_g': [bounds[0][3], bounds[1][3]]\n", - "})\n", - "\n", - "predictions = model.predict(x_to_predict)\n", - "x_to_predict[\"predictions\"] = predictions\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "839ba199-3014-4e39-8f0a-aecf15241b11", - "metadata": {}, - "source": [ - "## Step 5: Train other models with DiffPrivLib" - ] - }, - { - "cell_type": "markdown", - "id": "4f161f96-e240-45b2-bb60-002870196158", - "metadata": {}, - "source": [ - "The logic is always the same for all the models. The `pipeline` and `feature_columns` arguments must always be specified for all models. The `target_columns` must be specified except for Clustering (K-Means) and Dimensinnality reduction (PCA).\n", - "\n", - "Here are examples of each on dummy dataframes." - ] - }, - { - "cell_type": "markdown", - "id": "fef35343-cdf6-4e86-a54a-4bcf6568f2ac", - "metadata": {}, - "source": [ - "### Classification: Gaussian Naive Bayes" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "f8a5ddc0-61bb-44c0-a14b-5ac3278ff539", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm']\n", - "target_columns = ['species']" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "4f4b9789-7da1-4abe-9dd6-dd1472a4e217", - "metadata": {}, - "outputs": [], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "9dd37857-0ef2-44d5-b206-092262c9cea1", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('scaler', models.StandardScaler(epsilon = 0.5, bounds=bounds)),\n", - " ('gaussian', models.GaussianNB(epsilon = 1.0, bounds=bounds, priors = (0.3, 0.3, 0.4))),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "8e2c07c6-20f4-473c-80f6-b4b558191530", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.15,\n", - " imputer_strategy = \"median\",\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "550868df-5476-496e-849d-8787da9eb27e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 1.5, 'delta_cost': 0.0}" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost_res = client.estimate_diffprivlib_cost(\n", - " dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.15,\n", - " imputer_strategy = \"median\",\n", - ")\n", - "cost_res" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "934a1237-68d1-4796-838e-e8c370068f5d", - "metadata": {}, - "outputs": [], - "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"median\",\n", - " test_size = 0.15,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "81708812-897a-4357-af06-139220538831", - "metadata": {}, - "outputs": [], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'bill_depth_mm': [bounds[0][1], bounds[1][1]] , \n", - " 'flipper_length_mm': [bounds[0][2], bounds[1][2]], \n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "ec3c98d3-cb5d-4a96-9ada-ea9904326aec", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmflipper_length_mmpredictions
                      030.013.0150.0Chinstrap
                      165.023.0250.0Chinstrap
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm flipper_length_mm predictions\n", - "0 30.0 13.0 150.0 Chinstrap\n", - "1 65.0 23.0 250.0 Chinstrap" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "predictions = response['query_response']['model'].predict(x_to_predict)\n", - "x_to_predict[\"predictions\"] = predictions\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "c1224c94-d995-40f1-967d-b7afb21bce48", - "metadata": {}, - "source": [ - "### Random Forest" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "980f4494-4b1f-4cb0-b288-ddc672231b1f", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'body_mass_g']\n", - "target_columns = ['island']" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "e91f9a5c-14ea-4e48-8e42-fa50152767b7", - "metadata": {}, - "outputs": [], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "d4f036a7-0405-4f4b-a4a0-3fe1b0b8d4d0", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " (\n", - " 'rf', \n", - " models.RandomForestClassifier(\n", - " n_estimators=10, \n", - " epsilon = 2.0, \n", - " bounds=bounds, \n", - " classes=penguin_metadata['columns']['island']['categories']\n", - " )\n", - " ),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "c969d488-e1a2-445a-a269-681d96343b9f", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"drop\", #default\n", - " dummy = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "de94f0a5-6e9d-4eac-aa77-b98892ed41fc", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 2.0, 'delta_cost': 0.0}" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost_res = client.estimate_diffprivlib_cost(\n", - " dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"drop\", #default\n", - ")\n", - "cost_res" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "40f25e33-a644-4938-8adb-a7bbe5306ee2", - "metadata": {}, - "outputs": [], - "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " imputer_strategy = \"drop\", #default\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "4f5fad30-991e-45f3-a7e3-1ae04bedd8a1", - "metadata": {}, - "outputs": [], - "source": [ - "model = response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "96562928-73e8-48b1-b8a5-97245c7da8d2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmbody_mass_gpredictions
                      030.013.02000.0Torgersen
                      165.023.07000.0Torgersen
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm body_mass_g predictions\n", - "0 30.0 13.0 2000.0 Torgersen\n", - "1 65.0 23.0 7000.0 Torgersen" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'bill_depth_mm': [bounds[0][1], bounds[1][1]] , \n", - " 'body_mass_g': [bounds[0][2], bounds[1][2]]\n", - "})\n", - "predictions = model.predict(x_to_predict)\n", - "x_to_predict[\"predictions\"] = predictions\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "020ceeb1-7a78-4036-8ece-0afa88e49342", - "metadata": {}, - "source": [ - "### Decision Tree Classifier" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "c5400d29-8303-4714-8617-8a2b26b0aa2e", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'body_mass_g']\n", - "target_columns = ['species']" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "1760f475-6326-41e5-945a-66882183bc00", - "metadata": {}, - "outputs": [], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "22b5c5ae-b008-4980-8767-47e7a1ad3301", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " (\n", - " 'dtc', \n", - " models.DecisionTreeClassifier(\n", - " epsilon = 2.0, \n", - " bounds=bounds, \n", - " classes=penguin_metadata['columns']['species']['categories']\n", - " )\n", - " ),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "70b73ba0-67dc-4594-820c-0128916fafc8", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.2,\n", - " test_train_split_seed = 1,\n", - " dummy = True,\n", - " nb_rows = 100,\n", - " seed = 42\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "736e8283-604a-4e45-9e98-7da5cc03e1b0", - "metadata": {}, - "outputs": [], - "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.2,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "66bfe1a9-7982-4d6b-ac0b-32a4412f29bf", - "metadata": {}, - "outputs": [], - "source": [ - "model = response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "a3719359-58a6-4271-9a34-4b49e0d7188e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbody_mass_gpredictions
                      030.02000.0Adelie
                      165.07000.0Chinstrap
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm body_mass_g predictions\n", - "0 30.0 2000.0 Adelie\n", - "1 65.0 7000.0 Chinstrap" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'body_mass_g': [bounds[0][1], bounds[1][1]] , \n", - "})\n", - "x_to_predict[\"predictions\"] = model.predict(x_to_predict)\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "4e72e9fc-bb5b-49d9-b4e6-543bdaf93f69", - "metadata": {}, - "source": [ - "### Regression: Linear Regression" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "c893cbb0-26b7-4367-ab67-1ccc88f951ed", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm']\n", - "target_columns = ['bill_depth_mm']" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "c7c66418-74b3-4887-bb99-3d8b6ea7af3d", - "metadata": {}, - "outputs": [], - "source": [ - "bill_length_meta = penguin_metadata['columns']['bill_length_mm']\n", - "bill_depth_meta = penguin_metadata['columns']['bill_depth_mm']" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "907e6f6c-a3da-4f7c-8d85-b0a7b8c018d1", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " (\n", - " 'lr', \n", - " models.LinearRegression(\n", - " epsilon = 2.0, \n", - " bounds_X=(bill_length_meta['lower'], bill_length_meta['upper']), \n", - " bounds_y=(bill_depth_meta['lower'], bill_depth_meta['upper'])\n", - " )\n", - " ),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "58011a7d-7c03-4872-a032-5d93c55c1d5f", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " dummy = True\n", - ")\n", - "model = dummy_response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "e28b1bd0-0e73-49db-a2d3-e7f06dc39d49", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmpredictions
                      030.017.641046
                      165.018.526961
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm predictions\n", - "0 30.0 17.641046\n", - "1 65.0 18.526961" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Dummy model predictions\n", - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bill_length_meta['lower'], bill_length_meta['upper']], \n", - "})\n", - "x_to_predict[\"predictions\"] = model.predict(x_to_predict)\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "ec9e921d-1640-4379-84e5-65b93a1ff203", - "metadata": {}, - "source": [ - "### Clustering: K-Means" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "2491d06f-3c40-4649-b419-ccd9b39f0764", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "10acc43d-ff2e-4d7a-9c52-361ffb80e0da", - "metadata": {}, - "outputs": [], - "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "1e830a01-7800-4701-aef2-11dbfc517f61", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " ('kmeans', models.KMeans(n_clusters = 8, epsilon = 2.0, bounds=bounds)),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "cb5e3e1f-2d48-4d5e-992a-c0e0cb6add3b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      Pipeline(steps=[('kmeans',\n",
                      -       "                 KMeans(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n",
                      -       "                        bounds=(array([  30.,   13.,  150., 2000.]),\n",
                      -       "                                array([  65.,   23.,  250., 7000.])),\n",
                      -       "                        epsilon=2.0))])
                      In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
                      On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
                      " - ], - "text/plain": [ - "Pipeline(steps=[('kmeans',\n", - " KMeans(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " epsilon=2.0))])" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " dummy = True\n", - ")\n", - "model = dummy_response['query_response']['model']\n", - "model" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "a0612b10-de7a-4355-8268-09a46c30056a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmflipper_length_mmbody_mass_gpredictions
                      030.013.0150.02000.05
                      165.023.0250.07000.06
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm flipper_length_mm body_mass_g predictions\n", - "0 30.0 13.0 150.0 2000.0 5\n", - "1 65.0 23.0 250.0 7000.0 6" - ] - }, - "execution_count": 82, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Dummy model predictions\n", - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [bounds[0][0], bounds[1][0]], \n", - " 'bill_depth_mm': [bounds[0][1], bounds[1][1]] , \n", - " 'flipper_length_mm': [bounds[0][2], bounds[1][2]], \n", - " 'body_mass_g': [bounds[0][3], bounds[1][3]]\n", - "})\n", - "x_to_predict[\"predictions\"] = model.predict(x_to_predict)\n", - "x_to_predict" - ] - }, - { - "cell_type": "markdown", - "id": "6021b034-b15d-4826-8de3-80b99afc838d", - "metadata": {}, - "source": [ - "### Dimensionality Reduction: PCA" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "id": "fd8347be-5951-419d-820c-26655db5ea8c", - "metadata": {}, - "outputs": [], - "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']\n", - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "id": "f9a4cbaf-b994-41c0-a0e9-81674c6657fb", - "metadata": {}, - "outputs": [], - "source": [ - "dpl_pipeline = Pipeline([\n", - " (\n", - " 'pca', \n", - " models.PCA(\n", - " n_components=None, \n", - " epsilon = 1.0, \n", - " bounds=bounds, \n", - " data_norm=100, \n", - " centered=False\n", - " )\n", - " ),\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "id": "4681cc17-6285-4b9b-a26d-837d6a79e1c3", - "metadata": {}, - "outputs": [], - "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " dummy = True\n", - ")\n", - "model = dummy_response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "id": "e2d6912e-f97c-4ac6-9085-c7379136628c", - "metadata": {}, - "outputs": [], - "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - ")\n", - "model = response['query_response']['model']" - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "id": "e2c0cafa-49f6-48de-aa1a-4e84bbbf97cf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      PCA(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n",
                      -       "    bounds=(array([  30.,   13.,  150., 2000.]),\n",
                      -       "            array([  65.,   23.,  250., 7000.])),\n",
                      -       "    data_norm=100)
                      In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
                      On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
                      " - ], - "text/plain": [ - "PCA(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " data_norm=100)" - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model = model.steps[0][1]\n", - "pca_model" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "id": "b1ac9784-bd0e-41c6-bb54-8201d9ab13ad", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 0.06269805, -0.02257092, 0.12818723, 0.98950874],\n", - " [ 0.54397209, 0.70486754, -0.4534618 , 0.0403549 ],\n", - " [-0.04333305, 0.56533889, 0.81874155, -0.09042376],\n", - " [ 0.83563483, -0.42783671, 0.3280285 , -0.10520211]])" - ] - }, - "execution_count": 116, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.components_" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "id": "d7cf2790-1938-48b1-83b3-3b17b06953fc", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([12087.46118653, 4144.29748358, 2619.4887658 , 121.73642974])" - ] - }, - "execution_count": 117, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.explained_variance_" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "id": "91992588-2eb5-4b6b-9f30-ccaa272c593a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.63708804, 0.21843151, 0.13806414, 0.0064163 ])" - ] - }, - "execution_count": 118, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.explained_variance_ratio_" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "id": "9e76a632-114b-428f-ad78-d83fdcd00d56", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1789.74222011, 179.61111848, 1047.96890848, 833.1653635 ])" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.singular_values_" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "id": "fc13910b-b892-4a46-bff9-c3df4cc6ed72", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 44.38324636, 16.88939657, 198.03063776, 4207.08181725])" - ] - }, - "execution_count": 120, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.mean_" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "id": "bd11a051-1452-4b59-8c18-622737986125", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.n_components_" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "id": "282d55e9-0968-4528-b2d4-4d87d64d4c1a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0" - ] - }, - "execution_count": 122, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pca_model.noise_variance_" - ] - }, - { - "cell_type": "markdown", - "id": "94eaf59b-c108-424c-8978-b1c86e141ccb", - "metadata": {}, - "source": [ - "## Step 6: See archives of queries" - ] - }, - { - "cell_type": "markdown", - "id": "64003c53-de56-4bdc-a3c2-0c3e40031919", - "metadata": {}, - "source": [ - "She now wants to verify all the queries that she did on the real data. It is possible because an archive of all queries is kept in a secure database. With a function call she can see her queries, budget and associated responses." - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "id": "008fd230-cdfd-4e03-91ce-5a60b06c106d", - "metadata": {}, - "outputs": [], - "source": [ - "previous_queries = client.get_previous_queries()" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "id": "1795a54b-d04e-4687-8649-93982c84ad30", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'diffprivlib',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'diffprivlib_json': '{\"module\": \"diffprivlib\", \"version\": \"0.6.4\", \"pipeline\": [{\"type\": \"_dpl_type:StandardScaler\", \"name\": \"scaler\", \"params\": {\"with_mean\": true, \"with_std\": true, \"copy\": true, \"epsilon\": 0.5, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0]]}, \"random_state\": null, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}, {\"type\": \"_dpl_type:LogisticRegression\", \"name\": \"classifier\", \"params\": {\"tol\": 0.0001, \"C\": 1.0, \"fit_intercept\": true, \"random_state\": null, \"max_iter\": 100, \"verbose\": 0, \"warm_start\": false, \"n_jobs\": null, \"epsilon\": 1.0, \"data_norm\": 83.69469642643347, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}]}',\n", - " 'feature_columns': ['bill_length_mm',\n", - " 'bill_depth_mm',\n", - " 'flipper_length_mm',\n", - " 'body_mass_g'],\n", - " 'target_columns': ['species'],\n", - " 'test_size': 0.1,\n", - " 'test_train_split_seed': 4,\n", - " 'imputer_strategy': 'mean'},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'score': 0.22857142857142856,\n", - " 'model': Pipeline(steps=[('scaler',\n", - " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " epsilon=0.5)),\n", - " ('classifier',\n", - " LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", - " data_norm=83.69469642643347))])},\n", - " 'spent_epsilon': 1.5,\n", - " 'spent_delta': 0.0},\n", - " 'timestamp': 1725375748.4772062}" - ] - }, - "execution_count": 126, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query_1 = previous_queries[0]\n", - "query_1" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "id": "ef251e47-67d8-426b-9655-c16d32778579", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'diffprivlib',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'diffprivlib_json': '{\"module\": \"diffprivlib\", \"version\": \"0.6.4\", \"pipeline\": [{\"type\": \"_dpl_type:StandardScaler\", \"name\": \"scaler\", \"params\": {\"with_mean\": true, \"with_std\": true, \"copy\": true, \"epsilon\": 0.5, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 150.0], [65.0, 23.0, 250.0]]}, \"random_state\": null, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}, {\"type\": \"_dpl_type:GaussianNB\", \"name\": \"gaussian\", \"params\": {\"priors\": {\"_tuple\": true, \"_items\": [0.3, 0.3, 0.4]}, \"var_smoothing\": 1e-09, \"epsilon\": 1.0, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 150.0], [65.0, 23.0, 250.0]]}, \"random_state\": null, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}]}',\n", - " 'feature_columns': ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],\n", - " 'target_columns': ['species'],\n", - " 'test_size': 0.15,\n", - " 'test_train_split_seed': 1,\n", - " 'imputer_strategy': 'median'},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'score': 0.17307692307692307,\n", - " 'model': Pipeline(steps=[('scaler',\n", - " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", - " bounds=(array([ 30., 13., 150.]),\n", - " array([ 65., 23., 250.])),\n", - " epsilon=0.5)),\n", - " ('gaussian',\n", - " GaussianNB(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", - " bounds=(array([ 30., 13., 150.]),\n", - " array([ 65., 23., 250.])),\n", - " priors=(0.3, 0.3, 0.4)))])},\n", - " 'spent_epsilon': 1.5,\n", - " 'spent_delta': 0.0},\n", - " 'timestamp': 1725375760.2964165}" - ] - }, - "execution_count": 127, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query_2 = previous_queries[1]\n", - "query_2" - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "id": "b2fa8943-f0e0-4902-9001-bd10fb22a653", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'diffprivlib',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'diffprivlib_json': '{\"module\": \"diffprivlib\", \"version\": \"0.6.4\", \"pipeline\": [{\"type\": \"_dpl_type:RandomForestClassifier\", \"name\": \"rf\", \"params\": {\"n_estimators\": 10, \"n_jobs\": 1, \"random_state\": null, \"verbose\": 0, \"warm_start\": false, \"max_depth\": 5, \"epsilon\": 2.0, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 2000.0], [65.0, 23.0, 7000.0]]}, \"classes\": [\"Torgersen\", \"Biscoe\", \"Dream\"], \"shuffle\": false, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}]}',\n", - " 'feature_columns': ['bill_length_mm', 'bill_depth_mm', 'body_mass_g'],\n", - " 'target_columns': ['island'],\n", - " 'test_size': 0.2,\n", - " 'test_train_split_seed': 1,\n", - " 'imputer_strategy': 'drop'},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'score': 0.4925373134328358,\n", - " 'model': Pipeline(steps=[('rf',\n", - " RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", - " bounds=(array([ 30., 13., 2000.]),\n", - " array([ 65., 23., 7000.])),\n", - " classes=['Torgersen', 'Biscoe',\n", - " 'Dream'],\n", - " epsilon=2.0))])},\n", - " 'spent_epsilon': 2.0,\n", - " 'spent_delta': 0.0},\n", - " 'timestamp': 1725375769.0791934}" - ] - }, - "execution_count": 128, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query_3 = previous_queries[2]\n", - "query_3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e2c8d40d-94b3-4d69-af99-0ec2936f233e", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb b/html/v0.3.1/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb deleted file mode 100644 index 33d0c68b..00000000 --- a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb +++ /dev/null @@ -1,1756 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3f18d338", - "metadata": {}, - "source": [ - "# Secure Data Disclosure: Client side" - ] - }, - { - "cell_type": "markdown", - "id": "1582a2ae", - "metadata": {}, - "source": [ - "This notebook showcases how researcher could use the Secure Data Disclosure system. It explains the different functionnalities provided by the dpserial client library to interact with the secure server.\n", - "\n", - "The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.\n", - "\n", - "Each user has access to one or multiple projects and for each dataset has a limited budget $\\epsilon$, $\\delta$." - ] - }, - { - "cell_type": "markdown", - "id": "5b73135c", - "metadata": {}, - "source": [ - "🐧🐧🐧\n", - "In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins dimensions.\n", - "\n", - "Therefore, the powerful queen Icerbegina 👑 had the data collected. But in order to get the penguins to agree to participate she promised them that no one would be able to look at the data and that no one would be able to guess the bill width of any specific penguin (which is very sensitive information) from the data. Nobody! Not even the researchers. The queen hence stored the data on the Secure Data Disclosure Server and only gave a small budget to Dr. Antarctica.\n", - "\n", - "This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library ofs_dpserial. \n", - "🐧🐧🐧" - ] - }, - { - "cell_type": "markdown", - "id": "01ae30d2", - "metadata": {}, - "source": [ - "## Step 1: Install the library\n", - "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `fso_dpserial` on her local developping environment. \n", - "\n", - "It can be installed via the pip command:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "98b4013c-ea93-4e4d-8885-15aac0039c12", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "import os\n", - "sys.path.append(os.path.abspath(os.path.join('..')))\n", - "# !pip install lomas_client" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "9d96dcd7", - "metadata": {}, - "outputs": [], - "source": [ - "from lomas_client.client import Client\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "id": "9c63718b", - "metadata": {}, - "source": [ - "## Step 2: Initialise the client\n", - "\n", - "Once the library is installed, a Client object must be created. It is responsible for sending sending requests to the server and processing responses in the local environment. It enables a seamless interaction with the server. \n", - "\n", - "To create the client, Dr. Antartica needs to give it a few parameters:\n", - "- a url: the root application endpoint to the remote secure server.\n", - "- user_name: her name as registered in the database (Dr. Alice Antartica)\n", - "- dataset_name: the name of the dataset that she wants to query (PENGUIN)\n", - "\n", - "She will only be able to query on the real dataset if the queen Icergina has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some epsilon and delta credit. (As is done in the Secure Data Disclosure Notebook: Server side)." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "941991f7", - "metadata": {}, - "outputs": [], - "source": [ - "APP_URL = \"http://lomas_server\"\n", - "USER_NAME = \"Dr. Antartica\"\n", - "DATASET_NAME = \"PENGUIN\"\n", - "client = Client(url=APP_URL, user_name = USER_NAME, dataset_name = DATASET_NAME)" - ] - }, - { - "cell_type": "markdown", - "id": "0ec400c8", - "metadata": {}, - "source": [ - "And that's it for the preparation. She is now ready to use the various functionnalities offered by `fso_dpserial`." - ] - }, - { - "cell_type": "markdown", - "id": "9b9a5f13", - "metadata": {}, - "source": [ - "## Step 3: Understand the functionnalities of the library" - ] - }, - { - "cell_type": "markdown", - "id": "c7cb5531", - "metadata": {}, - "source": [ - "### Getting dataset metadata\n", - "\n", - "Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the `get_dataset_metadata()` function of the client. As this is public information, this does not cost any budget.\n", - "\n", - "This function returns metadata information in the same format as [SmartnoiseSQL dictionary format](https://docs.smartnoise.org/sql/metadata.html#dictionary-format), where among other, there is information about all the available columns, their type, bound values (see Smartnoise page for more details)." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "d15cbe39", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'censor_dims': False,\n", - " 'columns': {'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Adelie', 'Chinstrap', 'Gentoo']},\n", - " 'island': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Torgersen', 'Biscoe', 'Dream']},\n", - " 'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},\n", - " 'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},\n", - " 'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},\n", - " 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},\n", - " 'sex': {'type': 'string',\n", - " 'cardinality': 2,\n", - " 'categories': ['MALE', 'FEMALE']}},\n", - " 'rows': 344}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "metadata = client.get_dataset_metadata()\n", - "metadata" - ] - }, - { - "cell_type": "markdown", - "id": "d338ed96", - "metadata": {}, - "source": [ - "Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds. She also knows based on the field `max_ids: 1` that each penguin can only be once in the dataset and on the field `row_privacy: True` that each row represents a single penguin. " - ] - }, - { - "cell_type": "markdown", - "id": "5a3c899d", - "metadata": {}, - "source": [ - "### Get a dummy dataset\n", - "\n", - "Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset. \n", - "\n", - "Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets.\n", - "Getting a dummy dataset does not affect the budget as there is no differential privacy here, it is not a synthetic dataset and all that could be learn here is already present in the public metadata.\n", - "\n", - "Dr. Antartica first create a dummy dataset with the default options." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "be07091f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(100, 7)\n" - ] - }, - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
                      0ChinstrapTorgersen43.10890413.314292214.2031652258.408606FEMALE
                      1AdelieDream63.27500119.364104158.4139964656.773158FEMALE
                      2AdelieDream55.61978816.143560166.1628714703.175608FEMALE
                      3AdelieBiscoe50.95304718.085707239.8554195187.149507MALE
                      4GentooTorgersen35.46065222.075665210.6429065630.456669MALE
                      \n", - "
                      " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Chinstrap Torgersen 43.108904 13.314292 214.203165 \n", - "1 Adelie Dream 63.275001 19.364104 158.413996 \n", - "2 Adelie Dream 55.619788 16.143560 166.162871 \n", - "3 Adelie Biscoe 50.953047 18.085707 239.855419 \n", - "4 Gentoo Torgersen 35.460652 22.075665 210.642906 \n", - "\n", - " body_mass_g sex \n", - "0 2258.408606 FEMALE \n", - "1 4656.773158 FEMALE \n", - "2 4703.175608 FEMALE \n", - "3 5187.149507 MALE \n", - "4 5630.456669 MALE " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_dummy = client.get_dummy_dataset()\n", - "print(df_dummy.shape)\n", - "df_dummy.head()" - ] - }, - { - "cell_type": "markdown", - "id": "4f85e950", - "metadata": {}, - "source": [ - "However, she would prefer to have a dataset with 200 rows and chooses a seed of 0, hence:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "01f4365a", - "metadata": {}, - "outputs": [], - "source": [ - "NB_ROWS = 200\n", - "SEED = 0" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "3f553b29", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(200, 7)\n" - ] - }, - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
                      0GentooBiscoe49.20847316.117959190.1259502873.291927FEMALE
                      1GentooTorgersen55.03162819.963435242.9291423639.940005FEMALE
                      2ChinstrapTorgersen51.09671816.777518159.9614935401.743330MALE
                      3AdelieBiscoe49.07091114.796037244.5301532316.038092MALE
                      4ChinstrapBiscoe44.82791813.246787236.9488535036.246870FEMALE
                      \n", - "
                      " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Gentoo Biscoe 49.208473 16.117959 190.125950 \n", - "1 Gentoo Torgersen 55.031628 19.963435 242.929142 \n", - "2 Chinstrap Torgersen 51.096718 16.777518 159.961493 \n", - "3 Adelie Biscoe 49.070911 14.796037 244.530153 \n", - "4 Chinstrap Biscoe 44.827918 13.246787 236.948853 \n", - "\n", - " body_mass_g sex \n", - "0 2873.291927 FEMALE \n", - "1 3639.940005 FEMALE \n", - "2 5401.743330 MALE \n", - "3 2316.038092 MALE \n", - "4 5036.246870 FEMALE " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_dummy = client.get_dummy_dataset(nb_rows = NB_ROWS, seed = SEED)\n", - "print(df_dummy.shape)\n", - "df_dummy.head()" - ] - }, - { - "cell_type": "markdown", - "id": "69dac96e", - "metadata": {}, - "source": [ - "### Query dummy dataset\n", - "\n", - "Now that she has an idea of what the data looks like, she wants to start querying the real dataset to for her research. However, before this other tools are at her disposal to reduce potential error risks and avoid spending budget on irrelevant queries. Of course, this does not have any impact on the budget.\n", - "\n", - "It is possible to specify the flag `dummy=True` in the various queries to perform the query on the dummy dataset instead of the real dataset and ensure that the queries are doing what is expected of them. \n", - "\n", - "Therefore Dr. Antartica computes the results that she gets on the dummy dataframe that she created locally and on the same dummy dataframe in the server via a query and compare them to ensure that the query is well defined and works within the server.\n", - "\n", - "She tests with an example on the average bill length on the dataframe." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "b6caee55", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "47.51532" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# On the local dummy dataframe\n", - "result_local_dummy = round(df_dummy['bill_length_mm'].mean(), 5)\n", - "result_local_dummy" - ] - }, - { - "cell_type": "markdown", - "id": "c3a37d8d", - "metadata": {}, - "source": [ - "As the query on the server goes through the same workflow for dummies and real data, she still has to set values for theoratical budget to spend on the dummy query. Of course, this theoretical budget will NOT affect her real budget as this is on dummy data. \n", - "\n", - "It is recommended to use very high values on the budget parameters here to have little noise and small difference between the exact local result and the 'little noisy' server result. \n", - "\n", - "Also, make sure to use the same values of number of rows and seed to have the same dummy datasets." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "3946425d", - "metadata": {}, - "outputs": [], - "source": [ - "# Average bill length in mm\n", - "QUERY = \"SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df\"" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "90cf2a6d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "47.51229381350249" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# On the remote server dummy dataframe\n", - "res = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = 100.0, # make sure to select high values of epsilon and delta to have small differences\n", - " delta = 2.0, # make sure to select high values of epsilon and delta to have small differences\n", - " dummy = True, \n", - " nb_rows = NB_ROWS,\n", - " seed = SEED\n", - ")\n", - "res_server_dummy = res['query_response'][\"avg_bill_length_mm\"][0]\n", - "res_server_dummy" - ] - }, - { - "cell_type": "markdown", - "id": "bb3fa8eb", - "metadata": {}, - "source": [ - "She then checks that the responses on the dummy locally and the dummy on the server are close enough (difference would be only due to small noise addition)." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "0f2fff82", - "metadata": {}, - "outputs": [], - "source": [ - "np.testing.assert_almost_equal(\n", - " result_local_dummy, \n", - " res_server_dummy,\n", - " decimal=2, \n", - " err_msg=\"Responses are different, either try with a bigger budget or query is not doing what is intended.\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "5a82abcd", - "metadata": {}, - "source": [ - "As you can see res_local and res_server are close. We can accept that the small difference is due to the small noise added due to the large values of $\\epsilon$ and $\\delta$." - ] - }, - { - "cell_type": "markdown", - "id": "324454ed", - "metadata": {}, - "source": [ - "### Get current budget\n", - "\n", - "It is the first time that Dr. Antartica connects to the server and she wants to know how much buget the queen assigned her.\n", - "Therefore, she calls the fonction `get_initial_budget`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "61a467f3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'initial_epsilon': 10.0, 'initial_delta': 0.005}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_initial_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "bc8f7a74", - "metadata": {}, - "source": [ - "She sees that she has 10.0 epsilon and 0.0004 epsilon at her disposal.\n", - "\n", - "Then she checks her total spent budget `get_total_spent_budget`. As she only did queries on metadata on dummy dataframes, this should still be 0." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "afd22f84", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'total_spent_epsilon': 2.714285714286655, 'total_spent_delta': 0.0}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_total_spent_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "05daf5a4", - "metadata": {}, - "source": [ - "It will also be useful to know what the remaining budget is. Therefore, she calls the function `get_remaining_budget`. It just substarcts the total spent budget from the initial budget." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "6260cf54", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 7.285714285713345, 'remaining_delta': 0.005}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "20298e00", - "metadata": {}, - "source": [ - "As expected, for now the remaining budget is equal to the inital budget." - ] - }, - { - "cell_type": "markdown", - "id": "b746374c", - "metadata": {}, - "source": [ - "### Estimate cost of a query\n", - "Another safeguard is the functionnality to estimate the cost of a query. As in OpenDP and SmartnoiseSQL, the budget that will by used by a query might be slightly different than what is asked by the user. The `estimate cost` function returns the estimated real cost of any query.\n", - "\n", - "Again, of course, this will not impact the user's budget.\n", - "\n", - "Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an `epsilon` and a `delta`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "133020c6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 2.0, 'delta_cost': 4.999999999999449e-05}" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 1.0, \n", - " delta = 1e-4\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "71580822", - "metadata": {}, - "source": [ - "So this query would actually cost her 3.0 epsilon and a little 1.499e-4 delta. As she does not want to spend to much budget here she tries other values of budget." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "df487c62", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 0.4, 'delta_cost': 5.000000000032756e-06}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 0.2, \n", - " delta = 1e-5\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "3c6a3a8c", - "metadata": {}, - "source": [ - "This query would actually cost her 0.6 epsilon and a similar delta. She decides that it is good enough." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "c9c8d3e7", - "metadata": {}, - "outputs": [], - "source": [ - "EPSILON = 0.2\n", - "DELTA = 1e-5" - ] - }, - { - "cell_type": "markdown", - "id": "e5379edf", - "metadata": {}, - "source": [ - "### Query real dataset\n", - "Now that all the safeguard functions were tested, Dr. Antartica is ready to query on the real dataset and get a differentially private response of the average bill length. By default, the flag `dummy` is False so setting it is optional. She uses the values of `epsilon` and `delta` that she selected just before.\n", - "\n", - "Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "19e60263", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 7.285714285713345, 'remaining_delta': 0.005}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "69767fac", - "metadata": {}, - "outputs": [], - "source": [ - "avg_bill_length_response = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = EPSILON, \n", - " delta = DELTA,\n", - " dummy = False\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "6dbbdf93", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average bill length: 44.18mm.\n" - ] - } - ], - "source": [ - "avg_bill_length = avg_bill_length_response['query_response']['avg_bill_length_mm'].iloc[0]\n", - "print(f\"Average bill length: {np.round(avg_bill_length, 2)}mm.\")" - ] - }, - { - "cell_type": "markdown", - "id": "b2767e65", - "metadata": {}, - "source": [ - "After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "39701fe5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 6.885714285713345,\n", - " 'remaining_delta': 0.004994999999999967}" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "e37c587f", - "metadata": {}, - "source": [ - "As can be seen in `get_total_spent_budget()`, it is the budget estimated with `estimate_cost()` that was spent." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "487f835f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'total_spent_epsilon': 3.114285714286655,\n", - " 'total_spent_delta': 5.000000000032756e-06}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_total_spent_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "eef4afcd", - "metadata": {}, - "source": [ - "Dr. Antartica has now a differentially private estimation of the bill length of all birds and is confident to use the library for the rest of her analyses." - ] - }, - { - "cell_type": "markdown", - "id": "04929993", - "metadata": {}, - "source": [ - "## Step 4: Penguin statistics" - ] - }, - { - "cell_type": "markdown", - "id": "bbbca191", - "metadata": {}, - "source": [ - "### Confidence intervals for flipper length over the whole population" - ] - }, - { - "cell_type": "markdown", - "id": "9d41bd58", - "metadata": {}, - "source": [ - "She is first interested to have a better idea of the distribution of flipper length of all species. She already has the mean from step 3, so she just need to compute the standard deviation and know the number of penguins in the dataset. As it is just an exploration step, she uses very little budget values." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "04b376ef", - "metadata": {}, - "outputs": [], - "source": [ - "QUERY = \"SELECT COUNT(bill_length_mm) AS nb_penguin, STD(bill_length_mm) AS std_bill_length_mm FROM df\"" - ] - }, - { - "cell_type": "markdown", - "id": "0b041c81", - "metadata": {}, - "source": [ - "She again first verifies that her query works on the dummy dataset:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "5aa9c304", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      nb_penguinstd_bill_length_mm
                      010010.332225
                      \n", - "
                      " - ], - "text/plain": [ - " nb_penguin std_bill_length_mm\n", - "0 100 10.332225" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dummy_res = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = 100.0, \n", - " delta = 10.0, \n", - " dummy = True\n", - ")\n", - "dummy_res['query_response']" - ] - }, - { - "cell_type": "markdown", - "id": "74f68994", - "metadata": {}, - "source": [ - "The syntax of the query works, now she checks the budget:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "a8fa2c49", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 1.5, 'delta_cost': 5.000000000032756e-06}" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 0.5, \n", - " delta = 1e-5\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "bed840d3", - "metadata": {}, - "source": [ - "It is a bit too much, she decides to test for less:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "edc97e73", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 0.75, 'delta_cost': 5.000000000032756e-06}" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = 0.25, \n", - " delta = 1e-5\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "da9f81c4", - "metadata": {}, - "source": [ - "That's fine, she is ready to query:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "534979fb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      nb_penguinstd_bill_length_mm
                      034313.064982
                      \n", - "
                      " - ], - "text/plain": [ - " nb_penguin std_bill_length_mm\n", - "0 343 13.064982" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "response = client.smartnoise_sql_query(query = QUERY, epsilon = 0.25, delta = 1e-5)\n", - "response = response['query_response']\n", - "response" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "674332e7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of penguins: 343.\n", - "Standard deviation of bill length: 13.06.\n" - ] - } - ], - "source": [ - "nb_penguin = response['nb_penguin'].iloc[0]\n", - "print(f\"Number of penguins: {nb_penguin}.\")\n", - "\n", - "std_bill_length = response['std_bill_length_mm'].iloc[0]\n", - "print(f\"Standard deviation of bill length: {np.round(std_bill_length, 2)}.\")" - ] - }, - { - "cell_type": "markdown", - "id": "367081be-1159-45d8-9129-88fba20fb697", - "metadata": {}, - "source": [ - "She can now do all the postprocessing that she wants with the returned data without adding any privacy risk. " - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "f72b19d0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Standard error of bill length: 0.71.\n" - ] - } - ], - "source": [ - "# Get standard error\n", - "standard_error = std_bill_length/np.sqrt(nb_penguin)\n", - "print(f\"Standard error of bill length: {np.round(standard_error, 2)}.\")" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "62630a03", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The 95% confidence interval of the bill length of all penguins is [42.8, 45.57].\n" - ] - } - ], - "source": [ - " # Compute the 95% confidence interval\n", - "ZSCORE = 1.96\n", - "lower_bound, upper_bound = avg_bill_length - ZSCORE*standard_error, avg_bill_length + ZSCORE*standard_error\n", - "print(f\"The 95% confidence interval of the bill length of all penguins is [{np.round(lower_bound, 2)}, {np.round(upper_bound, 2)}].\")" - ] - }, - { - "cell_type": "markdown", - "id": "b5ee7ad2", - "metadata": {}, - "source": [ - "### Hypothesis testing" - ] - }, - { - "cell_type": "markdown", - "id": "0f1a3a8d", - "metadata": {}, - "source": [ - "So, Dr. Antartica has now the opportunity to study the various penguins dimensions and will do an hypotheses testing analysis to discover if flipper length differ between the penguins species.\n", - "\n", - "She will do a two-tailed two-sample $t$ test.\n", - "\n", - "- The null hypothese $H_0$ is flipper length does not differ between species.\n", - "- The alternative hypothesis $H_a$ is flipper length does differ between species.\n", - "\n", - "She set the level of significance at 0.05." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "7d9ae766-4c0d-4dc5-9c9a-5f7eb99718f9", - "metadata": {}, - "outputs": [], - "source": [ - "CRITICAL_VALUE = 0.05" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "5006201d", - "metadata": {}, - "outputs": [], - "source": [ - "QUERY = \"SELECT \\\n", - " species AS species, \\\n", - " COUNT(bill_length_mm) AS nb_penguin, \\\n", - " AVG(bill_length_mm) AS avg_bill_length_mm, \\\n", - " STD(bill_length_mm) AS std_bill_length_mm \\\n", - " FROM df GROUP BY species\"" - ] - }, - { - "cell_type": "markdown", - "id": "e725eb3f-d12f-4f62-8f57-06fb00639f91", - "metadata": {}, - "source": [ - "She estimates how much budget it would really cost:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "0255550b-7fd2-4244-a8eb-da809ddc6a5b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 3.0, 'delta_cost': 4.999999999999449e-05}" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 1, delta = 1e-4)" - ] - }, - { - "cell_type": "markdown", - "id": "56bf804f-d877-48cb-b405-709b30cda3d1", - "metadata": {}, - "source": [ - "The real cost seems to be 3 times the epsilon that she sets. It is a lot but she tries on the dummy dataset to verify all is working properly." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "80d9933b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'query_response': species nb_penguin avg_bill_length_mm std_bill_length_mm\n", - " 0 Adelie 39 45.659944 10.695675\n", - " 1 Chinstrap 33 45.690454 14.067739\n", - " 2 Gentoo 31 38.472887 14.542186}" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 1, delta = 1.0, dummy = True)\n", - "dummy_res" - ] - }, - { - "cell_type": "markdown", - "id": "5691680f-8716-4a99-999a-a2bd5ef6a679", - "metadata": {}, - "source": [ - "She did not give enough budget for the query to work. This is why there are 'NANs' in the output. She has to spend more budget for the query to work." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "6b014db4-acbd-4ae1-a3b6-397035851583", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 6.135714285713345,\n", - " 'remaining_delta': 0.004989999999999935}" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "43d3488d-3987-4fec-a840-78385e956832", - "metadata": {}, - "source": [ - "The maximum she can do with all her remaining budget of 7.4 is around 7.4/4 = 1.85. Let's check:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "99d7998d-daa1-4d5e-aa42-abc5aabdf2e3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 5.550000000000001, 'delta_cost': 4.999999999999449e-05}" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.estimate_smartnoise_sql_cost(query = QUERY, epsilon = 7.4/4, delta = 1e-4)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "0e07fde9-9430-4a12-8337-0503ac162c26", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'query_response': species nb_penguin avg_bill_length_mm std_bill_length_mm\n", - " 0 Adelie 37 48.755816 3.634415\n", - " 1 Chinstrap 33 46.912863 4.552931\n", - " 2 Gentoo 29 41.803438 17.566451}" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dummy_res = client.smartnoise_sql_query(query = QUERY, epsilon = 7.4/4, delta = 1e-4, dummy = True)\n", - "dummy_res" - ] - }, - { - "cell_type": "markdown", - "id": "e8dadd17", - "metadata": {}, - "source": [ - "If it errors, she might need to re-run the query a few times until it works. The budget is not affected by dummy queries anyway." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "59f2d665", - "metadata": {}, - "outputs": [], - "source": [ - "flipper_length_response = client.smartnoise_sql_query(query = QUERY, epsilon = 7.4/4, delta = 1e-4)" - ] - }, - { - "cell_type": "markdown", - "id": "78d23e66-2c05-4e35-bba9-7b92710b872a", - "metadata": {}, - "source": [ - "And now she should not have any remaining budget:" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "6eb20cfb-fa53-496f-940d-9b17b05fa074", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 0.5857142857133439,\n", - " 'remaining_delta': 0.00493999999999994}" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "cb96f406-d409-4531-ac86-05f1c9296705", - "metadata": {}, - "source": [ - "But she can do her post-processing and hypothesis analysis." - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "748f125f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesnb_penguinavg_bill_length_mmstd_bill_length_mm
                      0Adelie15038.6498873.997587
                      1Chinstrap6749.2850025.859511
                      2Gentoo12247.5571674.643492
                      \n", - "
                      " - ], - "text/plain": [ - " species nb_penguin avg_bill_length_mm std_bill_length_mm\n", - "0 Adelie 150 38.649887 3.997587\n", - "1 Chinstrap 67 49.285002 5.859511\n", - "2 Gentoo 122 47.557167 4.643492" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_flipper = flipper_length_response['query_response']\n", - "df_flipper" - ] - }, - { - "cell_type": "markdown", - "id": "099129cf", - "metadata": {}, - "source": [ - "And finally the $t$-test:" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "0a7d7d4d", - "metadata": {}, - "outputs": [], - "source": [ - "def t_test(avg_1, avg_2, std_1, std_2, nb_1, nb_2):\n", - " standard_error = (std_1 * (nb_1 - 1) + std_2 * (nb_2 - 1))/(nb_1 + nb_2 - 2)\n", - " return (avg_1 - avg_2)/np.sqrt(standard_error**2*(1/nb_1 + 1 /nb_2))" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "bc3ee48a", - "metadata": {}, - "outputs": [], - "source": [ - "nb_0, avg_0, std_0 = df_flipper[['nb_penguin', 'avg_bill_length_mm', 'std_bill_length_mm']].iloc[0]\n", - "nb_1, avg_1, std_1 = df_flipper[['nb_penguin', 'avg_bill_length_mm', 'std_bill_length_mm']].iloc[1]\n", - "nb_2, avg_2, std_2 = df_flipper[['nb_penguin', 'avg_bill_length_mm', 'std_bill_length_mm']].iloc[2]" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "1717f9ea", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T test between specie 0 and specie 1: -15.84. Reject null hypothesis: True.\n", - "T test between specie 0 and specie 2: -17.04. Reject null hypothesis: True.\n", - "T test between specie 1 and specie 2: 2.24. Reject null hypothesis: True.\n" - ] - } - ], - "source": [ - "t_01 = t_test(avg_0, avg_1, std_0, std_1, nb_0, nb_1)\n", - "t_02 = t_test(avg_0, avg_2, std_0, std_2, nb_0, nb_2)\n", - "t_12 = t_test(avg_1, avg_2, std_1, std_2, nb_1, nb_2)\n", - "\n", - "print(f\"T test between specie 0 and specie 1: {np.round(t_01, 2)}. Reject null hypothesis: {abs(t_01) > CRITICAL_VALUE}.\")\n", - "print(f\"T test between specie 0 and specie 2: {np.round(t_02, 2)}. Reject null hypothesis: {abs(t_02) > CRITICAL_VALUE}.\")\n", - "print(f\"T test between specie 1 and specie 2: {np.round(t_12, 2)}. Reject null hypothesis: {abs(t_12) > CRITICAL_VALUE}.\")" - ] - }, - { - "cell_type": "markdown", - "id": "a557b754-ae7a-490a-8c4b-3928de7101d1", - "metadata": {}, - "source": [ - "All t-tests are above the critical value of 0.5. She can reject the null hypothesis." - ] - }, - { - "cell_type": "markdown", - "id": "b4df475b", - "metadata": {}, - "source": [ - "She finally computes the confidence intervals for the flipper length of each species" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "9289bc26", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesnb_penguinavg_bill_length_mmstd_bill_length_mmstandard_errorci_95_lower_boundci_95_upper_bound
                      0Adelie15038.6498873.9975870.32640238.01014039.289634
                      1Chinstrap6749.2850025.8595110.71585347.88193050.688074
                      2Gentoo12247.5571674.6434920.42040246.73317948.381155
                      \n", - "
                      " - ], - "text/plain": [ - " species nb_penguin avg_bill_length_mm std_bill_length_mm \\\n", - "0 Adelie 150 38.649887 3.997587 \n", - "1 Chinstrap 67 49.285002 5.859511 \n", - "2 Gentoo 122 47.557167 4.643492 \n", - "\n", - " standard_error ci_95_lower_bound ci_95_upper_bound \n", - "0 0.326402 38.010140 39.289634 \n", - "1 0.715853 47.881930 50.688074 \n", - "2 0.420402 46.733179 48.381155 " - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ZSCORE = 1.96\n", - "df_flipper['standard_error'] = df_flipper['std_bill_length_mm']/np.sqrt(df_flipper['nb_penguin'])\n", - "df_flipper['ci_95_lower_bound'] = df_flipper['avg_bill_length_mm'] - ZSCORE * df_flipper['standard_error']\n", - "df_flipper['ci_95_upper_bound'] = df_flipper['avg_bill_length_mm'] + ZSCORE * df_flipper['standard_error']\n", - "df_flipper" - ] - }, - { - "cell_type": "markdown", - "id": "f79e8333-1f06-4019-af3c-94ff2362d036", - "metadata": {}, - "source": [ - "She can now go and present her findings to queen Icebergina." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cce8dde4-0c9e-43d4-b6ce-890ac7c8efd2", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a630fd2d-86fb-4b8d-afb3-c6d1c31f3ac4", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb b/html/v0.3.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb deleted file mode 100644 index 571ccff1..00000000 --- a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb +++ /dev/null @@ -1,2505 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3f18d338", - "metadata": {}, - "source": [ - "# Lomas Client Side: Using Smartnoise-Synth" - ] - }, - { - "cell_type": "markdown", - "id": "1582a2ae", - "metadata": {}, - "source": [ - "This notebook showcases how researcher could use the Secure Data Disclosure system. It explains the different functionnalities provided by the `lomas-client` client library to interact with the secure server.\n", - "\n", - "The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.\n", - "\n", - "Each user has access to one or multiple projects and for each dataset has a limited budget with $\\epsilon$ and $\\delta$ values." - ] - }, - { - "cell_type": "markdown", - "id": "01ae30d2", - "metadata": {}, - "source": [ - "## Step 1: Install the library\n", - "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `lomas-client` on her local developping environment. \n", - "\n", - "It can be installed via the pip command:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dc563050-fcc0-4c11-9e63-46eaefa63ce7", - "metadata": {}, - "outputs": [], - "source": [ - "# !pip install lomas_client" - ] - }, - { - "cell_type": "markdown", - "id": "c5df0c8f-ca9c-4af1-8c60-fb1d30d6283d", - "metadata": {}, - "source": [ - "Or using a local version of the client" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "36d508bf-6cc3-4034-8e11-fffe858552f9", - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "import os\n", - "sys.path.append(os.path.abspath(os.path.join('..')))" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "9535e92e-620e-4df4-92dd-4ea2c653e4ab", - "metadata": {}, - "outputs": [], - "source": [ - "from lomas_client import Client\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "id": "9c63718b", - "metadata": {}, - "source": [ - "## Step 2: Initialise the client\n", - "\n", - "Once the library is installed, a Client object must be created. It is responsible for sending sending requests to the server and processing responses in the local environment. It enables a seamless interaction with the server. \n", - "\n", - "To create the client, Dr. Antartica needs to give it a few parameters:\n", - "- a url: the root application endpoint to the remote secure server.\n", - "- user_name: her name as registered in the database (Dr. Alice Antartica)\n", - "- dataset_name: the name of the dataset that she wants to query (PENGUIN)\n", - "\n", - "She will only be able to query on the real dataset if the queen Icergina has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some epsilon and delta credit (as is done in the Admin Notebook for Users and Datasets management)." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "941991f7", - "metadata": {}, - "outputs": [], - "source": [ - "APP_URL = \"http://lomas_server\"\n", - "USER_NAME = \"Dr. Antartica\"\n", - "DATASET_NAME = \"PENGUIN\"\n", - "client = Client(url=APP_URL, user_name = USER_NAME, dataset_name = DATASET_NAME)" - ] - }, - { - "cell_type": "markdown", - "id": "0ec400c8", - "metadata": {}, - "source": [ - "And that's it for the preparation. She is now ready to use the various functionnalities offered by `lomas-client`." - ] - }, - { - "cell_type": "markdown", - "id": "9b9a5f13", - "metadata": {}, - "source": [ - "## Step 3: Metadata and dummy dataset" - ] - }, - { - "cell_type": "markdown", - "id": "c7cb5531", - "metadata": {}, - "source": [ - "### Getting dataset metadata\n", - "\n", - "Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the `get_dataset_metadata()` function of the client. As this is public information, this does not cost any budget.\n", - "\n", - "This function returns metadata information in a format based on [SmartnoiseSQL dictionary format](https://docs.smartnoise.org/sql/metadata.html#dictionary-format), where among other, there is information about all the available columns, their type, bound values (see Smartnoise page for more details). Any metadata is required for Smartnoise-SQL is also required here and additional information such that the different categories in a string type column column can be added." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "0fdebac9-57fc-4410-878b-5a77425af634", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'censor_dims': False,\n", - " 'columns': {'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Adelie', 'Chinstrap', 'Gentoo']},\n", - " 'island': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Torgersen', 'Biscoe', 'Dream']},\n", - " 'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},\n", - " 'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},\n", - " 'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},\n", - " 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},\n", - " 'sex': {'type': 'string',\n", - " 'cardinality': 2,\n", - " 'categories': ['MALE', 'FEMALE']}},\n", - " 'rows': 344}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "penguin_metadata = client.get_dataset_metadata()\n", - "penguin_metadata" - ] - }, - { - "cell_type": "markdown", - "id": "9e7ca7ae-bf17-40c8-aa75-2d72fcdd3088", - "metadata": {}, - "source": [ - "## Step 3: Create a Synthetic Dataset keeping all default parameters" - ] - }, - { - "cell_type": "markdown", - "id": "2de1389c-53a7-4098-bc3c-397c12a4b869", - "metadata": {}, - "source": [ - "We want to get a synthetic model to represent the private data.\n", - "\n", - "Therefore, we use a Smartnoise Synth Synthesizers." - ] - }, - { - "cell_type": "markdown", - "id": "3423d410-2501-4eaa-bea4-6b31fba8c869", - "metadata": {}, - "source": [ - "Let's list the potential options. There respective paramaters are then available in Smarntoise Synth documentation [here](https://docs.smartnoise.org/synth/synthesizers/index.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "cf6dd9f4-a9ca-4805-a597-553a26604430", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['mwem', 'dpctgan', 'patectgan', 'mst', 'pacsynth', 'dpgan', 'pategan', 'aim']" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from snsynth import Synthesizer\n", - "Synthesizer.list_synthesizers()" - ] - }, - { - "cell_type": "markdown", - "id": "a06365e9-4076-4592-871a-31af91d6a05d", - "metadata": {}, - "source": [ - "### AIM: Adaptive Iterative Mechanism" - ] - }, - { - "cell_type": "markdown", - "id": "4f83dffe-f5b6-42fc-a74c-f3f00dc6c257", - "metadata": {}, - "source": [ - "We start by executing a query on the dummy dataset without specifying any special parameters for AIM (all optional kept as default).\n", - "Also only works on categorical columns so we select \"species\" and \"island\" columns to create a synthetic dataset of these two columns." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "a17ef2a7-1a70-440a-b11f-9867e1e9dd70", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesisland
                      0AdelieDream
                      1GentooTorgersen
                      2AdelieDream
                      3AdelieDream
                      4GentooTorgersen
                      \n", - "
                      " - ], - "text/plain": [ - " species island\n", - "0 Adelie Dream\n", - "1 Gentoo Torgersen\n", - "2 Adelie Dream\n", - "3 Adelie Dream\n", - "4 Gentoo Torgersen" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"aim\",\n", - " epsilon=1.0,\n", - " delta=0.0001,\n", - " select_cols = [\"species\", \"island\"],\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "markdown", - "id": "f12ed311-3622-4cb8-b5e5-585cf20c91a8", - "metadata": {}, - "source": [ - "The algorithm works and returned a synthetic dataset. We now estimate the cost of running this command:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "51063e79-0809-49ee-b7f0-c19b190571c5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 1.0, 'delta_cost': 0.0001}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_cost = client.estimate_smartnoise_synth_cost(\n", - " synth_name=\"aim\",\n", - " epsilon=1.0,\n", - " delta=0.0001,\n", - " select_cols = [\"species\", \"island\"],\n", - ")\n", - "res_cost" - ] - }, - { - "cell_type": "markdown", - "id": "0f582e93-ca3b-4a9d-b24a-8c26996cab64", - "metadata": {}, - "source": [ - "Executing such a query on the private dataset would cost 1.0 epsilon and 0.0001 delta. Dr. Antartica decides to do it with now the flag `dummmy` to False and specifiying that the wants the aim synthesizer model in return (with `return_model = True`).\n", - "\n", - "NOTE: if she does not set the parameter `return_model = True`, then it is False by default and she will get a synthetic dataframe as response directly." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "8160a5ab-dd53-4d0d-9f6d-ff31c39831c9", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.11/site-packages/mbi/__init__.py:15: UserWarning: MixtureInference disabled, please install jax and jaxlib\n", - " warnings.warn('MixtureInference disabled, please install jax and jaxlib')\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = client.smartnoise_synth_query(\n", - " synth_name=\"aim\",\n", - " epsilon=1.0,\n", - " delta=0.0001,\n", - " select_cols = [\"species\", \"island\"],\n", - " dummy=True,\n", - " return_model = True\n", - ")\n", - "res['query_response']" - ] - }, - { - "cell_type": "markdown", - "id": "20d8db1d-6fe2-4bf0-9b12-e9e25a9df235", - "metadata": {}, - "source": [ - "She can now get the model and sample results with it. She choose to sample 10 samples." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "1add6713-1906-4d57-bd90-9e54b0a883d4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesisland
                      0GentooBiscoe
                      1GentooDream
                      2GentooDream
                      3AdelieTorgersen
                      4ChinstrapDream
                      5AdelieDream
                      6AdelieTorgersen
                      7ChinstrapBiscoe
                      8ChinstrapTorgersen
                      9ChinstrapTorgersen
                      \n", - "
                      " - ], - "text/plain": [ - " species island\n", - "0 Gentoo Biscoe\n", - "1 Gentoo Dream\n", - "2 Gentoo Dream\n", - "3 Adelie Torgersen\n", - "4 Chinstrap Dream\n", - "5 Adelie Dream\n", - "6 Adelie Torgersen\n", - "7 Chinstrap Biscoe\n", - "8 Chinstrap Torgersen\n", - "9 Chinstrap Torgersen" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "synth = res['query_response']\n", - "synth.sample(10)" - ] - }, - { - "cell_type": "markdown", - "id": "9b9837d3-11a5-49d9-aaaf-0637061cf2f5", - "metadata": {}, - "source": [ - "She now wants to specify some specific parameters to the AIM model. Therefore, she needs to set some parameters in `synth_params` based on the Smartnoise-Synth documentation [here](https://docs.smartnoise.org/synth/synthesizers/aim.html#parameters). She decides that she wants to modify the `max_model_size` to 50 (the default was 80) and tries on the dummy." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "8be9943c-4cb3-41ef-bb31-02cbb6e773c6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"aim\",\n", - " epsilon=1.0,\n", - " delta=0.0001,\n", - " select_cols = [\"species\", \"island\"],\n", - " dummy=True,\n", - " return_model = True,\n", - " synth_params = {\"max_model_size\": 50}\n", - ")\n", - "res_dummy['query_response']" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "e0e958c9-76de-499c-bdeb-658f7052d0b0", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesisland
                      0GentooDream
                      1AdelieNone
                      2AdelieBiscoe
                      3GentooTorgersen
                      4ChinstrapTorgersen
                      \n", - "
                      " - ], - "text/plain": [ - " species island\n", - "0 Gentoo Dream\n", - "1 Adelie None\n", - "2 Adelie Biscoe\n", - "3 Gentoo Torgersen\n", - "4 Chinstrap Torgersen" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "synth = res_dummy['query_response']\n", - "synth.sample(5)" - ] - }, - { - "cell_type": "markdown", - "id": "5b656a6c-2199-465e-b109-818c369b2798", - "metadata": {}, - "source": [ - "Now that the workflow is understood for AIM, she wants to experiment with various synthesizer on the dummy." - ] - }, - { - "cell_type": "markdown", - "id": "69cab29c-a882-4821-a0ef-eeb863e03071", - "metadata": {}, - "source": [ - "### MWEM: Multiplicative Weights Exponential Mechanism " - ] - }, - { - "cell_type": "markdown", - "id": "036bb9fe-29e1-42c1-bf7b-e684c7c37336", - "metadata": {}, - "source": [ - "She tries MWEM on all columns with all default parameters. As `return_model` is not specified she will directly receive a synthetic dataframe back. " - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "002a9a17-3e75-427b-8293-0fbd5188f762", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
                      0GentooTorgersen42.2522.5155.02250.0FEMALE
                      1ChinstrapBiscoe63.2513.5235.05250.0FEMALE
                      2GentooTorgersen42.2522.5155.02750.0FEMALE
                      3ChinstrapTorgersen63.2513.5235.05250.0FEMALE
                      4ChinstrapDream63.2513.5235.05250.0FEMALE
                      \n", - "
                      " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Gentoo Torgersen 42.25 22.5 155.0 \n", - "1 Chinstrap Biscoe 63.25 13.5 235.0 \n", - "2 Gentoo Torgersen 42.25 22.5 155.0 \n", - "3 Chinstrap Torgersen 63.25 13.5 235.0 \n", - "4 Chinstrap Dream 63.25 13.5 235.0 \n", - "\n", - " body_mass_g sex \n", - "0 2250.0 FEMALE \n", - "1 5250.0 FEMALE \n", - "2 2750.0 FEMALE \n", - "3 5250.0 FEMALE \n", - "4 5250.0 FEMALE " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"mwem\",\n", - " epsilon=1.0,\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "markdown", - "id": "bf112c1d-2313-451e-8107-966a7b731283", - "metadata": {}, - "source": [ - "She now specifies 3 columns and some parameters explained [here](https://docs.smartnoise.org/synth/synthesizers/mwem.html#snsynth.mwem.MWEMSynthesizer)." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "4f7303b7-77e0-4023-8f59-6b30e503567b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesislandsex
                      0ChinstrapTorgersenFEMALE
                      1GentooTorgersenFEMALE
                      2GentooTorgersenFEMALE
                      3GentooTorgersenFEMALE
                      4ChinstrapBiscoeFEMALE
                      \n", - "
                      " - ], - "text/plain": [ - " species island sex\n", - "0 Chinstrap Torgersen FEMALE\n", - "1 Gentoo Torgersen FEMALE\n", - "2 Gentoo Torgersen FEMALE\n", - "3 Gentoo Torgersen FEMALE\n", - "4 Chinstrap Biscoe FEMALE" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"mwem\",\n", - " epsilon=1.0,\n", - " select_cols = [\"species\", \"island\", \"sex\"],\n", - " synth_params = {\"measure_only\": False, \"max_retries_exp_mechanism\": 5},\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "markdown", - "id": "184114e9-1cf0-4b53-a2e4-5a14d787562a", - "metadata": {}, - "source": [ - "Finally it MWEM, she wants to go more in depth and create her own data preparation pipeline. Therefore, she can use Smartnoise-Synth \"Data Transformers\" explained [here](https://docs.smartnoise.org/synth/transforms/index.html) and send her own constraints dictionnary for specific steps. This is more for advanced user.\n", - "\n", - "By default, if no constraints are specified, the server creates its automatically a data transformer based on selected columns, synthesizer and metadata.\n", - "\n", - "Here she wants to add a clamping transformation on the continuous columns before training the synthesizer. She add the bounds based on metadata." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "3c3bf0ec-ca04-4c91-8742-c31f79633191", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "({'type': 'float', 'lower': 30.0, 'upper': 65.0},\n", - " {'type': 'float', 'lower': 13.0, 'upper': 23.0})" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bl_bounds = penguin_metadata[\"columns\"][\"bill_length_mm\"]\n", - "bd_bounds = penguin_metadata[\"columns\"][\"bill_depth_mm\"]\n", - "bl_bounds, bd_bounds" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "c3215ff4-aafb-4c1e-adf0-50dc383cd133", - "metadata": {}, - "outputs": [], - "source": [ - "from snsynth.transform import BinTransformer, ClampTransformer, ChainTransformer, LabelTransformer\n", - "\n", - "my_own_constraints = {\n", - " \"bill_length_mm\": ChainTransformer(\n", - " [\n", - " ClampTransformer(lower = bl_bounds[\"lower\"] + 10, upper = bl_bounds[\"upper\"] - 10),\n", - " BinTransformer(bins = 20, lower = bl_bounds[\"lower\"] + 10, upper = bl_bounds[\"upper\"] - 10),\n", - " ]\n", - " ),\n", - " \"bill_depth_mm\": ChainTransformer(\n", - " [\n", - " ClampTransformer(lower = bd_bounds[\"lower\"] + 2, upper = bd_bounds[\"upper\"] - 2),\n", - " BinTransformer(bins=20, lower = bd_bounds[\"lower\"] + 2, upper = bd_bounds[\"upper\"] - 2),\n", - " ]\n", - " ),\n", - " \"species\": LabelTransformer(nullable=True)\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "ffba8bcd-0b6b-4cc0-98a3-b25e8bdd1786", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmspecies
                      048.62516.05Chinstrap
                      151.62518.75Gentoo
                      251.62518.75Gentoo
                      351.62518.75Gentoo
                      444.87515.15Adelie
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm species\n", - "0 48.625 16.05 Chinstrap\n", - "1 51.625 18.75 Gentoo\n", - "2 51.625 18.75 Gentoo\n", - "3 51.625 18.75 Gentoo\n", - "4 44.875 15.15 Adelie" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"mwem\",\n", - " epsilon=1.0,\n", - " select_cols = [\"bill_length_mm\", \"bill_depth_mm\", \"species\"],\n", - " constraints = my_own_constraints,\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "markdown", - "id": "8d680bdc-e99f-4a40-a9ff-c2d1d053a573", - "metadata": {}, - "source": [ - "Also a subset of constraints can be specified for certain columns and the server will automatically generate those for the missing columns." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "21cc6269-5a6f-40c6-b081-52e59a62d903", - "metadata": {}, - "outputs": [], - "source": [ - "my_own_constraints = {\n", - " \"bill_length_mm\": ChainTransformer(\n", - " [\n", - " ClampTransformer(lower = bl_bounds[\"lower\"] + 10, upper = bl_bounds[\"upper\"] - 10),\n", - " BinTransformer(bins = 20, lower = bl_bounds[\"lower\"] + 10, upper = bl_bounds[\"upper\"] - 10),\n", - " ]\n", - " )\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "2b590d77-3cde-42ef-b55b-107cd253aad4", - "metadata": {}, - "source": [ - "In this case, only the bill_length will be clamped." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "432e076e-8411-49f0-8250-100e0940313a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      bill_length_mmbill_depth_mmspecies
                      041.12520.5Chinstrap
                      153.87520.5Adelie
                      249.37521.5Chinstrap
                      353.87520.5Adelie
                      441.12522.5Chinstrap
                      \n", - "
                      " - ], - "text/plain": [ - " bill_length_mm bill_depth_mm species\n", - "0 41.125 20.5 Chinstrap\n", - "1 53.875 20.5 Adelie\n", - "2 49.375 21.5 Chinstrap\n", - "3 53.875 20.5 Adelie\n", - "4 41.125 22.5 Chinstrap" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"mwem\",\n", - " epsilon=1.0,\n", - " select_cols = [\"bill_length_mm\", \"bill_depth_mm\", \"species\"],\n", - " constraints = my_own_constraints,\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "markdown", - "id": "035b69c3-4819-4fc1-b4ac-1c2bac1b31fc", - "metadata": {}, - "source": [ - "### MST: Maximum Spanning Tree" - ] - }, - { - "cell_type": "markdown", - "id": "21190b72-3089-4783-addd-09590814b94f", - "metadata": {}, - "source": [ - "She now experiments with MST. As the synthesizer is very needy in terms of computation, she selects a subset of column for it. See MST [here](https://docs.smartnoise.org/synth/synthesizers/mst.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "08d3f738-7dd0-4c73-9db6-ea91ee188968", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciessex
                      0FEMALE
                      1AdelieFEMALE
                      2GentooMALE
                      3GentooMALE
                      4Adelie
                      \n", - "
                      " - ], - "text/plain": [ - " species sex\n", - "0 FEMALE\n", - "1 Adelie FEMALE\n", - "2 Gentoo MALE\n", - "3 Gentoo MALE\n", - "4 Adelie " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"mst\",\n", - " epsilon=1.0,\n", - " select_cols = [\"species\", \"sex\"],\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "markdown", - "id": "249615d7-14e6-4f9c-8368-3fc00b4832c9", - "metadata": {}, - "source": [ - "She can also specify a specific number of samples to get (if return_model is not True):" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "7ea90e9d-7190-43d7-8ab8-c58214cd4198", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciessex
                      0AdelieFEMALE
                      1Chinstrap
                      2AdelieMALE
                      3AdelieFEMALE
                      \n", - "
                      " - ], - "text/plain": [ - " species sex\n", - "0 Adelie FEMALE\n", - "1 Chinstrap \n", - "2 Adelie MALE\n", - "3 Adelie FEMALE" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"mst\",\n", - " epsilon=1.0,\n", - " select_cols = [\"species\", \"sex\"],\n", - " nb_samples = 4,\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response']" - ] - }, - { - "cell_type": "markdown", - "id": "c1b4c876-11a5-4466-8831-d94786debe00", - "metadata": {}, - "source": [ - "And a condition on these samples. For instance, here, she only wants female samples." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "e1d50939-1fc7-4fcb-84d2-d7611435800b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      sexspecies
                      0Gentoo
                      1Gentoo
                      2Chinstrap
                      3Gentoo
                      \n", - "
                      " - ], - "text/plain": [ - " sex species\n", - "0 Gentoo\n", - "1 Gentoo\n", - "2 Chinstrap\n", - "3 Gentoo" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"mst\",\n", - " epsilon=1.0,\n", - " select_cols = [\"sex\", \"species\"],\n", - " nb_samples = 4,\n", - " condition = \"sex = FEMALE\",\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response']" - ] - }, - { - "cell_type": "markdown", - "id": "54809d01-9dd4-4bef-a575-3bc61d52b842", - "metadata": {}, - "source": [ - "## DPCTGAN: Differentially Private Conditional Tabular GAN" - ] - }, - { - "cell_type": "markdown", - "id": "8e0cb6b4-f539-4613-86f1-031b646e2376", - "metadata": {}, - "source": [ - "She now tries DPCTGAN. A first warning let her know that the random noise generation for this model is not cryptographically secure and if it is not ok for her, she can decode to stop using this synthesizer. Then she does not get a response but an error 422 with an explanation." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "7b508f33-7294-4928-8a25-27e0f0c702d3", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/code/lomas_client/utils.py:37: UserWarning: Warning:dpctgan synthesizer random generator for noise and shuffling is not cryptographically secure. (pseudo-rng in vanilla PyTorch).\n", - " warnings.warn(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Server error status 422: {\"ExternalLibraryException\":\"Error fitting model: sample_rate=5.0 is not a valid value. Please provide a float between 0 and 1. Try decreasing batch_size in synth_params (default batch_size=500).\",\"library\":\"smartnoise_synth\"}\n" - ] - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"dpctgan\",\n", - " epsilon=1.0,\n", - " dummy=True,\n", - ")\n", - "res_dummy" - ] - }, - { - "cell_type": "markdown", - "id": "240b3ad1-bc17-48cd-877e-19a05dc18b67", - "metadata": {}, - "source": [ - "The default parameters of DPCTGAN do not work for PENGUIN dataset. Hence, as advised in the error message, she decreases the batch_size (also she chekcks the documentation [here](https://docs.smartnoise.org/synth/synthesizers/dpctgan.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "8b122e7f-9cd4-42ca-b175-f26d34609646", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
                      0GentooTorgersen47.80987617.548668188.3462625152.039871MALE
                      1GentooTorgersen45.50589215.785036215.5278224079.444863FEMALE
                      2ChinstrapBiscoe39.29302219.115118176.0196573719.095856MALE
                      3AdelieDream47.02977117.322245202.4417304394.811036MALE
                      4GentooDream44.39393817.215382200.7888934653.589007FEMALE
                      \n", - "
                      " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Gentoo Torgersen 47.809876 17.548668 188.346262 \n", - "1 Gentoo Torgersen 45.505892 15.785036 215.527822 \n", - "2 Chinstrap Biscoe 39.293022 19.115118 176.019657 \n", - "3 Adelie Dream 47.029771 17.322245 202.441730 \n", - "4 Gentoo Dream 44.393938 17.215382 200.788893 \n", - "\n", - " body_mass_g sex \n", - "0 5152.039871 MALE \n", - "1 4079.444863 FEMALE \n", - "2 3719.095856 MALE \n", - "3 4394.811036 MALE \n", - "4 4653.589007 FEMALE " - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"dpctgan\",\n", - " epsilon=1.0,\n", - " synth_params = {\"batch_size\": 50},\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d0275fe1-7af3-4c1a-b54c-f054b9fc9658", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "6372e6e4-26d7-401d-b11b-46d1313a9b1f", - "metadata": {}, - "source": [ - "## PATEGAN: Private Aggregation of Teacher Ensembles" - ] - }, - { - "cell_type": "markdown", - "id": "547e950a-0070-42b4-819a-f8527b4e24f1", - "metadata": {}, - "source": [ - "Unfortunatelly, she is not able to train the pategan synthetizer on the PENGUIN dataset. Hence, she must try another one." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "5a9859d6-5bd7-4300-9232-95314bee37f6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Server error status 422: {\"ExternalLibraryException\":\"pategan not reliable with this dataset.\",\"library\":\"smartnoise_synth\"}\n" - ] - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"pategan\",\n", - " epsilon=1.0,\n", - " dummy=True,\n", - ")\n", - "res_dummy" - ] - }, - { - "cell_type": "markdown", - "id": "248f8cdc-a7d0-46e2-9b3a-61b78da606b0", - "metadata": {}, - "source": [ - "## PATECTGAN: Conditional tabular GAN using Private Aggregation of Teacher Ensembles" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "87dcdd69-8bf0-4eb4-88c1-f6bc9c87ea09", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
                      0AdelieTorgersen44.92962917.136712206.4503793677.639037MALE
                      1ChinstrapBiscoe41.91117715.958753219.2244803503.649727MALE
                      2ChinstrapBiscoe39.37110618.538643215.8607506183.452576MALE
                      3GentooDream39.77869919.392393220.4033376291.852415MALE
                      4GentooTorgersen41.94004018.712894209.8651493379.273981FEMALE
                      \n", - "
                      " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Adelie Torgersen 44.929629 17.136712 206.450379 \n", - "1 Chinstrap Biscoe 41.911177 15.958753 219.224480 \n", - "2 Chinstrap Biscoe 39.371106 18.538643 215.860750 \n", - "3 Gentoo Dream 39.778699 19.392393 220.403337 \n", - "4 Gentoo Torgersen 41.940040 18.712894 209.865149 \n", - "\n", - " body_mass_g sex \n", - "0 3677.639037 MALE \n", - "1 3503.649727 MALE \n", - "2 6183.452576 MALE \n", - "3 6291.852415 MALE \n", - "4 3379.273981 FEMALE " - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"patectgan\",\n", - " epsilon=1.0,\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "06eb0b95-1265-422c-9087-121b7091f37c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      islandbill_length_mmbody_mass_g
                      0Torgersen48.4828464627.040502
                      1Biscoe36.6272524458.971380
                      2Biscoe50.4372144419.834249
                      3Torgersen57.5150794114.015296
                      4Dream37.9147623729.208380
                      \n", - "
                      " - ], - "text/plain": [ - " island bill_length_mm body_mass_g\n", - "0 Torgersen 48.482846 4627.040502\n", - "1 Biscoe 36.627252 4458.971380\n", - "2 Biscoe 50.437214 4419.834249\n", - "3 Torgersen 57.515079 4114.015296\n", - "4 Dream 37.914762 3729.208380" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"patectgan\",\n", - " epsilon=1.0,\n", - " select_cols = [\"island\", \"bill_length_mm\", \"body_mass_g\"],\n", - " synth_params = {\n", - " \"embedding_dim\": 256, \n", - " \"generator_dim\": (128, 128), \n", - " \"discriminator_dim\": (256, 256),\n", - " \"generator_lr\": 0.0003, \n", - " \"generator_decay\": 1e-05, \n", - " \"discriminator_lr\": 0.0003, \n", - " \"discriminator_decay\": 1e-05, \n", - " \"batch_size\": 500\n", - " },\n", - " nb_samples = 100,\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "markdown", - "id": "7fcda9d1-4137-4ff3-9af7-eead85057dd5", - "metadata": {}, - "source": [ - "## DPGAN: DIfferentially Private GAN" - ] - }, - { - "cell_type": "markdown", - "id": "084ea436-f47e-4da2-95ea-7a068b9f1510", - "metadata": {}, - "source": [ - "For DPGAN, there is the same warning as for DPCTGAN with the cryptographically secure random noise generation." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "03c70909-e5f6-4c34-a787-37f5615ed600", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/code/lomas_client/utils.py:37: UserWarning: Warning:dpgan synthesizer random generator for noise and shuffling is not cryptographically secure. (pseudo-rng in vanilla PyTorch).\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
                      0ChinstrapTorgersen47.41871023.000000192.2332154478.892826MALE
                      1AdelieBiscoe45.05798617.836150195.9670935085.548207MALE
                      2AdelieDream46.49544517.600734195.4899783655.695215MALE
                      3GentooTorgersen58.33421919.706083250.0000007000.000000FEMALE
                      4AdelieBiscoe65.00000016.195120206.0656954478.947320FEMALE
                      \n", - "
                      " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Chinstrap Torgersen 47.418710 23.000000 192.233215 \n", - "1 Adelie Biscoe 45.057986 17.836150 195.967093 \n", - "2 Adelie Dream 46.495445 17.600734 195.489978 \n", - "3 Gentoo Torgersen 58.334219 19.706083 250.000000 \n", - "4 Adelie Biscoe 65.000000 16.195120 206.065695 \n", - "\n", - " body_mass_g sex \n", - "0 4478.892826 MALE \n", - "1 5085.548207 MALE \n", - "2 3655.695215 MALE \n", - "3 7000.000000 FEMALE \n", - "4 4478.947320 FEMALE " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"dpgan\",\n", - " epsilon=1.0,\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "markdown", - "id": "db5329b4-6a21-4b38-abeb-68a68195109e", - "metadata": {}, - "source": [ - "One final time she samples with conditions:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "17651dfc-d3b7-4030-a4be-1767de3767d1", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/code/lomas_client/utils.py:37: UserWarning: Warning:dpgan synthesizer random generator for noise and shuffling is not cryptographically secure. (pseudo-rng in vanilla PyTorch).\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
                      0AdelieTorgersen43.48599719.496153180.3030646134.536535MALE
                      1GentooTorgersen63.11660821.453384189.9074857000.000000MALE
                      2AdelieDream65.00000020.504224189.0219065361.825123MALE
                      3AdelieDream65.00000020.310123193.8099815012.155779FEMALE
                      4AdelieTorgersen64.38692516.037792188.5117546332.941920MALE
                      \n", - "
                      " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Adelie Torgersen 43.485997 19.496153 180.303064 \n", - "1 Gentoo Torgersen 63.116608 21.453384 189.907485 \n", - "2 Adelie Dream 65.000000 20.504224 189.021906 \n", - "3 Adelie Dream 65.000000 20.310123 193.809981 \n", - "4 Adelie Torgersen 64.386925 16.037792 188.511754 \n", - "\n", - " body_mass_g sex \n", - "0 6134.536535 MALE \n", - "1 7000.000000 MALE \n", - "2 5361.825123 MALE \n", - "3 5012.155779 FEMALE \n", - "4 6332.941920 MALE " - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"dpgan\",\n", - " epsilon=1.0,\n", - " condition = \"body_mass_g > 5000\",\n", - " dummy=True,\n", - ")\n", - "res_dummy['query_response'].head()" - ] - }, - { - "cell_type": "markdown", - "id": "177c8a4b-4eb7-444c-836d-cce81327e5c6", - "metadata": {}, - "source": [ - "And now on the real dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "799c7574-0eb9-49c1-bc01-b051782d7b62", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/code/lomas_client/utils.py:37: UserWarning: Warning:dpgan synthesizer random generator for noise and shuffling is not cryptographically secure. (pseudo-rng in vanilla PyTorch).\n", - " warnings.warn(\n" - ] - }, - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
                      0AdelieTorgersen43.33271916.996525197.1969806542.874247FEMALE
                      1GentooBiscoe53.66600019.943369184.6275065256.182522FEMALE
                      2AdelieTorgersen47.09263021.298139193.4098595405.979574FEMALE
                      3ChinstrapBiscoe54.15404715.847898192.3801976358.633310MALE
                      4AdelieBiscoe44.49432416.248922188.7831145486.318067FEMALE
                      5GentooBiscoe45.82899216.119691209.7922306048.840851FEMALE
                      6ChinstrapBiscoe45.58632617.164572196.0648386345.135689FEMALE
                      7GentooBiscoe52.85869018.386937190.2132065387.799114MALE
                      8ChinstrapBiscoe65.00000017.667682203.6679507000.000000FEMALE
                      9ChinstrapBiscoe65.00000019.445511195.6448155514.548540FEMALE
                      \n", - "
                      " - ], - "text/plain": [ - " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Adelie Torgersen 43.332719 16.996525 197.196980 \n", - "1 Gentoo Biscoe 53.666000 19.943369 184.627506 \n", - "2 Adelie Torgersen 47.092630 21.298139 193.409859 \n", - "3 Chinstrap Biscoe 54.154047 15.847898 192.380197 \n", - "4 Adelie Biscoe 44.494324 16.248922 188.783114 \n", - "5 Gentoo Biscoe 45.828992 16.119691 209.792230 \n", - "6 Chinstrap Biscoe 45.586326 17.164572 196.064838 \n", - "7 Gentoo Biscoe 52.858690 18.386937 190.213206 \n", - "8 Chinstrap Biscoe 65.000000 17.667682 203.667950 \n", - "9 Chinstrap Biscoe 65.000000 19.445511 195.644815 \n", - "\n", - " body_mass_g sex \n", - "0 6542.874247 FEMALE \n", - "1 5256.182522 FEMALE \n", - "2 5405.979574 FEMALE \n", - "3 6358.633310 MALE \n", - "4 5486.318067 FEMALE \n", - "5 6048.840851 FEMALE \n", - "6 6345.135689 FEMALE \n", - "7 5387.799114 MALE \n", - "8 7000.000000 FEMALE \n", - "9 5514.548540 FEMALE " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"dpgan\",\n", - " epsilon=1.0,\n", - " condition = \"body_mass_g > 5000\",\n", - " nb_samples = 10,\n", - " dummy=False,\n", - ")\n", - "res_dummy['query_response']" - ] - }, - { - "cell_type": "markdown", - "id": "94eaf59b-c108-424c-8978-b1c86e141ccb", - "metadata": {}, - "source": [ - "## Step 6: See archives of queries" - ] - }, - { - "cell_type": "markdown", - "id": "64003c53-de56-4bdc-a3c2-0c3e40031919", - "metadata": {}, - "source": [ - "She now wants to verify all the queries that she did on the real data. It is possible because an archive of all queries is kept in a secure database. With a function call she can see her queries, budget and associated responses." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "008fd230-cdfd-4e03-91ce-5a60b06c106d", - "metadata": {}, - "outputs": [], - "source": [ - "previous_queries = client.get_previous_queries()" - ] - }, - { - "cell_type": "markdown", - "id": "f2a34bc3-d1a5-4124-983f-ddc09dd1af7b", - "metadata": {}, - "source": [ - "Let's check the last query" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "1795a54b-d04e-4687-8649-93982c84ad30", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'smartnoise_synth',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'synth_name': 'dpgan',\n", - " 'epsilon': 1.0,\n", - " 'delta': None,\n", - " 'select_cols': [],\n", - " 'synth_params': {},\n", - " 'nullable': True,\n", - " 'constraints': '',\n", - " 'return_model': False,\n", - " 'condition': 'body_mass_g > 5000',\n", - " 'nb_samples': 10},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - " 0 Adelie Torgersen 43.332719 16.996525 197.196980 \n", - " 1 Gentoo Biscoe 53.666000 19.943369 184.627506 \n", - " 2 Adelie Torgersen 47.092630 21.298139 193.409859 \n", - " 3 Chinstrap Biscoe 54.154047 15.847898 192.380197 \n", - " 4 Adelie Biscoe 44.494324 16.248922 188.783114 \n", - " 5 Gentoo Biscoe 45.828992 16.119691 209.792230 \n", - " 6 Chinstrap Biscoe 45.586326 17.164572 196.064838 \n", - " 7 Gentoo Biscoe 52.858690 18.386937 190.213206 \n", - " 8 Chinstrap Biscoe 65.000000 17.667682 203.667950 \n", - " 9 Chinstrap Biscoe 65.000000 19.445511 195.644815 \n", - " \n", - " body_mass_g sex \n", - " 0 6542.874247 FEMALE \n", - " 1 5256.182522 FEMALE \n", - " 2 5405.979574 FEMALE \n", - " 3 6358.633310 MALE \n", - " 4 5486.318067 FEMALE \n", - " 5 6048.840851 FEMALE \n", - " 6 6345.135689 FEMALE \n", - " 7 5387.799114 MALE \n", - " 8 7000.000000 FEMALE \n", - " 9 5514.548540 FEMALE ,\n", - " 'spent_epsilon': 1.0,\n", - " 'spent_delta': 0.00015673368198174188},\n", - " 'timestamp': 1724943669.4523578}" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "last_query = previous_queries[-1]\n", - "last_query" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "08253456-fae7-424d-ac63-52dfc539c1e4", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/html/v0.3.1/en/notebooks/local_admin_notebook.ipynb b/html/v0.3.1/en/notebooks/local_admin_notebook.ipynb deleted file mode 100644 index d26164c0..00000000 --- a/html/v0.3.1/en/notebooks/local_admin_notebook.ipynb +++ /dev/null @@ -1,1840 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "363c238d-5925-4b4b-8f68-8ad84ea4705b", - "metadata": {}, - "source": [ - "# Lomas-server: CLI administration" - ] - }, - { - "cell_type": "markdown", - "id": "2db1363b-e87e-4d0e-bb3f-9af1a1b72b8d", - "metadata": {}, - "source": [ - "This notebook showcases how data owner could set up the server, add make their data available to certain users. It explains the different steps required." - ] - }, - { - "cell_type": "markdown", - "id": "de384c88-559e-4384-a49b-1664ffdd6692", - "metadata": {}, - "source": [ - "# Start the server" - ] - }, - { - "cell_type": "markdown", - "id": "92f3237b-6f13-4c52-a9f2-82d94f0b7e66", - "metadata": {}, - "source": [ - "## Create a docker volume\n", - "The first step is to create a docker volume for mongodb, which will hold all the \"admin\" data of the server. Docker volumes are persistent storage spaces that are managed by docker and can be mounted in containers. To create the volume use `docker volume create mongodata`. This must be done only once, and we use bind mounts for the server, so no need to create volumes for that." - ] - }, - { - "cell_type": "markdown", - "id": "87093f8e-68b1-4f1e-9e66-97c3885b3e48", - "metadata": {}, - "source": [ - "In a terminal run: `docker volume create mongodata`. In output you should see `mongodata` written." - ] - }, - { - "cell_type": "markdown", - "id": "f6829afb-d822-48e4-ba49-5daf0d79db7e", - "metadata": {}, - "source": [ - "## Start server\n", - "The second step is to start the server. Therefore the config file `configs/example_config.yaml` has to be adapted. The data owner must make sure to set the develop mode to False, specify the database type and ports. For this notebook, we will keep the default and use a mongodb on port 27017. Note: Keep in mind that if the configuration file is modified then the `docker-compose` has to be modified accordingly. This is out of scope for this notebook." - ] - }, - { - "cell_type": "markdown", - "id": "2408425a-13c6-4b89-a1fe-88491850fe10", - "metadata": {}, - "source": [ - "In a terminal run `docker compose up`. This will start the server and the mongodb, each running in its own Docker container. In addition, it will also start a client session container for demonstration purposes and a streamlit container, more on that later." - ] - }, - { - "cell_type": "markdown", - "id": "244da0f8", - "metadata": {}, - "source": [ - "To check that all containers are indeed running, run `docker ps`. You should be able to see a container for the server (`lomas_server_dev`), for the client (`lomas_client_dev`), for the streamlit (`lomas_streamlit_dev`) and one for the mongo database (`mongodb`)." - ] - }, - { - "cell_type": "markdown", - "id": "8dbebd54-8deb-46e6-b811-73ac74028569", - "metadata": {}, - "source": [ - "## Access the server to administrate the mongoDB" - ] - }, - { - "cell_type": "markdown", - "id": "4a8c8115", - "metadata": {}, - "source": [ - "To interact with the mongoDB, we first need to access the server Docker container from where we will run the commands. To do that from inside this Jupyter Notebook, we will need to use the Docker client library. Let's first install it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f6863a6d", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "!pip install docker" - ] - }, - { - "cell_type": "markdown", - "id": "b12b414a", - "metadata": {}, - "source": [ - "We can now import the library, create the client allowing us to interact with Docker, and finally, access the server container." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "112e4156", - "metadata": {}, - "outputs": [], - "source": [ - "import docker\n", - "client = docker.DockerClient()\n", - "server_container = client.containers.get(\"lomas_server_dev\")" - ] - }, - { - "cell_type": "markdown", - "id": "36b475e6", - "metadata": {}, - "source": [ - "To execute commands inside that Docker container, you can use the `exec_run` method which will return an ExecResult object, from which you can retrieve the output of the command. Let's see in the following example:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "dc0349be", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "__init__.py\n", - "__pycache__\n", - "admin_database\n", - "administration\n", - "app.py\n", - "constants.py\n", - "dataset_store\n", - "dp_queries\n", - "mongodb_admin.py\n", - "mongodb_admin_cli.py\n", - "data_connector\n", - "tests\n", - "utils\n", - "uvicorn_serve.py\n", - "\n" - ] - } - ], - "source": [ - "response = server_container.exec_run(\"ls\")\n", - "print(response.output.decode('utf-8'))" - ] - }, - { - "cell_type": "markdown", - "id": "9f35fd20-715c-483b-88e4-449c287ba61d", - "metadata": {}, - "source": [ - "Now, you are ready to interact with the database and add users." - ] - }, - { - "cell_type": "markdown", - "id": "d368d6a6-f1fe-4f65-9ce1-38c0b39584d1", - "metadata": {}, - "source": [ - "# Prepare the database" - ] - }, - { - "cell_type": "markdown", - "id": "b37c19b8-303d-4fe8-b515-33ed1099c581", - "metadata": {}, - "source": [ - "## Visualise all options\n", - "You can visualise all the options offered by the database by running the command `python mongodb_admin_cli.py --help`. We will go through through each of them in the rest of the notebook." - ] - }, - { - "cell_type": "markdown", - "id": "e70abf6d", - "metadata": {}, - "source": [ - "We prepare the function `run_command` to have a cleaner output of the commands in the notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "f9277a43", - "metadata": {}, - "outputs": [], - "source": [ - "from ast import literal_eval\n", - "\n", - "def run(command, to_dict=False):\n", - " response = server_container.exec_run(command)\n", - " output = response.output.decode('utf-8').replace(\"'\", '\"')\n", - " if \"] -\" in output:\n", - " output = output.split(\"] -\")[1].strip()\n", - " if to_dict:\n", - " if len(output):\n", - " output = literal_eval(output)\n", - " return output\n", - " return print(output)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "fafa4e34", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "usage: mongodb_admin_cli.py [-h]\n", - " {add_user,add_user_with_budget,del_user,add_dataset_to_user,del_dataset_to_user,set_budget_field,set_may_query,get_user,add_users_via_yaml,get_archives,get_users,get_user_datasets,add_dataset,add_datasets_via_yaml,del_dataset,get_dataset,get_metadata,get_datasets,drop_collection,get_collection}\n", - " ...\n", - "\n", - "MongoDB administration script for the database\n", - "\n", - "options:\n", - " -h, --help show this help message and exit\n", - "\n", - "subcommands:\n", - " {add_user,add_user_with_budget,del_user,add_dataset_to_user,del_dataset_to_user,set_budget_field,set_may_query,get_user,add_users_via_yaml,get_archives,get_users,get_user_datasets,add_dataset,add_datasets_via_yaml,del_dataset,get_dataset,get_metadata,get_datasets,drop_collection,get_collection}\n", - " user database administration operations\n", - " add_user add user to users collection\n", - " add_user_with_budget\n", - " add user with budget to users collection\n", - " del_user delete user from users collection\n", - " add_dataset_to_user\n", - " add dataset with initialized budget values for a user\n", - " del_dataset_to_user\n", - " delete dataset for user in users collection\n", - " set_budget_field set budget field to given value for given user and\n", - " dataset\n", - " set_may_query set may query field to given value for given user\n", - " get_user show all metadata of user\n", - " add_users_via_yaml create users collection from yaml file\n", - " get_archives show all previous queries from a user\n", - " get_users get the list of all users in \"users\" collection\n", - " get_user_datasets get the list of all datasets from a user\n", - " add_dataset set in which database the dataset is stored\n", - " add_datasets_via_yaml\n", - " create dataset to database type collection\n", - " del_dataset delete dataset and metadata from datasets and metadata\n", - " collection\n", - " get_dataset show a dataset from the dataset collection\n", - " get_metadata show metadata from the metadata collection\n", - " get_datasets get the list of all datasets in \"datasets\" collection\n", - " drop_collection delete collection from database\n", - " get_collection print a collection\n", - "\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py --help\")" - ] - }, - { - "cell_type": "markdown", - "id": "579b9571", - "metadata": {}, - "source": [ - "And finally, let's delete all existing data from database to start clean:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "18a3681c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Deleted collection datasets.\n", - "Deleted collection metadata.\n", - "Deleted collection users.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py drop_collection --collection datasets\")\n", - "run(\"python mongodb_admin_cli.py drop_collection --collection metadata\")\n", - "run(\"python mongodb_admin_cli.py drop_collection --collection users\")" - ] - }, - { - "cell_type": "markdown", - "id": "d7edd7d3-20f9-4546-afc8-25661f948d44", - "metadata": {}, - "source": [ - "## Datasets (add and drop)" - ] - }, - { - "cell_type": "markdown", - "id": "ed1597b3-767f-470c-a7d7-8fe41dd82da5", - "metadata": {}, - "source": [ - "We first need to set the dataset meta-information. For each dataset, 2 informations are required:\n", - "- the type of database in which the dataset is stored\n", - "- a path to the metadata of the dataset (stored as a yaml file).\n", - "\n", - "To later perform query on the dataset, metadata are required. In this secure server the metadata information is expected to be in the same format as [SmartnoiseSQL dictionary format](https://docs.smartnoise.org/sql/metadata.html#dictionary-format), where among other, there is information about all the available columns, their type, bound values (see Smartnoise page for more details). It is also expected to be in a `yaml` file.\n", - "\n", - "These information (dataset name, dataset type and metadata path) are stored in the `datasets` collection. Then for each dataset, its metadata is fetched from its `yaml` file and stored in a collection named `metadata`." - ] - }, - { - "cell_type": "markdown", - "id": "2678fb3f", - "metadata": {}, - "source": [ - "We then check that there is indeed no data in the dataset and metadata collections yet:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "9b7a7fae", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection datasets\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "d36e03ff", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection metadata\")" - ] - }, - { - "cell_type": "markdown", - "id": "d1d331ea", - "metadata": {}, - "source": [ - "We can add **one dataset** with its name, database type and path to medata file:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "53f5787d-e721-43d9-85ce-da842f173381", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added dataset IRIS with database PATH_DB and associated metadata.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_dataset -d IRIS -db PATH_DB -d_path https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv -m_db PATH_DB -mp ../data/collections/metadata/iris_metadata.yaml\")" - ] - }, - { - "cell_type": "markdown", - "id": "398f8990", - "metadata": {}, - "source": [ - "We can now see the dataset and metadata collection with the Iris dataset:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "3005eda2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'dataset_name': 'IRIS',\n", - " 'database_type': 'PATH_DB',\n", - " 'dataset_path': 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv',\n", - " 'metadata': {'database_type': 'PATH_DB',\n", - " 'metadata_path': '../data/collections/metadata/iris_metadata.yaml'}}]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection datasets\", to_dict=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "7527f3f4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'IRIS': {'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'columns': {'petal_length': {'type': 'float', 'lower': 0.5, 'upper': 10.0},\n", - " 'petal_width': {'type': 'float', 'lower': 0.05, 'upper': 5.0},\n", - " 'sepal_length': {'type': 'float', 'lower': 2.0, 'upper': 10.0},\n", - " 'sepal_width': {'type': 'float', 'lower': 1.0, 'upper': 6.0},\n", - " 'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['setosa', 'versicolor', 'virginica']}}}}]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection metadata\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "a0a2076e", - "metadata": {}, - "source": [ - "Or a path to a yaml file which contains all these informations to do **multiple datasets** in one command:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "0e42f9cb-3a02-45f5-baee-2e06edda739f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cleaning done. \n", - "\n", - "2024-06-05 09:59:46,703 - INFO - [mongodb_admin.py:710 - add_datasets_via_yaml()\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_datasets_via_yaml -yf ../data/collections/dataset_collection.yaml -c\")" - ] - }, - { - "cell_type": "markdown", - "id": "19b86f6a", - "metadata": {}, - "source": [ - "The argument *-c* or *--clean* allow you to clear the current dataset collection before adding your collection.\n", - "\n", - "By default, *add_datasets* will only add new dataset found from the collection provided." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "88bbdcf2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Metadata already exist. Use the command -om to overwrite with new values.\n", - "2024-06-05 09:59:48,726 - INFO - [mongodb_admin.py:755 - add_datasets_via_yaml()\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_datasets_via_yaml -yf ../data/collections/dataset_collection.yaml\")" - ] - }, - { - "cell_type": "markdown", - "id": "3a922c76", - "metadata": {}, - "source": [ - "Arguments :\n", - "\n", - "*-od* / *--overwrite_datasets* : Overwrite the values for **exisiting datasets** with the values provided in the yaml.\n", - "\n", - "*-om* / *--overwrite_metadata* : Overwrite the values for **exisiting metadata** with the values provided in the yaml." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "240928ab", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Existing datasets updated with new collection\n", - "2024-06-05 09:59:50,917 - INFO - [mongodb_admin.py:755 - add_datasets_via_yaml()\n" - ] - } - ], - "source": [ - "# Add new datasets/metadata, update existing datasets\n", - "run(\"python mongodb_admin_cli.py add_datasets_via_yaml -yf ../data/collections/dataset_collection.yaml -od\")" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "80de6b9c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Metadata updated for dataset : IRIS.\n", - "2024-06-05 09:59:52,741 - INFO - [mongodb_admin.py:749 - add_datasets_via_yaml()\n" - ] - } - ], - "source": [ - "# Add new datasets/metadata, update existing metadata\n", - "run(\"python mongodb_admin_cli.py add_datasets_via_yaml -yf ../data/collections/dataset_collection.yaml -om\")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "b1a9f413", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Existing datasets updated with new collection\n", - "2024-06-05 09:59:54,418 - INFO - [mongodb_admin.py:749 - add_datasets_via_yaml()\n" - ] - } - ], - "source": [ - "# Add new datasets/metadata, update existing datasets & metadata\n", - "run(\"python mongodb_admin_cli.py add_datasets_via_yaml -yf ../data/collections/dataset_collection.yaml -od -om\")" - ] - }, - { - "cell_type": "markdown", - "id": "87d686ae", - "metadata": {}, - "source": [ - "Let's see all the dataset collection:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "536b5b35", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'dataset_name': 'IRIS',\n", - " 'database_type': 'PATH_DB',\n", - " 'metadata': {'database_type': 'PATH_DB',\n", - " 'metadata_path': '../data/collections/metadata/iris_metadata.yaml'},\n", - " 'dataset_path': 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'},\n", - " {'dataset_name': 'PENGUIN',\n", - " 'database_type': 'PATH_DB',\n", - " 'metadata': {'database_type': 'PATH_DB',\n", - " 'metadata_path': '../data/collections/metadata/penguin_metadata.yaml'},\n", - " 'dataset_path': 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv'},\n", - " {'dataset_name': 'TITANIC',\n", - " 'database_type': 'S3_DB',\n", - " 'metadata': {'database_type': 'S3_DB',\n", - " 'bucket': 'example',\n", - " 'key': 'metadata/titanic_metadata.yaml',\n", - " 'endpoint_url': 'https://api-lomas-minio.lab.sspcloud.fr',\n", - " 'aws_access_key_id': 'admin',\n", - " 'aws_secret_access_key': 'admin123'},\n", - " 'bucket': 'example',\n", - " 'key': 'data/titanic.csv',\n", - " 'endpoint_url': 'https://api-lomas-minio.lab.sspcloud.fr',\n", - " 'aws_access_key_id': 'admin',\n", - " 'aws_secret_access_key': 'admin123'},\n", - " {'dataset_name': 'FSO_INCOME_SYNTHETIC',\n", - " 'database_type': 'PATH_DB',\n", - " 'metadata': {'database_type': 'PATH_DB',\n", - " 'metadata_path': '../data/collections/metadata/fso_income_synthetic_metadata.yaml'},\n", - " 'dataset_path': '../data/datasets/income_synthetic_data.csv'}]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection datasets\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "0746b382-8692-445f-9ca9-0d2407a25259", - "metadata": {}, - "source": [ - "Finally let's have a look at the stored metadata:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "c667dda0-5d0f-48c8-956c-8d8a756b7ff7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'IRIS': {'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'columns': {'petal_length': {'type': 'float', 'lower': 0.5, 'upper': 10.0},\n", - " 'petal_width': {'type': 'float', 'lower': 0.05, 'upper': 5.0},\n", - " 'sepal_length': {'type': 'float', 'lower': 2.0, 'upper': 10.0},\n", - " 'sepal_width': {'type': 'float', 'lower': 1.0, 'upper': 6.0},\n", - " 'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['setosa', 'versicolor', 'virginica']}}}},\n", - " {'PENGUIN': {'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'censor_dims': False,\n", - " 'columns': {'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Adelie', 'Chinstrap', 'Gentoo']},\n", - " 'island': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Torgersen', 'Biscoe', 'Dream']},\n", - " 'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},\n", - " 'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},\n", - " 'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},\n", - " 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},\n", - " 'sex': {'type': 'string',\n", - " 'cardinality': 2,\n", - " 'categories': ['MALE', 'FEMALE']}}}},\n", - " {'TITANIC': {'': {'Schema': {'Table': {'max_ids': 1,\n", - " 'PassengerId': {'type': 'int', 'lower': 1},\n", - " 'Pclass': {'type': 'int', 'lower': 1, 'upper': 3},\n", - " 'Name': {'type': 'string'},\n", - " 'Sex': {'type': 'string',\n", - " 'cardinality': 2,\n", - " 'categories': ['male', 'female']},\n", - " 'Age': {'type': 'float', 'lower': 0.1, 'upper': 100.0},\n", - " 'SibSp': {'type': 'int', 'lower': 0},\n", - " 'Parch': {'type': 'int', 'lower': 0},\n", - " 'Ticket': {'type': 'string'},\n", - " 'Fare': {'type': 'float', 'lower': 0.0},\n", - " 'Cabin': {'type': 'string'},\n", - " 'Embarked': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['C', 'Q', 'S']},\n", - " 'Survived': {'type': 'boolean'},\n", - " 'row_privacy': True}}},\n", - " 'engine': 'csv'}},\n", - " {'FSO_INCOME_SYNTHETIC': {'max_ids': 1,\n", - " 'columns': {'region': {'type': 'int'},\n", - " 'eco_branch': {'type': 'int'},\n", - " 'profession': {'type': 'int'},\n", - " 'education': {'type': 'int'},\n", - " 'age': {'type': 'int'},\n", - " 'sex': {'type': 'int'},\n", - " 'income': {'type': 'float', 'lower': 1000, 'upper': 100000}}}}]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection metadata\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "509d0b26", - "metadata": {}, - "source": [ - "If we are interested in a specific dataset, we can also show its collection:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "3db07639", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'dataset_name': 'IRIS',\n", - " 'database_type': 'PATH_DB',\n", - " 'metadata': {'database_type': 'PATH_DB',\n", - " 'metadata_path': '../data/collections/metadata/iris_metadata.yaml'},\n", - " 'dataset_path': 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_dataset --dataset IRIS\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "48550826", - "metadata": {}, - "source": [ - "And its associated metadata:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "efd9931f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'columns': {'petal_length': {'type': 'float', 'lower': 0.5, 'upper': 10.0},\n", - " 'petal_width': {'type': 'float', 'lower': 0.05, 'upper': 5.0},\n", - " 'sepal_length': {'type': 'float', 'lower': 2.0, 'upper': 10.0},\n", - " 'sepal_width': {'type': 'float', 'lower': 1.0, 'upper': 6.0},\n", - " 'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['setosa', 'versicolor', 'virginica']}}}" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_metadata --dataset IRIS\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "594b83a9", - "metadata": {}, - "source": [ - "We can also get list of all datasets in the 'datasets' collection:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "a6e21f16", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['IRIS', 'PENGUIN', 'TITANIC', 'FSO_INCOME_SYNTHETIC']" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_datasets\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "0e0b85d5", - "metadata": {}, - "source": [ - "## Users" - ] - }, - { - "cell_type": "markdown", - "id": "14ab18db-4b6d-4663-bde0-b5d9d3d3d2ee", - "metadata": {}, - "source": [ - "### Add user\n", - "Let's see which users are alreay loaded:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "7f450145", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection users\")" - ] - }, - { - "cell_type": "markdown", - "id": "2d2ae627", - "metadata": {}, - "source": [ - "And now let's add few users." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "0f6aa33c-6bd1-4d62-ba06-3533b064340d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added access to user Mrs. Daisy with dataset IRIS, budget epsilon 10.0 and delta 0.001.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_user_with_budget --user 'Mrs. Daisy' --dataset 'IRIS' --epsilon 10.0 --delta 0.001\")" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "7858f019-8783-4fed-acd8-ff0107d33465", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added access to user Mr. Coldheart with dataset PENGUIN, budget epsilon 10.0 and delta 0.001.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_user_with_budget --user 'Mr. Coldheart' --dataset 'PENGUIN' --epsilon 10.0 --delta 0.001\")" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "231e7d93-05ba-424a-8329-d96b0bfb4fb9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added access to user Lord McFreeze with dataset PENGUIN, budget epsilon 10.0 and delta 0.001.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_user_with_budget --user 'Lord McFreeze' --dataset 'PENGUIN' --epsilon 10.0 --delta 0.001\")" - ] - }, - { - "cell_type": "markdown", - "id": "51b0c274-880c-44f9-9182-6cb162a54c55", - "metadata": {}, - "source": [ - "Users must all have different names, otherwise you will have an error and nothing will be done:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "6276730e-39c2-47f1-962f-342c1acb7944", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Traceback (most recent call last):\n", - " File \"/code/mongodb_admin_cli.py\", line 461, in \n", - " function_map[args.func.__name__](args)\n", - " File \"/code/mongodb_admin_cli.py\", line 396, in \n", - " \"add_user_with_budget\": lambda args: add_user_with_budget(\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/code/mongodb_admin.py\", line 50, in wrapper_decorator\n", - " raise ValueError(\n", - "ValueError: User Lord McFreeze already exists in user collection\n", - "\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_user_with_budget --user 'Lord McFreeze' --dataset 'IRIS' --epsilon 10.0 --delta 0.001\")" - ] - }, - { - "cell_type": "markdown", - "id": "49f81f7e-e086-412f-8467-89b665e5559a", - "metadata": {}, - "source": [ - "If you want to add another dataset access to an existing user, just use the function `add_dataset_to_user` command." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "82a5f498-aed1-4779-9d73-b2b71dde4ce0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added access to dataset IRIS to user Lord McFreeze with budget epsilon 5.0 and delta 0.005.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_dataset_to_user --user 'Lord McFreeze' --dataset 'IRIS' --epsilon 5.0 --delta 0.005\")" - ] - }, - { - "cell_type": "markdown", - "id": "06170073-49ed-4329-8101-2debdd77eb98", - "metadata": {}, - "source": [ - "Alternatively, you can create a user without assigned dataset and then add dataset in another command." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "06839270-36cf-4de7-b93c-d143c4866bc8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added user Madame Frostina.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_user --user 'Madame Frostina'\")" - ] - }, - { - "cell_type": "markdown", - "id": "df41cea4-8219-41a1-9ce3-fad5409db299", - "metadata": {}, - "source": [ - "Let's see the default parameters after the user creation:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "1dbe0b34-ef3f-49b9-9153-dd5d09b00e4e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Madame Frostina', 'may_query': True, 'datasets_list': []}" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_user --user 'Madame Frostina'\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "f4c62a55-92cb-47af-90be-80c7d13db1e6", - "metadata": {}, - "source": [ - "Let's give her access to a dataset with a budget:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "e83378fe", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added access to dataset IRIS to user Madame Frostina with budget epsilon 5.0 and delta 0.005.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_dataset_to_user --user 'Madame Frostina' --dataset 'IRIS' --epsilon 5.0 --delta 0.005\")" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "919b2652", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added access to dataset PENGUIN to user Madame Frostina with budget epsilon 5.0 and delta 0.005.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_dataset_to_user --user 'Madame Frostina' --dataset 'PENGUIN' --epsilon 5.0 --delta 0.005\")" - ] - }, - { - "cell_type": "markdown", - "id": "2dab150b-4ad0-410a-b1eb-e448f8f0d79e", - "metadata": {}, - "source": [ - "Now let's see the user Madame Frostina details to check all is in order:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "8833f27e-a342-400a-b868-facf9a44dc6f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Madame Frostina',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0},\n", - " {'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]}" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_user --user 'Madame Frostina'\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "0bed2714", - "metadata": {}, - "source": [ - "And we can also modify existing the total budget of a user:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "e3b75cca", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added access to user Dr. Antartica with dataset PENGUIN, budget epsilon 10.0 and delta 0.001.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_user_with_budget --user 'Dr. Antartica' --dataset 'PENGUIN' --epsilon 10.0 --delta 0.001\")" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "87eecb9c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Set budget of Dr. Antartica for dataset PENGUIN of initial_epsilon to 20.0.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py set_budget_field --user 'Dr. Antartica' --dataset 'PENGUIN' --field initial_epsilon --value 20.0\")" - ] - }, - { - "cell_type": "markdown", - "id": "bbeb5dc2-e91e-4440-8df5-3e9506bf4ee1", - "metadata": {}, - "source": [ - "Let's see the current state of the database:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "3b3f61c6-65dc-4b1e-a32e-47cdd2729ab6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'user_name': 'Mrs. Daisy',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 10.0,\n", - " 'initial_delta': 0.001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Mr. Coldheart',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 10.0,\n", - " 'initial_delta': 0.001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Lord McFreeze',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 10.0,\n", - " 'initial_delta': 0.001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0},\n", - " {'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Madame Frostina',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0},\n", - " {'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Dr. Antartica',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 20.0,\n", - " 'initial_delta': 0.001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]}]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection users\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "4e0ae62f-ff80-4234-8102-4dccec0b284f", - "metadata": {}, - "source": [ - "Do not hesitate to re-run this command after every other command to ensure that everything runs as expected." - ] - }, - { - "cell_type": "markdown", - "id": "9ab1f5ba-68bd-4c96-bacd-b81dfa5d6302", - "metadata": {}, - "source": [ - "### Remove user\n", - "You have just heard that the penguin named Coldheart might have malicious intentions and decide to remove his access until an investigation has been carried out. To ensure that he is not allowed to do any more queries, run the following command:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "7f341b3d-5a88-4fd9-8c97-cc70145834f1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Set user Mr. Coldheart may query to False.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py set_may_query --user 'Mr. Coldheart' --value False\")" - ] - }, - { - "cell_type": "markdown", - "id": "4cc56586-f9a9-4e88-abed-51ba36a6e4f1", - "metadata": {}, - "source": [ - "Now, he won't be able to do any query (unless you re-run the query with --value True).\n", - "\n", - "A few days have passed and the investigation reveals that he was aiming to do unethical research, you can remove his dataset by doing:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "9153d9af-b4be-4496-9f80-d140870f60fe", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Remove access to dataset PENGUIN from user Mr. Coldheart.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py del_dataset_to_user --user 'Mr. Coldheart' --dataset 'PENGUIN'\")" - ] - }, - { - "cell_type": "markdown", - "id": "18d411ae-a211-4997-8984-81281c6275eb", - "metadata": {}, - "source": [ - "Or delete him completely from the codebase:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "a54e89eb-1ee1-48ad-9e00-bace8516a3ef", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Deleted user Mr. Coldheart.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py del_user --user 'Mr. Coldheart'\")" - ] - }, - { - "cell_type": "markdown", - "id": "06a7c17f-da34-472a-ad7f-3ae73a1beb7b", - "metadata": {}, - "source": [ - "Let's see the resulting users:" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "79fa414a-f097-4207-a628-19fa434a1ad3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'user_name': 'Mrs. Daisy',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 10.0,\n", - " 'initial_delta': 0.001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Lord McFreeze',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 10.0,\n", - " 'initial_delta': 0.001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0},\n", - " {'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Madame Frostina',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0},\n", - " {'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Dr. Antartica',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 20.0,\n", - " 'initial_delta': 0.001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]}]" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection users\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "90a46a59-70ed-4a26-88cd-6ca8f1d17318", - "metadata": {}, - "source": [ - "### Change budget\n", - "You also change your mind about the budget allowed to Lord McFreeze and give him a bit more on the penguin dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "0909e6c4-141e-4d57-acd2-bdc0a2d92cea", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Set budget of Lord McFreeze for dataset PENGUIN of initial_epsilon to 15.0.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py set_budget_field --user 'Lord McFreeze' --dataset 'PENGUIN' --field initial_epsilon --value 15.0\")" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "c0e110fe-4297-4559-9a95-bc0ebdfa402c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Set budget of Lord McFreeze for dataset PENGUIN of initial_delta to 0.005.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py set_budget_field --user 'Lord McFreeze' --dataset 'PENGUIN' --field initial_delta --value 0.005\")" - ] - }, - { - "cell_type": "markdown", - "id": "952d7ed4-ce1d-4a87-9319-6b57968ef20e", - "metadata": {}, - "source": [ - "Let's check all our changes by looking at the state of the database:" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "2ab46c5d-1553-4925-bd25-61c9c205dc95", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'user_name': 'Mrs. Daisy',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 10.0,\n", - " 'initial_delta': 0.001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Lord McFreeze',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 15.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0},\n", - " {'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Madame Frostina',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0},\n", - " {'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Dr. Antartica',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 20.0,\n", - " 'initial_delta': 0.001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]}]" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection users\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "ba7cfa86", - "metadata": {}, - "source": [ - "### Finally all can be loaded fom a file direcly" - ] - }, - { - "cell_type": "markdown", - "id": "43340fc9", - "metadata": {}, - "source": [ - "Let's delete the existing user collection first:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "597cb0b3", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Deleted collection users.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py drop_collection --collection users\")" - ] - }, - { - "cell_type": "markdown", - "id": "81661298", - "metadata": {}, - "source": [ - "Is is now empty:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "e1638145", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection users\")" - ] - }, - { - "cell_type": "markdown", - "id": "20b3cd2c", - "metadata": {}, - "source": [ - "We add the data based on a yaml file:" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "87b776f2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Added user data from yaml.\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_users_via_yaml -yf ../data/collections/user_collection.yaml\")" - ] - }, - { - "cell_type": "markdown", - "id": "76263ebd", - "metadata": {}, - "source": [ - "By default, *add_users_via_yaml* will only add new users to the database." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "7f597f68", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "No new users added, they already exist in the server\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_users_via_yaml -yf ../data/collections/user_collection.yaml\")" - ] - }, - { - "cell_type": "markdown", - "id": "3df278ef", - "metadata": {}, - "source": [ - "If you want to clean the current users collection and replace it, you can use the argument *--clean*. " - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "5a610b9f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cleaning done. \n", - "\n", - "2024-06-05 10:00:45,678 - INFO - [mongodb_admin.py:464 - add_users_via_yaml()\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_users_via_yaml -yf ../data/collections/user_collection.yaml --clean\")" - ] - }, - { - "cell_type": "markdown", - "id": "c933165a", - "metadata": {}, - "source": [ - "If you want to add new users and update the existing ones in your collection, you can use the argument *--overwrite*. This will make sure to add new users if they do not exist and replace values from existing users with the collection provided." - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "fd621ac3", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Existing users updated. \n", - "2024-06-05 10:00:47,300 - INFO - [mongodb_admin.py:466 - add_users_via_yaml()\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py add_users_via_yaml -yf ../data/collections/user_collection.yaml --overwrite\")" - ] - }, - { - "cell_type": "markdown", - "id": "63853e73", - "metadata": {}, - "source": [ - "And let's see the resulting collection:" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "77866f52", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'user_name': 'Alice',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 10.0,\n", - " 'initial_delta': 0.0001,\n", - " 'total_spent_epsilon': 1.0,\n", - " 'total_spent_delta': 1e-06},\n", - " {'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 5.0,\n", - " 'initial_delta': 0.0005,\n", - " 'total_spent_epsilon': 0.2,\n", - " 'total_spent_delta': 1e-07}]},\n", - " {'user_name': 'Dr. Antartica',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'PENGUIN',\n", - " 'initial_epsilon': 10.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Dr. FSO',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'FSO_INCOME_SYNTHETIC',\n", - " 'initial_epsilon': 45.0,\n", - " 'initial_delta': 0.005,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Bob',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'IRIS',\n", - " 'initial_epsilon': 10.0,\n", - " 'initial_delta': 0.0001,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]},\n", - " {'user_name': 'Jack',\n", - " 'may_query': True,\n", - " 'datasets_list': [{'dataset_name': 'TITANIC',\n", - " 'initial_epsilon': 45.0,\n", - " 'initial_delta': 0.2,\n", - " 'total_spent_epsilon': 0.0,\n", - " 'total_spent_delta': 0.0}]}]" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_collection --collection users\", to_dict=True)" - ] - }, - { - "cell_type": "markdown", - "id": "b9510647", - "metadata": {}, - "source": [ - "To get a list of all users in the 'users' collection:" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "7e70e971", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\"Alice\", \"Dr. Antartica\", \"Dr. FSO\", \"Bob\", \"Jack\"]\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_users\")" - ] - }, - { - "cell_type": "markdown", - "id": "e559bc1e", - "metadata": {}, - "source": [ - "We can also get a list of all datasets allocated to an user:" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "81b73bd6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[\"IRIS\", \"PENGUIN\"]\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_user_datasets --user Alice\")" - ] - }, - { - "cell_type": "markdown", - "id": "1a946132", - "metadata": {}, - "source": [ - "## Archives of queries" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "8025ef4d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n" - ] - } - ], - "source": [ - "run(\"python mongodb_admin_cli.py get_archives --user Alice\")" - ] - }, - { - "cell_type": "markdown", - "id": "a27be3d3-77a2-43d3-9a7f-87c8466293fe", - "metadata": {}, - "source": [ - "## Stop the server: do not do it now !\n", - "To tear down the service, first do `ctrl+C` in the terminal where you had done `docker compose up`. Wait for the command to finish executing and then run `docker compose down`. This will also delete all the containers but the volume will stay in place. " - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.0rc1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/html/v0.3.1/en/notebooks/s3_example_notebook.ipynb b/html/v0.3.1/en/notebooks/s3_example_notebook.ipynb deleted file mode 100644 index f491ee6e..00000000 --- a/html/v0.3.1/en/notebooks/s3_example_notebook.ipynb +++ /dev/null @@ -1,984 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3f18d338", - "metadata": {}, - "source": [ - "# S3 example" - ] - }, - { - "cell_type": "markdown", - "id": "01ae30d2", - "metadata": {}, - "source": [ - "## Step 1: Install the library\n", - "To interact with the secure server on which the data is stored, one first needs to install the library `lomas-client` on her local developping environment. \n", - "\n", - "It can be installed via the pip command:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "28fbdd79-8c15-49a9-bcf9-fcdeac09d2b5", - "metadata": {}, - "outputs": [], - "source": [ - "!pip install lomas-client" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "6fb569fc", - "metadata": {}, - "outputs": [], - "source": [ - "from lomas_client.client import Client\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "id": "9c63718b", - "metadata": {}, - "source": [ - "## Step 2: Initialise the client\n", - "\n", - "Once the library is installed, a Client object must be created. It is responsible for sending sending requests to the server and processing responses in the local environment. It enables a seamless interaction with the server. \n", - "\n", - "To create the client, one needs to give it a few parameters:\n", - "- a url: the root application endpoint to the remote secure server.\n", - "- user_name: her name as registered in the database (Jack)\n", - "- dataset_name: the name of the dataset that we want to query (TITANIC)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "941991f7", - "metadata": {}, - "outputs": [], - "source": [ - "APP_URL = \"http://lomas_server\"\n", - "USER_NAME = \"Jack\"\n", - "DATASET_NAME = \"TITANIC\"\n", - "client = Client(url=APP_URL, user_name = USER_NAME, dataset_name = DATASET_NAME)" - ] - }, - { - "cell_type": "markdown", - "id": "9b9a5f13", - "metadata": {}, - "source": [ - "## Step 3: Understand the functionnalities of the library" - ] - }, - { - "cell_type": "markdown", - "id": "c7cb5531", - "metadata": {}, - "source": [ - "### Getting dataset metadata" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "d15cbe39", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'columns': {'PassengerId': {'type': 'int', 'lower': 1},\n", - " 'Pclass': {'type': 'int', 'lower': 1, 'upper': 3},\n", - " 'Name': {'type': 'string'},\n", - " 'Sex': {'type': 'string',\n", - " 'cardinality': 2,\n", - " 'categories': ['male', 'female']},\n", - " 'Age': {'type': 'float', 'lower': 0.1, 'upper': 100.0},\n", - " 'SibSp': {'type': 'int', 'lower': 0},\n", - " 'Parch': {'type': 'int', 'lower': 0},\n", - " 'Ticket': {'type': 'string'},\n", - " 'Fare': {'type': 'float', 'lower': 0.0},\n", - " 'Cabin': {'type': 'string'},\n", - " 'Embarked': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['C', 'Q', 'S']},\n", - " 'Survived': {'type': 'boolean'}}}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "titanic_metadata = client.get_dataset_metadata()\n", - "titanic_metadata" - ] - }, - { - "cell_type": "markdown", - "id": "5a3c899d", - "metadata": {}, - "source": [ - "### Get a dummy dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "01f4365a", - "metadata": {}, - "outputs": [], - "source": [ - "NB_ROWS = 200\n", - "SEED = 0" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "3f553b29", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(200, 12)\n" - ] - }, - { - "data": { - "text/html": [ - "
                      \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
                      PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedSurvived
                      0273310male96.16085840784452X2421.785941hQFalse
                      198461Umale23.24699254056743O2503.9821292SFalse
                      232652Amale94.93695046119621a4833.935352cCFalse
                      348601qfemale94.14363382665630l399.928019pQFalse
                      492262Fmale79.94033866342562F6397.051061GCTrue
                      \n", - "
                      " - ], - "text/plain": [ - " PassengerId Pclass Name Sex Age SibSp Parch Ticket \n", - "0 2733 1 0 male 96.160858 4078 4452 X \\\n", - "1 9846 1 U male 23.246992 5405 6743 O \n", - "2 3265 2 A male 94.936950 4611 9621 a \n", - "3 4860 1 q female 94.143633 8266 5630 l \n", - "4 9226 2 F male 79.940338 6634 2562 F \n", - "\n", - " Fare Cabin Embarked Survived \n", - "0 2421.785941 h Q False \n", - "1 2503.982129 2 S False \n", - "2 4833.935352 c C False \n", - "3 399.928019 p Q False \n", - "4 6397.051061 G C True " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_dummy = client.get_dummy_dataset(\n", - " nb_rows = NB_ROWS, \n", - " seed = SEED\n", - ")\n", - "\n", - "print(df_dummy.shape)\n", - "df_dummy.head()" - ] - }, - { - "cell_type": "markdown", - "id": "98e6fda2-dde7-4f8b-a787-c9a1e3571ebe", - "metadata": {}, - "source": [ - "### Query on dummy dataset" - ] - }, - { - "cell_type": "markdown", - "id": "243c73e3-daec-45d6-a3c8-ae1d60439ec4", - "metadata": {}, - "source": [ - "#### Average and number of rows with smartnoise-sql library on remote dummy" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "3946425d", - "metadata": {}, - "outputs": [], - "source": [ - "# Average Age\n", - "QUERY = \"SELECT COUNT(*) AS nb_passengers, \\\n", - " AVG(Age) AS avg_age \\\n", - " FROM df\"" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "90cf2a6d", - "metadata": {}, - "outputs": [], - "source": [ - "# On the remote server dummy dataframe\n", - "dummy_res = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = 100.0, # make sure to select high values of epsilon and delta to have small differences\n", - " delta = 2.0, # make sure to select high values of epsilon and delta to have small differences\n", - " dummy = True, \n", - " nb_rows = NB_ROWS,\n", - " seed = SEED\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "a30f277e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average age in remote dummy: 49.01 years old.\n", - "Number of rows in remote dummy: 199.\n" - ] - } - ], - "source": [ - "print(f\"Average age in remote dummy: {np.round(dummy_res['query_response']['avg_age'][0], 2)} years old.\")\n", - "print(f\"Number of rows in remote dummy: {np.round(dummy_res['query_response']['nb_passengers'][0], 2)}.\")" - ] - }, - { - "cell_type": "markdown", - "id": "324454ed", - "metadata": {}, - "source": [ - "### Get current budget" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "61a467f3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'initial_epsilon': 45.0, 'initial_delta': 0.2}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_initial_budget()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "afd22f84", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'total_spent_epsilon': 0.0, 'total_spent_delta': 0.0}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_total_spent_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "05daf5a4", - "metadata": {}, - "source": [ - "It will also be useful to know what the remaining budget is. Therefore, we call the function `get_remaining_budget`. It just substarcts the total spent budget from the initial budget." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "6260cf54", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 45.0, 'remaining_delta': 0.2}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "20298e00", - "metadata": {}, - "source": [ - "As expected, for now the remaining budget is equal to the inital budget." - ] - }, - { - "cell_type": "markdown", - "id": "b746374c", - "metadata": {}, - "source": [ - "### Estimate cost of a query\n", - "Another safeguard is the functionnality to estimate the cost of a query. As in OpenDP and SmartnoiseSQL, the budget that will by used by a query might be slightly different than what is asked by the user. The `estimate cost` function returns the estimated real cost of any query.\n", - "\n", - "Again, of course, this will not impact the user's budget." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "fd5ed08a", - "metadata": {}, - "outputs": [], - "source": [ - "EPSILON = 0.5\n", - "DELTA = 1e-4" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "133020c6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 1.5, 'delta_cost': 0.00014999500000001387}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = EPSILON, \n", - " delta = DELTA\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "e5379edf", - "metadata": {}, - "source": [ - "### Query on real private dataset with smartnoise-sql." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "19e60263", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 45.0, 'remaining_delta': 0.2}" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "69767fac", - "metadata": {}, - "outputs": [], - "source": [ - "response = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = EPSILON, \n", - " delta = DELTA,\n", - " dummy = False # Optionnal\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a7a4e2d3-2922-4f95-bdc9-a35c160f157c", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "6dbbdf93", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of passengers in real data: 891.\n", - "Average age in real data: 30.27.\n" - ] - } - ], - "source": [ - "nb_passengers = response['query_response']['nb_passengers'].iloc[0]\n", - "print(f\"Number of passengers in real data: {nb_passengers}.\")\n", - "\n", - "avg_age = np.round(response['query_response']['avg_age'].iloc[0], 2)\n", - "print(f\"Average age in real data: {avg_age}.\")" - ] - }, - { - "cell_type": "markdown", - "id": "b2767e65", - "metadata": {}, - "source": [ - "After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "39701fe5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'remaining_epsilon': 43.5, 'remaining_delta': 0.199850005}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "e37c587f", - "metadata": {}, - "source": [ - "As can be seen in `get_total_spent_budget()`, it is the budget estimated with `estimate_smartnoise_sql_cost()` that was spent." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "487f835f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'total_spent_epsilon': 1.5, 'total_spent_delta': 0.00014999500000001387}" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "client.get_total_spent_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "04929993", - "metadata": {}, - "source": [ - "## Step 4: Titanic statistics with opendp" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "b9685226", - "metadata": {}, - "outputs": [], - "source": [ - "import opendp as dp\n", - "import opendp.transformations as trans\n", - "import opendp.measurements as meas" - ] - }, - { - "cell_type": "markdown", - "id": "bbbca191", - "metadata": {}, - "source": [ - "### Confidence intervals for age over the whole population" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "4331d86f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_ids': 1,\n", - " 'row_privacy': True,\n", - " 'columns': {'PassengerId': {'type': 'int', 'lower': 1},\n", - " 'Pclass': {'type': 'int', 'lower': 1, 'upper': 3},\n", - " 'Name': {'type': 'string'},\n", - " 'Sex': {'type': 'string',\n", - " 'cardinality': 2,\n", - " 'categories': ['male', 'female']},\n", - " 'Age': {'type': 'float', 'lower': 0.1, 'upper': 100.0},\n", - " 'SibSp': {'type': 'int', 'lower': 0},\n", - " 'Parch': {'type': 'int', 'lower': 0},\n", - " 'Ticket': {'type': 'string'},\n", - " 'Fare': {'type': 'float', 'lower': 0.0},\n", - " 'Cabin': {'type': 'string'},\n", - " 'Embarked': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['C', 'Q', 'S']},\n", - " 'Survived': {'type': 'boolean'}}}" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "titanic_metadata" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "ff8cb7b6", - "metadata": {}, - "outputs": [], - "source": [ - "columns = [\"PassengerId\", \"Pclass\", \"Name\", \"Sex\", \"Age\", \"SibSp\", \"Parch\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "70b2bdb1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.1, 100.0)" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "age_min = titanic_metadata['columns']['Age']['lower']\n", - "age_max = titanic_metadata['columns']['Age']['upper']\n", - "age_min, age_max" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "75e4933b", - "metadata": {}, - "outputs": [], - "source": [ - "age_transformation_pipeline = (\n", - " trans.make_split_dataframe(separator=\",\", col_names=columns) >>\n", - " trans.make_select_column(key=\"Age\", TOA=str) >>\n", - " trans.then_cast_default(TOA=float) >>\n", - " trans.then_clamp(bounds=(age_min, age_max)) >>\n", - " trans.then_resize(size=nb_passengers.tolist(), constant=avg_age) >>\n", - " trans.then_variance()\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "8041a647", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Server error status 400: {\"InvalidQueryException\":\"The pipeline provided is not a measurement. It cannot be processed in this server.\"}\n" - ] - } - ], - "source": [ - "# Expect to fail !!!\n", - "client.opendp_query(\n", - " opendp_pipeline = age_transformation_pipeline,\n", - " dummy=True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "d06c59dc", - "metadata": {}, - "source": [ - "This is because the server will only allow measurement pipeline with differentially private results. We add Laplacian noise to the pipeline and should be able to instantiate the pipeline." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "b8162859", - "metadata": {}, - "outputs": [], - "source": [ - "var_age_transformation_pipeline = (\n", - " age_transformation_pipeline >>\n", - " meas.then_laplace(scale=5.0)\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "fc7e0ecd", - "metadata": {}, - "source": [ - "Now that there is a measurement, one is able to apply the pipeline on the dummy dataset of the server." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "df61bce0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dummy result for variance: 133.38\n" - ] - } - ], - "source": [ - "dummy_var_res = client.opendp_query(\n", - " opendp_pipeline = var_age_transformation_pipeline, \n", - " dummy=True\n", - ")\n", - "print(f\"Dummy result for variance: {np.round(dummy_var_res['query_response'], 2)}\")" - ] - }, - { - "cell_type": "markdown", - "id": "ded11ac4", - "metadata": {}, - "source": [ - "With opendp, the function `estimate_opendp_cost` is particularly useful to estimate the used `epsilon` and `delta` based on the `scale` value." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "7ae7f735", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 2.240181818190626, 'delta_cost': 0}" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost_res = client.estimate_opendp_cost(\n", - " opendp_pipeline = var_age_transformation_pipeline\n", - ")\n", - "cost_res" - ] - }, - { - "cell_type": "markdown", - "id": "1c791d36", - "metadata": {}, - "source": [ - "One can now execute the query on the real dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "085555a5", - "metadata": {}, - "outputs": [], - "source": [ - "var_res = client.opendp_query(\n", - " opendp_pipeline = var_age_transformation_pipeline, \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "674332e7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of passengers: 891 (from previous smartnoise-sql query).\n", - "Average age: 30.27 (from previous smartnoise-sql query).\n", - "Variance of age: -4.3 (from opendp query).\n" - ] - } - ], - "source": [ - "print(f\"Number of passengers: {nb_passengers} (from previous smartnoise-sql query).\")\n", - "\n", - "print(f\"Average age: {np.round(avg_age, 2)} (from previous smartnoise-sql query).\")\n", - "\n", - "var_age = var_res['query_response']\n", - "print(f\"Variance of age: {np.round(var_age, 3)} (from opendp query).\")" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "f72b19d0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Standard error of age: nan.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_1062/2464255812.py:2: RuntimeWarning: invalid value encountered in sqrt\n", - " standard_error = np.sqrt(var_age/nb_passengers)\n" - ] - } - ], - "source": [ - "# Get standard error\n", - "standard_error = np.sqrt(var_age/nb_passengers)\n", - "print(f\"Standard error of age: {np.round(standard_error, 2)}.\")" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "62630a03", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The 95% confidence interval of the age of all passengers is [nan, nan].\n" - ] - } - ], - "source": [ - " # Compute the 95% confidence interval\n", - "ZSCORE = 1.96\n", - "lower_bound = np.round(avg_age - ZSCORE*standard_error, 2)\n", - "upper_bound = np.round(avg_age + ZSCORE*standard_error, 2)\n", - "print(f\"The 95% confidence interval of the age of all passengers is [{lower_bound}, {upper_bound}].\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3bcb4225-59c3-4e58-9be5-b9fae115b99d", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/html/v0.3.1/en/objects.inv b/html/v0.3.1/en/objects.inv deleted file mode 100644 index 17332fd7..00000000 Binary files a/html/v0.3.1/en/objects.inv and /dev/null differ diff --git a/html/v0.3.1/en/searchindex.js b/html/v0.3.1/en/searchindex.js deleted file mode 100644 index 6ff12bcb..00000000 --- a/html/v0.3.1/en/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({"alltitles": {"AIM: Adaptive Iterative Mechanism": [[26, "AIM:-Adaptive-Iterative-Mechanism"]], "API Documentation": [[3, null]], "Access the server to administrate the mongoDB": [[27, "Access-the-server-to-administrate-the-mongoDB"]], "Access via Kubernetes": [[33, "access-via-kubernetes"]], "Access via Onyxia Platform": [[33, "access-via-onyxia-platform"]], "Accessing the Helm Chart": [[35, "accessing-the-helm-chart"]], "Add user": [[27, "Add-user"]], "Adding a DP Library": [[0, "adding-a-dp-library"]], "Adding a Data Connector (for private dataset in various databases)": [[0, "adding-a-data-connector-for-private-dataset-in-various-databases"]], "Adding a Dataset Store": [[0, "adding-a-dataset-store"]], "Administration": [[30, null]], "Archives of queries": [[27, "Archives-of-queries"]], "Average and number of rows with smartnoise-sql library on remote dummy": [[28, "Average-and-number-of-rows-with-smartnoise-sql-library-on-remote-dummy"]], "CLI": [[32, null]], "Change budget": [[27, "Change-budget"]], "Classification: Gaussian Naive Bayes": [[24, "Classification:-Gaussian-Naive-Bayes"]], "Classification: Logistic Regression": [[24, "Classification:-Logistic-Regression"]], "Client": [[8, "client"], [9, "client"]], "Client API": [[4, null]], "Clustering: K-Means": [[24, "Clustering:-K-Means"]], "Collections": [[32, "collections"]], "Confidence intervals for age over the whole population": [[28, "Confidence-intervals-for-age-over-the-whole-population"]], "Confidence intervals for flipper length over the whole population": [[25, "Confidence-intervals-for-flipper-length-over-the-whole-population"]], "Create a docker volume": [[27, "Create-a-docker-volume"]], "DPCTGAN: Differentially Private Conditional Tabular GAN": [[26, "DPCTGAN:-Differentially-Private-Conditional-Tabular-GAN"]], "DPGAN: DIfferentially Private GAN": [[26, "DPGAN:-DIfferentially-Private-GAN"]], "Dashboard": [[33, null]], "Datasets": [[32, "datasets"]], "Datasets (add and drop)": [[27, "Datasets-(add-and-drop)"]], "Decision Tree Classifier": [[24, "Decision-Tree-Classifier"]], "Deploying Lomas on Onyxia": [[38, "deploying-lomas-on-onyxia"]], "Deploying the Service on Kubernetes": [[35, "deploying-the-service-on-kubernetes"]], "Deployment": [[34, null]], "Detailed description:": [[9, "detailed-description"]], "Dimensionality Reduction: PCA": [[24, "Dimensionality-Reduction:-PCA"]], "Errors": [[5, null]], "Estimate budget of Linear Regression with DiffPrivLib": [[23, "Estimate-budget-of-Linear-Regression-with-DiffPrivLib"]], "Estimate cost of a query": [[25, "Estimate-cost-of-a-query"], [28, "Estimate-cost-of-a-query"]], "Estimate cost of a query with smartnoise-sql": [[23, "Estimate-cost-of-a-query-with-smartnoise-sql"]], "Estimate cost of training patectgan synthesizer with Smartnoise-Synth": [[23, "Estimate-cost-of-training-patectgan-synthesizer-with-Smartnoise-Synth"]], "Estimate cost with opendp": [[23, "Estimate-cost-with-opendp"]], "Examples": [[6, null], [32, "examples"]], "Execute pipeline on real dataset with opendp": [[23, "Execute-pipeline-on-real-dataset-with-opendp"]], "External Loggers": [[0, "external-loggers"]], "ExternalLibraryException": [[5, "externallibraryexception"]], "Finally all can be loaded fom a file direcly": [[27, "Finally-all-can-be-loaded-fom-a-file-direcly"]], "First steps": [[8, "first-steps"]], "Get a dummy dataset": [[25, "Get-a-dummy-dataset"], [28, "Get-a-dummy-dataset"]], "Get current budget": [[25, "Get-current-budget"], [28, "Get-current-budget"]], "Getting dataset metadata": [[24, "Getting-dataset-metadata"], [25, "Getting-dataset-metadata"], [26, "Getting-dataset-metadata"], [28, "Getting-dataset-metadata"]], "Git Branches": [[0, "git-branches"]], "GitHub Workflows": [[0, "github-workflows"]], "History": [[9, "history"]], "Hypothesis testing": [[25, "Hypothesis-testing"]], "Indices and tables": [[9, "indices-and-tables"]], "Installation": [[8, "installation"]], "Installing the Helm Chart": [[35, "installing-the-helm-chart"]], "InternalServerException": [[5, "internalserverexception"]], "Introduction": [[38, "introduction"]], "InvalidQueryException": [[5, "invalidqueryexception"]], "Kubernetes": [[35, null]], "Linting and Other Checks": [[0, "linting-and-other-checks"]], "Local": [[36, null]], "Local Access via Docker": [[33, "local-access-via-docker"]], "Lomas Client Side: Using DiffPrivlib": [[24, null]], "Lomas Client Side: Using Smartnoise-Synth": [[26, null]], "Lomas-server: CLI administration": [[27, null]], "Lomas: Client demo": [[23, null]], "Lomas: The Data Oases Hidden Behind the Mist.": [[9, null]], "MST: Maximum Spanning Tree": [[26, "MST:-Maximum-Spanning-Tree"]], "MWEM: Multiplicative Weights Exponential Mechanism": [[26, "MWEM:-Multiplicative-Weights-Exponential-Mechanism"]], "Modifying the ingress Section": [[35, "modifying-the-ingress-section"]], "Modifying values.yaml": [[35, "modifying-values-yaml"]], "Module contents": [[11, "module-lomas_client"], [12, "module-lomas_server"], [13, "module-lomas_server.admin_database"], [14, "module-lomas_server.administration"], [15, "module-lomas_server.data_connector"], [16, "module-lomas_server.dataset_store"], [17, "module-lomas_server.dp_queries"], [18, "module-lomas_server.dp_queries.dp_libraries"], [19, "module-lomas_server.private_dataset"], [20, "module-lomas_server.routes"], [21, "module-lomas_server.tests"], [22, "module-lomas_server.utils"]], "MongoDB Administration": [[32, "mongodb-administration"]], "MongoDB Connection": [[32, "mongodb-connection"]], "Notes for Client Contributors": [[1, null]], "Notes for Contributors": [[0, null]], "Notes for Server Contributors": [[2, null]], "Onyxia": [[38, null]], "Overview": [[32, "overview"]], "PATECTGAN: Conditional tabular GAN using Private Aggregation of Teacher Ensembles": [[26, "PATECTGAN:-Conditional-tabular-GAN-using-Private-Aggregation-of-Teacher-Ensembles"]], "PATEGAN: Private Aggregation of Teacher Ensembles": [[26, "PATEGAN:-Private-Aggregation-of-Teacher-Ensembles"]], "Poster": [[29, null]], "Postprocessing: no additional provacy risk with DP": [[23, "Postprocessing:-no-additional-provacy-risk-with-DP"]], "Prepare linear regression pipeline on dummy with DiffPrivLib": [[23, "Prepare-linear-regression-pipeline-on-dummy-with-DiffPrivLib"]], "Prepare opendp pipeline and verify on dummy": [[23, "Prepare-opendp-pipeline-and-verify-on-dummy"]], "Prepare the database": [[27, "Prepare-the-database"]], "Prerequisites": [[35, "prerequisites"], [36, "prerequisites"]], "Pushing a new version to Pypi": [[1, "pushing-a-new-version-to-pypi"]], "Query average bill length on dummy dataset with smartnoise-sql": [[23, "Query-average-bill-length-on-dummy-dataset-with-smartnoise-sql"]], "Query average bill length on private dataset with smartnoise-sql": [[23, "Query-average-bill-length-on-private-dataset-with-smartnoise-sql"]], "Query dummy dataset": [[25, "Query-dummy-dataset"]], "Query on dummy dataset": [[28, "Query-on-dummy-dataset"]], "Query on real private dataset with smartnoise-sql.": [[28, "Query-on-real-private-dataset-with-smartnoise-sql."]], "Query real dataset": [[25, "Query-real-dataset"]], "Quickstart": [[8, null]], "Random Forest": [[24, "Random-Forest"]], "Regression: Linear Regression": [[24, "Regression:-Linear-Regression"]], "Release Workflow": [[0, "release-workflow"]], "Remove user": [[27, "Remove-user"]], "S3 example": [[28, null]], "Secure Data Disclosure: Client side": [[25, null]], "Server": [[9, "server"]], "Server API": [[31, null]], "She can now estimated the cost of this pipeline": [[24, "She-can-now-estimated-the-cost-of-this-pipeline"]], "She starts to write the associated DiffPrivLib pipeline and tries it on the dummy.": [[24, "She-starts-to-write-the-associated-DiffPrivLib-pipeline-and-tries-it-on-the-dummy."]], "Start server": [[27, "Start-server"]], "Start the server": [[27, "Start-the-server"]], "Step 1: Install the library": [[23, "Step-1:-Install-the-library"], [24, "Step-1:-Install-the-library"], [25, "Step-1:-Install-the-library"], [26, "Step-1:-Install-the-library"], [28, "Step-1:-Install-the-library"]], "Step 2: Initialise the client": [[23, "Step-2:-Initialise-the-client"], [24, "Step-2:-Initialise-the-client"], [25, "Step-2:-Initialise-the-client"], [26, "Step-2:-Initialise-the-client"], [28, "Step-2:-Initialise-the-client"]], "Step 3: Create a Synthetic Dataset keeping all default parameters": [[26, "Step-3:-Create-a-Synthetic-Dataset-keeping-all-default-parameters"]], "Step 3: Metadata and dummy dataset": [[24, "Step-3:-Metadata-and-dummy-dataset"], [26, "Step-3:-Metadata-and-dummy-dataset"]], "Step 3: Understand the functionnalities of the library": [[23, "Step-3:-Understand-the-functionnalities-of-the-library"], [25, "Step-3:-Understand-the-functionnalities-of-the-library"], [28, "Step-3:-Understand-the-functionnalities-of-the-library"]], "Step 4: Penguin statistics": [[25, "Step-4:-Penguin-statistics"]], "Step 4: See archives of queries": [[23, "Step-4:-See-archives-of-queries"]], "Step 4: Titanic statistics with opendp": [[28, "Step-4:-Titanic-statistics-with-opendp"]], "Step 4: Train Logistic Regression model with DiffPrivLib": [[24, "Step-4:-Train-Logistic-Regression-model-with-DiffPrivLib"]], "Step 4: Use DP libraries to analyse the dataset": [[23, "Step-4:-Use-DP-libraries-to-analyse-the-dataset"]], "Step 5: Train other models with DiffPrivLib": [[24, "Step-5:-Train-other-models-with-DiffPrivLib"]], "Step 6: See archives of queries": [[24, "Step-6:-See-archives-of-queries"], [26, "Step-6:-See-archives-of-queries"]], "Steps to Deploy Locally": [[36, "steps-to-deploy-locally"]], "Stop the server: do not do it now !": [[27, "Stop-the-server:-do-not-do-it-now-!"]], "Submodules": [[11, "submodules"], [12, "submodules"], [13, "submodules"], [15, "submodules"], [16, "submodules"], [17, "submodules"], [18, "submodules"], [19, "submodules"], [20, "submodules"], [21, "submodules"], [22, "submodules"]], "Subpackages": [[12, "subpackages"], [17, "subpackages"]], "Technical Overview:": [[9, "technical-overview"]], "Tests": [[2, "tests"]], "Train linear regression on sensitive data with DiffPrivLib": [[23, "Train-linear-regression-on-sensitive-data-with-DiffPrivLib"]], "Train patectgan synthesizer on dummy data with Smartnoise-Synth": [[23, "Train-patectgan-synthesizer-on-dummy-data-with-Smartnoise-Synth"]], "Train patectgan synthesizer on private data with Smartnoise-Synth": [[23, "Train-patectgan-synthesizer-on-private-data-with-Smartnoise-Synth"]], "UnauthorizedAccessException": [[5, "unauthorizedaccessexception"]], "Users": [[27, "Users"], [32, "users"]], "Visualise all options": [[27, "Visualise-all-options"]], "Welcome to Lomas documentation": [[10, null]], "a. Compute average bill length with Smartnoise-SQL": [[23, "a.-Compute-average-bill-length-with-Smartnoise-SQL"]], "a. Getting dataset metadata": [[23, "a.-Getting-dataset-metadata"]], "b. Compute confidence interval with opendp": [[23, "b.-Compute-confidence-interval-with-opendp"]], "b. Get a dummy dataset": [[23, "b.-Get-a-dummy-dataset"]], "c. Check privacy loss budget \u03b5, \u03b4 (initial, current, remaining)": [[23, "c.-Check-privacy-loss-budget-\u03b5,-\u03b4-(initial,-current,-remaining)"]], "c. Train a DP Machine Learning model with DiffPrivLib": [[23, "c.-Train-a-DP-Machine-Learning-model-with-DiffPrivLib"]], "d. Get a Synthetic Dataset with Smartnoise-Synth": [[23, "d.-Get-a-Synthetic-Dataset-with-Smartnoise-Synth"]], "lomas_client": [[7, null]], "lomas_client package": [[11, null]], "lomas_client.client module": [[11, "module-lomas_client.client"]], "lomas_client.utils module": [[11, "module-lomas_client.utils"]], "lomas_server": [[37, null]], "lomas_server package": [[12, null]], "lomas_server.admin_database package": [[13, null]], "lomas_server.admin_database.admin_database module": [[13, "lomas-server-admin-database-admin-database-module"]], "lomas_server.admin_database.factory module": [[13, "lomas-server-admin-database-factory-module"]], "lomas_server.admin_database.mongodb_database module": [[13, "lomas-server-admin-database-mongodb-database-module"]], "lomas_server.admin_database.utils module": [[13, "lomas-server-admin-database-utils-module"]], "lomas_server.admin_database.yaml_database module": [[13, "lomas-server-admin-database-yaml-database-module"]], "lomas_server.administration package": [[14, null]], "lomas_server.app module": [[12, "lomas-server-app-module"]], "lomas_server.constants module": [[12, "module-lomas_server.constants"]], "lomas_server.data_connector package": [[15, null]], "lomas_server.data_connector.data_connector module": [[15, "lomas-server-data-connector-data-connector-module"]], "lomas_server.data_connector.factory module": [[15, "lomas-server-data-connector-factory-module"]], "lomas_server.data_connector.in_memory_connector module": [[15, "lomas-server-data-connector-in-memory-connector-module"]], "lomas_server.data_connector.path_connector module": [[15, "lomas-server-data-connector-path-connector-module"]], "lomas_server.data_connector.s3_connector module": [[15, "lomas-server-data-connector-s3-connector-module"]], "lomas_server.dataset_store package": [[16, null]], "lomas_server.dataset_store.basic_dataset_store module": [[16, "lomas-server-dataset-store-basic-dataset-store-module"]], "lomas_server.dataset_store.data_connector_observer module": [[16, "module-lomas_server.dataset_store.data_connector_observer"]], "lomas_server.dataset_store.dataset_store module": [[16, "lomas-server-dataset-store-dataset-store-module"]], "lomas_server.dataset_store.factory module": [[16, "lomas-server-dataset-store-factory-module"]], "lomas_server.dataset_store.lru_dataset_store module": [[16, "lomas-server-dataset-store-lru-dataset-store-module"]], "lomas_server.dp_queries package": [[17, null]], "lomas_server.dp_queries.dp_libraries package": [[18, null]], "lomas_server.dp_queries.dp_libraries.diffprivlib module": [[18, "lomas-server-dp-queries-dp-libraries-diffprivlib-module"]], "lomas_server.dp_queries.dp_libraries.factory module": [[18, "lomas-server-dp-queries-dp-libraries-factory-module"]], "lomas_server.dp_queries.dp_libraries.opendp module": [[18, "lomas-server-dp-queries-dp-libraries-opendp-module"]], "lomas_server.dp_queries.dp_libraries.smartnoise_sql module": [[18, "lomas-server-dp-queries-dp-libraries-smartnoise-sql-module"]], "lomas_server.dp_queries.dp_libraries.smartnoise_synth module": [[18, "lomas-server-dp-queries-dp-libraries-smartnoise-synth-module"]], "lomas_server.dp_queries.dp_libraries.utils module": [[18, "lomas-server-dp-queries-dp-libraries-utils-module"]], "lomas_server.dp_queries.dp_logic module": [[17, "lomas-server-dp-queries-dp-logic-module"]], "lomas_server.dp_queries.dp_querier module": [[17, "lomas-server-dp-queries-dp-querier-module"]], "lomas_server.dp_queries.dummy_dataset module": [[17, "lomas-server-dp-queries-dummy-dataset-module"]], "lomas_server.mongodb_admin module": [[12, "lomas-server-mongodb-admin-module"]], "lomas_server.mongodb_admin_cli module": [[12, "lomas-server-mongodb-admin-cli-module"]], "lomas_server.private_dataset package": [[19, null]], "lomas_server.private_dataset.in_memory_dataset module": [[19, "lomas-server-private-dataset-in-memory-dataset-module"]], "lomas_server.private_dataset.path_dataset module": [[19, "lomas-server-private-dataset-path-dataset-module"]], "lomas_server.private_dataset.private_dataset module": [[19, "lomas-server-private-dataset-private-dataset-module"]], "lomas_server.private_dataset.s3_dataset module": [[19, "lomas-server-private-dataset-s3-dataset-module"]], "lomas_server.private_dataset.utils module": [[19, "lomas-server-private-dataset-utils-module"]], "lomas_server.routes package": [[20, null]], "lomas_server.routes.routes_admin module": [[20, "lomas-server-routes-routes-admin-module"]], "lomas_server.routes.routes_dp module": [[20, "lomas-server-routes-routes-dp-module"]], "lomas_server.routes.utils module": [[20, "lomas-server-routes-utils-module"]], "lomas_server.tests package": [[21, null]], "lomas_server.tests.constants module": [[21, "module-lomas_server.tests.constants"]], "lomas_server.tests.test_api module": [[21, "lomas-server-tests-test-api-module"]], "lomas_server.tests.test_api_diffprivlib module": [[21, "lomas-server-tests-test-api-diffprivlib-module"]], "lomas_server.tests.test_api_smartnoise_synth module": [[21, "lomas-server-tests-test-api-smartnoise-synth-module"]], "lomas_server.tests.test_dummy_generation module": [[21, "lomas-server-tests-test-dummy-generation-module"]], "lomas_server.tests.test_mongodb_admin module": [[21, "lomas-server-tests-test-mongodb-admin-module"]], "lomas_server.tests.test_mongodb_admin_cli module": [[21, "lomas-server-tests-test-mongodb-admin-cli-module"]], "lomas_server.utils package": [[22, null]], "lomas_server.utils.anti_timing_att module": [[22, "lomas-server-utils-anti-timing-att-module"]], "lomas_server.utils.collection_models module": [[22, "module-lomas_server.utils.collection_models"]], "lomas_server.utils.config module": [[22, "lomas-server-utils-config-module"]], "lomas_server.utils.error_handler module": [[22, "lomas-server-utils-error-handler-module"]], "lomas_server.utils.logger module": [[22, "module-lomas_server.utils.logger"]], "lomas_server.utils.query_examples module": [[22, "module-lomas_server.utils.query_examples"]], "lomas_server.utils.query_models module": [[22, "module-lomas_server.utils.query_models"]], "lomas_server.uvicorn_serve module": [[12, "lomas-server-uvicorn-serve-module"]]}, "docnames": ["CONTRIBUTING", "CONTRIBUTING_CLIENT", "CONTRIBUTING_SERVER", "api", "client_api", "client_errors", "client_examples", "client_modules", "client_quickstart", "index", "index_under_construction", "lomas_client", "lomas_server", "lomas_server.admin_database", "lomas_server.administration", "lomas_server.data_connector", "lomas_server.dataset_store", "lomas_server.dp_queries", "lomas_server.dp_queries.dp_libraries", "lomas_server.private_dataset", "lomas_server.routes", "lomas_server.tests", "lomas_server.utils", "notebooks/Demo_Client_Notebook", "notebooks/Demo_Client_Notebook_DiffPrivLib", "notebooks/Demo_Client_Notebook_Smartnoise-SQL", "notebooks/Demo_Client_Notebook_Smartnoise-Synth", "notebooks/local_admin_notebook", "notebooks/s3_example_notebook", "poster", "server_administration", "server_api", "server_cli", "server_dashboard", "server_deployment", "server_kubernetes", "server_local", "server_modules", "server_onyxia"], "envversion": {"nbsphinx": 4, "sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1}, "filenames": ["CONTRIBUTING.md", "CONTRIBUTING_CLIENT.md", "CONTRIBUTING_SERVER.md", "api.rst", "client_api.rst", "client_errors.rst", "client_examples.rst", "client_modules.rst", "client_quickstart.rst", "index.rst", "index_under_construction.rst", "lomas_client.rst", "lomas_server.rst", "lomas_server.admin_database.rst", "lomas_server.administration.rst", "lomas_server.data_connector.rst", "lomas_server.dataset_store.rst", "lomas_server.dp_queries.rst", "lomas_server.dp_queries.dp_libraries.rst", "lomas_server.private_dataset.rst", "lomas_server.routes.rst", "lomas_server.tests.rst", "lomas_server.utils.rst", "notebooks/Demo_Client_Notebook.ipynb", "notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb", "notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb", "notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb", "notebooks/local_admin_notebook.ipynb", "notebooks/s3_example_notebook.ipynb", "poster.rst", "server_administration.rst", "server_api.rst", "server_cli.rst", "server_dashboard.rst", "server_deployment.rst", "server_kubernetes.rst", "server_local.rst", "server_modules.rst", "server_onyxia.rst"], "indexentries": {"access_key_id (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.access_key_id", false]], "admindbtype (class in lomas_server.constants)": [[12, "lomas_server.constants.AdminDBType", false]], "aim (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.AIM", false]], "aim (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.AIM", false]], "basic (lomas_server.constants.datasetstoretype attribute)": [[12, "lomas_server.constants.DatasetStoreType.BASIC", false]], "bucket (lomas_server.utils.collection_models.datasetofs3db attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfS3DB.bucket", false]], "bucket (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.bucket", false]], "categorical (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.CATEGORICAL", false]], "censor_dims (lomas_server.utils.collection_models.metadata attribute)": [[22, "lomas_server.utils.collection_models.Metadata.censor_dims", false]], "change_one_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.CHANGE_ONE_DISTANCE", false]], "client (class in lomas_client.client)": [[11, "lomas_client.client.Client", false]], "columns (lomas_server.utils.collection_models.metadata attribute)": [[22, "lomas_server.utils.collection_models.Metadata.columns", false]], "condition (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.condition", false]], "configkeys (class in lomas_server.constants)": [[12, "lomas_server.constants.ConfigKeys", false]], "constraints (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.constraints", false]], "continuous (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.CONTINUOUS", false]], "credentials_name (lomas_server.utils.collection_models.datasetofs3db attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfS3DB.credentials_name", false]], "credentials_name (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.credentials_name", false]], "cube (lomas_server.constants.ssynthtabletransstyle attribute)": [[12, "lomas_server.constants.SSynthTableTransStyle.CUBE", false]], "database_type (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfPathDB.database_type", false]], "database_type (lomas_server.utils.collection_models.datasetofs3db attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfS3DB.database_type", false]], "database_type (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfPathDB.database_type", false]], "database_type (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.database_type", false]], "dataconnectorobserver (class in lomas_server.dataset_store.data_connector_observer)": [[16, "lomas_server.dataset_store.data_connector_observer.DataConnectorObserver", false]], "dataset (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.Dataset", false]], "dataset_name (lomas_server.utils.collection_models.dataset attribute)": [[22, "lomas_server.utils.collection_models.Dataset.dataset_name", false]], "dataset_name (lomas_server.utils.collection_models.datasetofuser attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfUser.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[22, "lomas_server.utils.query_models.DummyOpenDPModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.getdbdata attribute)": [[22, "lomas_server.utils.query_models.GetDbData.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.getdummydataset attribute)": [[22, "lomas_server.utils.query_models.GetDummyDataset.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.opendpmodel attribute)": [[22, "lomas_server.utils.query_models.OpenDPModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel.dataset_name", false]], "dataset_name (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.dataset_name", false]], "dataset_path (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfPathDB.dataset_path", false]], "dataset_store (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DATASET_STORE", false]], "dataset_store_type (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DATASET_STORE_TYPE", false]], "datasetofpathdb (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.DatasetOfPathDB", false]], "datasetofs3db (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.DatasetOfS3DB", false]], "datasetofuser (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.DatasetOfUser", false]], "datasets (lomas_server.utils.collection_models.datasetscollection attribute)": [[22, "lomas_server.utils.collection_models.DatasetsCollection.datasets", false]], "datasets_list (lomas_server.utils.collection_models.user attribute)": [[22, "lomas_server.utils.collection_models.User.datasets_list", false]], "datasetscollection (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.DatasetsCollection", false]], "datasetstoretype (class in lomas_server.constants)": [[12, "lomas_server.constants.DatasetStoreType", false]], "datetime (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.DATETIME", false]], "db (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DB", false]], "db_type (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DB_TYPE", false]], "db_type_mongodb (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DB_TYPE_MONGODB", false]], "delta (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.delta", false]], "delta (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.delta", false]], "delta (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel.delta", false]], "delta (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.delta", false]], "develop_mode (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DEVELOP_MODE", false]], "diffprivlib (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.DIFFPRIVLIB", false]], "diffprivlib (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.DIFFPRIVLIB", false]], "diffprivlib_json (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.diffprivlib_json", false]], "diffprivlib_json (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.diffprivlib_json", false]], "diffprivlib_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.diffprivlib_query", false]], "diffprivlibmodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel", false]], "dp_ctgan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.DP_CTGAN", false]], "dp_ctgan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.DP_CTGAN", false]], "dp_gan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.DP_GAN", false]], "dp_gan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.DP_GAN", false]], "dp_library (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.DP_LIBRARY", false]], "dplibraries (class in lomas_client.client)": [[11, "lomas_client.client.DPLibraries", false]], "dplibraries (class in lomas_server.constants)": [[12, "lomas_server.constants.DPLibraries", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[22, "lomas_server.utils.query_models.DummyOpenDPModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.dummy_nb_rows", false]], "dummy_nb_rows (lomas_server.utils.query_models.getdummydataset attribute)": [[22, "lomas_server.utils.query_models.GetDummyDataset.dummy_nb_rows", false]], "dummy_seed (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[22, "lomas_server.utils.query_models.DummyOpenDPModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.dummy_seed", false]], "dummy_seed (lomas_server.utils.query_models.getdummydataset attribute)": [[22, "lomas_server.utils.query_models.GetDummyDataset.dummy_seed", false]], "dummydiffprivlibmodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel", false]], "dummyopendpmodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.DummyOpenDPModel", false]], "dummysmartnoisesqlmodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel", false]], "dummysmartnoisesynthquerymodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel", false]], "endpoint_url (lomas_server.utils.collection_models.datasetofs3db attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfS3DB.endpoint_url", false]], "endpoint_url (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.endpoint_url", false]], "epsilon (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.epsilon", false]], "epsilon (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.epsilon", false]], "epsilon (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel.epsilon", false]], "epsilon (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.epsilon", false]], "error_message() (in module lomas_client.client)": [[11, "lomas_client.client.error_message", false]], "estimate_diffprivlib_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_diffprivlib_cost", false]], "estimate_opendp_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_opendp_cost", false]], "estimate_smartnoise_sql_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_smartnoise_sql_cost", false]], "estimate_smartnoise_synth_cost() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.estimate_smartnoise_synth_cost", false]], "feature_columns (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.feature_columns", false]], "feature_columns (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.feature_columns", false]], "fixed_delta (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[22, "lomas_server.utils.query_models.DummyOpenDPModel.fixed_delta", false]], "fixed_delta (lomas_server.utils.query_models.opendpmodel attribute)": [[22, "lomas_server.utils.query_models.OpenDPModel.fixed_delta", false]], "fixed_smoothed_max_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.FIXED_SMOOTHED_MAX_DIVERGENCE", false]], "gan (lomas_server.constants.ssynthtabletransstyle attribute)": [[12, "lomas_server.constants.SSynthTableTransStyle.GAN", false]], "get_dataset_metadata() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_dataset_metadata", false]], "get_dummy_dataset() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_dummy_dataset", false]], "get_initial_budget() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_initial_budget", false]], "get_previous_queries() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_previous_queries", false]], "get_remaining_budget() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_remaining_budget", false]], "get_total_spent_budget() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.get_total_spent_budget", false]], "getdbdata (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.GetDbData", false]], "getdummydataset (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.GetDummyDataset", false]], "hamming_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.HAMMING_DISTANCE", false]], "imputer_strategy (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.imputer_strategy", false]], "imputer_strategy (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.imputer_strategy", false]], "initial_delta (lomas_server.utils.collection_models.datasetofuser attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfUser.initial_delta", false]], "initial_epsilon (lomas_server.utils.collection_models.datasetofuser attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfUser.initial_epsilon", false]], "insert_delete_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.INSERT_DELETE_DISTANCE", false]], "int_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.INT_DISTANCE", false]], "jitter (lomas_server.constants.timeattackmethod attribute)": [[12, "lomas_server.constants.TimeAttackMethod.JITTER", false]], "key (lomas_server.utils.collection_models.datasetofs3db attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfS3DB.key", false]], "key (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.key", false]], "lomas_client": [[11, "module-lomas_client", false]], "lomas_client.client": [[11, "module-lomas_client.client", false]], "lomas_client.utils": [[11, "module-lomas_client.utils", false]], "lomas_server": [[12, "module-lomas_server", false]], "lomas_server.admin_database": [[13, "module-lomas_server.admin_database", false]], "lomas_server.administration": [[14, "module-lomas_server.administration", false]], "lomas_server.constants": [[12, "module-lomas_server.constants", false]], "lomas_server.data_connector": [[15, "module-lomas_server.data_connector", false]], "lomas_server.dataset_store": [[16, "module-lomas_server.dataset_store", false]], "lomas_server.dataset_store.data_connector_observer": [[16, "module-lomas_server.dataset_store.data_connector_observer", false]], "lomas_server.dp_queries": [[17, "module-lomas_server.dp_queries", false]], "lomas_server.dp_queries.dp_libraries": [[18, "module-lomas_server.dp_queries.dp_libraries", false]], "lomas_server.private_dataset": [[19, "module-lomas_server.private_dataset", false]], "lomas_server.routes": [[20, "module-lomas_server.routes", false]], "lomas_server.tests": [[21, "module-lomas_server.tests", false]], "lomas_server.tests.constants": [[21, "module-lomas_server.tests.constants", false]], "lomas_server.utils": [[22, "module-lomas_server.utils", false]], "lomas_server.utils.collection_models": [[22, "module-lomas_server.utils.collection_models", false]], "lomas_server.utils.logger": [[22, "module-lomas_server.utils.logger", false]], "lomas_server.utils.query_examples": [[22, "module-lomas_server.utils.query_examples", false]], "lomas_server.utils.query_models": [[22, "module-lomas_server.utils.query_models", false]], "lru (lomas_server.constants.datasetstoretype attribute)": [[12, "lomas_server.constants.DatasetStoreType.LRU", false]], "lru_dataset_store_max_size (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.LRU_DATASET_STORE_MAX_SIZE", false]], "make_dummy() (in module lomas_server.utils.query_examples)": [[22, "lomas_server.utils.query_examples.make_dummy", false]], "max_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.MAX_DIVERGENCE", false]], "max_ids (lomas_server.utils.collection_models.metadata attribute)": [[22, "lomas_server.utils.collection_models.Metadata.max_ids", false]], "may_query (lomas_server.utils.collection_models.user attribute)": [[22, "lomas_server.utils.collection_models.User.may_query", false]], "mechanisms (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.mechanisms", false]], "mechanisms (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.mechanisms", false]], "mechanisms (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel.mechanisms", false]], "metadata (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.Metadata", false]], "metadata (lomas_server.utils.collection_models.dataset attribute)": [[22, "lomas_server.utils.collection_models.Dataset.metadata", false]], "metadata_path (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfPathDB.metadata_path", false]], "metadataofdataset (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.MetadataOfDataset", false]], "metadataofpathdb (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.MetadataOfPathDB", false]], "metadataofs3db (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB", false]], "model_computed_fields (lomas_server.utils.collection_models.dataset attribute)": [[22, "lomas_server.utils.collection_models.Dataset.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfPathDB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetofs3db attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfS3DB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetofuser attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfUser.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.datasetscollection attribute)": [[22, "lomas_server.utils.collection_models.DatasetsCollection.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadata attribute)": [[22, "lomas_server.utils.collection_models.Metadata.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadataofdataset attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfDataset.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfPathDB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.user attribute)": [[22, "lomas_server.utils.collection_models.User.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.collection_models.usercollection attribute)": [[22, "lomas_server.utils.collection_models.UserCollection.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[22, "lomas_server.utils.query_models.DummyOpenDPModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.getdbdata attribute)": [[22, "lomas_server.utils.query_models.GetDbData.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.getdummydataset attribute)": [[22, "lomas_server.utils.query_models.GetDummyDataset.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.opendpmodel attribute)": [[22, "lomas_server.utils.query_models.OpenDPModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.model_computed_fields", false]], "model_computed_fields (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.model_computed_fields", false]], "model_config (lomas_server.utils.collection_models.dataset attribute)": [[22, "lomas_server.utils.collection_models.Dataset.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfPathDB.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetofs3db attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfS3DB.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetofuser attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfUser.model_config", false]], "model_config (lomas_server.utils.collection_models.datasetscollection attribute)": [[22, "lomas_server.utils.collection_models.DatasetsCollection.model_config", false]], "model_config (lomas_server.utils.collection_models.metadata attribute)": [[22, "lomas_server.utils.collection_models.Metadata.model_config", false]], "model_config (lomas_server.utils.collection_models.metadataofdataset attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfDataset.model_config", false]], "model_config (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfPathDB.model_config", false]], "model_config (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.model_config", false]], "model_config (lomas_server.utils.collection_models.user attribute)": [[22, "lomas_server.utils.collection_models.User.model_config", false]], "model_config (lomas_server.utils.collection_models.usercollection attribute)": [[22, "lomas_server.utils.collection_models.UserCollection.model_config", false]], "model_config (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[22, "lomas_server.utils.query_models.DummyOpenDPModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.model_config", false]], "model_config (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.model_config", false]], "model_config (lomas_server.utils.query_models.getdbdata attribute)": [[22, "lomas_server.utils.query_models.GetDbData.model_config", false]], "model_config (lomas_server.utils.query_models.getdummydataset attribute)": [[22, "lomas_server.utils.query_models.GetDummyDataset.model_config", false]], "model_config (lomas_server.utils.query_models.opendpmodel attribute)": [[22, "lomas_server.utils.query_models.OpenDPModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.model_config", false]], "model_config (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.model_config", false]], "model_fields (lomas_server.utils.collection_models.dataset attribute)": [[22, "lomas_server.utils.collection_models.Dataset.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetofpathdb attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfPathDB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetofs3db attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfS3DB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetofuser attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfUser.model_fields", false]], "model_fields (lomas_server.utils.collection_models.datasetscollection attribute)": [[22, "lomas_server.utils.collection_models.DatasetsCollection.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadata attribute)": [[22, "lomas_server.utils.collection_models.Metadata.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadataofdataset attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfDataset.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadataofpathdb attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfPathDB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.model_fields", false]], "model_fields (lomas_server.utils.collection_models.user attribute)": [[22, "lomas_server.utils.collection_models.User.model_fields", false]], "model_fields (lomas_server.utils.collection_models.usercollection attribute)": [[22, "lomas_server.utils.collection_models.UserCollection.model_fields", false]], "model_fields (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[22, "lomas_server.utils.query_models.DummyOpenDPModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.dummysmartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.getdbdata attribute)": [[22, "lomas_server.utils.query_models.GetDbData.model_fields", false]], "model_fields (lomas_server.utils.query_models.getdummydataset attribute)": [[22, "lomas_server.utils.query_models.GetDummyDataset.model_fields", false]], "model_fields (lomas_server.utils.query_models.opendpmodel attribute)": [[22, "lomas_server.utils.query_models.OpenDPModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.model_fields", false]], "model_fields (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.model_fields", false]], "module": [[11, "module-lomas_client", false], [11, "module-lomas_client.client", false], [11, "module-lomas_client.utils", false], [12, "module-lomas_server", false], [12, "module-lomas_server.constants", false], [13, "module-lomas_server.admin_database", false], [14, "module-lomas_server.administration", false], [15, "module-lomas_server.data_connector", false], [16, "module-lomas_server.dataset_store", false], [16, "module-lomas_server.dataset_store.data_connector_observer", false], [17, "module-lomas_server.dp_queries", false], [18, "module-lomas_server.dp_queries.dp_libraries", false], [19, "module-lomas_server.private_dataset", false], [20, "module-lomas_server.routes", false], [21, "module-lomas_server.tests", false], [21, "module-lomas_server.tests.constants", false], [22, "module-lomas_server.utils", false], [22, "module-lomas_server.utils.collection_models", false], [22, "module-lomas_server.utils.logger", false], [22, "module-lomas_server.utils.query_examples", false], [22, "module-lomas_server.utils.query_models", false]], "mongodb (lomas_server.constants.admindbtype attribute)": [[12, "lomas_server.constants.AdminDBType.MONGODB", false]], "mongodb_addr (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.MONGODB_ADDR", false]], "mongodb_port (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.MONGODB_PORT", false]], "mst (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.MST", false]], "mst (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.MST", false]], "mwem (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.MWEM", false]], "mwem (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.MWEM", false]], "nb_samples (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.nb_samples", false]], "nullable (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.nullable", false]], "opendp (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.OPENDP", false]], "opendp (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.OPENDP", false]], "opendp_json (lomas_server.utils.query_models.dummyopendpmodel attribute)": [[22, "lomas_server.utils.query_models.DummyOpenDPModel.opendp_json", false]], "opendp_json (lomas_server.utils.query_models.opendpmodel attribute)": [[22, "lomas_server.utils.query_models.OpenDPModel.opendp_json", false]], "opendp_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.opendp_query", false]], "opendpdatasetinputmetric (class in lomas_server.constants)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric", false]], "opendpmeasurement (class in lomas_server.constants)": [[12, "lomas_server.constants.OpenDPMeasurement", false]], "opendpmodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.OpenDPModel", false]], "pac_synth (lomas_client.utils.ssynthmarginalsynthesizer attribute)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer.PAC_SYNTH", false]], "pac_synth (lomas_server.constants.ssynthmarginalsynthesizer attribute)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer.PAC_SYNTH", false]], "pate_ctgan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.PATE_CTGAN", false]], "pate_ctgan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.PATE_CTGAN", false]], "pate_gan (lomas_client.utils.ssynthgansynthesizer attribute)": [[11, "lomas_client.utils.SSynthGanSynthesizer.PATE_GAN", false]], "pate_gan (lomas_server.constants.ssynthgansynthesizer attribute)": [[12, "lomas_server.constants.SSynthGanSynthesizer.PATE_GAN", false]], "path (lomas_server.constants.privatedatabasetype attribute)": [[12, "lomas_server.constants.PrivateDatabaseType.PATH", false]], "postprocess (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.postprocess", false]], "postprocess (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel.postprocess", false]], "private_id (lomas_server.constants.ssynthcolumntype attribute)": [[12, "lomas_server.constants.SSynthColumnType.PRIVATE_ID", false]], "privatedatabasetype (class in lomas_server.constants)": [[12, "lomas_server.constants.PrivateDatabaseType", false]], "query_str (lomas_server.utils.query_models.dummysmartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.DummySmartnoiseSQLModel.query_str", false]], "query_str (lomas_server.utils.query_models.smartnoisesqlcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLCostModel.query_str", false]], "query_str (lomas_server.utils.query_models.smartnoisesqlmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel.query_str", false]], "return_model (lomas_server.utils.query_models.smartnoisesynthquerymodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel.return_model", false]], "row_privacy (lomas_server.utils.collection_models.metadata attribute)": [[22, "lomas_server.utils.collection_models.Metadata.row_privacy", false]], "runtime_args (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.RUNTIME_ARGS", false]], "s3 (lomas_server.constants.privatedatabasetype attribute)": [[12, "lomas_server.constants.PrivateDatabaseType.S3", false]], "secret_access_key (lomas_server.utils.collection_models.metadataofs3db attribute)": [[22, "lomas_server.utils.collection_models.MetadataOfS3DB.secret_access_key", false]], "select_cols (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.select_cols", false]], "server (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.SERVER", false]], "settings (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.SETTINGS", false]], "smartnoise_sql (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.SMARTNOISE_SQL", false]], "smartnoise_sql (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.SMARTNOISE_SQL", false]], "smartnoise_sql_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.smartnoise_sql_query", false]], "smartnoise_synth (lomas_client.client.dplibraries attribute)": [[11, "lomas_client.client.DPLibraries.SMARTNOISE_SYNTH", false]], "smartnoise_synth (lomas_server.constants.dplibraries attribute)": [[12, "lomas_server.constants.DPLibraries.SMARTNOISE_SYNTH", false]], "smartnoise_synth_query() (lomas_client.client.client method)": [[11, "lomas_client.client.Client.smartnoise_synth_query", false]], "smartnoisesqlcostmodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLCostModel", false]], "smartnoisesqlmodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.SmartnoiseSQLModel", false]], "smartnoisesynthcostmodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel", false]], "smartnoisesynthquerymodel (class in lomas_server.utils.query_models)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthQueryModel", false]], "smoothed_max_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.SMOOTHED_MAX_DIVERGENCE", false]], "ssynthcolumntype (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthColumnType", false]], "ssynthgansynthesizer (class in lomas_client.utils)": [[11, "lomas_client.utils.SSynthGanSynthesizer", false]], "ssynthgansynthesizer (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthGanSynthesizer", false]], "ssynthmarginalsynthesizer (class in lomas_client.utils)": [[11, "lomas_client.utils.SSynthMarginalSynthesizer", false]], "ssynthmarginalsynthesizer (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthMarginalSynthesizer", false]], "ssynthtabletransstyle (class in lomas_server.constants)": [[12, "lomas_server.constants.SSynthTableTransStyle", false]], "stall (lomas_server.constants.timeattackmethod attribute)": [[12, "lomas_server.constants.TimeAttackMethod.STALL", false]], "submit_limit (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.SUBMIT_LIMIT", false]], "symmetric_distance (lomas_server.constants.opendpdatasetinputmetric attribute)": [[12, "lomas_server.constants.OpenDPDatasetInputMetric.SYMMETRIC_DISTANCE", false]], "synth_name (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.synth_name", false]], "synth_params (lomas_server.utils.query_models.smartnoisesynthcostmodel attribute)": [[22, "lomas_server.utils.query_models.SmartnoiseSynthCostModel.synth_params", false]], "target_columns (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.target_columns", false]], "target_columns (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.target_columns", false]], "test_size (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.test_size", false]], "test_size (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.test_size", false]], "test_train_split_seed (lomas_server.utils.query_models.diffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DiffPrivLibModel.test_train_split_seed", false]], "test_train_split_seed (lomas_server.utils.query_models.dummydiffprivlibmodel attribute)": [[22, "lomas_server.utils.query_models.DummyDiffPrivLibModel.test_train_split_seed", false]], "time_attack (lomas_server.constants.configkeys attribute)": [[12, "lomas_server.constants.ConfigKeys.TIME_ATTACK", false]], "timeattackmethod (class in lomas_server.constants)": [[12, "lomas_server.constants.TimeAttackMethod", false]], "total_spent_delta (lomas_server.utils.collection_models.datasetofuser attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfUser.total_spent_delta", false]], "total_spent_epsilon (lomas_server.utils.collection_models.datasetofuser attribute)": [[22, "lomas_server.utils.collection_models.DatasetOfUser.total_spent_epsilon", false]], "update_memory_usage() (lomas_server.dataset_store.data_connector_observer.dataconnectorobserver method)": [[16, "lomas_server.dataset_store.data_connector_observer.DataConnectorObserver.update_memory_usage", false]], "user (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.User", false]], "user_name (lomas_server.utils.collection_models.user attribute)": [[22, "lomas_server.utils.collection_models.User.user_name", false]], "usercollection (class in lomas_server.utils.collection_models)": [[22, "lomas_server.utils.collection_models.UserCollection", false]], "users (lomas_server.utils.collection_models.usercollection attribute)": [[22, "lomas_server.utils.collection_models.UserCollection.users", false]], "validate_synthesizer() (in module lomas_client.utils)": [[11, "lomas_client.utils.validate_synthesizer", false]], "yaml (lomas_server.constants.admindbtype attribute)": [[12, "lomas_server.constants.AdminDBType.YAML", false]], "zero_concentrated_divergence (lomas_server.constants.opendpmeasurement attribute)": [[12, "lomas_server.constants.OpenDPMeasurement.ZERO_CONCENTRATED_DIVERGENCE", false]]}, "objects": {"": [[11, 0, 0, "-", "lomas_client"], [12, 0, 0, "-", "lomas_server"]], "lomas_client": [[11, 0, 0, "-", "client"], [11, 0, 0, "-", "utils"]], "lomas_client.client": [[11, 1, 1, "", "Client"], [11, 1, 1, "", "DPLibraries"], [11, 4, 1, "", "error_message"]], "lomas_client.client.Client": [[11, 2, 1, "", "diffprivlib_query"], [11, 2, 1, "", "estimate_diffprivlib_cost"], [11, 2, 1, "", "estimate_opendp_cost"], [11, 2, 1, "", "estimate_smartnoise_sql_cost"], [11, 2, 1, "", "estimate_smartnoise_synth_cost"], [11, 2, 1, "", "get_dataset_metadata"], [11, 2, 1, "", "get_dummy_dataset"], [11, 2, 1, "", "get_initial_budget"], [11, 2, 1, "", "get_previous_queries"], [11, 2, 1, "", "get_remaining_budget"], [11, 2, 1, "", "get_total_spent_budget"], [11, 2, 1, "", "opendp_query"], [11, 2, 1, "", "smartnoise_sql_query"], [11, 2, 1, "", "smartnoise_synth_query"]], "lomas_client.client.DPLibraries": [[11, 3, 1, "", "DIFFPRIVLIB"], [11, 3, 1, "", "OPENDP"], [11, 3, 1, "", "SMARTNOISE_SQL"], [11, 3, 1, "", "SMARTNOISE_SYNTH"]], "lomas_client.utils": [[11, 1, 1, "", "SSynthGanSynthesizer"], [11, 1, 1, "", "SSynthMarginalSynthesizer"], [11, 4, 1, "", "validate_synthesizer"]], "lomas_client.utils.SSynthGanSynthesizer": [[11, 3, 1, "", "DP_CTGAN"], [11, 3, 1, "", "DP_GAN"], [11, 3, 1, "", "PATE_CTGAN"], [11, 3, 1, "", "PATE_GAN"]], "lomas_client.utils.SSynthMarginalSynthesizer": [[11, 3, 1, "", "AIM"], [11, 3, 1, "", "MST"], [11, 3, 1, "", "MWEM"], [11, 3, 1, "", "PAC_SYNTH"]], "lomas_server": [[13, 0, 0, "-", "admin_database"], [14, 0, 0, "-", "administration"], [12, 0, 0, "-", "constants"], [15, 0, 0, "-", "data_connector"], [16, 0, 0, "-", "dataset_store"], [17, 0, 0, "-", "dp_queries"], [19, 0, 0, "-", "private_dataset"], [20, 0, 0, "-", "routes"], [21, 0, 0, "-", "tests"], [22, 0, 0, "-", "utils"]], "lomas_server.constants": [[12, 1, 1, "", "AdminDBType"], [12, 1, 1, "", "ConfigKeys"], [12, 1, 1, "", "DPLibraries"], [12, 1, 1, "", "DatasetStoreType"], [12, 1, 1, "", "OpenDPDatasetInputMetric"], [12, 1, 1, "", "OpenDPMeasurement"], [12, 1, 1, "", "PrivateDatabaseType"], [12, 1, 1, "", "SSynthColumnType"], [12, 1, 1, "", "SSynthGanSynthesizer"], [12, 1, 1, "", "SSynthMarginalSynthesizer"], [12, 1, 1, "", "SSynthTableTransStyle"], [12, 1, 1, "", "TimeAttackMethod"]], "lomas_server.constants.AdminDBType": [[12, 3, 1, "", "MONGODB"], [12, 3, 1, "", "YAML"]], "lomas_server.constants.ConfigKeys": [[12, 3, 1, "", "DATASET_STORE"], [12, 3, 1, "", "DATASET_STORE_TYPE"], [12, 3, 1, "", "DB"], [12, 3, 1, "", "DB_TYPE"], [12, 3, 1, "", "DB_TYPE_MONGODB"], [12, 3, 1, "", "DEVELOP_MODE"], [12, 3, 1, "", "DP_LIBRARY"], [12, 3, 1, "", "LRU_DATASET_STORE_MAX_SIZE"], [12, 3, 1, "", "MONGODB_ADDR"], [12, 3, 1, "", "MONGODB_PORT"], [12, 3, 1, "", "RUNTIME_ARGS"], [12, 3, 1, "", "SERVER"], [12, 3, 1, "", "SETTINGS"], [12, 3, 1, "", "SUBMIT_LIMIT"], [12, 3, 1, "", "TIME_ATTACK"]], "lomas_server.constants.DPLibraries": [[12, 3, 1, "", "DIFFPRIVLIB"], [12, 3, 1, "", "OPENDP"], [12, 3, 1, "", "SMARTNOISE_SQL"], [12, 3, 1, "", "SMARTNOISE_SYNTH"]], "lomas_server.constants.DatasetStoreType": [[12, 3, 1, "", "BASIC"], [12, 3, 1, "", "LRU"]], "lomas_server.constants.OpenDPDatasetInputMetric": [[12, 3, 1, "", "CHANGE_ONE_DISTANCE"], [12, 3, 1, "", "HAMMING_DISTANCE"], [12, 3, 1, "", "INSERT_DELETE_DISTANCE"], [12, 3, 1, "", "INT_DISTANCE"], [12, 3, 1, "", "SYMMETRIC_DISTANCE"]], "lomas_server.constants.OpenDPMeasurement": [[12, 3, 1, "", "FIXED_SMOOTHED_MAX_DIVERGENCE"], [12, 3, 1, "", "MAX_DIVERGENCE"], [12, 3, 1, "", "SMOOTHED_MAX_DIVERGENCE"], [12, 3, 1, "", "ZERO_CONCENTRATED_DIVERGENCE"]], "lomas_server.constants.PrivateDatabaseType": [[12, 3, 1, "", "PATH"], [12, 3, 1, "", "S3"]], "lomas_server.constants.SSynthColumnType": [[12, 3, 1, "", "CATEGORICAL"], [12, 3, 1, "", "CONTINUOUS"], [12, 3, 1, "", "DATETIME"], [12, 3, 1, "", "PRIVATE_ID"]], "lomas_server.constants.SSynthGanSynthesizer": [[12, 3, 1, "", "DP_CTGAN"], [12, 3, 1, "", "DP_GAN"], [12, 3, 1, "", "PATE_CTGAN"], [12, 3, 1, "", "PATE_GAN"]], "lomas_server.constants.SSynthMarginalSynthesizer": [[12, 3, 1, "", "AIM"], [12, 3, 1, "", "MST"], [12, 3, 1, "", "MWEM"], [12, 3, 1, "", "PAC_SYNTH"]], "lomas_server.constants.SSynthTableTransStyle": [[12, 3, 1, "", "CUBE"], [12, 3, 1, "", "GAN"]], "lomas_server.constants.TimeAttackMethod": [[12, 3, 1, "", "JITTER"], [12, 3, 1, "", "STALL"]], "lomas_server.dataset_store": [[16, 0, 0, "-", "data_connector_observer"]], "lomas_server.dataset_store.data_connector_observer": [[16, 1, 1, "", "DataConnectorObserver"]], "lomas_server.dataset_store.data_connector_observer.DataConnectorObserver": [[16, 2, 1, "", "update_memory_usage"]], "lomas_server.dp_queries": [[18, 0, 0, "-", "dp_libraries"]], "lomas_server.tests": [[21, 0, 0, "-", "constants"]], "lomas_server.utils": [[22, 0, 0, "-", "collection_models"], [22, 0, 0, "-", "logger"], [22, 0, 0, "-", "query_examples"], [22, 0, 0, "-", "query_models"]], "lomas_server.utils.collection_models": [[22, 1, 1, "", "Dataset"], [22, 1, 1, "", "DatasetOfPathDB"], [22, 1, 1, "", "DatasetOfS3DB"], [22, 1, 1, "", "DatasetOfUser"], [22, 1, 1, "", "DatasetsCollection"], [22, 1, 1, "", "Metadata"], [22, 1, 1, "", "MetadataOfDataset"], [22, 1, 1, "", "MetadataOfPathDB"], [22, 1, 1, "", "MetadataOfS3DB"], [22, 1, 1, "", "User"], [22, 1, 1, "", "UserCollection"]], "lomas_server.utils.collection_models.Dataset": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "metadata"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.DatasetOfPathDB": [[22, 3, 1, "", "database_type"], [22, 3, 1, "", "dataset_path"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.DatasetOfS3DB": [[22, 3, 1, "", "bucket"], [22, 3, 1, "", "credentials_name"], [22, 3, 1, "", "database_type"], [22, 3, 1, "", "endpoint_url"], [22, 3, 1, "", "key"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.DatasetOfUser": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "initial_delta"], [22, 3, 1, "", "initial_epsilon"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "total_spent_delta"], [22, 3, 1, "", "total_spent_epsilon"]], "lomas_server.utils.collection_models.DatasetsCollection": [[22, 3, 1, "", "datasets"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.Metadata": [[22, 3, 1, "", "censor_dims"], [22, 3, 1, "", "columns"], [22, 3, 1, "", "max_ids"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "row_privacy"]], "lomas_server.utils.collection_models.MetadataOfDataset": [[22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.MetadataOfPathDB": [[22, 3, 1, "", "database_type"], [22, 3, 1, "", "metadata_path"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"]], "lomas_server.utils.collection_models.MetadataOfS3DB": [[22, 3, 1, "", "access_key_id"], [22, 3, 1, "", "bucket"], [22, 3, 1, "", "credentials_name"], [22, 3, 1, "", "database_type"], [22, 3, 1, "", "endpoint_url"], [22, 3, 1, "", "key"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "secret_access_key"]], "lomas_server.utils.collection_models.User": [[22, 3, 1, "", "datasets_list"], [22, 3, 1, "", "may_query"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "user_name"]], "lomas_server.utils.collection_models.UserCollection": [[22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "users"]], "lomas_server.utils.query_examples": [[22, 4, 1, "", "make_dummy"]], "lomas_server.utils.query_models": [[22, 1, 1, "", "DiffPrivLibModel"], [22, 1, 1, "", "DummyDiffPrivLibModel"], [22, 1, 1, "", "DummyOpenDPModel"], [22, 1, 1, "", "DummySmartnoiseSQLModel"], [22, 1, 1, "", "DummySmartnoiseSynthQueryModel"], [22, 1, 1, "", "GetDbData"], [22, 1, 1, "", "GetDummyDataset"], [22, 1, 1, "", "OpenDPModel"], [22, 1, 1, "", "SmartnoiseSQLCostModel"], [22, 1, 1, "", "SmartnoiseSQLModel"], [22, 1, 1, "", "SmartnoiseSynthCostModel"], [22, 1, 1, "", "SmartnoiseSynthQueryModel"]], "lomas_server.utils.query_models.DiffPrivLibModel": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "diffprivlib_json"], [22, 3, 1, "", "feature_columns"], [22, 3, 1, "", "imputer_strategy"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "target_columns"], [22, 3, 1, "", "test_size"], [22, 3, 1, "", "test_train_split_seed"]], "lomas_server.utils.query_models.DummyDiffPrivLibModel": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "diffprivlib_json"], [22, 3, 1, "", "dummy_nb_rows"], [22, 3, 1, "", "dummy_seed"], [22, 3, 1, "", "feature_columns"], [22, 3, 1, "", "imputer_strategy"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "target_columns"], [22, 3, 1, "", "test_size"], [22, 3, 1, "", "test_train_split_seed"]], "lomas_server.utils.query_models.DummyOpenDPModel": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "dummy_nb_rows"], [22, 3, 1, "", "dummy_seed"], [22, 3, 1, "", "fixed_delta"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "opendp_json"]], "lomas_server.utils.query_models.DummySmartnoiseSQLModel": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "delta"], [22, 3, 1, "", "dummy_nb_rows"], [22, 3, 1, "", "dummy_seed"], [22, 3, 1, "", "epsilon"], [22, 3, 1, "", "mechanisms"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "postprocess"], [22, 3, 1, "", "query_str"]], "lomas_server.utils.query_models.DummySmartnoiseSynthQueryModel": [[22, 3, 1, "", "dummy_nb_rows"], [22, 3, 1, "", "dummy_seed"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"]], "lomas_server.utils.query_models.GetDbData": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"]], "lomas_server.utils.query_models.GetDummyDataset": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "dummy_nb_rows"], [22, 3, 1, "", "dummy_seed"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"]], "lomas_server.utils.query_models.OpenDPModel": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "fixed_delta"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "opendp_json"]], "lomas_server.utils.query_models.SmartnoiseSQLCostModel": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "delta"], [22, 3, 1, "", "epsilon"], [22, 3, 1, "", "mechanisms"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "query_str"]], "lomas_server.utils.query_models.SmartnoiseSQLModel": [[22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "delta"], [22, 3, 1, "", "epsilon"], [22, 3, 1, "", "mechanisms"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "postprocess"], [22, 3, 1, "", "query_str"]], "lomas_server.utils.query_models.SmartnoiseSynthCostModel": [[22, 3, 1, "", "constraints"], [22, 3, 1, "", "dataset_name"], [22, 3, 1, "", "delta"], [22, 3, 1, "", "epsilon"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "nullable"], [22, 3, 1, "", "select_cols"], [22, 3, 1, "", "synth_name"], [22, 3, 1, "", "synth_params"]], "lomas_server.utils.query_models.SmartnoiseSynthQueryModel": [[22, 3, 1, "", "condition"], [22, 3, 1, "", "model_computed_fields"], [22, 3, 1, "", "model_config"], [22, 3, 1, "", "model_fields"], [22, 3, 1, "", "nb_samples"], [22, 3, 1, "", "return_model"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "function", "Python function"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:function"}, "terms": {"": [0, 2, 9, 23, 24, 25, 26, 27, 28, 38], "0": [0, 11, 22, 23, 24, 25, 26, 27, 28, 32, 36], "00": 27, "000000": 26, "000000000032756e": 25, "0001": [23, 24, 26, 27], "00014999500000001387": 28, "00015673368198174188": [23, 26], "0003": 26, "0004": [22, 25], "0005": 27, "001": 27, "004345": 23, "00493999999999994": 25, "004950000000000006": 23, "004989999999999935": 25, "004994999999999967": 25, "005": [23, 25, 27], "0064163": 24, "009962": 23, "01": 28, "010140": 25, "015296": 26, "019657": 26, "021906": 26, "02257092": 24, "029771": 26, "03": 9, "03063776": 24, "031628": [23, 25], "037792": 26, "038092": 25, "039871": 26, "04": 25, "0403549": 24, "040502": 26, "040945": 23, "04333305": 24, "05": [23, 25, 26, 27], "051061": 28, "057986": 26, "058849": 23, "06": [25, 27], "06269805": 24, "064838": 26, "064982": 25, "065695": 26, "067739": 25, "07": 27, "070911": [23, 25], "075665": 25, "0776813": 23, "0791934": 24, "08181725": 24, "085707": 25, "09": [24, 27], "09042376": 24, "092630": 26, "095856": 26, "096718": [23, 25], "0x75edc6883650": 26, "0x75edc6e1ffd0": 26, "1": [6, 8, 11, 12, 22, 27, 32, 36], "10": [23, 24, 25, 26, 27, 28], "100": [11, 23, 24, 25, 26, 27, 28], "1000": 27, "100000": 27, "1047": 24, "10520211": 24, "108904": 25, "11": [23, 24, 25, 26, 27, 28], "112": 24, "113": 24, "114": 24, "114285714286655": 25, "115": 24, "115118": 26, "116": 24, "116608": 26, "117": 24, "117959": 25, "118": 24, "119": 24, "119691": 26, "12": [23, 24, 25, 26, 27, 28], "120": 24, "12087": 24, "121": 24, "122": [24, 25], "123": 24, "125": 26, "125950": 25, "126": 24, "126229": 23, "127": [24, 36], "128": [24, 26], "12818723": 24, "13": [23, 24, 25, 26, 27, 28], "133": 28, "135689": 26, "135714285713345": 25, "136712": 26, "13806414": 24, "14": [23, 25, 26, 27, 28], "143560": 25, "143633": 28, "149507": 25, "15": [23, 24, 25, 26, 27, 28], "150": [23, 24, 25, 26, 27], "152": 23, "154047": 26, "155": 26, "155779": 26, "158": 25, "159": 25, "16": [23, 24, 25, 26, 27, 28], "160858": 28, "162871": 25, "164572": 26, "1653635": 24, "166": 25, "167": 23, "17": [23, 24, 25, 26, 27, 28], "170": 23, "17087": 9, "1724943669": 26, "1725364882": 23, "1725364890": 23, "1725364897": 23, "1725364925": 23, "1725375748": 24, "1725375760": 24, "1725375769": 24, "17307692307692307": 24, "174224": 23, "175608": 25, "176": 26, "1789": 24, "179": 24, "179588": 23, "18": [23, 24, 25, 26, 27, 28], "180": 26, "181": 23, "182522": 26, "184": 26, "187": 23, "188": 26, "189": 26, "18mm": 25, "19": [23, 25, 26, 27, 28], "190": [25, 26], "192": 26, "193": 26, "195": [23, 26], "195120": 26, "196": [23, 26], "196980": 26, "197": [23, 26], "198": [23, 24], "199": [23, 28], "199850005": 28, "1e": [11, 23, 24, 25, 26, 27, 28], "2": [6, 8, 11, 27], "20": [23, 24, 25, 26, 27, 28], "200": [11, 23, 25, 26, 28], "2000": [23, 24, 25, 26, 27], "2017": 23, "202": 26, "2020": 23, "2022": [9, 23], "2024": [9, 23, 27], "203": 26, "203165": 25, "205857": 23, "206": 26, "208380": 26, "208473": [23, 25], "209": 26, "21": [23, 24, 25, 26, 27, 28], "210": 25, "210038": 23, "213206": 26, "214": 25, "214375": 23, "215": 26, "215382": 26, "21843151": 24, "219": [23, 26], "22": [23, 24, 25, 26, 27, 28], "220": 26, "224480": 26, "2250": 26, "2258": 25, "22857142857142856": 24, "23": [23, 24, 25, 26, 27, 28], "2316": 25, "233215": 26, "235": 26, "23529411764705882": 23, "236": 25, "236663": 23, "239": 25, "24": [23, 24, 25, 26, 27, 28], "240181818190626": 28, "2405": 23, "2406": 9, "242": 25, "2421": 28, "244": 25, "2464255812": 28, "246787": 25, "246870": 25, "246992": 28, "248922": 26, "25": [23, 24, 25, 26, 27, 28], "250": [23, 24, 25, 26, 27], "2503": 28, "256": 26, "2562": 28, "26": [23, 24, 25, 26, 27, 28], "2619": 24, "27": [23, 24, 25, 26, 27, 28], "27017": [27, 32], "2733": 28, "273981": 26, "2750": 26, "275001": 25, "28": [23, 24, 25, 26, 27, 28], "285002": 25, "285714285713345": 25, "2873": 25, "289634": 25, "29": [23, 24, 25, 26, 27, 28], "291927": 25, "293022": 26, "2964165": 24, "29748358": 24, "298139": 26, "3": [6, 8, 27], "30": [23, 24, 25, 26, 27, 28], "300": 27, "300011": 23, "303064": 26, "31": [23, 25, 26, 27, 28], "310123": 26, "314292": 25, "318067": 26, "32": [23, 24, 25, 26, 27, 28], "322245": 26, "326402": 25, "3265": 28, "3280285": 24, "3299136": 23, "33": [23, 24, 25, 26, 27], "332225": 25, "332719": 26, "334219": 26, "3379": 26, "34": [23, 24, 25, 26, 27, 28], "340155": 23, "343": 25, "344": [23, 24, 25, 26], "346262": 26, "35": [23, 24, 25, 27], "3503": 26, "351940": 23, "36": [23, 24, 26, 27], "3639": 25, "364104": 25, "3655": 26, "3665": 23, "3677": 26, "37": [23, 24, 25, 26, 27], "371106": 26, "3719": 26, "3729": 26, "375": 26, "38": [23, 24, 25, 27, 28], "380197": 26, "381155": 25, "38324636": 24, "386925": 26, "386937": 26, "39": [23, 24, 25, 26, 27, 28], "392393": 26, "393938": 26, "396": 27, "399": 28, "4": [5, 6, 26, 27], "40": [23, 24, 27], "400": [23, 28], "403337": 26, "4036": 23, "4078": 28, "4079": 26, "408606": 25, "409859": 26, "41": [23, 24, 25, 26, 27], "4114": 26, "413996": 25, "4144": 24, "418": 27, "418710": 26, "42": [11, 23, 24, 25, 26, 27], "420402": 25, "4207": 24, "422": [24, 26], "42783671": 24, "43": [23, 24, 25, 26, 27, 28], "437214": 26, "4394": 26, "44": [23, 24, 25, 26, 27], "441730": 26, "4419": 26, "442156": 23, "442859": 23, "444863": 26, "4452": 28, "445511": 26, "4458": 26, "4478": 26, "45": [23, 24, 25, 26, 27, 28], "450379": 26, "4523578": 26, "452576": 26, "453384": 26, "4534618": 24, "456669": 25, "46": [23, 24, 25, 26, 27], "460652": 25, "461": 27, "4611": 28, "46118653": 24, "4627": 26, "464": 27, "4653": 26, "4656": 25, "466": 27, "467873": 23, "47": [23, 24, 25, 26, 27], "4703": 25, "472887": 25, "4772062": 24, "48": [23, 25, 26, 27], "482846": 26, "4833": 28, "485997": 26, "4860": 28, "487531": 23, "4887658": 24, "489978": 26, "49": [23, 25, 26, 27, 28], "4925373134328358": 24, "494324": 26, "495445": 26, "496153": 26, "499e": 25, "5": [6, 11, 22, 23, 25, 26, 27, 28, 32], "50": [23, 25, 26, 27], "500": 26, "5000": [23, 26], "5012": 26, "5036": 25, "504224": 26, "505892": 26, "506950": 23, "5085": 26, "51": [23, 24, 25, 26, 27], "511585": 23, "511754": 26, "51229381350249": 25, "513633": 23, "515079": 26, "5152": 26, "51532": 25, "5187": 25, "52": [23, 26, 27], "5250": 26, "5256": 26, "526961": 24, "527822": 26, "53": [23, 26], "530153": 25, "534705": 23, "5361": 26, "536535": 26, "538643": 26, "5387": 26, "54": [23, 26, 27], "5401": 25, "5405": [26, 28], "542186": 25, "54397209": 24, "548207": 26, "548540": 26, "5486": 26, "548668": 26, "54mm": 23, "55": [23, 25], "550000000000001": 25, "5514": 26, "552031": 23, "552931": 25, "557167": 25, "559502": 23, "56": [23, 24], "5630": [25, 28], "565315": 23, "56533889": 24, "566451": 25, "57": [23, 24, 25, 26], "573335": 23, "58": [23, 24, 26], "5857142857133439": 25, "586326": 26, "5870": 23, "589007": 26, "59": [23, 24, 27], "596290": 23, "597868": 23, "6": [6, 23, 25, 27, 28], "60": 23, "600734": 26, "6048": 26, "61": 23, "61111848": 24, "6134": 26, "6183": 26, "619788": 25, "62": [23, 24], "621885": 23, "625": 26, "627252": 26, "627506": 26, "6291": 26, "63": [24, 25, 26], "632390": 23, "6332": 26, "633310": 26, "634349": 23, "634415": 25, "6345": 26, "6358": 26, "63708804": 24, "639037": 26, "6397": 28, "64": 26, "641046": 24, "642906": 25, "643492": 25, "644815": 26, "649727": 26, "649887": 25, "65": [23, 24, 25, 26, 27], "6532": 23, "6542": 26, "659944": 25, "6634": 28, "666000": 26, "667682": 26, "667950": 26, "67": 25, "673375": 23, "6743": 28, "677968": 23, "678": 27, "687155": 23, "688074": 25, "690454": 25, "6916816": 23, "69469642643347": 24, "695215": 26, "695675": 25, "7": [23, 24, 25, 26, 27, 28], "7000": [23, 24, 25, 26, 27], "700080": 23, "703": 27, "70486754": 24, "706083": 26, "71": [24, 25], "710": 27, "7122093023265228": 23, "712894": 26, "714285714286655": 25, "715853": 25, "72": 24, "725760": 23, "726": 27, "73": 24, "733179": 25, "73642974": 24, "74": 24, "741": 27, "74222011": 24, "743330": 25, "749": 27, "75": [24, 25, 26], "755": 27, "755816": 25, "76": 24, "769447201112094": 23, "77": [23, 24], "773158": 25, "775184": 23, "777496": 23, "777518": 25, "778165": 23, "778699": 26, "783114": 26, "785036": 26, "785941": 28, "788893": 26, "79": [24, 28], "792230": 26, "796037": 25, "799114": 26, "8": [23, 24, 25, 26, 27, 28], "80": [24, 26], "800": 23, "803438": 25, "809876": 26, "809981": 26, "811036": 26, "813858": 23, "81874155": 24, "82": 24, "825123": 26, "825255002419716": 23, "8266": 28, "827918": [23, 25], "828992": 26, "83": [23, 24], "830853": 23, "833": 24, "834249": 26, "83563483": 24, "836150": 26, "83mm": 23, "84": 25, "840851": 26, "847898": 26, "85": 25, "8501": [33, 36], "852415": 26, "855419": 25, "858690": 26, "859511": 25, "860750": 26, "865149": 26, "874247": 26, "875": 26, "877035": 23, "881930": 25, "885068": 23, "885714285713345": 25, "8888": 36, "88939657": 24, "890809": 23, "891": 28, "892826": 26, "9": [23, 24, 25, 26, 27, 28], "90": 24, "9000": 36, "9001": 36, "907485": 26, "911177": 26, "912863": 25, "914762": 26, "917": 27, "9226": 28, "928019": 28, "929142": 25, "929629": 26, "934119": 23, "935352": 28, "936950": 28, "94": 28, "940005": 25, "940040": 26, "940338": 28, "941920": 26, "943369": 26, "947320": 26, "948853": 25, "95": [23, 25, 28], "953047": 25, "958753": 26, "96": [23, 25, 28], "960368": 23, "961493": 25, "9621": 28, "963435": 25, "967093": 26, "96890848": 24, "971380": 26, "979574": 26, "982129": 28, "9846": 28, "98950874": 24, "99": 23, "996525": 26, "997587": 25, "999999999999449e": [23, 25], "9am": 0, "A": [9, 11, 22, 23, 25, 26, 27, 28, 35, 36], "AND": 0, "AS": [23, 25, 28], "And": [23, 24, 25, 26, 27], "As": [0, 23, 24, 25, 26, 28], "BY": 25, "But": [23, 25], "By": [23, 24, 25, 26, 27, 35], "For": [0, 9, 11, 23, 24, 26, 27], "IT": 9, "If": [0, 1, 11, 24, 25, 27, 33, 35, 36], "In": [0, 1, 5, 6, 9, 11, 23, 24, 25, 26, 27, 30, 33, 35, 36], "It": [0, 2, 9, 23, 24, 25, 26, 27, 28, 30, 32], "Its": 9, "NOT": [23, 25], "No": [0, 23, 27], "Not": [11, 23, 25], "ON": [23, 36], "Of": [0, 25], "On": [9, 23, 24, 25, 28], "One": [0, 2, 26, 28, 36], "Or": [24, 26, 27], "That": 25, "The": [0, 2, 5, 10, 11, 23, 24, 25, 26, 27, 28, 32, 33, 35, 36], "Then": [0, 1, 23, 25, 26, 27], "There": [0, 26], "These": [0, 6, 27, 30, 32], "To": [0, 8, 23, 24, 25, 26, 27, 28, 30, 33, 35, 38], "WILL": 23, "With": [23, 24, 26, 28, 36], "__fields__": 22, "__init__": [26, 27], "__name__": 27, "__pycache__": 27, "__token__": 1, "_add_dataset": 0, "_dpl_instanc": [23, 24], "_dpl_type": [23, 24], "_item": [23, 24], "_tupl": [23, 24], "aadd": 0, "ab": [9, 25], "abc": 16, "abl": [23, 24, 25, 26, 27, 28], "about": [0, 9, 22, 23, 25, 26, 27, 32], "abov": [0, 25], "abspath": [24, 25, 26], "abstract": 16, "accept": [11, 25], "access": [5, 8, 9, 23, 24, 25, 26, 30, 32, 34, 36], "access_key_id": [12, 22, 32], "accord": 38, "accordingli": 27, "account": [11, 23, 24, 25, 26], "accuraci": [23, 24], "acknowledg": 5, "across": [0, 36], "action": 0, "activ": [2, 33], "actual": [23, 25], "ad": [23, 25, 26, 27, 30, 32, 36], "adapt": [9, 27, 35], "add": [0, 23, 26, 28, 32, 36], "add_dataset": [27, 32], "add_dataset_to_us": [27, 32], "add_datasets_via_yaml": [27, 32], "add_us": [27, 32], "add_user_with_budget": [27, 32], "add_users_via_yaml": [27, 32], "addit": [0, 6, 9, 24, 25, 26, 27, 30, 36], "addition": 5, "address": [12, 32, 36], "adeli": [23, 24, 25, 26, 27], "adjust": 0, "admin": [0, 9, 23, 24, 26, 27, 36], "admin123": 27, "admin_databas": [12, 27, 37], "admindbtyp": [12, 37], "administr": [2, 5, 9, 12, 36, 37, 38], "adminyamldatabas": 2, "advanc": [23, 26], "advis": [9, 26], "affect": [23, 25], "after": [23, 25, 27, 28], "afterward": [23, 25, 28], "ag": 27, "again": [2, 10, 23, 24, 25, 28], "against": 12, "age_max": 28, "age_min": 28, "age_transformation_pipelin": 28, "aggreg": 6, "agre": [23, 25], "ahead": 0, "aim": [7, 9, 11, 12, 23, 24, 25, 27, 37], "aimsynthes": 26, "ak": 35, "algorithm": 26, "alic": [23, 24, 25, 26, 27], "all": [0, 6, 8, 9, 11, 23, 24, 25, 28, 32], "alloc": [9, 27], "allow": [23, 27, 28, 32, 38], "alreadi": [9, 23, 25, 27], "alreai": 27, "also": [0, 2, 6, 9, 23, 24, 25, 26, 27, 28, 30, 36], "altern": [25, 27], "alwai": [0, 11, 24, 32], "among": [23, 25, 26, 27], "an": [0, 2, 5, 11, 22, 23, 24, 25, 26, 27, 36], "analys": [6, 9, 25], "analysi": [0, 23, 25], "ani": [8, 9, 11, 23, 24, 25, 26, 27, 28], "annot": 22, "anonimizationtransform": 11, "anoth": [0, 23, 24, 25, 26, 27, 28], "antarctica": [23, 24, 25], "antartica": [23, 24, 25, 26, 27], "anti_timing_att": [12, 37], "any_queri": 8, "anywai": 25, "api": [0, 9, 12, 27, 33, 36], "app": [0, 27, 32, 37], "app_url": [8, 23, 24, 25, 26, 28], "append": [24, 25, 26], "appli": [23, 24, 28], "applic": [6, 23, 24, 25, 26, 28, 36], "approv": 0, "appvers": 0, "ar": [0, 1, 2, 5, 6, 9, 11, 23, 24, 25, 26, 27, 28, 33], "architectur": 9, "archiv": [0, 6, 9, 32], "arg": [24, 27], "argument": [11, 24, 27], "around": 25, "arrai": [23, 24], "arxiv": 9, "ask": [23, 25, 28], "aspect": 9, "assert_almost_equ": 25, "assign": [23, 25, 27], "associ": [0, 8, 9, 23, 25, 26, 27], "ast": 27, "atomdomain": 23, "attack": 12, "attent": 9, "authent": 9, "authoris": 5, "autom": [0, 1], "automat": [0, 2, 26, 36], "avail": [9, 11, 23, 24, 25, 26, 27, 30, 33, 35, 36], "avala": 0, "averag": 25, "avg": [23, 25, 28], "avg_0": 25, "avg_1": 25, "avg_2": 25, "avg_ag": 28, "avg_bill_length": [23, 25], "avg_bill_length_mm": [23, 25], "avg_bill_length_queri": 23, "avg_bill_length_respons": 25, "avoid": [11, 25], "aw": 32, "aws_access_key_id": 27, "aws_secret_access_kei": 27, "b": 0, "back": [24, 26], "base": [2, 5, 11, 12, 16, 22, 23, 24, 25, 26, 27, 28, 32], "baselmodel": 0, "basemodel": [0, 22], "basic": [12, 37], "basic_dataset_stor": [12, 37], "batch_siz": 26, "bd_bound": 26, "becaus": [23, 24, 26, 28], "beeen": 23, "been": [9, 24, 27], "befor": [0, 23, 25, 26, 27, 35], "begin": 35, "behaviour": [23, 24], "being": 8, "below": [0, 8, 9, 23, 35], "best": [23, 24, 34], "better": [23, 25], "between": [24, 25, 26], "bf": 9, "big": 23, "bigger": 25, "biggest": 24, "bill": [24, 25], "bill_depth_meta": 24, "bill_depth_mm": [23, 24, 25, 26, 27], "bill_length": 26, "bill_length_max": 23, "bill_length_meta": 24, "bill_length_min": 23, "bill_length_mm": [23, 24, 25, 26, 27], "bill_length_transformation_pipelin": 23, "bin": 26, "bind": 27, "bintransform": 26, "bird": 25, "bisco": [23, 24, 25, 26, 27], "bit": [25, 27], "bl_bound": 26, "black": 0, "blob": 12, "blocker": 24, "blog": 9, "bob": 27, "bodi": [23, 24, 25], "body_mass_g": [23, 24, 25, 26, 27], "bool": [11, 22], "boolean": [27, 28], "both": 0, "bound": [23, 24, 25, 26, 27, 28], "boundari": [11, 12], "bounds_i": 24, "bounds_x": 24, "breviti": 9, "broken": 23, "browser": 36, "bucket": [12, 22, 27, 32, 36], "budget": [0, 5, 9, 11, 24, 26, 30, 32], "budgetaccount": [23, 24], "bug": 9, "buget": [23, 25], "build": 0, "build_doc": 0, "built": 36, "button": 38, "c": [0, 24, 27, 28, 32], "cabin": [27, 28], "cach": 16, "call": [9, 23, 24, 25, 26, 27, 28], "can": [0, 2, 6, 8, 9, 11, 16, 23, 25, 26, 28, 30, 33, 34, 35, 36, 38], "cannot": [23, 24, 28], "capabl": 23, "cardin": [23, 24, 25, 26, 27, 28], "care": [0, 9, 23, 25], "carri": 27, "case": [0, 11, 23, 24, 26], "categor": [12, 24, 26, 37], "categori": [23, 24, 25, 26, 27, 28], "cd": [0, 36], "cell": [11, 23, 24], "censor_dim": [12, 22, 23, 24, 25, 26, 27], "center": 24, "certain": [11, 26, 27, 30], "certifi": 23, "ch": [0, 9, 36], "chaintransform": 26, "chang": [16, 23, 25, 35], "change_one_dist": [12, 37], "changeonedist": 12, "chapter": [35, 36], "charset": 23, "chart": [0, 9, 34], "check": [1, 5, 24, 25, 26, 27, 28], "chekck": 26, "chinstrap": [23, 24, 25, 26, 27], "chmod": 0, "choic": 32, "choos": [23, 24, 25, 26, 34, 38], "ci": 0, "ci_95_lower_bound": 25, "ci_95_upper_bound": 25, "clamp": 26, "clamptransform": 26, "class": [0, 11, 12, 16, 22, 23, 24], "classic": 9, "classif": 23, "classifi": 23, "classvar": 22, "clean": [27, 32], "cleaner": 27, "clear": 27, "cli": 30, "click": 38, "client": [0, 3, 6, 7, 27], "client_input": [23, 24, 26], "clone": 36, "close": [23, 25], "cloud": 35, "cluster": [9, 34, 35], "code": [0, 8, 9, 11, 23, 24, 26, 27], "codebas": 27, "codeql": 0, "col": [23, 24], "col_nam": [23, 28], "coldheart": 27, "collect": [22, 23, 25, 27], "collection_model": [12, 37], "cols_metadata": [23, 24], "column": [11, 12, 22, 23, 24, 25, 26, 27, 28], "column_nam": 23, "com": [0, 9, 12, 27, 36], "come": 5, "command": [0, 8, 23, 24, 25, 26, 27, 28, 30, 32, 35, 36], "commonli": 9, "commun": 35, "compar": [23, 25], "complet": [0, 27], "compon": 9, "components_": 24, "compos": [9, 27, 33, 36], "comput": [22, 24, 25, 26, 28], "computedfieldinfo": 22, "concept": 9, "condit": [6, 11, 12, 22, 23], "config": [2, 12, 27, 36, 37], "configdict": 22, "configkei": [12, 37], "configur": [0, 9, 12, 22, 27, 33, 35], "conflict": 23, "conform": 22, "connect": [9, 23, 25, 30], "consist": 0, "consol": 36, "constant": [0, 23, 27, 28, 37], "constraint": [0, 11, 12, 22, 23, 26], "construct": 10, "constructor": 11, "contact": 5, "contain": [0, 11, 27, 35, 36], "content": [7, 37], "continu": [9, 12, 26, 37], "contribut": 0, "convert": 11, "copi": 24, "correct": 9, "correspond": 22, "cost": [0, 11, 22, 26], "cost_r": [23, 24, 28], "could": [23, 24, 25, 26, 27], "count": [25, 28], "cours": [23, 25, 28], "cover": 30, "creat": [0, 6, 23, 24, 25, 28, 32, 33, 36], "creation": 27, "credenti": 9, "credentials_nam": [12, 22], "credit": [23, 24, 25, 26], "critic": 25, "critical_valu": 25, "cryptograph": [11, 26], "csv": 27, "ctrl": 27, "cube": [12, 37], "curios": 23, "current": [9, 11, 27], "custom": [0, 5, 11, 35, 38], "d": [27, 32], "d_path": [27, 32], "dai": 27, "daisi": 27, "dashboard": 30, "data": [6, 11, 12, 24, 26, 27, 28, 30, 32, 36], "data_connector": [0, 12, 27, 37], "data_connector_factori": 0, "data_connector_observ": [12, 37], "data_norm": 24, "databas": [2, 5, 9, 12, 23, 24, 25, 26, 28, 30, 32, 36], "database_typ": [12, 22, 27, 32], "dataconnector": [0, 16], "dataconnectorobserv": [12, 16], "datafram": [0, 5, 11, 23, 24, 25, 26, 28], "datalab": 38, "dataset": [5, 6, 8, 9, 11, 12, 16, 22, 36], "dataset_collect": 27, "dataset_nam": [8, 11, 12, 22, 23, 24, 25, 26, 27, 28, 32], "dataset_path": [12, 22, 27, 32], "dataset_stor": [0, 12, 27, 37], "dataset_store_factori": 0, "dataset_store_typ": [12, 37], "datasetofpathdb": [12, 22], "datasetofs3db": [12, 22], "datasetofus": [12, 22], "datasets_list": [12, 22, 27], "datasetscollect": [12, 22], "datasetstor": [0, 16], "datasetstoretyp": [0, 12, 37], "date": [0, 1], "datetim": [12, 37], "dateutil": 23, "db": [12, 27, 32, 37], "db_a": 32, "db_n": 32, "db_name": 32, "db_p": 32, "db_pwd": 32, "db_type": [12, 37], "db_type_mongodb": [12, 37], "db_u": 32, "de": 29, "decid": [23, 24, 25, 26, 27], "decim": 25, "decisiontreeclassifi": 24, "decod": [26, 27], "decreas": [5, 26], "deduc": 23, "def": [23, 24, 25, 27], "default": [0, 6, 11, 22, 23, 24, 25, 27, 32, 33, 35, 36], "defaultdb": 32, "defin": [22, 23, 24, 25], "del": 32, "del_dataset": [27, 32], "del_dataset_to_us": [27, 32], "del_us": [27, 32], "delet": [1, 27, 32], "delta": [11, 12, 22, 23, 24, 25, 26, 27, 28, 32], "delta_cost": [23, 24, 25, 26, 28], "demand": 38, "demo": 6, "demo_client_notebook_newlibrari": 0, "demonstr": [6, 27, 30], "dep": 0, "depend": [0, 33, 36, 38], "deploi": [0, 5, 9, 33, 34], "deploy": [0, 9, 33, 36, 38], "depth": [23, 24, 25, 26], "describ": [5, 11], "deseri": [9, 11], "deserialis": [0, 11], "detail": [0, 23, 25, 26, 27, 32], "determin": 24, "develop": [0, 9, 23, 24, 25, 26, 27, 28, 36, 38], "develop_mod": [12, 37], "deviat": 25, "df": [11, 23, 25, 28], "df_dummi": [23, 25, 28], "df_flipper": 25, "dict": [0, 11, 22], "dictionari": [11, 22, 23, 25, 26, 27], "dictionnari": [11, 26], "did": [23, 24, 25, 26], "differ": [0, 2, 6, 9, 11, 23, 24, 25, 26, 27, 28], "differenti": [5, 6, 9, 23, 24, 25, 28], "diffprivlib": [0, 6, 7, 11, 12, 17, 22, 37], "diffprivlib_json": [12, 22, 23, 24], "diffprivlib_logg": 0, "diffprivlib_queri": [7, 11, 23, 24], "diffprivlibcompatibilitywarn": [11, 24], "diffprivlibmodel": [12, 22], "diffprivlip": 11, "dimens": [23, 24, 25], "dimensinn": 24, "direct": 9, "directli": [0, 26, 32, 33], "directori": [2, 35, 36], "disabl": 26, "disabled_dp": 11, "disclaim": 9, "disclosur": [6, 23, 26], "discov": [2, 25, 34], "discrimin": 22, "discriminator_decai": 26, "discriminator_dim": 26, "discriminator_lr": 26, "displai": 23, "dispos": [23, 25], "dist": 1, "distribut": 25, "diverg": 12, "divers": 9, "do": [0, 2, 5, 8, 23, 24, 25, 26, 32], "doc": [0, 11, 12], "docker": [0, 30, 32, 34, 36], "dockercli": 27, "dockerfil": 36, "document": [0, 1, 9, 11, 23, 24, 26, 34], "doe": [5, 11, 23, 24, 25, 26], "don": [23, 35], "done": [23, 24, 25, 26, 27], "down": 27, "download": 9, "dp": [6, 11, 12, 28], "dp_ctgan": [7, 11, 12, 37], "dp_gan": [7, 11, 12, 37], "dp_librairi": [23, 24, 26], "dp_librari": [0, 12, 17, 37], "dp_logic": [12, 37], "dp_queri": [0, 12, 27, 37], "dp_querier": [0, 12, 37], "dpctgan": [6, 11, 12], "dpgan": [6, 11, 12], "dpl_pipelin": [23, 24], "dplibrari": [0, 7, 11, 12, 37], "dpquerier": 0, "dpserial": 25, "dr": [23, 24, 25, 26, 27], "dream": [23, 24, 25, 26, 27], "drop": [11, 23, 24, 32], "drop_collect": [27, 32], "ds_store_typ": 12, "dscc": [0, 9, 36], "dtc": 24, "due": [5, 11, 25], "dummi": [0, 6, 11, 22], "dummmi": 26, "dummy_dataset": [12, 37], "dummy_nb_row": [11, 12, 22], "dummy_new_library_queri": 0, "dummy_r": [23, 25, 28], "dummy_respons": [23, 24], "dummy_se": [11, 12, 22], "dummy_synth_df": 23, "dummy_var_r": [23, 28], "dummydiffprivlibmodel": [12, 22], "dummynewlibrarymodel": 0, "dummyopendpmodel": [12, 22], "dummysmartnoisesqlmodel": [12, 22], "dummysmartnoisesynthquerymodel": [12, 22], "dure": [0, 2, 11], "e": [9, 11, 23, 32], "each": [9, 23, 24, 25, 26, 27, 28], "easili": 38, "eco_branch": 27, "edit": 35, "educ": 27, "effect": 23, "effici": [9, 32], "either": 25, "ek": 35, "embark": [27, 28], "embedding_dim": 26, "empti": 27, "en": [9, 12], "enabl": [9, 23, 24, 25, 26, 28], "encount": [11, 24, 28], "end": 11, "endpoint": [0, 23, 24, 25, 26, 28, 32, 36], "endpoint_url": [12, 22, 27, 32], "engin": 27, "enhanc": 9, "enough": [5, 11, 23, 25], "ensembl": 6, "ensur": [0, 9, 11, 23, 24, 25, 27, 33, 36], "entir": 0, "enum": 11, "environ": [0, 2, 9, 23, 24, 25, 26, 28, 32, 36], "epsilon": [11, 12, 22, 23, 24, 25, 26, 27, 28, 32], "epsilon_cost": [23, 24, 25, 26, 28], "equal": [23, 25, 28], "err_msg": 25, "error": [0, 11, 23, 24, 25, 26, 27, 28], "error_handl": [12, 37], "error_messag": [7, 11], "escal": 5, "especi": 35, "establish": 32, "estim": [0, 11, 26], "estimate_cost": 25, "estimate_diffprivlib_cost": [7, 11, 23, 24], "estimate_new_library_cost": 0, "estimate_opendp_cost": [7, 11, 23, 28], "estimate_smartnoise_cost": 23, "estimate_smartnoise_sql_cost": [7, 11, 23, 25, 28], "estimate_smartnoise_synth_cost": [7, 11, 23, 26], "etc": [0, 2, 9, 30], "even": [23, 25], "event": [0, 2], "everi": [0, 23, 25, 27], "everyth": [23, 27], "exact": 25, "exactli": 23, "exampl": [0, 5, 9, 22, 24, 25, 27, 30, 36], "example_config": 27, "example_dummy_new_librari": 0, "example_new_librari": 0, "example_queri": 22, "except": [2, 11, 23, 24], "exec_run": 27, "execresult": 27, "execut": [0, 2, 9, 11, 26, 27, 28, 33], "exisit": 27, "exist": [1, 5, 27, 32], "exit": 27, "expect": [0, 23, 24, 25, 27, 28], "experi": 26, "explain": [0, 23, 24, 25, 26, 27, 30], "explained_variance_": 24, "explained_variance_ratio_": 24, "explan": [0, 26], "explor": [25, 34], "extens": 9, "extern": [5, 9], "externallibraryexcept": [24, 26], "f": [23, 24, 25, 28, 32, 35], "f64": 23, "face": 9, "facilit": [9, 30], "factori": [0, 12, 17, 37], "fail": [0, 5, 23, 28], "failur": 5, "fall": 24, "fals": [11, 22, 23, 24, 25, 26, 27, 28, 32], "familiar": 30, "far": 9, "fare": [27, 28], "fastapi": [0, 9], "featur": [0, 6, 11, 23, 24], "feature_column": [11, 12, 22, 23, 24], "feder": 9, "feedback": 9, "femal": [23, 24, 25, 26, 27, 28], "fetch": 27, "few": [23, 24, 25, 26, 27, 28, 36], "field": [11, 22, 23, 25, 27, 32], "fieldinfo": 22, "file": [0, 9, 12, 32, 35, 36], "filenam": 23, "fill": 24, "final": [23, 24, 25, 26], "find": [6, 25, 38], "fine": [25, 38], "finish": [0, 27], "first": [0, 23, 24, 25, 26, 27, 28, 36], "fit": [24, 26, 34, 35], "fit_intercept": 24, "fix": [0, 5], "fixed_delta": [11, 12, 22, 23], "fixed_smoothed_max_diverg": [12, 37], "flag": [23, 25, 26], "flake8": 0, "flipper": [23, 24], "flipper_length_mm": [23, 24, 25, 26, 27], "flipper_length_respons": 25, "float": [11, 22, 23, 24, 25, 26, 27, 28], "fly": 23, "folder": 0, "follow": [0, 1, 8, 9, 23, 27, 35, 36, 38], "folow": 38, "fonction": [23, 25], "forc": 11, "forest": 23, "forget": [0, 23], "format": [0, 11, 22, 23, 25, 26, 27], "found": [27, 30], "fr": 27, "franc": 38, "frequent": [11, 24], "from": [0, 2, 5, 8, 9, 11, 22, 23, 24, 25, 26, 27, 28, 32], "frostina": 27, "fso": [8, 27], "fso_dpseri": 25, "fso_income_synthet": 27, "fso_income_synthetic_metadata": 27, "full": 24, "func": 27, "function": [0, 8, 9, 11, 23, 24, 25, 26, 27, 28, 32], "function_map": 27, "functionn": [0, 6, 24, 26], "further": [0, 11], "futur": 9, "g": [9, 11, 28], "gan": [6, 11, 12, 37], "gaussiannb": 24, "gave": [23, 25], "gener": [0, 2, 11, 23, 26], "generator_decai": 26, "generator_dim": 26, "generator_lr": 26, "gentoo": [23, 24, 25, 26, 27], "get": [1, 11, 22, 27, 32, 35, 36], "get_arch": [27, 32], "get_bound": [23, 24], "get_collect": [27, 32], "get_dataset": [27, 32], "get_dataset_metadata": [7, 11, 23, 24, 25, 26, 28], "get_dummy_dataset": [7, 11, 23, 25, 28], "get_initial_budget": [7, 11, 23, 25, 28], "get_metadata": [27, 32], "get_pandas_df": 0, "get_previous_queri": [7, 11, 23, 24, 26], "get_queri": 0, "get_remaining_budget": [7, 11, 23, 25, 28], "get_total_spent_budget": [7, 11, 23, 25, 28], "get_us": [27, 32], "get_user_dataset": [27, 32], "getdbdata": [12, 22], "getdummydataset": [12, 22], "git": 36, "github": [1, 2, 6, 9, 12, 23, 24, 30, 36], "githubusercont": 27, "give": [0, 23, 24, 25, 26, 27, 28], "given": [0, 9, 23, 24, 25, 26, 27, 32], "gke": 35, "go": [25, 26, 27, 36], "goe": 25, "good": [23, 25], "got": 1, "gramm": 23, "grounbdbreak": [23, 24, 25], "group": 25, "gt": [22, 23, 26, 27], "guess": [23, 24, 25], "guid": [8, 35], "guidanc": 34, "h": [27, 28], "h_0": 25, "h_a": 25, "ha": [9, 11, 23, 24, 25, 26, 27], "hackathon": 9, "had": [23, 25, 27], "hamming_dist": [12, 37], "hammingdist": 12, "handl": [0, 9, 11, 12], "handler": 0, "happen": [5, 23], "harsh": 23, "hasn": 24, "have": [0, 2, 5, 8, 23, 24, 25, 27, 28, 35, 36], "haven": 35, "he": 27, "head": [0, 23, 25, 26, 28], "heard": 27, "helm": [0, 9, 34], "help": [5, 6, 27], "henc": [23, 25, 26], "her": [23, 24, 25, 26, 27, 28], "here": [0, 6, 9, 11, 23, 24, 25, 26, 33, 35], "hesit": 27, "hi": 27, "high": [23, 25, 28], "him": 27, "hold": 27, "home": 9, "how": [0, 6, 9, 23, 24, 25, 26, 27, 30, 32, 34, 36], "howev": [9, 23, 25], "html": [9, 11, 12, 23, 24], "http": [0, 9, 11, 12, 23, 24, 25, 26, 27, 28, 36], "hypothes": 25, "i": [0, 1, 2, 5, 8, 9, 10, 11, 23, 24, 25, 26, 27, 28, 32, 33, 35, 36, 38], "icebergina": 25, "icerbegina": [23, 25], "icergina": [23, 24, 25, 26], "id": 32, "idea": [23, 25], "idna": 23, "ignor": [0, 24], "iloc": [23, 25, 28], "imag": [0, 23, 36], "image_demo_cli": 23, "impact": [23, 25, 28], "implement": [9, 16], "import": [8, 23, 24, 25, 26, 27, 28], "improv": 9, "imput": [11, 24], "imputer_strategi": [11, 12, 22, 23, 24], "in_memory_connector": [12, 37], "includ": [9, 11], "incom": [9, 27], "income_synthetic_data": 27, "incompat": 24, "inde": 27, "index": [9, 11, 23], "index_nam": 23, "infer": 11, "info": 27, "inform": [0, 2, 9, 22, 23, 24, 25, 26, 27, 28, 32], "infrastructur": [9, 34], "inherit": 0, "ini": 0, "init": [23, 25, 28], "initi": [8, 11, 25, 27, 28, 32, 38], "initial_delta": [12, 22, 23, 25, 27, 28, 32], "initial_epsilon": [12, 22, 23, 25, 27, 28, 32], "initialis": [6, 8], "inptu": 23, "input": [0, 9, 12, 22], "input_domain": 23, "input_metr": 23, "inse": 38, "insert_delete_dist": [12, 37], "insertdeletedist": 12, "insid": [0, 27, 36], "instal": [0, 2, 6, 9, 27, 34, 36], "instanc": [5, 16, 26, 36], "instanti": [23, 28], "instead": [23, 25, 32], "instruct": [8, 23, 32, 34, 35, 36], "int": [11, 22, 27, 28], "int_dist": [12, 37], "integr": [2, 9], "intend": [11, 25], "intent": 27, "interact": [9, 23, 24, 25, 26, 27, 28, 32, 33, 36], "interest": [25, 27], "intern": 5, "intervent": 0, "introduct": 34, "invalid": [5, 28], "invalidqueryexcept": [23, 28], "investig": 27, "io": 23, "ipykernel_1062": 28, "ipynb": 0, "ipython": 23, "iri": 27, "iris_metadata": 27, "irrelev": 25, "island": [23, 24, 25, 26, 27], "issu": [0, 5, 9, 24], "item": 0, "its": [8, 9, 11, 26, 27, 36], "jack": [27, 28], "jax": 26, "jaxlib": 26, "jitter": [12, 37], "joblib": 23, "join": [24, 25, 26], "journ\u00e9": 29, "jupyt": [23, 24, 27, 36], "just": [23, 24, 25, 26, 27, 28], "keep": [6, 23, 27], "kei": [12, 22, 23, 27, 28, 32], "kept": [23, 24, 26], "keyword": 11, "kind": 35, "kmean": 24, "kmeanskmean": 24, "know": [23, 25, 26, 28], "kubectl": 35, "kubernet": [9, 30, 34], "l": [27, 28], "l2": 24, "lab": [9, 27], "label": 23, "labeltransform": 26, "lambda": [11, 27], "lancer": 38, "laplacian": [23, 28], "larg": 25, "last": [26, 27, 36], "last_queri": 26, "later": [10, 27], "latest": 0, "layer": 9, "le": 22, "leak": 24, "leakag": 24, "learn": [25, 34], "len": [23, 27], "length": 24, "less": 25, "let": [0, 25, 26, 27], "level": 25, "lib": [23, 24, 26], "librair": 23, "librairi": [11, 23], "librari": [5, 6, 8, 9, 11, 12, 27], "like": [23, 24, 25, 26, 35], "limit": [23, 24, 25, 26], "linalg": 24, "line": [27, 32, 35], "linearregress": 24, "link": [0, 9, 38], "linter": 0, "linux": 2, "list": [0, 11, 22, 23, 26, 27, 32], "list_synthes": 26, "liter": 22, "literal_ev": 27, "littl": 25, "load": [23, 24], "local": [0, 2, 9, 22, 23, 24, 25, 26, 28, 30, 34, 35], "localhost": [33, 36], "locat": [36, 38], "logger": [12, 23, 37], "logic": [9, 24], "logist": 6, "logisticregress": 24, "loma": [0, 1, 2, 6, 8, 11, 28, 32, 34, 35, 36], "lomas_cli": [0, 3, 4, 8, 9, 23, 24, 25, 26, 28], "lomas_client_dev": 27, "lomas_serv": [0, 2, 3, 11, 23, 24, 25, 26, 28, 31], "lomas_server_dev": 27, "lomas_streamlit_dev": 27, "long": 8, "look": [23, 25, 27], "lord": 27, "loss": 24, "lot": 25, "lower": [23, 24, 25, 26, 27, 28], "lower_bound": [23, 25, 28], "lr": 24, "lru": [12, 37], "lru_cach": 12, "lru_dataset_stor": [12, 37], "lru_dataset_store_max_s": [12, 37], "lrudatasetstor": 16, "lt": [22, 23, 26, 27], "m": 2, "m_db": [27, 32], "m_s3_ak": 32, "m_s3_sak": 32, "m_s3_url": 32, "m_s3b": 32, "m_s3k": 32, "machin": [34, 35, 36], "madam": 27, "made": [0, 23, 24, 25, 26], "mai": [5, 11, 27, 32, 38], "main": [0, 9, 12], "maintain": 36, "make": [0, 2, 22, 23, 24, 25, 27, 28, 30, 35, 36], "make_dummi": [12, 22], "make_gaussian": 11, "make_select_column": [23, 28], "make_split_datafram": [23, 28], "make_zcdp_to_approxdp": 11, "male": [23, 24, 25, 26, 27, 28], "malici": 27, "manag": [9, 23, 24, 26, 27, 30, 32], "mani": 9, "manual": 0, "map": 22, "margin": [11, 12], "mass": [23, 24, 25], "master": [0, 9, 27], "match": 11, "max": 24, "max_depth": [23, 24], "max_diverg": [12, 37], "max_id": [12, 22, 23, 24, 25, 26, 27, 28], "max_it": 24, "max_memory_usag": 12, "max_model_s": 26, "max_retries_exp_mechan": 26, "maxdiverg": 23, "maximum": 25, "may_queri": [12, 22, 27], "mbi": 26, "mcfreez": 27, "md": [1, 9], "mea": [23, 28], "mean": [11, 23, 25], "mean_": 24, "measur": [5, 11, 12, 23, 28], "measure_onli": 26, "mechan": [5, 11, 12, 22, 23], "medata": 27, "median": [11, 24], "memori": [0, 12, 16], "merg": 0, "messag": [5, 11, 24, 26, 27], "meta": 27, "metadata": [6, 9, 11, 12, 22, 27, 32, 36], "metadata_access_key_id": 32, "metadata_bucket": 32, "metadata_database_typ": 32, "metadata_endpoint_url": 32, "metadata_kei": 32, "metadata_path": [12, 22, 27, 32], "metadata_secret_access_kei": 32, "metadataofdataset": [12, 22], "metadataofpathdb": [12, 22], "metadataofs3db": [12, 22], "metatada": 32, "method": [0, 12, 16, 24, 27, 33, 34], "metric": [12, 23], "micro": 9, "might": [23, 25, 27, 28], "mind": 27, "minikub": 35, "minio": [27, 36], "miss": [11, 24, 26], "mistak": 23, "mixtureinfer": 26, "ml": 24, "mm": [23, 25], "mod": 12, "mode": [27, 36], "model": [6, 9, 11, 12, 22, 26], "model_computed_field": [12, 22], "model_config": [12, 22], "model_field": [12, 22], "model_input_to_lib": 0, "model_scor": 23, "modifi": [23, 24, 26, 27, 34], "modul": [7, 9, 23, 24, 27, 37], "mondai": 0, "mongo": 27, "mongodata": [27, 36], "mongodb": [2, 5, 9, 12, 30, 36, 37], "mongodb_addr": [12, 37], "mongodb_admin": [2, 27, 37], "mongodb_admin_cli": [27, 32, 37], "mongodb_databas": [12, 37], "mongodb_port": [12, 37], "more": [0, 2, 23, 24, 25, 26, 27], "most": [11, 24, 27], "most_frequ": [11, 24], "mount": 27, "move": 36, "mp": [27, 32], "mr": 27, "mst": [7, 11, 12, 37], "much": [23, 24, 25], "multi": 23, "multipl": [23, 24, 25, 27, 30], "must": [0, 11, 23, 24, 25, 26, 27, 28, 32, 36], "mwaskom": 27, "mwem": [7, 11, 12, 37], "my_own_constraint": 26, "mypi": 0, "n": [23, 24], "n_cluster": 24, "n_compon": 24, "n_components_": 24, "n_estim": [23, 24], "n_job": [23, 24], "name": [0, 8, 9, 11, 12, 22, 23, 24, 25, 26, 27, 28, 32], "name_of_dataset_you_want_to_queri": 8, "nan": [25, 28], "navig": [35, 36], "nb_0": 25, "nb_1": 25, "nb_2": 25, "nb_passeng": 28, "nb_penguin": [23, 25], "nb_row": [11, 23, 24, 25, 28], "nb_sampl": [11, 12, 22, 23, 26], "nbsp": [23, 24], "nbviewer": [23, 24], "necessari": [0, 9], "need": [0, 1, 23, 24, 25, 26, 27, 28, 34, 35, 36, 38], "needi": 26, "network": 36, "never": [0, 5, 9, 23, 24, 25, 26], "new": [0, 23, 27], "new_data_connector": 0, "new_dataset_stor": 0, "new_librari": 0, "new_library_queri": 0, "newdataconnector": 0, "newdatasetstor": 0, "newlibrari": 0, "newlibrarycostmodel": 0, "newlibrarymodel": 0, "newlibraryqueri": 0, "nobodi": [23, 25], "nois": [23, 25, 26, 28], "noise_variance_": 24, "noisi": 25, "none": [11, 12, 16, 22, 23, 24, 26], "nonetyp": 22, "norm": 24, "normal": 23, "note": [11, 26, 27, 32], "notebook": [0, 6, 23, 24, 25, 26, 27, 30, 36], "noth": 27, "notic": 23, "notifi": 16, "now": [8, 23, 25, 26, 28, 32, 36], "np": [23, 24, 25, 26, 28], "nso": 9, "null": [11, 23, 24, 25], "nullabl": [11, 12, 22, 23, 26], "number": [0, 11, 23, 25, 26, 36], "numpi": [23, 24, 25, 26, 28], "o": [24, 25, 26, 28, 32], "object": [0, 11, 16, 22, 23, 24, 25, 26, 27, 28], "oblivi": 9, "obtain": [23, 25], "occur": 5, "od": [27, 32], "off": 0, "offer": [23, 24, 25, 26, 27], "offic": 9, "offici": 35, "ofs_dpseri": 25, "ok": 26, "old": 28, "om": [27, 32], "onc": [0, 23, 24, 25, 26, 27, 28, 35, 36, 38], "one": [0, 1, 8, 23, 24, 25, 26, 27, 28, 35], "ones": 27, "onli": [0, 9, 11, 23, 24, 25, 26, 27, 28, 33, 36], "onyxia": [30, 34], "open": [8, 9, 36], "opendp": [0, 5, 6, 7, 9, 11, 12, 17, 22, 25, 37], "opendp_json": [12, 22, 23], "opendp_logg": 0, "opendp_pipelin": [11, 23, 28], "opendp_queri": [7, 11, 23, 28], "opendpdatasetinputmetr": [12, 37], "opendpmeasur": [12, 37], "opendpmodel": [12, 22], "oper": [5, 27], "opportun": 25, "option": [0, 11, 23, 25, 26, 32, 34, 38], "optionn": 28, "optionnali": 23, "order": [0, 23, 25, 27], "org": [9, 11, 12, 23, 24], "origin": 9, "other": [6, 9, 16, 23, 25, 26, 27], "otherwis": [0, 11, 27], "our": [6, 9, 27, 29, 30], "out": [23, 27], "output": [25, 27], "output_measur": 23, "overal": 9, "overview": [0, 30], "overwrit": [27, 32], "overwrite_dataset": [27, 32], "overwrite_metadata": [27, 32], "own": [0, 9, 26, 27], "owner": [9, 27, 30, 32], "p": [1, 27, 28], "pac_synth": [7, 11, 12, 37], "packag": [0, 4, 7, 23, 24, 26, 31, 37], "pacsynth": [11, 12, 26], "page": [0, 9, 10, 23, 24, 25, 26, 27], "panda": [11, 23, 24], "panic": 11, "paper": 9, "param": [23, 24], "paramat": 26, "paramet": [0, 5, 6, 8, 11, 23, 24, 25, 27, 28, 32, 38], "parch": [27, 28], "part": [0, 9], "particip": [23, 25], "particularli": [23, 28], "pass": [0, 11, 27], "passeng": 28, "passengerid": [27, 28], "password": 32, "pate_ctgan": [7, 11, 12, 37], "pate_gan": [7, 11, 12, 37], "patectgan": [6, 11, 12], "pategan": [6, 11, 12], "path": [12, 22, 24, 25, 26, 27, 32, 37], "path_connector": [12, 37], "path_db": [12, 22, 27, 32], "patient": 36, "pca_model": 24, "pcaifittedpca": 24, "pclass": [27, 28], "pd": [11, 23, 24], "penguin": [6, 23, 24, 26, 27], "penguin_metadata": [23, 24, 26, 27], "perform": [0, 24, 25, 27, 32], "permiss": [9, 23], "persist": [27, 36], "pet": 9, "petal_length": 27, "petal_width": 27, "pip": [0, 8, 23, 24, 25, 26, 27, 28], "pipelin": [0, 5, 11, 26, 28], "pipelineifittedpipelin": [23, 24], "place": [0, 27], "platform": [9, 23, 24, 30, 38], "pleas": [0, 2, 9, 10, 11, 23, 24, 26, 36], "png": 23, "point": 9, "port": [12, 27, 32], "possibl": [0, 2, 12, 23, 24, 25, 26, 28, 32], "post": 25, "post0": 23, "postprocess": [11, 12, 22, 25], "potenti": [9, 25, 26], "power": [23, 25], "pr": 0, "practic": [6, 23], "pre": 12, "predefin": 0, "predict": [11, 23, 24], "prefer": 25, "prepar": [0, 9, 24, 25, 26, 32], "prerequisit": 34, "present": [8, 23, 25, 29], "previou": [0, 11, 23, 27, 28, 32], "previous": [23, 24, 25, 26], "previous_queri": [23, 24, 26], "primari": 9, "print": [23, 25, 27, 28, 32], "prior": 24, "prioriti": 9, "privaci": [0, 5, 9, 11, 24, 25], "privacyleakwarn": [11, 24], "privat": [6, 9, 11, 12, 24, 25], "private_id": [12, 37], "privatedatabasetyp": [12, 22, 37], "problem": [23, 25], "proce": 35, "process": [0, 1, 9, 12, 23, 24, 25, 26, 28, 35, 36, 38], "profess": 27, "project": [0, 9, 23, 24, 25, 26, 38], "promis": [23, 25], "proof": 9, "properli": [23, 25], "proport": 11, "protect": [9, 24], "provid": [8, 9, 11, 23, 24, 25, 26, 27, 28, 30, 32, 34, 35, 36], "pseudo": 26, "public": [23, 24, 25, 26], "publish": 0, "pull": [0, 2, 36], "purpos": 27, "push": [0, 2], "py": [0, 1, 24, 26, 27, 28, 32], "pydant": [0, 22], "pylint": 0, "pylintrc": 0, "pymongo": 5, "pypa": 23, "pypi": 9, "pypi_token": 1, "pyproject": 0, "python": [1, 2, 8, 12, 23, 27, 32], "python3": [23, 24, 26], "pytorch": 26, "pytz": 23, "q": [27, 28], "quail": 11, "qualiti": 0, "qualnam": [11, 12], "queen": [23, 24, 25, 26], "queri": [0, 5, 6, 9, 11, 12, 22, 32], "querier": 0, "querier_factori": 0, "queries_arch": 32, "query_1": 24, "query_2": 24, "query_3": 24, "query_exampl": [0, 12, 37], "query_model": [0, 12, 37], "query_respons": [23, 24, 25, 26, 28], "query_str": [12, 22, 23], "quit": 0, "r": 12, "rais": [11, 24, 27], "random": [11, 23, 25, 26], "random_st": [11, 23, 24], "randomforestclassifi": [23, 24], "randomforestclassifierrandomforestclassifi": 23, "randomli": 23, "randomst": 11, "rang": 23, "raw": 27, "re": [8, 11, 23, 24, 25, 26, 27], "readi": [23, 24, 25, 26, 27], "readili": 0, "readm": [1, 9], "real": [0, 24, 26], "realli": [23, 25], "reasearch": 9, "reason": [5, 23, 24], "rebas": 0, "receiv": 26, "recent": 27, "recommend": [23, 25], "reduc": [24, 25], "refer": [0, 2, 9, 11], "reg_bill_length_queri": 23, "regard": 9, "region": 27, "regist": [23, 24, 25, 26, 28], "regress": 6, "reject": 25, "relat": 9, "releas": 23, "relev": [5, 11, 23], "reli": [0, 36], "reliabl": 26, "remain": [0, 9, 11, 25, 28], "remaining_delta": [23, 25, 28], "remaining_epsilon": [23, 25, 28], "remot": [9, 23, 24, 25, 26], "remov": 24, "render": [23, 24], "replac": [11, 22, 24, 27], "repo": 0, "report": 9, "repositori": [6, 9, 30, 36], "repres": [11, 23, 25, 26], "represent": [23, 24], "reproduc": [23, 25], "request": [0, 2, 5, 9, 11, 23, 24, 25, 26, 28], "requested_bi": [23, 24, 26], "requir": [0, 2, 8, 9, 22, 23, 26, 27, 32, 34, 35, 38], "rerun": [23, 24], "res_cost": [23, 26], "res_dummi": [23, 26], "res_loc": 25, "res_serv": 25, "res_server_dummi": 25, "research": [23, 24, 25, 26, 27, 28], "resolv": 24, "respect": [23, 26], "respons": [5, 9, 11, 23, 24, 25, 26, 27, 28], "rest": [9, 23, 25, 27], "restart": 36, "result": [0, 11, 23, 24, 25, 26, 27, 28], "result_local_dummi": 25, "retriev": [11, 27], "return": [0, 11, 23, 24, 25, 26, 27, 28], "return_model": [11, 12, 22, 23, 26], "reveal": 27, "rf": [23, 24], "right": 5, "risk": 25, "rng": 26, "root": [23, 24, 25, 26, 28], "round": [23, 25, 28], "rout": [0, 12, 37], "routes_admin": [12, 37], "routes_dp": [0, 12, 37], "row": [11, 23, 24, 25, 26], "row_privaci": [12, 22, 23, 24, 25, 26, 27, 28], "run": [0, 1, 2, 8, 23, 25, 26, 27, 33, 35, 36], "run_basic_test": 2, "run_command": 27, "run_lint": 0, "run_tests_and_converag": 2, "runtim": 38, "runtime_arg": [12, 37], "runtimewarn": 28, "rust": [11, 12], "s3": [6, 9, 12, 22, 32, 37], "s3_ak": 32, "s3_connector": [12, 37], "s3_db": [12, 22, 27, 32], "s3_sak": 32, "s3_url": 32, "s3b": 32, "s3k": 32, "safeguard": [23, 25, 28], "sai": 0, "same": [23, 24, 25, 26, 27, 36], "sampl": [11, 25, 26], "sample_r": 26, "satisfi": [23, 38], "save": 35, "scale": [23, 24, 28], "scaler": 24, "scenario": 6, "schema": 27, "scienc": 9, "scientist": 9, "scikit": 23, "scipi": 23, "scope": 27, "score": [23, 24], "script": [0, 2, 27], "sdist": 1, "seaborn": 27, "seamless": [9, 23, 24, 25, 26, 28], "seamlessli": 0, "search": 9, "second": 27, "secret": 32, "secret_access_kei": [12, 22, 32], "section": [0, 6, 9, 30, 32], "secur": [0, 6, 9, 11, 23, 24, 26, 27, 28], "see": [0, 6, 9, 11, 12, 25, 27, 29], "seed": [11, 23, 24, 25, 28], "seem": [24, 25], "seen": [23, 24, 25, 26, 28], "select": [11, 23, 25, 26, 28, 38], "select_col": [11, 12, 22, 23, 26], "semver": 0, "send": [0, 11, 23, 24, 25, 26, 28], "sens": 24, "sensit": [9, 11, 25], "sent": [9, 23], "sepal_length": 27, "sepal_width": 27, "separ": [23, 28], "serial": 9, "serialis": [0, 11], "serv": 9, "server": [0, 3, 5, 11, 12, 23, 24, 25, 26, 28, 32, 33, 34, 35, 36, 37, 38], "server_contain": 27, "servic": [9, 27, 34, 36, 38], "session": 27, "set": [0, 8, 11, 12, 23, 24, 25, 26, 27, 32, 33, 35, 36, 37, 38], "set_budget_field": [27, 32], "set_may_queri": [27, 32], "setosa": 27, "setup": [0, 1, 8, 33], "setuptool": 23, "sever": [0, 35], "sex": [23, 24, 25, 26, 27, 28], "sh": [0, 2], "sha": 0, "shape": [23, 25, 28], "share": 9, "she": [23, 25, 26], "short": [0, 9], "should": [0, 5, 22, 23, 24, 25, 27, 28, 36], "show": [23, 24, 27, 32, 35], "showcas": [23, 24, 25, 26, 27], "shown": 32, "shuffl": [23, 24, 26], "sibsp": [27, 28], "side": [6, 9], "signific": 25, "similar": [23, 25], "simpl": 2, "simpli": [0, 33], "simplifi": [33, 35], "sinc": 36, "singl": [23, 25], "singular_values_": 24, "site": [23, 24, 26], "six": 23, "size": [23, 28], "sklearn": [11, 23, 24], "slightli": [23, 25, 28], "small": [23, 25, 28], "smallest": 24, "smarnois": 22, "smarntois": 26, "smartnois": [0, 5, 6, 11, 12, 25, 27], "smartnoise_queri": 23, "smartnoise_sql": [7, 11, 12, 17, 23, 37], "smartnoise_sql_queri": [7, 11, 23, 25, 28], "smartnoise_synth": [0, 7, 11, 12, 17, 23, 26, 37], "smartnoise_synth_logg": 0, "smartnoise_synth_queri": [7, 11, 23, 26], "smartnoisesql": [9, 23, 25, 26, 27, 28], "smartnoisesqlcostmodel": [12, 22], "smartnoisesqlmodel": [12, 22], "smartnoisesynth": 12, "smartnoisesynthcostmodel": [12, 22], "smartnoisesynthquerymodel": [12, 22], "smoothed_max_diverg": [12, 37], "smoothedmaxdiverg": 11, "snsynth": 26, "snsynth_default_symples_nb": 11, "so": [2, 9, 16, 23, 24, 25, 26, 27, 36], "solut": [23, 25], "some": [0, 6, 11, 23, 24, 25, 26, 30, 36], "sourc": [11, 12, 16, 22], "space": 27, "speci": [23, 24, 25, 26, 27], "special": 26, "specif": [0, 5, 9, 23, 25, 26, 27, 35, 38], "specifi": [11, 24, 25, 26, 27, 32], "specifii": 26, "spend": [23, 25], "spent": [11, 23, 25, 28], "spent_budget": [23, 24], "spent_delta": [23, 24, 26], "spent_epsilon": [23, 24, 26], "split": [9, 11, 24, 27], "spread": 24, "sql": [5, 11, 22, 26], "sqrt": [23, 24, 25, 28], "src": 12, "sspcloud": 27, "ssynthcolumntyp": [12, 37], "ssynthgansynthes": [7, 11, 12, 22, 37], "ssynthmarginalsynthes": [7, 11, 12, 22, 37], "ssynthtabletransstyl": [12, 37], "stabl": [0, 12], "stai": [9, 27], "stall": [12, 37], "standard": [2, 23, 24, 25, 28], "standard_error": [23, 25, 28], "standardscal": [11, 24], "start": [0, 9, 11, 12, 23, 25, 26, 32, 36, 38], "startup": 5, "state": [9, 27, 36], "static": 0, "statist": [6, 9, 23], "statistiqu": 29, "statu": [11, 23, 24, 26, 28], "std": 25, "std_0": 25, "std_1": 25, "std_2": 25, "std_bill_length": 25, "std_bill_length_mm": 25, "step": [0, 1, 6, 11, 27, 34, 35, 38], "still": [9, 10, 23, 25], "stop": [26, 32], "storag": 27, "store": [9, 23, 24, 25, 26, 27, 28, 32], "str": [11, 12, 22, 23, 28], "strategi": 11, "streamlin": 0, "streamlit": [27, 32, 36], "strenum": [0, 11, 12], "string": [11, 23, 24, 25, 26, 27, 28], "strip": 27, "strongli": 9, "studi": 25, "style": [0, 12], "subcommand": 27, "submit_limit": [12, 37], "submodul": [7, 37], "subpackag": 37, "subscrib": 16, "subsequ": 0, "subset": [23, 26], "substarct": [23, 25, 28], "successfulli": 35, "suffici": 5, "suggest": 9, "suiss": 29, "suit": 34, "summari": 23, "support": 11, "suppress": 24, "sure": [0, 2, 25, 27, 28, 35, 36], "surviv": [27, 28], "svd_solver": 24, "swiss": 9, "sy": [24, 25, 26], "symmetric_dist": [12, 37], "symmetricdist": [12, 23], "syntax": 25, "synth": [0, 6, 11, 12, 22], "synth_df": 23, "synth_mean": 23, "synth_nam": [11, 12, 22, 23, 26], "synth_param": [11, 12, 22, 23, 26], "synth_vari": 23, "synthes": [11, 12, 26], "synthet": [6, 11, 25], "system": [23, 25, 26, 36], "sysynth_queri": 23, "t": [23, 24, 25, 27, 35], "t_01": 25, "t_02": 25, "t_12": 25, "t_test": 25, "tabl": [0, 11, 27], "tabular": 6, "tag": 0, "tail": 25, "take": [0, 9, 36], "target": 11, "target_column": [11, 12, 22, 23, 24], "task": [0, 9, 30, 32], "teacher": 6, "team": 5, "tear": 27, "term": 26, "termin": [8, 27, 36], "test": [0, 1, 9, 11, 12, 23, 24, 27, 37], "test_api": [12, 37], "test_api_diffprivlib": [12, 37], "test_api_smartnoise_synth": [12, 37], "test_config": 2, "test_dummy_gener": [12, 37], "test_mongodb_admin": [12, 37], "test_mongodb_admin_cli": [12, 37], "test_new_librari": 0, "test_siz": [11, 12, 22, 23, 24], "test_train_split_se": [11, 12, 22, 23, 24], "text": 11, "than": [23, 25, 28], "thank": [23, 25], "thei": [0, 5, 9, 16, 23, 24, 25, 26, 27], "them": [0, 23, 24, 25, 27], "then_cast_default": [23, 28], "then_clamp": [23, 28], "then_laplac": [23, 28], "then_res": [23, 28], "then_vari": [23, 28], "theorat": 25, "theoret": 25, "therefor": [23, 24, 25, 26, 27, 28], "thi": [0, 1, 5, 6, 8, 9, 10, 11, 16, 22, 23, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 38], "those": [0, 2, 11, 26, 38], "though": 33, "threadpoolctl": 23, "three": [0, 11, 23], "through": [25, 27, 35, 36], "thu": 9, "ticket": [27, 28], "time": [0, 12, 23, 24, 25, 26, 36], "time_attack": [12, 37], "timeattackmethod": [12, 37], "timestamp": [23, 24, 26], "titan": [6, 27, 36], "titanic_metadata": [27, 28], "tmp": 28, "to_dict": 27, "toa": [23, 28], "token": 1, "tol": 24, "tolist": 28, "toml": 0, "too": 25, "tool": [0, 25, 30, 35], "torgersen": [23, 24, 25, 26, 27], "total": [11, 16, 23, 25, 27, 28], "total_spent_delta": [12, 22, 23, 25, 27, 28], "total_spent_epsilon": [12, 22, 23, 25, 27, 28], "traceback": 27, "train": [6, 11, 26], "tran": [23, 28], "transform": [0, 11, 12, 23, 26, 28], "treat": 11, "tree": 9, "tri": [5, 23, 25, 26], "trigger": [0, 5], "true": [11, 22, 23, 24, 25, 26, 27, 28, 32, 33], "trust": [23, 24], "try": [10, 23, 24, 25, 26], "tune": 38, "twine": 1, "two": [9, 23, 25, 26], "txt": 0, "type": [0, 11, 12, 23, 24, 25, 26, 27, 28, 32], "typic": 9, "tzdata": 23, "u": [1, 9, 27, 28, 32], "u32": 12, "un": 9, "unabl": [23, 24], "unavail": 11, "under": [9, 10, 11], "understand": [6, 24, 26], "understood": [23, 25, 26], "uneth": 27, "unfortunatelli": 26, "union": [11, 22], "unittest": 2, "unknown": 11, "unless": 27, "until": [25, 27], "up": [0, 1, 27, 35, 36], "updat": [0, 1, 9, 16, 23, 25, 27], "update_memory_usag": [12, 16], "upgrad": 23, "upload": 1, "upper": [23, 24, 25, 26, 27, 28], "upper_bound": [23, 25, 28], "url": [8, 11, 23, 24, 25, 26, 28, 32], "urllib3": 23, "us": [0, 2, 6, 8, 9, 11, 12, 16, 25, 27, 28, 30, 32, 33, 34, 35, 36], "usag": [8, 16, 27], "user": [5, 9, 11, 12, 22, 23, 24, 25, 26, 28, 30, 33, 36], "user_collect": 27, "user_nam": [8, 11, 12, 22, 23, 24, 25, 26, 27, 28], "user_pwd": 32, "usercollect": [12, 22], "usernam": 32, "userwarn": 26, "usr": [23, 24, 26], "usual": 9, "utf": 27, "util": [0, 5, 7, 9, 12, 17, 24, 26, 27, 37], "uvicorn_serv": [27, 37], "v": 32, "v1": 22, "valid": [0, 11, 26], "validate_synthes": [7, 11], "valu": [0, 5, 11, 12, 23, 24, 25, 26, 27, 28, 32, 33, 34], "valuabl": 9, "valueerror": [11, 27], "vanilla": 26, "var": 23, "var_ag": 28, "var_age_transformation_pipelin": 28, "var_bill_length": 23, "var_bill_length_measurement_pipelin": 23, "var_bill_length_queri": 23, "var_r": [23, 28], "var_smooth": 24, "vari": 33, "variabl": [23, 25, 33], "varianc": [23, 28], "variou": [6, 23, 24, 25, 26, 30, 32, 34], "venv": [2, 23], "verbos": [23, 24], "veri": [23, 25, 26], "verifi": [0, 1, 24, 25, 26], "versicolor": 27, "version": [0, 10, 23, 24, 26], "versu": 24, "via": [0, 1, 9, 23, 24, 25, 26, 28, 30], "virginica": 27, "virtual": 23, "visibl": [23, 24, 25, 26], "visualis": 32, "volum": [32, 36], "vx": 0, "wa": [9, 23, 25, 26, 27, 28], "wait": 27, "want": [23, 24, 25, 26, 27, 28], "warm_start": [23, 24], "warn": [0, 11, 23, 24, 26], "wast": 23, "we": [0, 9, 16, 23, 24, 25, 26, 27, 28, 30, 35], "web": 36, "welcom": 9, "well": [0, 9, 25], "were": [23, 25], "what": [0, 5, 11, 23, 24, 25, 26, 28], "when": [0, 5, 16, 23, 33], "where": [23, 25, 26, 27, 32, 36], "whether": 11, "which": [0, 5, 9, 23, 24, 25, 26, 27, 28], "while": [5, 9, 24], "white": 9, "whole": 23, "why": [5, 24, 25], "width": [23, 25], "wip_xx": 0, "wish": 1, "with_mean": 24, "with_std": 24, "within": [5, 9, 23, 24, 25, 32, 38], "without": [2, 5, 23, 25, 26, 27], "won": [23, 27], "work": [2, 11, 23, 24, 25, 26], "workflow": [1, 2, 25, 26], "worri": 23, "would": [23, 24, 25, 26], "wrapper_decor": 27, "write": [5, 23], "writeconcernerror": 5, "written": 27, "wrong": 24, "www": 9, "x": [0, 23, 28], "x27": [23, 24], "x_to_predict": [23, 24], "xx": 0, "y": 0, "yaml": [0, 2, 12, 27, 32, 33, 34, 37], "yaml_databas": [12, 37], "yaml_fil": 32, "ye": 0, "year": 28, "yet": [27, 35], "yf": [27, 32], "yml": 0, "you": [0, 6, 8, 25, 27, 33, 34, 35, 36, 38], "your": [0, 8, 27, 33, 34, 35, 36, 38], "your_deployement_url": 8, "your_nam": 8, "yourself": 30, "z": 0, "zero_concentrated_diverg": [12, 37], "zeroconcentrateddiverg": 11, "zscore": [23, 25, 28]}, "titles": ["Notes for Contributors", "Notes for Client Contributors", "Notes for Server Contributors", "API Documentation", "Client API", "Errors", "Examples", "lomas_client", "Quickstart", "Lomas: The Data Oases Hidden Behind the Mist.", "Welcome to Lomas documentation", "lomas_client package", "lomas_server package", "lomas_server.admin_database package", "lomas_server.administration package", "lomas_server.data_connector package", "lomas_server.dataset_store package", "lomas_server.dp_queries package", "lomas_server.dp_queries.dp_libraries package", "lomas_server.private_dataset package", "lomas_server.routes package", "lomas_server.tests package", "lomas_server.utils package", "Lomas: Client demo", "Lomas Client Side: Using DiffPrivlib", "Secure Data Disclosure: Client side", "Lomas Client Side: Using Smartnoise-Synth", "Lomas-server: CLI administration", "S3 example", "Poster", "Administration", "Server API", "CLI", "Dashboard", "Deployment", "Kubernetes", "Local", "lomas_server", "Onyxia"], "titleterms": {"1": [23, 24, 25, 26, 28], "2": [23, 24, 25, 26, 28], "3": [23, 24, 25, 26, 28], "4": [23, 24, 25, 28], "5": 24, "6": [24, 26], "The": 9, "access": [27, 33, 35], "ad": 0, "adapt": 26, "add": 27, "addit": 23, "admin_databas": 13, "administr": [14, 27, 30, 32], "ag": 28, "aggreg": 26, "aim": 26, "all": [26, 27], "analys": 23, "anti_timing_att": 22, "api": [3, 4, 31], "app": 12, "archiv": [23, 24, 26, 27], "associ": 24, "averag": [23, 28], "b": 23, "basic_dataset_stor": 16, "bay": 24, "behind": 9, "bill": 23, "branch": 0, "budget": [23, 25, 27, 28], "c": 23, "can": [24, 27], "chang": 27, "chart": 35, "check": [0, 23], "classif": 24, "classifi": 24, "cli": [27, 32], "client": [1, 4, 8, 9, 11, 23, 24, 25, 26, 28], "cluster": 24, "collect": 32, "collection_model": 22, "comput": 23, "condit": 26, "confid": [23, 25, 28], "config": 22, "connect": 32, "connector": 0, "constant": [12, 21], "content": [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "contributor": [0, 1, 2], "cost": [23, 24, 25, 28], "creat": [26, 27], "current": [23, 25, 28], "d": 23, "dashboard": 33, "data": [0, 9, 23, 25], "data_connector": 15, "data_connector_observ": 16, "databas": [0, 27], "dataset": [0, 23, 24, 25, 26, 27, 28, 32], "dataset_stor": 16, "decis": 24, "default": 26, "demo": 23, "deploi": [35, 36, 38], "deploy": 34, "descript": 9, "detail": 9, "differenti": 26, "diffprivlib": [18, 23, 24], "dimension": 24, "direcli": 27, "disclosur": 25, "do": 27, "docker": [27, 33], "document": [3, 10], "dp": [0, 23], "dp_librari": 18, "dp_logic": 17, "dp_queri": [17, 18], "dp_querier": 17, "dpctgan": 26, "dpgan": 26, "drop": 27, "dummi": [23, 24, 25, 26, 28], "dummy_dataset": 17, "ensembl": 26, "error": 5, "error_handl": 22, "estim": [23, 24, 25, 28], "exampl": [6, 28, 32], "execut": 23, "exponenti": 26, "extern": 0, "externallibraryexcept": 5, "factori": [13, 15, 16, 18], "file": 27, "final": 27, "first": 8, "flipper": 25, "fom": 27, "forest": 24, "functionn": [23, 25, 28], "gan": 26, "gaussian": 24, "get": [23, 24, 25, 26, 28], "git": 0, "github": 0, "helm": 35, "hidden": 9, "histori": 9, "hypothesi": 25, "in_memory_connector": 15, "in_memory_dataset": 19, "indic": 9, "ingress": 35, "initi": 23, "initialis": [23, 24, 25, 26, 28], "instal": [8, 23, 24, 25, 26, 28, 35], "internalserverexcept": 5, "interv": [23, 25, 28], "introduct": 38, "invalidqueryexcept": 5, "iter": 26, "k": 24, "keep": 26, "kubernet": [33, 35], "learn": 23, "length": [23, 25], "librari": [0, 23, 24, 25, 26, 28], "linear": [23, 24], "lint": 0, "load": 27, "local": [33, 36], "logger": [0, 22], "logist": 24, "loma": [9, 10, 23, 24, 26, 27, 38], "lomas_cli": [7, 11], "lomas_serv": [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 37], "loss": 23, "lru_dataset_stor": 16, "machin": 23, "maximum": 26, "mean": 24, "mechan": 26, "metadata": [23, 24, 25, 26, 28], "mist": 9, "model": [23, 24], "modifi": 35, "modul": [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "mongodb": [27, 32], "mongodb_admin": 12, "mongodb_admin_cli": 12, "mongodb_databas": 13, "mst": 26, "multipl": 26, "mwem": 26, "naiv": 24, "new": 1, "note": [0, 1, 2], "now": [24, 27], "number": 28, "oas": 9, "onyxia": [33, 38], "opendp": [18, 23, 28], "option": 27, "other": [0, 24], "over": [25, 28], "overview": [9, 32], "packag": [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], "paramet": 26, "patectgan": [23, 26], "pategan": 26, "path_connector": 15, "path_dataset": 19, "pca": 24, "penguin": 25, "pipelin": [23, 24], "platform": 33, "popul": [25, 28], "poster": 29, "postprocess": 23, "prepar": [23, 27], "prerequisit": [35, 36], "privaci": 23, "privat": [0, 23, 26, 28], "private_dataset": 19, "provaci": 23, "push": 1, "pypi": 1, "queri": [23, 24, 25, 26, 27, 28], "query_exampl": 22, "query_model": 22, "quickstart": 8, "random": 24, "real": [23, 25, 28], "reduct": 24, "regress": [23, 24], "releas": 0, "remain": 23, "remot": 28, "remov": 27, "risk": 23, "rout": 20, "routes_admin": 20, "routes_dp": 20, "row": 28, "s3": 28, "s3_connector": 15, "s3_dataset": 19, "section": 35, "secur": 25, "see": [23, 24, 26], "sensit": 23, "server": [2, 9, 27, 31], "servic": 35, "she": 24, "side": [24, 25, 26], "smartnois": [23, 26, 28], "smartnoise_sql": 18, "smartnoise_synth": 18, "span": 26, "sql": [23, 28], "start": [24, 27], "statist": [25, 28], "step": [8, 23, 24, 25, 26, 28, 36], "stop": 27, "store": 0, "submodul": [11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22], "subpackag": [12, 17], "synth": [23, 26], "synthes": 23, "synthet": [23, 26], "tabl": 9, "tabular": 26, "teacher": 26, "technic": 9, "test": [2, 21, 25], "test_api": 21, "test_api_diffprivlib": 21, "test_api_smartnoise_synth": 21, "test_dummy_gener": 21, "test_mongodb_admin": 21, "test_mongodb_admin_cli": 21, "thi": 24, "titan": 28, "train": [23, 24], "tree": [24, 26], "tri": 24, "unauthorizedaccessexcept": 5, "understand": [23, 25, 28], "us": [23, 24, 26], "user": [27, 32], "util": [11, 13, 18, 19, 20, 22], "uvicorn_serv": 12, "valu": 35, "variou": 0, "verifi": 23, "version": 1, "via": 33, "visualis": 27, "volum": 27, "weight": 26, "welcom": 10, "whole": [25, 28], "workflow": 0, "write": 24, "yaml": 35, "yaml_databas": 13, "\u03b4": 23, "\u03b5": 23}}) \ No newline at end of file diff --git a/html/v0.3.1/en/CONTRIBUTING.html b/html/v0.3.2/en/CONTRIBUTING.html similarity index 96% rename from html/v0.3.1/en/CONTRIBUTING.html rename to html/v0.3.2/en/CONTRIBUTING.html index 59b1b7a0..4b5e347b 100644 --- a/html/v0.3.1/en/CONTRIBUTING.html +++ b/html/v0.3.2/en/CONTRIBUTING.html @@ -37,7 +37,7 @@
                      - v0.3.1 + v0.3.2
                      @@ -303,8 +303,8 @@

                      Adding a Data Connector (for private dataset in various databases)NewDataConnector for the example.

                      1. Add the new dataset store to the NewDataConnector StrEnum class in lomas/lomas_server/constants.py.

                      2. -
                      3. Add the NewDataConnector option in the data_connector_factory function (in lomas/lomas_server/data_connector/factory.py).

                      4. -
                      5. Create a file for your dataset store in the folder lomas/lomas_server/data_connector/new_data_connector.py. Inside, create a class NewDataConnector that inherits from DataConnector (lomas/lomas_server/data_connector/data_connector.py), your class must contain a get_pandas_df method that return a dataframe of the dataset.

                      6. +
                      7. Add the NewDataConnector option in the private_dataset_factory function (in lomas/lomas_server/private_dataset/factory.py).

                      8. +
                      9. Create a file for your dataset store in the folder lomas/lomas_server/private_dataset/new_data_connector.py. Inside, create a class NewDataConnector that inherits from PrivateDataset (lomas/lomas_server/private_dataset/private_dataset.py), your class must contain a get_pandas_df method that return a dataframe of the dataset.

                      10. Add tests in lomas/lomas_server/tests/ to test all functionnalities of the new data connector.

            • @@ -336,7 +336,7 @@

              Adding a Data Connector (for private dataset in various databases) - Version: v0.3.1 + Version: v0.3.2
              @@ -344,7 +344,7 @@

              Adding a Data Connector (for private dataset in various databases)en +
              en
              @@ -366,7 +366,7 @@

              Adding a Data Connector (for private dataset in various databases)v0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/CONTRIBUTING_CLIENT.html b/html/v0.3.2/en/CONTRIBUTING_CLIENT.html similarity index 98% rename from html/v0.3.1/en/CONTRIBUTING_CLIENT.html rename to html/v0.3.2/en/CONTRIBUTING_CLIENT.html index 75bdca78..c8bfea71 100644 --- a/html/v0.3.1/en/CONTRIBUTING_CLIENT.html +++ b/html/v0.3.2/en/CONTRIBUTING_CLIENT.html @@ -37,7 +37,7 @@
              - v0.3.1 + v0.3.2
              @@ -143,7 +143,7 @@

              Pushing a new version to Pypi - Version: v0.3.1 + Version: v0.3.2
              @@ -151,7 +151,7 @@

              Pushing a new version to Pypien +
              en
              @@ -173,7 +173,7 @@

              Pushing a new version to Pypiv0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/CONTRIBUTING_SERVER.html b/html/v0.3.2/en/CONTRIBUTING_SERVER.html similarity index 98% rename from html/v0.3.1/en/CONTRIBUTING_SERVER.html rename to html/v0.3.2/en/CONTRIBUTING_SERVER.html index 688f2790..0c1edf88 100644 --- a/html/v0.3.1/en/CONTRIBUTING_SERVER.html +++ b/html/v0.3.2/en/CONTRIBUTING_SERVER.html @@ -37,7 +37,7 @@
              - v0.3.1 + v0.3.2
              @@ -139,7 +139,7 @@

              Tests
              - Version: v0.3.1 + Version: v0.3.2
              @@ -147,7 +147,7 @@

              Tests
              Languages
              -
              en
              +
              en
              @@ -169,7 +169,7 @@

              Testsv0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/_images/notebooks_Demo_Client_Notebook_2_0.png b/html/v0.3.2/en/_images/notebooks_Demo_Client_Notebook_2_0.png similarity index 100% rename from html/v0.3.1/en/_images/notebooks_Demo_Client_Notebook_2_0.png rename to html/v0.3.2/en/_images/notebooks_Demo_Client_Notebook_2_0.png diff --git a/html/v0.3.2/en/_images/notebooks_Demo_Client_Notebook_DiffPrivLib_2_0.png b/html/v0.3.2/en/_images/notebooks_Demo_Client_Notebook_DiffPrivLib_2_0.png new file mode 100644 index 00000000..ec7b4ac8 Binary files /dev/null and b/html/v0.3.2/en/_images/notebooks_Demo_Client_Notebook_DiffPrivLib_2_0.png differ diff --git a/html/v0.3.2/en/_images/notebooks_Demo_Client_Notebook_Smartnoise-Synth_2_0.png b/html/v0.3.2/en/_images/notebooks_Demo_Client_Notebook_Smartnoise-Synth_2_0.png new file mode 100644 index 00000000..ec7b4ac8 Binary files /dev/null and b/html/v0.3.2/en/_images/notebooks_Demo_Client_Notebook_Smartnoise-Synth_2_0.png differ diff --git a/html/v0.3.1/en/_modules/index.html b/html/v0.3.2/en/_modules/index.html similarity index 98% rename from html/v0.3.1/en/_modules/index.html rename to html/v0.3.2/en/_modules/index.html index 901ee860..212c9980 100644 --- a/html/v0.3.1/en/_modules/index.html +++ b/html/v0.3.2/en/_modules/index.html @@ -34,7 +34,7 @@
              - v0.3.1 + v0.3.2
              @@ -126,7 +126,7 @@

              All modules for which code is available

              - Version: v0.3.1 + Version: v0.3.2
              @@ -134,7 +134,7 @@

              All modules for which code is available

              Languages
              -
              en
              +
              en
              @@ -156,7 +156,7 @@

              All modules for which code is available

              v0.3.0
              -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/_modules/lomas_client/client.html b/html/v0.3.2/en/_modules/lomas_client/client.html similarity index 99% rename from html/v0.3.1/en/_modules/lomas_client/client.html rename to html/v0.3.2/en/_modules/lomas_client/client.html index 4b56404f..2986d596 100644 --- a/html/v0.3.1/en/_modules/lomas_client/client.html +++ b/html/v0.3.2/en/_modules/lomas_client/client.html @@ -34,7 +34,7 @@
              - v0.3.1 + v0.3.2
              @@ -959,7 +959,7 @@

              Source code for lomas_client.client

                 
              - Version: v0.3.1 + Version: v0.3.2
              @@ -967,7 +967,7 @@

              Source code for lomas_client.client

                     
              Languages
              -
              en
              +
              en
              @@ -989,7 +989,7 @@

              Source code for lomas_client.client

                       
                         
              v0.3.0
              -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/_modules/lomas_client/utils.html b/html/v0.3.2/en/_modules/lomas_client/utils.html similarity index 99% rename from html/v0.3.1/en/_modules/lomas_client/utils.html rename to html/v0.3.2/en/_modules/lomas_client/utils.html index a409c6bb..17ab3730 100644 --- a/html/v0.3.1/en/_modules/lomas_client/utils.html +++ b/html/v0.3.2/en/_modules/lomas_client/utils.html @@ -34,7 +34,7 @@
              - v0.3.1 + v0.3.2
              @@ -180,7 +180,7 @@

              Source code for lomas_client.utils

                 
              - Version: v0.3.1 + Version: v0.3.2
              @@ -188,7 +188,7 @@

              Source code for lomas_client.utils

                     
              Languages
              -
              en
              +
              en
              @@ -210,7 +210,7 @@

              Source code for lomas_client.utils

                       
                         
              v0.3.0
              -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/_modules/lomas_server/constants.html b/html/v0.3.2/en/_modules/lomas_server/constants.html similarity index 99% rename from html/v0.3.1/en/_modules/lomas_server/constants.html rename to html/v0.3.2/en/_modules/lomas_server/constants.html index 6fbd9188..40d029da 100644 --- a/html/v0.3.1/en/_modules/lomas_server/constants.html +++ b/html/v0.3.2/en/_modules/lomas_server/constants.html @@ -34,7 +34,7 @@
              - v0.3.1 + v0.3.2
              @@ -447,7 +447,7 @@

              Source code for lomas_server.constants

                 
              - Version: v0.3.1 + Version: v0.3.2
              @@ -455,7 +455,7 @@

              Source code for lomas_server.constants

                     
              Languages
              -
              en
              +
              en
              @@ -477,7 +477,7 @@

              Source code for lomas_server.constants

                       
                         
              v0.3.0
              -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/_modules/lomas_server/dataset_store/data_connector_observer.html b/html/v0.3.2/en/_modules/lomas_server/dataset_store/data_connector_observer.html similarity index 98% rename from html/v0.3.1/en/_modules/lomas_server/dataset_store/data_connector_observer.html rename to html/v0.3.2/en/_modules/lomas_server/dataset_store/data_connector_observer.html index 4508148c..55bc6811 100644 --- a/html/v0.3.1/en/_modules/lomas_server/dataset_store/data_connector_observer.html +++ b/html/v0.3.2/en/_modules/lomas_server/dataset_store/data_connector_observer.html @@ -34,7 +34,7 @@
              - v0.3.1 + v0.3.2
              @@ -140,7 +140,7 @@

              Source code for lomas_server.dataset_store.data_connector_observer

              - Version: v0.3.1 + Version: v0.3.2
              @@ -148,7 +148,7 @@

              Source code for lomas_server.dataset_store.data_connector_observer

              Languages
              -
              en
              +
              en
              @@ -170,7 +170,7 @@

              Source code for lomas_server.dataset_store.data_connector_observer

              v0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/_modules/lomas_server/utils/collection_models.html b/html/v0.3.2/en/_modules/lomas_server/utils/collection_models.html similarity index 99% rename from html/v0.3.1/en/_modules/lomas_server/utils/collection_models.html rename to html/v0.3.2/en/_modules/lomas_server/utils/collection_models.html index ca27ed04..1aa04d08 100644 --- a/html/v0.3.1/en/_modules/lomas_server/utils/collection_models.html +++ b/html/v0.3.2/en/_modules/lomas_server/utils/collection_models.html @@ -34,7 +34,7 @@
              - v0.3.1 + v0.3.2
              @@ -248,7 +248,7 @@

              Source code for lomas_server.utils.collection_models

              - Version: v0.3.1 + Version: v0.3.2
              @@ -256,7 +256,7 @@

              Source code for lomas_server.utils.collection_models

              en +
              en
              @@ -278,7 +278,7 @@

              Source code for lomas_server.utils.collection_models

              v0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/_modules/lomas_server/utils/query_examples.html b/html/v0.3.2/en/_modules/lomas_server/utils/query_examples.html similarity index 99% rename from html/v0.3.1/en/_modules/lomas_server/utils/query_examples.html rename to html/v0.3.2/en/_modules/lomas_server/utils/query_examples.html index 1eb96491..49f0ce18 100644 --- a/html/v0.3.1/en/_modules/lomas_server/utils/query_examples.html +++ b/html/v0.3.2/en/_modules/lomas_server/utils/query_examples.html @@ -34,7 +34,7 @@
              - v0.3.1 + v0.3.2
              @@ -232,7 +232,7 @@

              Source code for lomas_server.utils.query_examples

              - Version: v0.3.1 + Version: v0.3.2
              @@ -240,7 +240,7 @@

              Source code for lomas_server.utils.query_examples

              Languages
              -
              en
              +
              en
              @@ -262,7 +262,7 @@

              Source code for lomas_server.utils.query_examples

              v0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/_modules/lomas_server/utils/query_models.html b/html/v0.3.2/en/_modules/lomas_server/utils/query_models.html similarity index 99% rename from html/v0.3.1/en/_modules/lomas_server/utils/query_models.html rename to html/v0.3.2/en/_modules/lomas_server/utils/query_models.html index d01e744f..2c8ebb30 100644 --- a/html/v0.3.1/en/_modules/lomas_server/utils/query_models.html +++ b/html/v0.3.2/en/_modules/lomas_server/utils/query_models.html @@ -34,7 +34,7 @@
              - v0.3.1 + v0.3.2
              @@ -294,7 +294,7 @@

              Source code for lomas_server.utils.query_models

              <
              - Version: v0.3.1 + Version: v0.3.2
              @@ -302,7 +302,7 @@

              Source code for lomas_server.utils.query_models

              <
              Languages
              -
              en
              +
              en
              @@ -324,7 +324,7 @@

              Source code for lomas_server.utils.query_models

              <
              v0.3.0
              -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/_sources/CONTRIBUTING.md.txt b/html/v0.3.2/en/_sources/CONTRIBUTING.md.txt similarity index 96% rename from html/v0.3.1/en/_sources/CONTRIBUTING.md.txt rename to html/v0.3.2/en/_sources/CONTRIBUTING.md.txt index 63989f0c..77700d30 100644 --- a/html/v0.3.1/en/_sources/CONTRIBUTING.md.txt +++ b/html/v0.3.2/en/_sources/CONTRIBUTING.md.txt @@ -128,6 +128,6 @@ Here is the explanation of how to add a new dataset store named `NewDatasetStore Here is the explanation of how to add a new data connector named `NewDataConnector` for the example. 1. Add the new dataset store to the `NewDataConnector` StrEnum class in `lomas/lomas_server/constants.py`. -2. Add the `NewDataConnector` option in the `data_connector_factory` function (in `lomas/lomas_server/data_connector/factory.py`). -3. Create a file for your dataset store in the folder `lomas/lomas_server/data_connector/new_data_connector.py`. Inside, create a class `NewDataConnector` that inherits from `DataConnector` (`lomas/lomas_server/data_connector/data_connector.py`), your class must contain a `get_pandas_df` method that return a dataframe of the dataset. +2. Add the `NewDataConnector` option in the `private_dataset_factory` function (in `lomas/lomas_server/private_dataset/factory.py`). +3. Create a file for your dataset store in the folder `lomas/lomas_server/private_dataset/new_data_connector.py`. Inside, create a class `NewDataConnector` that inherits from `PrivateDataset` (`lomas/lomas_server/private_dataset/private_dataset.py`), your class must contain a `get_pandas_df` method that return a dataframe of the dataset. 4. Add tests in `lomas/lomas_server/tests/` to test all functionnalities of the new data connector. diff --git a/html/v0.3.1/en/_sources/CONTRIBUTING_CLIENT.md.txt b/html/v0.3.2/en/_sources/CONTRIBUTING_CLIENT.md.txt similarity index 100% rename from html/v0.3.1/en/_sources/CONTRIBUTING_CLIENT.md.txt rename to html/v0.3.2/en/_sources/CONTRIBUTING_CLIENT.md.txt diff --git a/html/v0.3.1/en/_sources/CONTRIBUTING_SERVER.md.txt b/html/v0.3.2/en/_sources/CONTRIBUTING_SERVER.md.txt similarity index 100% rename from html/v0.3.1/en/_sources/CONTRIBUTING_SERVER.md.txt rename to html/v0.3.2/en/_sources/CONTRIBUTING_SERVER.md.txt diff --git a/html/v0.3.1/en/_sources/api.rst.txt b/html/v0.3.2/en/_sources/api.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/api.rst.txt rename to html/v0.3.2/en/_sources/api.rst.txt diff --git a/html/v0.3.1/en/_sources/client_api.rst.txt b/html/v0.3.2/en/_sources/client_api.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/client_api.rst.txt rename to html/v0.3.2/en/_sources/client_api.rst.txt diff --git a/html/v0.3.1/en/_sources/client_errors.rst.txt b/html/v0.3.2/en/_sources/client_errors.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/client_errors.rst.txt rename to html/v0.3.2/en/_sources/client_errors.rst.txt diff --git a/html/v0.3.1/en/_sources/client_examples.rst.txt b/html/v0.3.2/en/_sources/client_examples.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/client_examples.rst.txt rename to html/v0.3.2/en/_sources/client_examples.rst.txt diff --git a/html/v0.3.1/en/_sources/client_modules.rst.txt b/html/v0.3.2/en/_sources/client_modules.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/client_modules.rst.txt rename to html/v0.3.2/en/_sources/client_modules.rst.txt diff --git a/html/v0.3.1/en/_sources/client_quickstart.rst.txt b/html/v0.3.2/en/_sources/client_quickstart.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/client_quickstart.rst.txt rename to html/v0.3.2/en/_sources/client_quickstart.rst.txt diff --git a/html/v0.3.1/en/_sources/index_under_construction.rst.txt b/html/v0.3.2/en/_sources/index.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/index_under_construction.rst.txt rename to html/v0.3.2/en/_sources/index.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_client.rst.txt b/html/v0.3.2/en/_sources/lomas_client.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_client.rst.txt rename to html/v0.3.2/en/_sources/lomas_client.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.admin_database.rst.txt b/html/v0.3.2/en/_sources/lomas_server.admin_database.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.admin_database.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.admin_database.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.administration.rst.txt b/html/v0.3.2/en/_sources/lomas_server.administration.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.administration.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.administration.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.data_connector.rst.txt b/html/v0.3.2/en/_sources/lomas_server.data_connector.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.data_connector.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.data_connector.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.dataset_store.rst.txt b/html/v0.3.2/en/_sources/lomas_server.dataset_store.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.dataset_store.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.dataset_store.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.dp_queries.dp_libraries.rst.txt b/html/v0.3.2/en/_sources/lomas_server.dp_queries.dp_libraries.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.dp_queries.dp_libraries.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.dp_queries.dp_libraries.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.dp_queries.rst.txt b/html/v0.3.2/en/_sources/lomas_server.dp_queries.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.dp_queries.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.dp_queries.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.private_dataset.rst.txt b/html/v0.3.2/en/_sources/lomas_server.private_dataset.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.private_dataset.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.private_dataset.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.routes.rst.txt b/html/v0.3.2/en/_sources/lomas_server.routes.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.routes.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.routes.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.rst.txt b/html/v0.3.2/en/_sources/lomas_server.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.tests.rst.txt b/html/v0.3.2/en/_sources/lomas_server.tests.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.tests.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.tests.rst.txt diff --git a/html/v0.3.1/en/_sources/lomas_server.utils.rst.txt b/html/v0.3.2/en/_sources/lomas_server.utils.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/lomas_server.utils.rst.txt rename to html/v0.3.2/en/_sources/lomas_server.utils.rst.txt diff --git a/html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook.ipynb.txt b/html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook.ipynb.txt similarity index 53% rename from html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook.ipynb.txt rename to html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook.ipynb.txt index 7dd7394f..177aedcd 100644 --- a/html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook.ipynb.txt +++ b/html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook.ipynb.txt @@ -74,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "28fbdd79-8c15-49a9-bcf9-fcdeac09d2b5", "metadata": {}, "outputs": [ @@ -82,30 +82,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: lomas-client in /usr/local/lib/python3.11/site-packages (0.3.0)\n", - "Requirement already satisfied: diffprivlib>=0.6.4 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.6.4)\n", - "Requirement already satisfied: diffprivlib-logger>=0.0.3 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.0.3)\n", - "Requirement already satisfied: numpy>=1.24.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (1.24.0)\n", - "Requirement already satisfied: opendp==0.10.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.10.0)\n", + "Collecting lomas-client\n", + " Downloading lomas_client-0.1.0.tar.gz (8.0 kB)\n", + " Installing build dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Getting requirements to build wheel ... \u001b[?25ldone\n", + "\u001b[?25h Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25hRequirement already satisfied: opendp==0.8.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.8.0)\n", "Requirement already satisfied: opendp-logger==0.3.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.3.0)\n", - "Requirement already satisfied: pandas>=2.2.2 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.2.2)\n", - "Requirement already satisfied: requests>=2.32.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.32.0)\n", - "Requirement already satisfied: scikit-learn==1.4.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (1.4.0)\n", - "Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.11/site-packages (from scikit-learn==1.4.0->lomas-client) (1.14.1)\n", - "Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/site-packages (from scikit-learn==1.4.0->lomas-client) (1.4.2)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.11/site-packages (from scikit-learn==1.4.0->lomas-client) (3.5.0)\n", - "Requirement already satisfied: setuptools>=49.0.0 in /usr/local/lib/python3.11/site-packages (from diffprivlib>=0.6.4->lomas-client) (65.5.1)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/site-packages (from pandas>=2.2.2->lomas-client) (2.9.0.post0)\n", - "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/site-packages (from pandas>=2.2.2->lomas-client) (2024.1)\n", - "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/site-packages (from pandas>=2.2.2->lomas-client) (2024.1)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (3.8)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (2.2.2)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (2024.8.30)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=2.2.2->lomas-client) (1.16.0)\n", + "Requirement already satisfied: numpy==1.26.4 in /usr/local/lib/python3.11/site-packages (from lomas-client) (1.26.4)\n", + "Requirement already satisfied: requests==2.32.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.32.0)\n", + "Requirement already satisfied: pandas==2.2.2 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.2.2)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/site-packages (from pandas==2.2.2->lomas-client) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/site-packages (from pandas==2.2.2->lomas-client) (2024.1)\n", + "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/site-packages (from pandas==2.2.2->lomas-client) (2024.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/site-packages (from requests==2.32.0->lomas-client) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/site-packages (from requests==2.32.0->lomas-client) (3.7)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/site-packages (from requests==2.32.0->lomas-client) (2.2.2)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/site-packages (from requests==2.32.0->lomas-client) (2024.6.2)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas==2.2.2->lomas-client) (1.16.0)\n", + "Building wheels for collected packages: lomas-client\n", + " Building wheel for lomas-client (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25h Created wheel for lomas-client: filename=lomas_client-0.1.0-py3-none-any.whl size=7982 sha256=81a9dd4be09f50b39028e877a467f2ba48accfb55ffeea655a491dc1f0d28ccb\n", + " Stored in directory: /root/.cache/pip/wheels/36/0b/91/29d8725d273c025f2a67ea520ca72b23e56eb47ee032bdfdeb\n", + "Successfully built lomas-client\n", + "Installing collected packages: lomas-client\n", + "Successfully installed lomas-client-0.1.0\n", "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" ] } @@ -176,7 +180,7 @@ "id": "c7cb5531", "metadata": {}, "source": [ - "### a. Getting dataset metadata\n", + "### Getting dataset metadata\n", "\n", "Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the `get_dataset_metadata()` function of the client. As this is public information, this does not cost any budget.\n", "\n", @@ -226,17 +230,7 @@ "id": "d338ed96", "metadata": {}, "source": [ - "Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) with their associated categories (i.e. the species column has 3 possibilities: 'Adelie', 'Chinstrap', 'Gentoo') and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds (i.e. the body mass of penguin ranges from 2000 to 7000 gramms). She also knows based on the field `max_ids: 1` that each penguin can only be once in the dataset and on the field `row_privacy: True` that each row represents a single penguin. Finally, she learns that there are 344 rows in the dataset and hence 344 penguins." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "8719c070-16a3-4228-a09f-944178aa1ba7", - "metadata": {}, - "outputs": [], - "source": [ - "NB_PENGUINS = penguin_metadata[\"rows\"]" + "Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) with their associated categories (i.e. the species column has 3 possibilities: 'Adelie', 'Chinstrap', 'Gentoo') and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds (i.e. the body mass of penguin ranges from 2000 to 7000 gramms). She also knows based on the field `max_ids: 1` that each penguin can only be once in the dataset and on the field `row_privacy: True` that each row represents a single penguin. " ] }, { @@ -244,30 +238,30 @@ "id": "5a3c899d", "metadata": {}, "source": [ - "### b. Get a dummy dataset\n", + "### Get a dummy dataset\n", "\n", "Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset. \n", "\n", "Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets.\n", "Getting a dummy dataset does not affect the budget as there is no differential privacy here. It is not a synthetic dataset and all that could be learn here is already present in the public metadata (it is created randomly on the fly based on the metadata).\n", "\n", - "Dr. Antartica first create a dummy dataset with 100 rows and chooses a seed of 0." + "Dr. Antartica first create a dummy dataset with 200 rows and chooses a seed of 0." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "01f4365a", "metadata": {}, "outputs": [], "source": [ - "NB_ROWS = 100\n", + "NB_ROWS = 200\n", "SEED = 0" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "3f553b29", "metadata": {}, "outputs": [ @@ -275,7 +269,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "(100, 7)\n" + "(200, 7)\n" ] }, { @@ -314,50 +308,50 @@ " Gentoo\n", " Biscoe\n", " 49.208473\n", - " 19.778165\n", - " 181.179588\n", - " 6532.777496\n", - " MALE\n", + " 16.117959\n", + " 190.125950\n", + " 2873.291927\n", + " FEMALE\n", " \n", " \n", " 1\n", " Gentoo\n", - " Dream\n", + " Torgersen\n", " 55.031628\n", - " 15.700080\n", - " 219.634349\n", - " 5870.236663\n", - " MALE\n", + " 19.963435\n", + " 242.929142\n", + " 3639.940005\n", + " FEMALE\n", " \n", " \n", " 2\n", " Chinstrap\n", " Torgersen\n", " 51.096718\n", - " 20.351940\n", - " 187.775184\n", - " 3665.725760\n", + " 16.777518\n", + " 159.961493\n", + " 5401.743330\n", " MALE\n", " \n", " \n", " 3\n", " Adelie\n", - " Dream\n", + " Biscoe\n", " 49.070911\n", - " 22.621885\n", - " 167.960368\n", - " 2405.506950\n", - " FEMALE\n", + " 14.796037\n", + " 244.530153\n", + " 2316.038092\n", + " MALE\n", " \n", " \n", " 4\n", " Chinstrap\n", - " Torgersen\n", + " Biscoe\n", " 44.827918\n", - " 15.487531\n", - " 152.467873\n", - " 4036.205857\n", - " MALE\n", + " 13.246787\n", + " 236.948853\n", + " 5036.246870\n", + " FEMALE\n", " \n", " \n", "\n", @@ -365,21 +359,21 @@ ], "text/plain": [ " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Gentoo Biscoe 49.208473 19.778165 181.179588 \n", - "1 Gentoo Dream 55.031628 15.700080 219.634349 \n", - "2 Chinstrap Torgersen 51.096718 20.351940 187.775184 \n", - "3 Adelie Dream 49.070911 22.621885 167.960368 \n", - "4 Chinstrap Torgersen 44.827918 15.487531 152.467873 \n", + "0 Gentoo Biscoe 49.208473 16.117959 190.125950 \n", + "1 Gentoo Torgersen 55.031628 19.963435 242.929142 \n", + "2 Chinstrap Torgersen 51.096718 16.777518 159.961493 \n", + "3 Adelie Biscoe 49.070911 14.796037 244.530153 \n", + "4 Chinstrap Biscoe 44.827918 13.246787 236.948853 \n", "\n", " body_mass_g sex \n", - "0 6532.777496 MALE \n", - "1 5870.236663 MALE \n", - "2 3665.725760 MALE \n", - "3 2405.506950 FEMALE \n", - "4 4036.205857 MALE " + "0 2873.291927 FEMALE \n", + "1 3639.940005 FEMALE \n", + "2 5401.743330 MALE \n", + "3 2316.038092 MALE \n", + "4 5036.246870 FEMALE " ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -396,25 +390,116 @@ }, { "cell_type": "markdown", - "id": "bb03bf8f-62b7-4929-8757-e662eee7de41", + "id": "98e6fda2-dde7-4f8b-a787-c9a1e3571ebe", + "metadata": {}, + "source": [ + "### Query on dummy dataset\n", + "Now that she has an idea of what the data looks like, she wants to start querying the real dataset for her research. \n", + "\n", + "However, her budget is limited and it would be a waste to spend it by mistake on a coding error. Therefore the client/server pipeline has functionnal testing capabilities for the users. It is possible to test a query on a `dummy` dataset to ensure that everything is working properly. Dr. Antartica will not be able to use the results of a dummy query for her analysis (as the data is random) but if the query on the dummy dataset works, she can be confident that her query will also work on the real dataset.\n", + "This functionnal testing on the dummy does not have any impact on the budget as it is on random data only.\n", + "\n", + "To test on the dummy data instead of the real data, the function call is exactly the same with the only exception of the flag `dummy=True`. In the following cell, she will test with `smartnoise_query` but it is the same flag for `opendp_query`. She can optionnaly give two additional parameters to set the seed and the number of rows of the dummy dataset.\n", + "\n", + "Another more advanced possibility for functionnal tests with the dummy is to compare results of queries on a local dummy and the remote dummy with a very high budget: \n", + "- create a local dummy on the notebook with a specific seed and number of rows\n", + "- compute locally the wanted query on this local dummy with python functions like numpy\n", + "- query the server on the same remote dummy with (`dummy=True`, same seed and same number of row) and a very big buget to limit noise as much as possible (don't worry this won't cost any real budget)\n", + "- compare and verify that the local and remote dummy have similar results." + ] + }, + { + "cell_type": "markdown", + "id": "243c73e3-daec-45d6-a3c8-ae1d60439ec4", "metadata": {}, "source": [ - "### c. Check privacy loss budget ε, δ (initial, current, remaining)" + "#### Average and number of rows with smartnoise-sql library on remote dummy" ] }, { "cell_type": "markdown", - "id": "d4d5b481-0cf9-4de9-86b9-158ac413af6b", + "id": "d1f8ea18-ccab-4f75-9490-b4d1144b39db", "metadata": {}, "source": [ - "It is the first time that Dr. Antartica connects to the server and she wants to know how much buget has beeen assigned to her.\n", - "Therefore, she calls the fonction `get_initial_budget`." + "Dr. Antartica will now try a query to get the number of penguin and their average bill length (in mm) on the dummy dataset. She does not forget to \n", + "- set the `dummy` flag to True\n", + "- set very high budget values to be able to compare results with a similar local dummy (with the same seed and number of rows) if she wants to verify that the function do what is expected. Here she will just check that the number of rows is close to what she sets as parameter." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "3946425d", + "metadata": {}, + "outputs": [], + "source": [ + "# Number of penguin and average bill length in mm\n", + "QUERY = \"SELECT COUNT(*) AS nb_penguins, \\\n", + " AVG(bill_length_mm) AS avg_bill_length_mm \\\n", + " FROM df\"" ] }, { "cell_type": "code", "execution_count": 9, - "id": "9bd99db9-9de9-4b25-8718-989fea27b15a", + "id": "90cf2a6d", + "metadata": {}, + "outputs": [], + "source": [ + "# On the remote server dummy dataframe\n", + "dummy_res = client.smartnoise_sql_query(\n", + " query = QUERY, \n", + " epsilon = 100.0,\n", + " delta = 0.99,\n", + " dummy = True, \n", + " nb_rows = NB_ROWS,\n", + " seed = SEED\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a30f277e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average bill length in remote dummy: 47.52mm.\n", + "Number of rows in remote dummy: 200.\n" + ] + } + ], + "source": [ + "print(f\"Average bill length in remote dummy: {np.round(dummy_res['query_response']['avg_bill_length_mm'][0], 2)}mm.\")\n", + "print(f\"Number of rows in remote dummy: {np.round(dummy_res['query_response']['nb_penguins'][0], 2)}.\")" + ] + }, + { + "cell_type": "markdown", + "id": "167e8c6d-6c93-4ab4-9ba7-bf7e783a6bc2", + "metadata": {}, + "source": [ + "No functionnal errors happened and the estimated number of rows is very close (if not equal) to the number of rows that she set for the dummy dataframe. She is now even more confident in using her query on the server." + ] + }, + { + "cell_type": "markdown", + "id": "324454ed", + "metadata": {}, + "source": [ + "### Get current budget\n", + "\n", + "It is the first time that Dr. Antartica connects to the server and she wants to know how much buget the queen assigned her.\n", + "Therefore, she calls the fonction `get_initial_budget`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "61a467f3", "metadata": {}, "outputs": [ { @@ -423,7 +508,7 @@ "{'initial_epsilon': 10.0, 'initial_delta': 0.005}" ] }, - "execution_count": 9, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -434,7 +519,7 @@ }, { "cell_type": "markdown", - "id": "b48a8f93-8be9-4b9d-a6e8-8811d749650d", + "id": "bc8f7a74", "metadata": {}, "source": [ "She sees that she has 10.0 epsilon and 0.005 epsilon at her disposal.\n", @@ -444,8 +529,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "99a4dd26-53af-412e-bcd1-f06fff57e6a4", + "execution_count": 12, + "id": "afd22f84", "metadata": {}, "outputs": [ { @@ -454,7 +539,7 @@ "{'total_spent_epsilon': 0.0, 'total_spent_delta': 0.0}" ] }, - "execution_count": 10, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -465,7 +550,7 @@ }, { "cell_type": "markdown", - "id": "c4c7d708-90f9-4bdf-a93e-ea3007609b62", + "id": "05daf5a4", "metadata": {}, "source": [ "It will also be useful to know what the remaining budget is. Therefore, she calls the function `get_remaining_budget`. It just substarcts the total spent budget from the initial budget." @@ -473,8 +558,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "f67e0596-5f96-4c8b-a843-3fbaef02bab1", + "execution_count": 13, + "id": "6260cf54", "metadata": {}, "outputs": [ { @@ -483,7 +568,7 @@ "{'remaining_epsilon': 10.0, 'remaining_delta': 0.005}" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -494,7 +579,7 @@ }, { "cell_type": "markdown", - "id": "1ac73b0b-f9db-4513-af13-0bb2f75f8977", + "id": "20298e00", "metadata": {}, "source": [ "As expected, for now the remaining budget is equal to the inital budget." @@ -502,72 +587,21 @@ }, { "cell_type": "markdown", - "id": "a05e25b0-4ece-45b7-af37-cb3d5c987bac", - "metadata": {}, - "source": [ - "## Step 4: Use DP libraries to analyse the dataset\n", - "Available DP libraires are:\n", - "- Smartnoise-SQL for SQL-like queries\n", - "- Smartnoise-Synth for generating synthetic datasets\n", - "- OpenDP for summary statistics\n", - "- DiffPrivLib for training Machine Learning models" - ] - }, - { - "cell_type": "markdown", - "id": "7533c5e9-b937-41c7-8271-2a9d46e8d228", - "metadata": {}, - "source": [ - "For each library, there are three possibilities: \n", - "- estimate the cost of a query (will NOT spend privacy loss budget)\n", - "- query on a 'dummy' dataset (explained below) (will NOT spend privacy loss budget)\n", - "- query on the private dataset (WILL SPEND PRIVACY LOSS BUDGET)" - ] - }, - { - "cell_type": "markdown", - "id": "dd5d21f0-73de-426d-b25b-7e991787b7af", - "metadata": {}, - "source": [ - "### a. Compute average bill length with Smartnoise-SQL" - ] - }, - { - "cell_type": "markdown", - "id": "42df0cae-1a9e-4c4b-ba0f-beac838d8826", + "id": "b746374c", "metadata": {}, "source": [ - "Dr. Antartica wants to know the average bill length of penguins. Therefore, she will use `smartnoise-sql` library and write the associated SQL command." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "a0de0cfa-af54-46f7-9144-8778fb1a66c5", - "metadata": {}, - "outputs": [], - "source": [ - "# Average bill length in mm\n", - "QUERY = \"SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df\"" - ] - }, - { - "cell_type": "markdown", - "id": "211510aa-b4ce-4cfa-9ffb-4a540b5e0c49", - "metadata": {}, - "source": [ - "#### Estimate cost of a query with smartnoise-sql\n", - "She will then estimate the cost of this query. In the various DP librairies the budget that will by used by a query in the server might be slightly different than what is asked by the user in inptu. The `estimate cost` function of each library returns the cost that will effectively be sent and deduced if the query is applied on the sensitive dataset.\n", + "### Estimate cost of a query\n", + "Another safeguard is the functionnality to estimate the cost of a query. As in OpenDP and SmartnoiseSQL, the budget that will by used by a query might be slightly different than what is asked by the user. The `estimate cost` function returns the estimated real cost of any query.\n", "\n", - "The user can then decide to use the budget or modify it. Again, of course, this will not impact the user's budget.\n", + "Again, of course, this will not impact the user's budget.\n", "\n", "Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an `epsilon` and a `delta`." ] }, { "cell_type": "code", - "execution_count": 13, - "id": "47663a1f-2b91-4f8a-8565-b3d7c9667e76", + "execution_count": 14, + "id": "fd5ed08a", "metadata": {}, "outputs": [], "source": [ @@ -577,128 +611,35 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "e1a2b948-cf11-4325-a05e-147a0b4aaa30", + "execution_count": 15, + "id": "133020c6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 1.0, 'delta_cost': 4.999999999999449e-05}" + "{'epsilon_cost': 1.5, 'delta_cost': 0.00014999500000001387}" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "cost = client.estimate_smartnoise_sql_cost(\n", + "client.estimate_smartnoise_sql_cost(\n", " query = QUERY, \n", " epsilon = EPSILON, \n", " delta = DELTA\n", - ")\n", - "cost" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "4547b70f-0623-4ae6-93f1-9eaca724e514", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "This query would actually cost her 1.0 epsilon and 4.999999999999449e-05 delta.\n" - ] - } - ], - "source": [ - "print(f\"This query would actually cost her {cost['epsilon_cost']} epsilon and {cost['delta_cost']} delta.\")" - ] - }, - { - "cell_type": "markdown", - "id": "a93f7c2b-e30a-4be5-bf56-ad61f2834673", - "metadata": {}, - "source": [ - "She decides that it is good enough." - ] - }, - { - "cell_type": "markdown", - "id": "98e6fda2-dde7-4f8b-a787-c9a1e3571ebe", - "metadata": {}, - "source": [ - "#### Query average bill length on dummy dataset with smartnoise-sql\n", - "She now wants to start querying the real dataset for her research. \n", - "\n", - "However, her budget is limited and it would be a waste to spend it by mistake on a coding error. Therefore the client/server pipeline has functionnal testing capabilities for the users. It is possible to test a query on a `dummy` dataset to ensure that everything is working properly. Dr. Antartica will not be able to use the results of a dummy query for her analysis (as the data is random) but if the query on the dummy dataset works, she can be confident that her query will also work on the real dataset.\n", - "This functionnal testing on the dummy does not have any impact on the budget as it is on random data only.\n", - "\n", - "To test on the dummy data instead of the real data, the function call is exactly the same with the only exception of the flag `dummy=True`. In the following cell, she will test with `smartnoise_query` but it is the same flag for `opendp_query`. She can optionnaly give two additional parameters to set the seed and the number of rows of the dummy dataset.\n", - "\n", - "Another more advanced possibility for functionnal tests with the dummy is to compare results of queries on a local dummy and the remote dummy with a very high budget: \n", - "- create a local dummy on the notebook with a specific seed and number of rows\n", - "- compute locally the wanted query on this local dummy with python functions like numpy\n", - "- query the server on the same remote dummy with (`dummy=True`, same seed and same number of row) and a very big buget to limit noise as much as possible (don't worry this won't cost any real budget)\n", - "- compare and verify that the local and remote dummy have similar results." - ] - }, - { - "cell_type": "markdown", - "id": "d1f8ea18-ccab-4f75-9490-b4d1144b39db", - "metadata": {}, - "source": [ - "Dr. Antartica will follow the best practice and now try the query to get the average bill length (in mm) on the dummy dataset. She does not forget to \n", - "- set the `dummy` flag to True\n", - "- set very high budget values to be able to compare results with a similar local dummy (with the same seed and number of rows) if she wants to verify that the function do what is expected. Here she will just check that the number of rows is close to what she sets as parameter." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "90cf2a6d", - "metadata": {}, - "outputs": [], - "source": [ - "# On the remote server dummy dataframe\n", - "dummy_res = client.smartnoise_sql_query(\n", - " query = QUERY,\n", - " epsilon = 100.0,\n", - " delta = 0.99,\n", - " dummy = True, \n", - " nb_rows = NB_ROWS,\n", - " seed = SEED\n", ")" ] }, - { - "cell_type": "code", - "execution_count": 17, - "id": "a30f277e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average bill length in remote dummy: 46.54mm.\n" - ] - } - ], - "source": [ - "print(f\"Average bill length in remote dummy: {np.round(dummy_res['query_response']['avg_bill_length_mm'][0], 2)}mm.\")" - ] - }, { "cell_type": "markdown", - "id": "167e8c6d-6c93-4ab4-9ba7-bf7e783a6bc2", + "id": "3c6a3a8c", "metadata": {}, "source": [ - "No functionnal errors happened and the average bill length is within reasonable bounds. She is now even more confident in using her query on the server." + "This query would actually cost her 1.5 epsilon and delta 1.4999e-4. She decides that it is good enough." ] }, { @@ -706,7 +647,7 @@ "id": "e5379edf", "metadata": {}, "source": [ - "#### Query average bill length on private dataset with smartnoise-sql\n", + "### Query on real private dataset with smartnoise-sql\n", "Now that all the safeguard functions were tested, Dr. Antartica is ready to query on the real dataset and get a differentially private response of the number of penguins and average bill length. By default, the flag `dummy` is False so setting it is optional. She uses the values of `epsilon` and `delta` that she selected just before.\n", "\n", "Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query." @@ -714,7 +655,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "id": "19e60263", "metadata": {}, "outputs": [ @@ -724,7 +665,7 @@ "{'remaining_epsilon': 10.0, 'remaining_delta': 0.005}" ] }, - "execution_count": 18, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -735,7 +676,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "id": "69767fac", "metadata": {}, "outputs": [], @@ -744,13 +685,13 @@ " query = QUERY, \n", " epsilon = EPSILON, \n", " delta = DELTA,\n", - " dummy = False # APPLIED ON SENSITIVE DATA, WILL SPEND BUDGET\n", + " dummy = False # Optionnal\n", ")" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "id": "6dbbdf93", "metadata": {}, "outputs": [ @@ -758,11 +699,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "Average bill length of penguins in real data: 43.83mm.\n" + "Number of penguins in real data: 343.\n", + "Average bill length of penguins in real data: 43.27mm.\n" ] } ], "source": [ + "nb_penguins = response['query_response']['nb_penguins'].iloc[0]\n", + "print(f\"Number of penguins in real data: {nb_penguins}.\")\n", + "\n", "avg_bill_length = np.round(response['query_response']['avg_bill_length_mm'].iloc[0], 2)\n", "print(f\"Average bill length of penguins in real data: {avg_bill_length}mm.\")" ] @@ -777,57 +722,82 @@ }, { "cell_type": "code", - "execution_count": 21, - "id": "39701fe5", + "execution_count": 19, + "id": "4ced8a56-e2c3-4bd1-b94b-95cbbcd58a15", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'remaining_epsilon': 9.0, 'remaining_delta': 0.004950000000000006}" + "{'requested_by': 'Dr. Antartica',\n", + " 'query_response': nb_penguins avg_bill_length_mm\n", + " 0 343 43.267492,\n", + " 'spent_epsilon': 1.5,\n", + " 'spent_delta': 0.00014999500000001387}" ] }, - "execution_count": 21, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "e37c587f", - "metadata": {}, - "source": [ - "As can be seen in `get_total_spent_budget()`, it is the budget estimated with `estimate_smartnoise_cost()` that was spent." + "response" ] }, { "cell_type": "code", - "execution_count": 22, - "id": "487f835f", + "execution_count": 20, + "id": "39701fe5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'total_spent_epsilon': 1.0, 'total_spent_delta': 4.999999999999449e-05}" + "{'remaining_epsilon': 8.5, 'remaining_delta': 0.004850004999999986}" ] }, - "execution_count": 22, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "client.get_total_spent_budget()" + "client.get_remaining_budget()" ] }, { "cell_type": "markdown", - "id": "eef4afcd", + "id": "e37c587f", + "metadata": {}, + "source": [ + "As can be seen in `get_total_spent_budget()`, it is the budget estimated with `estimate_smartnoise_cost()` that was spent." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "487f835f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'total_spent_epsilon': 1.5, 'total_spent_delta': 0.00014999500000001387}" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.get_total_spent_budget()" + ] + }, + { + "cell_type": "markdown", + "id": "eef4afcd", "metadata": {}, "source": [ "Dr. Antartica has now a differentially private estimation of the number of penguins in the dataset and is confident to use the library for the rest of her analyses." @@ -838,12 +808,12 @@ "id": "04929993", "metadata": {}, "source": [ - "### b. Compute confidence interval with opendp" + "## Step 4: Penguin statistics with opendp" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "b9685226", "metadata": {}, "outputs": [], @@ -853,46 +823,59 @@ "import opendp.measurements as meas" ] }, + { + "cell_type": "markdown", + "id": "bbbca191", + "metadata": {}, + "source": [ + "### Confidence intervals for bill length over the whole population" + ] + }, { "cell_type": "markdown", "id": "9d41bd58", "metadata": {}, "source": [ - "She now wants the confidence interval of bill length in mm. She already has the number of penguins and the average from the metadata and previous smartnoise-sql queries respectively. She now needs the variance value.\n", + "She is first interested to have a better idea of the distribution of bill length of all species. She already has the count and average from the previous step, so she only needs the variance values.\n", "\n", - "#### Prepare opendp pipeline and verify on dummy\n", - "She checks the metadata of the columns again to use the relevant values in the pipeline." + "She first checks the metadata again to use the relevant values in the pipeline." ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "4331d86f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Adelie', 'Chinstrap', 'Gentoo']},\n", - " 'island': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Torgersen', 'Biscoe', 'Dream']},\n", - " 'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},\n", - " 'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},\n", - " 'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},\n", - " 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},\n", - " 'sex': {'type': 'string', 'cardinality': 2, 'categories': ['MALE', 'FEMALE']}}" + "{'max_ids': 1,\n", + " 'row_privacy': True,\n", + " 'censor_dims': False,\n", + " 'columns': {'species': {'type': 'string',\n", + " 'cardinality': 3,\n", + " 'categories': ['Adelie', 'Chinstrap', 'Gentoo']},\n", + " 'island': {'type': 'string',\n", + " 'cardinality': 3,\n", + " 'categories': ['Torgersen', 'Biscoe', 'Dream']},\n", + " 'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},\n", + " 'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},\n", + " 'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},\n", + " 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},\n", + " 'sex': {'type': 'string',\n", + " 'cardinality': 2,\n", + " 'categories': ['MALE', 'FEMALE']}},\n", + " 'rows': 344}" ] }, - "execution_count": 24, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "penguin_metadata[\"columns\"]" + "penguin_metadata" ] }, { @@ -905,17 +888,17 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "ff8cb7b6", "metadata": {}, "outputs": [], "source": [ - "columns = list(penguin_metadata[\"columns\"].keys())" + "columns = [\"species\", \"island\", \"bill_length_mm\", \"bill_depth_mm\", \"flipper_length_mm\", \"body_mass_g\", \"sex\"]" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "70b2bdb1", "metadata": {}, "outputs": [ @@ -925,7 +908,7 @@ "(30.0, 65.0)" ] }, - "execution_count": 26, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -946,7 +929,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "75e4933b", "metadata": {}, "outputs": [], @@ -956,7 +939,7 @@ " trans.make_select_column(key=\"bill_length_mm\", TOA=str) >>\n", " trans.then_cast_default(TOA=float) >>\n", " trans.then_clamp(bounds=(bill_length_min, bill_length_max)) >>\n", - " trans.then_resize(size=NB_PENGUINS, constant=avg_bill_length) >>\n", + " trans.then_resize(size=nb_penguins.tolist(), constant=avg_bill_length) >>\n", " trans.then_variance()\n", ")" ] @@ -971,7 +954,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "8041a647", "metadata": {}, "outputs": [ @@ -979,12 +962,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "Server error status 400: {\"InvalidQueryException\":\"The pipeline provided is not a measurement. It cannot be processed in this server.\"}\n" + "Server error status 500: {\"InternalServerException\":\"Internal server error. Please contact the administrator of this service.\"}\n" ] } ], "source": [ - "# No instruction for noise addition mechanism: Expect to fail !!!\n", + "# Expect to fail !!!\n", "client.opendp_query(\n", " opendp_pipeline = bill_length_transformation_pipeline,\n", " dummy=True\n", @@ -1001,14 +984,14 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "b8162859", "metadata": {}, "outputs": [], "source": [ "var_bill_length_measurement_pipeline = (\n", " bill_length_transformation_pipeline >>\n", - " meas.then_laplace(scale=5.0) # Noise addition mechanism instructions\n", + " meas.then_laplace(scale=5.0)\n", ")" ] }, @@ -1022,7 +1005,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 41, "id": "df61bce0", "metadata": {}, "outputs": [ @@ -1030,7 +1013,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Dummy result for variance: 35.5\n" + "Dummy result for variance: 28.68\n" ] } ], @@ -1042,14 +1025,6 @@ "print(f\"Dummy result for variance: {np.round(dummy_var_res['query_response'], 2)}\")" ] }, - { - "cell_type": "markdown", - "id": "d52fd242-d45c-4a83-9fd0-01896db3e3eb", - "metadata": {}, - "source": [ - "#### Estimate cost with opendp" - ] - }, { "cell_type": "markdown", "id": "ded11ac4", @@ -1060,17 +1035,17 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 42, "id": "7ae7f735", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 0.7122093023265228, 'delta_cost': 0}" + "{'epsilon_cost': 0.7142857142866551, 'delta_cost': 0}" ] }, - "execution_count": 31, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1082,14 +1057,6 @@ "cost_res" ] }, - { - "cell_type": "markdown", - "id": "5e85bff9-1b40-4ef0-8fa4-3e504ebb916d", - "metadata": {}, - "source": [ - "#### Execute pipeline on real dataset with opendp" - ] - }, { "cell_type": "markdown", "id": "1c791d36", @@ -1100,7 +1067,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 43, "id": "085555a5", "metadata": {}, "outputs": [], @@ -1112,7 +1079,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 44, "id": "674332e7", "metadata": {}, "outputs": [ @@ -1120,21 +1087,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "Variance of bill length: 34.77 (from opendp query).\n" + "Number of penguins: 343 (from previous smartnoise-sql query).\n", + "Average bill length: 43.27 (from previous smartnoise-sql query).\n", + "Variance of bill length: 33.457 (from opendp query).\n" ] } ], "source": [ - "var_bill_length = np.round(var_res['query_response'], 2)\n", - "print(f\"Variance of bill length: {var_bill_length} (from opendp query).\")" - ] - }, - { - "cell_type": "markdown", - "id": "ddb058f9-42fa-4896-a38f-3bf67fc0b2fb", - "metadata": {}, - "source": [ - "#### Postprocessing: no additional provacy risk with DP" + "print(f\"Number of penguins: {nb_penguins} (from previous smartnoise-sql query).\")\n", + "\n", + "print(f\"Average bill length: {np.round(avg_bill_length, 2)} (from previous smartnoise-sql query).\")\n", + "\n", + "var_bill_length = var_res['query_response']\n", + "print(f\"Variance of bill length: {np.round(var_bill_length, 3)} (from opendp query).\")" ] }, { @@ -1147,7 +1112,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 45, "id": "f72b19d0", "metadata": {}, "outputs": [ @@ -1155,19 +1120,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "Standard error of bill length: 0.32.\n" + "Standard error of bill length: 0.31.\n" ] } ], "source": [ "# Get standard error\n", - "standard_error = np.sqrt(var_bill_length / NB_PENGUINS)\n", + "standard_error = np.sqrt(var_bill_length/nb_penguins)\n", "print(f\"Standard error of bill length: {np.round(standard_error, 2)}.\")" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 46, "id": "62630a03", "metadata": {}, "outputs": [ @@ -1175,1694 +1140,293 @@ "name": "stdout", "output_type": "stream", "text": [ - "The 95% confidence interval of the bill length of all penguins is [43.21, 44.45].\n" + "The 95% confidence interval of the bill length of all penguins is [42.66, 43.88].\n" ] } ], "source": [ " # Compute the 95% confidence interval\n", "ZSCORE = 1.96\n", - "lower_bound = np.round(avg_bill_length - ZSCORE * standard_error, 2)\n", - "upper_bound = np.round(avg_bill_length + ZSCORE * standard_error, 2)\n", + "lower_bound = np.round(avg_bill_length - ZSCORE*standard_error, 2)\n", + "upper_bound = np.round(avg_bill_length + ZSCORE*standard_error, 2)\n", "print(f\"The 95% confidence interval of the bill length of all penguins is [{lower_bound}, {upper_bound}].\")" ] }, { "cell_type": "markdown", - "id": "668a9790-4d73-45d0-a3d1-55f979f97cb0", + "id": "0d30d98e-26f4-44ec-a0f0-7a039f344860", "metadata": {}, "source": [ - "### c. Train a DP Machine Learning model with DiffPrivLib" + "### Count per species" ] }, { - "cell_type": "code", - "execution_count": 36, - "id": "9cbcd0cf-4211-4a55-aa71-0679e7b2fa63", + "cell_type": "markdown", + "id": "b6a3cc00-8734-4479-81a3-781c91b8eb06", "metadata": {}, - "outputs": [], "source": [ - "from sklearn.pipeline import Pipeline\n", - "from diffprivlib import models\n", - "import pandas as pd" + "She can also creates an histogram of the number of penguin per species.\n", + "\n", + "She first extract the categories from the metadata:" ] }, { - "cell_type": "markdown", - "id": "780e56d9-7395-4396-bd2c-634e9bb82c63", + "cell_type": "code", + "execution_count": 47, + "id": "558916a6-78a9-4589-abe8-41472f0c66d7", "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Adelie', 'Chinstrap', 'Gentoo']" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "She now wants a model to predict the species of a penguin based on bill depth. Therefore, she uses a Random Forest classifier from DiffPrivLib library." + "categories = penguin_metadata['columns']['species']['categories']\n", + "categories" ] }, { "cell_type": "markdown", - "id": "cf20b748-8d4b-4f78-8d11-7f47ada6dd5f", + "id": "5f05aeb0-42d1-4444-a458-d2989494f544", "metadata": {}, "source": [ - "#### Prepare linear regression pipeline on dummy with DiffPrivLib" + "Then, writes the pipeline:" ] }, { "cell_type": "code", - "execution_count": 37, - "id": "b91b694d-2256-4c43-ac4f-091c6afb290a", + "execution_count": 48, + "id": "505a2793-6750-4f2a-9a9d-09f3a4ae4099", "metadata": {}, "outputs": [], "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']\n", - "target_columns = ['species']" + "species_count_pipeline = (\n", + " trans.make_split_dataframe(separator=\",\", col_names=columns) >>\n", + " trans.make_select_column(key=\"species\", TOA=str) >>\n", + " trans.then_count_by_categories(categories=categories) >>\n", + " meas.then_laplace(scale=0.5)\n", + ")" ] }, { - "cell_type": "code", - "execution_count": 38, - "id": "0bf7ea1f-873c-4068-ae8b-edee16316a08", + "cell_type": "markdown", + "id": "0f4109a9-c2f2-4365-bfa1-b5b2512919f9", "metadata": {}, - "outputs": [], "source": [ - "def get_bounds(cols_metadata, columns):\n", - " lower = [cols_metadata[col][\"lower\"] for col in columns]\n", - " upper = [cols_metadata[col][\"upper\"] for col in columns]\n", - " return (lower, upper)" + "Verify it works on the dummy:" ] }, { "cell_type": "code", - "execution_count": 39, - "id": "869d409c-1ee9-4eca-8189-976f844de284", + "execution_count": 49, + "id": "712b1c74-cac6-4b3f-9421-8d8ffa9debc7", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "([30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0])" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Dummy result for histogram: [38, 33, 29, 0]\n" + ] } ], "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)\n", - "bounds" + "dummy_res = client.opendp_query(\n", + " opendp_pipeline = species_count_pipeline, \n", + " dummy=True\n", + ")\n", + "print(f\"Dummy result for histogram: {dummy_res['query_response']}\")" ] }, { - "cell_type": "code", - "execution_count": 40, - "id": "6114c5f4-f8b1-4a8c-9770-e2a0ed7f180d", + "cell_type": "markdown", + "id": "66de7794-9aae-41d1-ba98-6b234a05d6f8", "metadata": {}, - "outputs": [], "source": [ - "dpl_pipeline = Pipeline([\n", - " ('rf', models.RandomForestClassifier(\n", - " n_estimators=10, \n", - " epsilon = 2.0, \n", - " bounds=bounds, \n", - " classes=['Adelie', 'Chinstrap', 'Gentoo'])\n", - " ),\n", - "])" + "Checks the required cost:" ] }, { "cell_type": "code", - "execution_count": 41, - "id": "389f3ca5-66c0-41d2-86bd-e7131bbe9184", + "execution_count": 50, + "id": "3f942b1b-94bc-468e-8374-3034f2e6b8ce", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
              Pipeline(steps=[('rf',\n",
              -       "                 RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n",
              -       "                                        bounds=(array([  30.,   13.,  150., 2000.]),\n",
              -       "                                                array([  65.,   23.,  250., 7000.])),\n",
              -       "                                        classes=['Adelie', 'Chinstrap',\n",
              -       "                                                 'Gentoo'],\n",
              -       "                                        epsilon=2.0))])
              In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
              On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
              " - ], "text/plain": [ - "Pipeline(steps=[('rf',\n", - " RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " classes=['Adelie', 'Chinstrap',\n", - " 'Gentoo'],\n", - " epsilon=2.0))])" + "{'epsilon_cost': 2.0, 'delta_cost': 0}" ] }, - "execution_count": 41, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dummy_response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.2,\n", - " test_train_split_seed = 1,\n", - " dummy = True\n", + "cost_res = client.estimate_opendp_cost(\n", + " opendp_pipeline = species_count_pipeline\n", ")\n", - "model = dummy_response['query_response']['model']\n", - "model" + "cost_res" ] }, { "cell_type": "markdown", - "id": "1875feea-17d0-4015-bfd0-de85200ee62c", + "id": "1adfe446-ff13-41f4-9f3c-9998e2ae0f00", "metadata": {}, "source": [ - "#### Estimate budget of Linear Regression with DiffPrivLib" + "And finally apply the pipeline on the real dataset:" ] }, { "cell_type": "code", - "execution_count": 42, - "id": "e9f29610-52fc-4f0e-84fd-8d85cf52eea4", + "execution_count": 51, + "id": "c6fe47b7-048e-404a-bedb-720e734b0c70", + "metadata": {}, + "outputs": [], + "source": [ + "species_counts_res = client.opendp_query(\n", + " opendp_pipeline = species_count_pipeline, \n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "78d1aa05-2777-476b-9520-f9206399670d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 2.0, 'delta_cost': 0.0}" + "{'requested_by': 'Dr. Antartica',\n", + " 'query_response': [152, 68, 124, 0],\n", + " 'spent_epsilon': 2.0,\n", + " 'spent_delta': 0}" ] }, - "execution_count": 42, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "cost_res = client.estimate_diffprivlib_cost(\n", - " dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.2,\n", - " test_train_split_seed = 1\n", - ")\n", - "cost_res" + "species_counts_res" ] }, { - "cell_type": "markdown", - "id": "3012d12c-c304-4bb2-bac1-18b55094ec07", - "metadata": {}, + "cell_type": "code", + "execution_count": 53, + "id": "b8d5fd82-5ded-47ec-8135-f6870865055d", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Species Adelie has 152 penguins.\n", + "Species Chinstrap has 68 penguins.\n", + "Species Gentoo has 124 penguins.\n", + "Species Unknown has 0 penguins.\n" + ] + } + ], "source": [ - "#### Train linear regression on sensitive data with DiffPrivLib" + "for i, count in enumerate(species_counts_res['query_response']):\n", + " if i == len(categories):\n", + " print(f\"Species Unknown has {count} penguins.\")\n", + " else:\n", + " print(f\"Species {categories[i]} has {count} penguins.\")" ] }, { - "cell_type": "code", - "execution_count": 43, - "id": "62538ac0-c6aa-4950-82e8-f53510f17d77", + "cell_type": "markdown", + "id": "94eaf59b-c108-424c-8978-b1c86e141ccb", "metadata": {}, - "outputs": [], "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.1,\n", - " test_train_split_seed = 1,\n", - " dummy = False\n", - ")" + "## Step 5: See archives of queries" ] }, { - "cell_type": "code", - "execution_count": 44, - "id": "7727b13a-cd2f-4f97-b550-88a4360fd601", + "cell_type": "markdown", + "id": "64003c53-de56-4bdc-a3c2-0c3e40031919", "metadata": {}, - "outputs": [], "source": [ - "# Return the mean accuracy. \n", - "model_score = response['query_response']['score']" + "She now wants to verify all the queries that she did on the real data. It is possible because an archive of all queries is kept in a secure database. With a function call she can see her queries, budget and associated responses." ] }, { "cell_type": "code", - "execution_count": 45, - "id": "600d6c6e-7567-4564-92ad-d1538ac10af5", + "execution_count": 55, + "id": "008fd230-cdfd-4e03-91ce-5a60b06c106d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'The model has a mean accuracy of 0.24. It is a harsh metric because we are in a multi-label classification case.'" + "[{'user_name': 'Dr. Antartica',\n", + " 'dataset_name': 'PENGUIN',\n", + " 'dp_librairy': 'opendp',\n", + " 'client_input': {'dataset_name': 'PENGUIN',\n", + " 'opendp_json': ,\n", + " 'fixed_delta': None},\n", + " 'response': {'requested_by': 'Dr. Antartica',\n", + " 'query_response': 33.45739909117274,\n", + " 'spent_epsilon': 0.7142857142866551,\n", + " 'spent_delta': 0},\n", + " 'timestamp': 1725006741.9967923},\n", + " {'user_name': 'Dr. Antartica',\n", + " 'dataset_name': 'PENGUIN',\n", + " 'dp_librairy': 'opendp',\n", + " 'client_input': {'dataset_name': 'PENGUIN',\n", + " 'opendp_json': ,\n", + " 'fixed_delta': None},\n", + " 'response': {'requested_by': 'Dr. Antartica',\n", + " 'query_response': [152, 68, 124, 0],\n", + " 'spent_epsilon': 2.0,\n", + " 'spent_delta': 0},\n", + " 'timestamp': 1725006753.331767}]" ] }, - "execution_count": 45, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "f\"The model has a mean accuracy of {np.round(model_score, 2)}. It is a harsh metric because we are in a multi-label classification case.\"" + "previous_queries = client.get_previous_queries()\n", + "previous_queries" ] }, { "cell_type": "code", - "execution_count": 46, - "id": "1824eea1-6ad8-4d2f-86d5-456a89318fef", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
              Pipeline(steps=[('rf',\n",
              -       "                 RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n",
              -       "                                        bounds=(array([  30.,   13.,  150., 2000.]),\n",
              -       "                                                array([  65.,   23.,  250., 7000.])),\n",
              -       "                                        classes=['Adelie', 'Chinstrap',\n",
              -       "                                                 'Gentoo'],\n",
              -       "                                        epsilon=2.0))])
              In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
              On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
              " - ], - "text/plain": [ - "Pipeline(steps=[('rf',\n", - " RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " classes=['Adelie', 'Chinstrap',\n", - " 'Gentoo'],\n", - " epsilon=2.0))])" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model = response['query_response']['model']\n", - "model" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "1e4a56bd-95bf-4355-81a6-eaf7d16f69c8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'For these feature values, the predicted species is is Adelie.'" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [30.0], 'bill_depth_mm': [20.0], 'flipper_length_mm': [170.0], 'body_mass_g': [5000.0]\n", - "})\n", - "predictions = model.predict(x_to_predict)[0]\n", - "f\"For these feature values, the predicted species is is {predictions}.\"" - ] - }, - { - "cell_type": "markdown", - "id": "09cb0eff-9864-42a3-a87a-cef2f7eca216", - "metadata": {}, - "source": [ - "### d. Get a Synthetic Dataset with Smartnoise-Synth" - ] - }, - { - "cell_type": "markdown", - "id": "790fe272-ae04-4daf-933e-6a9d86ac691f", - "metadata": {}, - "source": [ - "Finally she gets a synthetic dataset to do the rest of her analysis. She chooses to only train on a subset on 3 columns: \"island\", \"bill_length_mm\" and \"bill_depth_mm\" but if we wanted she could train on the whole dataset.\n", - "She also decides to use the `patectgan` synthesizer and keep all other default parameters." - ] - }, - { - "cell_type": "markdown", - "id": "ded384a2-dcf6-43af-98b0-ae058b2a03ba", - "metadata": {}, - "source": [ - "#### Train patectgan synthesizer on dummy data with Smartnoise-Synth" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "ed292cec-8497-4e5b-b3bf-cca9227abf7d", + "execution_count": null, + "id": "b712b269-64f2-4c7e-b8bf-d1a608933eff", "metadata": {}, "outputs": [], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"patectgan\",\n", - " select_cols = [\"island\", \"bill_length_mm\", \"bill_depth_mm\"],\n", - " epsilon=1.0,\n", - " dummy=True,\n", - ")\n", - "dummy_synth_df = res_dummy['query_response']" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "6fab49d9-f5c5-437e-b70f-234b84c2f7e5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
              \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
              islandbill_length_mmbill_depth_mm
              0Dream48.51158514.830853
              1Dream46.05884921.126229
              2Dream43.44215619.632390
              3Dream37.87703521.214375
              4Dream52.55203119.885068
              \n", - "
              " - ], - "text/plain": [ - " island bill_length_mm bill_depth_mm\n", - "0 Dream 48.511585 14.830853\n", - "1 Dream 46.058849 21.126229\n", - "2 Dream 43.442156 19.632390\n", - "3 Dream 37.877035 21.214375\n", - "4 Dream 52.552031 19.885068" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dummy_synth_df.head()" - ] - }, - { - "cell_type": "markdown", - "id": "f75ef712-3d58-4548-904e-6f1da72493f7", - "metadata": {}, - "source": [ - "#### Estimate cost of training patectgan synthesizer with Smartnoise-Synth" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "82ab4aee-b4af-4fbd-93cc-b8171f7f9a52", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 1.0, 'delta_cost': 0.00015673368198174188}" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res_cost = client.estimate_smartnoise_synth_cost(\n", - " synth_name=\"patectgan\",\n", - " epsilon=1.0,\n", - " select_cols = [\"island\", \"bill_length_mm\", \"bill_depth_mm\"],\n", - ")\n", - "res_cost" - ] - }, - { - "cell_type": "markdown", - "id": "804e2119-1513-45b2-a989-f5566e6c7bf4", - "metadata": {}, - "source": [ - "#### Train patectgan synthesizer on private data with Smartnoise-Synth" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "fbc8b354-e4db-4472-957b-468e768eddc4", - "metadata": {}, - "outputs": [], - "source": [ - "res = client.smartnoise_synth_query(\n", - " synth_name=\"patectgan\",\n", - " select_cols = [\"island\", \"bill_length_mm\", \"bill_depth_mm\"],\n", - " epsilon=1.0,\n", - " dummy=False,\n", - ")\n", - "synth_df = res['query_response']" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "550fa89d-9537-4daf-9f96-42fa71f242b9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
              \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
              islandbill_length_mmbill_depth_mm
              0Dream52.04094515.677968
              1Dream47.59786817.673375
              2Torgersen57.00434515.573335
              3Biscoe37.55950219.513633
              4Dream46.81385815.565315
              \n", - "
              " - ], - "text/plain": [ - " island bill_length_mm bill_depth_mm\n", - "0 Dream 52.040945 15.677968\n", - "1 Dream 47.597868 17.673375\n", - "2 Torgersen 57.004345 15.573335\n", - "3 Biscoe 37.559502 19.513633\n", - "4 Dream 46.813858 15.565315" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "synth_df.head()" - ] - }, - { - "cell_type": "markdown", - "id": "b3ae2259-3d83-46c6-a59c-9df178d98dc5", - "metadata": {}, - "source": [ - "Out of curiosity, she checks the average bill length and variance of bill length on this dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "7d5a336e-80f0-48fa-84a3-33d0e51a2d3b", - "metadata": {}, - "outputs": [], - "source": [ - "synth_mean = np.round(synth_df[\"bill_length_mm\"].mean(), 2)\n", - "synth_variance = np.round(synth_df[\"bill_length_mm\"].var(), 2)" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "e890a8d9-0c7b-4805-be8a-81e66d5fa7ca", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The average with Smartnoise-SQL on private data was 43.83.\n", - "The average with Smartnoise-Synth on synthetic data is 44.65.\n" - ] - } - ], - "source": [ - "print(\n", - " f\"The average with Smartnoise-SQL on private data was {avg_bill_length}.\\n\"\n", - " + f\"The average with Smartnoise-Synth on synthetic data is {synth_mean}.\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "11a14d9f-0fe3-4a5e-b425-d2192acd1e84", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The variance with opendp on private data was 34.77.\n", - "The variance with Smartnoise-Synth on synthetic data is 36.15.\n" - ] - } - ], - "source": [ - "print(\n", - " f\"The variance with opendp on private data was {var_bill_length}.\\n\"\n", - " + f\"The variance with Smartnoise-Synth on synthetic data is {synth_variance}.\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "94eaf59b-c108-424c-8978-b1c86e141ccb", - "metadata": {}, - "source": [ - "## Step 4: See archives of queries" - ] - }, - { - "cell_type": "markdown", - "id": "64003c53-de56-4bdc-a3c2-0c3e40031919", - "metadata": {}, - "source": [ - "She now wants to verify all the queries that she did on the real data. It is possible because an archive of all queries is kept in a secure database. With a function call she can see her queries, budget and associated responses." - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "008fd230-cdfd-4e03-91ce-5a60b06c106d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "previous_queries = client.get_previous_queries()\n", - "len(previous_queries)" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "b712b269-64f2-4c7e-b8bf-d1a608933eff", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'smartnoise_sql',\n", - " 'client_input': {'query_str': 'SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'epsilon': 0.5,\n", - " 'delta': 0.0001,\n", - " 'mechanisms': {},\n", - " 'postprocess': True},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'index': [0],\n", - " 'columns': ['avg_bill_length_mm'],\n", - " 'data': [[43.825255002419716]],\n", - " 'index_names': [None],\n", - " 'column_names': [None]},\n", - " 'spent_epsilon': 1.0,\n", - " 'spent_delta': 4.999999999999449e-05},\n", - " 'timestamp': 1725364882.6916816}" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Smartnoise-SQL\n", - "avg_bill_length_query = previous_queries[0]\n", - "avg_bill_length_query" - ] + "source": [] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": null, "id": "8dfaf2b6-2b6c-480b-bcd7-250b0b2806a6", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'opendp',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'opendp_json': Measurement(\n", - " input_domain = AtomDomain(T=String),\n", - " input_metric = SymmetricDistance(),\n", - " output_measure = MaxDivergence(f64)),\n", - " 'fixed_delta': None},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': 34.769447201112094,\n", - " 'spent_epsilon': 0.7122093023265228,\n", - " 'spent_delta': 0},\n", - " 'timestamp': 1725364890.340155}" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# OpenDP\n", - "var_bill_length_query = previous_queries[1]\n", - "var_bill_length_query" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "376315ec-6f38-4919-959e-d6bf244a4952", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'diffprivlib',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'diffprivlib_json': '{\"module\": \"diffprivlib\", \"version\": \"0.6.4\", \"pipeline\": [{\"type\": \"_dpl_type:RandomForestClassifier\", \"name\": \"rf\", \"params\": {\"n_estimators\": 10, \"n_jobs\": 1, \"random_state\": null, \"verbose\": 0, \"warm_start\": false, \"max_depth\": 5, \"epsilon\": 2.0, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0]]}, \"classes\": [\"Adelie\", \"Chinstrap\", \"Gentoo\"], \"shuffle\": false, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}]}',\n", - " 'feature_columns': ['bill_length_mm',\n", - " 'bill_depth_mm',\n", - " 'flipper_length_mm',\n", - " 'body_mass_g'],\n", - " 'target_columns': ['species'],\n", - " 'test_size': 0.1,\n", - " 'test_train_split_seed': 1,\n", - " 'imputer_strategy': 'drop'},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'score': 0.23529411764705882,\n", - " 'model': Pipeline(steps=[('rf',\n", - " RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " classes=['Adelie', 'Chinstrap',\n", - " 'Gentoo'],\n", - " epsilon=2.0))])},\n", - " 'spent_epsilon': 2.0,\n", - " 'spent_delta': 0.0},\n", - " 'timestamp': 1725364897.0776813}" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# DiffPrivLib\n", - "reg_bill_length_query = previous_queries[2]\n", - "reg_bill_length_query" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "638817e0-d88f-407a-8136-210309651cf2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'smartnoise_synth',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'synth_name': 'patectgan',\n", - " 'epsilon': 1.0,\n", - " 'delta': None,\n", - " 'select_cols': ['island', 'bill_length_mm', 'bill_depth_mm'],\n", - " 'synth_params': {},\n", - " 'nullable': True,\n", - " 'constraints': '',\n", - " 'return_model': False,\n", - " 'condition': '',\n", - " 'nb_samples': 200},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': island bill_length_mm bill_depth_mm\n", - " 0 Dream 52.040945 15.677968\n", - " 1 Dream 47.597868 17.673375\n", - " 2 Torgersen 57.004345 15.573335\n", - " 3 Biscoe 37.559502 19.513633\n", - " 4 Dream 46.813858 15.565315\n", - " .. ... ... ...\n", - " 195 Dream 41.009962 18.210038\n", - " 196 Dream 50.174224 18.534705\n", - " 197 Biscoe 42.890809 15.596290\n", - " 198 Torgersen 47.442859 15.934119\n", - " 199 Biscoe 45.300011 18.687155\n", - " \n", - " [200 rows x 3 columns],\n", - " 'spent_epsilon': 1.0,\n", - " 'spent_delta': 0.00015673368198174188},\n", - " 'timestamp': 1725364925.3299136}" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Smartnoise-Synth\n", - "sysynth_query = previous_queries[3]\n", - "sysynth_query" - ] + "outputs": [], + "source": [] }, { "cell_type": "code", "execution_count": null, - "id": "416d3afc-6455-4252-b883-2b6984233513", + "id": "376315ec-6f38-4919-959e-d6bf244a4952", "metadata": {}, "outputs": [], "source": [] diff --git a/html/v0.3.1/en/notebooks/Demo_Client_Notebook.ipynb b/html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb.txt similarity index 60% rename from html/v0.3.1/en/notebooks/Demo_Client_Notebook.ipynb rename to html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb.txt index 7dd7394f..ed1104bd 100644 --- a/html/v0.3.1/en/notebooks/Demo_Client_Notebook.ipynb +++ b/html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook_DiffPrivLib.ipynb.txt @@ -5,7 +5,7 @@ "id": "3f18d338", "metadata": {}, "source": [ - "# Lomas: Client demo" + "# Secure Data Disclosure: Client side" ] }, { @@ -13,7 +13,7 @@ "id": "1582a2ae", "metadata": {}, "source": [ - "This notebook showcases how researcher could use the Lomas platform. It explains the different functionnalities provided by the `lomas-client` library to interact with the secure server.\n", + "This notebook showcases how researcher could use the Secure Data Disclosure system. It explains the different functionnalities provided by the `fso-sdd-demo` client library to interact with the secure server.\n", "\n", "The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.\n", "\n", @@ -57,7 +57,7 @@ "\n", "Therefore, the powerful queen Icerbegina 👑 had the data collected. But in order to get the penguins to agree to participate she promised them that no one would be able to look at the data and that no one would be able to guess the bill width of any specific penguin (which is very sensitive information) from the data. Nobody! Not even the researchers. The queen hence stored the data on the Secure Data Disclosure Server and only gave a small budget to Dr. Antarctica.\n", "\n", - "This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library `lomas-client`. \n", + "This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library `fso-sdd-demo`. \n", "🐧🐧🐧" ] }, @@ -67,7 +67,7 @@ "metadata": {}, "source": [ "## Step 1: Install the library\n", - "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `lomas-client` on her local developping environment. \n", + "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `fso-sdd-demo` on her local developping environment. \n", "\n", "It can be installed via the pip command:" ] @@ -75,49 +75,20 @@ { "cell_type": "code", "execution_count": 2, - "id": "28fbdd79-8c15-49a9-bcf9-fcdeac09d2b5", + "id": "36d508bf-6cc3-4034-8e11-fffe858552f9", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: lomas-client in /usr/local/lib/python3.11/site-packages (0.3.0)\n", - "Requirement already satisfied: diffprivlib>=0.6.4 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.6.4)\n", - "Requirement already satisfied: diffprivlib-logger>=0.0.3 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.0.3)\n", - "Requirement already satisfied: numpy>=1.24.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (1.24.0)\n", - "Requirement already satisfied: opendp==0.10.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.10.0)\n", - "Requirement already satisfied: opendp-logger==0.3.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.3.0)\n", - "Requirement already satisfied: pandas>=2.2.2 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.2.2)\n", - "Requirement already satisfied: requests>=2.32.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.32.0)\n", - "Requirement already satisfied: scikit-learn==1.4.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (1.4.0)\n", - "Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.11/site-packages (from scikit-learn==1.4.0->lomas-client) (1.14.1)\n", - "Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/site-packages (from scikit-learn==1.4.0->lomas-client) (1.4.2)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.11/site-packages (from scikit-learn==1.4.0->lomas-client) (3.5.0)\n", - "Requirement already satisfied: setuptools>=49.0.0 in /usr/local/lib/python3.11/site-packages (from diffprivlib>=0.6.4->lomas-client) (65.5.1)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/site-packages (from pandas>=2.2.2->lomas-client) (2.9.0.post0)\n", - "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/site-packages (from pandas>=2.2.2->lomas-client) (2024.1)\n", - "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/site-packages (from pandas>=2.2.2->lomas-client) (2024.1)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (3.8)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (2.2.2)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/site-packages (from requests>=2.32.0->lomas-client) (2024.8.30)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=2.2.2->lomas-client) (1.16.0)\n", - "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", - "\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.2\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" - ] - } - ], + "outputs": [], "source": [ - "!pip install lomas-client" + "import sys\n", + "import os\n", + "sys.path.append(os.path.abspath(os.path.join('..')))\n", + "# !pip install lomas_client" ] }, { "cell_type": "code", "execution_count": 3, - "id": "6fb569fc", + "id": "9535e92e-620e-4df4-92dd-4ea2c653e4ab", "metadata": {}, "outputs": [], "source": [ @@ -160,7 +131,7 @@ "id": "0ec400c8", "metadata": {}, "source": [ - "And that's it for the preparation. She is now ready to use the various functionnalities offered by `lomas_client`." + "And that's it for the preparation. She is now ready to use the various functionnalities offered by `fso_sdd_demo`." ] }, { @@ -168,7 +139,7 @@ "id": "9b9a5f13", "metadata": {}, "source": [ - "## Step 3: Understand the functionnalities of the library" + "## Step 3: Metadata and dummy dataset" ] }, { @@ -176,7 +147,7 @@ "id": "c7cb5531", "metadata": {}, "source": [ - "### a. Getting dataset metadata\n", + "### Getting dataset metadata\n", "\n", "Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the `get_dataset_metadata()` function of the client. As this is public information, this does not cost any budget.\n", "\n", @@ -207,8 +178,7 @@ " 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},\n", " 'sex': {'type': 'string',\n", " 'cardinality': 2,\n", - " 'categories': ['MALE', 'FEMALE']}},\n", - " 'rows': 344}" + " 'categories': ['MALE', 'FEMALE']}}}" ] }, "execution_count": 5, @@ -226,17 +196,7 @@ "id": "d338ed96", "metadata": {}, "source": [ - "Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) with their associated categories (i.e. the species column has 3 possibilities: 'Adelie', 'Chinstrap', 'Gentoo') and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds (i.e. the body mass of penguin ranges from 2000 to 7000 gramms). She also knows based on the field `max_ids: 1` that each penguin can only be once in the dataset and on the field `row_privacy: True` that each row represents a single penguin. Finally, she learns that there are 344 rows in the dataset and hence 344 penguins." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "8719c070-16a3-4228-a09f-944178aa1ba7", - "metadata": {}, - "outputs": [], - "source": [ - "NB_PENGUINS = penguin_metadata[\"rows\"]" + "Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) with their associated categories (i.e. the species column has 3 possibilities: 'Adelie', 'Chinstrap', 'Gentoo') and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds (i.e. the body mass of penguin ranges from 2000 to 7000 gramms). She also knows based on the field `max_ids: 1` that each penguin can only be once in the dataset and on the field `row_privacy: True` that each row represents a single penguin. " ] }, { @@ -244,30 +204,30 @@ "id": "5a3c899d", "metadata": {}, "source": [ - "### b. Get a dummy dataset\n", + "### Get a dummy dataset\n", "\n", "Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset. \n", "\n", "Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets.\n", "Getting a dummy dataset does not affect the budget as there is no differential privacy here. It is not a synthetic dataset and all that could be learn here is already present in the public metadata (it is created randomly on the fly based on the metadata).\n", "\n", - "Dr. Antartica first create a dummy dataset with 100 rows and chooses a seed of 0." + "Dr. Antartica first create a dummy dataset with 200 rows and chooses a seed of 0." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "01f4365a", "metadata": {}, "outputs": [], "source": [ - "NB_ROWS = 100\n", + "NB_ROWS = 200\n", "SEED = 0" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "3f553b29", "metadata": {}, "outputs": [ @@ -275,7 +235,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "(100, 7)\n" + "(200, 7)\n" ] }, { @@ -314,50 +274,50 @@ " Gentoo\n", " Biscoe\n", " 49.208473\n", - " 19.778165\n", - " 181.179588\n", - " 6532.777496\n", - " MALE\n", + " 16.117959\n", + " 190.125950\n", + " 2873.291927\n", + " FEMALE\n", " \n", " \n", " 1\n", " Gentoo\n", - " Dream\n", + " Torgersen\n", " 55.031628\n", - " 15.700080\n", - " 219.634349\n", - " 5870.236663\n", - " MALE\n", + " 19.963435\n", + " 242.929142\n", + " 3639.940005\n", + " FEMALE\n", " \n", " \n", " 2\n", " Chinstrap\n", " Torgersen\n", " 51.096718\n", - " 20.351940\n", - " 187.775184\n", - " 3665.725760\n", + " 16.777518\n", + " 159.961493\n", + " 5401.743330\n", " MALE\n", " \n", " \n", " 3\n", " Adelie\n", - " Dream\n", + " Biscoe\n", " 49.070911\n", - " 22.621885\n", - " 167.960368\n", - " 2405.506950\n", - " FEMALE\n", + " 14.796037\n", + " 244.530153\n", + " 2316.038092\n", + " MALE\n", " \n", " \n", " 4\n", " Chinstrap\n", - " Torgersen\n", + " Biscoe\n", " 44.827918\n", - " 15.487531\n", - " 152.467873\n", - " 4036.205857\n", - " MALE\n", + " 13.246787\n", + " 236.948853\n", + " 5036.246870\n", + " FEMALE\n", " \n", " \n", "\n", @@ -365,21 +325,21 @@ ], "text/plain": [ " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", - "0 Gentoo Biscoe 49.208473 19.778165 181.179588 \n", - "1 Gentoo Dream 55.031628 15.700080 219.634349 \n", - "2 Chinstrap Torgersen 51.096718 20.351940 187.775184 \n", - "3 Adelie Dream 49.070911 22.621885 167.960368 \n", - "4 Chinstrap Torgersen 44.827918 15.487531 152.467873 \n", + "0 Gentoo Biscoe 49.208473 16.117959 190.125950 \n", + "1 Gentoo Torgersen 55.031628 19.963435 242.929142 \n", + "2 Chinstrap Torgersen 51.096718 16.777518 159.961493 \n", + "3 Adelie Biscoe 49.070911 14.796037 244.530153 \n", + "4 Chinstrap Biscoe 44.827918 13.246787 236.948853 \n", "\n", " body_mass_g sex \n", - "0 6532.777496 MALE \n", - "1 5870.236663 MALE \n", - "2 3665.725760 MALE \n", - "3 2405.506950 FEMALE \n", - "4 4036.205857 MALE " + "0 2873.291927 FEMALE \n", + "1 3639.940005 FEMALE \n", + "2 5401.743330 MALE \n", + "3 2316.038092 MALE \n", + "4 5036.246870 FEMALE " ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -396,332 +356,210 @@ }, { "cell_type": "markdown", - "id": "bb03bf8f-62b7-4929-8757-e662eee7de41", + "id": "9e7ca7ae-bf17-40c8-aa75-2d72fcdd3088", "metadata": {}, "source": [ - "### c. Check privacy loss budget ε, δ (initial, current, remaining)" + "## Step 4: Train Logistic Regression model with DiffPrivLib" ] }, { "cell_type": "markdown", - "id": "d4d5b481-0cf9-4de9-86b9-158ac413af6b", + "id": "2de1389c-53a7-4098-bc3c-397c12a4b869", "metadata": {}, "source": [ - "It is the first time that Dr. Antartica connects to the server and she wants to know how much buget has beeen assigned to her.\n", - "Therefore, she calls the fonction `get_initial_budget`." + "We want to train an ML model to guess the species of penguins based on their bill length and depth, flipper length and body mass.\n", + "\n", + "Therefore, we use a DiffPrivLib pipeline which:\n", + "- standard scales the dimensions between the metadata bounds\n", + "- and then performs a logistic regression\n", + "to predict the species of penguins." ] }, { "cell_type": "code", - "execution_count": 9, - "id": "9bd99db9-9de9-4b25-8718-989fea27b15a", + "execution_count": 8, + "id": "2864729f-2ce4-4d81-a446-8e3f2c1493b3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'initial_epsilon': 10.0, 'initial_delta': 0.005}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "client.get_initial_budget()" + "from sklearn.pipeline import Pipeline\n", + "from diffprivlib import models\n", + "import pandas as pd" ] }, { "cell_type": "markdown", - "id": "b48a8f93-8be9-4b9d-a6e8-8811d749650d", + "id": "a06365e9-4076-4592-871a-31af91d6a05d", "metadata": {}, "source": [ - "She sees that she has 10.0 epsilon and 0.005 epsilon at her disposal.\n", - "\n", - "Then she checks her total spent budget `get_total_spent_budget`. As she only did queries on metadata on dummy dataframes, this should still be 0." + "### Classification: Logistic Regression" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "99a4dd26-53af-412e-bcd1-f06fff57e6a4", + "execution_count": 9, + "id": "32e81639-2a52-4a92-aead-785a30e5483f", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'total_spent_epsilon': 0.0, 'total_spent_delta': 0.0}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "client.get_total_spent_budget()" + "import warnings\n", + "from diffprivlib import models\n", + "from diffprivlib.utils import (\n", + " DiffprivlibCompatibilityWarning,\n", + " PrivacyLeakWarning,\n", + ")\n", + "warnings.simplefilter(\"error\", DiffprivlibCompatibilityWarning)" ] }, { "cell_type": "markdown", - "id": "c4c7d708-90f9-4bdf-a93e-ea3007609b62", + "id": "eead3541-66e5-4c0f-aa5b-7b97821afe39", "metadata": {}, "source": [ - "It will also be useful to know what the remaining budget is. Therefore, she calls the function `get_remaining_budget`. It just substarcts the total spent budget from the initial budget." + "#### DiffprivlibCompatibilityWarning will not work" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "f67e0596-5f96-4c8b-a843-3fbaef02bab1", + "execution_count": 10, + "id": "804f31cd-f277-47d4-9648-a51872eccf29", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'remaining_epsilon': 10.0, 'remaining_delta': 0.005}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" + "ename": "DiffprivlibCompatibilityWarning", + "evalue": "Parameter 'svd_solver' is not functional in diffprivlib. Remove this parameter to suppress this warning.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mDiffprivlibCompatibilityWarning\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[10], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m dpl_pipeline \u001b[38;5;241m=\u001b[39m Pipeline([\n\u001b[1;32m 2\u001b[0m (\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mscaler\u001b[39m\u001b[38;5;124m'\u001b[39m, models\u001b[38;5;241m.\u001b[39mStandardScaler(epsilon \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.5\u001b[39m)),\n\u001b[0;32m----> 3\u001b[0m (\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mclassifier\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[43mmodels\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mLogisticRegression\u001b[49m\u001b[43m(\u001b[49m\u001b[43mepsilon\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1.0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msvd_solver\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mfull\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 4\u001b[0m ])\n", + "File \u001b[0;32m/usr/local/lib/python3.11/site-packages/diffprivlib/models/logistic_regression.py:194\u001b[0m, in \u001b[0;36mLogisticRegression.__init__\u001b[0;34m(self, epsilon, data_norm, tol, C, fit_intercept, max_iter, verbose, warm_start, n_jobs, random_state, accountant, **unused_args)\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclasses_ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 192\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maccountant \u001b[38;5;241m=\u001b[39m BudgetAccountant\u001b[38;5;241m.\u001b[39mload_default(accountant)\n\u001b[0;32m--> 194\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_warn_unused_args\u001b[49m\u001b[43m(\u001b[49m\u001b[43munused_args\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/usr/local/lib/python3.11/site-packages/diffprivlib/utils.py:71\u001b[0m, in \u001b[0;36mwarn_unused_args\u001b[0;34m(args)\u001b[0m\n\u001b[1;32m 68\u001b[0m args \u001b[38;5;241m=\u001b[39m [args]\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m arg \u001b[38;5;129;01min\u001b[39;00m args:\n\u001b[0;32m---> 71\u001b[0m \u001b[43mwarnings\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwarn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mParameter \u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43marg\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m is not functional in diffprivlib. Remove this parameter to suppress this \u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 72\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mwarning.\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mDiffprivlibCompatibilityWarning\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mDiffprivlibCompatibilityWarning\u001b[0m: Parameter 'svd_solver' is not functional in diffprivlib. Remove this parameter to suppress this warning." + ] } ], "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "1ac73b0b-f9db-4513-af13-0bb2f75f8977", - "metadata": {}, - "source": [ - "As expected, for now the remaining budget is equal to the inital budget." - ] - }, - { - "cell_type": "markdown", - "id": "a05e25b0-4ece-45b7-af37-cb3d5c987bac", - "metadata": {}, - "source": [ - "## Step 4: Use DP libraries to analyse the dataset\n", - "Available DP libraires are:\n", - "- Smartnoise-SQL for SQL-like queries\n", - "- Smartnoise-Synth for generating synthetic datasets\n", - "- OpenDP for summary statistics\n", - "- DiffPrivLib for training Machine Learning models" - ] - }, - { - "cell_type": "markdown", - "id": "7533c5e9-b937-41c7-8271-2a9d46e8d228", - "metadata": {}, - "source": [ - "For each library, there are three possibilities: \n", - "- estimate the cost of a query (will NOT spend privacy loss budget)\n", - "- query on a 'dummy' dataset (explained below) (will NOT spend privacy loss budget)\n", - "- query on the private dataset (WILL SPEND PRIVACY LOSS BUDGET)" - ] - }, - { - "cell_type": "markdown", - "id": "dd5d21f0-73de-426d-b25b-7e991787b7af", - "metadata": {}, - "source": [ - "### a. Compute average bill length with Smartnoise-SQL" + "# DiffprivlibCompatibilityWarning Error expected\n", + "dpl_pipeline = Pipeline([\n", + " ('scaler', models.StandardScaler(epsilon = 0.5)),\n", + " ('classifier', models.LogisticRegression(epsilon = 1.0, svd_solver='full'))\n", + "])" ] }, { "cell_type": "markdown", - "id": "42df0cae-1a9e-4c4b-ba0f-beac838d8826", - "metadata": {}, - "source": [ - "Dr. Antartica wants to know the average bill length of penguins. Therefore, she will use `smartnoise-sql` library and write the associated SQL command." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "a0de0cfa-af54-46f7-9144-8778fb1a66c5", + "id": "15dd0c42-3e20-4b27-95b3-9b55622b4bfd", "metadata": {}, - "outputs": [], "source": [ - "# Average bill length in mm\n", - "QUERY = \"SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df\"" + "To resolve the DiffprivlibCompatibilityWarning issue, the svd_solver should not be set as it i incompatible with diffprivlib." ] }, { "cell_type": "markdown", - "id": "211510aa-b4ce-4cfa-9ffb-4a540b5e0c49", + "id": "9c5d7fa4-cfe6-4a4f-88ff-8e88ca31dfed", "metadata": {}, "source": [ - "#### Estimate cost of a query with smartnoise-sql\n", - "She will then estimate the cost of this query. In the various DP librairies the budget that will by used by a query in the server might be slightly different than what is asked by the user in inptu. The `estimate cost` function of each library returns the cost that will effectively be sent and deduced if the query is applied on the sensitive dataset.\n", - "\n", - "The user can then decide to use the budget or modify it. Again, of course, this will not impact the user's budget.\n", - "\n", - "Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an `epsilon` and a `delta`." + "#### PrivacyLeakWarning will not be processed within server" ] }, { "cell_type": "code", "execution_count": 13, - "id": "47663a1f-2b91-4f8a-8565-b3d7c9667e76", + "id": "f1c9cffb-8327-400d-ab9d-35c5450fd4d6", "metadata": {}, "outputs": [], "source": [ - "EPSILON = 0.5\n", - "DELTA = 1e-4" + "dpl_pipeline = Pipeline([\n", + " ('scaler', models.StandardScaler(epsilon = 0.5, bounds=BOUNDS)),\n", + " ('classifier', models.LogisticRegression(epsilon = 1.0))\n", + "])" ] }, { "cell_type": "code", "execution_count": 14, - "id": "e1a2b948-cf11-4325-a05e-147a0b4aaa30", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'epsilon_cost': 1.0, 'delta_cost': 4.999999999999449e-05}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cost = client.estimate_smartnoise_sql_cost(\n", - " query = QUERY, \n", - " epsilon = EPSILON, \n", - " delta = DELTA\n", - ")\n", - "cost" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "4547b70f-0623-4ae6-93f1-9eaca724e514", + "id": "db1ddfbc-de3e-43fe-9958-49f9e6dad89f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "This query would actually cost her 1.0 epsilon and 4.999999999999449e-05 delta.\n" + "Error while processing DiffPrivLib request in server status code: 422 message: {\"ExternalLibraryException\":\"PrivacyLeakWarning: Data norm has not been specified and will be calculated on the data provided. This will result in additional privacy leakage. To ensure differential privacy and no additional privacy leakage, specify `data_norm` at initialisation.. Lomas server cannot fit pipeline on data, PrivacyLeakWarning is a blocker.\",\"library\":\"diffprivlib\"}\n" ] } ], "source": [ - "print(f\"This query would actually cost her {cost['epsilon_cost']} epsilon and {cost['delta_cost']} delta.\")" - ] - }, - { - "cell_type": "markdown", - "id": "a93f7c2b-e30a-4be5-bf56-ad61f2834673", - "metadata": {}, - "source": [ - "She decides that it is good enough." - ] - }, - { - "cell_type": "markdown", - "id": "98e6fda2-dde7-4f8b-a787-c9a1e3571ebe", - "metadata": {}, - "source": [ - "#### Query average bill length on dummy dataset with smartnoise-sql\n", - "She now wants to start querying the real dataset for her research. \n", - "\n", - "However, her budget is limited and it would be a waste to spend it by mistake on a coding error. Therefore the client/server pipeline has functionnal testing capabilities for the users. It is possible to test a query on a `dummy` dataset to ensure that everything is working properly. Dr. Antartica will not be able to use the results of a dummy query for her analysis (as the data is random) but if the query on the dummy dataset works, she can be confident that her query will also work on the real dataset.\n", - "This functionnal testing on the dummy does not have any impact on the budget as it is on random data only.\n", - "\n", - "To test on the dummy data instead of the real data, the function call is exactly the same with the only exception of the flag `dummy=True`. In the following cell, she will test with `smartnoise_query` but it is the same flag for `opendp_query`. She can optionnaly give two additional parameters to set the seed and the number of rows of the dummy dataset.\n", - "\n", - "Another more advanced possibility for functionnal tests with the dummy is to compare results of queries on a local dummy and the remote dummy with a very high budget: \n", - "- create a local dummy on the notebook with a specific seed and number of rows\n", - "- compute locally the wanted query on this local dummy with python functions like numpy\n", - "- query the server on the same remote dummy with (`dummy=True`, same seed and same number of row) and a very big buget to limit noise as much as possible (don't worry this won't cost any real budget)\n", - "- compare and verify that the local and remote dummy have similar results." + "# Expect PrivacyLeakWarning Error\n", + "dummy_response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + " test_train_split_seed = 1,\n", + " dummy = True\n", + ")" ] }, { "cell_type": "markdown", - "id": "d1f8ea18-ccab-4f75-9490-b4d1144b39db", - "metadata": {}, - "source": [ - "Dr. Antartica will follow the best practice and now try the query to get the average bill length (in mm) on the dummy dataset. She does not forget to \n", - "- set the `dummy` flag to True\n", - "- set very high budget values to be able to compare results with a similar local dummy (with the same seed and number of rows) if she wants to verify that the function do what is expected. Here she will just check that the number of rows is close to what she sets as parameter." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "90cf2a6d", + "id": "c9d58006-89d5-4110-9657-641256bafaf9", "metadata": {}, - "outputs": [], "source": [ - "# On the remote server dummy dataframe\n", - "dummy_res = client.smartnoise_sql_query(\n", - " query = QUERY,\n", - " epsilon = 100.0,\n", - " delta = 0.99,\n", - " dummy = True, \n", - " nb_rows = NB_ROWS,\n", - " seed = SEED\n", - ")" + "Diffprivlib requests that have **PrivacyLeakWarning** will not be processed in the server. \n", + "In lomas, **the standard scaler must always be used as a first step** and filled based on the metadata values." ] }, { "cell_type": "code", - "execution_count": 17, - "id": "a30f277e", + "execution_count": 15, + "id": "12d1faa1-f88a-49bb-911a-83f879ca10b6", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average bill length in remote dummy: 46.54mm.\n" - ] + "data": { + "text/plain": [ + "([30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "print(f\"Average bill length in remote dummy: {np.round(dummy_res['query_response']['avg_bill_length_mm'][0], 2)}mm.\")" - ] - }, - { - "cell_type": "markdown", - "id": "167e8c6d-6c93-4ab4-9ba7-bf7e783a6bc2", - "metadata": {}, - "source": [ - "No functionnal errors happened and the average bill length is within reasonable bounds. She is now even more confident in using her query on the server." + "bl_l = penguin_metadata['columns']['bill_length_mm']['lower']\n", + "bl_u = penguin_metadata['columns']['bill_length_mm']['upper']\n", + "bd_l = penguin_metadata['columns']['bill_depth_mm']['lower']\n", + "bd_u = penguin_metadata['columns']['bill_depth_mm']['upper']\n", + "fl_l = penguin_metadata['columns']['flipper_length_mm']['lower']\n", + "fl_u = penguin_metadata['columns']['flipper_length_mm']['upper']\n", + "bm_l = penguin_metadata['columns']['body_mass_g']['lower']\n", + "bm_u = penguin_metadata['columns']['body_mass_g']['upper']\n", + "\n", + "BOUNDS = ([bl_l, bd_l, fl_l, bm_l], [bl_u, bd_u, fl_u, bm_u])\n", + "BOUNDS" ] }, { "cell_type": "markdown", - "id": "e5379edf", + "id": "c47aec3e-15ea-476d-9dcb-5b2f4888e355", "metadata": {}, "source": [ - "#### Query average bill length on private dataset with smartnoise-sql\n", - "Now that all the safeguard functions were tested, Dr. Antartica is ready to query on the real dataset and get a differentially private response of the number of penguins and average bill length. By default, the flag `dummy` is False so setting it is optional. She uses the values of `epsilon` and `delta` that she selected just before.\n", - "\n", - "Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query." + "For the same reason, the data_norm should be computed based on metadata and given as argument." ] }, { "cell_type": "code", "execution_count": 18, - "id": "19e60263", + "id": "25a72ad9-d3f3-478a-8d33-c07bedbf4f66", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'remaining_epsilon': 10.0, 'remaining_delta': 0.005}" + "83.69469642643347" ] }, "execution_count": 18, @@ -730,90 +568,69 @@ } ], "source": [ - "client.get_remaining_budget()" + "# The max l2 norm of any row of the data. This defines the spread of data that will be protected by differential privacy.\n", + "data_norm = np.sqrt(np.linalg.norm([bl_u, bd_u, fl_u, bm_u]))\n", + "data_norm" ] }, { "cell_type": "code", "execution_count": 19, - "id": "69767fac", + "id": "828a743e-960f-4713-a6ed-a0bd243a13e3", "metadata": {}, "outputs": [], "source": [ - "response = client.smartnoise_sql_query(\n", - " query = QUERY, \n", - " epsilon = EPSILON, \n", - " delta = DELTA,\n", - " dummy = False # APPLIED ON SENSITIVE DATA, WILL SPEND BUDGET\n", - ")" + "dpl_pipeline = Pipeline([\n", + " ('scaler', models.StandardScaler(epsilon = 0.5, bounds=([bl_l, bd_l, fl_l, bm_l], [bl_u, bd_u, fl_u, bm_u]))),\n", + " ('classifier', models.LogisticRegression(epsilon = 1.0, data_norm = data_norm))\n", + "])" ] }, { "cell_type": "code", "execution_count": 20, - "id": "6dbbdf93", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average bill length of penguins in real data: 43.83mm.\n" - ] - } - ], - "source": [ - "avg_bill_length = np.round(response['query_response']['avg_bill_length_mm'].iloc[0], 2)\n", - "print(f\"Average bill length of penguins in real data: {avg_bill_length}mm.\")" - ] - }, - { - "cell_type": "markdown", - "id": "b2767e65", + "id": "c9c13dfe-0266-4cd8-b126-2accee6c1136", "metadata": {}, + "outputs": [], "source": [ - "After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:" + "dummy_response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + " test_train_split_seed = 1,\n", + " dummy = True\n", + ")" ] }, { "cell_type": "code", "execution_count": 21, - "id": "39701fe5", + "id": "b3e7ceae-2813-47fe-b96f-dcc0d6bb207e", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'remaining_epsilon': 9.0, 'remaining_delta': 0.004950000000000006}" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "The accuracy score of the dummy_response is 0.3.\n" + ] } ], "source": [ - "client.get_remaining_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "e37c587f", - "metadata": {}, - "source": [ - "As can be seen in `get_total_spent_budget()`, it is the budget estimated with `estimate_smartnoise_cost()` that was spent." + "print(f\"The accuracy score of the dummy_response is {dummy_response['query_response']['score']}.\")" ] }, { "cell_type": "code", "execution_count": 22, - "id": "487f835f", + "id": "e036b55f-6c3d-4212-8d91-9ece8223cf69", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'total_spent_epsilon': 1.0, 'total_spent_delta': 4.999999999999449e-05}" + "{'epsilon_cost': 1.5, 'delta_cost': 0.0}" ] }, "execution_count": 22, @@ -822,441 +639,1335 @@ } ], "source": [ - "client.get_total_spent_budget()" - ] - }, - { - "cell_type": "markdown", - "id": "eef4afcd", - "metadata": {}, - "source": [ - "Dr. Antartica has now a differentially private estimation of the number of penguins in the dataset and is confident to use the library for the rest of her analyses." - ] - }, - { - "cell_type": "markdown", - "id": "04929993", - "metadata": {}, - "source": [ - "### b. Compute confidence interval with opendp" + "res = client.estimate_diffprivlib_cost(\n", + " dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + " test_train_split_seed = 1\n", + ")\n", + "res" ] }, { "cell_type": "code", "execution_count": 23, - "id": "b9685226", - "metadata": {}, - "outputs": [], - "source": [ - "import opendp as dp\n", - "import opendp.transformations as trans\n", - "import opendp.measurements as meas" - ] - }, - { - "cell_type": "markdown", - "id": "9d41bd58", - "metadata": {}, - "source": [ - "She now wants the confidence interval of bill length in mm. She already has the number of penguins and the average from the metadata and previous smartnoise-sql queries respectively. She now needs the variance value.\n", - "\n", - "#### Prepare opendp pipeline and verify on dummy\n", - "She checks the metadata of the columns again to use the relevant values in the pipeline." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "4331d86f", + "id": "4398755f-348f-47e2-9329-80c34897e16b", "metadata": {}, "outputs": [ { "data": { - "text/plain": [ - "{'species': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Adelie', 'Chinstrap', 'Gentoo']},\n", - " 'island': {'type': 'string',\n", - " 'cardinality': 3,\n", - " 'categories': ['Torgersen', 'Biscoe', 'Dream']},\n", - " 'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},\n", - " 'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},\n", - " 'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},\n", - " 'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},\n", - " 'sex': {'type': 'string', 'cardinality': 2, 'categories': ['MALE', 'FEMALE']}}" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" + "text/html": [ + "
              Pipeline(steps=[('scaler',\n",
              +       "                 StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n",
              +       "                                bounds=(array([  30.,   13.,  150., 2000.]),\n",
              +       "                                        array([  65.,   23.,  250., 7000.])),\n",
              +       "                                epsilon=0.5)),\n",
              +       "                ('classifier',\n",
              +       "                 LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n",
              +       "                                    data_norm=83.69469642643347))])
              In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
              On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
              " + ], + "text/plain": [ + "Pipeline(steps=[('scaler',\n", + " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", + " bounds=(array([ 30., 13., 150., 2000.]),\n", + " array([ 65., 23., 250., 7000.])),\n", + " epsilon=0.5)),\n", + " ('classifier',\n", + " LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", + " data_norm=83.69469642643347))])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dummy_response['query_response'][\"model\"]" + ] + }, + { + "cell_type": "markdown", + "id": "8aad5f86-20f7-42fe-8efd-56c96f6beb41", + "metadata": {}, + "source": [ + "Now we train the same pipeline on the real dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "b823db85-d993-4a36-9dea-bf5989c543f8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'requested_by': 'Dr. Antartica',\n", + " 'query_response': {'score': 0.13432835820895522,\n", + " 'model': Pipeline(steps=[('scaler',\n", + " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", + " bounds=(array([ 30., 13., 150., 2000.]),\n", + " array([ 65., 23., 250., 7000.])),\n", + " epsilon=0.5)),\n", + " ('classifier',\n", + " LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", + " data_norm=83.69469642643347))])},\n", + " 'spent_epsilon': 1.5,\n", + " 'spent_delta': 0.0}" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + " test_train_split_seed = 1\n", + ")\n", + "res" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "6c071425-5364-4d79-8ccf-4f46018ac849", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The accuracy score of the model trained on real data is 0.13432835820895522.\n" + ] + } + ], + "source": [ + "print(f\"The accuracy score of the model trained on real data is {res['query_response']['score']}.\")" + ] + }, + { + "cell_type": "markdown", + "id": "9cea3fc7-4331-4387-a19f-6afcaa21b6bc", + "metadata": {}, + "source": [ + "The model is of course the same but with different trained parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "b646cd08-504b-4846-88ba-a3557ee4b2fd", + "metadata": {}, + "outputs": [], + "source": [ + "model = res['query_response']['model']" + ] + }, + { + "cell_type": "markdown", + "id": "a581f47d-f1c7-4121-9f8f-e496e9023d58", + "metadata": {}, + "source": [ + "We predict what would be the specy of the smallest possible penguin in all dimension versus to biggest possible penguin in all dimensions." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "8cd3c335-f3b3-4f64-b708-737ae4623a5f", + "metadata": {}, + "outputs": [], + "source": [ + "x_to_predict = pd.DataFrame({\n", + " 'bill_length_mm': [bl_l, bl_u], \n", + " 'bill_depth_mm': [bd_l, bd_u] , \n", + " 'flipper_length_mm': [fl_l, fl_u], \n", + " 'body_mass_g': [bm_l, bm_u]\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "65413ef0-317b-431d-9ed8-6ffabe85c1b2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['Chinstrap', 'Gentoo'], dtype=object)" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "penguin_metadata[\"columns\"]" + "predictions = model.predict(x_to_predict)\n", + "predictions" + ] + }, + { + "cell_type": "markdown", + "id": "c1e968c0-f319-48c5-89cb-b8a255e822cb", + "metadata": {}, + "source": [ + "Indeed, Chinstrap penguins are typically smaller than Gentoo penguins." + ] + }, + { + "cell_type": "markdown", + "id": "839ba199-3014-4e39-8f0a-aecf15241b11", + "metadata": {}, + "source": [ + "## Step 5: Train other models with DiffPrivLib" ] }, { "cell_type": "markdown", - "id": "f90e0425", + "id": "fef35343-cdf6-4e86-a54a-4bcf6568f2ac", "metadata": {}, "source": [ - "She can define the columns names and the bounds of the relevant column." + "### Classification: Gaussian Naive Bayes" ] }, { "cell_type": "code", "execution_count": 25, - "id": "ff8cb7b6", + "id": "9dd37857-0ef2-44d5-b206-092262c9cea1", "metadata": {}, "outputs": [], "source": [ - "columns = list(penguin_metadata[\"columns\"].keys())" + "dpl_pipeline = Pipeline([\n", + " ('scaler', models.StandardScaler(epsilon = 0.5, bounds=BOUNDS)),\n", + " ('gaussian', models.GaussianNB(epsilon = 1.0, bounds=BOUNDS, priors = (0.3, 0.3, 0.4))),\n", + "])" ] }, { "cell_type": "code", "execution_count": 26, - "id": "70b2bdb1", + "id": "8e2c07c6-20f4-473c-80f6-b4b558191530", + "metadata": {}, + "outputs": [], + "source": [ + "dummy_response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + " dummy = True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "550868df-5476-496e-849d-8787da9eb27e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'epsilon_cost': 1.5, 'delta_cost': 0.0}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost_res = client.estimate_diffprivlib_cost(\n", + " dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + " test_train_split_seed = 1\n", + ")\n", + "cost_res" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "934a1237-68d1-4796-838e-e8c370068f5d", + "metadata": {}, + "outputs": [], + "source": [ + "response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "ec3c98d3-cb5d-4a96-9ada-ea9904326aec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['Adelie', 'Chinstrap'], dtype=object)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = res['query_response']['model']\n", + "predictions = model.predict(x_to_predict)\n", + "predictions" + ] + }, + { + "cell_type": "markdown", + "id": "c1224c94-d995-40f1-967d-b7afb21bce48", + "metadata": {}, + "source": [ + "### Random Forest" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "d4f036a7-0405-4f4b-a4a0-3fe1b0b8d4d0", + "metadata": {}, + "outputs": [], + "source": [ + "dpl_pipeline = Pipeline([\n", + " ('rf', models.RandomForestClassifier(n_estimators=10, epsilon = 2.0, bounds=BOUNDS, classes=['Adelie', 'Chinstrap', 'Gentoo'])),\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "c969d488-e1a2-445a-a269-681d96343b9f", + "metadata": {}, + "outputs": [], + "source": [ + "dummy_response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + " dummy = True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "de94f0a5-6e9d-4eac-aa77-b98892ed41fc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'epsilon_cost': 2.0, 'delta_cost': 0.0}" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost_res = client.estimate_diffprivlib_cost(\n", + " dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + " test_train_split_seed = 1\n", + ")\n", + "cost_res" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "40f25e33-a644-4938-8adb-a7bbe5306ee2", + "metadata": {}, + "outputs": [], + "source": [ + "response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "4f5fad30-991e-45f3-a7e3-1ae04bedd8a1", "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
              Pipeline(steps=[('scaler',\n",
              +       "                 StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n",
              +       "                                bounds=(array([  30.,   13.,  150., 2000.]),\n",
              +       "                                        array([  65.,   23.,  250., 7000.])),\n",
              +       "                                epsilon=0.5)),\n",
              +       "                ('classifier',\n",
              +       "                 LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n",
              +       "                                    data_norm=83.69469642643347))])
              In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
              On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
              " + ], "text/plain": [ - "(30.0, 65.0)" + "Pipeline(steps=[('scaler',\n", + " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", + " bounds=(array([ 30., 13., 150., 2000.]),\n", + " array([ 65., 23., 250., 7000.])),\n", + " epsilon=0.5)),\n", + " ('classifier',\n", + " LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", + " data_norm=83.69469642643347))])" ] }, - "execution_count": 26, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "bill_length_min = penguin_metadata['columns']['bill_length_mm']['lower']\n", - "bill_length_max = penguin_metadata['columns']['bill_length_mm']['upper']\n", - "bill_length_min, bill_length_max" - ] - }, - { - "cell_type": "markdown", - "id": "e93ae087", - "metadata": {}, - "source": [ - "She can now define the pipeline of the transformation to have the variance that she wants on the data:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "75e4933b", - "metadata": {}, - "outputs": [], - "source": [ - "bill_length_transformation_pipeline = (\n", - " trans.make_split_dataframe(separator=\",\", col_names=columns) >>\n", - " trans.make_select_column(key=\"bill_length_mm\", TOA=str) >>\n", - " trans.then_cast_default(TOA=float) >>\n", - " trans.then_clamp(bounds=(bill_length_min, bill_length_max)) >>\n", - " trans.then_resize(size=NB_PENGUINS, constant=avg_bill_length) >>\n", - " trans.then_variance()\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "411d464c", - "metadata": {}, - "source": [ - "However, when she tries to execute it on the server, she has an error (see below). " - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "8041a647", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Server error status 400: {\"InvalidQueryException\":\"The pipeline provided is not a measurement. It cannot be processed in this server.\"}\n" - ] - } - ], - "source": [ - "# No instruction for noise addition mechanism: Expect to fail !!!\n", - "client.opendp_query(\n", - " opendp_pipeline = bill_length_transformation_pipeline,\n", - " dummy=True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "d06c59dc", - "metadata": {}, - "source": [ - "This is because the server will only allow measurement pipeline with differentially private results. She adds Laplacian noise to the pipeline and should be able to instantiate the pipeline." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "b8162859", - "metadata": {}, - "outputs": [], - "source": [ - "var_bill_length_measurement_pipeline = (\n", - " bill_length_transformation_pipeline >>\n", - " meas.then_laplace(scale=5.0) # Noise addition mechanism instructions\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "fc7e0ecd", - "metadata": {}, - "source": [ - "Now that there is a measurement, she is able to apply the pipeline on the dummy dataset of the server." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "df61bce0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dummy result for variance: 35.5\n" - ] - } - ], - "source": [ - "dummy_var_res = client.opendp_query(\n", - " opendp_pipeline = var_bill_length_measurement_pipeline, \n", - " dummy=True\n", - ")\n", - "print(f\"Dummy result for variance: {np.round(dummy_var_res['query_response'], 2)}\")" - ] - }, - { - "cell_type": "markdown", - "id": "d52fd242-d45c-4a83-9fd0-01896db3e3eb", - "metadata": {}, - "source": [ - "#### Estimate cost with opendp" - ] - }, - { - "cell_type": "markdown", - "id": "ded11ac4", - "metadata": {}, - "source": [ - "With opendp, the function `estimate_opendp_cost` is particularly useful to estimate the used `epsilon` and `delta` based on the `scale` value." + "model = res['query_response']['model']\n", + "model" ] }, { "cell_type": "code", - "execution_count": 31, - "id": "7ae7f735", + "execution_count": 35, + "id": "96562928-73e8-48b1-b8a5-97245c7da8d2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 0.7122093023265228, 'delta_cost': 0}" + "array(['Adelie', 'Chinstrap'], dtype=object)" ] }, - "execution_count": 31, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "cost_res = client.estimate_opendp_cost(\n", - " opendp_pipeline = var_bill_length_measurement_pipeline\n", - ")\n", - "cost_res" - ] - }, - { - "cell_type": "markdown", - "id": "5e85bff9-1b40-4ef0-8fa4-3e504ebb916d", - "metadata": {}, - "source": [ - "#### Execute pipeline on real dataset with opendp" - ] - }, - { - "cell_type": "markdown", - "id": "1c791d36", - "metadata": {}, - "source": [ - "She can now execute the query on the real dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "085555a5", - "metadata": {}, - "outputs": [], - "source": [ - "var_res = client.opendp_query(\n", - " opendp_pipeline = var_bill_length_measurement_pipeline, \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "674332e7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Variance of bill length: 34.77 (from opendp query).\n" - ] - } - ], - "source": [ - "var_bill_length = np.round(var_res['query_response'], 2)\n", - "print(f\"Variance of bill length: {var_bill_length} (from opendp query).\")" - ] - }, - { - "cell_type": "markdown", - "id": "ddb058f9-42fa-4896-a38f-3bf67fc0b2fb", - "metadata": {}, - "source": [ - "#### Postprocessing: no additional provacy risk with DP" - ] - }, - { - "cell_type": "markdown", - "id": "367081be-1159-45d8-9129-88fba20fb697", - "metadata": {}, - "source": [ - "She can now do all the postprocessing that she wants with the returned data without adding any privacy risk. " - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "f72b19d0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Standard error of bill length: 0.32.\n" - ] - } - ], - "source": [ - "# Get standard error\n", - "standard_error = np.sqrt(var_bill_length / NB_PENGUINS)\n", - "print(f\"Standard error of bill length: {np.round(standard_error, 2)}.\")" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "62630a03", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The 95% confidence interval of the bill length of all penguins is [43.21, 44.45].\n" - ] - } - ], - "source": [ - " # Compute the 95% confidence interval\n", - "ZSCORE = 1.96\n", - "lower_bound = np.round(avg_bill_length - ZSCORE * standard_error, 2)\n", - "upper_bound = np.round(avg_bill_length + ZSCORE * standard_error, 2)\n", - "print(f\"The 95% confidence interval of the bill length of all penguins is [{lower_bound}, {upper_bound}].\")" - ] - }, - { - "cell_type": "markdown", - "id": "668a9790-4d73-45d0-a3d1-55f979f97cb0", - "metadata": {}, - "source": [ - "### c. Train a DP Machine Learning model with DiffPrivLib" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "9cbcd0cf-4211-4a55-aa71-0679e7b2fa63", - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.pipeline import Pipeline\n", - "from diffprivlib import models\n", - "import pandas as pd" + "predictions = model.predict(x_to_predict)\n", + "predictions" ] }, { "cell_type": "markdown", - "id": "780e56d9-7395-4396-bd2c-634e9bb82c63", + "id": "020ceeb1-7a78-4036-8ece-0afa88e49342", "metadata": {}, "source": [ - "She now wants a model to predict the species of a penguin based on bill depth. Therefore, she uses a Random Forest classifier from DiffPrivLib library." + "### Decision Tree Classifier" ] }, { - "cell_type": "markdown", - "id": "cf20b748-8d4b-4f78-8d11-7f47ada6dd5f", + "cell_type": "code", + "execution_count": 36, + "id": "22b5c5ae-b008-4980-8767-47e7a1ad3301", "metadata": {}, + "outputs": [], "source": [ - "#### Prepare linear regression pipeline on dummy with DiffPrivLib" + "dpl_pipeline = Pipeline([\n", + " ('dtc', models.DecisionTreeClassifier(epsilon = 2.0, bounds=BOUNDS, classes=['Adelie', 'Chinstrap', 'Gentoo'])),\n", + "])" ] }, { "cell_type": "code", "execution_count": 37, - "id": "b91b694d-2256-4c43-ac4f-091c6afb290a", + "id": "70b73ba0-67dc-4594-820c-0128916fafc8", "metadata": {}, "outputs": [], "source": [ - "feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']\n", - "target_columns = ['species']" + "dummy_response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + " test_train_split_seed = 1,\n", + " dummy = True,\n", + " nb_rows = 100,\n", + " seed = 42\n", + ")" ] }, { "cell_type": "code", "execution_count": 38, - "id": "0bf7ea1f-873c-4068-ae8b-edee16316a08", + "id": "736e8283-604a-4e45-9e98-7da5cc03e1b0", "metadata": {}, "outputs": [], "source": [ - "def get_bounds(cols_metadata, columns):\n", - " lower = [cols_metadata[col][\"lower\"] for col in columns]\n", - " upper = [cols_metadata[col][\"upper\"] for col in columns]\n", - " return (lower, upper)" + "response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = ['species'],\n", + " test_size = 0.2,\n", + ")" ] }, { "cell_type": "code", "execution_count": 39, - "id": "869d409c-1ee9-4eca-8189-976f844de284", + "id": "a3719359-58a6-4271-9a34-4b49e0d7188e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "([30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0])" + "array(['Adelie', 'Chinstrap'], dtype=object)" ] }, "execution_count": 39, @@ -1265,37 +1976,41 @@ } ], "source": [ - "bounds = get_bounds(penguin_metadata['columns'], columns=feature_columns)\n", - "bounds" + "model = res['query_response']['model']\n", + "predictions = model.predict(x_to_predict)\n", + "predictions" + ] + }, + { + "cell_type": "markdown", + "id": "4e72e9fc-bb5b-49d9-b4e6-543bdaf93f69", + "metadata": {}, + "source": [ + "### Regression: Linear Regression" ] }, { "cell_type": "code", "execution_count": 40, - "id": "6114c5f4-f8b1-4a8c-9770-e2a0ed7f180d", + "id": "907e6f6c-a3da-4f7c-8d85-b0a7b8c018d1", "metadata": {}, "outputs": [], "source": [ "dpl_pipeline = Pipeline([\n", - " ('rf', models.RandomForestClassifier(\n", - " n_estimators=10, \n", - " epsilon = 2.0, \n", - " bounds=bounds, \n", - " classes=['Adelie', 'Chinstrap', 'Gentoo'])\n", - " ),\n", + " ('lr', models.LinearRegression(epsilon = 2.0, bounds_X=(bl_l, bl_u), bounds_y=(bd_l, bd_u))),\n", "])" ] }, { "cell_type": "code", "execution_count": 41, - "id": "389f3ca5-66c0-41d2-86bd-e7131bbe9184", + "id": "58011a7d-7c03-4872-a032-5d93c55c1d5f", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
              Pipeline(steps=[('rf',\n",
              -       "                 RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n",
              -       "                                        bounds=(array([  30.,   13.,  150., 2000.]),\n",
              -       "                                                array([  65.,   23.,  250., 7000.])),\n",
              -       "                                        classes=['Adelie', 'Chinstrap',\n",
              -       "                                                 'Gentoo'],\n",
              -       "                                        epsilon=2.0))])
              In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
              On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
              " + "
              Pipeline(steps=[('lr',\n",
              +       "                 LinearRegression(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n",
              +       "                                  bounds_X=(array([30.]), array([65.])),\n",
              +       "                                  bounds_y=(array([13.]), array([23.])),\n",
              +       "                                  epsilon=2.0))])
              In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
              On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
              " ], "text/plain": [ - "Pipeline(steps=[('rf',\n", - " RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " classes=['Adelie', 'Chinstrap',\n", - " 'Gentoo'],\n", - " epsilon=2.0))])" + "Pipeline(steps=[('lr',\n", + " LinearRegression(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", + " bounds_X=(array([30.]), array([65.])),\n", + " bounds_y=(array([13.]), array([23.])),\n", + " epsilon=2.0))])" ] }, "execution_count": 41, @@ -1734,34 +2442,25 @@ "source": [ "dummy_response = client.diffprivlib_query(\n", " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.2,\n", - " test_train_split_seed = 1,\n", + " feature_columns = ['bill_length_mm'],\n", + " target_columns = ['bill_depth_mm'],\n", " dummy = True\n", ")\n", "model = dummy_response['query_response']['model']\n", "model" ] }, - { - "cell_type": "markdown", - "id": "1875feea-17d0-4015-bfd0-de85200ee62c", - "metadata": {}, - "source": [ - "#### Estimate budget of Linear Regression with DiffPrivLib" - ] - }, { "cell_type": "code", "execution_count": 42, - "id": "e9f29610-52fc-4f0e-84fd-8d85cf52eea4", + "id": "e28b1bd0-0e73-49db-a2d3-e7f06dc39d49", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 2.0, 'delta_cost': 0.0}" + "array([[18.84279457],\n", + " [18.24687217]])" ] }, "execution_count": 42, @@ -1770,83 +2469,42 @@ } ], "source": [ - "cost_res = client.estimate_diffprivlib_cost(\n", - " dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.2,\n", - " test_train_split_seed = 1\n", - ")\n", - "cost_res" + "# Dummy model predictions\n", + "x_to_predict = pd.DataFrame({'bill_length_mm': [bl_l, bl_u]})\n", + "predictions = model.predict(x_to_predict)\n", + "predictions" ] }, { "cell_type": "markdown", - "id": "3012d12c-c304-4bb2-bac1-18b55094ec07", - "metadata": {}, - "source": [ - "#### Train linear regression on sensitive data with DiffPrivLib" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "62538ac0-c6aa-4950-82e8-f53510f17d77", + "id": "ec9e921d-1640-4379-84e5-65b93a1ff203", "metadata": {}, - "outputs": [], "source": [ - "response = client.diffprivlib_query(\n", - " pipeline = dpl_pipeline,\n", - " feature_columns = feature_columns,\n", - " target_columns = target_columns,\n", - " test_size = 0.1,\n", - " test_train_split_seed = 1,\n", - " dummy = False\n", - ")" + "### Clustering: K-Means" ] }, { "cell_type": "code", - "execution_count": 44, - "id": "7727b13a-cd2f-4f97-b550-88a4360fd601", + "execution_count": 54, + "id": "1e830a01-7800-4701-aef2-11dbfc517f61", "metadata": {}, "outputs": [], "source": [ - "# Return the mean accuracy. \n", - "model_score = response['query_response']['score']" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "600d6c6e-7567-4564-92ad-d1538ac10af5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'The model has a mean accuracy of 0.24. It is a harsh metric because we are in a multi-label classification case.'" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f\"The model has a mean accuracy of {np.round(model_score, 2)}. It is a harsh metric because we are in a multi-label classification case.\"" + "dpl_pipeline = Pipeline([\n", + " ('kmeans', models.KMeans(n_clusters = 8, epsilon = 2.0, bounds=BOUNDS)),\n", + "])" ] }, { "cell_type": "code", - "execution_count": 46, - "id": "1824eea1-6ad8-4d2f-86d5-456a89318fef", + "execution_count": 55, + "id": "cb5e3e1f-2d48-4d5e-992a-c0e0cb6add3b", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
              Pipeline(steps=[('rf',\n",
              -       "                 RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n",
              -       "                                        bounds=(array([  30.,   13.,  150., 2000.]),\n",
              -       "                                                array([  65.,   23.,  250., 7000.])),\n",
              -       "                                        classes=['Adelie', 'Chinstrap',\n",
              -       "                                                 'Gentoo'],\n",
              -       "                                        epsilon=2.0))])
              In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
              On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
              " - ], - "text/plain": [ - "Pipeline(steps=[('rf',\n", - " RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", - " bounds=(array([ 30., 13., 150., 2000.]),\n", - " array([ 65., 23., 250., 7000.])),\n", - " classes=['Adelie', 'Chinstrap',\n", - " 'Gentoo'],\n", - " epsilon=2.0))])" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model = response['query_response']['model']\n", - "model" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "1e4a56bd-95bf-4355-81a6-eaf7d16f69c8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'For these feature values, the predicted species is is Adelie.'" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_to_predict = pd.DataFrame({\n", - " 'bill_length_mm': [30.0], 'bill_depth_mm': [20.0], 'flipper_length_mm': [170.0], 'body_mass_g': [5000.0]\n", - "})\n", - "predictions = model.predict(x_to_predict)[0]\n", - "f\"For these feature values, the predicted species is is {predictions}.\"" - ] - }, - { - "cell_type": "markdown", - "id": "09cb0eff-9864-42a3-a87a-cef2f7eca216", - "metadata": {}, - "source": [ - "### d. Get a Synthetic Dataset with Smartnoise-Synth" - ] - }, - { - "cell_type": "markdown", - "id": "790fe272-ae04-4daf-933e-6a9d86ac691f", - "metadata": {}, - "source": [ - "Finally she gets a synthetic dataset to do the rest of her analysis. She chooses to only train on a subset on 3 columns: \"island\", \"bill_length_mm\" and \"bill_depth_mm\" but if we wanted she could train on the whole dataset.\n", - "She also decides to use the `patectgan` synthesizer and keep all other default parameters." - ] - }, - { - "cell_type": "markdown", - "id": "ded384a2-dcf6-43af-98b0-ae058b2a03ba", - "metadata": {}, - "source": [ - "#### Train patectgan synthesizer on dummy data with Smartnoise-Synth" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "ed292cec-8497-4e5b-b3bf-cca9227abf7d", - "metadata": {}, - "outputs": [], - "source": [ - "res_dummy = client.smartnoise_synth_query(\n", - " synth_name=\"patectgan\",\n", - " select_cols = [\"island\", \"bill_length_mm\", \"bill_depth_mm\"],\n", - " epsilon=1.0,\n", - " dummy=True,\n", - ")\n", - "dummy_synth_df = res_dummy['query_response']" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "6fab49d9-f5c5-437e-b70f-234b84c2f7e5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
              \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
              islandbill_length_mmbill_depth_mm
              0Dream48.51158514.830853
              1Dream46.05884921.126229
              2Dream43.44215619.632390
              3Dream37.87703521.214375
              4Dream52.55203119.885068
              \n", - "
              " + "/* On hover */\n", + "#sk-container-id-5 a.estimator_doc_link:hover {\n", + " /* unfitted */\n", + " background-color: var(--sklearn-color-unfitted-level-3);\n", + " color: var(--sklearn-color-background);\n", + " text-decoration: none;\n", + "}\n", + "\n", + "#sk-container-id-5 a.estimator_doc_link.fitted:hover {\n", + " /* fitted */\n", + " background-color: var(--sklearn-color-fitted-level-3);\n", + "}\n", + "
              Pipeline(steps=[('kmeans',\n",
              +       "                 KMeans(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n",
              +       "                        bounds=(array([  30.,   13.,  150., 2000.]),\n",
              +       "                                array([  65.,   23.,  250., 7000.])),\n",
              +       "                        epsilon=2.0))])
              In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
              On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
              " ], "text/plain": [ - " island bill_length_mm bill_depth_mm\n", - "0 Dream 48.511585 14.830853\n", - "1 Dream 46.058849 21.126229\n", - "2 Dream 43.442156 19.632390\n", - "3 Dream 37.877035 21.214375\n", - "4 Dream 52.552031 19.885068" + "Pipeline(steps=[('kmeans',\n", + " KMeans(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", + " bounds=(array([ 30., 13., 150., 2000.]),\n", + " array([ 65., 23., 250., 7000.])),\n", + " epsilon=2.0))])" ] }, - "execution_count": 51, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dummy_synth_df.head()" - ] - }, - { - "cell_type": "markdown", - "id": "f75ef712-3d58-4548-904e-6f1da72493f7", - "metadata": {}, - "source": [ - "#### Estimate cost of training patectgan synthesizer with Smartnoise-Synth" + "dummy_response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " dummy = True\n", + ")\n", + "model = dummy_response['query_response']['model']\n", + "model" ] }, { "cell_type": "code", - "execution_count": 52, - "id": "82ab4aee-b4af-4fbd-93cc-b8171f7f9a52", + "execution_count": 56, + "id": "a0612b10-de7a-4355-8268-09a46c30056a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'epsilon_cost': 1.0, 'delta_cost': 0.00015673368198174188}" + "array([1, 2], dtype=int32)" ] }, - "execution_count": 52, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "res_cost = client.estimate_smartnoise_synth_cost(\n", - " synth_name=\"patectgan\",\n", - " epsilon=1.0,\n", - " select_cols = [\"island\", \"bill_length_mm\", \"bill_depth_mm\"],\n", - ")\n", - "res_cost" + "# Dummy model predictions\n", + "x_to_predict = pd.DataFrame({\n", + " 'bill_length_mm': [bl_l, bl_u], \n", + " 'bill_depth_mm': [bd_l, bd_u] , \n", + " 'flipper_length_mm': [fl_l, fl_u], \n", + " 'body_mass_g': [bm_l, bm_u]\n", + "})\n", + "predictions = model.predict(x_to_predict)\n", + "predictions" ] }, { "cell_type": "markdown", - "id": "804e2119-1513-45b2-a989-f5566e6c7bf4", + "id": "6021b034-b15d-4826-8de3-80b99afc838d", "metadata": {}, "source": [ - "#### Train patectgan synthesizer on private data with Smartnoise-Synth" + "### Dimensionality Reduction: PCA" ] }, { "cell_type": "code", - "execution_count": 53, - "id": "fbc8b354-e4db-4472-957b-468e768eddc4", + "execution_count": 57, + "id": "f9a4cbaf-b994-41c0-a0e9-81674c6657fb", "metadata": {}, "outputs": [], "source": [ - "res = client.smartnoise_synth_query(\n", - " synth_name=\"patectgan\",\n", - " select_cols = [\"island\", \"bill_length_mm\", \"bill_depth_mm\"],\n", - " epsilon=1.0,\n", - " dummy=False,\n", - ")\n", - "synth_df = res['query_response']" + "dpl_pipeline = Pipeline([\n", + " ('pca', models.PCA(n_components=None, epsilon = 2.0, bounds=BOUNDS, data_norm=100, centered=False)),\n", + "])" ] }, { "cell_type": "code", - "execution_count": 54, - "id": "550fa89d-9537-4daf-9f96-42fa71f242b9", + "execution_count": 58, + "id": "4681cc17-6285-4b9b-a26d-837d6a79e1c3", + "metadata": {}, + "outputs": [], + "source": [ + "dummy_response = client.diffprivlib_query(\n", + " pipeline = dpl_pipeline,\n", + " feature_columns = ['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g'],\n", + " target_columns = None, # TODO enable empty list\n", + " dummy = True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "b1ac9784-bd0e-41c6-bb54-8201d9ab13ad", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
              \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
              islandbill_length_mmbill_depth_mm
              0Dream52.04094515.677968
              1Dream47.59786817.673375
              2Torgersen57.00434515.573335
              3Biscoe37.55950219.513633
              4Dream46.81385815.565315
              \n", - "
              " - ], "text/plain": [ - " island bill_length_mm bill_depth_mm\n", - "0 Dream 52.040945 15.677968\n", - "1 Dream 47.597868 17.673375\n", - "2 Torgersen 57.004345 15.573335\n", - "3 Biscoe 37.559502 19.513633\n", - "4 Dream 46.813858 15.565315" + "{'query_response': {'score': -3532.5573958633877,\n", + " 'model': Pipeline(steps=[('pca',\n", + " PCA(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", + " bounds=(array([ 30., 13., 150., 2000.]),\n", + " array([ 65., 23., 250., 7000.])),\n", + " data_norm=100, epsilon=2.0))])}}" ] }, - "execution_count": 54, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "synth_df.head()" + "dummy_response" ] }, { "cell_type": "markdown", - "id": "b3ae2259-3d83-46c6-a59c-9df178d98dc5", - "metadata": {}, - "source": [ - "Out of curiosity, she checks the average bill length and variance of bill length on this dataset." - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "7d5a336e-80f0-48fa-84a3-33d0e51a2d3b", + "id": "94eaf59b-c108-424c-8978-b1c86e141ccb", "metadata": {}, - "outputs": [], "source": [ - "synth_mean = np.round(synth_df[\"bill_length_mm\"].mean(), 2)\n", - "synth_variance = np.round(synth_df[\"bill_length_mm\"].var(), 2)" + "## Step 6: See archives of queries" ] }, { - "cell_type": "code", - "execution_count": 56, - "id": "e890a8d9-0c7b-4805-be8a-81e66d5fa7ca", + "cell_type": "markdown", + "id": "64003c53-de56-4bdc-a3c2-0c3e40031919", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The average with Smartnoise-SQL on private data was 43.83.\n", - "The average with Smartnoise-Synth on synthetic data is 44.65.\n" - ] - } - ], "source": [ - "print(\n", - " f\"The average with Smartnoise-SQL on private data was {avg_bill_length}.\\n\"\n", - " + f\"The average with Smartnoise-Synth on synthetic data is {synth_mean}.\"\n", - ")" + "She now wants to verify all the queries that she did on the real data. It is possible because an archive of all queries is kept in a secure database. With a function call she can see her queries, budget and associated responses." ] }, { "cell_type": "code", - "execution_count": 57, - "id": "11a14d9f-0fe3-4a5e-b425-d2192acd1e84", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The variance with opendp on private data was 34.77.\n", - "The variance with Smartnoise-Synth on synthetic data is 36.15.\n" - ] - } - ], - "source": [ - "print(\n", - " f\"The variance with opendp on private data was {var_bill_length}.\\n\"\n", - " + f\"The variance with Smartnoise-Synth on synthetic data is {synth_variance}.\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "94eaf59b-c108-424c-8978-b1c86e141ccb", + "execution_count": 93, + "id": "008fd230-cdfd-4e03-91ce-5a60b06c106d", "metadata": {}, + "outputs": [], "source": [ - "## Step 4: See archives of queries" + "previous_queries = client.get_previous_queries()" ] }, { "cell_type": "markdown", - "id": "64003c53-de56-4bdc-a3c2-0c3e40031919", + "id": "f2a34bc3-d1a5-4124-983f-ddc09dd1af7b", "metadata": {}, "source": [ - "She now wants to verify all the queries that she did on the real data. It is possible because an archive of all queries is kept in a secure database. With a function call she can see her queries, budget and associated responses." + "Let's check the first query, which was with smartnoise-sql:" ] }, { "cell_type": "code", - "execution_count": 58, - "id": "008fd230-cdfd-4e03-91ce-5a60b06c106d", + "execution_count": 94, + "id": "1795a54b-d04e-4687-8649-93982c84ad30", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "4" + "{'user_name': 'Dr. Antartica',\n", + " 'dataset_name': 'PENGUIN',\n", + " 'dp_librairy': 'diffprivlib',\n", + " 'client_input': {'dataset_name': 'PENGUIN',\n", + " 'diffprivlib_json': '{\"module\": \"diffprivlib\", \"version\": \"0.6.4\", \"pipeline\": [{\"type\": \"_dpl_type:StandardScaler\", \"name\": \"scaler\", \"params\": {\"with_mean\": true, \"with_std\": true, \"copy\": true, \"epsilon\": 0.5, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0]]}, \"random_state\": null, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}, {\"type\": \"_dpl_type:LogisticRegression\", \"name\": \"classifier\", \"params\": {\"tol\": 0.0001, \"C\": 1.0, \"fit_intercept\": true, \"random_state\": null, \"max_iter\": 100, \"verbose\": 0, \"warm_start\": false, \"n_jobs\": null, \"epsilon\": 1.0, \"data_norm\": 83.69469642643347, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}]}',\n", + " 'feature_columns': ['bill_length_mm',\n", + " 'bill_depth_mm',\n", + " 'flipper_length_mm',\n", + " 'body_mass_g'],\n", + " 'target_columns': ['species'],\n", + " 'test_size': 0.2,\n", + " 'test_train_split_seed': 1,\n", + " 'imputer_strategy': 'drop'},\n", + " 'response': {'requested_by': 'Dr. Antartica',\n", + " 'query_response': {'score': 0.3880597014925373,\n", + " 'model': Pipeline(steps=[('scaler',\n", + " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", + " bounds=(array([ 30., 13., 150., 2000.]),\n", + " array([ 65., 23., 250., 7000.])),\n", + " epsilon=0.5)),\n", + " ('classifier',\n", + " LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", + " data_norm=83.69469642643347))])},\n", + " 'spent_epsilon': 1.5,\n", + " 'spent_delta': 0.0},\n", + " 'timestamp': 1719828430.3111608}" ] }, - "execution_count": 58, + "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "previous_queries = client.get_previous_queries()\n", - "len(previous_queries)" + "query_1 = previous_queries[0]\n", + "query_1" ] }, { - "cell_type": "code", - "execution_count": 59, - "id": "b712b269-64f2-4c7e-b8bf-d1a608933eff", + "cell_type": "markdown", + "id": "7ba3baec-bbf9-49fa-a211-57d88cbc0e3a", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'smartnoise_sql',\n", - " 'client_input': {'query_str': 'SELECT AVG(bill_length_mm) AS avg_bill_length_mm FROM df',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'epsilon': 0.5,\n", - " 'delta': 0.0001,\n", - " 'mechanisms': {},\n", - " 'postprocess': True},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'index': [0],\n", - " 'columns': ['avg_bill_length_mm'],\n", - " 'data': [[43.825255002419716]],\n", - " 'index_names': [None],\n", - " 'column_names': [None]},\n", - " 'spent_epsilon': 1.0,\n", - " 'spent_delta': 4.999999999999449e-05},\n", - " 'timestamp': 1725364882.6916816}" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "# Smartnoise-SQL\n", - "avg_bill_length_query = previous_queries[0]\n", - "avg_bill_length_query" + "The second with opendp:" ] }, { "cell_type": "code", - "execution_count": 60, - "id": "8dfaf2b6-2b6c-480b-bcd7-250b0b2806a6", + "execution_count": 95, + "id": "ef251e47-67d8-426b-9655-c16d32778579", "metadata": {}, "outputs": [ { @@ -2733,35 +3134,54 @@ "text/plain": [ "{'user_name': 'Dr. Antartica',\n", " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'opendp',\n", + " 'dp_librairy': 'diffprivlib',\n", " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'opendp_json': Measurement(\n", - " input_domain = AtomDomain(T=String),\n", - " input_metric = SymmetricDistance(),\n", - " output_measure = MaxDivergence(f64)),\n", - " 'fixed_delta': None},\n", + " 'diffprivlib_json': '{\"module\": \"diffprivlib\", \"version\": \"0.6.4\", \"pipeline\": [{\"type\": \"_dpl_type:StandardScaler\", \"name\": \"scaler\", \"params\": {\"with_mean\": true, \"with_std\": true, \"copy\": true, \"epsilon\": 0.5, \"bounds\": {\"_tuple\": true, \"_items\": [[30.0, 13.0, 150.0, 2000.0], [65.0, 23.0, 250.0, 7000.0]]}, \"random_state\": null, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}, {\"type\": \"_dpl_type:LogisticRegression\", \"name\": \"classifier\", \"params\": {\"tol\": 0.0001, \"C\": 1.0, \"fit_intercept\": true, \"random_state\": null, \"max_iter\": 100, \"verbose\": 0, \"warm_start\": false, \"n_jobs\": null, \"epsilon\": 1.0, \"data_norm\": 83.69469642643347, \"accountant\": \"_dpl_instance:BudgetAccountant\"}}]}',\n", + " 'feature_columns': ['bill_length_mm',\n", + " 'bill_depth_mm',\n", + " 'flipper_length_mm',\n", + " 'body_mass_g'],\n", + " 'target_columns': ['species'],\n", + " 'test_size': 0.2,\n", + " 'test_train_split_seed': 1,\n", + " 'imputer_strategy': 'drop'},\n", " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': 34.769447201112094,\n", - " 'spent_epsilon': 0.7122093023265228,\n", - " 'spent_delta': 0},\n", - " 'timestamp': 1725364890.340155}" + " 'query_response': {'score': 0.3880597014925373,\n", + " 'model': Pipeline(steps=[('scaler',\n", + " StandardScaler(accountant=BudgetAccountant(spent_budget=[(0.5, 0)]),\n", + " bounds=(array([ 30., 13., 150., 2000.]),\n", + " array([ 65., 23., 250., 7000.])),\n", + " epsilon=0.5)),\n", + " ('classifier',\n", + " LogisticRegression(accountant=BudgetAccountant(spent_budget=[(1.0, 0)]),\n", + " data_norm=83.69469642643347))])},\n", + " 'spent_epsilon': 1.5,\n", + " 'spent_delta': 0.0},\n", + " 'timestamp': 1719828430.3111608}" ] }, - "execution_count": 60, + "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# OpenDP\n", - "var_bill_length_query = previous_queries[1]\n", - "var_bill_length_query" + "query_2 = previous_queries[1]\n", + "query_1" + ] + }, + { + "cell_type": "markdown", + "id": "fe6332c1-932c-4912-a06d-4e66f5dada65", + "metadata": {}, + "source": [ + "And the last one with DiffPrivLib:" ] }, { "cell_type": "code", - "execution_count": 61, - "id": "376315ec-6f38-4919-959e-d6bf244a4952", + "execution_count": 96, + "id": "b2fa8943-f0e0-4902-9001-bd10fb22a653", "metadata": {}, "outputs": [ { @@ -2777,11 +3197,11 @@ " 'flipper_length_mm',\n", " 'body_mass_g'],\n", " 'target_columns': ['species'],\n", - " 'test_size': 0.1,\n", + " 'test_size': 0.2,\n", " 'test_train_split_seed': 1,\n", " 'imputer_strategy': 'drop'},\n", " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': {'score': 0.23529411764705882,\n", + " 'query_response': {'score': 0.6268656716417911,\n", " 'model': Pipeline(steps=[('rf',\n", " RandomForestClassifier(accountant=BudgetAccountant(spent_budget=[(2.0, 0)]),\n", " bounds=(array([ 30., 13., 150., 2000.]),\n", @@ -2791,78 +3211,23 @@ " epsilon=2.0))])},\n", " 'spent_epsilon': 2.0,\n", " 'spent_delta': 0.0},\n", - " 'timestamp': 1725364897.0776813}" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# DiffPrivLib\n", - "reg_bill_length_query = previous_queries[2]\n", - "reg_bill_length_query" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "638817e0-d88f-407a-8136-210309651cf2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'user_name': 'Dr. Antartica',\n", - " 'dataset_name': 'PENGUIN',\n", - " 'dp_librairy': 'smartnoise_synth',\n", - " 'client_input': {'dataset_name': 'PENGUIN',\n", - " 'synth_name': 'patectgan',\n", - " 'epsilon': 1.0,\n", - " 'delta': None,\n", - " 'select_cols': ['island', 'bill_length_mm', 'bill_depth_mm'],\n", - " 'synth_params': {},\n", - " 'nullable': True,\n", - " 'constraints': '',\n", - " 'return_model': False,\n", - " 'condition': '',\n", - " 'nb_samples': 200},\n", - " 'response': {'requested_by': 'Dr. Antartica',\n", - " 'query_response': island bill_length_mm bill_depth_mm\n", - " 0 Dream 52.040945 15.677968\n", - " 1 Dream 47.597868 17.673375\n", - " 2 Torgersen 57.004345 15.573335\n", - " 3 Biscoe 37.559502 19.513633\n", - " 4 Dream 46.813858 15.565315\n", - " .. ... ... ...\n", - " 195 Dream 41.009962 18.210038\n", - " 196 Dream 50.174224 18.534705\n", - " 197 Biscoe 42.890809 15.596290\n", - " 198 Torgersen 47.442859 15.934119\n", - " 199 Biscoe 45.300011 18.687155\n", - " \n", - " [200 rows x 3 columns],\n", - " 'spent_epsilon': 1.0,\n", - " 'spent_delta': 0.00015673368198174188},\n", - " 'timestamp': 1725364925.3299136}" + " 'timestamp': 1719829029.0730438}" ] }, - "execution_count": 62, + "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Smartnoise-Synth\n", - "sysynth_query = previous_queries[3]\n", - "sysynth_query" + "query_3 = previous_queries[-1]\n", + "query_3" ] }, { "cell_type": "code", "execution_count": null, - "id": "416d3afc-6455-4252-b883-2b6984233513", + "id": "e2c8d40d-94b3-4d69-af99-0ec2936f233e", "metadata": {}, "outputs": [], "source": [] @@ -2884,7 +3249,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb.txt b/html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb.txt similarity index 100% rename from html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb.txt rename to html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-SQL.ipynb.txt diff --git a/html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb.txt b/html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb.txt similarity index 56% rename from html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb.txt rename to html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb.txt index 571ccff1..79a6c877 100644 --- a/html/v0.3.1/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb.txt +++ b/html/v0.3.2/en/_sources/notebooks/Demo_Client_Notebook_Smartnoise-Synth.ipynb.txt @@ -5,7 +5,7 @@ "id": "3f18d338", "metadata": {}, "source": [ - "# Lomas Client Side: Using Smartnoise-Synth" + "# Secure Data Disclosure: Client Side Smartnoise-Synth" ] }, { @@ -21,32 +21,55 @@ ] }, { - "cell_type": "markdown", - "id": "01ae30d2", + "cell_type": "code", + "execution_count": 1, + "id": "23bb4f13-7800-41b2-b429-68c2d02243d0", "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABO0AAAIdCAYAAABhmYk9AACTiklEQVR4Xu3dB5wU5f3H8ecEaXJHR8pJlaJgo4gFQRMLit1YQGOMPUaT2BNjNDGRJNZ/YgmWGDVWiBUrNgREUeyg9N67d1RF+d/32WfuZudm9/budo/Zvc/79drXPTu7Ozu7sLMz3/09z5O3vYQBAAAAAAAAEBk7ub8AAAAAAAAAIoJKOyALffLFLPPwf582r732mils38bs1+8gc/WvzzNtWjVx9wAAAAAAANmM0A7IEhMmTzNTpkwx9913n1m2eK4pWrei5BNc15jt22J3qJtvjjjiCLNXn4MJ8AAAAAAAyHKEdkCEqaLuk8++NI/+9wnz+ScfmKK1S2xQ1+/AH5kee+5rfn7mCWbh0nVmwoQJ5pXX3jAr5n8Se2C95ub44483+/Y90PzivNMJ8AAAAAAAyDKEdkDEzJyzyLz+1iTb9XXiu2+UBnV79O5jDjj4MHPS8UPMYYMOMI13aeAeUeau+582s6Z/YZ557kWzdP7U2MJ6zc05Z59p+vQ/2IZ8YY8DAACoiiVLV5jHn3nTfPDBB2bR/JmmS9fuZvBhh5tLfn6CuwcAAKgqQjsgAnTA++xL48zEiRPNay+NLu366gV1hxxyiDn1hB9XKnD7060Pm6++/Ni8+soYU7xmQWxhvebmzDPPNAMOONhcduHpsWUAAACVsGHjFvOfx18w77w70UyZNNYsWjA3NlyHb9iObr0PNvvttx8BHgAA1UBoB+wgoQe8JQqa7WpOOe0s02//A83Zpx2Vlsq4G/92v5n+1ZdxAV7jFl3MCccPNXvvN8Bcc9mZdhkAAEAYHbc89cwrZtyEyebzj94xU7/41AZ0+S06msMOO8wMHz7cNGnawsyb/ZV56dW3zCsvPm3M95vtYwnwAACoGkI7oAZ5B7yT3v/QfPT+26UHvAXN25vjTjjZ/Pjwo8yRh/Yz7dvt6h6RXnr+W+961Ez58H3zyphnjNlWbJe36bi3GTRoEAfTAACgVLKgrl+/fuakk081Bx/Qx/TZu5t7RJnZ81eYN954IzTAGzhwoD3m+Nlph9tlAAAgHKEdkGE64H1n/AfmuRdfM5PeG29mTP0o7oD3p2f/3Bw8YG/Tvetu7hE1Q9v1wMNPm1fHjjNvvMzBNAAAiB0fvPDSWPPWuEnmg/feMV9P/aT0B8a+/Q8wRxx5tDnq8EGhQV0iCvDGvPxauWOO/Q44yuzfv485/Igh5ifHDbLLAABAGUI7IAN0wPvxZ1+ZRx4bZcepmzVtcukBb/eevczJp5xW6QPeTFq+6hvz3PNjyv0a7h1MaybaYw4/wC4DAAC5xfuB8elnXzVTJk8o/YExE8ctn3210Lz44ovm9TfHm0njXiLAAwAgCUI7II0++WKWefi/T5uXXx1r5n71fuyAt9mupmuPfc3RRx9tTjnxmMgEdYno1/Annhpd7mB67wFHmwP339dOZHHIgF52GQAAyE7+ngDBHxi7du9dI8ctyQK8gQf2NUOOOY4fDQEAtRqhHZBGu3Xe0yye/7UdiLljj/3N4EMOMpde/LMa7/qaLjqYfvzxx81bb79rPp38lj2YN3UalvzZ5O4BAACyRcKeABH4gdE75hj71gTzxYdvxI45Sng/GlL1DwCojQjtgDQqaNnJFH+z1lbaDTpw37TM/BoVOphWCFlU8voI7QAAyA4K6mbOWWTu/te/zbsTJpX2BNAPjF169rPj2J7z09Mj1RNAxxz/G/WkeeX1d8p+NCxBgAcAqG0I7YA06r7XQPurtX7FzsTB74TJ08zE9z4w77w70cyaPc98u2mNKSreZBo3bmzadexpOha2Nt332Mf87frz3SPSR+Pe9d1/oFm6eIHZ/l2RWwoAAKLIG7LjtddeMysXTzffrF+TlT0BEgV4+x96qhnQb29z6k9OYtgOAEDOIrQD0mifA46xXTpeHjshrb8AL1m6wtz74FPm7n/caorWLnFLE+vS6xBzww03pHX2V4V2PXrGDoq/WbPY/gUAANHkH7JDFXX7H3CwueLSc0y7Nq2ytieAF+CNee3dsi60DNsBAMhhhHZAGvU5cIj59IPXzUOPv2R+PnyoW1p16tLylzsfM6OferS0O0upvLp2DJrtJX+L168sHby5VN18M/Skn5r/u+UGs3unXd3CqtMEFd1272za7dbVLJn3pVsKAACiyA7ZUXJ88PJrb+fckB3y2rtfmtNPPpphOwAAOW0n9xdAGrRt29b+XbVmvf1bXZdd8zcz8vbfmrnTJsQCu7y6pme/Y81Fv7nJ3PPv/5l33nnHzPz6c/PqGxPNZb/7h12usM7aVmxeHn2vOWLo6bZbbXXNnD3PmB++Mw12aeaWAACAqGrTttB+b+fn52cksNMPi7fc9bg58ayrTOdeh5quvQfZoLBtp31se+jJPzeXXnOrrdTPhH337BBrlBwbAQCQqwjtgDTS2HLyzbrV9m913Pi3+82zT460Y9BIQfP25pxf/N58NG60GXnnH8wlPz/BjpvXplUTM+SwPuafI35ll3/88cfmsKHnlB7Ezv/qXXP2ub+s9kHzipUl27F9m2mS38gtAQAAUdVwlwL7vT17zny3JH30Y+ApZ19pbr7xSvPC47fbYw39wFi8ZoFZvuAL237luYfNPbdeY7r1GmDDu3RTaKgqu4KCktcJAECOIrQD0mjn+rFAq7i42P6tKg0e/eTjj5qidSvs9cYtupgnn/6f+c89f6zw13IFeW+/9B9z9KmXuSWx4K66B8yLFs6zfzt1ic7scgAAIFydvB/s33RV/4uCsiuvv8McM/R4M/bZe0uPU6y8uia/RUdj6jV3C2I2rJphw7tDjv65+d+Y8W5p9dkeACUaF9ADAACQuwjtgDRq3LCO/bt2ffVCu5tuuc/MmvqebWvcup9f+OtKT2wx6qERps+g09w1Y9548eFqVdutdgf9TQt2sX8BAEB0eUN27LyTbzzcalBgd94vrjZ3jLjWbFgz1y5TL4Azz7/G/PGW/9hJuD6ZMtlMmPi++fs/HzO/vPoWs2unPvZ+MvG1h825Pz/b3PufF9yS6rE9AL7fzLAdAICcRmgHpFGTFoX277x5sV9/q0IHxbNnfu2uGXPI4aeYEb+/0F1LnSryrrv2cjurmmjW2etv/pdtV8WcOXPs31Zt3BgyAAAgsuo3jA3ZMW/+Ivu3ui68fIQZ9djIuDF2/3rbPeaxB/5ubrz6HPvjoia+Gti/u7nmsjPN3bdcbWZPfc+cc8mNpePtqvvsb6/+te1RUF0bNmywfxm2AwCQywjtgDQ6bNAB9kB2/pyy0K2yxr//mZn2yTvumjG9evWq8gDSRw3e13Tqsb+7Zsynn37qWpW3csVS+3fwwWW/mgMAgGjyKuO/3bbd/q0OdWt96dlHS2exP+hHJ9kxdjW+bjI6ftHQHrf+49+lPyIquPvlVSNsuzqWL19u/zJsBwAglxHaAWk0cP89bXfWDUXrqtwV9auZi2x3D6tuvunfp3esXQU6WO7es5e7VrK6nap24K7XsmLpfLs9u3du75YCAICo6tQxVv1fekxRDQ//92kbtkmbjnubP/z+t5X6QfGqS041p/z0CnfNmA/efMw8MupNd61qvPGDGbYDAJDLCO2ANNIBbMu2XezAzJ98XvlqO3WNfeWNScY06mgvdRp3MD+98BrTqO0BVb68O+mT0vXNnL/KPkdlvfrGRLNowVzTrefepnvX3dxSAAAQVRu3xg7zP/1ytv1bVbPnrzAffzjRXTNm6InD7Kz1lfXw3deb1p36x65s32bGvDou1q6iyVO+sH8ZtgMAkMsI7YA069dnH3swOmdu7BfpVGl8lzN+fqV554W7jdlU8tiSy/frp5ktyyebzdW4bF3+Qen61s8fZ/ofeqqZMHmae9bUrF+32r6mbt3oggIAQDbwhuz46suP3ZKqef6V8Wb5YjcGXZ2GZsiPD4q1K0k/bO7bx4V2JRbNn+laVbNw3gz7l2E7AAC5jNAOSLNmTWODLVe20u6q60aYl0ffWzpeTKZMn/KSue6Pt7lrqfn4s6/s3wH797V/AQBAtJUO2bF2oa2Wq6r6dX8o7WLbprCbGXjAPrZdFT169HAtYxbMn1Ol6n/R67FBYt1802efPdxSAAByT972Eq6d1HnnnWceeughdw1AQuqKqsq2xrsbs6ESXVLqtzZm60p3JbMat+hiilfHZoNNxQEDjzCTJ40zL4+dYGeHAwAA0de19yAzd9oEc+s9o+y4cpWlUO3wn1xhJk98w5gfvjM7N2pu6tat526tvO15dcyWb5bY9i5N25nPJz1vunYsOf6ppP888bI598xjTbfeB5uZX5Z13QUAINekHNrl5eW5FoCk8uoas9PO9tdfs6049QGgazC0y2/R0RStnu+uJaduu3377GO67dHHjH/7ZdOmVRN3CwAAiLLTz77MjPrv3eayq/5s/nnr9W5pavT9r14A77zyWMZ6AfTqf4z51123mEMGlE2alYqb/na3ufF3l5ljTjrHvPzsf9xSIHd4E60AiJ78/FjPuppC91gg3XRgW695LIBTcJfl3p0wyQaPGs+OwA4AgOzhDdnx7dZN9m9l2MDu5YczOmzHtI9eqfSQHTJzZmw8vIEDB9q/AADkqipV2hUVFbkWgDDnXHSNefbJkebcX/7B/N9fr3ZLk2vbaR+zce08dy2zKlNpd9a5vzKP/+cuM+L2B83vrjjPLY0Guu0DAJCEV8XvDd1RGTXUA6CyQ3aoy26P3v3N0gXTzegX3jI/OW6QuwXIHVTaAdFFpR2QA/baay/79/MvKjdLa9TowPidd96xXX6jOHMsgR0AAEl8u9bO+Go2L4n9jaA8871rpUZB3dJFc2xwN+RH+7ulAADkJkI7IAOGnXKUPTie9cU4s2J19lamauIJDowBAMhS6tqqoTq8vzlg9uzZdtiOPffqaxrv0sAtBQAgN9E9FsiQn5x5iRk75jFz1e9vMTdce7FbmlhVusfm7dzEzsRmf0mvhFS7x551wbXm8QdvMWeef4157IG/u6XRwX4JAIDkfnPNTeahkbeZs867wtx75x/d0orV1LAdlRmyQw4+/DQz6a3R5oa/3mf+9NsL3VIgt9A9FoguuscCOaLNbt3t3zfGTbZ/0611pwHmwYefMP957FlTuOdRbmn6qGvslMkTjLrGDj/9JLcUAABkk9NOO83+fe655+zfbKZjk7mzZ9iqwQH99nZLAQDIXYR2QIb8/YZfmMKO3cznk14wn3z+tVuaPv0HHGBOPe4Qc8qQPub6ay+14Vo6qWvsjKkfmb33P8IMOnBftxQAAGSTffbsbPKbtTMb1y0yn0+b65Zmp0dHvW6WL/zKdOu5tznm8APcUgAAchehHZAhuzSqb/Yb8GM7jsyTo19yS9Pny88/KR0v78133ouNV5NGY8aMsescfMhBjBkDAECW8h+P/OO+p9zSDMira3Zq2NpdyYwvPp1sX8f+BxzslgAAkNsI7YAMOvWUE+3fxx57zP5Np1atWpnGJQfisnJV5ca0q8iEydPMmBeeNQXN25tTf0LXWAAAstlxxxxu/054+2X7NxMGHPEz88z/njZDzvhtRmaqnTlnUewHxZJ1M2wHAKC2ILQDMuiIwX1N64772YGc73ngSbc0PTp06GB/PZc+++xh/6bLfQ8+aorWLjHHnXCyOWRAL7cUAABko7NOO8Yej6xY9LV54rl33dI0qtfc3Pany8yPD+lrRt1/nel70NHuhvR55oWxZun8qeaQw46haywAoNYgtAMySKHaueeea9sP/vth+zct6uabk44f4q4Yc+2vzjKNm3dw16pHv2S/++YYU9BsV3PBeee4pQAAIFvpeOTQQwbYrqVjX8tAtd23a80D/33RNhUKzpg2xbbT6aVXXrd/jz46/YEgAABRRWgHZNivLzrD/ro956v301ZtV7h7X7NwySrzwGOv2MsTz75luu7R391aPX+77R6zeP7X5tAfH20GH9zHLQUAANnsjGFn2a6lb7z2YumYuOnUvGm+/du6ZTOz4ZtVtp0uTz/3hpn09nMmv0VHc8oJR7qlAADkPkI7IMMyUW23ePo4c/0VPzVXXnJG6eXz955xt1adxrL73+inTJOmLczw4cPdUgAAkO0OP2Rvc+Qxp5jidUvNrf98xC1Nj12adzZDDo9NDnFg3x6mVWF6h9bwJsc6/qTTTfeuu7mlAADkPkI7oAb4q+1uv/u/bmm8Fq0LXSvzWuzaybXi/efh/5riNQvMsScNN6efdIRbCgAAcsGJJ8YmyHr80QfTWm23zz77mIP69bRt/Vi51z7pq9S3k2M9P8pOjnXR+We7pQAA1A6EdkAN0AHspZdeatu33/b30APlU049w5i8uu5aBpU8x8knHe+ulHnlzQ/MM08/bA+Kr/jNZW4pAADIFWedeqQ56LAT7QRZ6ay2q1ewW+mQHbrUa9jE3VJ9d98z0hStW2FOOe0sJscCANQ6edtLuHZSeXl5rmVMUVH6x8EAaoMjjj/HTB73rDnqpAvN6Educ0vL/PPBF8x/Hn3KVuSZH75zS9Nkp53tBBbm+822mq7xLg3cDcYsWbrCHHPyz80Xk181l131Z/PPW693t0Qb+yUAACrnsdFjzSXn/cROYPXplElm15YF7pZ4bTvtY8O9TNM4dUWr57tr8fSD4vBTjzXbd2pgJ6IgtENtUVxc7FoAoiY/PzaGa00htANq0Ox5S8zgQ39sitevNP957BlzynGHuVsyr6Cg7KA8+LE/64JrzeMP3mL2O+AoM/7N5+MCvShjvwQAQOUNOeFsM+md5825v/yD+b+/Xu2Wxuu9/1CzcPoEdy1zuvQ6xMyZOt5dK7Nh4xYz6PATzacfvG5+fvG15qF//c3dAuQ+Qjsgumo6tKN7LFCDdu/c3pz3i5KD4+3bzPXXXWvmLkzv7GpVcctdj5uX/vdvU9BsV3PtNVdmTWAHAACq5orLf2Vnkn3o3r+a51+d5JbGO/PMM03Gh+0oWb83zl7QrXc9aj6d/JZp16m3ufQX57mlAADULlTaATvAYUPPMR9PeNbs0XeImfzOKLc0s8Iq7WbOWWRnYpsx9SNz2ZU3Zk23WA/7JQAAqub8y240ox650/Tuf5SZ9NZotzTe/9032jz51Gjz9ZcfpnfYDg3ZUaehueGGG8zVl51d7gdDHZ/03/9AO5bdAw8/bc4/+2R3C1A7UGkHRFet7h770ZJtrgXkts2bt5pfDDvBLJrxoTnqzN+Za66/2vRvn9lfs4OhnQ6Iz7/4cjPhzWfMScMvNY/ef2vWVdkR2gEAUDUbN201A390vB1H96IrbzW33niRuyWzkg3XIeoWe8yJZ9njk9N+eqn597+y7/gEqC5COyC66B4L1AING9Y3v7/lXtOoaTvz+uN/NSP/+S93S83QAfHlV99gD4i79T7Y3HXr9RwQAwBQi2hm++t//1ujLqr33fE788yYd9wtO9Z1f7zNTHjrBVPYaQ9z6S8v5vgEAFCrEdoBO0i37l3M+dfeZruHjB55oxlx5yPulgwrOTi/+LJrzCvPPWwPiB8Y+U/Tvt2u7kYAAFBbaEKsM8+/pnSs3c+nzXW37Bj/eeJl88hDI01B0xbmksuuZLZYAECtR/dYYAd7bvTz5u4bL7Ttq64bYW649mLbTjfbHUUDSu9c8ve7IlPYsZu574GHzDGHH+DukX3oHgsAQPUdcfw5ZvK4Z5OOb5cuibrHfvTJVHPiKcPM0gXTzVW/u8ncevPv3C1A7UP3WCC6GNMOqIWefuIZc/9ffmF/6T7pzN+YR/51k7slfQqat48FdpuXmD322t/cdsc/sjqwE0I7AOnA8Qdqu2bfrjCnDz/HzJo2OeOTZCWdGOvL97N2nF0gndIV2vH9BsSkc/x4QrssMWrUy+a1V99115Jr335X076wjendq7sZeEh/txSI99k7Y82Vv7rAmG3FZp/9j7DdQ7p0aOVurZ7Z85aYPv0PNubbtcbUa25efvnlrA/shP0SkHmZniQnCvico7bT51xdY889/yIb3B132sXm8QdvcbemV9jEWBf/8nLzzuvPmEMOP8U8+cg9DNuBWo/QDkivbA7tGNOuBixZssJ8OPlz89BDo80frr/dfPX1LHdLZq1d+415Y+xEM3Lk425Jbsv213vBWceYp59+2rTt2Mt8/uEb5vTTTzfPvzrJ3Vo1mhnu/+4bbYYe/xPbJdY0bG/M95tzIrADAADps0+vLuauu+4yjZt3MGNGjTQnnHGJPY7IJH9g1++gI82DI+8ksAMAwIfQroYpwLv7rv9mNLhTeKVKwOuvv908+eSLZl3J9VyWS6/36CMGmlFPPW4OOuxEM2PaFHP28JPMb665yaxYXfkqMv1ift7Fl5sbrrnIbFy/zFbYmS0rbGgHAAAQdFC/nvY4RD8gvvPKY+bAkuORjE1OUXJcctjhx9jA7vifnGMef/RB073rbu5GAAAghHY7wJbNW8y/Hxxtw6ZMePPNibbrrp6nNsi116tful974VFz7i//YK8/NPI2M+TYU83td//XXq+IfhW/6e8jzTFHH2leef4x077D7ubya/9szNaVdsw8AACARAYesI8N7rrueaCZ//V75phjjjHPjHnH3Zom+iHxuyKzdP5Uc9pPLzX3/uNvBHYAAIQgtEuTbt06mYf+c0u5yy8v/akZcvRg06Bh/GC669aut2ETkMj//fVqM2Hi+2bQkJ+aOV+9b/503S/NsSefbe554El3j3gat05hnX4Vv23EdUYzxSr4G/Pic+bKkv+HAAAAqbA/IL402lb+F69ban5+1in2GKO6dKxiGnWMDdlR4qLf3GTu+Nv1dIkFACABQrsM69t3L3PaaUPNpZf9tFxwN27cZNcCwumg+aVR95gbR9xju6qMf/N587srLzL7HXCUPXieu3CV7bZyyeV/NIMHDza33XyNmT99stmn/2F2fDwFf7t3bh9bGQAg53388Zd2bFeNoXvuz68pvVxyyQ3mryPuNS+++GbGKv2RW3ZtWWAr/8+84Dp7XccY+vHwiedSm4jNT70AHnlyjJ2h1mxaYEydhrbabuSdfyCwAwAgCWaPraLg7LGqtPvddZe4a+E0SYLGXPM799xTQ2eU1X2nTpthFi9eYavyPM2aNzWFhbua3r16mCOOHOiWxqQyo21wO3XgPnHiR2ba1Jlm0eLlcV1MvVlv+/ff24aPiegEYfz4Dyu1rUH+7Zg1a75bGtveXr27m4ED+5vmzZu4pTFVeb1RlsqMNuoi+/7775uxYx6LLcira/Kbtra/gmvg6IMOHmSOOvpYM/zkH5tdGtWP3ccJztaWC9gvpYc+fxoTMtjFfP8B+5iLLz7TXas+7SvuCXTzVkXyjhClbYk6Zo/NDvoc3zfy8bjv0ET0I+JJJx5Z4Xczao+KPuePjR5r/njTzWblgk/tscdpZ55vbr7pehvsVUQ/Lt75z5Hm2acejC1osGtsNvvvN+fM8QiQbsweC6QXs8ciJX37lQ++li5b6VoxOujWL+EK9778YkZcCCa6ruW6/c47/+2WVo0mw7j55nvM88+NtQf5wRN2b9Zbndjql/kw+jVft1e0rfrFX68tTHA7/HRdyxUoTJzwkVtae6mb6/8ev9c8+vRr5qJf/cH07vdj06NHD/sr+Ksvv2hv0yy0wcAOSObjKV+Gjgn5RcnnN9HnFkB06HN65x0PphTYiT7v+m7WD4RAKs469Ujz+eSxsfF2d9rZjHpspOnTd39z9e/CJ8tSZd2oZ18151x0jR0T79knR5oee+5r/nrbPUyKBQBAJRDa1SBViqnyy2/O7AWuFTNmzFspH3QrEEsUpqXiycc102p80JaIgrPgjLePPPKsDfVSoQBQFQBBCxcusbPpVrQdOsF46KHRtjoGxpx49EHm1r9cbSa9Ndq8PfYF86/bf2u70gJVMWXKF64VT587BXoAok1j5Op7trIU3Ol7GEiFfhD0xts95sSzTHHROnPfPbeZbt33MOdfco35v/tG27BOf4854Qxzxa9/YcM6Udj3wrNPmV9eMIxJsQAAqAS6x1ZRVbrHiqro/KGc/3H6pfyqK2+2bc+JJx1pjj/+cNtWaKZZZ/0BV9jzprJtqlpTCOZRV5nzzju1tBts8HbRhBoan8+jMXI8evzwYceVdvXVa/FmdfXTxBz+rrbB92OvvXuYU04ZYjp0aG9PJD744LO4dajL7e23x8ZW8VT13yJqMt0Fje6xVZPr3Qr0Ofvjjf9w18rTZ/Lyy89z16qHLqnZie6x0afx6vzVsvoePKTk+9g//IaOIT768Evz7rgP3JIY/3EGaq+qfM7HjptiJr8/0dx6663GbIt15dNQHRvWLbXtfgMOMX33H2jOGnZK3A+LuXg8AqQb3WOB9KJ7LNJClXhXXXOBPYDWAbdOlv0H0nvu0c0MHry/uxazek1qlXJBOpBXgDb40APs2HVDhgyKC9N0u57fb60vLAxWvLUo2Xb/yYFeiwI+jYml16LALxjY6QQiGGAqHFBgJ/rrrcOjwJLuPED6KBj383/eRBW9VOIA0Rbs3n7RxWfGfSeLjiF+9rOTy323z5kTX/EPpOrIQ/uZP/zuN2bWzK/NX2+/z1bf6URmv/0Hm3sffMqMeX6U7RVATwAAAKqOSrsqykSlXSpSqVRJV+VZsvWEVeco/Bs0aIDp0bNzafCWTHD9wUo+T/A1BwfHp9IuNVTaVU2u/0J55ZUj4qp3//inX5sH7n8qrqtduipxqLTLTlTaRZ+/8l30PXnaaceWm8CpslQ1X9lJooJ0vPDOO5PN7Fnz4vYrOmbYvVtnc9hhA0KPGVL9bk/lfv73R7cr1Bw16iU7bqcCT1Xxd+vWsdzEO96kYLNmLSgNRiva7mxVk59zKu2AilFpB6RXNlfaEdpVUVWDoqqEdqpIW7JohZkzd0HpAaZfOkM7nVTroFq/vKvCxi+4nuBr8dNB7V579zS99+puf90Pk+zxyQS3g9AuNYR2VZPLBzvat9x2ywPuWuxz++e/XGnHytQ4lp6wbumJ6CRXY+R5n23vZPiYYw41q1atTRraBUM9L8hXd/2PStbp7ZPUHX/vvXvYdXonzQoGXnllXNw+UhVFgwbtHzr7dSoBYvBEX/sVL4D44ovppWGnt787/PCB1Q5JoojQLvqC3WNFn5MBA/atcrgUNiRHUHBojCDtD557fmy5bQsaNuz4CmfET/TdXpXQrkHD+uWOcfw/CCqsTGUm3kQ/NmYjQjsgWgjtgPTK5tCO7rERpJNCnTQr1NKBpk6qNVi0Jn2o6MC3snRQrgklNLurnksnsTpZDx7MhjnhpCPsAXsYBX86iNa2a93p7NJalaAPQHnj3/3QtWL67x/rGrvvvnvYvx6dtGtfkYxOcrXP0r7K/xnVY7Xv+tvf7qv0QPmbN2+1s2RrfE3/Pkn7QW+d2i7tX9QO7iP1GO3T0rX/8Z5HY4L5gwxvf6dZrrX/BmqaQuwgfRb0f1VV8foe1nGFPqep0P/j6k4Spc+L9gepHLfofjU1Q7z2T2HHOPoRwJPqTLz63Cs0BAAAyBRCuxoWPAhs176Na8XoIFcH2ArOMh1OjRz5uA3VdFBf2ZNpUQXdX/5ypR0XL1F4J1q3Dsh10pDqCQOAzFNVmp+6uomqclQ95qcB7JOpqCpFJ+7+6r1UaN+U7AcErVPBQkXBgG6vbpi2aPHyCp9Htz3+2AvuGlBz1BW2ou9hff402ZW++8NCNj/9P/b/X1fVqrrOqxpVf1Vh5vfEE2NcK0bf9aqw81Mlm7cOjd8b3Mc89/wbrlUzdOxy2+2/t9uji1eNqBDOf0yk7dSYvLqP7q+qQP97reCOsB4AAGQKoV0NCvsVuWuX3Vwr1l1LJ4V+OjDUwbI3kcO5557qbqkeHZSqKsVP3dh0UK3xq/RcwYPyMOoKpoGt7733JnsQrseo60kYHQRrDJlE9Fjv4LmiC4Dq0Q8EwZNyf9dOr+rOM3ly/IQVflpXMLDzn+Rr35Bov5AK7ZN0sqyL9lF+3mvwP1/YfjI44UZl+Z9Hr0fPo+cLBg96H/hxAjVNn91LL/up/R6viL77VYGqytiwsEnVq/7Psz67lZ0kSuPg+fcvWoe6nnrr0I9+w848vvS4Q0HYr3/9M3tbTdDz6tglrDv7uHGTXSt2DHb5FeeXdrHX/dWN96QTj7TXPeqaDwAAkAmEdjUk9qtz/K/IOhj0jwMzfnx8VzWdHCoM08GyDpB10NiwUeJf0ivDf1AqOinWmFU6qNaA82FjQFVEB+HaTo0l452o6zX4+YPCYJWhf3ZaAJmlwdX9eveK/6x6VXcenYAn6r42fnz8/iR4kq99g/YLwYArFQrztU/SybIuqigKip2A/6T0+Sqa/bqqtP16Xd44nXo+BQ9B8+YtdC2g5uj/5e9//0v7mUklvFMwp+7eweBu6pczXSum6+4dXSte//57u1aMxt31aOIKP01aEaTt9Y47FIR5n9+aMCAQ/nv046k/bNytsE1osBccf08TVQAAAGQCoV2G6WBYvz7ffPM95caGOfTQAa4Vs2XzVteKaR8ItWTq1OTjSqXKf1AqYSfTX34x3bXKUwipE3iNh6df69XdJkgH5BoEPpHeveMnqFBXPbqYAJmnz1mw22nffvFBvU5Ug8HX1GnxJ+KeYPf6I486xLXiaXbpyjrggH1dKybsBHrvvXuWWx7cf65LQ/VbsPpQvAAPiIJYsD3UhmGqOFUX0GQBno4Fgl2658yOD6DU/VNj3gYvwYlc/J8xdSf3q0pgn0nt2rZ2rXhz5sQH7go2w167Ln4Vjf0HAABQVYR2aZLowE7j06nLa/CATgfRmmkwmcmTPy8dd0Yn2erSqjGeKmv1mvU2ZNMl0WDyY1+fUBqY6T4a/D14Iu43ZsxbdvBpbY9euyrotH3+0E3rCY5h5e8ip2o+/4G8Th4euP+puLF2FAxqVjwFg1p/RePwSCqvF6jNPvvsa9eKUfe0sDAsWH2nz7k+V35hn8lElbrtd6v8iXsq1TfNmpXNRJhJUQsegGRUcaouoArwVPmuivqw/8P6Dk/Hd6XW4wn+MBg16eq14JfK8QkAAEBlEdrtAOoWe975p5Y7Se7XL76riYI+/ZLthX/6tTsVXbt2cK0YrUeDT+vywnOxLrrBcaF0sK3n0HNpcopkg7/Lccf9uNyv99o+bx3eeiqqwFHXMv+Azrq/95p1UTCog39tn9av24Jd9FJ5vQDKvBuYNVZhnPeZ81+CY2zKx1OqfmKaqao0wjQgOX321M38z3+50o5Z6//eldl07wQAAIgkQrsapkozDRYddvKqMVKCYVqQuroEu6wFQ6xgBZuf12VF40IlO9HVAX1whjQFZ16VjQJHDRrtr5xLRutRV51gBY7eB70fwROIMN42+ccBlFReL4AYVdRUpyvXlClfuBaAKLjyyhFxYbt/Qogw+s7UWG1+W7bED8/hV5VJolL5Ts8GOsYJe51hl0QVxgAAANVBaFcDdNCnME6/bmsw9mTVJhqQWcGUPwzTwa/3eHV1CXZZCxtnSrOd6TH+ajgFW3u7wE+hm+6jg3F/4KX7Kxj87W8vsiGid3+Pv8qmQ4f29vUojNNzBYMzbbdeh7rk/OUvV5YL2zx6P3S77hcMAYPrCA7+7Kno9QKIGR+osqsshff+bvCV6WZGd3Ug/bp1i58o4rXXx5frxu6n24I/aDVoUN+10jNJVDAUDI4Vl06bA+MBV0dwrDsNtwEAALAj5W0v4dpJ5eXluZYxRUVFrpVeHy3Z5lpA7dO/fV3XyoyCgrJxv1L82Ece+6XK0xiR1R1vSmG/Brv3qLrHT0F+WEivCqBgl1tVqHg0JlRwcHv/7Z7g8+kHjWCVi8bA9A8poPBfPzJ4UnmuVJ5HUr1ftsr0vikKsvlzrmp7DSXhpx+whhw1yPTo2bl0XEiF7TOmz7OhXrDaVmPeeT8oBj8b+vFMP+R560nFiy++GTemrbZHY+sF/eH6203zFk1N164d7Q9t/s9NcB3aDv145x9aRAHk9SXr8O/Tgp91SfUzGra+RPuzXFOTn/NcPB4B0q24uNi1qofzayAmnd9z+fn5rlUzqLQDgFpCJ/f+k1GdBHtdu5Jdgl3yNUmOX/D2CYEu+6KTYYUFANJLgVKw0l2hnAJy/ziziSbGUsjl7wGgMMu/Pu0zKjtJ1MCB/e3+xaPn1ARXXpWu/noTXmkMXYVzCgr969k9UEGo7Rg16qXSdei+d97xYNw+rboUCA4YED9j9RNPjonrcqyKYYWNumgGfb0XySobAQA7nr6rvO9DXfT9VZGqPAbIBEI7AKglPgqMR5dq9/Fgl3ydgPu7ug4atL9rxagLrf8EXffVyXUwLACQHsFJnVKlx5x51gnuWpnqThKl8Gv4sOPctRiFc16IqL/BCa8U/vur3xQk+oe8EE2a461Dz6ntqsrrTkYTbQVDS4Wd3mv3JtnSRTPo673QjPoAAACZQGgHALWAKkGCJ8mDBseHbYn07Ve+G5l/bDydaGtMST//CXrYTNIA0kcBlyZ1Co4Lm4zum6jbq7e+VAIx3SdskihdD05olYgCu5/97CfuWhnNtJ/s8brtpBOPdNfSwxvzN1i9mIjGAdZ4wwAAAJlAaAcAtcDEifFdVlXB4u8Sl4xOYoNdYL8IBICaRCcY3AXp9sqECgBSp8+zxnLTeG2JPmtaptt0H903LLDzaH3VnSRKyxUMKtgKhmC67m3L5ZefFzdWnUfboMfrfv6qOz3WP2lWumlb/lzyuhQ6at8XDA712vX8f/zTrwnsAABARjERBRARTERReeyXUqfxl/zVbpWtDgmbRCJsgHZ1kVM3XK+qL3Zy39F2oVVFnsYDUZc6j8bM8wQHwBf/7R5V7/mFDSrPRBTpw0QUQO5jIgogWpiIIr0qOi4MU5XHILqyeSIKQjsgIgjtKo/9EpB5hHZA7iO0A6KF0C69CO1AaJcm7FRQmxHaVR77JSDzCO2A3EdoB0QLoV16ZTK007jRb7450cyZvSCuN4noMe3atzGHHTYg6ZAUognc3nlnspk9a15p7xivx4omhUs0HERwO9XjY/OmLeb118eXrkfbceRRh+RUT5DKyubQjjHtAAAAAAAAKuGrr2eZ66+/3YZmwcBOtEwzjWtyNg01k4hu+9vf7rP39Q9noxnMNeSMhqjRUDd6voro8ZrZ3L8ebUerVs3dNWQbQjsAAAAAAIAUqTLu7rv+a4O1VCh405jKQRoPWrdVtB6FcHo+VfYl8/xzY12rjCZ0qqjSD9FFaAcAAAAAAJCiDz74LC5oUzCmWcU1sZku6qYanDl97OsTXCtGAdwTT45x12KGHD3Y3Hb77+06rrrmAjuLuUfPN2rUS+5aYppxXc/vbcvFF5/pbkE2IrQDAAAAAABIkcaw8+vdq3tcNZvGj7vgwjNsgKZAb9iw482ZZ53gbo2ZOPGjuOBPgd1ppw01zZs3sdf33KObufzy8+w6PB9O/txW+SUz5KhBtXr8ulxDaAcAAAAAAJCiZi5Y86hibuTIx+O6wCrEu/3262ylmyaSCHZRnTZ1pmvFdO3awbXiDRiwj2vFzJg+z7XCJZq0AtmJ0A4AAAAAACBF/fvv7VoxqphTFdw9d//XXHLJDTbA0wQTycagC05eocee+/Nryl38s8PKuvWJ1xnskovsR2hXTUrS9YHUbC7+D5Y+qH8dca958cU3KxwsEgAAAAAAZAd1P1W31zBegKcJJjS7rPKCirq0Vkawa65fo0YNXQu5gtCuihTEKZRTGq4PpH9KZdEHVcm5Zm/RBzXZFM8erVP304caAAAAAABEk7q9nnvuqaZbt05uSXlegPfHG/+RUiYABOVtL+HaSeXl5bmWMUVFRa6VXh8t2eZa0aZw7c47HiwX1FVEg0+G9S/X+t58c6IZN26y/VDrQ/+76y5xt6K26N++rmtlRkFBgWsZk+LHPvLYLwGZl+l9UxTwOUdtV5Of81w8HgHSrbi42LWqh++3GPWOU7GNp0HDBubee29y18KpkEZhm0ezuGpSiER0Tv/xlC/NnLkLzKxZC8y6tevdLfE0w6w3tp166PlpxtfKTiAxatTLcd1nyRLCpfN7Lj8/37VqBpV2VaCArbKBnag8NqwsVuvTB02BHQAAAAAASI+GjRq4VozOuxV2JaJz9i++mOGuxbRv38a1wmnGVxXoqPpOk0/cdvvvbdGOAkK/Dz74zLXKjz+3dg3DaqE8QrsqUEWcn9JslcU+9J9bSi9XXXOBGXzoAe4eZT777GvXAgAAAAAAmbTnHt3KhWcqmrnzzn/HzfbqDVf1j388Uq6gpl3b1q4V89XXs+z49VrHlVeOKFec44V4uxUmDvv22runa8WMHx+fMwBCaFcFwQ/wRRefaQYe0t9di9GO4Wc/O9mW0frNmZN40EgAAIB00cmHTig0Bq8myPJPmKUJtNT1x3+yAgBArjr00AGuVebLL2bEzdh61ZU3295xwa6tzZo3jTvf1/frbbc8YMev1zp0/wfuf8pMnPCRu0fZd3BwhtiuXTu4ljEHHLBvXJio3nwKAb0A0FuHvsO1XG2FhahdGNOuCvSB9tOsMaeddqxN0ysj2P88TKI+6TrI/uijL+L6y+sD361bR9O7V4/QsfM8Onj37zxUGahtmTz5c7subz2nnDKktL+9dhgTJ35kpk2daRYtXh4XXKqst31hGzvtdbI++N46PvqwbOIO7QAHlLx/hx8+0L5//vc2WX987cjeeWeymT1rXum6Un39UcWYdpWX6/ul4PgbyeizVFi4q/3/37ffXpXeH0VZcJ9blfE+UHWMaZedVCnw3PNjUxp6Q9+3+gEyl/YbqBzGtAOihTHtMkM/WFV2mCudY1562U9tUY6fAjSFdpURdn6r72sFhanS9vz2txeVnqczpl1qGNOultEHxU8DVGqG2EceeTZ0zLp00vr9s9b6fwXQgbmSfn3oVaKbagqvHY4+6N66tJ7Fi1eU7gi0nptvvsfulBT2BU8AtOPTtmibtK4wWocm79A6/DtKPaeeW+9fqturHdvf/nafeXfcB3Hr8r9+7ZD5FQK1iT5L3v9/fZ78v/Rlmp5L+yUA0eCdAKQS2Im+2/UdrR/XAADIVZdfcX7oEFaJ6EfxsMBOjj/+cHPiSUeWywYSUQ88/UAWpGITjX2XCm97vPN01A6EdlWwd6DLq+jAWCGSpnJWYKTwKt0Hv1qfwqpgiW0YncCrZDeVbi9hvxAMOWqQaxnz5OPlS4QT0bqCYZm2+98Pjk76q4bev7vvqriiSOFAKiciei6tjxMQ1Eb6fDz00Gh74p5JWr9+INBzpbJfApB5+t5ThV1l6Xtz1KiX3DUAAHKPKso1hJU3/ryq0oIUjClgU5CmCSXCAjuPgjtVvSm807qCAZ56pKlXnnqJaObZRBXtCu40q6y2KTg5RWW2B7mJ7rFVoANiVbKk8gu2PqQVdRtNtaQ12K1VO4WTTjyytCucArpgJVuwfFaC6xE955lnnVAutVdIphNyj9Z33nmnlr6e4O0y5OjB5rTThrprxlYgKtD0045t4MD+dru1jieeHFPu/Qy+D2Hvu57L61qrsPD118bbaiOP3n/N4JMN6B5beXSPrZgOSjLx5R62bepqnwl0j92x6B6bXYLddfS9rXF8NG6O9x2v79Ovps00zz3/RtyPcrrvvffe5K6hNqF7LBAtdI8F0ovusbWMAiKVpSr1rojXbVRBWXW6zuoEORi0aRuUynuJvU5iVfLrT+cVcL3yyjh3LbGwwE404KZOkL3Uf8iQQXEny7o9ONnG2kBV3uTJZdNai4I2/SrhbbfWoddSEY2HFwzsFA5661EwoV8w/P8uev8z3WUZqEn+Waq9i4I5/foWtk964bk3XAtAbbBly1bXihkwYF/7Xen/jtf3pr57zzv/VLckRt+xDC0BAAAQHVTaVYN+qX7zzYmlEzhUJKzqTVKptNMMbwqgPMkqyMKq4/y/nAcr7RJV9qUq2faHVePcdvvvS4M2v+BrDG5XcLsTVdsEt0dhRjZMTEGlXeXVxko7hXSJaJ+kcamCXdEzUW1HpV3tQaVddgl+BwYr5KtDXeKnTptR8l28oPRHNP2gt3u3zuawwwaE/vgnwe9v7Su0ncEJsPyV8nLuuafGzdbnF6wo1A+I+uEuKNPb7J+0K5tRaQdEC5V2QHplc6UdoV2aKCibM3eR+eKL6UkDvLCALFno5dG4Uf71JjuQlWQnucEDUVXRqW9/ZeiEXcHAnDkLyh1k+7c/eFAd9to8Fd03+JpSFeyuG1WEdpVHaFeeKks1tqZfos+41q9ZqJcsXl6uW/1uhW1Mr97dS7uxe8K2KUxwO70TZ01y49+XqTrQm/U2Ubgetj/r3LmDGTPmrbh9rvYZ/frtXWFIX51tEb3HqmCuzPsWxnv//bOAaxsUBFQ0rEJNIrTLLsHvUk+qn48w+kHgvpGPxx07hEn0fRs87tAQGcFt1P99zSbvPx5K9gNlcAbA4A90NbXNGl8oFxDaAdFCaAekVzaHdnSPTRMFaDop1sGbqlp0cBccRFJ0AFiVrif+E0tp2Ci1WWpS0bBhfddKTNussel0kKwTaJ206+A1GNgFBbvpJBP2fqXDnNkLXAvIfar4CH6Wli5Z7lpl9HnW51jVrcHKPFWjaF+lz7gq96rTxVwnzjr51QQy2l8E92W6ruW6/c47/+2WJqft1fiWGivTvz5ts9aj/ZSeNygd26LAT6FoRe9bRTNi+99//3aorWW6TdsQ9jqAZPbddw/Xiud9Pi655AZb2a7QOFXaD+jxFVHgph8iKxIMv0QTYGncPT99FsI+A9onBQPzYBhZU9sMAACQSYR2GaBuaBqz7c9/udJWhOhg0m/2rOwKkXRwr5lodYIcPEkFED177d3TtWKCJ66qDA5ODpOIPvPPPPOau1Z5qoZL5cRZFJipSqgiOnn2urmF0TbrhD2outui902hRyq0fYlmsA6bnCeMtkGVQkBlKLhX9Vgi+r/pBcOq4tf/82ThsAIt/3e/fhTQsY2qaTXchSrc/Mc5CsFSCfpV+aeZ8rQeXRS6adu13O/jKeXDxQ8+iB8rV+P2+dXkNgMAAGQSoV0l6QBXlWbeRVUXyah7k7pL+VWm+syjLhh+mzclPmENU9XKPB346uDeT9uiLiuqJtRBcLKTgwYNKq7i81Q2EPQOwCu6JOqOC9RWr78+3rVi9HnWiaw+LzohDU4uo/DIo32a7qfPX5D/cycKAsJmjvbuc9U1F5Tbt02bOtO1ktNJuB6v9Wib9Rr8tD/xh27p2JYJEz5yrRg93nvfdAkGAQpHNO6pn6qb/Nuh++tx3jo09IG/UlIhY0XfM0CQunuqW3xFVNnpVYYmCszHjZvsWrH/r5rwyuu6rS7gCq40k71fdSbAUhdev/Hjy57fo3Hl/PrvH9+VvKa3GQAAIFMI7SpJYw35vVZy8pvsF2rdtmhxfNe0ygRZHo2z5Dd1WuITW1WD+OmAtaqD0PsPfEUnqeoCrDFmVE1Y0ZhLwW56OgFN9H5pfLxkgutauybx+w4gsQsuPMMGRQrnFFTp8+yNv6YT0qOGlO/yVZUuslqnwjDtN1ShoufTfsOj/dLgwfu7azGr18R3WQ2jbdZJuLdf0zbrNQTDxnff/dC10rMtwSq94Lh1XhCgfZUCEwVwhx8eX4kzfnzZNokmCPBX62ioBf37+Ol7BqgsDdmhcD34uQijgFnhnapA/RQy+6ta9SOk//+8J1hxpnEak9FnUJ/bMFqXP/xWAO/f/6jbub9LuT5v/mOcHbHNAAAAmUJoV0m9e3V3rRgdON588z22EsJ/UKm2luk2/8Gj7B4I/lKhgdH9VP0WNl6SArFgFc3eKRywJxLc9mBwJl9+Md21ylOo5z/4lmDliei1+Kt5wgS7/IX9+g6gYjrx1AmrZloMG0Q9LORftWqta1WO1qVwTBWvYTM7Bvcp/pPxRBSuhZ2EB8NGrcu/X67utgQr8bR/VzWyf1+s91VDIygwUQAX3M7gfi7shw/9+ygg8ARfB5Aq/f/S/3VVoyqwrijAUxWof6y7OXMWulaMgmt/bwP/xa+iz3G79vE9EIKC3V3feafs+/6jD+O7yw4aNMC1YnbUNgMAAGQCoV0l6SQs7MRO4xxpcHLvQFBtLQseBOpELOyE2E/VHQrfdPFOBnUiGHxejZekYNCrXNOBtsZx8nczVWB22mnHumvVN/b1CaUnj9o2DZReUbfWQw+NP6DW2DH+MXT0GvRaKqIBqoO/vuv5ve3R+rReDbKt5WqHBZsAytPnSFW6qrTRMACZpM+lPvcaL/Pf/x7tlqYu7McDqUrYWJlt0cyWftq/a3+mMT/1num9C1Y6+/nDEI8/QPBfglV9VQ1NAVEQrMBaAZ66dKsKVF3Kgz+qSbAatKrC/r97KpoAK9jdVbNEe/xt6dsvecV/ZVRnmwEAADKB0K4Khp0ZP25RqvQYjYcS1LVrB9eK0YngVVfebC8vPPeGW1r+eVUFp2BQ99NJngaVDgZ2l17209CKlFQFx4nSiaQXTupEtaLqOFH3sGCFirrheNut16DXUtF7qpOO4Bg0en5ve7Q+b4B6LVdbYSAVKkB5CrkVVingVtCtz9FDD422lTYVVZxUlj6DCtE1c6u379DnXhXDwWreTKvOtmhfligw1Hum907voQI8VeB5P0ykQ7B6CKgqHRPoB0h1Kf/LX64M+Z7f8ZNlKYD3f9b0+VLArot//6Rtr84xDgAAQNQR2lWBDiYVhvm7L1VE9/3tby8KHQ9F3VcSnQj6x8PT82odqTyvQjJtY0VVfRVRlV6ibRMFbcHB1xXs+U9WdUB93vmnlgvu/PQcw4cd564lpopDPV8qvPcg7D0Hctmc2fEn3cHPsE58NfC8wioF3JkMzhQMKhBUiB6sHqtp1d0W7cvU9VXdDJPtzxQqqAJP77Hea6Cm6P+4wmjvUlHVrP5P9+8fP/FDsv2Bjj+8SVMqulQ05m1Fgt1e1S022DU2OGRJmJrcZgAAgHQjtKsihWEaF0mDPOuX3rAgTct0m+6j+yYLjzSouu7rPxHUiXZwPDqtw/+8/vsrONN4NQq1NE5VdQM70QG9tk0zxPpP/PW8GmhdIaKCtOB2fjwl/sBa2/L73/+y3HrU1gmwToRTpefT+Dx6/mAYoe1K93sAZBMF5sFAavdunV0rdrsqUIMn5tpf6fOpbnP6fKWDupopGPTz9lN6Lu3H9Hw1IZ3bom6G2r/4xwnz/3Dh0Xv87weTd7kNCw7CLpoNFKhIj55ln3VRgKzK0mSCVZz+/8vt2rZ2rZhUJopJl2C3V3WL9XeN1fe9KgaDduQ2AwAApFve9hKunVReXp5rGVNUVORa6fXRkm2uhdpI3clUneJRiKCAsrbo376ua2VGQUGBaxmT4sc+8nJ9v6SgSd3e/RTgJKPursFu65o11QuwdQKvSjOPTnwVqAe7mKlKx0+hlr8KJZVtC26Lwq3gBBCprCe4LQrsNdFDkKra1N3Vz1tXurYlGXW9/eCDz+L2Y+K9dwpM1Y3fT8GffoyJskzvm6Igl44//nD97eXGmtWPfKqoC36GP/roC9s13M//2dD/WVWM+kN+hdthYVky6o7u/zFBQXkqQbTGmgxunyfROnb0Nmermvyc5+LxCJBuxcXFrlU9nF8DMen8nsvPz3etmkGlHTLOmxhCoZxOEnRAHWbz5q2uFdN198rPsputasNJMTJHnylNgKCTzGBgp/DbX3G6ZUv856xli6blArtkkylUxpbAZ7p9yOyLU6dWvvvo5Mmfhe5HXn8tfuZsfyVuOrZF+y/tx/Q+KxgJUviW7KRe73OwKts/KyaQDkcdFT+Lsij4UiDt7zqr62GB2KBB+7tW7P9scCbXJ54cY7vhehSW6/OgizcZS6Lv+coKdt310+RUYXb0NgMAAKQToR0yrkXJAbSCBFWf6CRBv4Dr5NejA2UdTOtE3K/3XhWPVQPUNv6Tbu+i6i1NgBA2TtsJJx3hWuH0GO9k1vss6gS3Krzx2/yfb7/Jkz8vvU1VaQrANHlDZamCRjNle+vSdqsiJxhYBsfE8qvstuikXvsv7cf0nnmzV/vHrNN6tB1+6mrYuXPZZEOHBKp99Jx6bi8w8Nahscj0V/8eWgakShVlqqyrClWxBsd1O+64HwcC8NgkWN7+R9Wt+jzo4k3GMmbMW+7e1aNt8Q8D4lH4naxCdUduMwAAQDrRPRYZp5PO4FhSFaFrbPrRPbZqotY9tjI0tqPGgPRTAKTJGCor2D1WdPKbiLqVVuWzL8m6xyoE83d7SyTY/TUd2xLW9bgiYV3qknX5C6PwoTLjfqYb3WOzk8LgceMmp/R50edqyJBBdrzGMAqVFZQr5KpIWPf16nQ1DXbpl7B9W9CO3OZsRPdYIFroHgukVzZ3j41UaLd4ZXp2Toiefz70knn17dS63PXq3sH89tJTTcvmZQd1ua6wdeY/+IR2VZONoZ0qU0468YiEYzhVFGApNFf3dP/YbGEntepWlqg67So3jl5FAZXWu3bturgwLDj+lD+007b16t293Em8nwK7n/3sJ+W6/VZ3WxQCqBonWUWeX7KT/FSDO73eiy4+s9xrqUmEdtlL/2cnTvzITJs6007IoIkpPNpPqHu8Pk8DB/ZP6f+Y9h1Tp80ws2YtiAsD9f+0Xfs25rDDBoRWwFUnAAv+0KCA8d57b3LXKrYjtjkbEdoB0UJoB6QXoV2aENrlts+mzTXjJ39lFi5eYabNjJ+trmWLJqZTYWszaP9e5ojB+7mltQehXdUQ2pVRNVbzkhPw3r16VFiBIlr3+PEfxp3IKuzyHh88UdYJvmZMDVI1z5dfTC+tZtH9Cgt3NaecMqT0RFgnzVOmfFF6AqyTbs047Q2MHwwR1bXv4ovPdNfKh3aqwtX2axB9bb8XROi2fv32Tvr6q7stoi6xH334pVm6ZHncSb1UFAT4hb0G0b9l+8I25SYO2FEI7YDcR2gHRAuhHZBehHZpQmiH2orQrmpyPbQDooDQDsh9hHZAtBDaAemVzaEdE1EAAAAAAAAAEUNoBwAAAAAAAEQMoR0AAAAAAAAQMYR2AAAAAAAAQMQwEQUQAUxEUTVMRAFkXm2YiILjD9RmNXEM4sdEFEDF0jURRf6GJ10LqN2KGw9zrepj9ligFiK0qxr2S0Bm1fTJ/I7C5xy1GaEdED2EdkB6ZXNoR/dYAAAAAAAAIGII7QAAAAAAAICIIbQDAAAAAAAAIobQDgAAAAAAAIgYQjsAAAAAAAAgYgjtAAAAAAAAgIghtAMAAAAAAAAihtAOAAAAAAAAiBhCOwAAAAAAACBiCO0AAAAAAACAiCG0AwAAAAAAACKG0A4AAAAAAACIGEI7AAAAAAAAIGII7QAAAAAAAICIIbQDAAAAAAAAIobQDgAAAAAAAIgYQjsAAAAAAAAgYgjtAAAAAAAAgIghtAMAAAAAAAAihtAOAAAAAAAAiBhCOwAAAAAAACBiCO0AAAAAAACAiCG0AwAAAAAAACKG0A4AAAAAAACIGEI7AAAAAAAAIGII7QAAAAAAAICIIbQDAAAAAAAAIobQDgAAAAAAAIgYQjsAAAAAAAAgYgjtAAAAAAAAgIghtAMAAAAAAAAihtAOAAAAAAAAiBhCOwAAAAAAACBiCO0AAAAAAACAiCG0AwAAAAAAACImb3sJ104qLy/PtYwpKipyrfRavLLYtYDapbB1vmtlTkFBgWsZk+LHPvLYLwGZVRP7pijgc47arDKf8zFjxrgWgFwz/LANrgXknuLGw1yr+vLza/b4mEo7AAAAAAAAIGII7QAAAAAklamKdgAAkBihHQAAAICEvvvuOzN37lx3DQAA1BRCOwAAAAAJKbBbtGiRuwYAAGoKoR0AAACAUAsXLqTKDgCAHYTQDgAAAEA5q1atsoHdtm3b3BIAAFCTCO0AAAAAxNmwYYMN7IqLi90SAABQ0wjtAAAAAJT6/vvvbWC3cuVKtwQAAOwIhHYAAAAASimwW7BggbsGAAB2FEI7AAAAANbixYuZeAIAgIggtAMAAABg1qxZYwO7b7/91i0BAAA7Ut72Eq6dVF5enmsZU1RU5FrptXglA92idipsne9amVNQUOBaxqT4sY889ktAZtXEvikK+JyjNvM+55s2bTLTpk0zy5cvt9dRdbvssovZY489TPPmzU39+vVNfn78vlTvtS5r1641X3/9tdm4caO7Bdhxhh+2wbWA3FPceJhrVV9wn55pVNoBAAAAtZh+zFOFHYFd9SisGzRokBk6dKjp3r27admyZejJXaNGjextuo/u+6Mf/cg+FgCAIEI7AAAAoBZTYDdv3jx3DVXRsWNHM2TIEFNYWGjq1q3rllZM923Tpo0N77QOAAD8CO0AAACAWmrp0qVMPFFNCtsGDBhgu8JWlcI7rYPgDgDgR2gHAAAA1EIbNxTZwG7Lli1uCSpL3VoVtoVV123dutXMnz/fvPnmm+aJJ56wF7VnzpxpbwvygrvWrVu7JQCA2o7QDgAAAKhlvvt2q1m5bJFZt26dW4KqGDx4cGhgt3r1avPaa6+ZSZMmmZUrV7qlxranTJlinnnmGXufIC+4AwBAmD0WiABmj60a9ktAZjF7LJC7liycY0M7VJ26sh588MHuWpn169ebV155xV1L7phjjjFNmzZ118p8/PHHZsaMGe5azHHHHVduYouw+3kqe39R5WDfvn1NkyZN4h6r2W51rDV16tS4EDLM8OHDXSumuLjYjBkzxuy9996mS5cudiIOb/myZcvsOIDeMo+qERVuJnPKKaeU65KsSsaKtg/hmD0WuYzZYwEAAABkhVXLFxPYpUGPHj1cq8y2bdvMu+++665VTPfVY4J2xNh2/fr1sxNiKEQLnpQqVNOEGYcffniVZrvVunv37h0Xzuk5FOKtXbvWLSlTURdhvT/BwE7BIoEdgFxDaAcAAADUEuvXrjYrly9211AdYdUWqrLbuHGju1Yx3VePCQqrvsskBXHdu3cP7eobpPDuiCOOSDm4q1evnl13GL326dOnu2tl9PqTrb99+/auVWbxYv5fA8g9hHYAAABALbBpY7FZtXyR+XYrE09UlyrBwmaLXb58uWulLuwxCs9qqtpO3VYVxFWGKuZSHXsv2ay6CxYssNVxYcHlHnvs4VrlhVXiff31164FALmD0A4AAADIcdu++9ZW2G0o/sYtQXU0a9bMteJVJbSbM2eOa8Vr0KCBa2VWt27dXKuMQrT33nvPznj7wgsvhFaxKeirTrCoGXS98fXCurUm6iKr5cEx8Cpb4QgA2YLQDgAAAMhxCuzWrV7hrqG6WrRo4VrxqjKmWqKwKdFzpJPGmgtWwikA00QaqoITbd/48ePN/Pnz7XW/sHH9EtF6NVGEgkBdNIOuJ6xKLlEX2d133921yjCWHYBcRWgHAAAA5LDVK5Yyjl2apTL2W3XVxHOEVbNNmzbNteJNmjSp3KQZqc6i6E3QkShcUzC4evVqd61M165dXatMcJu17opmmgWAbEVoBwAAAOSwom/Wmu0//OCuAWUaN27sWmW8Crswmzdvdq0YVemlMiFFKt1Xw7oWB8faS9Q1FgByFaEdAAAAkMPatO9oGuc3cdeQDsGKs0yoiTAqrJpv+PDhCS9hlXWFhYWuldjatWtdK7Evvvii3PsanEW3Q4cOrlWmKuMIAkC2ILQDAAAAclijXfJNqzaFZud6iWfxROWsWbPGteIlmjwhmUSP0UQNuaK4uNi1kgt2kVWoqNltPcH3Su+Rwj4AyFWEdgAAAECOa9q8lWndpuKKKKRm3bp1rhUv2J0zFWHVYxI2Y2uuC5tJ13tP1Q03WHmX6N8BAHIFoR0AAABQC6jartWu7d01VIcmVAirhEsU2ilwOvHEE82gQYPKjQHXvHlz1yqzadOmCseAq0jDhg1dq3K82V1TvcyYMcM9svo0nl7wffWCuj322MP+9QsL+QAglxDaAQAAALVAXl6eDe6aNG3hlqA6wrp8KmAKm5ihb9++dgIFjf82dOhQc9BBB9nl6u7ZsmVL2/ZLNMtqZdTE7LOZsGzZMteK0evo0aNHaNfYZJNmAEAuILQDAAAAaon6DRra4K5Bw4pn/ERyYRVmCpgGDx7srsUoxPNX4Ok+nTp1Mscdd5wZMGCAW1pGkzF8/vnn7lpyu+66q2vF69ixo2slFxY89uvXz7V2jNmzZ7tWGb2eYNfYYLgHALmI0A4AAACoRfKbNLPj2+1Up45bgqpQlVfYDK8Kl4488sjSijt1c50+fXq5gEwzsYbNxjp37tzQrrFh3XGbNAmfFbhXr16ulVzYhBoKyMKqBVXtdsopp5hjjjnGdvPV9bD7VZeqDNU92C+sGjEs3AOAXENoBwAAANQyLVq3ZWKKNHj33XdtZVyQQqYhQ4bYqjV169QMp2PGjDHLly939win2VOnTJnirsXbsGGDa5VR6PejH/2oNDxT4KYKvmBVWiKq6Atuf/369c0RRxxhQzmPXsc+++xjb9O61c1XXX713JlQ0SQcCvXS0YUYAKIub3sJ105KY2B4ioqKXCu9Fq9MbSpwINcUti7/K2u6FRQUuJYxKX7sI4/9EpBZNbFvigI+56ittm37zqxbsaBWzlKaTgrK1M01HWPIqZpu1qxZNuQLUvh3+OGHu2tV8/HHH5fr1qvx9dRdtyree++9cuPKDR8+3LXKhD1vMgohTzjhBHetvJkzZyYMN1E1ww8rHwoDuaK48TDXqr6wCulMotIOAAAAqIXq1t3ZdO7cOXT2UqROodXkyZNDu69WlirZevfubavlgmPLqbIsrDtuIsEupolMmjTJVvhVloKzTE0Eoe7ByV7r119/7VoAkNsI7QAAAIBaSl0dFdw1aNDALUFVKLx67bXXbNViWHfZylIlR/fu3eO6qIq644ZNHhGkQG3t2rXuWsXGjh2bcsWlXt/UqVMzXumWaHsU5oWN+QcAuYjQDgAAAKjF2rVrZ7p06eKuoaoUJI0fP968/PLLNjRT9VpYwKYKON2m+7zwwgs2AAsL+vTYYJdSPYfGxtNjg5Vour/GzHvzzTerFKhp2/VYhWXB7db2adn8+fPt6wvrvptueo6w94Wx7ADUJoxpB0QAY9pVDfslILMY0w7Ifd7n/IcffjDTpk2zoQxqnsZwGzx4cNwEEpUdBy7X6D0ZOnRo3FiBCvEUGlJpl36MaYdcxph2AAAAALLWTjvtZKvtNNkBap5CqFdeecUGdV6FXm0O7ESz0wYn96BrLIDahtAOAAAAgK1sUnBX01UEKKOgTuPLqQtsbeIPi/X/UDPaFhYWuiVl1P0XAGoTQjsAAAAAVqtWrezEFHXq1HFLgMzr0KGDGT58uL2ccMIJplOnTu6WMpqdtybG0gOAKCG0AwAAAFCqY8eOTEyBGhWc+CKMJuwAgNqG0A4AAABAHFXbtW/f3l0DdizNllvbx/gDUDsR2gEAAACIU79+fVtt16xZM7cEyBwFcsFqu02bNtlJOd58800zZcoUtxQAape87SVcO6m8vDzXMqaoqMi10mvxyorLooFcVNg68wM+FxQUuJYxKX7sI4/9EpBZNbFvigI+56jNKvqcL1261EybNs1s2bLFLQGQi4YftsG1gNxT3HiYa1VfTU/WRKUdAAAAgFDt2rWzXWUBAEDNI7QDAAAAkJC6yYbN5gkAADKL0A4AAABAQjvttJPZY4893DUAAFBTCO0AAAAAJFW3bl3XAgAANYXQDgAAAAAAAIgYZo8FIoDZY6uG/RKQWcweC+S+mv6c5+LxCJBuxcXp+V7K3/CkawG1G7PHAgAAAAAAAEgbQjsAAAAAAAAgYgjtAAAAAAAAgIghtAMAAAAAAAAihtAOAAAAAAAAiBhCOwAAAAAAACBiCO0AAAAAAACAiCG0AwAAAAAAACKG0A4AAAAAAACIGEI7AAAAAAAAIGII7QAAAAAAAICIIbQDAAAAAAAAIobQDgAAAAAAAIgYQjsAAAAAAAAgYgjtAAAAAAAAgIghtAMAAAAAAAAihtAOAAAAAAAAiBhCOwAAAAAAACBiCO0AAAAAAACAiCG0AwAAAAAAACKG0A4AAAAAAACIGEI7AAAAAAAAIGII7QAAAAAAAICIIbQDAAAAAAAAIiZvewnXTiovL8+1jCkqKnKt9Fq8sti1gNqlsHW+a2VOQUGBaxmT4sc+8tgvAZlVE/umKOBzjtqspj/nFR2PbJ3yrGsBtUP9fie7Vpni4vR8L+VveNK1gNqtuPEw16q+/Pya/d6k0g4AAAAAAACIGEI7AAAAAAAAIGII7QAAAAAAAICIIbQDAAAAAAAAIoaJKIAIYCKKqmG/BGQWE1EAuY+JKIAdi4koyvzkuq/NlOkb3LXE2rasZ3p0aGgG7dvEHH1gM9O2RT13C5Lxv7/zn+1v/9YWTEQBAAAAAACQYctWf2vGffKNuemhhebk331tXvtgnbsFyD2EdgAAAAAAIDKOG9jcXHhi29BLv56NTeNGdez9FOBdfMts89BLK+x1INfQPRaIALrHVg37JSCz6B4L5D66xwI7Ft1jy/i7b468Zncz5IBmth1m2ZpvzYhHFpkxE9fa6wrxnv5zT9OrcyN7HfCjeywAAAAAAEAN0Dh2d13R1VbkyYZN35sbH1hg20AuodIOiAAq7aqG/RKQOn3uVy1fbOrVb2CaNm/lliZHpV2ZdWtWmq1bNptd23WI2/cA2S5XK+1ueX6G+fdbc9215Lq1bWy6t8s3A3u2NCcfUOiWhht25wfmk7ll42ed9+Mu5poTe7hrZZav31KyDdPNx3PXm+XrNttljRvsXPI8jc2vhnYzB3ZvYZelej8kNvbz5eayBz9112Jm3HW0a6VH8P9Tny7NzJOXH+CuVQ+VdmUqU2nnUcXdEb+eakM7efn2XlTboRwq7QAAQGRt3rTBzJz2iVmycI754fvYQS0qZ/sPP5hli+eZ6V9OMRs3ZOZHAgA7xqxlG8zLHy8zv3v8S3PsiAnm/Zlr3C1V89XiIjP05ol2nV4QJxu2fGcDv+LN39nrqd4PsfdKwdk9r852S4AYVdwNP7K1u2bMCxNi3WXDTJu3yVx2xxxz4IWfm04nf2QvamvZe18m/m4f8ehie1+FiuKtp/dZn5Su55y/zIybEMN23y15nP+59PjRb6929winx/1z1FJ7X+9x3mO1XLdXlX+dQd5y7zVojED//fVaK3qfkBmEdgAA5ChVhi1dNNfMnv6F2bSRqtHqqFO3rv27ZfNGM2fGFzYA3bJ5k10GIHcowLv0gU+rFdw9NXGRDd4SOXKfNvZvqverzRTWXfHwZ+akv79nK902buWHJ5Q3eL+yCt5Ppocf7yjwGnrlNDsGniav8KitZWfeOMOGbBVRmOWtx6vuE81mqwkxFMop2NKstvc/vyzuuVRFePXd8xI+j/e4O55aUlpx6NF1LVdVYSaDs+KS16SwTjPz+rdBr9V7n5j0o2YR2gEAkIPWrl5hFs6bYVYsXWi2fVf1X2VR3vfbtpmVyxbZ93fNquVuKYBcoSDtt499abuuBqlLpLpeepewrrGzlsWHBoP2bGXe/fNh9v7PXXuwW5r6/WqzP4/+ylYiJqNw0/9vogtql4P3Kgvtpi8sq1r1KLBT4CWasEKVeep+q8sVZ7Q3bVvWs7cpZEsW3C1Z/a0Ns4LrOLRPE3cPY5/nT/9eaMM6jbd366Wd7X381YB6HlXr+SmIu+jvs0tDPs2Qe8O5HexjtQ5dF4Vnul+mgrsHXlxuwzq9J3pvvOcPvsbqVPyhcgjtAADIIaqoWzR/lg2UNhStd0uRCRuLv7Hv86J5M80muswCkaYxyILBji53nb+fHZdO48j5qbvqo+PSM6h9t7b5pk3TBra9Z2FZuBCU6v0AJOavfhOFY/7A7r5rdzcjLu5ox8vT5VentTPP/nUP071DQ3ufsEDN4wVqwXU8fH330lBN95m5cLMN3DRRxqk/amnvo/tfeGJbex+ZPC0+tL/zySWl267H/m/EHubcY3e1j9U6dF3LRfe76q55tp1u2naFje/fv499b7zn12v0gjs9/6vvl3UFRmYR2gEAkAN++OEHs2rFEhsirS75qzHYUAO2bzerVy6177sm+vjhB7puAdlEVVqqlrv7gv3KBXdPv7fItQBEnReaBY18rqxSU5Vj/qo8j8bFu/PXXdy1+McEqWIubB3HHBSbxVa0LQrcgvzdeJevLesar6o5ryuqgrGwx4qWe7PlKhysaHy8qrruZ7u5VrwLTijrsu/ffmQWs8cCEcDssVXDfgmIKS5ab9asWmbWrWaMkR2tWYvWpkWrtia/ScUz3gFRUFtmj01lts9Hxi0wI575yl2L+euZe8XNKJts9tgel71q/yaj+6cyq21wVlp11X3m/cVm4vTVcc+v16VZb085sLC0Si/Iv126/50/39fOWPvutNW2K3CbZg1N3y5NzR3n7OvuFaNZWV/7dHnczLbefYfs1ybhmHvB90gVjd72v/rpMjtuoHjrOv/wLuUqC4PrCOO9R6nOHut/D2cu3RA3nqA3g3Ci18XssTVDY6l54ZW6ZarKK1VH/maqrRKT+c/2t39FE0Eo4FKV3dTH+ril4bx1qGuoKs086jKrCjxJtF2awEFj2okq6q47O3wmam8SCP99/OtXV1RVtiWigE/jyokCRFXwpcr//vrfI/G2S4GjqvoSCdv+bMDssQAAoMZprLoVSxeYRXNnENhFxLo1K23V3fIlC8x33zLeC5BNjtq3fHXL7OUbXWvH0aQYp9/xgfnnK7PKBVm6ruWahfbZDyoeRF/+8ORUO06cF1r5Z6713PDUNBuEBWe2VVvLdNsF/5oSOu5fkH/7vcBOvHVpkolUt72qgu9hcAIQbwZhvS5mqM1OXmAX5HVpbdeyng3Wkl0KGtWx9/UeU1XdCsMD9ERmLizrjpsssBN/lZ//cemicDMVmXhuhCO0AwAgC32zbrVZOHeGWbpontm6NfxAFTvGt1u3mGWL55mF86ab9WtXuaUAok6Vaqqg8vt0XvJqr0zT7KmazTYsWPNTCPW7x7+0VWfJKLAa/1X5/ZKq3TwK7J5+b6G7lpjWc/l/PnPXEktl+29+ZnpKAWBV3fy/ryrcBo+CverMHowdy5tUQvyTNSjUUyVcsot/tlSFeGFSqf7LTzH48gTH4duRundo5FrJRWmbcx2hHQAAWWTrlk1m6cK5NrD7Zj0nFVFWtH6trbpbsnCO2bKZX6SBXOdNbhEM/tSN07tN3TlTvZ9o9lR/VZhmmNXMsrqP/uoxfgq/UnH6wR1KZ6rVxeueqtDPH9hpnL/rTtmz9H7qLqyupB6FgOpWnIy2X4/RY7UOPe/QvmUD8ovuM2l62fhc3iy9qbxHFVEVn7/CT69JE5B469F2BU34KjNjhSEz/AFbDzehhBRvJFhC9iO0AwAgS6xdtdyGdSuWLTTbtjEAcDb4fts2s3LZIhverSn59wOAVKnay98dVgHWA7/oVxqw6a+CK38ApmqyikI0jSV30xm9QsfAGz0pvpvqX8/qbX52aNmYWRrf75azy8b6kofeTj6LpUIyPcYbG1DPq/HzghN/ZKorsp5XIZ2CSoWH5/6oU9y4dbpdYajf8vVUsGeT8Z+VVdT16V4WKvur4jSBg8ZxS/VSmfH0qivVLqmonQjtAACIuE0bi82ieTNt8LOh+Bu3FNlkY8m/m/799O+4aUNmJs4BkFuC1V77dQ4PETR5gt/n85N36R3aJ77KzS/YdTZsUgaFhf4KOAWF6sabSJ8uTctNNCHd24XP9pkJeh0KKl+67hDzy6N3d0vLdGsbP7D8snWZ66qL9Fq25lvz4sSyngc/7t/UtWK8QGxGgjHvosDfJbWiGWH9XX5T7cqK7EZoBwBARP3ww/dm1fLFZuHc6Wb1yqU5M/NzrVXy76d/R4V3+nfVvy8AJBIcT0+zl2om2OAlOHNqRYHT7m12ca14YePhhT2fLv4KQFm8JvEQAMFALCr0ejXphCbUSGVGX0TTiEcWlY6vpmq6Xp3jg6zD+jSxfzWmXaJx6jyaaVYXzbJakwbvVxZqvzxprWuFe+qNsmB9v+7hn2XkFkI7AAAiasmCOWbxgtlm86YdP3sh0kf/nvp31b8vAKRbMFALatywrmulz2fzol8Fru7GmmTj2BETbPCosFOTToRNzIHoU4XdOX+ZacZMjIVcqqi7+KTyVaRDD2ruWsb86aGFcZVqfpfdMcfOGquLfzKLmqAZYfv1jFWejvvkG/PQSytsO0jLvderbaxoplnkBkI7AAAiatf2HUyb9p3MzvXquyXIBfr31L/rru06uCUAoiIYeEW1SgyVc8XDn5lz7vrQTrLhn5QC0aWKsxGPLi53uW7kAlsJd+AFn9uAy3PbpZ3LVdmJxqYbfmRr21Ygd9HfZ9t1qOpOFwVhWl9F4V+mXT6sfWlX3pseWmi3SdumbVSXWV3XctH9bruss20j9xHaAQAQUfXqNTBtCzuZjl16mGYtYgecyG5Nm7cyHUr+PfXvWq9++UHgAew4mmU0aN9Osa51UeCfObWiS7qErTvskupMrjvCLc/PMC9/vMxdi9FkHJrA41fHdLOTVARn4cWOpxDt/ueXlbs8MXalmTK9LHhVxdnjf+qRdOKIERd3NBeeGAvi1JVW67j4ltn2oiDMW5/Wdd+1u4eGf5mmajs9t1flp23Stmkbr757Xrlt1P1ROxDaAQAQcflNmpsOnXuYwo67m4aNam7gbqRPw0a72H+/Dl16moKSf08A0bJ8/Rbzj1dmu2sxmt3Um/F0RwhW+WV6RtO9O8YP4C/JJpjIFk+/t8i1YhTUvXvToXYGW01KETbZBqKte4eGdvy6Wy/tbN6/f5+UAqzrzi40L9/eyz5Oj/dT19Qrzmhvnv3rHjs0DNNzaxu0LV53WU9UthE1j9AOAIAssFOdOqZVm0JbpdWydTuTl5fnbkGU6d9J/14KXfXvV6fk3xFAdCiUemTcAnP6HR/YWVD9Tj94N9faMQbu0cK1Yt6dtjqjIVqbpg3iZoWVpybGB17ZaMOW71wrplvIrLXjv1rpWtiR/jdiDzP/2f4VXsb+X29z1xVdKz2mmyro9Dg93r8+Pe+vTmtn2rYIH8tOgZ9330RU6efdJ1nVn3cfrTOMtkHbEnwvKtrGVPjXGeQtT7RdHu9+WhdqBqEdAABZpNEu+Wa3zt1txVbjgvJVEYiOxvlNbMiqf69GjflVHNiRNFZdcAZUXU76+3tmxDNflQvs1H3y7EM7ums7hirAurUtC5gUPl3z6Odxs7yqS2/fq980w+78wHYDDZsBtjJOPTD+hF1jwGm9qkQUhYYaH27wDePsXwWeNVmNN2tZsf2r56zq8/7n7fmlj9XkFJo9lnHuAEQVoR0AAFmoectdbSC0a7uOZueda3aWMyRXt+7OdpIJBavNW9LtCsg26hb7t7P2spVnO9rvf7Kn3R6PwiXNeuqFjr97/Esb5imU/Pdbc+1tYWPzpUrdgTXWm5/WO/gP75SGnBofTiGn/irwVJCYKft1jq9Y0kyv3na8NCV+nLpEgq9H75Uer/VocgpmjwUQZYR2AABkqfr1G5p2u3W24Z0mOMCO16RZS/vv0W63LqZ+g/gxcwBEn7qH3n3BfubA7vFdU3cUbYe2xx/cJaL7XHfKntUeh09jvQWDrkT0fj14SeIug9V1bL+2CV+7V3VXkWtO7BlXsRjkvW/+51Gw51UXAsCOlLe9hGsn5R87p6goMyXQi1emtuMFck1h6/iBhjOhoKCsa1aKH/vIY78ElPl+2zazZtUye9myeZNbWl5HVX+1Sq36qyb2TVGQyuf8m3WrzdyZU9218hTQtWjV1rRo3dZW2gHZoqY/5xUdj2yd8qxrVY+6dKpCLBUKnto2a2CG7NemwkkJ1A1VgY5Hs44GZ05N5T6S6v1EAdIz7y82E6evjnuMgqbu7RqbgT1bmlMOLAytDlRFmZ9mS01l8gV1tX3t0+Xm47nr47oPKwDr3i4/4fuV7tevLqwPvTWv5L7rS8en07+ZXrMmktB2qsLQTzPa+un9e3TcAjt2ndcVVl2gB+/ZypwxcDezZ2GB7e7rn2VWQd7PXBfp4P8nPf+Tlx/grlVP/X4nu1aZ4uL0HH/mb3jStYDarbjxMNeqvvz8mv3eJLQDIoDQrmrYLwHlbdxQZNasjIV3YQjtyqtuaKf3U4GdxrADsk2uhnZAtiC0AzIvm0M7uscCAJBDdmlcYLtnajy1XQiRMkqTS9hJQTr3ILADAABA2hHaAQCQg1q0amPDu13b7kZ3zTSrU6eOad2m0HQseX9btm4XV/ULAAAApAuhHQAAOapBg0amXYeupmvPvU3DRokH4UbFNGagNGjYqOT93Me077h7SXsXuwwAAADIBEI7AAByXKNd8k2P3n1N+w5dzU516rilqIy8nXYybQs7m5579bddkAEAAIBMI7QDAKAWUBfO1m13M02bt3JLUBnNWrQ2bdp3pCssAAAAagyhHQAAAAAAABAxhHYAAAAAAABAxBDaAQAAAAAAABFDaAcAAAAAALLSiEcXm04nf2QvagO5hNAOAAAAAAAgoqbN22TO+ctMdw21CaEdAAAAAABABD300goz9MppZtwn37glqE0I7QAAAAAAACJo+drvXAu1EaEdAAAAAAAAEDF520u4dlJ5eXmuZUxRUZFrpdfilcWuBdQuha3zXStzCgoKXMuYFD/2kcd+Ccismtg3RQGfc9RmNf05r+h4ZOuUZ10r+obd+YH5ZO46dy25bm0bm7bNGppTDyo0R+7Txi2tnh6XvepaMXedv1/a1o2aU7/fya5Vprg4Pd9L+RuedK3cpskn7n9+mW1feGJbc93ZhbadK/yvb/6z/e1fVE5x42GuVX35+TX7vUmlHQAAAABk0KxlG8z4r1aZyx781Fzx8GduKYBMe+2DdaUzy6qdSLL7+Wenlfe+LLKTQvQ+6xO7TH91PWz9Go/Oe2xFM9tqsgnvvteNXFD6vF5gJ97tP7nua7cknp5Pt3n38+77z1FL3T3CeffVa9DrO/I3U+11vbbL7phjtw07BqEdAAAAANSQlz9eRnAHZKnRb682F/19tp0UYsOm7+0y/dX1i2+ZbcM2v3OP3dU0blTHtsdMXGP/JvLWR+tdy5ihBzdzrdQoVFPQdtNDC82U6Rvc0hhdv+OpJfZ2BXLJzFy42b4+/RW9tjET19o2dgxCOwAAAACoQQruxn6+3F2rmhl3HR13oWsskHl/emihDbIO7dPE3HppZzPymt3N8CNblwZzT4xdWa6q7bCS+8qy1d8mDc1emhQLx7p3aGgO3qvAnHBIc7v+4wY2t8tF13W5fFh7t6RkvWu+Nef/dVZp0NavZ2Nzw7kd7P20jd7jvUBO90/k/heX29enbsZ6vNajdq/Ojdw9UNMI7QAAAACgms77cZdyQdq7fz7M/PXMveyYdkGvfVq90A5AzVOgpSDr4eu7m1N/1NIMOaCZGXFxR3PftbuXBncKvvzB2BlHtHItY15+L7yLrirlvNDt2INiIZuCMq2/bcv69rroui4K9TwjHllkA0FRQPe/EXvYCj/dT9t41xVd7TaLtl/3T0S3X3FGezsuoB6v9eTaGIHZhtAOAAAAADKgTdMG5uQDCs2Dl/Q3jRvs7JbGzFzKJDhAtlEopiArSCGawi5R8DX6rdW2Lbqtbct6tv3OJ2VdYP1emFDWBfXUH7d0rYop7PO6r+o5FNCF0TZ7FXe6f6Ix6hQ8/uq0du4aooDQDgAAAAAySOHd0L5t3bUYTU7hd8vzM+yMsN5F3Wef/WCxOXbEhNJlmrHW61brv68u3vJHxi2IW67HJ9P36jfj7v/+zPhxt5av32LueXW2fe7gfbVujc+XSlffrxYXmRuemhb3erx1aLlu99N6/ffTfRLRY/331UXbDaSbv2ouyB/mjf/sG9eKGXZ47HGJush6492p223bFrGALxWTp5WF/95zJDJo31g3XfE/zq9nh4auhaggtAMAAACADNuw5TvXSs2spRvM7x7/Mi7c+2TuOlPYIvnYUkftu2tcVZ8eHwzEPAoF/dvVpllDc2D3Fu6asQHe6Xd8YP75yiz73MHXoHVrfD7NiqtgLxEFiT/9x4fm6fcWlgsrdV3LT/r7e/Z+niH7xY/R9+5Xq1yrvHe+XOlaMYP2bGWDUiDd/N1Sw2g8OZnuurp6fty/qWsZ89Qb8f+XFeJ53VuHuq6xqVq+Nv4zqdlfE12KN8UmzpDg4zxeRSCig9AOAAAAADJIVV/vTivrLid9uiSfHVJBWZCq9fYsTB4aKKwa3Cu+e91TE8PHsJo4PX6bTjswfuyqm//3lVm+Lj58SETbG6zSEwVxI575KqXQUvdTkCiaWEMhokfbEbZ+efXTZa4Vc3Qg8APSoTKBlrrI+ml8Oi/Qe+eT+Co8b5w7dU3VGHSVMXNhWTdXzRCrGWwTXTSzrOeT6eGVdv7x8xANhHYAAAAAkAGqcFMIpWq1YGjVrW2+ayWm0Oqu8/crndjijnP2dbckl0qVWliQeIovtNN2+6viVL3n3xZNsBE04av49ek5/vlyfPio4PG5aw+263j4sv3LTdLxj1fKKvaG9onvUvzqJ+W74eo9Dm6nxhEE0i3fTTRRVce4Kjo75t3bZZ8Vb5y74weWVbmmKhgOIvcQ2gEAAABANf37rbnlxlVTl091cQ2rVjtj4G6uldi5P+psK84qK6xKzatg87z+2Yq4IDHYpVTBl0K60w/uYIO1c3/UKW5bdLse47d8ffzrfOb9+O63qi5U8OhVC6or7u9/sqfdVoV5152yp/nXhX3sbXJsv/jQLix8DHaNDVYZIrs99NIK85Prvja9z/rEdvHMFG/m1mRSuU+RC9HCqvKOPrBZ6Qyz3ph3Cu9Ku8YenLz6NkyfnmXh/8u39zLzn+2f0kUzzCI7ENoBAAAAQA0678ddKuzmKj87tKNrVV6wq2uwK+zEr+MDsLAupQrpbjqjl3npukPML4/e3S0tE6wWXLYufvKH4HMO7Fk+UFNw9+5Nh9owT6/X/76o7a/EC+siG+wae+pBFYehyB6qbpsyfYOtKPOPyZZIn+67uFZ5yR6/YcsPrpVcollXZdmab0uDvR4hEzpogonD+sQmg/C6yHrhnUK+isbLC9O4QVmk81WSbUP2IrQDAAAAgBqiwO6aE3u4a4kFu41Wlr+rq2jCCG9GVf0d76taU6Vbql1KNVOsJp244F9TbHVhMjOXxk860a1d5V/TqQd1cK0YfxfZYNdYvQ7/RBrIfv4uqZ/O3Oha8fzjuuXvkrgL66zFiWcUHue6qFbkhQlrXau80W+VhdT+mVr9vOVeF1kFklLRzK+J+Ce4ePrN8pWofqpa7HTyR7ZyUW1kB0I7AAAAAMgQBUnqFqpuphrLLZXATvIbls0AWxXq6hrsvqousf6/nsGB+/mpsu2Gp6aZY0dMsF1+NVOsJp3wh36JpDL5REU0G66fwkdPsGtssLoQ2W/IAWVdSl+cuMbOtOqn6+Nc1ZruF6xW223XsokVxpQ8XtVwQf8ctTSlrq9y//PLym2DaNn9L8YCZVXNnXts/P9bjyaa8LrOKmTzusb6w7dkgpV+/gkuFABeN7JsBmY/bZ8mqhDdb0CvisfURDQQ2gEAAABANamCzpukwX9R188nLz/AdjNNpUtsOgW7vHpdYoNdYxONr3fFw5+Zc+760Dz93sK4iraapPBR4915FAR64/MFu8Yetldr10IuGX5k7N9V1WkX/X22ueyOOWbEo4vNOX+Zac68cYa9Tbz7+flDLQVkJ/8uVmWm8fG88fIUZnUP6c6aiJ5T4ZjWoYva2i5vUogrzmhv/yZyWJ9YQOdV2R3ap4ndzkT8XWBHPrfMPqc/OPzTBR1Lg80nxq4sraRLtH16n5I9H6KF0A4AAAAAcpC6vPonpFB1nLqU+qvk1A03LEy85fkZcVVt4k0Y8atjutlJKhRUJqOZXNMhOBaexsoLdo1VNWNNh6KoGdedXVgavCl4GjNxra148yrs5LiBze39wijU8qrbFNzd9NBCc/Ets+1fBWcK7B75Q3d7e0VuODfWXVvhmNahi9raLgVnul3VdMmceVR8ZWuirrQefxWeXrue86q75rklsWDyvmt3Lw0e9Zq81+jfPlFgN+Liqo+ViZpHaAcAAAAAOSrY9fXPo79yrZjgmHGep99b5FoxCuq8CSM0KUUqs9p2D4xh99m8spClMoLh47vTVpuXpsQHikP2i59pFrlFs50qEPPCO1FIpiq1Wy/tbO66oqtbWp5CrWf/uoe58MS2cRV1amuZAjtNEpEKdXsdec3u9nk9CgQVhj39554Ju8X6aXu87dBrqOgxur+e07/tXrdaj7oFj/2/3qXvkVd5J9o+hZpaB4Fd9snbXsK1k8rLy3MtY4qKyvfhTofFK4tdC6hdCltnfkyBgoKyXx5T/NhHHvslILNqYt8UBXzOUZvV9Oe8ouORrVOeda3oG3bnB+aTuevctdQnmEhElW3+iR1UOaZutYlofDk/Vb6FBWmqSDvp7++5a/FUCffy7wfaLqhBqaxf49wFq93826wJKzT+nUfBm4K/IK2nbclt+3ZqaierCHsdGldP3XTDJHsdUVe/38muVaa4OD3fS/kbnnQtVIe64qqyT+Y/29/+ra4jfzPVjqOnMC1Z4Ij0KG48zLWqLz+/Zr83qbQDAAAAgBylLqMK08IM7tUy5aDrP2/PtwGgaHIKzR5b0Th3msHW30V2+brN9nHeevTXW4+67Crg00QXmqE26Og+iSv7KvM6gB1N49F5E1+ccUTVZo1F7UFoBwAAAAA5LFHX0SGBiSr8/JM/iKoKVbGnCjxNTpHK7LEK0n5/Sk93LUaP89ajv8H1aMbbsEq7A7u3sOPvhQmOeQdE2QMvxEJpdXcNznYLBBHaAQAAAEAO+9mhHctNCqGuqsnGpbvmxJ4JQzLR+q47Zc+49SrYW75+i7sWo/HogvdLRIHdn4f1dtfKOzokfNTr0HMAUTX67dW2i60u6hbrTaBxwfGJP3+Ah9AOAAAAAHKcupD6nXZg8qBLVXIPXtLfjtXnD+8Ukp1+cAfz31/vb8PA4Hpf/2yFa5XR/XR/PS4YBOq6qvo0Zt4Dv+iXtJurutsGBSfaAKImv1EdOyaeLl63WI1lV9Ess4AwEQUQAUxEUTXsl4DMYiIKIPcxEQWyiar4Bv/hHXct5uHL9rddZ7MVE1FEX3UnotAYdlfdNc/O+KpZXTXT7HVnUx1ak5iIAgAAAACADHp03ALXilHVXzYHdsgOCtgU1lV15liNW/f+/fvYx099rA+BHSqF0A4AAAAAEDn+8fEeGbfAPP3eInctpqIuvgCQ7QjtAAAAAACRo8o6zTKry4hnvjIbtnznbolNhBE2xh0A5BJCOwAAAABA5OzbuYlrlff7U3omnbQCAHIBoR0AAAAAIHLyG+5sx63zqK2ZZp+79mBz8gFU2QHIfcweC0QAs8dWDfslILOYPRbIfcweC+xYzB4LZB6zxwIAAAAAAABIG0I7AAAAAAAAIGLoHgtEAN1jq4b9EpBZdI8Fcl/UuscCoHtsrhjx6GJz//PLbHv+s/3t32zkfx0jr9ndDDmgmW1nE7rHAgAAAAAAZJGHXlph/jlqqbsGRA+hHQAAAAAAqFUOvPBzc9NDC82GLT+4JUD0ENoBAAAAAIBaZdnqb10LiC5COwAAAAAAACBiCO0AAAAAAACAiGH2WCACmD22atgvAZnF7LFA7mP2WCB6cn322J9c97WZMn2DufDEtua6swvNax+sM0+9ucou27Dpe3ufQ/s0MUMPam5O/VFLez0RPfblSWvtY73urm1b1jP9eja2jw+b6bTTyR+5Vnlhs6NOm7fJjHxuWehznHFEK3PwXmX7Nb/g7LHvfVlkHnhheenrbNyojjnMvc6KZmRdtuZbM/qt1Wb8Z9/Yx3u0DYP2bWJO/XFL07ZFPbc0XFXeK6lo9li9rov+Prv03+6GczuYc4/d1bajgtljAQAAAAAAKuG6kQvMxbfMNuM++aY09BFdv/rueeayO+a4JeV5jx0zcW3c+HRqa5luS/b4VGhm2aFXTkv4HGfeOMOGWhXRLLW6r/916q+3nXotiSgUO/l3X5s7nloSF9iJrmv5Eb+eau+XSKbeq2wI7LIdlXZABFBpVzXsl4DMotIOyH1U2gHRU1sq7bp3aGhmLtxsK86OH9jCDNo3tn8Y/1mReWLsStuWsOouBUwKmyT4+E9mbrSP94Kk4wY2N3dd0dW2RRVnoqBKdLsqzWSfbruUVqwpsFMgJsHn0HY/+eaq0gDMqxr081eo6fHaHj2XKuPyS67rdb44cU3pdl5xRnvzq9Pa2bYnGIqpKu6Ykm1t17KeKS5Z9rSrUBQ9x33X7l6u8q8675UkqrTLpsAumyvtCO2ACCC0qxr2S0BmEdoBuY/QDoie2hLaiYK7R/7QvVzXTn9gFha6eYFboserO+nP/jzThmsSFih53WTDAjd1iVWFnSQKw4LP8fLtvUyvzo1sW/xhl4Rtgz/40vO88Y/eca/F/14lCsVUxXfTQwttW91d379/H9uWdLxXYaFdKu9vlNA9FgAAAAAAoBIuOL5NuRBJVHGmEEv83TlF4995bjyvQ+jjtezOX3dx1+IfkwqNYedRBVzYuHXB5/A/JkjBY1iopfVq/aLgTuPWeRToeYGdxvhLFIppudYveq9Gv122jky8V9kW2GU7QjsAAAAAAFDjkk000bNDQ9eKp3HhRJVjiSaBEFW9KewSBUwKm1Ll73KaLJDSc2g7xHtMGE1YkcjRB5Z1/f1kZtk63v20rCeR1303Ef/6P5250bXS/16pSy6BXc0itAMAAAAAADXKq6SryHQXEImqzzyH9mnqWol171DWXfXzWWVhVkW86j6NHacupskuBQkqAv2SBWaqdPOCvxm+1zpz4SbXSh5uin/93uMy8V796aGFpYGd9OgYHqwifQjtAAAAAABAjUpUSRfkTXQgxRvL2pniD7sUUGlMuGQXf4WdQryqCAv+/K+7KjLxXgW36U//jo2lh8whtAMAAAAAAChRE8FgNlOX2OFHtrZthZqaqAKZQ2gHAAAAAAAiL3+X1LrUVodmR/Vogof5z/ZP+eJ/bGUUuQo2r5uspNp9OJFMvFeaNENj2F12atvS7dPMsv7qRKQXoR0AAAAAAIg8/9ht4z5Z71qJ+ceF26fbLq5VMS+Q8o8xVx3T5pVtR5AmffDGidMYeh7/GHP+GWHD+EMz73GZeK+8UFHj8N14bgfbFrrJZg6hHQAAAAAAyAr+WU6TVXgpKPPPnqqgKVWH+Z6jonHqDrzwc3v5yXVfuyXlvTBhrWuV95+XV7qWMYP2jT2vDN6vLHR7eVLix8tTb6xyLWP2614WuGXyvdLkGP71/3PUUttGehHaAQAAAACArHDG4a1cK1bhpUq1IC27/B9z3bX4xwQtW73VtcoMPai5a8VmTE0UeF12xxw7eYQubX1VckGJupBq2RNjY6GdHq+upx5VyvXr2di2Fag99NIK2w7S8jETY6Ge1uGfaTbd71XQ1WcWlnWTfXF50opCVA2hHQAAAAAAyAoaN05jzYkqvI749VRz3cgFtiJOF02MoGW6TXRffxjm8cKmdz75xnY/1WO9UEvP4U22oEDuor/PjnsOBWWqrPPCMq3r4pPa2nYiZ944I24damuZNyOrv7up5/Jh7Uu386aHFtrn1HPr8dpmXddy0f1uu6yzbXvS9V4l0qtzI3Ph8W1sW6/jxgcW2DbSJ297CddOKi8vz7WMKSpKXFZZHYtXFrsWULsUts53rcwpKCgrr07xYx957JeAzKqJfVMU8DlHbVbTn/NcPB4B0q24OD3fS/kbnnStaFHQNGX6BltF9r8Re7il5Xn3E03yEKTwyatSS0TB24iLO7pr8VQl54VuHs2M6g+tFGqpSi4ZVbcpLPOPISf+x2q9XrgWpLDNm+AhjKrxrrprng0PE0m0DZ7qvFf+1zHymt1DJ9s48jdlwZ9ey69Oa2fbUVHceJhrVV9+fs1+bxLaARFAaFc17JeAzCK0A3LPp5PHuRaAXHDccce5Vnm5HtqJqsU03pvu54VaCrC0bnVxTTabq6rq7hq9zLw4cU1ptduFJ7Y1151daNsedfkc+dwyOymFF0yJnkNj0J3645ahY8D5wy5tv7b1qTdXlY4d522nKvRUsZaMtnX0W6vN+M++KX1PpKJt8Kvqe5VKaKdgUVWDohDy6T/3rPA11SRCuzThoBm1FaFd1bBfAjKL0A7IPYR2QG7JxtAOqGnZHNoxph0AAAAAAFlo48aNrgUgFxHaAQAAAACQhaZNm2Y2by7rsgkgtxDaAQAAAACQhVasWGHmzp3rrgHINYR2AAAAAABkqQULFpiFC8NnJgWQ3QjtAAAAAADIUt9//72ZN2+eWbNmjVsCIFcQ2gEAAAAAkMWKiorM/PnzzZYtW9wSALmA0A4AAAAAgCy3dOlSG9wByB2EdgAAAAAA5AB1k120aJG7BiDbEdoBAAAAAJADtm3bZoO7devWuSUAshmhHQAAAAAAOeKbb76xwd232/LcEgDZitAOAAAAAIAcsmTJEjNz8c7uGoBslbe9hGsnlZdXltJrZppMWLyy2LWA2qWwdb5rZU5BQYFrGZPixz7y2C8BmVUT+6Yo4HOO2uTTyeNcK5oGDRpkCgsL3bXUFBcXm++//96sXLnSfP3112bjxo3ulsSq8jybNm2yz6P1T5061T5fdfTo0cP07dvXXUuduj9u3rzZbN261axduzbl11wbDR8+3LXKPPHEE66V2EEHHWT/Tpo0yf7NVvV33m76dd9qOrbe5pYAtVNx42GuVX35+TV7fEylHQAAAICspROopk2bmu7du5uhQ4eWBi7p1qhRI/tcbdq0MYcffrgN/naEunXr2u1o2bJl6Wvee++93a2oDgWpJ554ounUqZN9n7Pd1u/ybLXd2mJO+4FsxacXAAAAQE5Q0KLA5cgjj3RLMkeVejXxPBXRa+7duzfBXTXssssu9t9SlY8KZ3PJqm/q2OBu2/duAYCsQmgHAAAAIKeoCq0mAjU9T1TCsp49e9rwCZWnsE7/lrlq7vKdzQzGtwOyEmPaARHAmHZVw34JyCzGtANyTzaOaacx68aMGeOulWndurVp1qyZ6dixY8LARWPPffHFF+5amco8j4Kwrl27mi5duoRWYWlsuWeeecZdS12iMe0qGnNNIWGibZk5c6aZMmWKu4ZUx7QL+/+wePFiM378eHct+zWqHxvfrrAl49uh9mFMOwAAAACoQZoIYsaMGWbs2LHmvffesxM0BHXr1s21qk6TPCj4e/75522wF1S/fn0bHNYUbcsbb7wR+noVZAJhNm3Ns9V232wkAgCyCZV2QARQaVc17JeAzKLSDsg9uVRpF5Soci2s+qyqz6Nw7uCDD3bXyiSq6EumqpV2nh/96Ed2Ugy/VF6Dgr19993XVur5q/X02DVr1pjPP/885dloVfWnbQiuSzTb7rfffmvWr19f4TorO8trqvev6H5htyfy8ccf25A423Vr/53pu/tWsxPZHWoRKu0AAAAAYAdSoBJWCZfO6rMFCxa4VjzNXlvTwirtKqKgTzPfqjtxMGTTiagm8UhlBl51GdYsq5oAI2xdomV6X7x19uvXz92CHWnWkp3NzJILgOxAaAcAAAAgJyxbtsy1yuyIQK0mNGjQwLVSo5AtWJkXpqIZeBXYHXHEEaFBXSJaZ/fu3ZnhNiIU2i1ZXcddAxBlhHYAAAAAcsKqVatcK166xpxLtJ4VK1a4Vs1QcBYWRibqgqoKu8qEbJJoZlx16Q2uS5M2vPnmm7brqS4aY1DdYoPSMcYgqm/D5p1scFe8uWyoGQDRRGgHAAAAICck6r5a2aq0MArK9ttvP3ct3rp161wrsxQaqpvpkCFDbPVakMbWC1L34LAKO3/Qpr9hIVvPnj1dq0yrVq1cK0ZdkjXLqiYG8ejf4ZVXXrG36bJ8+XK7bRMmTHD3iAYvZNR7EaRl3u265MJ4dn7L1tY1MxfXc9cARBWhHQAAAICc1qJFC9eqPC8oS9QlVKGUP7CqLk2OkOiiSTDUzVQz1gYpGAvbDk06ETR//vy4oE1/FbIFgzsFg8Gx6ILPXadO4m6WmhRDl7fffttO1JHO9wnVp2o7jXEHILoI7QAAAADktLCqtCBNxJAsKEvUvbSys8ZmwurVq20wFibYjVYTWEyaNMldizdt2jTXKtO8eXPXiglOgKH35bjjjrPhnqoRkT22bzdmxuKdzfJ1jG8HRBWhHQAAAABUwcyZMxN2ya0JmzZtst1Ox44d65bEU5VgMLDcvHmza5UX9lqCYWVYN1oFngo2TzjhBDvhhcbQY9KJ7FC0aSfz6ezylZsAooHQDgAAAAAqYevWrTYsmzJliltSs1RZp3Honn/++aSVfmFj+SWqKPQuQcHQTmO7Bavt/HR/jaHXu3dvuz7NQtujRw93K6KobfPE/54AdixCOwAAAAA5rbqzuyqk0th1CstUXffMM89krFusN/HBCy+8YINBVdMFaWbXsLHqaoKq8SZPnpw0uPPTtmrGWXWhpfts9HRovc30KPzOXQMQNYR2AAAAAHKCuoNWlUI5/2yh/suoUaPshArqhlpT1XUbN260waCq6bRtQQrDFITtCAruXn75ZRtghoWKYVThp8k8EB3N83+wgV3D+tvdEgBRQ2gHAAAAICe0atXKteKpS2c20yQTYZVtCsI0flxlJAsnE13CKFRUgKlQUV11FeBpvLuKus4GZ6OtrOoEsyizc93tNrBr1eR7twRAFBHaAQAAAMgJwZlOJWzihGyjgOzzzz931+Jp/LgdPenDypUrbYD3yiuv2KrE9957z8yfPz80wGvdurVrVU3YOH2oPAV2ndvQLRaIOkI7AAAAAFlPYZC6jAYpUMoFqhZcvny5uxavZ8+eoePFhVUYqjqvusFZRdR9dtKkSWb69OluSZk6deq4VnKJJq9o0aKFa6GqOu3KOHZAtiC0AwAAAJDVFFgddNBB7loZzfK6o2Z4zQRNAKHXFFS3bl0zYMAAdy1eWKVhoi6qgwYNMieeeKKd8VXvZ1hwpmW6Tffx7ptIvXr1XKvM99+X744Z9pp23XVX1yqjf+e2bdu6a6iKlk1i49jV35lx7IBsQGgHAAAAICtpfDMFSEOGDLHjpQXNmjXLtXKDuslqRtkw6iYbFrLNmTPHtco0bdrUHHPMMaUVdwrDFNgVFhba91EVi506dbKzvmq5R++1luk23ce7r4I7/1hzWp+CwS5durglZcJCxM2bN7tWGb0efxCrLsD6d65fv75bklnqau1VL+q5M12dWBPq1f3BdG//rWlRwDh2QLbI217CtZPKy8tzLWOKiopcK70Wryw/KxJQGxS2znetzCkoKHAtY1L82Ece+yUgs2pi3xQFfM5Rm3w6eZxrRZMXHKXD6tWr7WyvYcKeRxM0aIbYmqKATQFYUKKJH/w0+YRCrSDN5KqJIYIU0CmoqyxVwL322ms2LBSFWEOHDrWVfVWhMe4066y3Po8Cvu7du7trVRP2vg0fPty1yoTdL9G/hd/HH3+c9ROa7NVpq9mrM91iUfsUNx7mWtWnIQZqEpV2AAAAAHJKssAuFyTqJqvKN39lnOfdd9+1gV5lKGBT12J/wKa2njvZDLGJ6DF6bDCwk6+//jr09YTRelK9b6oWL15cpdeUTTTpRI/dCOyAbENoBwAAACAnKHjRrKW5HNiJgq9k3WSDXTl1/zfeeCPlmXQV8Clg04QSQVqm21SZmCqFbInWJ9o+BYQVhXFe8Pftt9+6Jemh5587d667Fi5sjL1s0arJ93Ycu3pVK5AEsAMR2gEAAADIWgqPVFk3c+ZMM2rUKDtraW2QaDZZdV0Nm2hCwdQrr7xiu3nqccHKOwVmCvX0PqqLbaKATXSbuhJ76woL8LR+79/lmWeeSbo+0e3qiqvQ1b9tCuq0fi1X19qK1lNVCg31evQe+KvuvNeRqefNtAb1ttvArnn+D24JgGzCmHZABDCmXdWwXwIyizHtgNwT9THtAKTXPl2+Nb06prcyEcg2jGkHAAAAAAAio4vGsStkHDsgmxHaAQAAAACQQ1q0aGEnnqhbJzd62AC1FaEdAAAAAAA5okGDBqZz586mWWPGsQOyHaEdAAAAAAA5QoFd27Zt3TUA2YzQDgAAAACAHNCxY0cb2gHIDYR2AAAAAABkuVatWtnArk6dOm4JgGxHaAcAAAAAQBZr2LChDezy8/PdEgC5gNAOAAAAAIAs1qVLF7Prrru6awByBaEdAAAAAABZqlOnToxjB+QoQjsAAAAAALJQ48aNzZ577mny8vLcEgC5hNAOAAAAAIAs1LdvXyaeAHJY3vYSrp2UP7kvKipyrfRavLLYtYDapbB15geMLSgocC1jUvzYRx77JSCzamLfFAV8zlGb1fTnPBePR4B0Ky5O7Xtp0aJFZrfddnPXysvf8KRrAbVbceNhrlV9NT3ZC5V2AAAAAABkmWSBHYDcQGgHAAAAAAAARAyhHQAAAAAAABAxhHYAAAAAAABAxBDaAQAAAAAAABFDaAcAAAAAAABEDKEdAAAAAAAAEDGEdgAAAAAAAEDEENoBAAAAAAAAEUNoBwAAAAAAAEQMoR0AAAAAAAAQMYR2AAAAAAAAQMQQ2gEAAAAAAAARQ2gHAAAAAAAARAyhHQAAAAAAABAxhHYAAAAAAABAxBDaAQAAAAAAABFDaAcAAAAAAABEDKEdAAAAAAAAEDGEdgAAAAAAAEDEENoBAAAAAAAAEUNoBwAAAAAAAEQMoR0AAAAAAAAQMYR2AAAAAAAAQMQQ2gEAAAAAAAARQ2gHAAAAAAAARAyhHQAAAAAAABAxhHYAAAAAAABAxBDaAQAAAAAAABFDaAcAAAAAAABEDKEdAAAAAAAAEDGEdgAAAAAAAEDEENoBAAAAAAAAEUNoBwAAAAAAAEQMoR0AAAAAAAAQMYR2AAAAAAAAQMQQ2gEAAAAAAAARQ2gHAAAAAAAARAyhHQAAAAAAABAxhHYAAAAAAABAxBDaAQAAAAAAABFDaAcAAAAAAABEDKEdAAAAAAAAEDGEdgAAAAAAAEDEENoBAAAAAAAAEUNoBwAAAAAAAEQMoR0AAAAAAAAQMYR2AAAAAAAAQMTkbS/h2knl5eW5ljFFRUWulV6LVxa7FlC7FLbOd63MKSgocC1jUvzYR15N7JcA5D6OP1Cb1cQxiF8uHo8A6VZcnJ7vpfwNT7oWULsVNx7mWtWXn1+z35tU2gEAAAAAAAARQ2gHAAAAAAAARAyhHQAAAAAAABAxhHYAAAAAAABAxBDaAQAAAAAAABFDaAcAAAAAAABEDKEdAAAAAAAAEDGEdgAAAAAAAEDEENoBAAAAAAAAEUNoB2TQD99/bxYvmG2++3arWwIAyBXfbt1iFs6dYb7/fptbAgAAAKQPoR2QId+sX2O++uJDs2r5YrN9+3a3FACQS9asWma+/vxDs37tKrcEAAAASA9COyDNNm4oMgvnzTBzZ3xZWmFHFQYA5K7vvvvWzJs1zSyYO91sKP7GLQUAAACqh9AOSBMFcyuXLbJdpdasXOaWAgBqi7WrltvvgBXLFppt275zSwEAAICqIbQD0qBo/Vp7orZk4RyzZfNGtxQAUNts3bLJLF04134nfLNujVsKAAAAVB6hHVANGoR82eJ5tjss4xkBADzfrFttvxuWLpprtm7Z7JYCAAAAqcvbnuII+Xl5ea5lTFFRkWul1+KVxa4FRN+GovX2hCyVk7FdGheYvJ0SZ+T1d67jWpkzceJE1zLm0EMPda3sNm7cONcyZuDAga4FAJWz9bvvXatytv/wgx3HtCL16jcwu3XubgqaNHdLgOgobJ3vWjWjoKDAtUo+Q0zUBYQqLk7PeXH+hiddC6jdihsPc63qy8+v2e9NQjugkjZv2mDHrNOMgT+UnLABAFCRvLydTIvWbUyLVm1No11q9mAPSIbQDogeQjsgvbI5tKN7LJAiVVSsXrHEjlO0quQvgR0AIFXbt+s7ZCnfIQAAAEgZoR2QgmLXFXbR/Flm00YqQgEAVaNq7cUl3yUL504v+W5Z55YCAAAA5RHaAUl89923ZvmSBfbkau3qFW4pAADVs27NSlt1p++Y77791i0FAAAAyhDaAQloNlidUGl2WM0SCwBAOpXNQD6dGcgBAABQDqEdELBl8yazZOEc2x22aP0atxQAgMwoWr/W/kik7x59BwEAAABCaAf4aEZYdYVduWyR+X7bNrcUAIDM+v77bfa7R99B+i4CAAAACO0AAAAAAACAiCG0A3xatGprOnTpaVq33c3UqVPXLQUAILP0naPvng5detjvIgAAAIDQDgho0LCRad+hqz1xKmja3C0FACAzCpo0t985+u5p0HAXtxQAAAC1HaEdkEDT5q1Mh849TNvCzqZe/QZuKQAA6VGvXv2S75hONrDTdw4AAADgR2gHJLFzyQlVm/YdbXjXrEVrtxQAgOrRd4rCujbtO9nvGgAAACCI0A5IQX6TZvbkqrDj7qZho8ZuKQAAlaPur+1Lvkt269yj5LuFIRgAAACQGKEdkKKddqpjWrUptOFdy9btTF5enrsFAICKtWityY56mNYl3yV16tRxSwEAAIBwedtLuHZS/oCiqKjItdJr8cpi1wKi75v1a8zi+bPMt1u3uCWJ7dK4wOTtlDgjr79z5k/eJk6c6FrGHHrooa6V3caNG+daxgwcONC1AKBytn73vWtVzvYffjAbN1R8TKTur7t16maaNGvplgDRUdg637VqRkFBgWuVfIZSOw0Bap3i4vScF+dveNK1gNqtuPEw16q+/Pya/d4ktAOqYeuWzWbNqmVmzcplZtu279zS8nru1S9pt9qaOGDOxYPkmtgvAch9VT3+0I820z77wF0rr06dura6rkWrtnZmciCKCO2A6CG0A9Irm0M7uscC1VC/QUPTbrcutrtTk2Yt3FIAQG1X0LS5/W5o36ErgR0AAACqhNAOSAN1edIMswrwFOQBAGqnevUbmLaFne13QtPmrdxSAAAAoPII7YA0qbtzPbNruw72RK15y13dUgBAbdGsRWv7HdCmfUc7jh0AAABQHYR2QJo1LmhqOnbdw17q1t3ZLtO4RgCA3KR9vLrCdtp9T5PfpJlbCgAAAFQPoR2QIaq222Of/U3zVm3cEgBArlEXWO3rNdkEAAAAkE6EdkAGqdKuY5eedowjAEBu0b69c7deZued67klAAAAQPoQ2gEAAAAAAAARQ2gHAAAAAAAARAyhHQAAAAAAABAxhHYAAAAAAABAxBDaAQAAAAAAABFDaAcAAAAAAABEDKEdAAAAAAAAEDGEdgAAAAAAAEDEENoBAAAAAAAAEUNoBwAAAAAAAEQMoR0AAAAAAAAQMYR2AAAAAAAAQMQQ2gEAAAAAAAARQ2gHAAAAAAAARAyhHQAAAAAAABAxhHYAAAAAAABAxBDaAQAAAAAAABFDaAcAAAAAAABEDKEdAAAAAAAAEDGEdgAAAAAAAEDEENoBAAAAAAAAEUNoBwAAAAAAAEQMoR0AAAAAAAAQMYR2AAAAAAAAQMTkbS/h2knl5eW5ljFFRUWuBSBbFBQUuJYxKX7sI4/9EgAA2SUXj0eAdCsuLnYtAFGTn5/vWjWDSjsAAAAAAAAgYgjtAAAAAAAAgIghtAMAAAAAAAAihtAOAAAAAAAAiBhCOwAAAAAAACBiCO0AAAAAAACAiCG0AwAAAAAAACKG0A4AAAAAAACIGEI7AAAAAAAAIGII7QAAAAAAAICIIbQDAAAAAAAAIobQDgAAAAAAAIgYQjsAAAAAAAAgYgjtAAAAAAAAgIghtAMAAAAAAAAihtAOAAAAAAAAiBhCOwAAAAAAACBiCO0AAAAAAACAiCG0AwAAAAAAACKG0A4AAAAAAACIGEI7AAAAAAAAIGII7QAAAAAAAICIIbQDAAAAAAAAIobQDgAAAAAAAIgYQjsAAAAAAAAgYgjtAAAAAAAAgIjJ217CtZPKy8tzLQDZLsWPfeSxXwIAIHvlyvEIkG7FxcWuBSBq8vPzXatmENoBtRChHQAA2NEI7QAASC7l7rHnnnuuawHIZrn0WWa/BABAduI7HACAiqVcaQcAAAAAAACgZjARBQAAAAAAABAxhHYAAAAAAABAxBDaAQAAAAAAABFDaAcAAAAAAABEDKEdAAAAAAAAEDGEdgAAAAAAAEDEENoBAAAAAAAAEUNoBwAAAAAAAEQMoR0AAAAAAAAQMYR2AAAAAAAAQMQQ2gEAAAAAAAARQ2gHAAAAAAAARAyhHQAAAAAAABAxhHYAAAAAAABApBjz/9UAdGV1iSE7AAAAAElFTkSuQmCC", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": { + "image/png": { + "width": 800 + } + }, + "output_type": "execute_result" + } + ], "source": [ - "## Step 1: Install the library\n", - "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `lomas-client` on her local developping environment. \n", - "\n", - "It can be installed via the pip command:" + "from IPython.display import Image\n", + "Image(filename=\"images/image_demo_client.png\", width=800)" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "dc563050-fcc0-4c11-9e63-46eaefa63ce7", + "cell_type": "markdown", + "id": "5b73135c", "metadata": {}, - "outputs": [], "source": [ - "# !pip install lomas_client" + "🐧🐧🐧\n", + "In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins dimensions.\n", + "\n", + "Therefore, the powerful queen Icerbegina 👑 had the data collected. But in order to get the penguins to agree to participate she promised them that no one would be able to look at the data and that no one would be able to guess the bill width of any specific penguin (which is very sensitive information) from the data. Nobody! Not even the researchers. The queen hence stored the data on the Secure Data Disclosure Server and only gave a small budget to Dr. Antarctica.\n", + "\n", + "This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library `fso-sdd-demo`. \n", + "🐧🐧🐧" ] }, { "cell_type": "markdown", - "id": "c5df0c8f-ca9c-4af1-8c60-fb1d30d6283d", + "id": "01ae30d2", "metadata": {}, "source": [ - "Or using a local version of the client" + "## Step 1: Install the library\n", + "To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library `fso-sdd-demo` on her local developping environment. \n", + "\n", + "It can be installed via the pip command:" ] }, { @@ -58,7 +81,8 @@ "source": [ "import sys\n", "import os\n", - "sys.path.append(os.path.abspath(os.path.join('..')))" + "sys.path.append(os.path.abspath(os.path.join('..')))\n", + "# !pip install lomas_client" ] }, { @@ -168,6 +192,169 @@ "penguin_metadata" ] }, + { + "cell_type": "markdown", + "id": "d338ed96", + "metadata": {}, + "source": [ + "Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) with their associated categories (i.e. the species column has 3 possibilities: 'Adelie', 'Chinstrap', 'Gentoo') and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds (i.e. the body mass of penguin ranges from 2000 to 7000 gramms). She also knows based on the field `max_ids: 1` that each penguin can only be once in the dataset and on the field `row_privacy: True` that each row represents a single penguin. " + ] + }, + { + "cell_type": "markdown", + "id": "5a3c899d", + "metadata": {}, + "source": [ + "### Get a dummy dataset\n", + "\n", + "Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset. \n", + "\n", + "Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets.\n", + "Getting a dummy dataset does not affect the budget as there is no differential privacy here. It is not a synthetic dataset and all that could be learn here is already present in the public metadata (it is created randomly on the fly based on the metadata).\n", + "\n", + "Dr. Antartica first create a dummy dataset with 200 rows and chooses a seed of 0." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "01f4365a", + "metadata": {}, + "outputs": [], + "source": [ + "NB_ROWS = 200\n", + "SEED = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3f553b29", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(200, 7)\n" + ] + }, + { + "data": { + "text/html": [ + "
              \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
              speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
              0GentooBiscoe49.20847316.117959190.1259502873.291927FEMALE
              1GentooTorgersen55.03162819.963435242.9291423639.940005FEMALE
              2ChinstrapTorgersen51.09671816.777518159.9614935401.743330MALE
              3AdelieBiscoe49.07091114.796037244.5301532316.038092MALE
              4ChinstrapBiscoe44.82791813.246787236.9488535036.246870FEMALE
              \n", + "
              " + ], + "text/plain": [ + " species island bill_length_mm bill_depth_mm flipper_length_mm \\\n", + "0 Gentoo Biscoe 49.208473 16.117959 190.125950 \n", + "1 Gentoo Torgersen 55.031628 19.963435 242.929142 \n", + "2 Chinstrap Torgersen 51.096718 16.777518 159.961493 \n", + "3 Adelie Biscoe 49.070911 14.796037 244.530153 \n", + "4 Chinstrap Biscoe 44.827918 13.246787 236.948853 \n", + "\n", + " body_mass_g sex \n", + "0 2873.291927 FEMALE \n", + "1 3639.940005 FEMALE \n", + "2 5401.743330 MALE \n", + "3 2316.038092 MALE \n", + "4 5036.246870 FEMALE " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_dummy = client.get_dummy_dataset(\n", + " nb_rows = NB_ROWS, \n", + " seed = SEED\n", + ")\n", + "\n", + "print(df_dummy.shape)\n", + "df_dummy.head()" + ] + }, { "cell_type": "markdown", "id": "9e7ca7ae-bf17-40c8-aa75-2d72fcdd3088", diff --git a/html/v0.3.1/en/_sources/notebooks/local_admin_notebook.ipynb.txt b/html/v0.3.2/en/_sources/notebooks/local_admin_notebook.ipynb.txt similarity index 99% rename from html/v0.3.1/en/_sources/notebooks/local_admin_notebook.ipynb.txt rename to html/v0.3.2/en/_sources/notebooks/local_admin_notebook.ipynb.txt index 2e5beed9..0ecf4ab5 100644 --- a/html/v0.3.1/en/_sources/notebooks/local_admin_notebook.ipynb.txt +++ b/html/v0.3.2/en/_sources/notebooks/local_admin_notebook.ipynb.txt @@ -142,7 +142,7 @@ "dp_queries\n", "mongodb_admin.py\n", "mongodb_admin_cli.py\n", - "data_connector\n", + "private_dataset\n", "tests\n", "utils\n", "uvicorn_serve.py\n", diff --git a/html/v0.3.1/en/_sources/notebooks/s3_example_notebook.ipynb.txt b/html/v0.3.2/en/_sources/notebooks/s3_example_notebook.ipynb.txt similarity index 100% rename from html/v0.3.1/en/_sources/notebooks/s3_example_notebook.ipynb.txt rename to html/v0.3.2/en/_sources/notebooks/s3_example_notebook.ipynb.txt diff --git a/html/v0.3.1/en/_sources/poster.rst.txt b/html/v0.3.2/en/_sources/poster.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/poster.rst.txt rename to html/v0.3.2/en/_sources/poster.rst.txt diff --git a/html/v0.3.1/en/_sources/server_administration.rst.txt b/html/v0.3.2/en/_sources/server_administration.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/server_administration.rst.txt rename to html/v0.3.2/en/_sources/server_administration.rst.txt diff --git a/html/v0.3.1/en/_sources/server_api.rst.txt b/html/v0.3.2/en/_sources/server_api.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/server_api.rst.txt rename to html/v0.3.2/en/_sources/server_api.rst.txt diff --git a/html/v0.3.1/en/_sources/server_cli.rst.txt b/html/v0.3.2/en/_sources/server_cli.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/server_cli.rst.txt rename to html/v0.3.2/en/_sources/server_cli.rst.txt diff --git a/html/v0.3.1/en/_sources/server_dashboard.rst.txt b/html/v0.3.2/en/_sources/server_dashboard.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/server_dashboard.rst.txt rename to html/v0.3.2/en/_sources/server_dashboard.rst.txt diff --git a/html/v0.3.1/en/_sources/server_deployment.rst.txt b/html/v0.3.2/en/_sources/server_deployment.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/server_deployment.rst.txt rename to html/v0.3.2/en/_sources/server_deployment.rst.txt diff --git a/html/v0.3.1/en/_sources/server_kubernetes.rst.txt b/html/v0.3.2/en/_sources/server_kubernetes.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/server_kubernetes.rst.txt rename to html/v0.3.2/en/_sources/server_kubernetes.rst.txt diff --git a/html/v0.3.1/en/_sources/server_local.rst.txt b/html/v0.3.2/en/_sources/server_local.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/server_local.rst.txt rename to html/v0.3.2/en/_sources/server_local.rst.txt diff --git a/html/v0.3.1/en/_sources/server_modules.rst.txt b/html/v0.3.2/en/_sources/server_modules.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/server_modules.rst.txt rename to html/v0.3.2/en/_sources/server_modules.rst.txt diff --git a/html/v0.3.1/en/_sources/server_onyxia.rst.txt b/html/v0.3.2/en/_sources/server_onyxia.rst.txt similarity index 100% rename from html/v0.3.1/en/_sources/server_onyxia.rst.txt rename to html/v0.3.2/en/_sources/server_onyxia.rst.txt diff --git a/html/v0.3.1/en/_static/_sphinx_javascript_frameworks_compat.js b/html/v0.3.2/en/_static/_sphinx_javascript_frameworks_compat.js similarity index 100% rename from html/v0.3.1/en/_static/_sphinx_javascript_frameworks_compat.js rename to html/v0.3.2/en/_static/_sphinx_javascript_frameworks_compat.js diff --git a/html/v0.3.1/en/_static/basic.css b/html/v0.3.2/en/_static/basic.css similarity index 100% rename from html/v0.3.1/en/_static/basic.css rename to html/v0.3.2/en/_static/basic.css diff --git a/html/v0.3.1/en/_static/css/badge_only.css b/html/v0.3.2/en/_static/css/badge_only.css similarity index 100% rename from html/v0.3.1/en/_static/css/badge_only.css rename to html/v0.3.2/en/_static/css/badge_only.css diff --git a/html/v0.3.1/en/_static/css/fonts/Roboto-Slab-Bold.woff b/html/v0.3.2/en/_static/css/fonts/Roboto-Slab-Bold.woff similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/Roboto-Slab-Bold.woff rename to html/v0.3.2/en/_static/css/fonts/Roboto-Slab-Bold.woff diff --git a/html/v0.3.1/en/_static/css/fonts/Roboto-Slab-Bold.woff2 b/html/v0.3.2/en/_static/css/fonts/Roboto-Slab-Bold.woff2 similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/Roboto-Slab-Bold.woff2 rename to html/v0.3.2/en/_static/css/fonts/Roboto-Slab-Bold.woff2 diff --git a/html/v0.3.1/en/_static/css/fonts/Roboto-Slab-Regular.woff b/html/v0.3.2/en/_static/css/fonts/Roboto-Slab-Regular.woff similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/Roboto-Slab-Regular.woff rename to html/v0.3.2/en/_static/css/fonts/Roboto-Slab-Regular.woff diff --git a/html/v0.3.1/en/_static/css/fonts/Roboto-Slab-Regular.woff2 b/html/v0.3.2/en/_static/css/fonts/Roboto-Slab-Regular.woff2 similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/Roboto-Slab-Regular.woff2 rename to html/v0.3.2/en/_static/css/fonts/Roboto-Slab-Regular.woff2 diff --git a/html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.eot b/html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.eot similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.eot rename to html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.eot diff --git a/html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.svg b/html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.svg similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.svg rename to html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.svg diff --git a/html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.ttf b/html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.ttf similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.ttf rename to html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.ttf diff --git a/html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.woff b/html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.woff similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.woff rename to html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.woff diff --git a/html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.woff2 b/html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.woff2 similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/fontawesome-webfont.woff2 rename to html/v0.3.2/en/_static/css/fonts/fontawesome-webfont.woff2 diff --git a/html/v0.3.1/en/_static/css/fonts/lato-bold-italic.woff b/html/v0.3.2/en/_static/css/fonts/lato-bold-italic.woff similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/lato-bold-italic.woff rename to html/v0.3.2/en/_static/css/fonts/lato-bold-italic.woff diff --git a/html/v0.3.1/en/_static/css/fonts/lato-bold-italic.woff2 b/html/v0.3.2/en/_static/css/fonts/lato-bold-italic.woff2 similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/lato-bold-italic.woff2 rename to html/v0.3.2/en/_static/css/fonts/lato-bold-italic.woff2 diff --git a/html/v0.3.1/en/_static/css/fonts/lato-bold.woff b/html/v0.3.2/en/_static/css/fonts/lato-bold.woff similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/lato-bold.woff rename to html/v0.3.2/en/_static/css/fonts/lato-bold.woff diff --git a/html/v0.3.1/en/_static/css/fonts/lato-bold.woff2 b/html/v0.3.2/en/_static/css/fonts/lato-bold.woff2 similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/lato-bold.woff2 rename to html/v0.3.2/en/_static/css/fonts/lato-bold.woff2 diff --git a/html/v0.3.1/en/_static/css/fonts/lato-normal-italic.woff b/html/v0.3.2/en/_static/css/fonts/lato-normal-italic.woff similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/lato-normal-italic.woff rename to html/v0.3.2/en/_static/css/fonts/lato-normal-italic.woff diff --git a/html/v0.3.1/en/_static/css/fonts/lato-normal-italic.woff2 b/html/v0.3.2/en/_static/css/fonts/lato-normal-italic.woff2 similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/lato-normal-italic.woff2 rename to html/v0.3.2/en/_static/css/fonts/lato-normal-italic.woff2 diff --git a/html/v0.3.1/en/_static/css/fonts/lato-normal.woff b/html/v0.3.2/en/_static/css/fonts/lato-normal.woff similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/lato-normal.woff rename to html/v0.3.2/en/_static/css/fonts/lato-normal.woff diff --git a/html/v0.3.1/en/_static/css/fonts/lato-normal.woff2 b/html/v0.3.2/en/_static/css/fonts/lato-normal.woff2 similarity index 100% rename from html/v0.3.1/en/_static/css/fonts/lato-normal.woff2 rename to html/v0.3.2/en/_static/css/fonts/lato-normal.woff2 diff --git a/html/v0.3.1/en/_static/css/theme.css b/html/v0.3.2/en/_static/css/theme.css similarity index 100% rename from html/v0.3.1/en/_static/css/theme.css rename to html/v0.3.2/en/_static/css/theme.css diff --git a/html/v0.3.1/en/_static/doctools.js b/html/v0.3.2/en/_static/doctools.js similarity index 100% rename from html/v0.3.1/en/_static/doctools.js rename to html/v0.3.2/en/_static/doctools.js diff --git a/html/v0.3.1/en/_static/documentation_options.js b/html/v0.3.2/en/_static/documentation_options.js similarity index 100% rename from html/v0.3.1/en/_static/documentation_options.js rename to html/v0.3.2/en/_static/documentation_options.js diff --git a/html/v0.3.1/en/_static/file.png b/html/v0.3.2/en/_static/file.png similarity index 100% rename from html/v0.3.1/en/_static/file.png rename to html/v0.3.2/en/_static/file.png diff --git a/html/v0.3.1/en/_static/jquery.js b/html/v0.3.2/en/_static/jquery.js similarity index 100% rename from html/v0.3.1/en/_static/jquery.js rename to html/v0.3.2/en/_static/jquery.js diff --git a/html/v0.3.1/en/_static/js/badge_only.js b/html/v0.3.2/en/_static/js/badge_only.js similarity index 100% rename from html/v0.3.1/en/_static/js/badge_only.js rename to html/v0.3.2/en/_static/js/badge_only.js diff --git a/html/v0.3.1/en/_static/js/html5shiv-printshiv.min.js b/html/v0.3.2/en/_static/js/html5shiv-printshiv.min.js similarity index 100% rename from html/v0.3.1/en/_static/js/html5shiv-printshiv.min.js rename to html/v0.3.2/en/_static/js/html5shiv-printshiv.min.js diff --git a/html/v0.3.1/en/_static/js/html5shiv.min.js b/html/v0.3.2/en/_static/js/html5shiv.min.js similarity index 100% rename from html/v0.3.1/en/_static/js/html5shiv.min.js rename to html/v0.3.2/en/_static/js/html5shiv.min.js diff --git a/html/v0.3.1/en/_static/js/theme.js b/html/v0.3.2/en/_static/js/theme.js similarity index 100% rename from html/v0.3.1/en/_static/js/theme.js rename to html/v0.3.2/en/_static/js/theme.js diff --git a/html/v0.3.1/en/_static/language_data.js b/html/v0.3.2/en/_static/language_data.js similarity index 100% rename from html/v0.3.1/en/_static/language_data.js rename to html/v0.3.2/en/_static/language_data.js diff --git a/html/v0.3.1/en/_static/logo.png b/html/v0.3.2/en/_static/logo.png similarity index 100% rename from html/v0.3.1/en/_static/logo.png rename to html/v0.3.2/en/_static/logo.png diff --git a/html/v0.3.1/en/_static/minus.png b/html/v0.3.2/en/_static/minus.png similarity index 100% rename from html/v0.3.1/en/_static/minus.png rename to html/v0.3.2/en/_static/minus.png diff --git a/html/v0.3.1/en/_static/nbsphinx-broken-thumbnail.svg b/html/v0.3.2/en/_static/nbsphinx-broken-thumbnail.svg similarity index 100% rename from html/v0.3.1/en/_static/nbsphinx-broken-thumbnail.svg rename to html/v0.3.2/en/_static/nbsphinx-broken-thumbnail.svg diff --git a/html/v0.3.1/en/_static/nbsphinx-code-cells.css b/html/v0.3.2/en/_static/nbsphinx-code-cells.css similarity index 100% rename from html/v0.3.1/en/_static/nbsphinx-code-cells.css rename to html/v0.3.2/en/_static/nbsphinx-code-cells.css diff --git a/html/v0.3.1/en/_static/nbsphinx-gallery.css b/html/v0.3.2/en/_static/nbsphinx-gallery.css similarity index 100% rename from html/v0.3.1/en/_static/nbsphinx-gallery.css rename to html/v0.3.2/en/_static/nbsphinx-gallery.css diff --git a/html/v0.3.1/en/_static/nbsphinx-no-thumbnail.svg b/html/v0.3.2/en/_static/nbsphinx-no-thumbnail.svg similarity index 100% rename from html/v0.3.1/en/_static/nbsphinx-no-thumbnail.svg rename to html/v0.3.2/en/_static/nbsphinx-no-thumbnail.svg diff --git a/html/v0.3.1/en/_static/plus.png b/html/v0.3.2/en/_static/plus.png similarity index 100% rename from html/v0.3.1/en/_static/plus.png rename to html/v0.3.2/en/_static/plus.png diff --git a/html/v0.3.1/en/_static/poster.pdf b/html/v0.3.2/en/_static/poster.pdf similarity index 100% rename from html/v0.3.1/en/_static/poster.pdf rename to html/v0.3.2/en/_static/poster.pdf diff --git a/html/v0.3.1/en/_static/pygments.css b/html/v0.3.2/en/_static/pygments.css similarity index 100% rename from html/v0.3.1/en/_static/pygments.css rename to html/v0.3.2/en/_static/pygments.css diff --git a/html/v0.3.1/en/_static/searchtools.js b/html/v0.3.2/en/_static/searchtools.js similarity index 100% rename from html/v0.3.1/en/_static/searchtools.js rename to html/v0.3.2/en/_static/searchtools.js diff --git a/html/v0.3.1/en/_static/sphinx_highlight.js b/html/v0.3.2/en/_static/sphinx_highlight.js similarity index 100% rename from html/v0.3.1/en/_static/sphinx_highlight.js rename to html/v0.3.2/en/_static/sphinx_highlight.js diff --git a/html/v0.3.1/en/api.html b/html/v0.3.2/en/api.html similarity index 98% rename from html/v0.3.1/en/api.html rename to html/v0.3.2/en/api.html index 359b4ed0..f76fa041 100644 --- a/html/v0.3.1/en/api.html +++ b/html/v0.3.2/en/api.html @@ -37,7 +37,7 @@
              - v0.3.1 + v0.3.2
              @@ -144,7 +144,7 @@

              API Documentation - Version: v0.3.1 + Version: v0.3.2
              @@ -152,7 +152,7 @@

              API Documentationen +
              en
              @@ -174,7 +174,7 @@

              API Documentationv0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/client_api.html b/html/v0.3.2/en/client_api.html similarity index 98% rename from html/v0.3.1/en/client_api.html rename to html/v0.3.2/en/client_api.html index 3229e38c..64f47235 100644 --- a/html/v0.3.1/en/client_api.html +++ b/html/v0.3.2/en/client_api.html @@ -37,7 +37,7 @@
              - v0.3.1 + v0.3.2
              @@ -144,7 +144,7 @@

              Client API - Version: v0.3.1 + Version: v0.3.2
              @@ -152,7 +152,7 @@

              Client APIen +
              en
              @@ -174,7 +174,7 @@

              Client APIv0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/client_errors.html b/html/v0.3.2/en/client_errors.html similarity index 98% rename from html/v0.3.1/en/client_errors.html rename to html/v0.3.2/en/client_errors.html index 0371d4d0..87a4d925 100644 --- a/html/v0.3.1/en/client_errors.html +++ b/html/v0.3.2/en/client_errors.html @@ -37,7 +37,7 @@
              - v0.3.1 + v0.3.2
              @@ -186,7 +186,7 @@

              Errors<

              - Version: v0.3.1 + Version: v0.3.2
              @@ -194,7 +194,7 @@

              Errors<
              Languages
              -
              en
              +
              en
              @@ -216,7 +216,7 @@

              Errors<
              v0.3.0
              -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/client_examples.html b/html/v0.3.2/en/client_examples.html similarity index 95% rename from html/v0.3.1/en/client_examples.html rename to html/v0.3.2/en/client_examples.html index 119cc54e..8cfbb633 100644 --- a/html/v0.3.1/en/client_examples.html +++ b/html/v0.3.2/en/client_examples.html @@ -39,7 +39,7 @@
              - v0.3.1 + v0.3.2

          • Secure Data Disclosure: Client side
          • -
          • Lomas Client Side: Using DiffPrivlib
  • - Version: v0.3.1 + Version: v0.3.2
    @@ -197,7 +197,7 @@

    Examples
    Languages
    -
    en
    +
    en
    @@ -219,7 +219,7 @@

    Examples
    v0.3.0
    -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/client_modules.html b/html/v0.3.2/en/client_modules.html similarity index 99% rename from html/v0.3.1/en/client_modules.html rename to html/v0.3.2/en/client_modules.html index c730728c..c3d4b758 100644 --- a/html/v0.3.1/en/client_modules.html +++ b/html/v0.3.2/en/client_modules.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -195,7 +195,7 @@

    lomas_client - Version: v0.3.1 + Version: v0.3.2
    @@ -203,7 +203,7 @@

    lomas_clienten +
    en
    @@ -225,7 +225,7 @@

    lomas_clientv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/client_quickstart.html b/html/v0.3.2/en/client_quickstart.html similarity index 98% rename from html/v0.3.1/en/client_quickstart.html rename to html/v0.3.2/en/client_quickstart.html index f7e8691c..940867f4 100644 --- a/html/v0.3.1/en/client_quickstart.html +++ b/html/v0.3.2/en/client_quickstart.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -177,7 +177,7 @@

    First steps - Version: v0.3.1 + Version: v0.3.2
    @@ -185,7 +185,7 @@

    First stepsen +
    en
    @@ -207,7 +207,7 @@

    First stepsv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/genindex.html b/html/v0.3.2/en/genindex.html similarity index 99% rename from html/v0.3.1/en/genindex.html rename to html/v0.3.2/en/genindex.html index e7879ab2..1576aa49 100644 --- a/html/v0.3.1/en/genindex.html +++ b/html/v0.3.2/en/genindex.html @@ -34,7 +34,7 @@
    - v0.3.1 + v0.3.2
    @@ -1160,7 +1160,7 @@

    Z

    - Version: v0.3.1 + Version: v0.3.2
    @@ -1168,7 +1168,7 @@

    Z

    Languages
    -
    en
    +
    en
    @@ -1190,7 +1190,7 @@

    Z

    v0.3.0
    -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/index.html b/html/v0.3.2/en/index.html similarity index 99% rename from html/v0.3.1/en/index.html rename to html/v0.3.2/en/index.html index 4a7df0a5..e7c04a9e 100644 --- a/html/v0.3.1/en/index.html +++ b/html/v0.3.2/en/index.html @@ -38,7 +38,7 @@
    - v0.3.1 + v0.3.2
    @@ -210,7 +210,7 @@

    Indices and tables - Version: v0.3.1 + Version: v0.3.2
    @@ -218,7 +218,7 @@

    Indices and tablesen +
    en
    @@ -240,7 +240,7 @@

    Indices and tablesv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_client.html b/html/v0.3.2/en/lomas_client.html similarity index 99% rename from html/v0.3.1/en/lomas_client.html rename to html/v0.3.2/en/lomas_client.html index cb7c4c6d..cdaecdcf 100644 --- a/html/v0.3.1/en/lomas_client.html +++ b/html/v0.3.2/en/lomas_client.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -711,7 +711,7 @@

    Submodules - Version: v0.3.1 + Version: v0.3.2
    @@ -719,7 +719,7 @@

    Submodulesen +
    en
    @@ -741,7 +741,7 @@

    Submodulesv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.admin_database.html b/html/v0.3.2/en/lomas_server.admin_database.html similarity index 98% rename from html/v0.3.1/en/lomas_server.admin_database.html rename to html/v0.3.2/en/lomas_server.admin_database.html index 28c67f14..cf023911 100644 --- a/html/v0.3.1/en/lomas_server.admin_database.html +++ b/html/v0.3.2/en/lomas_server.admin_database.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -163,7 +163,7 @@

    lomas_server.admin_database.yaml_database module - Version: v0.3.1 + Version: v0.3.2
    @@ -171,7 +171,7 @@

    lomas_server.admin_database.yaml_database moduleen +
    en
    @@ -193,7 +193,7 @@

    lomas_server.admin_database.yaml_database modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.administration.html b/html/v0.3.2/en/lomas_server.administration.html similarity index 98% rename from html/v0.3.1/en/lomas_server.administration.html rename to html/v0.3.2/en/lomas_server.administration.html index 16662e69..ec25c7ed 100644 --- a/html/v0.3.1/en/lomas_server.administration.html +++ b/html/v0.3.2/en/lomas_server.administration.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -145,7 +145,7 @@

    lomas_server.administration package - Version: v0.3.1 + Version: v0.3.2
    @@ -153,7 +153,7 @@

    lomas_server.administration packageen +
    en
    @@ -175,7 +175,7 @@

    lomas_server.administration packagev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.data_connector.html b/html/v0.3.2/en/lomas_server.data_connector.html similarity index 98% rename from html/v0.3.1/en/lomas_server.data_connector.html rename to html/v0.3.2/en/lomas_server.data_connector.html index c7f69503..15e3a0c6 100644 --- a/html/v0.3.1/en/lomas_server.data_connector.html +++ b/html/v0.3.2/en/lomas_server.data_connector.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -163,7 +163,7 @@

    lomas_server.data_connector.s3_connector module - Version: v0.3.1 + Version: v0.3.2
    @@ -171,7 +171,7 @@

    lomas_server.data_connector.s3_connector moduleen +
    en
    @@ -193,7 +193,7 @@

    lomas_server.data_connector.s3_connector modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.dataset_store.html b/html/v0.3.2/en/lomas_server.dataset_store.html similarity index 99% rename from html/v0.3.1/en/lomas_server.dataset_store.html rename to html/v0.3.2/en/lomas_server.dataset_store.html index c974eba9..93c30e35 100644 --- a/html/v0.3.1/en/lomas_server.dataset_store.html +++ b/html/v0.3.2/en/lomas_server.dataset_store.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -179,7 +179,7 @@

    lomas_server.dataset_store.lru_dataset_store module
    - Version: v0.3.1 + Version: v0.3.2
    @@ -187,7 +187,7 @@

    lomas_server.dataset_store.lru_dataset_store module
    Languages
    -
    en
    +
    en
    @@ -209,7 +209,7 @@

    lomas_server.dataset_store.lru_dataset_store modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.dp_queries.dp_libraries.html b/html/v0.3.2/en/lomas_server.dp_queries.dp_libraries.html similarity index 98% rename from html/v0.3.1/en/lomas_server.dp_queries.dp_libraries.html rename to html/v0.3.2/en/lomas_server.dp_queries.dp_libraries.html index c57ded41..3cb32a9d 100644 --- a/html/v0.3.1/en/lomas_server.dp_queries.dp_libraries.html +++ b/html/v0.3.2/en/lomas_server.dp_queries.dp_libraries.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -167,7 +167,7 @@

    lomas_server.dp_queries.dp_libraries.utils module
    - Version: v0.3.1 + Version: v0.3.2
    @@ -175,7 +175,7 @@

    lomas_server.dp_queries.dp_libraries.utils module
    Languages
    -
    en
    +
    en
    @@ -197,7 +197,7 @@

    lomas_server.dp_queries.dp_libraries.utils modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.dp_queries.html b/html/v0.3.2/en/lomas_server.dp_queries.html similarity index 98% rename from html/v0.3.1/en/lomas_server.dp_queries.html rename to html/v0.3.2/en/lomas_server.dp_queries.html index d0ad7cd3..91605bc4 100644 --- a/html/v0.3.1/en/lomas_server.dp_queries.html +++ b/html/v0.3.2/en/lomas_server.dp_queries.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -175,7 +175,7 @@

    lomas_server.dp_queries.dummy_dataset module - Version: v0.3.1 + Version: v0.3.2
    @@ -183,7 +183,7 @@

    lomas_server.dp_queries.dummy_dataset moduleen +
    en
    @@ -205,7 +205,7 @@

    lomas_server.dp_queries.dummy_dataset modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.html b/html/v0.3.2/en/lomas_server.html similarity index 99% rename from html/v0.3.1/en/lomas_server.html rename to html/v0.3.2/en/lomas_server.html index ad99a982..771f82f7 100644 --- a/html/v0.3.1/en/lomas_server.html +++ b/html/v0.3.2/en/lomas_server.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -837,7 +837,7 @@

    lomas_server.uvicorn_serve module - Version: v0.3.1 + Version: v0.3.2
    @@ -845,7 +845,7 @@

    lomas_server.uvicorn_serve moduleen +
    en
    @@ -867,7 +867,7 @@

    lomas_server.uvicorn_serve modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.private_dataset.html b/html/v0.3.2/en/lomas_server.private_dataset.html similarity index 98% rename from html/v0.3.1/en/lomas_server.private_dataset.html rename to html/v0.3.2/en/lomas_server.private_dataset.html index 7d44ccdb..e3be188e 100644 --- a/html/v0.3.1/en/lomas_server.private_dataset.html +++ b/html/v0.3.2/en/lomas_server.private_dataset.html @@ -35,7 +35,7 @@
    - v0.3.1 + v0.3.2
    @@ -144,7 +144,7 @@

    lomas_server.private_dataset.utils module - Version: v0.3.1 + Version: v0.3.2
    @@ -152,7 +152,7 @@

    lomas_server.private_dataset.utils moduleen +
    en
    @@ -174,7 +174,7 @@

    lomas_server.private_dataset.utils modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.routes.html b/html/v0.3.2/en/lomas_server.routes.html similarity index 98% rename from html/v0.3.1/en/lomas_server.routes.html rename to html/v0.3.2/en/lomas_server.routes.html index ee9f4e37..67e787d3 100644 --- a/html/v0.3.1/en/lomas_server.routes.html +++ b/html/v0.3.2/en/lomas_server.routes.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -157,7 +157,7 @@

    lomas_server.routes.utils module - Version: v0.3.1 + Version: v0.3.2
    @@ -165,7 +165,7 @@

    lomas_server.routes.utils moduleen +
    en
    @@ -187,7 +187,7 @@

    lomas_server.routes.utils modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.tests.html b/html/v0.3.2/en/lomas_server.tests.html similarity index 98% rename from html/v0.3.1/en/lomas_server.tests.html rename to html/v0.3.2/en/lomas_server.tests.html index 229376b3..bd5d42e8 100644 --- a/html/v0.3.1/en/lomas_server.tests.html +++ b/html/v0.3.2/en/lomas_server.tests.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -169,7 +169,7 @@

    lomas_server.tests.test_mongodb_admin_cli module - Version: v0.3.1 + Version: v0.3.2
    @@ -177,7 +177,7 @@

    lomas_server.tests.test_mongodb_admin_cli moduleen +
    en
    @@ -199,7 +199,7 @@

    lomas_server.tests.test_mongodb_admin_cli modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/lomas_server.utils.html b/html/v0.3.2/en/lomas_server.utils.html similarity index 99% rename from html/v0.3.1/en/lomas_server.utils.html rename to html/v0.3.2/en/lomas_server.utils.html index 42807a3b..f5be857c 100644 --- a/html/v0.3.1/en/lomas_server.utils.html +++ b/html/v0.3.2/en/lomas_server.utils.html @@ -37,7 +37,7 @@
    - v0.3.1 + v0.3.2
    @@ -1256,7 +1256,7 @@

    lomas_server.utils.error_handler module - Version: v0.3.1 + Version: v0.3.2
    @@ -1264,7 +1264,7 @@

    lomas_server.utils.error_handler moduleen +
    en
    @@ -1286,7 +1286,7 @@

    lomas_server.utils.error_handler modulev0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.2/en/notebooks/Demo_Client_Notebook.html b/html/v0.3.2/en/notebooks/Demo_Client_Notebook.html new file mode 100644 index 00000000..b6c997c1 --- /dev/null +++ b/html/v0.3.2/en/notebooks/Demo_Client_Notebook.html @@ -0,0 +1,1185 @@ + + + + + + + + + Lomas: Client demo — Lomas 0.0.1 documentation + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +

    Lomas: Client demo

    +

    This notebook showcases how researcher could use the Lomas platform. It explains the different functionnalities provided by the lomas-client library to interact with the secure server.

    +

    The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.

    +

    Each user has access to one or multiple projects and for each dataset has a limited budget with \(\epsilon\) and \(\delta\) values.

    +
    +
    [1]:
    +
    +
    +
    from IPython.display import Image
    +Image(filename="images/image_demo_client.png", width=800)
    +
    +
    +
    +
    +
    [1]:
    +
    +
    +
    +../_images/notebooks_Demo_Client_Notebook_2_0.png +
    +
    +

    🐧🐧🐧 In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins dimensions.

    +

    Therefore, the powerful queen Icerbegina 👑 had the data collected. But in order to get the penguins to agree to participate she promised them that no one would be able to look at the data and that no one would be able to guess the bill width of any specific penguin (which is very sensitive information) from the data. Nobody! Not even the researchers. The queen hence stored the data on the Secure Data Disclosure Server and only gave a small budget to Dr. Antarctica.

    +

    This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library lomas-client. 🐧🐧🐧

    +
    +

    Step 1: Install the library

    +

    To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library lomas-client on her local developping environment.

    +

    It can be installed via the pip command:

    +
    +
    [4]:
    +
    +
    +
    !pip install lomas-client
    +
    +
    +
    +
    +
    +
    +
    +
    +Collecting lomas-client
    +  Downloading lomas_client-0.1.0.tar.gz (8.0 kB)
    +  Installing build dependencies ... done
    +  Getting requirements to build wheel ... done
    +  Preparing metadata (pyproject.toml) ... done
    +Requirement already satisfied: opendp==0.8.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.8.0)
    +Requirement already satisfied: opendp-logger==0.3.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (0.3.0)
    +Requirement already satisfied: numpy==1.26.4 in /usr/local/lib/python3.11/site-packages (from lomas-client) (1.26.4)
    +Requirement already satisfied: requests==2.32.0 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.32.0)
    +Requirement already satisfied: pandas==2.2.2 in /usr/local/lib/python3.11/site-packages (from lomas-client) (2.2.2)
    +Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/site-packages (from pandas==2.2.2->lomas-client) (2.9.0.post0)
    +Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/site-packages (from pandas==2.2.2->lomas-client) (2024.1)
    +Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/site-packages (from pandas==2.2.2->lomas-client) (2024.1)
    +Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/site-packages (from requests==2.32.0->lomas-client) (3.3.2)
    +Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/site-packages (from requests==2.32.0->lomas-client) (3.7)
    +Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/site-packages (from requests==2.32.0->lomas-client) (2.2.2)
    +Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/site-packages (from requests==2.32.0->lomas-client) (2024.6.2)
    +Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas==2.2.2->lomas-client) (1.16.0)
    +Building wheels for collected packages: lomas-client
    +  Building wheel for lomas-client (pyproject.toml) ... done
    +  Created wheel for lomas-client: filename=lomas_client-0.1.0-py3-none-any.whl size=7982 sha256=81a9dd4be09f50b39028e877a467f2ba48accfb55ffeea655a491dc1f0d28ccb
    +  Stored in directory: /root/.cache/pip/wheels/36/0b/91/29d8725d273c025f2a67ea520ca72b23e56eb47ee032bdfdeb
    +Successfully built lomas-client
    +Installing collected packages: lomas-client
    +Successfully installed lomas-client-0.1.0
    +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
    +
    +[notice] A new release of pip is available: 24.0 -> 24.1
    +[notice] To update, run: pip install --upgrade pip
    +
    +
    +
    +
    [3]:
    +
    +
    +
    from lomas_client import Client
    +import numpy as np
    +
    +
    +
    +
    +
    +

    Step 2: Initialise the client

    +

    Once the library is installed, a Client object must be created. It is responsible for sending sending requests to the server and processing responses in the local environment. It enables a seamless interaction with the server.

    +

    To create the client, Dr. Antartica needs to give it a few parameters: - a url: the root application endpoint to the remote secure server. - user_name: her name as registered in the database (Dr. Alice Antartica) - dataset_name: the name of the dataset that she wants to query (PENGUIN)

    +

    She will only be able to query on the real dataset if the queen Icergina has previously made her an account in the database, given her access to the PENGUIN dataset and has given her some epsilon and delta credit (as is done in the Admin Notebook for Users and Datasets management).

    +
    +
    [4]:
    +
    +
    +
    APP_URL = "http://lomas_server"
    +USER_NAME = "Dr. Antartica"
    +DATASET_NAME = "PENGUIN"
    +client = Client(url=APP_URL, user_name = USER_NAME, dataset_name = DATASET_NAME)
    +
    +
    +
    +

    And that’s it for the preparation. She is now ready to use the various functionnalities offered by lomas_client.

    +
    +
    +

    Step 3: Understand the functionnalities of the library

    +
    +

    Getting dataset metadata

    +

    Dr. Antartica has never seen the data and as a first step to understand what is available to her, she would like to check the metadata of the dataset. Therefore, she just needs to call the get_dataset_metadata() function of the client. As this is public information, this does not cost any budget.

    +

    This function returns metadata information in a format based on SmartnoiseSQL dictionary format, where among other, there is information about all the available columns, their type, bound values (see Smartnoise page for more details). Any metadata is required for Smartnoise-SQL is also required here and additional information such that the different categories in a string type column column can be added.

    +
    +
    [5]:
    +
    +
    +
    penguin_metadata = client.get_dataset_metadata()
    +penguin_metadata
    +
    +
    +
    +
    +
    [5]:
    +
    +
    +
    +
    +{'max_ids': 1,
    + 'row_privacy': True,
    + 'censor_dims': False,
    + 'columns': {'species': {'type': 'string',
    +   'cardinality': 3,
    +   'categories': ['Adelie', 'Chinstrap', 'Gentoo']},
    +  'island': {'type': 'string',
    +   'cardinality': 3,
    +   'categories': ['Torgersen', 'Biscoe', 'Dream']},
    +  'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},
    +  'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},
    +  'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},
    +  'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},
    +  'sex': {'type': 'string',
    +   'cardinality': 2,
    +   'categories': ['MALE', 'FEMALE']}},
    + 'rows': 344}
    +
    +
    +

    Based on this Dr. Antartica knows that there are 7 columns, 3 of string type (species, island, sex) with their associated categories (i.e. the species column has 3 possibilities: ‘Adelie’, ‘Chinstrap’, ‘Gentoo’) and 4 of float type (bill length, bill depth, flipper length and body mass) with their associated bounds (i.e. the body mass of penguin ranges from 2000 to 7000 gramms). She also knows based on the field max_ids: 1 that each penguin can only be once in the dataset and on the field +row_privacy: True that each row represents a single penguin.

    +
    +
    +

    Get a dummy dataset

    +

    Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset.

    +

    Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets. Getting a dummy dataset does not affect the budget as there is no differential privacy here. It is not a synthetic dataset and all that could be learn here is already present in the public metadata (it is created randomly on the fly based on the +metadata).

    +

    Dr. Antartica first create a dummy dataset with 200 rows and chooses a seed of 0.

    +
    +
    [6]:
    +
    +
    +
    NB_ROWS = 200
    +SEED = 0
    +
    +
    +
    +
    +
    [7]:
    +
    +
    +
    df_dummy = client.get_dummy_dataset(
    +    nb_rows = NB_ROWS,
    +    seed = SEED
    +)
    +
    +print(df_dummy.shape)
    +df_dummy.head()
    +
    +
    +
    +
    +
    +
    +
    +
    +(200, 7)
    +
    +
    +
    +
    [7]:
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
    0GentooBiscoe49.20847316.117959190.1259502873.291927FEMALE
    1GentooTorgersen55.03162819.963435242.9291423639.940005FEMALE
    2ChinstrapTorgersen51.09671816.777518159.9614935401.743330MALE
    3AdelieBiscoe49.07091114.796037244.5301532316.038092MALE
    4ChinstrapBiscoe44.82791813.246787236.9488535036.246870FEMALE
    +
    +
    +
    +
    +

    Query on dummy dataset

    +

    Now that she has an idea of what the data looks like, she wants to start querying the real dataset for her research.

    +

    However, her budget is limited and it would be a waste to spend it by mistake on a coding error. Therefore the client/server pipeline has functionnal testing capabilities for the users. It is possible to test a query on a dummy dataset to ensure that everything is working properly. Dr. Antartica will not be able to use the results of a dummy query for her analysis (as the data is random) but if the query on the dummy dataset works, she can be confident that her query will also work on the +real dataset. This functionnal testing on the dummy does not have any impact on the budget as it is on random data only.

    +

    To test on the dummy data instead of the real data, the function call is exactly the same with the only exception of the flag dummy=True. In the following cell, she will test with smartnoise_query but it is the same flag for opendp_query. She can optionnaly give two additional parameters to set the seed and the number of rows of the dummy dataset.

    +

    Another more advanced possibility for functionnal tests with the dummy is to compare results of queries on a local dummy and the remote dummy with a very high budget: - create a local dummy on the notebook with a specific seed and number of rows - compute locally the wanted query on this local dummy with python functions like numpy - query the server on the same remote dummy with (dummy=True, same seed and same number of row) and a very big buget to limit noise as much as possible (don’t +worry this won’t cost any real budget) - compare and verify that the local and remote dummy have similar results.

    +
    +

    Average and number of rows with smartnoise-sql library on remote dummy

    +

    Dr. Antartica will now try a query to get the number of penguin and their average bill length (in mm) on the dummy dataset. She does not forget to - set the dummy flag to True - set very high budget values to be able to compare results with a similar local dummy (with the same seed and number of rows) if she wants to verify that the function do what is expected. Here she will just check that the number of rows is close to what she sets as parameter.

    +
    +
    [8]:
    +
    +
    +
    # Number of penguin and average bill length in mm
    +QUERY = "SELECT COUNT(*) AS nb_penguins, \
    +        AVG(bill_length_mm) AS avg_bill_length_mm \
    +        FROM df"
    +
    +
    +
    +
    +
    [9]:
    +
    +
    +
    # On the remote server dummy dataframe
    +dummy_res = client.smartnoise_sql_query(
    +    query = QUERY,
    +    epsilon = 100.0,
    +    delta = 0.99,
    +    dummy = True,
    +    nb_rows = NB_ROWS,
    +    seed = SEED
    +)
    +
    +
    +
    +
    +
    [10]:
    +
    +
    +
    print(f"Average bill length in remote dummy: {np.round(dummy_res['query_response']['avg_bill_length_mm'][0], 2)}mm.")
    +print(f"Number of rows in remote dummy: {np.round(dummy_res['query_response']['nb_penguins'][0], 2)}.")
    +
    +
    +
    +
    +
    +
    +
    +
    +Average bill length in remote dummy: 47.52mm.
    +Number of rows in remote dummy: 200.
    +
    +
    +

    No functionnal errors happened and the estimated number of rows is very close (if not equal) to the number of rows that she set for the dummy dataframe. She is now even more confident in using her query on the server.

    +
    +
    +
    +

    Get current budget

    +

    It is the first time that Dr. Antartica connects to the server and she wants to know how much buget the queen assigned her. Therefore, she calls the fonction get_initial_budget.

    +
    +
    [11]:
    +
    +
    +
    client.get_initial_budget()
    +
    +
    +
    +
    +
    [11]:
    +
    +
    +
    +
    +{'initial_epsilon': 10.0, 'initial_delta': 0.005}
    +
    +
    +

    She sees that she has 10.0 epsilon and 0.005 epsilon at her disposal.

    +

    Then she checks her total spent budget get_total_spent_budget. As she only did queries on metadata on dummy dataframes, this should still be 0.

    +
    +
    [12]:
    +
    +
    +
    client.get_total_spent_budget()
    +
    +
    +
    +
    +
    [12]:
    +
    +
    +
    +
    +{'total_spent_epsilon': 0.0, 'total_spent_delta': 0.0}
    +
    +
    +

    It will also be useful to know what the remaining budget is. Therefore, she calls the function get_remaining_budget. It just substarcts the total spent budget from the initial budget.

    +
    +
    [13]:
    +
    +
    +
    client.get_remaining_budget()
    +
    +
    +
    +
    +
    [13]:
    +
    +
    +
    +
    +{'remaining_epsilon': 10.0, 'remaining_delta': 0.005}
    +
    +
    +

    As expected, for now the remaining budget is equal to the inital budget.

    +
    +
    +

    Estimate cost of a query

    +

    Another safeguard is the functionnality to estimate the cost of a query. As in OpenDP and SmartnoiseSQL, the budget that will by used by a query might be slightly different than what is asked by the user. The estimate cost function returns the estimated real cost of any query.

    +

    Again, of course, this will not impact the user’s budget.

    +

    Dr. Antartica checks the budget that computing the average bill length will really cost her if she asks the query with an epsilon and a delta.

    +
    +
    [14]:
    +
    +
    +
    EPSILON = 0.5
    +DELTA = 1e-4
    +
    +
    +
    +
    +
    [15]:
    +
    +
    +
    client.estimate_smartnoise_sql_cost(
    +    query = QUERY,
    +    epsilon = EPSILON,
    +    delta = DELTA
    +)
    +
    +
    +
    +
    +
    [15]:
    +
    +
    +
    +
    +{'epsilon_cost': 1.5, 'delta_cost': 0.00014999500000001387}
    +
    +
    +

    This query would actually cost her 1.5 epsilon and delta 1.4999e-4. She decides that it is good enough.

    +
    +
    +

    Query on real private dataset with smartnoise-sql

    +

    Now that all the safeguard functions were tested, Dr. Antartica is ready to query on the real dataset and get a differentially private response of the number of penguins and average bill length. By default, the flag dummy is False so setting it is optional. She uses the values of epsilon and delta that she selected just before.

    +

    Careful: This command DOES spend the budget of the user and the remaining budget is updated for every query.

    +
    +
    [16]:
    +
    +
    +
    client.get_remaining_budget()
    +
    +
    +
    +
    +
    [16]:
    +
    +
    +
    +
    +{'remaining_epsilon': 10.0, 'remaining_delta': 0.005}
    +
    +
    +
    +
    [17]:
    +
    +
    +
    response = client.smartnoise_sql_query(
    +    query = QUERY,
    +    epsilon = EPSILON,
    +    delta = DELTA,
    +    dummy = False # Optionnal
    +)
    +
    +
    +
    +
    +
    [18]:
    +
    +
    +
    nb_penguins = response['query_response']['nb_penguins'].iloc[0]
    +print(f"Number of penguins in real data: {nb_penguins}.")
    +
    +avg_bill_length = np.round(response['query_response']['avg_bill_length_mm'].iloc[0], 2)
    +print(f"Average bill length of penguins in real data: {avg_bill_length}mm.")
    +
    +
    +
    +
    +
    +
    +
    +
    +Number of penguins in real data: 343.
    +Average bill length of penguins in real data: 43.27mm.
    +
    +
    +

    After each query on the real dataset, the budget informations are also returned to the researcher. It is possible possible to check the remaining budget again afterwards:

    +
    +
    [19]:
    +
    +
    +
    response
    +
    +
    +
    +
    +
    [19]:
    +
    +
    +
    +
    +{'requested_by': 'Dr. Antartica',
    + 'query_response':    nb_penguins  avg_bill_length_mm
    + 0          343           43.267492,
    + 'spent_epsilon': 1.5,
    + 'spent_delta': 0.00014999500000001387}
    +
    +
    +
    +
    [20]:
    +
    +
    +
    client.get_remaining_budget()
    +
    +
    +
    +
    +
    [20]:
    +
    +
    +
    +
    +{'remaining_epsilon': 8.5, 'remaining_delta': 0.004850004999999986}
    +
    +
    +

    As can be seen in get_total_spent_budget(), it is the budget estimated with estimate_smartnoise_cost() that was spent.

    +
    +
    [21]:
    +
    +
    +
    client.get_total_spent_budget()
    +
    +
    +
    +
    +
    [21]:
    +
    +
    +
    +
    +{'total_spent_epsilon': 1.5, 'total_spent_delta': 0.00014999500000001387}
    +
    +
    +

    Dr. Antartica has now a differentially private estimation of the number of penguins in the dataset and is confident to use the library for the rest of her analyses.

    +
    +
    +
    +

    Step 4: Penguin statistics with opendp

    +
    +
    [22]:
    +
    +
    +
    import opendp as dp
    +import opendp.transformations as trans
    +import opendp.measurements as meas
    +
    +
    +
    +
    +

    Confidence intervals for bill length over the whole population

    +

    She is first interested to have a better idea of the distribution of bill length of all species. She already has the count and average from the previous step, so she only needs the variance values.

    +

    She first checks the metadata again to use the relevant values in the pipeline.

    +
    +
    [23]:
    +
    +
    +
    penguin_metadata
    +
    +
    +
    +
    +
    [23]:
    +
    +
    +
    +
    +{'max_ids': 1,
    + 'row_privacy': True,
    + 'censor_dims': False,
    + 'columns': {'species': {'type': 'string',
    +   'cardinality': 3,
    +   'categories': ['Adelie', 'Chinstrap', 'Gentoo']},
    +  'island': {'type': 'string',
    +   'cardinality': 3,
    +   'categories': ['Torgersen', 'Biscoe', 'Dream']},
    +  'bill_length_mm': {'type': 'float', 'lower': 30.0, 'upper': 65.0},
    +  'bill_depth_mm': {'type': 'float', 'lower': 13.0, 'upper': 23.0},
    +  'flipper_length_mm': {'type': 'float', 'lower': 150.0, 'upper': 250.0},
    +  'body_mass_g': {'type': 'float', 'lower': 2000.0, 'upper': 7000.0},
    +  'sex': {'type': 'string',
    +   'cardinality': 2,
    +   'categories': ['MALE', 'FEMALE']}},
    + 'rows': 344}
    +
    +
    +

    She can define the columns names and the bounds of the relevant column.

    +
    +
    [24]:
    +
    +
    +
    columns = ["species", "island", "bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g", "sex"]
    +
    +
    +
    +
    +
    [25]:
    +
    +
    +
    bill_length_min = penguin_metadata['columns']['bill_length_mm']['lower']
    +bill_length_max = penguin_metadata['columns']['bill_length_mm']['upper']
    +bill_length_min, bill_length_max
    +
    +
    +
    +
    +
    [25]:
    +
    +
    +
    +
    +(30.0, 65.0)
    +
    +
    +

    She can now define the pipeline of the transformation to have the variance that she wants on the data:

    +
    +
    [26]:
    +
    +
    +
    bill_length_transformation_pipeline = (
    +    trans.make_split_dataframe(separator=",", col_names=columns) >>
    +    trans.make_select_column(key="bill_length_mm", TOA=str) >>
    +    trans.then_cast_default(TOA=float) >>
    +    trans.then_clamp(bounds=(bill_length_min, bill_length_max)) >>
    +    trans.then_resize(size=nb_penguins.tolist(), constant=avg_bill_length) >>
    +    trans.then_variance()
    +)
    +
    +
    +
    +

    However, when she tries to execute it on the server, she has an error (see below).

    +
    +
    [27]:
    +
    +
    +
    # Expect to fail !!!
    +client.opendp_query(
    +    opendp_pipeline = bill_length_transformation_pipeline,
    +    dummy=True
    +)
    +
    +
    +
    +
    +
    +
    +
    +
    +Server error status 500: {"InternalServerException":"Internal server error. Please contact the administrator of this service."}
    +
    +
    +

    This is because the server will only allow measurement pipeline with differentially private results. She adds Laplacian noise to the pipeline and should be able to instantiate the pipeline.

    +
    +
    [28]:
    +
    +
    +
    var_bill_length_measurement_pipeline = (
    +    bill_length_transformation_pipeline >>
    +    meas.then_laplace(scale=5.0)
    +)
    +
    +
    +
    +

    Now that there is a measurement, she is able to apply the pipeline on the dummy dataset of the server.

    +
    +
    [41]:
    +
    +
    +
    dummy_var_res = client.opendp_query(
    +    opendp_pipeline = var_bill_length_measurement_pipeline,
    +    dummy=True
    +)
    +print(f"Dummy result for variance: {np.round(dummy_var_res['query_response'], 2)}")
    +
    +
    +
    +
    +
    +
    +
    +
    +Dummy result for variance: 28.68
    +
    +
    +

    With opendp, the function estimate_opendp_cost is particularly useful to estimate the used epsilon and delta based on the scale value.

    +
    +
    [42]:
    +
    +
    +
    cost_res = client.estimate_opendp_cost(
    +    opendp_pipeline = var_bill_length_measurement_pipeline
    +)
    +cost_res
    +
    +
    +
    +
    +
    [42]:
    +
    +
    +
    +
    +{'epsilon_cost': 0.7142857142866551, 'delta_cost': 0}
    +
    +
    +

    She can now execute the query on the real dataset.

    +
    +
    [43]:
    +
    +
    +
    var_res = client.opendp_query(
    +    opendp_pipeline = var_bill_length_measurement_pipeline,
    +)
    +
    +
    +
    +
    +
    [44]:
    +
    +
    +
    print(f"Number of penguins: {nb_penguins} (from previous smartnoise-sql query).")
    +
    +print(f"Average bill length: {np.round(avg_bill_length, 2)} (from previous smartnoise-sql query).")
    +
    +var_bill_length = var_res['query_response']
    +print(f"Variance of bill length: {np.round(var_bill_length, 3)} (from opendp query).")
    +
    +
    +
    +
    +
    +
    +
    +
    +Number of penguins: 343 (from previous smartnoise-sql query).
    +Average bill length: 43.27 (from previous smartnoise-sql query).
    +Variance of bill length: 33.457 (from opendp query).
    +
    +
    +

    She can now do all the postprocessing that she wants with the returned data without adding any privacy risk.

    +
    +
    [45]:
    +
    +
    +
    # Get standard error
    +standard_error = np.sqrt(var_bill_length/nb_penguins)
    +print(f"Standard error of bill length: {np.round(standard_error, 2)}.")
    +
    +
    +
    +
    +
    +
    +
    +
    +Standard error of bill length: 0.31.
    +
    +
    +
    +
    [46]:
    +
    +
    +
     # Compute the 95% confidence interval
    +ZSCORE = 1.96
    +lower_bound = np.round(avg_bill_length - ZSCORE*standard_error, 2)
    +upper_bound = np.round(avg_bill_length + ZSCORE*standard_error, 2)
    +print(f"The 95% confidence interval of the bill length of all penguins is [{lower_bound}, {upper_bound}].")
    +
    +
    +
    +
    +
    +
    +
    +
    +The 95% confidence interval of the bill length of all penguins is [42.66, 43.88].
    +
    +
    +
    +
    +

    Count per species

    +

    She can also creates an histogram of the number of penguin per species.

    +

    She first extract the categories from the metadata:

    +
    +
    [47]:
    +
    +
    +
    categories = penguin_metadata['columns']['species']['categories']
    +categories
    +
    +
    +
    +
    +
    [47]:
    +
    +
    +
    +
    +['Adelie', 'Chinstrap', 'Gentoo']
    +
    +
    +

    Then, writes the pipeline:

    +
    +
    [48]:
    +
    +
    +
    species_count_pipeline = (
    +    trans.make_split_dataframe(separator=",", col_names=columns) >>
    +    trans.make_select_column(key="species", TOA=str) >>
    +    trans.then_count_by_categories(categories=categories) >>
    +    meas.then_laplace(scale=0.5)
    +)
    +
    +
    +
    +

    Verify it works on the dummy:

    +
    +
    [49]:
    +
    +
    +
    dummy_res = client.opendp_query(
    +    opendp_pipeline = species_count_pipeline,
    +    dummy=True
    +)
    +print(f"Dummy result for histogram: {dummy_res['query_response']}")
    +
    +
    +
    +
    +
    +
    +
    +
    +Dummy result for histogram: [38, 33, 29, 0]
    +
    +
    +

    Checks the required cost:

    +
    +
    [50]:
    +
    +
    +
    cost_res = client.estimate_opendp_cost(
    +    opendp_pipeline = species_count_pipeline
    +)
    +cost_res
    +
    +
    +
    +
    +
    [50]:
    +
    +
    +
    +
    +{'epsilon_cost': 2.0, 'delta_cost': 0}
    +
    +
    +

    And finally apply the pipeline on the real dataset:

    +
    +
    [51]:
    +
    +
    +
    species_counts_res = client.opendp_query(
    +    opendp_pipeline = species_count_pipeline,
    +)
    +
    +
    +
    +
    +
    [52]:
    +
    +
    +
    species_counts_res
    +
    +
    +
    +
    +
    [52]:
    +
    +
    +
    +
    +{'requested_by': 'Dr. Antartica',
    + 'query_response': [152, 68, 124, 0],
    + 'spent_epsilon': 2.0,
    + 'spent_delta': 0}
    +
    +
    +
    +
    [53]:
    +
    +
    +
    for i, count in enumerate(species_counts_res['query_response']):
    +    if i == len(categories):
    +        print(f"Species Unknown has {count} penguins.")
    +    else:
    +        print(f"Species {categories[i]} has {count} penguins.")
    +
    +
    +
    +
    +
    +
    +
    +
    +Species Adelie has 152 penguins.
    +Species Chinstrap has 68 penguins.
    +Species Gentoo has 124 penguins.
    +Species Unknown has 0 penguins.
    +
    +
    +
    +
    +
    +

    Step 5: See archives of queries

    +

    She now wants to verify all the queries that she did on the real data. It is possible because an archive of all queries is kept in a secure database. With a function call she can see her queries, budget and associated responses.

    +
    +
    [55]:
    +
    +
    +
    previous_queries = client.get_previous_queries()
    +previous_queries
    +
    +
    +
    +
    +
    [55]:
    +
    +
    +
    +
    +[{'user_name': 'Dr. Antartica',
    +  'dataset_name': 'PENGUIN',
    +  'dp_librairy': 'opendp',
    +  'client_input': {'dataset_name': 'PENGUIN',
    +   'opendp_json': <opendp.mod.Measurement at 0x79089aa227b0>,
    +   'fixed_delta': None},
    +  'response': {'requested_by': 'Dr. Antartica',
    +   'query_response': 33.45739909117274,
    +   'spent_epsilon': 0.7142857142866551,
    +   'spent_delta': 0},
    +  'timestamp': 1725006741.9967923},
    + {'user_name': 'Dr. Antartica',
    +  'dataset_name': 'PENGUIN',
    +  'dp_librairy': 'opendp',
    +  'client_input': {'dataset_name': 'PENGUIN',
    +   'opendp_json': <opendp.mod.Measurement at 0x79089aa20ef0>,
    +   'fixed_delta': None},
    +  'response': {'requested_by': 'Dr. Antartica',
    +   'query_response': [152, 68, 124, 0],
    +   'spent_epsilon': 2.0,
    +   'spent_delta': 0},
    +  'timestamp': 1725006753.331767}]
    +
    +
    +
    +
    [ ]:
    +
    +
    +
    
    +
    +
    +
    +
    +
    [ ]:
    +
    +
    +
    
    +
    +
    +
    +
    +
    [ ]:
    +
    +
    +
    
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    + + Version: v0.3.2 + + +
    + +
    +
    Languages
    + +
    en
    + +
    + + +
    +
    Versions
    + +
    stable
    + +
    develop
    + +
    v0.1.0
    + +
    v0.1.1
    + +
    v0.1.2
    + +
    v0.2.0
    + +
    v0.3.0
    + +
    v0.3.2
    + +
    + +
    + +
    +
    + + + \ No newline at end of file diff --git a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html b/html/v0.3.2/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html similarity index 53% rename from html/v0.3.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html rename to html/v0.3.2/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html index 21fb14c3..22d1d06d 100644 --- a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html +++ b/html/v0.3.2/en/notebooks/Demo_Client_Notebook_DiffPrivLib.html @@ -6,7 +6,7 @@ - Lomas Client Side: Using DiffPrivlib — Lomas 0.0.1 documentation + Secure Data Disclosure: Client side — Lomas 0.0.1 documentation @@ -23,7 +23,7 @@ - + @@ -40,7 +40,7 @@
    - v0.3.1 + v0.3.2
    @@ -56,11 +56,12 @@
  • Examples

  • @@ -1347,7 +1347,7 @@

    Hypothesis testing - Version: v0.3.1 + Version: v0.3.2
    @@ -1355,7 +1355,7 @@

    Hypothesis testingen +
    en
    @@ -1377,7 +1377,7 @@

    Hypothesis testingv0.3.0 -
    v0.3.1
    +
    v0.3.2
    diff --git a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html b/html/v0.3.2/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html similarity index 91% rename from html/v0.3.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html rename to html/v0.3.2/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html index 4e28bc8e..9673030b 100644 --- a/html/v0.3.1/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html +++ b/html/v0.3.2/en/notebooks/Demo_Client_Notebook_Smartnoise-Synth.html @@ -6,7 +6,7 @@ - Lomas Client Side: Using Smartnoise-Synth — Lomas 0.0.1 documentation + Secure Data Disclosure: Client Side Smartnoise-Synth — Lomas 0.0.1 documentation @@ -24,7 +24,7 @@ - + @@ -40,7 +40,7 @@
    - v0.3.1 + v0.3.2
    @@ -56,12 +56,13 @@
  • Examples
    • Lomas: Client demo
    • Secure Data Disclosure: Client side
    • -
    • Lomas Client Side: Using DiffPrivlib
    • -
    • Lomas Client Side: Using Smartnoise-Synth
        +
      • Secure Data Disclosure: Client side
      • +
      • Secure Data Disclosure: Client Side Smartnoise-Synth
        • Step 1: Install the library
        • Step 2: Initialise the client
        • Step 3: Metadata and dummy dataset
        • Step 3: Create a Synthetic Dataset keeping all default parameters
            @@ -118,7 +119,7 @@
            • - +
            • View page source
            • @@ -128,24 +129,35 @@
              -
              -

              Lomas Client Side: Using Smartnoise-Synth

              +
              +

              Secure Data Disclosure: Client Side Smartnoise-Synth

              This notebook showcases how researcher could use the Secure Data Disclosure system. It explains the different functionnalities provided by the lomas-client client library to interact with the secure server.

              The secure data are never visible by researchers. They can only access to differentially private responses via queries to the server.

              Each user has access to one or multiple projects and for each dataset has a limited budget with \(\epsilon\) and \(\delta\) values.

              -
              -

              Step 1: Install the library

              -

              To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library lomas-client on her local developping environment.

              -

              It can be installed via the pip command:

              -
              -
              [ ]:
              +
              +
              [1]:
               
              -
              # !pip install lomas_client
              +
              from IPython.display import Image
              +Image(filename="images/image_demo_client.png", width=800)
               
              -

              Or using a local version of the client

              +
              +
              [1]:
              +
              +
              +
              +../_images/notebooks_Demo_Client_Notebook_Smartnoise-Synth_2_0.png +
              +
              +

              🐧🐧🐧 In this notebook the researcher is a penguin researcher named Dr. Antarctica. She aims to do a grounbdbreaking research on various penguins dimensions.

              +

              Therefore, the powerful queen Icerbegina 👑 had the data collected. But in order to get the penguins to agree to participate she promised them that no one would be able to look at the data and that no one would be able to guess the bill width of any specific penguin (which is very sensitive information) from the data. Nobody! Not even the researchers. The queen hence stored the data on the Secure Data Disclosure Server and only gave a small budget to Dr. Antarctica.

              +

              This is not a problem for Dr. Antarctica as she does not need to see the data to make statistics thanks to the Secure Data Disclosure Client library fso-sdd-demo. 🐧🐧🐧

              +
              +

              Step 1: Install the library

              +

              To interact with the secure server on which the data is stored, Dr.Antartica first needs to install the library fso-sdd-demo on her local developping environment.

              +

              It can be installed via the pip command:

              @@ -224,6 +237,133 @@

              Getting dataset metadatamax_ids: 1 that each penguin can only be once in the dataset and on the field +row_privacy: True that each row represents a single penguin.

              +

              +
              +

              Get a dummy dataset

              +

              Now, that she has seen and understood the metadata, she wants to get an even better understanding of the dataset (but is still not able to see it). A solution to have an idea of what the dataset looks like it to create a dummy dataset.

              +

              Based on the public metadata of the dataset, a random dataframe can be created created. By default, there will be 100 rows and the seed is set to 42 to ensure reproducibility, but these 2 variables can be changed to obtain different dummy datasets. Getting a dummy dataset does not affect the budget as there is no differential privacy here. It is not a synthetic dataset and all that could be learn here is already present in the public metadata (it is created randomly on the fly based on the +metadata).

              +

              Dr. Antartica first create a dummy dataset with 200 rows and chooses a seed of 0.

              +
              +
              [6]:
              +
              +
              +
              NB_ROWS = 200
              +SEED = 0
              +
              +
              +
              +
              +
              [7]:
              +
              +
              +
              df_dummy = client.get_dummy_dataset(
              +    nb_rows = NB_ROWS,
              +    seed = SEED
              +)
              +
              +print(df_dummy.shape)
              +df_dummy.head()
              +
              +
              +
              +
              +
              +
              +
              +
              +(200, 7)
              +
              +
              +
              +
              [7]:
              +
              +
              +
              +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsex
              0GentooBiscoe49.20847316.117959190.1259502873.291927FEMALE
              1GentooTorgersen55.03162819.963435242.9291423639.940005FEMALE
              2ChinstrapTorgersen51.09671816.777518159.9614935401.743330MALE
              3AdelieBiscoe49.07091114.796037244.5301532316.038092MALE
              4ChinstrapBiscoe44.82791813.246787236.9488535036.246870FEMALE
              +
              +
              @@ -2018,7 +2158,7 @@

              Step 6: See archives of queries - +

              @@ -2040,7 +2180,7 @@

              Step 6: See archives of queries - Version: v0.3.1 + Version: v0.3.2
              @@ -2048,7 +2188,7 @@

              Step 6: See archives of queriesen +
              en
              @@ -2070,7 +2210,7 @@

              Step 6: See archives of queriesv0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/notebooks/local_admin_notebook.html b/html/v0.3.2/en/notebooks/local_admin_notebook.html similarity index 99% rename from html/v0.3.1/en/notebooks/local_admin_notebook.html rename to html/v0.3.2/en/notebooks/local_admin_notebook.html index bcb4905c..91b97912 100644 --- a/html/v0.3.1/en/notebooks/local_admin_notebook.html +++ b/html/v0.3.2/en/notebooks/local_admin_notebook.html @@ -40,7 +40,7 @@
              - v0.3.1 + v0.3.2
              @@ -182,7 +182,7 @@

              Access the server to administrate the mongoDB - Version: v0.3.1 + Version: v0.3.2
              @@ -1438,7 +1438,7 @@

              Stop the server: do not do it now !en +
              en
              @@ -1460,7 +1460,7 @@

              Stop the server: do not do it now !v0.3.0 -
              v0.3.1
              +
              v0.3.2
              diff --git a/html/v0.3.1/en/notebooks/s3_example_notebook.html b/html/v0.3.2/en/notebooks/s3_example_notebook.html similarity index 98% rename from html/v0.3.1/en/notebooks/s3_example_notebook.html rename to html/v0.3.2/en/notebooks/s3_example_notebook.html index 405703ef..e48c66da 100644 --- a/html/v0.3.1/en/notebooks/s3_example_notebook.html +++ b/html/v0.3.2/en/notebooks/s3_example_notebook.html @@ -24,7 +24,7 @@ - + @@ -40,7 +40,7 @@
              - v0.3.1 + v0.3.2