同时计算最大值和总和
Calculate MAX VALUE AND SUM AT THE SAME TIME
对于我的项目,我正在创建一些自定义的 faggregate 函数,用于应用差分隐私。
到目前为止,我已经能够实现 MAX 和 MIN 函数,添加一些拉普拉斯噪声。
我在使用 SUM_LAPLACE 聚合时遇到问题。
我的上限(灵敏度)应该是列中 MAX 值的绝对值。
如何同时计算最大值和总和,然后将两个输出值传递给一个函数?
CREATE OR REPLACE FUNCTION calculateSum(real,real,OUT real, OUT real) AS $$
DECLARE
sumValue real := 0;
max_v real;
BEGIN
IF IS NULL THEN
sumValue := sumValue + ;
ELSIF IS NULL THEN
sumValue := sumValue + ;
ELSIF IS NULL AND IS NULL THEN
sumValue := sumValue;
ELSE
sumValue := + ;
END IF;
max_v = searchmaximumvalue(,);
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION addLaplacianNoiseSum(real) RETURNS real AS $$
DECLARE
epsilon real := 1.2;
sensivity real := (epsilon * 2) + (/2);
laplaceDistribution real;
BEGIN
laplaceDistribution := sensivity / (epsilon);
RETURN + laplaceDistribution;
END;
$$ LANGUAGE plpgsql;
CREATE AGGREGATE SUM_LAPLACE(real)
(
SFUNC = calculateSum,
STYPE = real,
FINALFUNC = addLaplacianNoiseSum
);
函数 searchmaximumvalue($1,$2) 工作正常。
我想从第一个函数 return 求和 max_v 并将它们传递给下面的第二个函数。
我该怎么做?
您可以创建自己的 return 类型:
CREATE TYPE my_type AS (sum real, max_v real);
这可以在SFUNC
内使用:
CREATE OR REPLACE FUNCTION calculateSum(my_type, real) RETURNS my_type -- returns my_type
AS $$
DECLARE
sumValue real := 0;
max_v real;
output my_type; -- new variable of my_type
BEGIN
/* A LOT OF CODE HERE */
output.sum := sumValue;
output.max_v := max_v;
RETURN output;
END;
$$ LANGUAGE plpgsql;
当然还有 FINALFUNC
的输入:
CREATE OR REPLACE FUNCTION addLaplacianNoiseSum(my_type) RETURNS real AS $$
在 FINALFUNC
:
中使用
.max_v
.sum
你的总和看起来像
CREATE AGGREGATE SUM_LAPLACE(real) (
SFUNC = calculateSum,
STYPE = my_type, -- return type == my_type
FINALFUNC = addLaplacianNoiseSum
);
对于我的项目,我正在创建一些自定义的 faggregate 函数,用于应用差分隐私。 到目前为止,我已经能够实现 MAX 和 MIN 函数,添加一些拉普拉斯噪声。 我在使用 SUM_LAPLACE 聚合时遇到问题。 我的上限(灵敏度)应该是列中 MAX 值的绝对值。
如何同时计算最大值和总和,然后将两个输出值传递给一个函数?
CREATE OR REPLACE FUNCTION calculateSum(real,real,OUT real, OUT real) AS $$
DECLARE
sumValue real := 0;
max_v real;
BEGIN
IF IS NULL THEN
sumValue := sumValue + ;
ELSIF IS NULL THEN
sumValue := sumValue + ;
ELSIF IS NULL AND IS NULL THEN
sumValue := sumValue;
ELSE
sumValue := + ;
END IF;
max_v = searchmaximumvalue(,);
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION addLaplacianNoiseSum(real) RETURNS real AS $$
DECLARE
epsilon real := 1.2;
sensivity real := (epsilon * 2) + (/2);
laplaceDistribution real;
BEGIN
laplaceDistribution := sensivity / (epsilon);
RETURN + laplaceDistribution;
END;
$$ LANGUAGE plpgsql;
CREATE AGGREGATE SUM_LAPLACE(real)
(
SFUNC = calculateSum,
STYPE = real,
FINALFUNC = addLaplacianNoiseSum
);
函数 searchmaximumvalue($1,$2) 工作正常。 我想从第一个函数 return 求和 max_v 并将它们传递给下面的第二个函数。 我该怎么做?
您可以创建自己的 return 类型:
CREATE TYPE my_type AS (sum real, max_v real);
这可以在SFUNC
内使用:
CREATE OR REPLACE FUNCTION calculateSum(my_type, real) RETURNS my_type -- returns my_type
AS $$
DECLARE
sumValue real := 0;
max_v real;
output my_type; -- new variable of my_type
BEGIN
/* A LOT OF CODE HERE */
output.sum := sumValue;
output.max_v := max_v;
RETURN output;
END;
$$ LANGUAGE plpgsql;
当然还有 FINALFUNC
的输入:
CREATE OR REPLACE FUNCTION addLaplacianNoiseSum(my_type) RETURNS real AS $$
在 FINALFUNC
:
.max_v
.sum
你的总和看起来像
CREATE AGGREGATE SUM_LAPLACE(real) (
SFUNC = calculateSum,
STYPE = my_type, -- return type == my_type
FINALFUNC = addLaplacianNoiseSum
);