From 803f118355d44153444b3fc3cb65f4a9ec6e6542 Mon Sep 17 00:00:00 2001 From: Vihtoriaaa Date: Fri, 1 Dec 2023 00:11:43 +0200 Subject: [PATCH] Created baseline for web documentation using mkdocs --- .DS_Store | Bin 6148 -> 6148 bytes SynRD/.DS_Store | Bin 8196 -> 10244 bytes SynRD/synthesizers/.DS_Store | Bin 0 -> 6148 bytes SynRD/synthesizers/synthesizer.py | 140 +++--- docs/.DS_Store | Bin 0 -> 6148 bytes docs/api.md | 15 + docs/blog/index.md | 2 + docs/config_notebook.ipynb | 731 ++++++++++++++++++++++++++++++ docs/findings.md | 1 + docs/img/.DS_Store | Bin 0 -> 6148 bytes docs/img/logo.png | Bin 0 -> 13053 bytes docs/img/taxonomy_synrd.png | Bin 0 -> 120608 bytes docs/quickstart.md | 126 +++++ imgs/.DS_Store | Bin 0 -> 6148 bytes mkdocs.yml | 115 +++++ web/.DS_Store | Bin 0 -> 6148 bytes web/preprocess.ipynb | 242 +++++++++- 17 files changed, 1290 insertions(+), 82 deletions(-) create mode 100644 SynRD/synthesizers/.DS_Store create mode 100644 docs/.DS_Store create mode 100644 docs/api.md create mode 100644 docs/blog/index.md create mode 100644 docs/config_notebook.ipynb create mode 100644 docs/findings.md create mode 100644 docs/img/.DS_Store create mode 100644 docs/img/logo.png create mode 100644 docs/img/taxonomy_synrd.png create mode 100644 docs/quickstart.md create mode 100644 imgs/.DS_Store create mode 100644 mkdocs.yml create mode 100644 web/.DS_Store diff --git a/.DS_Store b/.DS_Store index 70e12308ad1dc66cdd38644e49d7781027dfb4f1..f36febd24dec1665d568c1759dcb414b8f98fcbb 100644 GIT binary patch delta 422 zcmZoMXfc@J&&aniU^g=(-((&ZeNh&M6o!0;WQO9T^5TM|octsP28NxJy;%$EC9A7V zEKPM342{iebrh-%4NQ!56wJ)bYil_LUkOx#R+VLITXx7#LuN#*;6x8jB#Qg9pN7X;u|ZIB#R20OMwM Hj=%f>`6OM( delta 239 zcmZoMXfc@J&&akhU^g=(+hiUVeLYr&V1`PDJcb|!m!$IIf~1`MBnAeClSu_RnZ+dr z2G<#xm|0la*f}`3IJkJZCJV9&vj!xVWF$>4WbyXr;N;+p7m%o~HZ?cWQ7|?%tJP7c zwlp%(Q7|z!tF7ha5LY#{^-RdEtg5c5t(yrn7zh{{Av6O&l!j5WCZA$cnf!sZLDJ3$QW=s`ij#Aa^7C^*20?|&f{XHU^7GPxB8(dg?=Ws==lIJH E08v~vjQ{`u diff --git a/SynRD/.DS_Store b/SynRD/.DS_Store index 0b27edd25eb4c762341d965cfedd9437b5de61d7..04efd20cf5e9c1ac4e3023d910e11d044e11b6c8 100644 GIT binary patch delta 405 zcmZp1XbF&DU|?W$DortDU{C-uIe-{M3-C-V6q~50$jG%ZU^hP_*Jd7pGwg0W48;tU z40#MC3>gfmKz1fW6_74sC{8LbE=bDBPXg-Po>Y*NSzKaZaE+0PnT3^&or9f&nb_3Cx@uAzI9N1 zc1~_yekagSAYf#K&ZXoRn3Z#vN-^K4zkTC7GnuF E0MztV9RL6T delta 100 zcmZn(XmOBWU|?W$DortDU;r^WfEYvza8E20o2aMA$hI+HH$NlWW*&hv?2|Pm^#z%M nvOplg4J2Ga3O5#hXP(Tj63D>_(atbAo@eUjzaqDpfa-MsRtyr@ diff --git a/SynRD/synthesizers/.DS_Store b/SynRD/synthesizers/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d5041efdbda5aa40c29a7655eac896c87c927fa4 GIT binary patch literal 6148 zcmeHKyH3PF3>?E1C()#&+#jIe4_2q+3-|#ZNf+sW=nA@Y{5E5I59JggT}6S$l08|k zXIGgbjse*2*xv&kfGyn-Umn)x`|c~dY8gk1GmaSWflu5qUS`hi(BqAqcP#k>MxOSJ z2}3`gBxG7WxzYWUP&H mhG@maXvJK3E52RS6@TV_Z8#?eo%x^>^&{ZA$fUquDDVwd>l&f} literal 0 HcmV?d00001 diff --git a/SynRD/synthesizers/synthesizer.py b/SynRD/synthesizers/synthesizer.py index f0f84f2..84ae7dd 100644 --- a/SynRD/synthesizers/synthesizer.py +++ b/SynRD/synthesizers/synthesizer.py @@ -136,23 +136,20 @@ class MSTSynthesizer(Synthesizer): """ MST: Maximum Spanning Tree synthesizer. - ---------- - Parameters - epsilon : float + Parameters: + epsilon (float): Privacy budget for the synthesizer - ----------- - Optional keyword arguments: - slide_range : bool = False + slide_range (bool = False): Specifies if the slide range transformation should be applied, this will make the minimal value of each column 0 before fitting. - thresh : float = 0.05 + thresh (float = 0.05): Specifies what the ratio of unique values to the column length should be for the column to be threated as cathegorical - preprocess_factor : float = 0.05 + preprocess_factor (float = 0.05): Amount of budget to be used for the data preprocessing - delta : float = 1e-09 + delta (float = 1e-09): Privacy parameter, should be small, in the range of 1/(n * sqrt(n)) - verbose: bool = False + verbose (bool = False): Print diagnostic information during processing """ def __init__( @@ -223,60 +220,57 @@ class PATECTGAN(Synthesizer): """ Conditional tabular GAN using Private Aggregation of Teacher Ensembles - ---------- - Parameters - epsilon : float + Parameters: + epsilon (float): float Privacy budget for the synthesizer - ----------- - Optional keyword arguments: - slide_range : bool = False + slide_range (bool = False): Specifies if the slide range transformation should be applied, this will make the minimal value of each column 0 before fitting. - thresh : float = 0.05 + thresh (float = 0.05): float = 0.05 Specifies what the ratio of unique values to the column length should be for the column to be threated as cathegorical - preprocess_factor : float = 0.05 + preprocess_factor (float = 0.05): Amount of budget to be used for the data preprocessing - embedding_dim : int = 128 + embedding_dim (int = 128): Dimension of the embeding - generator_dim : tuple = (256, 256) + generator_dim (tuple = (256, 256)): Dimension of the generator - discriminator_dim : tuple = (256, 256) + discriminator_dim (tuple = (256, 256)): Dimension of the discriminstor - generator_lr : float = 0.0002 + generator_lr (float = 0.0002): Generator's learning rate - generator_decay : float = 1e-06 + generator_decay (float = 1e-06): Generator's decay - discriminator_lr : float = 0.002 + discriminator_lr (float = 0.002): Discriminator's learning rate - discriminator_decay : float = 1e-06 + discriminator_decay (float = 1e-06): Discriminator's decay - batch_size : int = 500 + batch_size (int = 500): Number of samples in one batch (for one training step) - verbose : bool = True + verbose (bool = True): Specifies if training information should be printed or not - epochs : int = 300 + epochs (int = 300): Number of training epochs - pac : int = 1 + pac (int = 1): Number of pacs to use (useful for dealing with mode collapse) - cuda : bool|string = True + cuda (bool|string = True): Specifies if cuda should be used for computation. Providing a string will result in using the specific device. - regularization : string = None + regularization (string = None): Which regularization to use. At the moment only dragan is possible. - loss : string = 'cross_entropy' + loss (string = 'cross_entropy'): Type of loss to be used - teacher_iters : int = 5 + teacher_iters (int = 5): Number of iterations for training the teachers - student_iters : int = 5 + student_iters (int = 5): Number of iterations for training the students - delta : float = None + delta (float = None): privacy parameter, should be small, in the range of 1/(n * sqrt(n)) - sample_per_teacher : int = 1000 + sample_per_teacher (int = 1000): Number of samples for training one teacher - noise_multiplier : float = 0.001 + noise_multiplier (float = 0.001): Multiplier for Laplace noise - moments_order : int = 100 + moments_order (int = 100): Number of moments to be used in moments accountant method """ @@ -419,24 +413,22 @@ class PrivBayes(Synthesizer): Synthesizer which uses bayesian approach. ---------- - Parameters - epsilon : float + Parameters: + epsilon (float): Privacy budget for the synthesizer - ----------- - Optional keyword arguments: - slide_range : bool = False + slide_range (bool = False): Specifies if the slide range transformation should be applied, this will make the minimal value of each column 0 before fitting. - thresh : float = 0.05 + thresh (float = 0.05): Specifies what the ratio of unique values to the column length should be for the column to be threated as cathegorical - privbayes_limit : int = 20 + privbayes_limit (int = 20): If number of unique values in the column exceeds this limit, it will be binned - privbayes_bins : int = 10 + privbayes_bins (int = 10): Number of bins (if binning is happening) - temp_files_dir : str = 'temp' + temp_files_dir (str = 'temp'): Directory used to save the file produced by the data describer - seed : int = 0 + seed (int = 0): Random seed to be used """ @@ -568,31 +560,28 @@ class AIMTSynthesizer(Synthesizer): """ Synthesizer which uses AIM: An Adaptive and Iterative Mechanism - ---------- - Parameters - epsilon : float + Parameters: + epsilon (float): Privacy budget for the synthesizer - ----------- - Optional keyword arguments: - slide_range : bool = False + slide_range (bool = False): Specifies if the slide range transformation should be applied, this will make the minimal value of each column 0 before fitting. - thresh : float = 0.05 + thresh (float = 0.05): Specifies what the ratio of unique values to the column length should be for the column to be threated as cathegorical - delta : float = 1e-9 + delta (float = 1e-9): Privacy parameter. Should be small, in the range of 1/(n * sqrt(n)) - max_model_size : int = 80 + max_model_size (int = 80): Maximum size of the model - degree : int = 2 + degree (int = 2): Number of data columns used in the workload - num_marginals : int = None + num_marginals (int = None): Number of elements in the workload - max_cells : int = 10000 + max_cells (int = 10000): Maximum number of cells in a domain that can be used for the synthesizer - rounds : int = None + rounds (int = None): Number of rounds to run the algorithm for - verbose : bool = False + verbose (bool = False): Specifies if additional information should be printed or not """ @@ -688,34 +677,31 @@ class AIMSynthesizer(Synthesizer): Synthesizer which uses AIM: An Adaptive and Iterative Mechanism with adjustable `rounds_factor` parameter to influence the number of rounds to run the mechanism. - ---------- - Parameters - epsilon : float + Parameters: + epsilon (float): float Privacy budget for the synthesizer - ----------- - Optional keyword arguments: - rounds_factor : float = 0.1 + rounds_factor (float = 0.1): The factor to determine the number of rounds to run the AIM mechanism before generating the synthetic dataset. - slide_range : bool = False + slide_range (bool = False): Specifies if the slide range transformation should be applied, this will make the minimal value of each column 0 before fitting. - thresh : float = 0.05 + thresh (float = 0.05): Specifies what the ratio of unique values to the column length should be for the column to be threated as cathegorical - delta : float = 1e-9 + delta (float = 1e-9): Privacy parameter. Should be small, in the range of 1/(n * sqrt(n)) - max_model_size : int = 80 + max_model_size (int = 80): Maximum size of the model - degree : int = 2 + degree (int = 2): Number of data columns used in the workload - num_marginals : int = None + num_marginals (int = None): Number of elements in the workload - max_cells : int = 10000 + max_cells (int = 10000): Maximum number of cells in a domain that can be used for the synthesizer - rounds : int = None + rounds (int = None): Number of rounds to run the algorithm for - verbose : bool = False + verbose (bool = False): Specifies if additional information should be printed or not """ diff --git a/docs/.DS_Store b/docs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..808bfcbebab5241f76c8bf8ad75b8b23c526ab7b GIT binary patch literal 6148 zcmeHK%}yIJ5Vn()I6_D{fC>@^OI#z7wEPJ5vJK${SOkX_g)AF|Rd?4>Hfat~q`hz= z@4++l0s0C&3@2vn2|r5dv7l;38h_*QjMw|EW$y?fWOEcYgs2K36ewb$0?i);$59ug zK%O$7#5uBl5Ssvczk>ckG&|lS1NiNVA`*${1>@)6FOITdy?!SP#nOkRvMQ@(b?#r8 zu|Mn#M_IEo_=dd`W8z?LcY@QXJ8oB34^2AkL}_YrUG&JL;8Kq%nbA30U zDyq`1ZcHXS2fH=h_`E-@=}Du$^Qory_V%aKidx&+{&L*@5htm+aU4q6ZdO(Z=P(0< zUMI{h;{cY2q2!8t4gb<4&-W&cB&OA(y{kTM-rru&et&(+OHBBe(f-wIv;Oo4X>8IS z%rsvxm@LcyGr$bIIRkVispU6c2`_*dU\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m }\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mmst_synth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMSTSynthesizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Epsilon:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmst_synth\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Slide range:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmst_synth\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mslide_range\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, preprocess_factor, delta, verbose, **synth_kwargs)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0msynth_kwargs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m ) -> None:\n\u001b[0;32m--> 168\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mslide_range\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0mallowed_additional_params\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"preprocess_factor\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"delta\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"verbose\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, **kwargs)\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[0mepsilon_value\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlocals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"epsilon\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mepsilon_value\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 47\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Epsilon is a required parameter for Synthesizer.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 48\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon_value\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 49\u001b[0m raise TypeError(\n", + "\u001b[0;31mValueError\u001b[0m: Epsilon is a required parameter for Synthesizer." + ] + } + ], + "source": [ + "config = {\n", + " \"thresh\": 0.1,\n", + " \"delta\": 1e-05\n", + "}\n", + "\n", + "mst_synth = MSTSynthesizer(**config)\n", + "print(\"Epsilon:\", mst_synth.epsilon)\n", + "print(\"Slide range:\", mst_synth.slide_range)\n", + "print(\"Thresh:\", mst_synth.thresh)\n", + "print(\"Preprocess factor:\", mst_synth.preprocess_factor)\n", + "print(\"Delta:\", mst_synth.delta)\n", + "print(\"Verbose:\", mst_synth.verbose)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialization throught config dictionary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's initialize the basic configuration where we pass **only** one required parameter - epsilon, and see what will be the values of MSTSynthesizer params:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epsilon: 0.08\n", + "Slide range: False\n", + "Thresh: 0.05\n", + "Preprocess factor: 0.05\n", + "Delta: 1e-09\n", + "Verbose: False\n" + ] + } + ], + "source": [ + "config = {\n", + " \"epsilon\": 0.08\n", + "}\n", + "\n", + "mst_synth = MSTSynthesizer(**config)\n", + "print(\"Epsilon:\", mst_synth.epsilon)\n", + "print(\"Slide range:\", mst_synth.slide_range) # default False\n", + "print(\"Thresh:\", mst_synth.thresh) # default 0.05\n", + "print(\"Preprocess factor:\", mst_synth.preprocess_factor) # default 0.05\n", + "print(\"Delta:\", mst_synth.delta) # default 1e-09\n", + "print(\"Verbose:\", mst_synth.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the above result, you can see that all parameters were set with default values, while epsilon was set with a value provided by the user (as a required parameter)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also initialize the synthesizer inside the class, which is done as follows:\n", + "\n", + "`self.synthesizer = SmartnoiseMSTSynthesizer(\n", + " epsilon=self.epsilon, delta=self.delta, verbose=self.verbose, **synth_kwargs\n", + ")`\n", + "\n", + "Thus, we see that we can pass our customized parameters there as well (but only those that **can** be customized, e.g: epsilon, delta, and verbose)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MSTSynthesizer Epsilon: 0.08\n", + "MSTSynthesizer Delta: 1e-09\n", + "MSTSynthesizer Verbose: False\n" + ] + } + ], + "source": [ + "print(\"MSTSynthesizer Epsilon:\", mst_synth.synthesizer.epsilon)\n", + "print(\"MSTSynthesizer Delta:\", mst_synth.synthesizer.delta)\n", + "print(\"MSTSynthesizer Verbose:\", mst_synth.synthesizer.verbose)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, the epsilon we provided during class initialization is also passed to the synthesizer, while other params used their default values (as we did not configured them)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can configure more parameters and make sure that they are all set correctly (with custom values where they are passed and default values where they are not):" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epsilon: 0.08\n", + "Slide range: True\n", + "Thresh: 0.05\n", + "Preprocess factor: 0.05\n", + "Delta: 0.25\n", + "Verbose: True\n" + ] + } + ], + "source": [ + "config = {\n", + " \"epsilon\": 0.08,\n", + " \"slide_range\": True,\n", + " \"verbose\": True,\n", + " \"delta\": 0.25 \n", + "}\n", + "\n", + "mst_synth = MSTSynthesizer(**config)\n", + "print(\"Epsilon:\", mst_synth.epsilon)\n", + "print(\"Slide range:\", mst_synth.slide_range) # default False\n", + "print(\"Thresh:\", mst_synth.thresh) # default 0.05\n", + "print(\"Preprocess factor:\", mst_synth.preprocess_factor) # default 0.05\n", + "print(\"Delta:\", mst_synth.delta) # default 1e-09\n", + "print(\"Verbose:\", mst_synth.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the values of self.synthesizer are also changed through this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MSTSynthesizer Epsilon: 0.08\n", + "MSTSynthesizer Delta: 0.25\n", + "MSTSynthesizer Verbose: True\n" + ] + } + ], + "source": [ + "print(\"MSTSynthesizer Epsilon:\", mst_synth.synthesizer.epsilon)\n", + "print(\"MSTSynthesizer Delta:\", mst_synth.synthesizer.delta) # default 1e-09\n", + "print(\"MSTSynthesizer Verbose:\", mst_synth.synthesizer.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialization throught passing values as regular parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The user can also customize the synthesizer using the regular parameter names, which can be done as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epsilon: 0.1\n", + "Slide range: False\n", + "Thresh: 0.05\n", + "Preprocess factor: 1.2\n", + "Delta: 1e-09\n", + "Verbose: False\n" + ] + } + ], + "source": [ + "mst_synth = MSTSynthesizer(epsilon=0.10, slide_range=False, preprocess_factor=1.2)\n", + "print(\"Epsilon:\", mst_synth.epsilon)\n", + "print(\"Slide range:\", mst_synth.slide_range) # default False\n", + "print(\"Thresh:\", mst_synth.thresh) # default 0.05\n", + "print(\"Preprocess factor:\", mst_synth.preprocess_factor) # default 0.05\n", + "print(\"Delta:\", mst_synth.delta) # default 1e-09\n", + "print(\"Verbose:\", mst_synth.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And (again) the values of self.synthesizer are also changed through this:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MSTSynthesizer Epsilon: 0.1\n", + "MSTSynthesizer Delta: 1e-09\n", + "MSTSynthesizer Verbose: False\n" + ] + } + ], + "source": [ + "print(\"MSTSynthesizer Epsilon:\", mst_synth.synthesizer.epsilon)\n", + "print(\"MSTSynthesizer Delta:\", mst_synth.synthesizer.delta) # default 1e-09\n", + "print(\"MSTSynthesizer Verbose:\", mst_synth.synthesizer.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And, of course, you should remember that the epsilon is a mandatory parameter for transmission, so if you do not want an error to occur, please specify it (otherwise, we will notify you about it)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Epsilon is a required parameter for Synthesizer.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/wp/3b9l300x6jd499pj0h74v8500000gn/T/ipykernel_97092/1886790669.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmst_synth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMSTSynthesizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mslide_range\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpreprocess_factor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1.2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, preprocess_factor, delta, verbose, **synth_kwargs)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0msynth_kwargs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m ) -> None:\n\u001b[0;32m--> 168\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mslide_range\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0mallowed_additional_params\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"preprocess_factor\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"delta\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"verbose\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, **kwargs)\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[0mepsilon_value\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlocals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"epsilon\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mepsilon_value\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 47\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Epsilon is a required parameter for Synthesizer.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 48\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon_value\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 49\u001b[0m raise TypeError(\n", + "\u001b[0;31mValueError\u001b[0m: Epsilon is a required parameter for Synthesizer." + ] + } + ], + "source": [ + "mst_synth = MSTSynthesizer(slide_range=False, preprocess_factor=1.2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialization using both ways: regular params + config dictionary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition, the user can use both variants of parameter configurations, and the order in which they are passed does not matter, since both will work." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epsilon: 0.3\n", + "Slide range: False\n", + "Thresh: 0.4\n", + "Preprocess factor: 0.05\n", + "Delta: 1e-09\n", + "Verbose: True\n" + ] + } + ], + "source": [ + "config = {\n", + " \"epsilon\": 0.3,\n", + " \"thresh\": 0.4\n", + "}\n", + "\n", + "mst_synth = MSTSynthesizer(verbose=True, **config)\n", + "print(\"Epsilon:\", mst_synth.epsilon)\n", + "print(\"Slide range:\", mst_synth.slide_range) # default False\n", + "print(\"Thresh:\", mst_synth.thresh) # default 0.05\n", + "print(\"Preprocess factor:\", mst_synth.preprocess_factor) # default 0.05\n", + "print(\"Delta:\", mst_synth.delta) # default 1e-09\n", + "print(\"Verbose:\", mst_synth.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the other way around:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epsilon: 0.3333\n", + "Slide range: False\n", + "Thresh: 0.4444\n", + "Preprocess factor: 0.5555\n", + "Delta: 1e-09\n", + "Verbose: False\n" + ] + } + ], + "source": [ + "config = {\n", + " \"epsilon\": 0.3333,\n", + " \"thresh\": 0.4444\n", + "}\n", + "\n", + "mst_synth = MSTSynthesizer(**config, preprocess_factor=0.5555)\n", + "print(\"Epsilon:\", mst_synth.epsilon)\n", + "print(\"Slide range:\", mst_synth.slide_range) # default False\n", + "print(\"Thresh:\", mst_synth.thresh) # default 0.05\n", + "print(\"Preprocess factor:\", mst_synth.preprocess_factor) # default 0.05\n", + "print(\"Delta:\", mst_synth.delta) # default 1e-09\n", + "print(\"Verbose:\", mst_synth.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And (again) epsilon is a mandatory argument to be passed:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Epsilon is a required parameter for Synthesizer.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/wp/3b9l300x6jd499pj0h74v8500000gn/T/ipykernel_97092/3251956413.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m }\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mmst_synth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMSTSynthesizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, preprocess_factor, delta, verbose, **synth_kwargs)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0msynth_kwargs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m ) -> None:\n\u001b[0;32m--> 168\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mslide_range\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0mallowed_additional_params\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"preprocess_factor\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"delta\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"verbose\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, **kwargs)\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[0mepsilon_value\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlocals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"epsilon\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mepsilon_value\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 47\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Epsilon is a required parameter for Synthesizer.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 48\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon_value\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 49\u001b[0m raise TypeError(\n", + "\u001b[0;31mValueError\u001b[0m: Epsilon is a required parameter for Synthesizer." + ] + } + ], + "source": [ + "config = {\n", + " \"thresh\": 0.4,\n", + " \"delta\": 0.121\n", + "}\n", + "\n", + "mst_synth = MSTSynthesizer(verbose=True, **config)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Checking argument types" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another great thing is that we don't allow the user to pass arguments with unexpected types. For example: the user passes the argument `verbose = 5` (int type), while verbose should be of type bool. If such a situation occurs, a TypeError message is raised with information about what types are expected for the erroneous argument." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "Epsilon must be of type int or float, got bool.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/wp/3b9l300x6jd499pj0h74v8500000gn/T/ipykernel_97092/2752234616.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m }\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mmst_synth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMSTSynthesizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# The epsilon value can only be of type int or float\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, preprocess_factor, delta, verbose, **synth_kwargs)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0msynth_kwargs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m ) -> None:\n\u001b[0;32m--> 168\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mslide_range\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0mallowed_additional_params\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"preprocess_factor\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"delta\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"verbose\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, **kwargs)\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon_value\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 49\u001b[0m raise TypeError(\n\u001b[0;32m---> 50\u001b[0;31m \u001b[0;34mf\"Epsilon must be of type int or float, got {type(epsilon_value).__name__}.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 51\u001b[0m )\n\u001b[1;32m 52\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mepsilon\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon_value\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: Epsilon must be of type int or float, got bool." + ] + } + ], + "source": [ + "config = {\n", + " \"thresh\": 0.4,\n", + " \"delta\": 0.121\n", + "}\n", + "\n", + "mst_synth = MSTSynthesizer(epsilon=True, **config) # The epsilon value can only be of type int or float" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "thresh must be of type float, got str.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/wp/3b9l300x6jd499pj0h74v8500000gn/T/ipykernel_97092/3447988808.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmst_synth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMSTSynthesizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"0.4\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdelta\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# The thresh value can only be of type int or float\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, preprocess_factor, delta, verbose, **synth_kwargs)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0msynth_kwargs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m ) -> None:\n\u001b[0;32m--> 168\u001b[0;31m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mslide_range\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 170\u001b[0m \u001b[0mallowed_additional_params\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"preprocess_factor\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"delta\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"verbose\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, **kwargs)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparam_value\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mparam_type\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 70\u001b[0m raise TypeError(\n\u001b[0;32m---> 71\u001b[0;31m \u001b[0;34mf\"{param} must be of type {param_type.__name__}, got {type(param_value).__name__}.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 72\u001b[0m )\n\u001b[1;32m 73\u001b[0m \u001b[0msetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparam\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparam_value\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: thresh must be of type float, got str." + ] + } + ], + "source": [ + "mst_synth = MSTSynthesizer(epsilon=1.0, thresh=\"0.4\", delta=True) # The thresh value can only be of type int or float" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So, from the above examples, we can see that passing the correct type of arguments is an essential step, and if the user makes a mistake, we inform them. However, we **allow the user to pass int values for float arguments** because we can easily convert the former to the latter. See examples below:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epsilon: 1.0\n", + "Slide range: False\n", + "Thresh: 2.0\n", + "Preprocess factor: 0.05\n", + "Delta: 5.0\n", + "Verbose: True\n" + ] + } + ], + "source": [ + "mst_synth = MSTSynthesizer(epsilon=1, thresh=2, verbose=True, delta=5)\n", + "print(\"Epsilon:\", mst_synth.epsilon)\n", + "print(\"Slide range:\", mst_synth.slide_range) # default False\n", + "print(\"Thresh:\", mst_synth.thresh) # default 0.05\n", + "print(\"Preprocess factor:\", mst_synth.preprocess_factor) # default 0.05\n", + "print(\"Delta:\", mst_synth.delta) # default 1e-09\n", + "print(\"Verbose:\", mst_synth.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And there won't be any issues for self.synthesizer attributes too:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MSTSynthesizer Epsilon: 1.0\n", + "MSTSynthesizer Delta: 5.0\n", + "MSTSynthesizer Verbose: True\n" + ] + } + ], + "source": [ + "print(\"MSTSynthesizer Epsilon:\", mst_synth.synthesizer.epsilon)\n", + "print(\"MSTSynthesizer Delta:\", mst_synth.synthesizer.delta) # default 1e-09\n", + "print(\"MSTSynthesizer Verbose:\", mst_synth.synthesizer.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Moreover, if the user provides None as the value for an argument, we will set the default value for this argument (if there is one). " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epsilon: 1.1\n", + "Thresh: 0.001\n", + "Verbose: False\n" + ] + } + ], + "source": [ + "config = {\n", + " \"epsilon\": 1.1,\n", + " \"verbose\": None,\n", + " \"thresh\": 0.001\n", + "}\n", + "\n", + "mst_synth = MSTSynthesizer(**config)\n", + "print(\"Epsilon:\", mst_synth.epsilon)\n", + "print(\"Thresh:\", mst_synth.thresh) # default 0.05\n", + "print(\"Verbose:\", mst_synth.verbose) # default False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Non-existing arguments passed for the synthesizer" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course, we don't want the user to pass in non-existent parameters for a particular synth class, because that makes no sense. Another situation might be that the user is simply using the wrong synthesizer type, even if they are passing an \"existing\" parameter. In this case, we will inform the user that the provided arguments are not supported for the specified synthesizer type:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Parameter 'hello' is not available for this type of synthesizer.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/wp/3b9l300x6jd499pj0h74v8500000gn/T/ipykernel_97092/564626642.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmst_synth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMSTSynthesizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.99\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhello\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"world\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, preprocess_factor, delta, verbose, **synth_kwargs)\u001b[0m\n\u001b[1;32m 172\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mparam\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mallowed_additional_params\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 173\u001b[0m raise ValueError(\n\u001b[0;32m--> 174\u001b[0;31m \u001b[0;34mf\"Parameter '{param}' is not available for this type of synthesizer.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 175\u001b[0m )\n\u001b[1;32m 176\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: Parameter 'hello' is not available for this type of synthesizer." + ] + } + ], + "source": [ + "mst_synth = MSTSynthesizer(epsilon=0.99, verbose=True, hello=\"world\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Parameter 'batch_size' is not available for this type of synthesizer.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/wp/3b9l300x6jd499pj0h74v8500000gn/T/ipykernel_97092/2738562190.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmst_synth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMSTSynthesizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mepsilon\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.99\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Desktop/RAI research program/project/SynRD/SynRD/synthesizers/synthesizer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, epsilon, slide_range, thresh, preprocess_factor, delta, verbose, **synth_kwargs)\u001b[0m\n\u001b[1;32m 172\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mparam\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mallowed_additional_params\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 173\u001b[0m raise ValueError(\n\u001b[0;32m--> 174\u001b[0;31m \u001b[0;34mf\"Parameter '{param}' is not available for this type of synthesizer.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 175\u001b[0m )\n\u001b[1;32m 176\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: Parameter 'batch_size' is not available for this type of synthesizer." + ] + } + ], + "source": [ + "mst_synth = MSTSynthesizer(epsilon=0.99, verbose=True, batch_size=5)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "synrd", + "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.7.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/findings.md b/docs/findings.md new file mode 100644 index 0000000..b6fc4c6 --- /dev/null +++ b/docs/findings.md @@ -0,0 +1 @@ +hello \ No newline at end of file diff --git a/docs/img/.DS_Store b/docs/img/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 F{{vrzbTj|} literal 0 HcmV?d00001 diff --git a/docs/img/taxonomy_synrd.png b/docs/img/taxonomy_synrd.png new file mode 100644 index 0000000000000000000000000000000000000000..bd543d8df11b30227e3252399cf10565e85ad18f GIT binary patch literal 120608 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 interest_stem_eleventh + ``` + +3. A list of hard findings i.e. values (this could be the difference or set of differences that affected the soft_finding inequality. F) + + #### For example: + + ```Python + hard_finding = interest_stem_ninth - interest_stem_eleventh + hard_findings = [hard_finding] + ``` + + +[lunr.js]: https://lunrjs.com/ +[private-pgm]: https://github.com/ryan112358/private-pgm +[cran.r-project.org]: https://cran.r-project.org/bin/macosx/ \ No newline at end of file diff --git a/imgs/.DS_Store b/imgs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0+BdI8i%z@lL)A@ks@xuCJx6w{?yB_OaZ4yzD>kkGXyAe$DTm|NLyzPaT<1AQT7%LV-}=auq<&7He+| zV+{pDfl%O}fP5bkTrfKhhWhEiq9XuMe&f|}t+NC$NdTA~2SY?)Y*e68*+&dEI^xOe zvg2TAbYeXj_wke2CluDx5l>o9oDE|Q1ww&S1+Hy7lm5SiPt5osC2}Y4vZfG(IqStIEMmX DgKj5; literal 0 HcmV?d00001 diff --git a/web/preprocess.ipynb b/web/preprocess.ipynb index 8f21de6..aec25d8 100644 --- a/web/preprocess.ipynb +++ b/web/preprocess.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -40,10 +40,242 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], - "source": [] + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
paperfinding_numberfinding_typeparitystdfinding typesynthesizerepsilon
0iverson22football0NaN0.000.000000DESCRIPTIVE_STATISTICSprivbayes0.37
1iverson22football1NaN1.000.000000DESCRIPTIVE_STATISTICSprivbayes0.37
2iverson22football2NaN1.000.000000DESCRIPTIVE_STATISTICSprivbayes0.37
3iverson22football3NaN1.000.000000TEMPORAL_FIXED_CLASSprivbayes0.37
4iverson22football4NaN1.000.000000TEMPORAL_FIXED_CLASSprivbayes0.37
5iverson22football5NaN0.000.000000TEMPORAL_FIXED_CLASSprivbayes0.37
6iverson22football6NaN0.680.466476TEMPORAL_FIXED_CLASSprivbayes0.37
12iverson22football0NaN1.000.000000DESCRIPTIVE_STATISTICSprivbayes1.00
13iverson22football1NaN1.000.000000DESCRIPTIVE_STATISTICSprivbayes1.00
14iverson22football2NaN1.000.000000DESCRIPTIVE_STATISTICSprivbayes1.00
15iverson22football3NaN0.640.480000TEMPORAL_FIXED_CLASSprivbayes1.00
16iverson22football4NaN0.600.489898TEMPORAL_FIXED_CLASSprivbayes1.00
17iverson22football5NaN0.600.489898TEMPORAL_FIXED_CLASSprivbayes1.00
18iverson22football6NaN0.640.480000TEMPORAL_FIXED_CLASSprivbayes1.00
\n", + "
" + ], + "text/plain": [ + " paper finding_number finding_type parity std \\\n", + "0 iverson22football 0 NaN 0.00 0.000000 \n", + "1 iverson22football 1 NaN 1.00 0.000000 \n", + "2 iverson22football 2 NaN 1.00 0.000000 \n", + "3 iverson22football 3 NaN 1.00 0.000000 \n", + "4 iverson22football 4 NaN 1.00 0.000000 \n", + "5 iverson22football 5 NaN 0.00 0.000000 \n", + "6 iverson22football 6 NaN 0.68 0.466476 \n", + "12 iverson22football 0 NaN 1.00 0.000000 \n", + "13 iverson22football 1 NaN 1.00 0.000000 \n", + "14 iverson22football 2 NaN 1.00 0.000000 \n", + "15 iverson22football 3 NaN 0.64 0.480000 \n", + "16 iverson22football 4 NaN 0.60 0.489898 \n", + "17 iverson22football 5 NaN 0.60 0.489898 \n", + "18 iverson22football 6 NaN 0.64 0.480000 \n", + "\n", + " finding type synthesizer epsilon \n", + "0 DESCRIPTIVE_STATISTICS privbayes 0.37 \n", + "1 DESCRIPTIVE_STATISTICS privbayes 0.37 \n", + "2 DESCRIPTIVE_STATISTICS privbayes 0.37 \n", + "3 TEMPORAL_FIXED_CLASS privbayes 0.37 \n", + "4 TEMPORAL_FIXED_CLASS privbayes 0.37 \n", + "5 TEMPORAL_FIXED_CLASS privbayes 0.37 \n", + "6 TEMPORAL_FIXED_CLASS privbayes 0.37 \n", + "12 DESCRIPTIVE_STATISTICS privbayes 1.00 \n", + "13 DESCRIPTIVE_STATISTICS privbayes 1.00 \n", + "14 DESCRIPTIVE_STATISTICS privbayes 1.00 \n", + "15 TEMPORAL_FIXED_CLASS privbayes 1.00 \n", + "16 TEMPORAL_FIXED_CLASS privbayes 1.00 \n", + "17 TEMPORAL_FIXED_CLASS privbayes 1.00 \n", + "18 TEMPORAL_FIXED_CLASS privbayes 1.00 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('data.csv')\n", + "df[df[\"paper\"]==\"iverson22football\"]" + ] } ], "metadata": { @@ -62,7 +294,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.12" + "version": "3.7.16" }, "orig_nbformat": 4, "vscode": {