@@ -1003,6 +1003,29 @@ def from_gaussian_mechanism(
10031003 "Connect the Dots" algorithm. See Sections 2.1 and 2.2 of supplementary
10041004 material for more details.
10051005
1006+ CORRELATED MULTI-OUTPUT RELEASES
1007+ If the mechanism releases k outputs jointly (M(D) = (f_1(D)+Z_1,...,f_k(D)+Z_k)
1008+ with independent noise Z_i ~ N(0, sigma^2) and coupling f_j(D) = c_j*f_1(D)),
1009+ and an adversary observes all outputs simultaneously, the exact epsilon-hockey-stick
1010+ divergence equals the scalar value at EFFECTIVE SENSITIVITY Delta_eff:
1011+
1012+ Delta_eff = Delta * np.linalg.norm(c_vec) # c_vec = [c_1, ..., c_k]
1013+
1014+ This follows from the joint PLRV L(x) = (Delta/sigma^2)*sum(c_j*x_j) - Delta^2*||c||^2/(2*sigma^2)
1015+ being Gaussian N(Delta_eff^2/(2*sigma^2), Delta_eff^2/sigma^2) under D.
1016+
1017+ Example (2-client FL with coupling c=0.5):
1018+ # INCORRECT for jointly observed outputs:
1019+ delta = from_gaussian_mechanism(sigma, Delta).get_delta_for_epsilon(eps)
1020+
1021+ # CORRECT:
1022+ import numpy as np
1023+ c_vec = [1.0, 0.5] # client coupling coefficients
1024+ Delta_eff = Delta * np.linalg.norm(c_vec)
1025+ delta = from_gaussian_mechanism(sigma, Delta_eff).get_delta_for_epsilon(eps)
1026+
1027+ See https://doi.org/10.5281/zenodo.20078486 for proof and experiments.
1028+
10061029 Args:
10071030 standard_deviation: the standard_deviation of the Gaussian distribution.
10081031 sensitivity: the sensitivity of function f. (i.e. the maximum absolute
0 commit comments