diff --git a/sql/VERSION b/sql/VERSION index f9cbc01a..e5a4a5e7 100644 --- a/sql/VERSION +++ b/sql/VERSION @@ -1 +1 @@ -1.0.7 \ No newline at end of file +1.0.9 \ No newline at end of file diff --git a/sql/pyproject.toml b/sql/pyproject.toml index 81fa5058..68745f1e 100644 --- a/sql/pyproject.toml +++ b/sql/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "smartnoise-sql" -version = "1.0.7" +version = "1.0.9" description = "Differentially Private SQL Queries" authors = ["SmartNoise Team "] license = "MIT" @@ -11,7 +11,7 @@ readme = "README.md" [tool.poetry.dependencies] python = ">=3.9,<3.14" -opendp = ">=0.8.0,<0.13.0" +opendp = ">=0.8.0,<=0.14.1" antlr4-python3-runtime = "4.9.3" PyYAML = "^6.0.1" graphviz = ">=0.17,<1.0" diff --git a/sql/snsql/sql/_mechanisms/approx_bounds.py b/sql/snsql/sql/_mechanisms/approx_bounds.py index 070f951a..8af36d96 100644 --- a/sql/snsql/sql/_mechanisms/approx_bounds.py +++ b/sql/snsql/sql/_mechanisms/approx_bounds.py @@ -57,7 +57,7 @@ def edges(idx): enable_features('floating-point', 'contrib') discovered_scale = 1.0 / epsilon - input_domain = dp.atom_domain(T=float) + input_domain = dp.atom_domain(T=float, nan=False) input_metric = dp.absolute_distance(T=float) meas = make_laplace(input_domain, input_metric, discovered_scale) diff --git a/sql/snsql/sql/_mechanisms/gaussian.py b/sql/snsql/sql/_mechanisms/gaussian.py index 0ea471c7..b53fcfec 100644 --- a/sql/snsql/sql/_mechanisms/gaussian.py +++ b/sql/snsql/sql/_mechanisms/gaussian.py @@ -38,7 +38,7 @@ def _compute_noise_scale(self): raise ValueError(f"Noise scale is too large using epsilon={self.epsilon} and bounds ({lower}, {upper}) with {self.mechanism}. Try preprocessing to reduce senstivity, or try different privacy parameters.") enable_features('floating-point', 'contrib') - input_domain = dp.vector_domain(dp.atom_domain(T=float)) + input_domain = dp.vector_domain(dp.atom_domain(T=float, nan=False)) input_metric = dp.symmetric_distance() bounded_sum = (input_domain, input_metric) >> dp.t.then_clamp(bounds=bounds) >> dp.t.then_sum() @@ -68,7 +68,7 @@ def release(self, vals): enable_features('contrib') bit_depth = self.bit_depth set_default_int_type(f"i{bit_depth}") - meas = make_gaussian(dp.atom_domain(T=float), dp.absolute_distance(T=float), self.scale) + meas = make_gaussian(dp.atom_domain(T=float, nan=False), dp.absolute_distance(T=float), self.scale) vals = [meas(float(v)) for v in vals] return vals def accuracy(self, alpha): diff --git a/sql/snsql/sql/_mechanisms/laplace.py b/sql/snsql/sql/_mechanisms/laplace.py index 152ea3c8..11306d8c 100644 --- a/sql/snsql/sql/_mechanisms/laplace.py +++ b/sql/snsql/sql/_mechanisms/laplace.py @@ -38,7 +38,7 @@ def _compute_noise_scale(self): enable_features('floating-point', 'contrib') - input_domain = dp.vector_domain(dp.atom_domain(T=float)) + input_domain = dp.vector_domain(dp.atom_domain(T=float, nan=False)) input_metric = dp.symmetric_distance() bounded_sum = (input_domain, input_metric) >> dp.t.then_clamp(bounds=bounds) >> dp.t.then_sum() @@ -64,7 +64,7 @@ def threshold(self): return thresh def release(self, vals): enable_features('floating-point', 'contrib') - input_domain = dp.atom_domain(T=float) + input_domain = dp.atom_domain(T=float, nan=False) input_metric = dp.absolute_distance(T=float) meas = make_laplace(input_domain, input_metric, self.scale) vals = [meas(float(v)) for v in vals] diff --git a/synth/snsynth/transform/standard.py b/synth/snsynth/transform/standard.py index 7dd3792e..0b3602e0 100644 --- a/synth/snsynth/transform/standard.py +++ b/synth/snsynth/transform/standard.py @@ -68,7 +68,7 @@ def _fit_finish(self): enable_features("floating-point", "contrib") - input_domain = dp.vector_domain(dp.atom_domain(T=float), size=n) + input_domain = dp.vector_domain(dp.atom_domain(T=float, nan=False), size=n) input_metric = dp.symmetric_distance() var_pre = (input_domain, input_metric) >> dp.t.then_clamp(bounds) >> dp.t.then_variance() @@ -76,10 +76,10 @@ def _fit_finish(self): v_e = self.epsilon * 0.8 m_e = self.epsilon - v_e - v_s = binary_search_param(lambda s: var_pre >> make_laplace(dp.atom_domain(T=float), dp.absolute_distance(T=float), s), d_in=1, d_out=v_e, T=float) - m_s = binary_search_param(lambda s: mean_pre >> make_laplace(dp.atom_domain(T=float), dp.absolute_distance(T=float), s), d_in=1, d_out=m_e, T=float) - dpvar = var_pre >> make_laplace(dp.atom_domain(T=float), dp.absolute_distance(T=float), v_s) - dpmean = mean_pre >> make_laplace(dp.atom_domain(T=float), dp.absolute_distance(T=float), m_s) + v_s = binary_search_param(lambda s: var_pre >> make_laplace(dp.atom_domain(T=float, nan=False), dp.absolute_distance(T=float), s), d_in=1, d_out=v_e, T=float) + m_s = binary_search_param(lambda s: mean_pre >> make_laplace(dp.atom_domain(T=float, nan=False), dp.absolute_distance(T=float), s), d_in=1, d_out=m_e, T=float) + dpvar = var_pre >> make_laplace(dp.atom_domain(T=float, nan=False), dp.absolute_distance(T=float), v_s) + dpmean = mean_pre >> make_laplace(dp.atom_domain(T=float, nan=False), dp.absolute_distance(T=float), m_s) self.var = dpvar(np.array(self._fit_vals)) self.var = np.clip(self.var, 0.001, (self.fit_upper - self.fit_lower) ** 2 / 4) diff --git a/synth/snsynth/utils.py b/synth/snsynth/utils.py index 1129f3d3..744f69df 100644 --- a/synth/snsynth/utils.py +++ b/synth/snsynth/utils.py @@ -30,7 +30,7 @@ def exponential_mechanism(qualities, epsilon, sensitivity=1.0, base_measure=None def gaussian_noise(sigma, size=None): enable_features('floating-point', 'contrib') - input_domain = dp.atom_domain(T=float) + input_domain = dp.atom_domain(T=float, nan=False) input_metric = dp.absolute_distance(T=float) meas = make_gaussian(input_domain, input_metric, sigma) if size is None: @@ -40,7 +40,7 @@ def gaussian_noise(sigma, size=None): def laplace_noise(scale, size=None): enable_features('floating-point', 'contrib') - input_domain = dp.atom_domain(T=float) + input_domain = dp.atom_domain(T=float, nan=False) input_metric = dp.absolute_distance(T=float) meas = make_laplace(input_domain, input_metric, scale) if size is None: @@ -52,7 +52,7 @@ def cdp_rho(epsilon, delta, max_contrib=1): # return a rho that satisfies (epsilon, delta) budget = (epsilon, delta) enable_features('floating-point', 'contrib') - input_domain = dp.atom_domain(T=float) + input_domain = dp.atom_domain(T=float, nan=False) input_metric = dp.absolute_distance(T=float) def make_adp_gauss(scale): test_gauss = make_gaussian(input_domain, input_metric, scale)