From 4db03812686d67b04a6d5b8fe3e6fa4968589836 Mon Sep 17 00:00:00 2001 From: michaelpatrickpurcell <70675482+michaelpatrickpurcell@users.noreply.github.com> Date: Mon, 16 Nov 2020 13:46:29 +1100 Subject: [PATCH 001/185] Update README.md Removing hyphens from "differentially-private". --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d3b77c9..9ba3b21 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # differential-privacy -Implementations of differentially-private release mechanisms +Implementations of differentially private release mechanisms ## Install @@ -58,7 +58,7 @@ Compute the exact query responses: exact_counts = data["age_group"].value_counts().sort_index() ``` -Create a differentially-private release mechanism: +Create a differentially private release mechanism: ```python from differential_privacy.mechanisms import GeometricMechanism mechanism = GeometricMechanism(epsilon=0.1, sensitivity=1.0) @@ -69,7 +69,7 @@ Compute perturbed query responses: perturbed_counts = mechanism.release(values=exact_counts.values) ``` -Differentially-private release mechanisms are one-time use only: +Differentially private release mechanisms are one-time use only: ```python mechanism = GeometricMechanism(epsilon=0.1, sensitivity=1.0) perturbed_counts = mechanism.release(values=exact_counts.values) # OK @@ -77,7 +77,7 @@ perturbed_counts2 = mechanism.release(values=exact_counts.values) # Exception! # RuntimeError: Mechanism has exhausted has exhausted its privacy budget. ``` -Each release requires its own differentially-private release mechanism. +Each release requires its own differentially private release mechanism. ```python mechanism = GeometricMechanism(epsilon=0.1, sensitivity=1.0) perturbed_counts = mechanism.release(values=exact_counts.values) # OK From f00f843f9110ee47585d8fce1ed6256001c575ce Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 16 Nov 2020 14:18:40 +1100 Subject: [PATCH 002/185] change old test to run on develop --- .github/workflows/python-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 40190c9..b5622e5 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -5,9 +5,9 @@ name: Python package on: push: - branches: [ master ] + branches: [ develop ] pull_request: - branches: [ master ] + branches: [ develop ] jobs: build: From f257dc6c0d659c6364120e0d1d500ab934fa5e47 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Mon, 16 Nov 2020 16:06:41 +1100 Subject: [PATCH 003/185] Added example for AboveThreshold release mechanism --- .../confirmed_cases_table4_likely_source.csv | 4294 +++++++++++++++++ examples/first_hit_example.py | 54 + examples/histogram_query.py | 32 + 3 files changed, 4380 insertions(+) create mode 100644 examples/confirmed_cases_table4_likely_source.csv create mode 100644 examples/first_hit_example.py create mode 100644 examples/histogram_query.py diff --git a/examples/confirmed_cases_table4_likely_source.csv b/examples/confirmed_cases_table4_likely_source.csv new file mode 100644 index 0000000..7375450 --- /dev/null +++ b/examples/confirmed_cases_table4_likely_source.csv @@ -0,0 +1,4294 @@ +notification_date,postcode,likely_source_of_infection,lhd_2010_code,lhd_2010_name,lga_code19,lga_name19 +2020-01-25,2134,Overseas,X700,Sydney,11300,Burwood (A) +2020-01-25,2121,Overseas,X760,Northern Sydney,16260,Parramatta (C) +2020-01-25,2071,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-01-27,2033,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-01,2163,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-03-01,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-02,2073,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-02,2217,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-02,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-03,2232,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-03,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-03,2196,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-03,2158,Overseas,X760,Northern Sydney,17420,The Hills Shire (A) +2020-03-03,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-03,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-04,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-04,2042,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-04,2113,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-04,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-04,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-04,2087,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-05,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-05,2580,Overseas,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-03-05,2232,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-05,2119,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-06,2087,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-06,2234,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-06,2119,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-06,2115,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-06,2144,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-06,2127,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-06,2119,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-07,2091,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-07,2163,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-03-08,2115,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-08,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-08,2116,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-08,2777,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-08,2077,Locally acquired - source not identified,X760,Northern Sydney,14000,Hornsby (A) +2020-03-08,2116,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-08,2028,Interstate,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-09,2769,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-09,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-03-09,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-09,2043,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-09,2115,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-09,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-09,2765,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-09,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-09,2064,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,18250,Willoughby (C) +2020-03-09,2117,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-09,2761,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-09,2040,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-09,2116,Locally acquired - source not identified,X740,Western Sydney,16260,Parramatta (C) +2020-03-10,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-10,2777,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-10,2047,Overseas,X700,Sydney,11520,Canada Bay (A) +2020-03-10,2076,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-10,2749,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-10,2029,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-11,2766,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-11,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-11,2110,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-11,2800,Overseas,X850,Western NSW,16150,Orange (C) +2020-03-11,2119,Locally acquired - source not identified,X760,Northern Sydney,14000,Hornsby (A) +2020-03-11,2020,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-11,2800,Overseas,X850,Western NSW,16150,Orange (C) +2020-03-11,2207,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-11,2217,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-11,2120,Locally acquired - source not identified,X760,Northern Sydney,14000,Hornsby (A) +2020-03-11,2126,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-11,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-11,2257,Locally acquired - source not identified,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-11,2114,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-11,2766,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-11,2096,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-12,2204,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-12,2122,Interstate,X760,Northern Sydney,16700,Ryde (C) +2020-03-12,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-12,2763,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-12,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-12,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-12,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-12,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-12,2120,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-12,2566,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-12,2127,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-12,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-12,2800,Overseas,X850,Western NSW,16150,Orange (C) +2020-03-12,2756,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-13,2218,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-13,2456,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-03-13,2089,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-03-13,2456,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-03-13,2769,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-13,2027,Locally acquired - source not identified,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-13,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-13,2207,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-13,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-13,2029,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-13,2325,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,11720,Cessnock (C) +2020-03-13,2576,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-13,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-13,2112,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-03-13,2027,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-13,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-13,2773,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-13,2224,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-13,2015,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-14,2008,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-14,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-14,2093,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-14,2479,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-14,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-14,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-14,2127,Interstate,X740,Western Sydney,16260,Parramatta (C) +2020-03-14,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-14,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-14,2125,Locally acquired - source not identified,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-14,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-14,2110,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-14,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-14,2224,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-14,2141,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-14,2760,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-14,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-14,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-03-14,2087,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-14,2011,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-15,2090,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-03-15,2117,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-15,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-15,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-15,2306,Locally acquired - source not identified,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-15,2517,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-15,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-15,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-15,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-15,,Overseas,,,, +2020-03-15,2029,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-15,2015,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-15,2575,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-15,2093,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-15,2204,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-15,,Interstate,,,, +2020-03-15,2450,Locally acquired - source not identified,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-03-15,2193,Locally acquired - source not identified,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-15,2160,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-15,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-15,2756,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-15,2025,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-15,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-15,2163,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-03-15,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-15,2028,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-15,2151,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-15,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-15,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-15,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-15,2065,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-15,2128,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-15,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-15,2027,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-15,2110,Locally acquired - source not identified,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-15,2204,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-15,2325,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,11720,Cessnock (C) +2020-03-15,2325,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,11720,Cessnock (C) +2020-03-16,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-16,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-16,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-16,2070,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-16,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-16,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-16,2516,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-16,2425,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-16,2206,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-16,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-16,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-16,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-16,2121,Overseas,X760,Northern Sydney,16260,Parramatta (C) +2020-03-16,2125,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-16,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-16,2040,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-16,2575,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-16,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-16,2125,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-16,2080,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-16,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-16,2228,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-16,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-16,2430,Locally acquired - source not identified,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-16,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-16,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-16,2207,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-16,2089,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-16,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-17,2064,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-17,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-17,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-17,2090,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-03-17,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-17,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-17,2097,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-17,2233,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-17,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-17,2118,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-17,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-17,2231,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-17,2100,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-17,2297,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15900,Newcastle (C) +2020-03-17,2064,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-17,2104,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-17,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-17,2101,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-17,2067,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-17,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-17,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-17,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-17,2795,Overseas,X850,Western NSW,10470,Bathurst Regional (A) +2020-03-17,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-17,2800,Locally acquired - contact of a confirmed case and/or in a known cluster,X850,Western NSW,16150,Orange (C) +2020-03-17,2297,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15900,Newcastle (C) +2020-03-17,2749,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-17,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-17,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-17,2072,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-17,2749,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-17,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-17,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-17,2042,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-17,2577,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-17,2019,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-17,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-17,2069,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-17,2093,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-17,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-17,2533,Overseas,X730,Illawarra Shoalhaven,14400,Kiama (A) +2020-03-17,2110,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-17,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-17,2070,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-17,2216,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-17,2132,Overseas,X700,Sydney,11300,Burwood (A) +2020-03-17,2142,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-17,2229,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-17,2481,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-17,2041,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-17,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-17,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-17,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-17,2260,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-17,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-03-17,2298,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-17,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-17,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-17,2018,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-17,2225,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-17,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-17,2535,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-17,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-17,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-03-18,2230,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-18,2021,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-18,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-18,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-18,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-18,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-18,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-18,2141,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-18,2048,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-18,2061,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-18,2010,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-18,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-18,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-18,2021,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-18,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-18,2768,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-18,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-18,2557,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-03-18,2026,Interstate,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-18,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2199,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-18,2229,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-18,2487,Interstate,X810,Northern NSW,17550,Tweed (A) +2020-03-18,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-18,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-18,2484,Locally acquired - source not identified,X810,Northern NSW,17550,Tweed (A) +2020-03-18,2323,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-18,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-18,2760,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-18,2760,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-18,2029,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-18,2119,Locally acquired - source not identified,X760,Northern Sydney,14000,Hornsby (A) +2020-03-18,2518,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-18,2230,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-18,2234,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-18,2540,Locally acquired - source not identified,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-18,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-19,2072,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-19,2032,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-19,2203,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-19,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-19,2021,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-19,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-19,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-19,2278,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-19,2280,Locally acquired - source not identified,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-19,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-19,2150,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-19,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-19,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-19,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-19,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-19,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-19,2779,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-19,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-19,2093,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-19,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-19,2756,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-19,2027,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-19,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-19,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-19,2111,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-19,2260,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-19,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-19,2278,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-19,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-19,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-19,2533,Overseas,X730,Illawarra Shoalhaven,14400,Kiama (A) +2020-03-19,2033,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-19,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-19,2194,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-19,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-19,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-19,2421,Overseas,X800,Hunter New England,12700,Dungog (A) +2020-03-19,2037,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-19,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-19,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-19,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-19,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-19,2517,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-19,2119,Locally acquired - source not identified,X760,Northern Sydney,14000,Hornsby (A) +2020-03-19,2759,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-19,2036,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-19,2034,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-19,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-03-19,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-19,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-19,2018,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-19,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-19,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-19,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-19,2162,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-19,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-20,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2140,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-03-20,2575,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-20,2233,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-20,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2264,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-20,2421,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,12700,Dungog (A) +2020-03-20,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-20,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2193,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-20,2210,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-20,2170,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-03-20,2120,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-20,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,2022,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2264,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-20,2190,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-20,2042,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-20,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2800,Locally acquired - source not identified,X850,Western NSW,16150,Orange (C) +2020-03-20,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-20,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-20,2321,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15050,Maitland (C) +2020-03-20,2120,Locally acquired - source not identified,X760,Northern Sydney,14000,Hornsby (A) +2020-03-20,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-20,2199,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-20,2576,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-20,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,2131,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-20,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,,Overseas,,,, +2020-03-20,2069,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-20,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-20,2773,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-20,2113,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-20,2117,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-20,2427,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-20,2119,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-20,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-20,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-20,2795,Overseas,X850,Western NSW,10470,Bathurst Regional (A) +2020-03-20,2224,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-20,,Overseas,,,, +2020-03-20,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-20,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,2029,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,2093,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-20,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-20,2283,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-20,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-20,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-20,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,2147,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-20,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2193,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-20,2577,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-20,2219,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-20,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-20,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2320,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-20,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-20,2114,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-20,2114,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-20,2519,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-20,2106,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-20,2090,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-03-20,2325,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,11720,Cessnock (C) +2020-03-20,2576,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-20,2158,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,17420,The Hills Shire (A) +2020-03-20,2193,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-20,2230,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-20,2086,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-20,2199,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-20,2460,Overseas,X810,Northern NSW,11730,Clarence Valley (A) +2020-03-20,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-20,2343,Overseas,X800,Hunter New England,14920,Liverpool Plains (A) +2020-03-20,2233,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-21,2756,Locally acquired - source not identified,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-21,2038,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-21,2118,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-21,2621,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-03-21,2140,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-03-21,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-21,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-21,2620,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-03-21,2548,Overseas,X830,Southern NSW,10550,Bega Valley (A) +2020-03-21,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2261,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-21,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-21,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-21,2261,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-21,2548,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,10550,Bega Valley (A) +2020-03-21,2283,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-21,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-21,2536,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-03-21,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-21,2213,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-21,2230,Interstate,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-21,2291,Interstate,X800,Hunter New England,15900,Newcastle (C) +2020-03-21,2230,Interstate,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-21,2204,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-03-21,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-21,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2565,Locally acquired - source not identified,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-21,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-21,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-21,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-21,2040,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-03-21,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2027,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-21,2042,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-03-21,2564,Locally acquired - source not identified,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-21,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-21,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-21,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-21,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-21,2024,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-21,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-21,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-21,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2250,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-21,2257,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2234,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-21,2760,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-21,2024,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-21,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-21,2262,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-21,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2234,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-21,2234,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-21,2170,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-03-21,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2218,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-21,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-21,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-21,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2029,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-21,2527,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-21,2018,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-21,2036,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-21,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-21,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-21,2065,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-21,2097,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2100,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2085,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2089,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-21,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-21,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2069,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-21,2141,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-21,2084,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-21,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-21,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2305,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-21,2226,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-21,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-21,2303,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15900,Newcastle (C) +2020-03-21,2096,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-21,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-21,2525,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-21,2546,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-03-21,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2224,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-21,2070,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-21,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-21,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-21,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-21,2068,Locally acquired - source not identified,X760,Northern Sydney,18250,Willoughby (C) +2020-03-21,2120,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-21,2071,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-21,2106,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-21,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-21,2519,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-21,2060,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-21,2567,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-03-21,2155,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-22,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-22,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-22,2207,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-22,2009,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-22,2528,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-22,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-22,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-22,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-22,2114,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-22,2207,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-22,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-22,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-22,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-22,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-22,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-22,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-22,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-22,2528,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-22,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-22,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-22,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-22,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-22,2234,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-22,2340,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-22,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-22,2558,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-22,2795,Overseas,X850,Western NSW,10470,Bathurst Regional (A) +2020-03-22,2795,Overseas,X850,Western NSW,10470,Bathurst Regional (A) +2020-03-22,2799,Overseas,X850,Western NSW,10850,Blayney (A) +2020-03-22,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-22,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-22,2753,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-22,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-22,2162,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-22,2199,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-22,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-22,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-22,2115,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-22,2016,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-22,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-22,2641,Overseas,X921,Network with Vic,10050,Albury (C) +2020-03-22,2040,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-22,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-22,2548,Overseas,X830,Southern NSW,10550,Bega Valley (A) +2020-03-22,2204,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-03-22,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-22,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-22,2477,Overseas,X810,Northern NSW,10250,Ballina (A) +2020-03-22,2264,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-22,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-22,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-22,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-22,2763,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-03-22,2558,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-22,2476,Interstate,X810,Northern NSW,17400,Tenterfield (A) +2020-03-22,2125,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-22,2170,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-03-22,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-22,2088,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15350,Mosman (A) +2020-03-22,2088,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15350,Mosman (A) +2020-03-22,2000,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-22,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-22,2465,Overseas,X810,Northern NSW,11730,Clarence Valley (A) +2020-03-22,2009,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-22,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-22,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-22,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-22,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-22,2439,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-22,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-22,2256,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-22,2229,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-22,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-22,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-22,2305,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15900,Newcastle (C) +2020-03-22,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-22,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-22,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-22,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-22,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-22,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-22,2197,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-22,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-22,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-22,2232,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-22,2316,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-22,2197,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-22,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-22,2089,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-22,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-22,2566,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-22,2102,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-22,2072,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-22,2340,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-22,2072,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-22,2060,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-22,2227,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-22,2118,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-22,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-22,2040,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-22,2463,Overseas,X810,Northern NSW,11730,Clarence Valley (A) +2020-03-22,2476,Interstate,X810,Northern NSW,17400,Tenterfield (A) +2020-03-22,2621,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-03-22,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-22,2199,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-22,2541,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-22,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-22,2575,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-22,2576,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-22,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-22,2041,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-22,2097,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-22,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-22,2208,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-22,2023,Locally acquired - source not identified,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-22,2092,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-22,2110,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-22,2298,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-22,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-22,2320,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-22,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-23,2799,Overseas,X850,Western NSW,10850,Blayney (A) +2020-03-23,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-23,2799,Overseas,X850,Western NSW,10850,Blayney (A) +2020-03-23,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-23,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-23,2227,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-23,2768,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-23,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2621,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-03-23,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2040,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-03-23,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-23,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2159,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-23,2094,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-23,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2191,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-23,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-23,2100,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-23,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2233,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-23,2072,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-23,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-23,2015,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-23,2345,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-23,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-23,2024,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2173,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-03-23,2535,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-23,2285,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-23,2533,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,14400,Kiama (A) +2020-03-23,2518,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-23,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-23,2172,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-23,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-23,2022,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-23,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2038,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-23,2132,Overseas,X700,Sydney,11300,Burwood (A) +2020-03-23,2212,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-23,2360,Overseas,X800,Hunter New England,14200,Inverell (A) +2020-03-23,2508,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-23,2360,Overseas,X800,Hunter New England,14200,Inverell (A) +2020-03-23,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-23,2211,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-23,2017,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-23,2120,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-23,2041,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-23,2191,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-23,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-23,2156,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-23,2151,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-23,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-23,2431,Overseas,X820,Mid North Coast,14350,Kempsey (A) +2020-03-23,2343,Overseas,X800,Hunter New England,14920,Liverpool Plains (A) +2020-03-23,2028,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-23,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-23,2790,Overseas,X750,Nepean Blue Mountains,14870,Lithgow (C) +2020-03-23,2043,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-23,,Overseas,,,, +2020-03-23,2234,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-23,2490,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-23,2048,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-23,2487,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-23,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-23,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-23,2026,Interstate,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-23,2448,Overseas,X820,Mid North Coast,15700,Nambucca (A) +2020-03-23,2323,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-23,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-23,2783,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-23,2830,Overseas,X850,Western NSW,12390,Dubbo Regional (A) +2020-03-23,2850,Overseas,X850,Western NSW,15270,Mid-Western Regional (A) +2020-03-23,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-23,2774,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-23,2760,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-23,2830,Overseas,X850,Western NSW,12390,Dubbo Regional (A) +2020-03-23,2580,Overseas,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-03-23,2580,Overseas,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-03-23,2300,Locally acquired - source not identified,X800,Hunter New England,15900,Newcastle (C) +2020-03-23,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-23,2478,Locally acquired - contact of a confirmed case and/or in a known cluster,X810,Northern NSW,10250,Ballina (A) +2020-03-23,2315,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-23,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-23,2157,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-23,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-23,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-23,2154,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-23,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-23,2575,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-23,2261,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-23,2262,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-23,2038,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-23,2262,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-23,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-23,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-23,2487,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-23,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-23,2486,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-23,2486,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-23,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-23,2487,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-23,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-23,2234,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-23,2113,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-23,2232,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-23,2205,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-23,2283,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-23,2280,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-23,2280,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-23,2290,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-23,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-23,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-23,2283,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-23,2304,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-23,2304,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-23,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-23,2320,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-23,2324,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-23,2264,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-23,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-23,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-23,2324,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-23,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-23,2480,Overseas,X810,Northern NSW,14850,Lismore (C) +2020-03-23,2282,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-23,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-23,2322,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-23,2156,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-23,2037,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-23,2250,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-23,2421,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,12700,Dungog (A) +2020-03-23,2528,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-23,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-23,2567,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-03-23,2060,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-23,2357,Overseas,X850,Western NSW,18020,Warrumbungle Shire (A) +2020-03-23,2032,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-23,2036,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-23,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-23,2122,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-23,2122,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-23,2118,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-23,2107,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-23,2541,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-23,2528,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-23,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-23,2089,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-23,2142,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-23,2530,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-23,2065,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-23,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2065,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-23,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-23,2102,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-23,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-23,2219,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-23,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-23,2152,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-23,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-23,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-23,2065,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-23,2229,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-23,2756,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-23,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-23,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-23,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-23,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-23,2232,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-23,2026,Interstate,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-23,2060,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-24,2016,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-24,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-24,2286,Locally acquired - source not identified,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-24,2065,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-24,2650,Overseas,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-03-24,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-24,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2111,Locally acquired - source not identified,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-24,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-24,2219,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-24,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2261,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-24,2481,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-24,2096,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2015,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-24,2050,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-24,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2088,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15350,Mosman (A) +2020-03-24,2580,Overseas,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-03-24,2316,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-24,2073,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-24,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-24,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2446,Interstate,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-24,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-24,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-24,2030,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2445,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-24,2340,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-24,2263,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2759,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2650,Overseas,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-03-24,2016,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-03-24,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2548,Overseas,X830,Southern NSW,10550,Bega Valley (A) +2020-03-24,2023,Interstate,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-24,2323,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-24,2340,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-24,2029,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-24,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2101,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2101,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-24,2062,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-24,2340,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-24,2060,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-03-24,2317,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-24,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-24,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-24,2017,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-24,2007,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-24,2759,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2007,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-24,2866,Overseas,X850,Western NSW,11400,Cabonne (A) +2020-03-24,2646,Overseas,X840,Murrumbidgee,12870,Federation (A) +2020-03-24,2590,Overseas,X840,Murrumbidgee,12160,Cootamundra-Gundagai Regional (A) +2020-03-24,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-24,2323,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-24,2680,Overseas,X840,Murrumbidgee,13450,Griffith (C) +2020-03-24,2756,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-24,2171,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-24,2135,Overseas,X700,Sydney,17100,Strathfield (A) +2020-03-24,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-24,2142,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-24,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-24,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2031,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-24,2620,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-03-24,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-24,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2536,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-03-24,,Overseas,,,, +2020-03-24,2113,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-03-24,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-24,2280,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-24,2759,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2760,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2777,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-24,2042,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-24,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-24,2171,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-24,2196,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-24,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2196,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-24,2795,Overseas,X850,Western NSW,10470,Bathurst Regional (A) +2020-03-24,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-24,2767,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-24,2753,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-24,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2164,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-03-24,2164,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-03-24,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-24,2016,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-24,2088,Locally acquired - source not identified,X760,Northern Sydney,15350,Mosman (A) +2020-03-24,2646,Overseas,X840,Murrumbidgee,12870,Federation (A) +2020-03-24,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-24,,Overseas,,,, +2020-03-24,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-24,2335,Overseas,X800,Hunter New England,17000,Singleton (A) +2020-03-24,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-24,2465,Overseas,X810,Northern NSW,11730,Clarence Valley (A) +2020-03-24,2759,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-24,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2753,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-24,2640,Overseas,X921,Network with Vic,10050,Albury (C) +2020-03-24,2758,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-24,2753,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-24,2340,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-24,2795,Overseas,X850,Western NSW,10470,Bathurst Regional (A) +2020-03-24,2093,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2090,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-03-24,2298,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-24,2330,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,17000,Singleton (A) +2020-03-24,2125,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-24,2017,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-24,2068,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,18250,Willoughby (C) +2020-03-24,2303,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-24,2299,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-24,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-24,2262,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2092,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-24,2106,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2020,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-24,2022,Interstate,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2786,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-24,2112,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-03-24,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-24,2122,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-24,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-24,2120,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-24,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-24,2281,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-24,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-24,2069,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-24,2227,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-24,2227,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-24,2530,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-24,2530,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-24,2539,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-24,2096,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2220,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-24,2199,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-24,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2092,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-24,2540,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-24,2199,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-24,2283,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-24,2324,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-24,2318,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-24,2283,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-24,2322,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-24,2120,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-24,2093,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-24,2162,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-24,2208,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-24,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-24,2103,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-24,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-24,2085,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-24,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-24,2022,Interstate,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-24,2325,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,11720,Cessnock (C) +2020-03-24,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-24,2218,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-24,2577,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-24,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-24,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-24,2079,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-24,2759,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-24,2250,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-24,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-24,2120,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-24,2120,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-24,2125,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-25,2317,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-25,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2042,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-25,2250,Locally acquired - source not identified,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2360,Overseas,X800,Hunter New England,14200,Inverell (A) +2020-03-25,2211,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-25,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2340,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-25,2479,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-25,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-25,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-03-25,2480,Overseas,X810,Northern NSW,14850,Lismore (C) +2020-03-25,2029,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2321,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-25,2035,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-25,2631,Overseas,X830,Southern NSW,17040,Snowy Monaro Regional (A) +2020-03-25,2766,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-25,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2327,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-25,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-25,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-25,2289,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-25,2211,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-25,2117,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-25,2820,Overseas,X850,Western NSW,12390,Dubbo Regional (A) +2020-03-25,2530,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-25,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-25,2076,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-25,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2810,Overseas,X850,Western NSW,18100,Weddin (A) +2020-03-25,2159,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-25,2017,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-25,2021,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-25,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2233,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-25,2233,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-25,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-25,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-25,2131,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-25,2519,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-25,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-25,2322,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-25,2820,Overseas,X850,Western NSW,12390,Dubbo Regional (A) +2020-03-25,2830,Locally acquired - source not identified,X850,Western NSW,12390,Dubbo Regional (A) +2020-03-25,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-25,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-25,2203,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-03-25,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-25,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-25,2140,Locally acquired - source not identified,X700,Sydney,17100,Strathfield (A) +2020-03-25,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-03-25,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-25,2066,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-25,2821,Locally acquired - contact of a confirmed case and/or in a known cluster,X850,Western NSW,15850,Narromine (A) +2020-03-25,2047,Overseas,X700,Sydney,11520,Canada Bay (A) +2020-03-25,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-25,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-25,2327,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-25,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2121,Overseas,X760,Northern Sydney,16260,Parramatta (C) +2020-03-25,2650,Overseas,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-03-25,2027,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-25,2641,Overseas,X921,Network with Vic,10050,Albury (C) +2020-03-25,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-25,2095,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2090,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-25,2102,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2090,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-25,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-25,2131,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-25,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-25,2206,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-25,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-25,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-25,2102,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2102,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2259,Locally acquired - source not identified,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2171,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-25,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-25,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-25,2113,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-03-25,2780,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-25,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-25,2070,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-25,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2765,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-25,2765,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-25,2219,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-25,2046,Locally acquired - source not identified,X700,Sydney,11520,Canada Bay (A) +2020-03-25,2011,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-25,2126,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-25,2110,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-25,2110,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-25,2112,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-03-25,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-25,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-25,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-25,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-25,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-25,2337,Overseas,X800,Hunter New England,17620,Upper Hunter Shire (A) +2020-03-25,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-25,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-03-25,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-25,2640,Overseas,X921,Network with Vic,10050,Albury (C) +2020-03-25,2644,Overseas,X840,Murrumbidgee,13340,Greater Hume Shire (A) +2020-03-25,2577,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-25,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2300,Locally acquired - source not identified,X800,Hunter New England,15900,Newcastle (C) +2020-03-25,2660,Overseas,X840,Murrumbidgee,13340,Greater Hume Shire (A) +2020-03-25,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-25,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-25,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-25,2754,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-25,2757,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-25,2256,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2779,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-25,2062,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-25,2131,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-25,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2850,Overseas,X850,Western NSW,15270,Mid-Western Regional (A) +2020-03-25,2569,Interstate,X710,South Western Sydney,18400,Wollondilly (A) +2020-03-25,2007,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-25,2044,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-25,2209,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-25,2044,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-25,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-03-25,2021,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2043,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-25,2155,Locally acquired - source not identified,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-25,2527,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-25,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2035,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-25,2094,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2371,Overseas,X800,Hunter New England,13010,Glen Innes Severn (A) +2020-03-25,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2536,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-03-25,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-25,2320,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-25,2076,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-25,2228,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-25,2016,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-25,2527,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-25,2097,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2290,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-25,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2280,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-25,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-25,2092,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-25,2323,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-25,2194,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-25,2478,Overseas,X810,Northern NSW,10250,Ballina (A) +2020-03-25,2580,Interstate,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-03-25,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-25,2528,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-25,2068,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,18250,Willoughby (C) +2020-03-25,2036,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-25,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-25,2315,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-25,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-25,2371,Overseas,X800,Hunter New England,13010,Glen Innes Severn (A) +2020-03-25,2541,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-25,2550,Overseas,X830,Southern NSW,10550,Bega Valley (A) +2020-03-25,2010,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-25,2090,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-25,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-25,2749,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-25,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-25,1871,Overseas,,,, +2020-03-25,2216,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-25,2315,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-25,2224,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-25,2096,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,,Overseas,,,, +2020-03-25,2191,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-25,2107,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-25,2062,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-25,,Overseas,,,, +2020-03-25,2041,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-25,2041,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-25,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-25,2281,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-25,2290,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-25,2508,Locally acquired - source not identified,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-25,2207,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-25,2290,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-25,2525,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-25,2162,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-25,2290,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-25,2779,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-25,2525,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-25,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-25,2321,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-26,2101,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2232,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-26,2096,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-26,2229,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-26,2200,Locally acquired - source not identified,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-26,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2640,Overseas,X921,Network with Vic,10050,Albury (C) +2020-03-26,2646,Overseas,X840,Murrumbidgee,12870,Federation (A) +2020-03-26,2220,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-26,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-26,2774,Interstate,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-26,2627,Overseas,X830,Southern NSW,17040,Snowy Monaro Regional (A) +2020-03-26,2627,Overseas,X830,Southern NSW,17040,Snowy Monaro Regional (A) +2020-03-26,2050,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-26,2650,Locally acquired - source not identified,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-03-26,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-26,2044,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-26,2041,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-26,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-26,2483,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-26,2161,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-26,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-26,,Overseas,,,, +2020-03-26,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-26,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-26,2582,Overseas,X830,Southern NSW,18710,Yass Valley (A) +2020-03-26,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2213,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-26,2148,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-03-26,2090,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-26,2315,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-26,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-26,2096,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2647,Overseas,X840,Murrumbidgee,12870,Federation (A) +2020-03-26,2640,Overseas,X921,Network with Vic,10050,Albury (C) +2020-03-26,2232,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-26,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-26,2000,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-26,2015,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-26,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-26,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2010,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-26,2680,Overseas,X840,Murrumbidgee,13450,Griffith (C) +2020-03-26,2580,Overseas,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-03-26,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2257,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2010,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-26,2190,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-26,2176,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-03-26,2155,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-26,2176,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-03-26,2176,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-03-26,2548,Overseas,X830,Southern NSW,10550,Bega Valley (A) +2020-03-26,2548,Overseas,X830,Southern NSW,10550,Bega Valley (A) +2020-03-26,2126,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-26,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-26,2095,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-26,2680,Overseas,X840,Murrumbidgee,13450,Griffith (C) +2020-03-26,2257,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-26,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-26,2204,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-26,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-26,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-26,2340,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-26,2170,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-03-26,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2506,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-26,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-26,2040,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-26,2257,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2094,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2261,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2261,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2795,Overseas,X850,Western NSW,10470,Bathurst Regional (A) +2020-03-26,2229,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-26,2582,Overseas,X830,Southern NSW,18710,Yass Valley (A) +2020-03-26,2035,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-26,2753,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-26,2110,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-26,2333,Overseas,X800,Hunter New England,15650,Muswellbrook (A) +2020-03-26,2178,Overseas,X710,South Western Sydney,16350,Penrith (C) +2020-03-26,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2009,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-03-26,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2076,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-26,2571,Locally acquired - source not identified,X710,South Western Sydney,18400,Wollondilly (A) +2020-03-26,2088,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15350,Mosman (A) +2020-03-26,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2171,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-26,2122,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-03-26,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-26,2824,Overseas,X850,Western NSW,17950,Warren (A) +2020-03-26,2564,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-26,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-26,2088,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15350,Mosman (A) +2020-03-26,2110,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-26,2284,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-26,2199,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-26,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-03-26,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2040,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-03-26,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2096,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2206,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-26,2292,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-26,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-26,2630,Overseas,X830,Southern NSW,17040,Snowy Monaro Regional (A) +2020-03-26,2010,Interstate,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-26,2016,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-26,2199,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-26,2191,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-26,2318,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-26,2138,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-03-26,2137,Overseas,X700,Sydney,11520,Canada Bay (A) +2020-03-26,2017,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-26,2627,Overseas,X830,Southern NSW,17040,Snowy Monaro Regional (A) +2020-03-26,2322,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-26,2305,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-26,2315,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-26,2193,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-26,2515,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-26,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-26,2085,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2517,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-26,2259,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2320,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15050,Maitland (C) +2020-03-26,2783,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-26,2619,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-03-26,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-26,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2322,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-26,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-26,2756,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-26,,Overseas,,,, +2020-03-26,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-26,2283,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-26,2323,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-26,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-26,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-26,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-26,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-03-26,2035,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-26,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-26,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-26,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-26,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-26,2767,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-26,2114,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-26,2223,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-26,2151,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-26,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-26,2486,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-26,2026,Interstate,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-26,2229,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-26,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-26,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-26,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-26,2621,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-03-26,2486,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-26,2486,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-26,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-26,2250,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-26,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-26,2094,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2068,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,18250,Willoughby (C) +2020-03-26,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-26,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-26,2092,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2102,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-26,2132,Overseas,X700,Sydney,11300,Burwood (A) +2020-03-26,2050,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-26,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2780,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-27,2090,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2084,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-27,2316,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-27,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-27,2026,Interstate,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2759,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-27,2646,Overseas,X840,Murrumbidgee,12870,Federation (A) +2020-03-27,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-27,2090,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-27,2745,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-27,2536,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-03-27,2581,Overseas,X830,Southern NSW,17640,Upper Lachlan Shire (A) +2020-03-27,2251,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-27,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-27,2068,Locally acquired - source not identified,X760,Northern Sydney,18250,Willoughby (C) +2020-03-27,2576,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-27,2161,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-27,2071,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-27,2320,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-27,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-27,2515,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-27,2070,Interstate,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-27,2581,Overseas,X830,Southern NSW,17640,Upper Lachlan Shire (A) +2020-03-27,2036,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-27,2287,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15900,Newcastle (C) +2020-03-27,2317,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-27,2620,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-03-27,2153,Interstate,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-27,2526,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-27,2528,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-27,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2756,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-27,2716,Overseas,X840,Murrumbidgee,15560,Murrumbidgee (A) +2020-03-27,2756,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-27,2234,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-27,,Overseas,,,, +2020-03-27,2515,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-27,2756,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-27,2207,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-27,2440,Overseas,X820,Mid North Coast,14350,Kempsey (A) +2020-03-27,2540,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-27,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-27,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-27,2040,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-27,2340,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-27,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2220,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2290,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-27,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-27,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-27,2300,Interstate,X800,Hunter New England,15900,Newcastle (C) +2020-03-27,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2142,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-27,2089,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2171,Interstate,X710,South Western Sydney,14900,Liverpool (C) +2020-03-27,2567,Locally acquired - source not identified,X710,South Western Sydney,11450,Camden (A) +2020-03-27,2480,Overseas,X810,Northern NSW,14850,Lismore (C) +2020-03-27,2517,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-27,2192,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-27,2160,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-27,2204,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-27,2122,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-27,2120,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-27,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-27,2122,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-03-27,2035,Interstate,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-27,2120,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-27,2113,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-03-27,2072,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-27,2024,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-27,2066,Interstate,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-27,2060,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-27,2137,Overseas,X700,Sydney,11520,Canada Bay (A) +2020-03-27,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2749,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-27,2749,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-27,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-27,2171,Interstate,X710,South Western Sydney,14900,Liverpool (C) +2020-03-27,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2209,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2209,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2046,Locally acquired - source not identified,X700,Sydney,11520,Canada Bay (A) +2020-03-27,2209,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-27,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-27,2209,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2168,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-27,2018,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-27,2209,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2566,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-27,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-27,2037,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-27,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-27,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-27,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-27,2021,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-27,2070,Interstate,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-27,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-27,2062,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2540,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-27,2044,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-27,2216,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-27,2866,Overseas,X850,Western NSW,11400,Cabonne (A) +2020-03-27,2257,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2250,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2112,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-27,2546,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-03-27,2112,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-27,2761,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-27,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-27,2060,Locally acquired - source not identified,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2716,Overseas,X840,Murrumbidgee,15560,Murrumbidgee (A) +2020-03-27,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2262,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-27,2262,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2480,Overseas,X810,Northern NSW,14850,Lismore (C) +2020-03-27,2372,Locally acquired - source not identified,X800,Hunter New England,17400,Tenterfield (A) +2020-03-27,2204,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-03-27,2160,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-27,2116,Locally acquired - source not identified,X740,Western Sydney,16260,Parramatta (C) +2020-03-27,2015,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-27,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-27,2428,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-27,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-27,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-27,2800,Overseas,X850,Western NSW,16150,Orange (C) +2020-03-27,2427,Locally acquired - source not identified,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-27,2089,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2119,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-27,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-27,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-27,2011,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-27,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-27,2022,Interstate,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2062,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2843,Overseas,X850,Western NSW,18020,Warrumbungle Shire (A) +2020-03-27,2464,Overseas,X810,Northern NSW,11730,Clarence Valley (A) +2020-03-27,2067,Locally acquired - source not identified,X760,Northern Sydney,18250,Willoughby (C) +2020-03-27,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-27,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-27,2131,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-27,2039,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-27,2278,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-27,2515,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-27,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-27,2443,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-27,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-27,2283,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-27,2567,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-03-27,2566,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-27,2061,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-27,2548,Overseas,X830,Southern NSW,10550,Bega Valley (A) +2020-03-27,2061,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-27,2535,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-27,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2262,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-27,2034,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-27,2460,Overseas,X810,Northern NSW,11730,Clarence Valley (A) +2020-03-27,2460,Overseas,X810,Northern NSW,11730,Clarence Valley (A) +2020-03-27,2081,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-27,2535,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-27,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-27,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-27,2039,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-27,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-27,2643,Overseas,X840,Murrumbidgee,12870,Federation (A) +2020-03-27,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-27,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-27,2100,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-27,2322,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-27,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2220,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2229,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-27,2539,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-27,2097,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-27,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-27,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-27,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2212,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-27,2539,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-27,2076,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-27,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-27,2142,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-27,2216,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-27,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-27,2093,Interstate,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-27,2100,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-27,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-27,2087,Interstate,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-27,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-27,2033,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-27,2103,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-27,2765,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-27,2800,Overseas,X850,Western NSW,16150,Orange (C) +2020-03-27,2575,Locally acquired - source not identified,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-27,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-27,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-27,2029,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-28,2850,Overseas,X850,Western NSW,15270,Mid-Western Regional (A) +2020-03-28,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-28,2758,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-28,2022,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-28,2759,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-28,2316,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-28,2020,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-28,2020,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-28,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-28,2232,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2228,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-28,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-28,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-28,2541,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-28,2234,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2232,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-28,2850,Overseas,X850,Western NSW,15270,Mid-Western Regional (A) +2020-03-28,2233,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2138,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-03-28,2768,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-28,2107,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2320,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-28,2446,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-28,2350,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,10130,Armidale Regional (A) +2020-03-28,2112,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-28,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-03-28,2212,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-28,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-28,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-28,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-28,2044,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-28,2101,Interstate,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,,Overseas,,,, +2020-03-28,2575,Interstate,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-28,2096,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2716,Overseas,X840,Murrumbidgee,15560,Murrumbidgee (A) +2020-03-28,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-28,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-28,2315,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-28,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2074,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-28,2217,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-28,2213,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-28,2316,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-28,2454,Overseas,X820,Mid North Coast,10600,Bellingen (A) +2020-03-28,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-28,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-28,2097,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2750,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-28,2209,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-28,2795,Overseas,X850,Western NSW,10470,Bathurst Regional (A) +2020-03-28,2099,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-28,2076,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-28,2280,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-28,2095,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2093,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-28,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-28,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-28,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-28,2777,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-28,2750,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-28,2112,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-28,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-28,2291,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-28,2445,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-28,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-28,2118,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-28,2023,Locally acquired - source not identified,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-28,2018,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-28,2528,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-28,2018,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-03-28,2225,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-28,2536,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-03-28,2620,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-03-28,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-28,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-28,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-28,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-28,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-28,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-28,2198,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-28,2530,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-28,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-28,2039,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-28,2198,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-28,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-28,2097,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2038,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-28,2535,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-28,2477,Overseas,X810,Northern NSW,10250,Ballina (A) +2020-03-28,2009,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-28,2565,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-28,2285,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-28,2085,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2330,Overseas,X800,Hunter New England,17000,Singleton (A) +2020-03-28,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-28,2113,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-28,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-28,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-28,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-28,2065,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-28,2745,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-28,2225,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2567,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-03-28,2325,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,11720,Cessnock (C) +2020-03-28,2298,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-28,2325,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,11720,Cessnock (C) +2020-03-28,2580,Overseas,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-03-28,2420,Overseas,X800,Hunter New England,12700,Dungog (A) +2020-03-28,2324,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-28,2519,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-28,2519,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-28,2305,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-28,2318,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-28,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-03-28,2218,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-28,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2340,Overseas,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-28,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-03-28,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-28,2298,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-28,2537,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-03-28,2283,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-28,,Overseas,,,, +2020-03-28,2464,Overseas,X810,Northern NSW,11730,Clarence Valley (A) +2020-03-28,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-28,2125,Locally acquired - source not identified,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-28,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-28,2097,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-28,2711,Overseas,X840,Murrumbidgee,13850,Hay (A) +2020-03-28,2092,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-28,2089,Locally acquired - source not identified,X760,Northern Sydney,15950,North Sydney (A) +2020-03-28,2112,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-28,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-28,2155,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-28,2176,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-03-29,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-29,2018,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-29,,Overseas,,,, +2020-03-29,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2168,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-29,2134,Overseas,X700,Sydney,11300,Burwood (A) +2020-03-29,2582,Overseas,X830,Southern NSW,18710,Yass Valley (A) +2020-03-29,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-29,2582,Overseas,X830,Southern NSW,18710,Yass Valley (A) +2020-03-29,2578,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-29,2795,Overseas,X850,Western NSW,10470,Bathurst Regional (A) +2020-03-29,2194,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-29,2483,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-29,2206,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-29,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-29,2483,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-29,2063,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-03-29,2766,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2042,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-29,2642,Overseas,X840,Murrumbidgee,13340,Greater Hume Shire (A) +2020-03-29,2094,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-29,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2009,Interstate,X700,Sydney,17200,Sydney (C) +2020-03-29,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2147,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2535,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-29,2340,Interstate,X800,Hunter New England,17310,Tamworth Regional (A) +2020-03-29,2770,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2257,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-29,2196,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-29,2092,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-29,2096,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-29,2046,Overseas,X700,Sydney,11520,Canada Bay (A) +2020-03-29,2582,Overseas,X830,Southern NSW,18710,Yass Valley (A) +2020-03-29,2130,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-29,2763,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2125,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-29,2217,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-29,2714,Interstate,X840,Murrumbidgee,10650,Berrigan (A) +2020-03-29,2086,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-29,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-03-29,2049,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-29,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-29,2138,Locally acquired - source not identified,X700,Sydney,11520,Canada Bay (A) +2020-03-29,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-29,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-29,2220,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-29,2065,Locally acquired - source not identified,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-29,2280,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-29,2217,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-29,2319,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-29,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-29,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-29,,Overseas,,,, +2020-03-29,2540,Locally acquired - source not identified,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-29,2090,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-03-29,2010,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-29,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-29,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-29,2251,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-29,2321,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-29,2321,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-29,2305,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-29,2305,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-29,2281,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-29,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-29,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-29,,Overseas,,,, +2020-03-29,2020,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-29,2020,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-29,2217,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-29,2216,Interstate,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-29,2234,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-29,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-29,2257,Locally acquired - source not identified,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-29,2540,Locally acquired - source not identified,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-29,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-29,2539,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-29,2103,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-29,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-29,2769,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-29,2007,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-03-29,2017,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-29,,Overseas,,,, +2020-03-29,2229,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-29,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-29,2162,Locally acquired - source not identified,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-29,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-29,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-03-29,2439,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-29,2316,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-29,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-29,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-29,2250,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-29,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-29,2207,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-29,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-29,2009,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-03-29,2127,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-29,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-29,2210,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-29,2756,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-29,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-29,2582,Overseas,X830,Southern NSW,18710,Yass Valley (A) +2020-03-29,2125,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-29,2564,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-29,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-29,2100,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-29,2445,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-29,2766,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-03-29,2168,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-03-29,2480,Overseas,X810,Northern NSW,14850,Lismore (C) +2020-03-29,2283,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-29,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-29,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-29,2289,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-29,2528,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-29,2780,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-29,2766,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-29,2029,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-30,2628,Overseas,X830,Southern NSW,17040,Snowy Monaro Regional (A) +2020-03-30,2009,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-30,,Overseas,,,, +2020-03-30,2125,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-30,2197,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-30,2535,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-30,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-30,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-30,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-30,2749,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-30,2213,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-30,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-03-30,2197,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-30,2483,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-30,2021,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-30,2112,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-30,2021,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-30,2526,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-30,2281,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-30,2483,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-30,2485,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-03-30,,Overseas,,,, +2020-03-30,2060,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-03-30,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-30,2777,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-30,2482,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-30,2164,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-03-30,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-30,2527,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-30,2199,Locally acquired - source not identified,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-30,,Overseas,,,, +2020-03-30,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-30,2780,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-30,2780,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-03-30,2019,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-30,2026,Interstate,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-30,2315,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-03-30,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-30,2287,Locally acquired - source not identified,X800,Hunter New England,15900,Newcastle (C) +2020-03-30,2099,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-30,2431,Overseas,X820,Mid North Coast,14350,Kempsey (A) +2020-03-30,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-30,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-30,2212,Locally acquired - source not identified,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-30,2114,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-03-30,2097,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-30,2030,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-30,,Overseas,,,, +2020-03-30,2761,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-03-30,2540,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-30,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-30,2020,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-30,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-30,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-30,2134,Overseas,X700,Sydney,11300,Burwood (A) +2020-03-30,2111,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-03-30,2203,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-30,,Overseas,,,, +2020-03-30,2483,Overseas,X810,Northern NSW,11350,Byron (A) +2020-03-30,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-30,2700,Overseas,X840,Murrumbidgee,15800,Narrandera (A) +2020-03-30,2144,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-30,2081,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-03-30,2580,Overseas,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-03-30,2650,Overseas,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-03-30,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-30,2577,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-03-30,2537,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,12750,Eurobodalla (A) +2020-03-30,2282,Locally acquired - source not identified,X800,Hunter New England,14650,Lake Macquarie (C) +2020-03-30,2650,Overseas,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-03-30,2650,Overseas,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-03-30,2044,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-30,2650,Overseas,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-03-30,2044,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-03-30,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-03-30,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-30,2092,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-30,2101,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-30,2100,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-30,2087,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-30,2010,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-03-30,2216,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-30,2233,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-30,2761,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-30,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-30,2261,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-30,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-03-30,2076,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-30,2021,Locally acquired - source not identified,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-30,2113,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-31,2257,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-31,2087,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-31,2540,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-03-31,2106,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2150,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-31,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-31,2131,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-31,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-31,2251,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-31,2299,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-31,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-31,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-31,2557,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-31,2564,Locally acquired - source not identified,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-03-31,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-03-31,2018,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-03-31,2151,Interstate,X740,Western Sydney,16260,Parramatta (C) +2020-03-31,2216,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-31,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-31,2095,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2041,Overseas,X700,Sydney,14170,Inner West (A) +2020-03-31,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-03-31,2713,Overseas,X840,Murrumbidgee,10650,Berrigan (A) +2020-03-31,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2583,Overseas,X830,Southern NSW,17640,Upper Lachlan Shire (A) +2020-03-31,2529,Interstate,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-03-31,2760,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-31,2548,Overseas,X830,Southern NSW,10550,Bega Valley (A) +2020-03-31,2154,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-31,2533,Overseas,X730,Illawarra Shoalhaven,14400,Kiama (A) +2020-03-31,2230,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-31,2020,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-31,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-31,2213,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-03-31,2205,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-31,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-31,2086,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2176,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-03-31,2228,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-31,,Overseas,,,, +2020-03-31,2158,Overseas,X760,Northern Sydney,17420,The Hills Shire (A) +2020-03-31,2101,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-31,2066,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-31,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-31,2027,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-31,2250,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-31,2444,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-31,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-31,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-31,2358,Overseas,X800,Hunter New England,17650,Uralla (A) +2020-03-31,2194,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-31,2761,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-31,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-31,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-31,2557,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-03-31,2217,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-31,2036,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-31,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-31,2135,Interstate,X700,Sydney,17100,Strathfield (A) +2020-03-31,2101,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2470,Overseas,X810,Northern NSW,16610,Richmond Valley (A) +2020-03-31,2754,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-03-31,2147,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-03-31,2880,Interstate,X860,Far West,11250,Broken Hill (C) +2020-03-31,,Overseas,,,, +2020-03-31,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-31,2218,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-31,2770,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-03-31,,Overseas,,,, +2020-03-31,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-03-31,2008,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-31,2770,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-03-31,2155,Locally acquired - source not identified,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-31,2196,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-31,2117,Locally acquired - source not identified,X740,Western Sydney,16260,Parramatta (C) +2020-03-31,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-03-31,2234,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-03-31,2076,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-31,2321,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-31,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-03-31,2315,Locally acquired - source not identified,X800,Hunter New England,16400,Port Stephens (A) +2020-03-31,2090,Locally acquired - source not identified,X760,Northern Sydney,15950,North Sydney (A) +2020-03-31,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-03-31,2102,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2443,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-03-31,2447,Overseas,X820,Mid North Coast,15700,Nambucca (A) +2020-03-31,2323,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-03-31,2292,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-03-31,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-31,2064,Locally acquired - source not identified,X760,Northern Sydney,18250,Willoughby (C) +2020-03-31,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-31,2195,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-31,2152,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-03-31,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-31,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-31,,Interstate,,,, +2020-03-31,2518,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-03-31,2191,Locally acquired - source not identified,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-03-31,2066,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-03-31,2042,Overseas,X700,Sydney,17200,Sydney (C) +2020-03-31,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-31,2257,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-31,2022,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-03-31,2141,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-03-31,2093,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2650,Overseas,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-03-31,2646,Overseas,X840,Murrumbidgee,12870,Federation (A) +2020-03-31,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-31,2263,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-03-31,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-03-31,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-03-31,,Overseas,,,, +2020-03-31,2122,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-03-31,2076,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-31,,Overseas,,,, +2020-03-31,,Overseas,,,, +2020-03-31,2089,Locally acquired - source not identified,X760,Northern Sydney,15950,North Sydney (A) +2020-03-31,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-03-31,2100,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-03-31,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-03-31,,Overseas,,,, +2020-03-31,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-31,,Overseas,,,, +2020-03-31,2020,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-03-31,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-03-31,2761,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-03-31,2749,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-03-31,2034,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-03-31,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-04-01,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-01,2125,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-01,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-04-01,2046,Locally acquired - source not identified,X700,Sydney,11520,Canada Bay (A) +2020-04-01,2283,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-01,2090,Locally acquired - source not identified,X760,Northern Sydney,15950,North Sydney (A) +2020-04-01,2107,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-01,2131,Overseas,X700,Sydney,14170,Inner West (A) +2020-04-01,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-04-01,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-01,2096,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-01,2118,Locally acquired - source not identified,X740,Western Sydney,16260,Parramatta (C) +2020-04-01,,Overseas,,,, +2020-04-01,2320,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15050,Maitland (C) +2020-04-01,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-04-01,2125,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-01,2107,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-01,2090,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-04-01,2008,Overseas,X700,Sydney,17200,Sydney (C) +2020-04-01,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-01,2112,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-04-01,2000,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-01,2073,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-01,2112,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-04-01,2586,Overseas,X840,Murrumbidgee,13910,Hilltops (A) +2020-04-01,,Overseas,,,, +2020-04-01,2586,Overseas,X840,Murrumbidgee,13910,Hilltops (A) +2020-04-01,2192,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-01,2161,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-04-01,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-01,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-01,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-04-01,2152,Locally acquired - source not identified,X740,Western Sydney,16260,Parramatta (C) +2020-04-01,2325,Overseas,X800,Hunter New England,11720,Cessnock (C) +2020-04-01,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-01,2114,Interstate,X760,Northern Sydney,16700,Ryde (C) +2020-04-01,2234,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-01,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-01,2233,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-01,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-01,2111,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-01,,Overseas,,,, +2020-04-01,2323,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-04-01,2121,Locally acquired - source not identified,X760,Northern Sydney,16260,Parramatta (C) +2020-04-01,1871,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-01,2767,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-01,2481,Overseas,X810,Northern NSW,11350,Byron (A) +2020-04-01,2481,Overseas,X810,Northern NSW,11350,Byron (A) +2020-04-01,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-01,2033,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-01,2422,Locally acquired - source not identified,X800,Hunter New England,15240,Mid-Coast (A) +2020-04-01,2430,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15240,Mid-Coast (A) +2020-04-01,2010,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-01,2095,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-01,2036,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-01,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-01,2035,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-01,2299,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-04-01,2062,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-04-01,2440,Locally acquired - contact of a confirmed case and/or in a known cluster,X820,Mid North Coast,14350,Kempsey (A) +2020-04-01,2324,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-04-01,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-04-01,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-01,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-01,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-01,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-01,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-01,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-01,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-04-01,1871,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-01,2769,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-01,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-01,2224,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-01,1871,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-01,2023,Interstate,X720,South Eastern Sydney,18500,Woollahra (A) +2020-04-01,2765,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-01,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-01,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-01,2015,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-01,1871,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-01,2015,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-04-01,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-01,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-01,2515,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-01,2567,Locally acquired - source not identified,X710,South Western Sydney,11450,Camden (A) +2020-04-01,2125,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-01,2767,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-01,2300,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-04-01,2450,Locally acquired - source not identified,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-04-01,2767,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-01,2420,Overseas,X800,Hunter New England,12700,Dungog (A) +2020-04-01,2540,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-04-01,2008,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-04-01,2144,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-04-01,2030,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-01,2049,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-04-01,2518,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-01,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-01,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-01,2315,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-04-01,2541,Locally acquired - source not identified,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-04-01,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-01,2216,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-01,2541,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-04-01,2024,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-01,2227,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-01,2758,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-04-01,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-01,2093,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-01,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-01,2767,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-01,,Overseas,,,, +2020-04-01,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-01,2774,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-04-01,2500,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-01,2303,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-04-01,2178,Overseas,X710,South Western Sydney,16350,Penrith (C) +2020-04-01,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-04-01,2007,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-01,2007,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-01,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-01,2007,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-01,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-01,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-04-02,2380,Locally acquired - source not identified,X800,Hunter New England,13550,Gunnedah (A) +2020-04-02,2220,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-02,2448,Overseas,X820,Mid North Coast,15700,Nambucca (A) +2020-04-02,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-02,2234,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-02,2025,Locally acquired - source not identified,X720,South Eastern Sydney,18500,Woollahra (A) +2020-04-02,2280,Locally acquired - source not identified,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-02,2000,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-02,,Overseas,,,, +2020-04-02,2428,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-04-02,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-02,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-02,2018,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-04-02,2232,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-02,2018,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-02,2324,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-04-02,,Locally acquired - source not identified,,,, +2020-04-02,2540,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-04-02,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-02,2041,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-04-02,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-02,2228,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-02,2250,Locally acquired - source not identified,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-02,2192,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-02,2192,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-02,2334,Interstate,X800,Hunter New England,11720,Cessnock (C) +2020-04-02,2232,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-02,,Overseas,,,, +2020-04-02,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-02,2211,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-02,2076,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-02,2015,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-02,2036,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-02,2036,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-02,2880,Locally acquired - source not identified,X860,Far West,11250,Broken Hill (C) +2020-04-02,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-02,2790,Overseas,X750,Nepean Blue Mountains,14870,Lithgow (C) +2020-04-02,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-02,2761,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-02,2151,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-04-02,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-04-02,2088,Locally acquired - source not identified,X760,Northern Sydney,15350,Mosman (A) +2020-04-02,2748,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-02,2035,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-02,2250,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-02,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-04-02,2334,Interstate,X800,Hunter New England,11720,Cessnock (C) +2020-04-02,2131,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-04-02,2519,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-02,2233,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-02,2071,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-02,2088,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15350,Mosman (A) +2020-04-02,2009,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-02,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-02,2131,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-04-02,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-02,2111,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-02,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-02,2019,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-02,2223,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-02,2040,Overseas,X700,Sydney,14170,Inner West (A) +2020-04-02,2075,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-02,2075,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-02,2134,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11300,Burwood (A) +2020-04-02,2060,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-04-02,2223,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-02,2234,Interstate,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-02,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-04-02,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-02,2761,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-02,2097,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-02,2097,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-02,2430,Locally acquired - source not identified,X800,Hunter New England,15240,Mid-Coast (A) +2020-04-02,2478,Locally acquired - contact of a confirmed case and/or in a known cluster,X810,Northern NSW,10250,Ballina (A) +2020-04-02,2233,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-02,2285,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-02,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-02,2533,Overseas,X730,Illawarra Shoalhaven,14400,Kiama (A) +2020-04-02,2330,Overseas,X800,Hunter New England,17000,Singleton (A) +2020-04-02,2529,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-04-02,2576,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-04-02,2650,Overseas,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-04-02,2477,Overseas,X810,Northern NSW,10250,Ballina (A) +2020-04-02,2765,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-02,2250,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-02,2090,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-04-02,2000,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-02,2714,Overseas,X840,Murrumbidgee,10650,Berrigan (A) +2020-04-02,2049,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-04-02,2148,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-04-02,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-02,2041,Overseas,X700,Sydney,14170,Inner West (A) +2020-04-03,,Locally acquired - source not identified,,,, +2020-04-03,2204,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-04-03,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-03,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-03,2088,Locally acquired - source not identified,X760,Northern Sydney,15350,Mosman (A) +2020-04-03,2220,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-03,2032,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-03,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-03,2135,Overseas,X700,Sydney,17100,Strathfield (A) +2020-04-03,2017,Overseas,X700,Sydney,17200,Sydney (C) +2020-04-03,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-03,2097,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-03,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-03,2117,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-04-03,2193,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-03,2069,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-03,,Locally acquired - source not identified,,,, +2020-04-03,2206,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-03,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-03,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-03,2205,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-03,2218,Interstate,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-03,2558,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-04-03,2323,Locally acquired - source not identified,X800,Hunter New England,15050,Maitland (C) +2020-04-03,2015,Overseas,X700,Sydney,17200,Sydney (C) +2020-04-03,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-03,2111,Locally acquired - source not identified,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-03,2039,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-04-03,2761,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-03,2761,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-03,2164,Interstate,X710,South Western Sydney,12850,Fairfield (C) +2020-04-03,2120,Locally acquired - source not identified,X760,Northern Sydney,14000,Hornsby (A) +2020-04-03,2439,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-04-03,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-03,2714,Locally acquired - contact of a confirmed case and/or in a known cluster,X840,Murrumbidgee,10650,Berrigan (A) +2020-04-03,2084,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-03,2096,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-03,2090,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-04-03,,Overseas,,,, +2020-04-03,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-03,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-03,2234,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-03,2106,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-03,2045,Overseas,X700,Sydney,14170,Inner West (A) +2020-04-03,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-03,2017,Overseas,X700,Sydney,17200,Sydney (C) +2020-04-03,2714,Locally acquired - contact of a confirmed case and/or in a known cluster,X840,Murrumbidgee,10650,Berrigan (A) +2020-04-03,2216,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-03,2141,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-04-03,2218,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-03,2213,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-03,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-03,,Overseas,,,, +2020-04-03,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-03,2039,Overseas,X700,Sydney,14170,Inner West (A) +2020-04-03,2099,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-03,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-03,2016,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-04-03,2073,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-03,2209,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-03,2790,Overseas,X750,Nepean Blue Mountains,14870,Lithgow (C) +2020-04-03,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-04-03,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-04-03,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-03,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-03,2131,Overseas,X700,Sydney,14170,Inner West (A) +2020-04-03,,Overseas,,,, +2020-04-03,2761,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-04-03,2118,Locally acquired - source not identified,X740,Western Sydney,16260,Parramatta (C) +2020-04-03,2131,Overseas,X700,Sydney,14170,Inner West (A) +2020-04-03,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-03,2233,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-03,2620,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-04-03,2049,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-04-03,2152,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-04-03,2800,Overseas,X850,Western NSW,16150,Orange (C) +2020-04-03,2758,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-04-03,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-04-03,2284,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-03,2439,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-04-03,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-04-03,2539,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-04-03,2541,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-04-03,2541,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-04-03,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-03,2050,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-04-03,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-04-03,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-03,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-03,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-03,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-03,2567,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-04-03,2537,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-04-03,2263,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-03,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-03,2515,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-03,2780,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-04-03,2530,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-03,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-03,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-04-03,2176,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-04-03,2567,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-04-03,2073,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-03,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-03,2111,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-03,2760,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-04,2866,Overseas,X850,Western NSW,11400,Cabonne (A) +2020-04-04,2062,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-04-04,2219,Interstate,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-04,2219,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-04,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-04,2163,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-04,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-04,2020,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-04,2018,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-04,2218,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-04,2066,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-04,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-04,2232,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-04,2865,Overseas,X850,Western NSW,11400,Cabonne (A) +2020-04-04,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-04-04,2865,Overseas,X850,Western NSW,11400,Cabonne (A) +2020-04-04,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-04,2019,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-04,2065,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-04,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-04-04,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-04,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-04-04,2761,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-04-04,2190,Locally acquired - source not identified,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-04,2037,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-04-04,2155,Locally acquired - source not identified,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-04,2263,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-04,2113,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-04-04,,Overseas,,,, +2020-04-04,2558,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-04-04,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-04,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-04,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-04,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-04,2033,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-04,2430,Locally acquired - source not identified,X800,Hunter New England,15240,Mid-Coast (A) +2020-04-04,2316,Locally acquired - source not identified,X800,Hunter New England,16400,Port Stephens (A) +2020-04-04,,Overseas,,,, +2020-04-04,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-04-04,2040,Interstate,X700,Sydney,14170,Inner West (A) +2020-04-04,2042,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-04,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-04,2750,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-04,2205,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-04,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-04-04,2104,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-04,2282,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-04,2066,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-04,2316,Locally acquired - source not identified,X800,Hunter New England,16400,Port Stephens (A) +2020-04-04,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-04-04,2033,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-04,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-04-04,2533,Overseas,X730,Illawarra Shoalhaven,14400,Kiama (A) +2020-04-04,2533,Overseas,X730,Illawarra Shoalhaven,14400,Kiama (A) +2020-04-04,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-04,2220,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-04,2086,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-04,2156,Interstate,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-04,2032,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-04,2049,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-04-04,2576,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-04-04,2141,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-04,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-04,2221,Interstate,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-04,2210,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-04,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-04,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-04,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-04,2011,Locally acquired - source not identified,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-04,2227,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-04,2766,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-04,2097,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-04,2485,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-04-05,2130,Overseas,X700,Sydney,14170,Inner West (A) +2020-04-05,2130,Overseas,X700,Sydney,14170,Inner West (A) +2020-04-05,2015,Overseas,X700,Sydney,17200,Sydney (C) +2020-04-05,,Overseas,,,, +2020-04-05,2558,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-04-05,,Overseas,,,, +2020-04-05,,Overseas,,,, +2020-04-05,2111,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-05,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-05,,Overseas,,,, +2020-04-05,2011,Interstate,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-05,2209,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-05,2069,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-05,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-05,,Overseas,,,, +2020-04-05,2101,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-05,2103,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-05,2207,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-05,,Overseas,,,, +2020-04-05,2025,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-04-05,2221,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-05,2035,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-05,2044,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-04-05,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-05,2135,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-04-05,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-05,2022,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-05,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-05,2066,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-05,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-05,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-05,2165,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-04-05,2763,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-04-05,2205,Interstate,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-05,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-05,2232,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-05,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-04-05,2114,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-04-05,,Overseas,,,, +2020-04-05,2576,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-04-05,2176,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-04-05,2176,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-04-05,,Overseas,,,, +2020-04-05,2299,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15900,Newcastle (C) +2020-04-05,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-05,,Overseas,,,, +2020-04-05,,Overseas,,,, +2020-04-05,2452,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-04-05,2159,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-04-05,2017,Overseas,X700,Sydney,17200,Sydney (C) +2020-04-05,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-05,2233,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-05,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-05,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-04-05,,Overseas,,,, +2020-04-05,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-04-05,2262,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-05,2527,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-04-05,2234,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-05,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-04-05,2211,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-05,2135,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-04-05,2205,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-06,2283,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-06,,Overseas,,,, +2020-04-06,2283,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-06,,Overseas,,,, +2020-04-06,2046,Overseas,X700,Sydney,11520,Canada Bay (A) +2020-04-06,2557,Locally acquired - source not identified,X710,South Western Sydney,11450,Camden (A) +2020-04-06,2035,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-06,2218,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-06,2019,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-06,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-06,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-06,2350,Locally acquired - source not identified,X800,Hunter New England,10130,Armidale Regional (A) +2020-04-06,2019,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-06,2234,Interstate,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-06,,Overseas,,,, +2020-04-06,2127,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-04-06,,Overseas,,,, +2020-04-06,2066,Locally acquired - source not identified,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-06,2481,Overseas,X810,Northern NSW,11350,Byron (A) +2020-04-06,,Overseas,,,, +2020-04-06,2576,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-04-06,2216,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-06,2032,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-06,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-04-06,2219,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-06,2234,Interstate,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-06,2575,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-04-06,2575,Overseas,X710,South Western Sydney,18350,Wingecarribee (A) +2020-04-06,,Overseas,,,, +2020-04-06,2216,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-06,2800,Locally acquired - contact of a confirmed case and/or in a known cluster,X850,Western NSW,16150,Orange (C) +2020-04-06,2205,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-06,2113,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-04-06,2870,Overseas,X850,Western NSW,16200,Parkes (A) +2020-04-06,,Overseas,,,, +2020-04-06,2209,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-06,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-06,2218,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-06,2770,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-06,2086,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-07,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-07,2205,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-07,2152,Locally acquired - source not identified,X740,Western Sydney,16260,Parramatta (C) +2020-04-07,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-07,2135,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-04-07,2111,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-07,2226,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-07,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-07,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-07,2289,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-04-07,,Overseas,,,, +2020-04-07,2505,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-07,2165,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-04-07,2046,Overseas,X700,Sydney,11520,Canada Bay (A) +2020-04-07,2096,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-07,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-07,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-04-07,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-07,2232,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-07,2032,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-07,2218,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-07,2316,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-04-07,2179,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-07,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-07,,Overseas,,,, +2020-04-07,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-04-07,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-07,,Overseas,,,, +2020-04-07,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-07,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-04-07,,Overseas,,,, +2020-04-07,,Overseas,,,, +2020-04-07,2217,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-07,2111,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-07,2251,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-07,2074,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-07,2074,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-07,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-07,2303,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15900,Newcastle (C) +2020-04-07,2303,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-04-07,2303,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-04-07,2110,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-07,2539,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-04-07,2485,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-04-08,2094,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-08,2170,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-04-08,2557,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-04-08,2119,Locally acquired - source not identified,X760,Northern Sydney,14000,Hornsby (A) +2020-04-08,2070,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-08,2207,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-08,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-08,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-08,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-08,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-08,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-08,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-08,2479,Overseas,X810,Northern NSW,11350,Byron (A) +2020-04-08,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-08,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-08,2062,Interstate,X760,Northern Sydney,15950,North Sydney (A) +2020-04-08,2072,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-08,2086,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-08,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-08,2193,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-08,2020,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-08,2761,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-04-08,2479,Overseas,X810,Northern NSW,11350,Byron (A) +2020-04-08,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-08,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-08,2209,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-08,2135,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-04-08,2135,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-04-08,2135,Locally acquired - source not identified,X700,Sydney,17100,Strathfield (A) +2020-04-08,2234,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-08,2643,Overseas,X840,Murrumbidgee,12870,Federation (A) +2020-04-08,2304,Locally acquired - source not identified,X800,Hunter New England,15900,Newcastle (C) +2020-04-08,2262,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-08,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-08,2111,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-08,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-04-08,2317,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-04-08,2138,Locally acquired - source not identified,X700,Sydney,11520,Canada Bay (A) +2020-04-08,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-08,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-04-08,2478,Overseas,X810,Northern NSW,10250,Ballina (A) +2020-04-08,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-08,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-08,2134,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11300,Burwood (A) +2020-04-08,2206,Interstate,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-09,,Overseas,,,, +2020-04-09,2282,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-09,2761,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-09,2031,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-09,2199,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-09,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-09,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-09,2224,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-09,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-09,,Overseas,,,, +2020-04-09,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-04-09,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-09,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-09,2107,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-09,2108,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-09,,Overseas,,,, +2020-04-09,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-09,2007,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-09,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-09,2287,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-04-09,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-04-09,2722,Overseas,X840,Murrumbidgee,12160,Cootamundra-Gundagai Regional (A) +2020-04-09,2060,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-04-09,2261,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-09,2163,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-04-09,2640,Overseas,X921,Network with Vic,10050,Albury (C) +2020-04-09,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-09,2035,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-09,2761,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-09,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-04-09,2035,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-09,2165,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-09,,Overseas,,,, +2020-04-09,2023,Locally acquired - source not identified,X720,South Eastern Sydney,18500,Woollahra (A) +2020-04-09,2754,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-04-09,2075,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-09,,Overseas,,,, +2020-04-09,2767,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-09,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-09,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-09,2220,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-10,,Overseas,,,, +2020-04-10,,Overseas,,,, +2020-04-10,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-10,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-10,2280,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-10,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-10,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-10,2209,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-10,2114,Locally acquired - source not identified,X760,Northern Sydney,16700,Ryde (C) +2020-04-10,2070,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-10,2066,Locally acquired - source not identified,X760,Northern Sydney,14700,Lane Cove (A) +2020-04-10,,Overseas,,,, +2020-04-10,2031,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-10,2023,Locally acquired - source not identified,X720,South Eastern Sydney,18500,Woollahra (A) +2020-04-10,2747,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-10,2033,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-10,,Overseas,,,, +2020-04-10,2350,Overseas,X800,Hunter New England,10130,Armidale Regional (A) +2020-04-10,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-10,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-10,2070,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-04-10,2114,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-04-10,2032,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-10,2318,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-04-10,,Overseas,,,, +2020-04-10,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-04-10,2541,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-04-10,2578,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-04-10,2020,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-10,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-11,2103,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-11,2088,Overseas,X760,Northern Sydney,15350,Mosman (A) +2020-04-11,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-11,2017,Overseas,X700,Sydney,17200,Sydney (C) +2020-04-11,,Overseas,,,, +2020-04-11,2564,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-04-11,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-11,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-11,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-11,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-11,2216,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-11,2023,Locally acquired - source not identified,X720,South Eastern Sydney,18500,Woollahra (A) +2020-04-11,,Overseas,,,, +2020-04-11,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-11,2232,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-11,2323,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-04-11,2030,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-11,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-04-12,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-12,,Overseas,,,, +2020-04-12,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-12,,Locally acquired - source not identified,,,, +2020-04-12,2217,Locally acquired - source not identified,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-12,2283,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-12,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-12,2283,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-12,2264,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-12,2320,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15050,Maitland (C) +2020-04-13,2007,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-13,,Overseas,,,, +2020-04-13,,Overseas,,,, +2020-04-13,2216,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-13,2043,Overseas,X700,Sydney,17200,Sydney (C) +2020-04-13,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-13,2099,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-14,2760,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-14,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-14,2478,Interstate,X810,Northern NSW,10250,Ballina (A) +2020-04-14,2767,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-14,2445,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-04-14,2137,Locally acquired - source not identified,X700,Sydney,11520,Canada Bay (A) +2020-04-14,2759,Interstate,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-14,2135,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-04-14,2064,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,18250,Willoughby (C) +2020-04-14,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-14,2176,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-04-14,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-14,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-14,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-04-14,2060,Overseas,X760,Northern Sydney,15950,North Sydney (A) +2020-04-14,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-14,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-14,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-14,2760,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-14,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-14,2168,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-04-15,2033,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-15,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-15,2300,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-04-15,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-15,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-15,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-15,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-15,,Overseas,,,, +2020-04-15,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-15,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-15,2000,Interstate,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-15,2849,Overseas,X850,Western NSW,15270,Mid-Western Regional (A) +2020-04-15,2093,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-15,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-15,2195,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-15,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-15,2114,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-04-15,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-15,2114,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-04-15,2096,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-15,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-15,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-16,2640,Overseas,X921,Network with Vic,10050,Albury (C) +2020-04-16,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-16,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-04-16,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-16,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-16,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-16,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-16,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-04-16,2849,Overseas,X850,Western NSW,15270,Mid-Western Regional (A) +2020-04-16,2017,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-04-16,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-16,2225,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-16,2217,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-04-16,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-04-16,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-04-16,2100,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-16,2749,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-16,2320,Overseas,X800,Hunter New England,15050,Maitland (C) +2020-04-16,2756,Overseas,X750,Nepean Blue Mountains,13800,Hawkesbury (C) +2020-04-16,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-04-16,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-16,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-17,2285,Locally acquired - source not identified,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-17,2800,Locally acquired - source not identified,X850,Western NSW,16150,Orange (C) +2020-04-17,2760,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-17,2517,Locally acquired - source not identified,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-17,2050,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-04-17,2350,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,10130,Armidale Regional (A) +2020-04-17,2400,Locally acquired - source not identified,X800,Hunter New England,15300,Moree Plains (A) +2020-04-17,2153,Locally acquired - source not identified,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-17,,Overseas,,,, +2020-04-17,2225,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-17,2340,Locally acquired - source not identified,X800,Hunter New England,17310,Tamworth Regional (A) +2020-04-17,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-17,2218,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-17,2111,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-04-17,2445,Overseas,X820,Mid North Coast,16380,Port Macquarie-Hastings (A) +2020-04-18,2258,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-18,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-04-18,2232,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-04-18,2211,Locally acquired - source not identified,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-18,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-18,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-04-18,2030,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-18,2036,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-18,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-04-18,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-18,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-18,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-18,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-18,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-18,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-18,2047,Locally acquired - source not identified,X700,Sydney,11520,Canada Bay (A) +2020-04-18,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-19,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-19,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-19,2193,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-19,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-19,2077,Locally acquired - source not identified,X760,Northern Sydney,14000,Hornsby (A) +2020-04-19,2099,Locally acquired - source not identified,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-19,2100,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-20,2096,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-20,2090,Locally acquired - source not identified,X760,Northern Sydney,15950,North Sydney (A) +2020-04-21,2126,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-04-21,2450,Locally acquired - contact of a confirmed case and/or in a known cluster,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-04-21,2450,Locally acquired - contact of a confirmed case and/or in a known cluster,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-04-21,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-04-21,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-21,2203,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-04-22,2009,Overseas,X700,Sydney,17200,Sydney (C) +2020-04-22,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-04-22,2790,Locally acquired - source not identified,X750,Nepean Blue Mountains,14870,Lithgow (C) +2020-04-23,2576,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-04-23,2210,Locally acquired - source not identified,X720,South Eastern Sydney,12930,Georges River (A) +2020-04-23,2782,Locally acquired - source not identified,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-04-23,2193,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-23,2782,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-04-23,2068,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-04-23,2193,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-23,2176,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-04-24,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-24,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-04-24,2785,Locally acquired - source not identified,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-04-24,2126,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-04-24,2126,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-04-24,2000,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-04-24,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-24,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-24,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-24,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-24,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-24,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-24,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-24,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-25,2154,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-25,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-25,2135,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-04-26,2430,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-04-27,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-27,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-04-27,2099,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-04-27,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-04-27,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-04-28,2204,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-04-28,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-28,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-04-28,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-28,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-28,2749,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-28,2125,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-04-28,2470,Overseas,X810,Northern NSW,16610,Richmond Valley (A) +2020-04-28,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-04-28,2147,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-04-29,2023,Overseas,X720,South Eastern Sydney,18500,Woollahra (A) +2020-04-29,2745,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-29,2192,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-04-30,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-04-30,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-30,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-30,2749,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-30,2280,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-30,2759,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-30,2250,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-04-30,2265,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-04-30,2036,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-04-30,2567,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-04-30,2770,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-04-30,2519,Locally acquired - source not identified,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-04-30,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-04-30,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-04-30,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-05-01,2140,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-05-01,2076,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-05-02,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-05-02,2752,Locally acquired - source not identified,X710,South Western Sydney,18400,Wollondilly (A) +2020-05-03,2774,Locally acquired - source not identified,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-05-04,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-05-04,2767,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-05-04,2131,Locally acquired - source not identified,X700,Sydney,14170,Inner West (A) +2020-05-04,2141,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-05-05,,Overseas,,,, +2020-05-05,2176,Interstate,X710,South Western Sydney,12850,Fairfield (C) +2020-05-05,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-05-05,2035,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-05-05,2427,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-05-05,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-05-06,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-05-06,2140,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-05-06,2118,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-05-07,2750,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-05-07,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-05-08,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-05-08,2131,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-05-08,2259,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-05-08,2423,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-05-09,2568,Overseas,X710,South Western Sydney,18400,Wollondilly (A) +2020-05-10,,Overseas,,,, +2020-05-12,2580,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-05-12,2750,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-05-12,2230,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-05-12,2580,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-05-12,2232,Locally acquired - source not identified,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-05-13,2118,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-05-13,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-05-13,2777,Locally acquired - source not identified,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-05-13,,Overseas,,,, +2020-05-14,2154,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-05-14,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-05-14,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-05-15,,Overseas,,,, +2020-05-15,,Overseas,,,, +2020-05-17,,Overseas,,,, +2020-05-18,,Overseas,,,, +2020-05-18,2073,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-05-19,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-05-19,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-05-19,2800,Overseas,X850,Western NSW,16150,Orange (C) +2020-05-19,,Overseas,,,, +2020-05-20,2070,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-05-21,2135,Overseas,X700,Sydney,17100,Strathfield (A) +2020-05-21,2142,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-05-21,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-05-23,2135,Overseas,X700,Sydney,17100,Strathfield (A) +2020-05-24,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-05-25,,Overseas,,,, +2020-05-25,2163,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-05-27,,Overseas,,,, +2020-05-28,,Overseas,,,, +2020-05-28,2526,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-05-29,,Overseas,,,, +2020-05-30,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-05-30,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-05-31,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-05-31,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-05-31,2142,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-05-31,,Overseas,,,, +2020-05-31,2767,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-01,2765,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-01,2161,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-01,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-01,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-02,2767,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-03,2150,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-06-03,2177,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-06-04,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-04,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-04,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-06,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-06-07,,Overseas,,,, +2020-06-07,2177,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-06-07,2166,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-06-08,2282,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-06-09,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-06-09,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-06-09,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-06-11,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-11,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-11,2029,Locally acquired - source not identified,X720,South Eastern Sydney,18500,Woollahra (A) +2020-06-12,2228,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-06-12,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-06-12,2163,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-06-13,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-13,,Overseas,,,, +2020-06-13,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-06-13,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-13,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-06-13,2260,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-06-13,2212,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-06-13,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-13,2232,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-06-14,2030,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-06-14,2165,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-06-14,2528,Locally acquired - source not identified,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-06-14,2557,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-06-14,2043,Overseas,X700,Sydney,17200,Sydney (C) +2020-06-14,2043,Overseas,X700,Sydney,17200,Sydney (C) +2020-06-17,2557,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-06-17,2557,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-06-18,,Overseas,,,, +2020-06-18,,Overseas,,,, +2020-06-18,,Overseas,,,, +2020-06-18,,Overseas,,,, +2020-06-18,2033,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-06-18,,Overseas,,,, +2020-06-18,,Overseas,,,, +2020-06-19,2161,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-20,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-06-20,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-06-20,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-06-20,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-06-20,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-06-20,2800,Overseas,X850,Western NSW,16150,Orange (C) +2020-06-21,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-06-22,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-23,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-06-23,,Overseas,,,, +2020-06-23,2456,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-06-23,,Overseas,,,, +2020-06-23,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-23,,Overseas,,,, +2020-06-23,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-06-23,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-23,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-23,2760,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-06-24,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-24,2066,Locally acquired - source not identified,X760,Northern Sydney,14700,Lane Cove (A) +2020-06-24,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-24,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-25,2750,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-06-25,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-25,2450,Overseas,X820,Mid North Coast,11800,Coffs Harbour (C) +2020-06-25,2570,Locally acquired - source not identified,X710,South Western Sydney,11450,Camden (A) +2020-06-25,,Overseas,,,, +2020-06-25,,Overseas,,,, +2020-06-26,2076,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-06-26,2761,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-26,2767,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-26,2263,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-06-26,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-06-27,,Overseas,,,, +2020-06-27,,Overseas,,,, +2020-06-27,,Overseas,,,, +2020-06-27,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-27,2506,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-06-27,,Overseas,,,, +2020-06-27,2263,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-06-27,2121,Overseas,X760,Northern Sydney,16260,Parramatta (C) +2020-06-27,2192,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-06-27,,Overseas,,,, +2020-06-28,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-06-28,2161,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-06-28,2557,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-06-29,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-29,,Overseas,,,, +2020-06-29,,Overseas,,,, +2020-06-29,,Overseas,,,, +2020-06-29,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-29,,Overseas,,,, +2020-06-30,2194,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-06-30,2077,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-06-30,2766,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-30,2766,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-30,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-06-30,,Overseas,,,, +2020-06-30,2121,Overseas,X760,Northern Sydney,16260,Parramatta (C) +2020-06-30,2761,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-06-30,,Overseas,,,, +2020-06-30,,Overseas,,,, +2020-06-30,2121,Overseas,X760,Northern Sydney,16260,Parramatta (C) +2020-07-01,,Overseas,,,, +2020-07-01,,Overseas,,,, +2020-07-01,,Overseas,,,, +2020-07-01,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-01,,Overseas,,,, +2020-07-01,2161,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-02,,Overseas,,,, +2020-07-02,,Overseas,,,, +2020-07-02,,Overseas,,,, +2020-07-02,2251,Locally acquired - source not identified,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-07-02,,Overseas,,,, +2020-07-03,2142,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-03,2136,Overseas,X700,Sydney,17100,Strathfield (A) +2020-07-03,2230,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-07-03,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-03,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-07-03,2770,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-07-03,2086,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-07-03,,Overseas,,,, +2020-07-04,2619,Overseas,X830,Southern NSW,16490,Queanbeyan-Palerang Regional (A) +2020-07-04,2039,Overseas,X700,Sydney,14170,Inner West (A) +2020-07-04,,Overseas,,,, +2020-07-04,2064,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-07-04,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-04,2211,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-04,,Overseas,,,, +2020-07-04,2163,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-07-04,2179,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-07-04,,Overseas,,,, +2020-07-04,2761,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-07-04,2196,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-05,,Overseas,,,, +2020-07-05,,Overseas,,,, +2020-07-05,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-07-05,2192,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-05,,Overseas,,,, +2020-07-05,,Overseas,,,, +2020-07-05,,Overseas,,,, +2020-07-05,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-06,,Overseas,,,, +2020-07-06,,Overseas,,,, +2020-07-06,,Overseas,,,, +2020-07-06,2641,Interstate,X921,Network with Vic,10050,Albury (C) +2020-07-06,2641,Locally acquired - contact of a confirmed case and/or in a known cluster,X921,Network with Vic,10050,Albury (C) +2020-07-06,2150,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-07-06,2196,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-06,2196,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-06,,Overseas,,,, +2020-07-06,,Overseas,,,, +2020-07-06,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-06,2291,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-07-06,2641,Locally acquired - contact of a confirmed case and/or in a known cluster,X921,Network with Vic,10050,Albury (C) +2020-07-06,,Overseas,,,, +2020-07-07,,Overseas,,,, +2020-07-07,,Overseas,,,, +2020-07-07,2161,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-07,,Overseas,,,, +2020-07-07,,Overseas,,,, +2020-07-07,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-08,2174,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-07-08,2167,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-08,2540,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-07-08,,Overseas,,,, +2020-07-08,,Overseas,,,, +2020-07-08,,Overseas,,,, +2020-07-08,2148,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-07-08,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-08,2745,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-07-08,,Overseas,,,, +2020-07-08,,Overseas,,,, +2020-07-08,,Overseas,,,, +2020-07-08,,Overseas,,,, +2020-07-09,2070,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-07-09,2780,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-07-09,2780,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-07-09,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-07-09,2140,Overseas,X700,Sydney,17100,Strathfield (A) +2020-07-09,,Overseas,,,, +2020-07-09,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-07-09,,Overseas,,,, +2020-07-09,2140,Overseas,X700,Sydney,17100,Strathfield (A) +2020-07-10,2219,Interstate,X720,South Eastern Sydney,10500,Bayside (A) +2020-07-10,,Overseas,,,, +2020-07-10,,Overseas,,,, +2020-07-10,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-10,,Overseas,,,, +2020-07-10,2780,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-07-10,2780,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-07-10,,Overseas,,,, +2020-07-11,2720,Overseas,X840,Murrumbidgee,17080,Snowy Valleys (A) +2020-07-11,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-12,2571,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18400,Wollondilly (A) +2020-07-12,2017,Overseas,X700,Sydney,17200,Sydney (C) +2020-07-12,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-12,,Locally acquired - contact of a confirmed case and/or in a known cluster,,,, +2020-07-12,,Overseas,,,, +2020-07-12,2208,Interstate,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-12,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-12,2166,Interstate,X710,South Western Sydney,12850,Fairfield (C) +2020-07-12,,Overseas,,,, +2020-07-12,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-12,2087,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-07-12,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-07-12,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-12,2217,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-07-12,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-13,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-13,2290,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-07-13,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-07-13,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-13,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-13,2571,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18400,Wollondilly (A) +2020-07-13,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-13,2117,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-13,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-13,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-13,2571,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18400,Wollondilly (A) +2020-07-13,,Interstate,,,, +2020-07-13,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-13,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-13,2102,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-07-13,,Overseas,,,, +2020-07-13,2571,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18400,Wollondilly (A) +2020-07-14,2112,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-07-14,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-14,2575,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-07-14,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-07-14,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-14,,Overseas,,,, +2020-07-14,2113,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-07-14,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-14,2762,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-07-14,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-15,2540,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-07-15,2480,Interstate,X810,Northern NSW,14850,Lismore (C) +2020-07-15,2167,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-15,,Overseas,,,, +2020-07-15,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-15,,Overseas,,,, +2020-07-15,2762,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-07-15,2146,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-15,2170,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-07-16,2192,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-16,2192,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-16,2745,Locally acquired - source not identified,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-07-16,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-16,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-16,2290,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,14650,Lake Macquarie (C) +2020-07-16,2218,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-07-16,2663,Overseas,X840,Murrumbidgee,14300,Junee (A) +2020-07-16,2207,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-07-17,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-17,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-17,,Overseas,,,, +2020-07-17,2567,Locally acquired - source not identified,X710,South Western Sydney,11450,Camden (A) +2020-07-17,2212,Locally acquired - source not identified,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-17,,Overseas,,,, +2020-07-17,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-07-17,2528,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-07-17,,Overseas,,,, +2020-07-17,,Overseas,,,, +2020-07-17,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-07-17,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-07-17,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-18,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-18,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-18,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-18,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-18,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-18,2148,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-07-18,,Overseas,,,, +2020-07-18,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-18,2759,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-07-18,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-18,2192,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-18,,Overseas,,,, +2020-07-18,,Overseas,,,, +2020-07-18,2296,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-07-18,2192,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-18,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-18,2165,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-18,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-19,2571,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18400,Wollondilly (A) +2020-07-19,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-07-19,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-07-19,2021,Interstate,X720,South Eastern Sydney,18500,Woollahra (A) +2020-07-19,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-19,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-07-19,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-19,2536,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,12750,Eurobodalla (A) +2020-07-19,2536,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,12750,Eurobodalla (A) +2020-07-19,2536,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,12750,Eurobodalla (A) +2020-07-19,,Overseas,,,, +2020-07-19,2207,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-07-19,2233,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-07-19,2232,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-07-19,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-07-19,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-07-19,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-19,,Overseas,,,, +2020-07-19,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-19,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-20,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-20,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-07-20,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-07-20,2777,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-07-20,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-20,,Overseas,,,, +2020-07-20,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-20,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-20,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-20,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-20,2155,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-07-20,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-20,2118,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-20,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-07-20,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-21,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-21,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-07-21,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-21,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-21,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-21,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-21,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-21,2316,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,16400,Port Stephens (A) +2020-07-21,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-21,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-21,2199,Interstate,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-21,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-07-21,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-21,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-22,2179,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-22,2526,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-07-22,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-22,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-07-22,2766,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-07-22,2113,Overseas,X760,Northern Sydney,16700,Ryde (C) +2020-07-22,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-07-22,2179,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-22,2315,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,16400,Port Stephens (A) +2020-07-22,2290,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-07-22,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-07-22,2170,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-07-22,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-22,2315,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,16400,Port Stephens (A) +2020-07-22,2508,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-07-22,2315,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,16400,Port Stephens (A) +2020-07-23,2155,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-07-23,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-23,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-23,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-23,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-23,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-24,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-24,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-24,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-24,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-24,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-24,,Overseas,,,, +2020-07-24,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-24,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-24,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-24,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-24,,Overseas,,,, +2020-07-24,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-24,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-24,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-24,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-07-24,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-07-24,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-24,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-25,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-25,2212,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-25,2558,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-25,2212,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-25,2171,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-07-25,,Overseas,,,, +2020-07-25,2212,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-25,2165,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-25,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-25,,Overseas,,,, +2020-07-25,2558,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-25,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-25,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-25,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-25,2481,Locally acquired - contact of a confirmed case and/or in a known cluster,X810,Northern NSW,11350,Byron (A) +2020-07-25,2526,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-07-25,2481,Locally acquired - contact of a confirmed case and/or in a known cluster,X810,Northern NSW,11350,Byron (A) +2020-07-25,,Overseas,,,, +2020-07-25,2117,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-07-26,2042,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-07-26,2199,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-26,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-26,,Overseas,,,, +2020-07-26,2148,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-07-26,2048,Overseas,X700,Sydney,14170,Inner West (A) +2020-07-26,,Overseas,,,, +2020-07-26,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-27,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-27,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-27,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-07-27,2315,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,16400,Port Stephens (A) +2020-07-27,2196,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-07-27,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-27,,Overseas,,,, +2020-07-27,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-27,2031,Interstate,X720,South Eastern Sydney,16550,Randwick (C) +2020-07-27,2760,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-07-27,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-27,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-07-27,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-27,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-27,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-28,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-28,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-28,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-07-28,2030,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-07-28,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-28,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-28,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-07-28,2204,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-07-28,2330,Overseas,X800,Hunter New England,17000,Singleton (A) +2020-07-28,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-07-28,2315,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,16400,Port Stephens (A) +2020-07-28,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-28,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-28,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-28,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-28,2262,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-07-28,2767,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-07-28,2125,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-07-28,2210,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-07-28,2564,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-28,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-28,2766,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-07-29,2037,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-07-29,,Interstate,,,, +2020-07-29,2096,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-07-29,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-07-29,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-29,2763,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-07-29,2315,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,16400,Port Stephens (A) +2020-07-29,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-07-29,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-07-29,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-29,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-29,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-29,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-29,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-29,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-07-30,2212,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-30,,Overseas,,,, +2020-07-30,2800,Locally acquired - contact of a confirmed case and/or in a known cluster,X850,Western NSW,16150,Orange (C) +2020-07-30,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-30,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-30,2037,Overseas,X700,Sydney,17200,Sydney (C) +2020-07-30,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-30,2204,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-07-30,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-30,2205,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-07-30,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-07-30,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-30,2763,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-07-30,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-30,2212,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-30,2167,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-30,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-07-30,2230,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-07-30,2063,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,18250,Willoughby (C) +2020-07-30,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-07-30,,Overseas,,,, +2020-07-30,2204,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-07-31,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-07-31,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-31,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-31,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-07-31,2022,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-07-31,2148,Interstate,X740,Western Sydney,10750,Blacktown (C) +2020-07-31,2026,Locally acquired - source not identified,X720,South Eastern Sydney,18050,Waverley (A) +2020-07-31,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-31,2167,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-07-31,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-07-31,2165,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-07-31,2500,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-07-31,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-07-31,2160,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-01,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-08-01,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-01,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-01,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-01,2650,Interstate,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-08-01,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-08-01,2204,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-08-01,2204,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-08-01,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-01,2047,Overseas,X700,Sydney,11520,Canada Bay (A) +2020-08-01,2230,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-08-01,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-01,2161,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-08-01,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-02,2650,Interstate,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-08-02,,Overseas,,,, +2020-08-02,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-08-02,2650,Interstate,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-08-02,2650,Interstate,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-08-02,2564,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-02,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-08-02,2564,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-02,2160,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-02,2125,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-03,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-03,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-03,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-03,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-03,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-03,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-03,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-03,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-03,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-08-03,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-03,2213,Locally acquired - source not identified,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-03,2017,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-08-03,2000,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-08-04,2096,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-08-04,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-04,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-04,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-04,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-08-04,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-04,,Overseas,,,, +2020-08-04,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-04,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-05,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-08-05,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-05,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-05,2303,Locally acquired - source not identified,X800,Hunter New England,15900,Newcastle (C) +2020-08-05,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-08-05,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-05,2042,Locally acquired - source not identified,X700,Sydney,17200,Sydney (C) +2020-08-05,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-05,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-05,2017,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-08-05,2196,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-08-05,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-08-05,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-06,2303,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15900,Newcastle (C) +2020-08-06,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-06,2303,Locally acquired - contact of a confirmed case and/or in a known cluster,X800,Hunter New England,15900,Newcastle (C) +2020-08-06,2046,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-08-06,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-06,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-06,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-06,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-06,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-06,2161,Interstate,X740,Western Sydney,12380,Cumberland (A) +2020-08-06,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-08-06,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-07,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-07,2156,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-07,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-07,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-07,2165,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-07,,Overseas,,,, +2020-08-07,2017,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-08-07,2165,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-08,2870,Overseas,X850,Western NSW,16200,Parkes (A) +2020-08-08,2120,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-08-08,2120,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-08-08,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-08,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-08,2120,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-08-08,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-08,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-08,2154,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-08,2763,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-08,2234,Interstate,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-08-08,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-08,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-08,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-09,2125,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-09,2125,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-09,,Overseas,,,, +2020-08-09,2142,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-09,2154,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-09,2150,Locally acquired - source not identified,X740,Western Sydney,16260,Parramatta (C) +2020-08-09,2155,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-09,2768,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-09,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-09,2154,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-09,2154,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-09,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-09,2125,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-10,2259,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-08-10,2154,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-10,2113,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-08-10,2076,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-08-10,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-10,2536,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,12750,Eurobodalla (A) +2020-08-10,2156,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-10,2111,Interstate,X760,Northern Sydney,14100,Hunters Hill (A) +2020-08-10,2536,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,12750,Eurobodalla (A) +2020-08-10,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-10,2155,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-10,2159,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-08-10,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-10,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-10,2536,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,12750,Eurobodalla (A) +2020-08-10,2125,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-10,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-10,,Overseas,,,, +2020-08-10,,Overseas,,,, +2020-08-10,2766,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-10,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-08-10,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-08-10,2119,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-08-11,2571,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18400,Wollondilly (A) +2020-08-11,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-11,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-11,2145,Interstate,X740,Western Sydney,12380,Cumberland (A) +2020-08-11,2145,Interstate,X740,Western Sydney,12380,Cumberland (A) +2020-08-11,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-11,2747,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-08-11,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-11,2156,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-11,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-11,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-11,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-11,2168,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-08-11,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-11,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-12,,Overseas,,,, +2020-08-12,,Overseas,,,, +2020-08-12,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-12,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-12,2066,Overseas,X760,Northern Sydney,14700,Lane Cove (A) +2020-08-12,,Overseas,,,, +2020-08-12,2200,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-12,,Overseas,,,, +2020-08-12,2155,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-12,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-13,2027,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-08-13,2027,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-08-13,2166,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-08-13,2213,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-13,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-13,,Overseas,,,, +2020-08-13,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-13,,Overseas,,,, +2020-08-13,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-13,2199,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-13,2027,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-08-13,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-13,2157,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-08-14,2154,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-14,2160,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-14,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-14,2160,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-08-14,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-14,2176,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-14,2142,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-15,2213,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-15,2144,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-15,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-15,2154,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-15,2213,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-08-16,2142,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-16,2142,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-16,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-08-16,2752,Locally acquired - source not identified,X710,South Western Sydney,18400,Wollondilly (A) +2020-08-16,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-17,,Overseas,,,, +2020-08-17,2101,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-08-17,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-18,2229,Interstate,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-08-18,2770,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-18,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-18,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-18,2177,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-08-18,2101,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-08-18,2177,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-08-18,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-19,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-19,,Overseas,,,, +2020-08-20,2166,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-08-20,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-20,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-20,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-08-20,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-21,2154,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-21,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-21,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-21,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-08-21,2168,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-08-21,2770,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-21,2194,Locally acquired - source not identified,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-08-22,2535,Overseas,X730,Illawarra Shoalhaven,16950,Shoalhaven (C) +2020-08-22,2135,Overseas,X700,Sydney,17100,Strathfield (A) +2020-08-23,,Overseas,,,, +2020-08-23,2147,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-23,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-08-24,,Overseas,,,, +2020-08-24,,Overseas,,,, +2020-08-24,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-08-24,2177,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-25,2094,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-08-25,2203,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-08-25,2762,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-08-25,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-08-25,2762,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-08-25,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-08-26,2110,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-08-26,2069,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-08-26,2256,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-08-26,2076,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-08-26,,Overseas,,,, +2020-08-26,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-26,2762,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-26,2165,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-26,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-08-26,2010,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-08-26,2165,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-26,2762,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-27,2762,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-27,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-27,2032,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-08-27,2066,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14700,Lane Cove (A) +2020-08-27,2203,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-08-27,2216,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-08-27,2090,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-08-27,2147,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-08-27,2134,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11300,Burwood (A) +2020-08-27,2234,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-08-27,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-27,2074,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-08-27,2566,Locally acquired - source not identified,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-08-27,2228,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-08-27,2163,Locally acquired - source not identified,X710,South Western Sydney,12850,Fairfield (C) +2020-08-28,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-08-28,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-08-28,,Overseas,,,, +2020-08-28,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-08-28,2074,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-08-28,2075,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-08-28,2196,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-08-28,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-08-28,2127,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-08-28,2017,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-08-29,2041,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-08-29,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-08-29,2075,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-08-29,2030,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-08-29,2770,Locally acquired - source not identified,X740,Western Sydney,10750,Blacktown (C) +2020-08-29,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-08-29,2024,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-08-30,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-08-30,2075,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-08-30,2762,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-08-30,2081,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-08-30,,Overseas,,,, +2020-08-30,,Overseas,,,, +2020-08-30,2194,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-08-30,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-08-30,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-08-30,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-30,,Overseas,,,, +2020-08-31,2425,Overseas,X800,Hunter New England,15240,Mid-Coast (A) +2020-08-31,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-31,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-31,2095,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15990,Northern Beaches (A) +2020-08-31,2144,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-31,2077,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14000,Hornsby (A) +2020-08-31,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-08-31,2090,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-08-31,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-31,2256,Locally acquired - contact of a confirmed case and/or in a known cluster,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-08-31,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-08-31,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-09-01,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-01,2027,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-09-01,2076,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-09-01,2088,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15350,Mosman (A) +2020-09-01,2069,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-09-01,2026,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-01,2160,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-09-01,2870,Locally acquired - source not identified,X850,Western NSW,16200,Parkes (A) +2020-09-01,2047,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-09-01,2011,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-09-01,2162,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-09-01,2033,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-09-01,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-09-01,2044,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-09-01,2000,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-09-01,2160,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-09-02,2160,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-09-02,2031,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-09-02,2212,Locally acquired - source not identified,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-09-02,2212,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-09-02,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-09-02,,Overseas,,,, +2020-09-02,2217,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-09-02,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-02,2666,Overseas,X840,Murrumbidgee,17350,Temora (A) +2020-09-02,2135,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17100,Strathfield (A) +2020-09-03,2032,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-09-03,2162,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-09-03,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-09-03,2162,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-09-03,,Overseas,,,, +2020-09-03,2023,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18500,Woollahra (A) +2020-09-03,2067,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,18250,Willoughby (C) +2020-09-04,2508,Locally acquired - contact of a confirmed case and/or in a known cluster,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-09-04,2212,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-09-04,2030,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-04,2070,Locally acquired - source not identified,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-09-04,2194,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-09-04,2069,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-09-04,2229,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-09-05,2769,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-09-05,2030,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-05,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-09-05,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-09-05,2529,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-09-05,2041,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,14170,Inner West (A) +2020-09-05,2194,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-09-05,2030,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-06,2111,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-09-06,2153,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,17420,The Hills Shire (A) +2020-09-06,2571,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18400,Wollondilly (A) +2020-09-06,2132,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11300,Burwood (A) +2020-09-07,2652,Locally acquired - contact of a confirmed case and/or in a known cluster,X840,Murrumbidgee,17750,Wagga Wagga (C) +2020-09-07,,Overseas,,,, +2020-09-07,,Overseas,,,, +2020-09-07,2132,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11300,Burwood (A) +2020-09-07,2133,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-09-07,2035,Locally acquired - source not identified,X720,South Eastern Sydney,16550,Randwick (C) +2020-09-07,2760,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-09-07,2142,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-09-07,2234,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-09-07,2132,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11300,Burwood (A) +2020-09-07,2147,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-09-08,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-08,2081,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-09-08,2072,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-09-08,2061,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,15950,North Sydney (A) +2020-09-08,2763,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-09-09,2161,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-09-09,2008,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,17200,Sydney (C) +2020-09-09,2783,Overseas,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-09-09,2115,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-09-09,2782,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-09-09,2515,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-09-09,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-09-09,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-09-09,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-09,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-10,2519,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-09-10,2036,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-09-10,2336,Overseas,X800,Hunter New England,17620,Upper Hunter Shire (A) +2020-09-10,2132,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11300,Burwood (A) +2020-09-10,2111,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-09-10,,Overseas,,,, +2020-09-10,2022,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-10,,Overseas,,,, +2020-09-11,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-09-11,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-11,2760,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-09-11,2024,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,18050,Waverley (A) +2020-09-11,2782,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-09-11,2167,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-09-11,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-09-11,2160,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-09-12,2167,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-09-12,,Overseas,,,, +2020-09-12,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-09-12,,Overseas,,,, +2020-09-12,,Overseas,,,, +2020-09-12,2137,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11520,Canada Bay (A) +2020-09-13,2035,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,16550,Randwick (C) +2020-09-13,,Overseas,,,, +2020-09-13,,Overseas,,,, +2020-09-13,2161,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-09-13,2133,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-09-13,,Overseas,,,, +2020-09-13,2220,Interstate,X720,South Eastern Sydney,12930,Georges River (A) +2020-09-14,,Overseas,,,, +2020-09-14,,Overseas,,,, +2020-09-14,2780,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-09-14,,Overseas,,,, +2020-09-14,2167,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-09-14,2768,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-09-14,,Overseas,,,, +2020-09-15,2110,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14100,Hunters Hill (A) +2020-09-15,2778,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-09-15,,Overseas,,,, +2020-09-15,2780,Locally acquired - contact of a confirmed case and/or in a known cluster,X750,Nepean Blue Mountains,10900,Blue Mountains (C) +2020-09-15,,Overseas,,,, +2020-09-16,,Overseas,,,, +2020-09-16,2162,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-09-16,2000,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,17200,Sydney (C) +2020-09-16,2537,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-09-16,2165,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-09-16,,Overseas,,,, +2020-09-16,,Overseas,,,, +2020-09-17,2566,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-09-17,2150,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-09-17,,Overseas,,,, +2020-09-18,,Overseas,,,, +2020-09-18,2222,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-09-18,2225,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-09-18,,Overseas,,,, +2020-09-19,2170,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-09-20,,Overseas,,,, +2020-09-20,,Overseas,,,, +2020-09-20,2222,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,12930,Georges River (A) +2020-09-20,,Overseas,,,, +2020-09-20,,Overseas,,,, +2020-09-21,,Overseas,,,, +2020-09-22,2216,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-09-22,,Overseas,,,, +2020-09-22,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-09-22,2216,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-09-22,2216,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-09-22,2032,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-09-23,2560,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-09-23,2011,Overseas,X720,South Eastern Sydney,17200,Sydney (C) +2020-09-23,,Overseas,,,, +2020-09-24,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-09-24,,Overseas,,,, +2020-09-25,2228,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-09-28,2067,Overseas,X760,Northern Sydney,18250,Willoughby (C) +2020-09-28,2163,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-09-28,2147,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-09-28,,Overseas,,,, +2020-09-28,,Overseas,,,, +2020-09-29,2141,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-09-29,2141,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-09-30,,Overseas,,,, +2020-09-30,2763,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-09-30,2170,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-09-30,2762,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-10-01,2196,Interstate,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-10-01,,Overseas,,,, +2020-10-01,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-03,2111,Overseas,X760,Northern Sydney,14100,Hunters Hill (A) +2020-10-03,,Overseas,,,, +2020-10-03,,Overseas,,,, +2020-10-04,2142,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-04,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-10-05,,Overseas,,,, +2020-10-05,,Overseas,,,, +2020-10-05,,Overseas,,,, +2020-10-05,,Overseas,,,, +2020-10-05,,Overseas,,,, +2020-10-05,,Overseas,,,, +2020-10-05,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-10-05,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-10-05,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-10-06,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-10-06,,Overseas,,,, +2020-10-06,,Overseas,,,, +2020-10-07,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-07,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-07,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-07,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-07,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-07,2571,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18400,Wollondilly (A) +2020-10-07,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-07,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-10-07,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-10-07,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-10-07,2570,Locally acquired - source not identified,X710,South Western Sydney,11450,Camden (A) +2020-10-07,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-10-07,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-10-07,2150,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,16260,Parramatta (C) +2020-10-07,2571,Locally acquired - source not identified,X710,South Western Sydney,18400,Wollondilly (A) +2020-10-08,2768,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-10-08,,Overseas,,,, +2020-10-08,2580,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-10-08,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-10-08,2762,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-10-08,2173,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-10-09,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-10-09,2122,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,16700,Ryde (C) +2020-10-09,2557,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-09,2304,Overseas,X800,Hunter New England,15900,Newcastle (C) +2020-10-10,2290,Overseas,X800,Hunter New England,14650,Lake Macquarie (C) +2020-10-10,2034,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-10-10,2195,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-10-10,,Overseas,,,, +2020-10-10,2174,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-10-10,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-10-10,2174,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-10-11,2221,Overseas,X720,South Eastern Sydney,12930,Georges River (A) +2020-10-11,2195,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-10-11,,Overseas,,,, +2020-10-11,,Overseas,,,, +2020-10-11,2151,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-10-12,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-12,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-10-12,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-12,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-12,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-12,,Overseas,,,, +2020-10-12,,Overseas,,,, +2020-10-12,,Overseas,,,, +2020-10-12,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-12,2151,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-10-12,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-10-12,,Overseas,,,, +2020-10-12,,Overseas,,,, +2020-10-12,2076,Overseas,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-10-12,2567,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-13,2195,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-10-13,2195,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-10-13,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-10-13,2146,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-10-13,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-10-13,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-10-13,2766,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-10-13,2145,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,12380,Cumberland (A) +2020-10-13,2574,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18400,Wollondilly (A) +2020-10-13,2145,Locally acquired - source not identified,X740,Western Sydney,12380,Cumberland (A) +2020-10-13,2195,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-10-13,2072,Locally acquired - contact of a confirmed case and/or in a known cluster,X760,Northern Sydney,14500,Ku-ring-gai (A) +2020-10-14,2217,Locally acquired - contact of a confirmed case and/or in a known cluster,X720,South Eastern Sydney,10500,Bayside (A) +2020-10-14,2195,Locally acquired - contact of a confirmed case and/or in a known cluster,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-10-14,2766,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-10-14,2173,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-10-14,,Overseas,,,, +2020-10-14,2574,Locally acquired - source not identified,X710,South Western Sydney,18400,Wollondilly (A) +2020-10-14,,Overseas,,,, +2020-10-14,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-14,2766,Locally acquired - contact of a confirmed case and/or in a known cluster,X740,Western Sydney,10750,Blacktown (C) +2020-10-14,2566,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-10-15,2768,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-10-15,,Overseas,,,, +2020-10-15,2035,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-10-16,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-16,2154,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-10-16,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-16,2567,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-16,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-16,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-16,,Overseas,,,, +2020-10-17,2035,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-10-17,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-17,2261,Overseas,X770,Central Coast,11650,Central Coast (C) (NSW) +2020-10-17,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-17,,Overseas,,,, +2020-10-17,,Overseas,,,, +2020-10-18,,Overseas,,,, +2020-10-18,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-10-18,2227,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-10-18,2195,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-10-18,2179,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-10-18,2153,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-10-19,2750,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-10-19,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-19,2570,Overseas,X710,South Western Sydney,11450,Camden (A) +2020-10-19,2560,Overseas,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-10-19,,Overseas,,,, +2020-10-19,2234,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-10-19,2527,Overseas,X730,Illawarra Shoalhaven,16900,Shellharbour (C) +2020-10-19,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-19,2580,Locally acquired - contact of a confirmed case and/or in a known cluster,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-10-19,2041,Overseas,X700,Sydney,14170,Inner West (A) +2020-10-20,,Overseas,,,, +2020-10-20,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-20,2038,Overseas,X700,Sydney,14170,Inner West (A) +2020-10-20,2217,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-10-21,,Overseas,,,, +2020-10-21,,Overseas,,,, +2020-10-21,,Overseas,,,, +2020-10-21,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-10-21,2127,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-10-21,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-10-21,,Overseas,,,, +2020-10-21,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-21,,Overseas,,,, +2020-10-22,,Overseas,,,, +2020-10-22,2146,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-10-22,2484,Overseas,X810,Northern NSW,17550,Tweed (A) +2020-10-23,2160,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-23,2134,Overseas,X700,Sydney,11300,Burwood (A) +2020-10-23,,Overseas,,,, +2020-10-23,2150,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-10-23,,Overseas,,,, +2020-10-23,2155,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-10-24,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-10-24,,Overseas,,,, +2020-10-24,2172,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-10-24,2171,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-10-24,,Overseas,,,, +2020-10-24,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-10-24,,Overseas,,,, +2020-10-25,2045,Overseas,X700,Sydney,14170,Inner West (A) +2020-10-25,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-10-25,,Overseas,,,, +2020-10-26,,Overseas,,,, +2020-10-26,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-26,2154,Overseas,X740,Western Sydney,17420,The Hills Shire (A) +2020-10-26,2131,Overseas,X700,Sydney,14170,Inner West (A) +2020-10-26,,Overseas,,,, +2020-10-26,2570,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11450,Camden (A) +2020-10-26,2767,Overseas,X740,Western Sydney,10750,Blacktown (C) +2020-10-26,2146,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-10-26,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-10-26,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-10-26,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-10-26,2009,Overseas,X700,Sydney,17200,Sydney (C) +2020-10-26,2009,Overseas,X700,Sydney,17200,Sydney (C) +2020-10-26,2164,Overseas,X710,South Western Sydney,12850,Fairfield (C) +2020-10-26,2131,Overseas,X700,Sydney,14170,Inner West (A) +2020-10-27,,Overseas,,,, +2020-10-27,,Overseas,,,, +2020-10-27,,Overseas,,,, +2020-10-27,2031,Overseas,X720,South Eastern Sydney,16550,Randwick (C) +2020-10-27,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-10-28,2171,Locally acquired - source not identified,X710,South Western Sydney,14900,Liverpool (C) +2020-10-28,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-10-28,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-10-28,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-10-29,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-10-29,2142,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-29,2142,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-29,2142,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-29,2144,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-29,2229,Overseas,X720,South Eastern Sydney,17150,Sutherland Shire (A) +2020-10-29,2142,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-10-30,,Overseas,,,, +2020-10-30,,Overseas,,,, +2020-10-30,2216,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-10-30,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-10-31,2747,Overseas,X750,Nepean Blue Mountains,16350,Penrith (C) +2020-10-31,,Overseas,,,, +2020-10-31,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-10-31,2536,Overseas,X830,Southern NSW,12750,Eurobodalla (A) +2020-10-31,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-11-01,2026,Overseas,X720,South Eastern Sydney,18050,Waverley (A) +2020-11-01,2216,Overseas,X720,South Eastern Sydney,10500,Bayside (A) +2020-11-01,,Overseas,,,, +2020-11-01,2481,Overseas,X810,Northern NSW,11350,Byron (A) +2020-11-01,2171,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,14900,Liverpool (C) +2020-11-02,2164,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-11-02,2360,Overseas,X800,Hunter New England,14200,Inverell (A) +2020-11-02,2582,Overseas,X830,Southern NSW,18710,Yass Valley (A) +2020-11-02,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-11-03,2099,Overseas,X760,Northern Sydney,15990,Northern Beaches (A) +2020-11-03,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-11-03,,Overseas,,,, +2020-11-03,2565,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,11500,Campbelltown (C) (NSW) +2020-11-03,2582,Overseas,X830,Southern NSW,18710,Yass Valley (A) +2020-11-03,2166,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,12850,Fairfield (C) +2020-11-03,2161,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-11-04,2079,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-11-04,,Overseas,,,, +2020-11-04,,Overseas,,,, +2020-11-05,2211,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-11-05,2577,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-11-05,,Overseas,,,, +2020-11-05,2577,Locally acquired - source not identified,X710,South Western Sydney,18350,Wingecarribee (A) +2020-11-05,,Overseas,,,, +2020-11-05,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-11-05,2577,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-11-05,2173,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-11-05,2577,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-11-05,2170,Overseas,X710,South Western Sydney,14900,Liverpool (C) +2020-11-06,2126,Overseas,X760,Northern Sydney,14000,Hornsby (A) +2020-11-06,2140,Overseas,X700,Sydney,17100,Strathfield (A) +2020-11-06,2577,Locally acquired - contact of a confirmed case and/or in a known cluster,X710,South Western Sydney,18350,Wingecarribee (A) +2020-11-06,,Overseas,,,, +2020-11-06,2500,Overseas,X730,Illawarra Shoalhaven,18450,Wollongong (C) +2020-11-07,2008,Overseas,X700,Sydney,17200,Sydney (C) +2020-11-07,2192,Overseas,X700,Sydney,11570,Canterbury-Bankstown (A) +2020-11-07,,Overseas,,,, +2020-11-07,,Overseas,,,, +2020-11-08,,Overseas,,,, +2020-11-08,,Overseas,,,, +2020-11-08,2145,Overseas,X740,Western Sydney,12380,Cumberland (A) +2020-11-08,,Overseas,,,, +2020-11-08,2316,Overseas,X800,Hunter New England,16400,Port Stephens (A) +2020-11-08,,Overseas,,,, +2020-11-08,,Overseas,,,, +2020-11-09,2580,Overseas,X830,Southern NSW,13310,Goulburn Mulwaree (A) +2020-11-09,2008,Overseas,X700,Sydney,17200,Sydney (C) +2020-11-09,2151,Overseas,X740,Western Sydney,16260,Parramatta (C) +2020-11-09,,Overseas,,,, +2020-11-09,,Overseas,,,, +2020-11-10,,Overseas,,,, +2020-11-10,,Overseas,,,, +2020-11-11,,Overseas,,,, +2020-11-11,,Overseas,,,, +2020-11-11,2200,Overseas,X710,South Western Sydney,11570,Canterbury-Bankstown (A) +2020-11-11,,Overseas,,,, +2020-11-11,,Overseas,,,, +2020-11-12,,Overseas,,,, diff --git a/examples/first_hit_example.py b/examples/first_hit_example.py new file mode 100644 index 0000000..0f916a6 --- /dev/null +++ b/examples/first_hit_example.py @@ -0,0 +1,54 @@ +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd + +from relm.mechanisms import AboveThreshold, SparseIndicator, SparseNumeric + +EPSILON = 1.0 +THRESHOLD = 100.0 + +# ======================================================================================== + +# Read the raw data. +data = pd.read_csv("confirmed_cases_table4_likely_source.csv") + +# Compute the exact first-hit index. +exact_counts = data["notification_date"].value_counts().sort_index() +values = exact_counts.values.astype(np.float64) +exact_first_hit = np.where(values >= THRESHOLD)[0][0] + +# ======================================================================================== + +# Offline (batch) usage +# Create a differentially private release mechanism. +mechanism = AboveThreshold( + epsilon=EPSILON, sensitivity=1.0, threshold=THRESHOLD, monotonic=True +) + +# Compute the differentially private first-hit index. +# Evaluate the values as a single batch +dp_first_hit = mechanism.release(values=values) + +print("Offline usage results") +print("\tExact first-hit index: %i" % exact_first_hit) +print("\tDifferentially private first-hit index: %i\n" % dp_first_hit) + +# ======================================================================================== + +# Online (streaming) usage +# Create a differentially private release mechanism. +mechanism = AboveThreshold( + epsilon=EPSILON, sensitivity=1.0, threshold=THRESHOLD, monotonic=True +) + +# Compute the differentially private first-hit index. +# Evaluate the values one at a time +for index, value in enumerate(values): + hit = mechanism.release(values=values[index : index + 1]) + if hit is not None: + dp_first_hit = index + break + +print("Online usage results") +print("\tExact first-hit index: %i" % exact_first_hit) +print("\tDifferentially private first-hit index: %i\n" % dp_first_hit) diff --git a/examples/histogram_query.py b/examples/histogram_query.py new file mode 100644 index 0000000..7c9eb92 --- /dev/null +++ b/examples/histogram_query.py @@ -0,0 +1,32 @@ +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt + +from relm.mechanisms import GeometricMechanism + +# Read the raw data. +data = pd.read_csv("pcr_testing_age_group_2020-03-09.csv") + +# Compute the exact query responses. +exact_counts = data["age_group"].value_counts().sort_index() + +# Create a differentially private release mechanism. +mechanism = GeometricMechanism(epsilon=0.1, sensitivity=1.0) + +# Compute perturbed query responses. +perturbed_counts = mechanism.release(values=exact_counts.values) + +# Display the exact query responses alongside the perturbed query responses. +age_groups = np.sort(data["age_group"].unique()) +age_ranges = np.array([a.lstrip("AgeGroup_") for a in age_groups]) +df = pd.DataFrame( + { + "Age Group": age_ranges, + "Exact Counts": exact_counts, + "Perturbed Counts": perturbed_counts, + } +) +print(df) + +df.plot(x="Age Group", title="Test Counts by Age Group", kind="bar", rot=0) +plt.show() From d0db42b5879ac829f97b3ae11f0cbd85b7fc7377 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Mon, 16 Nov 2020 16:08:30 +1100 Subject: [PATCH 004/185] mv first_hit_query.py argmin_query.py --- examples/argmin_query.py | 54 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 examples/argmin_query.py diff --git a/examples/argmin_query.py b/examples/argmin_query.py new file mode 100644 index 0000000..0f916a6 --- /dev/null +++ b/examples/argmin_query.py @@ -0,0 +1,54 @@ +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd + +from relm.mechanisms import AboveThreshold, SparseIndicator, SparseNumeric + +EPSILON = 1.0 +THRESHOLD = 100.0 + +# ======================================================================================== + +# Read the raw data. +data = pd.read_csv("confirmed_cases_table4_likely_source.csv") + +# Compute the exact first-hit index. +exact_counts = data["notification_date"].value_counts().sort_index() +values = exact_counts.values.astype(np.float64) +exact_first_hit = np.where(values >= THRESHOLD)[0][0] + +# ======================================================================================== + +# Offline (batch) usage +# Create a differentially private release mechanism. +mechanism = AboveThreshold( + epsilon=EPSILON, sensitivity=1.0, threshold=THRESHOLD, monotonic=True +) + +# Compute the differentially private first-hit index. +# Evaluate the values as a single batch +dp_first_hit = mechanism.release(values=values) + +print("Offline usage results") +print("\tExact first-hit index: %i" % exact_first_hit) +print("\tDifferentially private first-hit index: %i\n" % dp_first_hit) + +# ======================================================================================== + +# Online (streaming) usage +# Create a differentially private release mechanism. +mechanism = AboveThreshold( + epsilon=EPSILON, sensitivity=1.0, threshold=THRESHOLD, monotonic=True +) + +# Compute the differentially private first-hit index. +# Evaluate the values one at a time +for index, value in enumerate(values): + hit = mechanism.release(values=values[index : index + 1]) + if hit is not None: + dp_first_hit = index + break + +print("Online usage results") +print("\tExact first-hit index: %i" % exact_first_hit) +print("\tDifferentially private first-hit index: %i\n" % dp_first_hit) From 4cb8a1e7349b9813b4ba0544285a6211a877313d Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Mon, 16 Nov 2020 16:10:37 +1100 Subject: [PATCH 005/185] Changing file names to better reflect purpose of example queries --- examples/differentially_private_histogram.py | 32 ------------ examples/first_hit_example.py | 54 -------------------- 2 files changed, 86 deletions(-) delete mode 100644 examples/differentially_private_histogram.py delete mode 100644 examples/first_hit_example.py diff --git a/examples/differentially_private_histogram.py b/examples/differentially_private_histogram.py deleted file mode 100644 index 7c9eb92..0000000 --- a/examples/differentially_private_histogram.py +++ /dev/null @@ -1,32 +0,0 @@ -import numpy as np -import pandas as pd -import matplotlib.pyplot as plt - -from relm.mechanisms import GeometricMechanism - -# Read the raw data. -data = pd.read_csv("pcr_testing_age_group_2020-03-09.csv") - -# Compute the exact query responses. -exact_counts = data["age_group"].value_counts().sort_index() - -# Create a differentially private release mechanism. -mechanism = GeometricMechanism(epsilon=0.1, sensitivity=1.0) - -# Compute perturbed query responses. -perturbed_counts = mechanism.release(values=exact_counts.values) - -# Display the exact query responses alongside the perturbed query responses. -age_groups = np.sort(data["age_group"].unique()) -age_ranges = np.array([a.lstrip("AgeGroup_") for a in age_groups]) -df = pd.DataFrame( - { - "Age Group": age_ranges, - "Exact Counts": exact_counts, - "Perturbed Counts": perturbed_counts, - } -) -print(df) - -df.plot(x="Age Group", title="Test Counts by Age Group", kind="bar", rot=0) -plt.show() diff --git a/examples/first_hit_example.py b/examples/first_hit_example.py deleted file mode 100644 index 0f916a6..0000000 --- a/examples/first_hit_example.py +++ /dev/null @@ -1,54 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -import pandas as pd - -from relm.mechanisms import AboveThreshold, SparseIndicator, SparseNumeric - -EPSILON = 1.0 -THRESHOLD = 100.0 - -# ======================================================================================== - -# Read the raw data. -data = pd.read_csv("confirmed_cases_table4_likely_source.csv") - -# Compute the exact first-hit index. -exact_counts = data["notification_date"].value_counts().sort_index() -values = exact_counts.values.astype(np.float64) -exact_first_hit = np.where(values >= THRESHOLD)[0][0] - -# ======================================================================================== - -# Offline (batch) usage -# Create a differentially private release mechanism. -mechanism = AboveThreshold( - epsilon=EPSILON, sensitivity=1.0, threshold=THRESHOLD, monotonic=True -) - -# Compute the differentially private first-hit index. -# Evaluate the values as a single batch -dp_first_hit = mechanism.release(values=values) - -print("Offline usage results") -print("\tExact first-hit index: %i" % exact_first_hit) -print("\tDifferentially private first-hit index: %i\n" % dp_first_hit) - -# ======================================================================================== - -# Online (streaming) usage -# Create a differentially private release mechanism. -mechanism = AboveThreshold( - epsilon=EPSILON, sensitivity=1.0, threshold=THRESHOLD, monotonic=True -) - -# Compute the differentially private first-hit index. -# Evaluate the values one at a time -for index, value in enumerate(values): - hit = mechanism.release(values=values[index : index + 1]) - if hit is not None: - dp_first_hit = index - break - -print("Online usage results") -print("\tExact first-hit index: %i" % exact_first_hit) -print("\tDifferentially private first-hit index: %i\n" % dp_first_hit) From 12c5787c9dfa558f1f57527c71311c2cc802470f Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Mon, 16 Nov 2020 16:33:43 +1100 Subject: [PATCH 006/185] Formatting for exmaple scripts --- examples/argmin_query.py | 65 ++++++++++++++++++++++++------------- examples/histogram_query.py | 11 ++++++- 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/examples/argmin_query.py b/examples/argmin_query.py index 0f916a6..0d12473 100644 --- a/examples/argmin_query.py +++ b/examples/argmin_query.py @@ -4,9 +4,12 @@ from relm.mechanisms import AboveThreshold, SparseIndicator, SparseNumeric -EPSILON = 1.0 +EPSILON = 2 ** -3 +SENSITIVITY = 1.0 THRESHOLD = 100.0 +TRIALS = 16 + # ======================================================================================== # Read the raw data. @@ -20,35 +23,53 @@ # ======================================================================================== # Offline (batch) usage -# Create a differentially private release mechanism. -mechanism = AboveThreshold( - epsilon=EPSILON, sensitivity=1.0, threshold=THRESHOLD, monotonic=True -) +# Perform TRIALS independent experiments +dp_first_hits = np.zeros(TRIALS, dtype=np.int) +for i in range(TRIALS): + # Create a differentially private release mechanism. + mechanism = AboveThreshold( + epsilon=EPSILON, sensitivity=SENSITIVITY, threshold=THRESHOLD, monotonic=True + ) + + # Compute the differentially private first-hit index. + # Evaluate the values as a single batch + dp_first_hits[i] = mechanism.release(values=values) -# Compute the differentially private first-hit index. -# Evaluate the values as a single batch -dp_first_hit = mechanism.release(values=values) +# ---------------------------------------------------------------------------------------- +# Display the exact query responses alongside the perturbed query responses. print("Offline usage results") print("\tExact first-hit index: %i" % exact_first_hit) -print("\tDifferentially private first-hit index: %i\n" % dp_first_hit) +print("\tDifferentially private first-hit indices:") +for i in range(TRIALS): + print("\t\t" + "Experiment %i: %i" % (i, dp_first_hits[i])) + +print("") # ======================================================================================== # Online (streaming) usage -# Create a differentially private release mechanism. -mechanism = AboveThreshold( - epsilon=EPSILON, sensitivity=1.0, threshold=THRESHOLD, monotonic=True -) - -# Compute the differentially private first-hit index. -# Evaluate the values one at a time -for index, value in enumerate(values): - hit = mechanism.release(values=values[index : index + 1]) - if hit is not None: - dp_first_hit = index - break +# Perform TRIALS independent experiments +dp_first_hits = np.zeros(TRIALS, dtype=np.int) +for i in range(TRIALS): + # Create a differentially private release mechanism. + mechanism = AboveThreshold( + epsilon=EPSILON, sensitivity=SENSITIVITY, threshold=THRESHOLD, monotonic=True + ) + + # Compute the differentially private first-hit index. + # Evaluate the values one at a time + for index, value in enumerate(values): + hit = mechanism.release(values=values[index : index + 1]) + if hit is not None: + dp_first_hits[i] = index + break + +# ---------------------------------------------------------------------------------------- +# Display the exact query responses alongside the perturbed query responses. print("Online usage results") print("\tExact first-hit index: %i" % exact_first_hit) -print("\tDifferentially private first-hit index: %i\n" % dp_first_hit) +print("\tDifferentially private first-hit indices:") +for i in range(TRIALS): + print("\t\t" + "Experiment %i: %i" % (i, dp_first_hits[i])) diff --git a/examples/histogram_query.py b/examples/histogram_query.py index 7c9eb92..8d29996 100644 --- a/examples/histogram_query.py +++ b/examples/histogram_query.py @@ -4,18 +4,27 @@ from relm.mechanisms import GeometricMechanism +EPSILON = 2 ** -3 +SENSITIVITY = 1.0 + +# ======================================================================================== + # Read the raw data. data = pd.read_csv("pcr_testing_age_group_2020-03-09.csv") # Compute the exact query responses. exact_counts = data["age_group"].value_counts().sort_index() +# ======================================================================================== + # Create a differentially private release mechanism. -mechanism = GeometricMechanism(epsilon=0.1, sensitivity=1.0) +mechanism = GeometricMechanism(epsilon=EPSILON, sensitivity=SENSITIVITY) # Compute perturbed query responses. perturbed_counts = mechanism.release(values=exact_counts.values) +# ---------------------------------------------------------------------------------------- + # Display the exact query responses alongside the perturbed query responses. age_groups = np.sort(data["age_group"].unique()) age_ranges = np.array([a.lstrip("AgeGroup_") for a in age_groups]) From 08e4a40eff1ac156c0626eebb799e2a869d94a62 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Mon, 16 Nov 2020 16:48:12 +1100 Subject: [PATCH 007/185] Formatting examples for consistency --- examples/argmin_query.py | 60 +++++++++++++++++-------------------- examples/histogram_query.py | 12 ++++++-- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/examples/argmin_query.py b/examples/argmin_query.py index 0d12473..4acb2fb 100644 --- a/examples/argmin_query.py +++ b/examples/argmin_query.py @@ -22,54 +22,48 @@ # ======================================================================================== -# Offline (batch) usage -# Perform TRIALS independent experiments -dp_first_hits = np.zeros(TRIALS, dtype=np.int) -for i in range(TRIALS): - # Create a differentially private release mechanism. - mechanism = AboveThreshold( - epsilon=EPSILON, sensitivity=SENSITIVITY, threshold=THRESHOLD, monotonic=True - ) - - # Compute the differentially private first-hit index. - # Evaluate the values as a single batch - dp_first_hits[i] = mechanism.release(values=values) +# Online (streaming) usage +# Create a differentially private release mechanism. +mechanism = AboveThreshold( + epsilon=EPSILON, sensitivity=SENSITIVITY, threshold=THRESHOLD, monotonic=True +) + +# Compute the differentially private first-hit index. +# Evaluate the values one at a time +for index, value in enumerate(values): + hit = mechanism.release(values=values[index : index + 1]) + if hit is not None: + dp_first_hit = index + break # ---------------------------------------------------------------------------------------- -# Display the exact query responses alongside the perturbed query responses. -print("Offline usage results") -print("\tExact first-hit index: %i" % exact_first_hit) -print("\tDifferentially private first-hit indices:") -for i in range(TRIALS): - print("\t\t" + "Experiment %i: %i" % (i, dp_first_hits[i])) +# Offline (batch) usage +# Create a differentially private release mechanism. +mechanism = AboveThreshold( + epsilon=EPSILON, sensitivity=SENSITIVITY, threshold=THRESHOLD, monotonic=True +) -print("") +# Compute the differentially private first-hit index. +# Evaluate the values as a single batch +dp_first_hit = mechanism.release(values=values) # ======================================================================================== -# Online (streaming) usage -# Perform TRIALS independent experiments +# Perform TRIALS independent experiments to capture the rondomized nature of +# of the release mechanism dp_first_hits = np.zeros(TRIALS, dtype=np.int) for i in range(TRIALS): - # Create a differentially private release mechanism. mechanism = AboveThreshold( epsilon=EPSILON, sensitivity=SENSITIVITY, threshold=THRESHOLD, monotonic=True ) - - # Compute the differentially private first-hit index. - # Evaluate the values one at a time - for index, value in enumerate(values): - hit = mechanism.release(values=values[index : index + 1]) - if hit is not None: - dp_first_hits[i] = index - break + dp_first_hits[i] = mechanism.release(values=values) # ---------------------------------------------------------------------------------------- -# Display the exact query responses alongside the perturbed query responses. -print("Online usage results") +# Display the exact first-hit index alongside the differentially private +# first-hit indices. print("\tExact first-hit index: %i" % exact_first_hit) print("\tDifferentially private first-hit indices:") for i in range(TRIALS): - print("\t\t" + "Experiment %i: %i" % (i, dp_first_hits[i])) + print("\t\tExperiment %i: %i" % (i, dp_first_hits[i])) diff --git a/examples/histogram_query.py b/examples/histogram_query.py index 8d29996..a8d5bc6 100644 --- a/examples/histogram_query.py +++ b/examples/histogram_query.py @@ -17,15 +17,21 @@ # ======================================================================================== +# Usage # Create a differentially private release mechanism. mechanism = GeometricMechanism(epsilon=EPSILON, sensitivity=SENSITIVITY) # Compute perturbed query responses. perturbed_counts = mechanism.release(values=exact_counts.values) -# ---------------------------------------------------------------------------------------- +# ======================================================================================== # Display the exact query responses alongside the perturbed query responses. +mechanism = GeometricMechanism(epsilon=EPSILON, sensitivity=SENSITIVITY) +perturbed_counts = mechanism.release(values=exact_counts.values) + +# ---------------------------------------------------------------------------------------- + age_groups = np.sort(data["age_group"].unique()) age_ranges = np.array([a.lstrip("AgeGroup_") for a in age_groups]) df = pd.DataFrame( @@ -37,5 +43,5 @@ ) print(df) -df.plot(x="Age Group", title="Test Counts by Age Group", kind="bar", rot=0) -plt.show() +# df.plot(x="Age Group", title="Test Counts by Age Group", kind="bar", rot=0) +# plt.show() From 4b1cccdf91ee38e8f04725c4607de8e57a1764ef Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Mon, 16 Nov 2020 16:55:50 +1100 Subject: [PATCH 008/185] Renamed argmin_query.py to first_hit_query.py --- examples/{argmin_query.py => first_hit_query.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename examples/{argmin_query.py => first_hit_query.py} (100%) diff --git a/examples/argmin_query.py b/examples/first_hit_query.py similarity index 100% rename from examples/argmin_query.py rename to examples/first_hit_query.py index 4acb2fb..43c8c19 100644 --- a/examples/argmin_query.py +++ b/examples/first_hit_query.py @@ -8,8 +8,6 @@ SENSITIVITY = 1.0 THRESHOLD = 100.0 -TRIALS = 16 - # ======================================================================================== # Read the raw data. @@ -50,6 +48,8 @@ # ======================================================================================== +TRIALS = 16 + # Perform TRIALS independent experiments to capture the rondomized nature of # of the release mechanism dp_first_hits = np.zeros(TRIALS, dtype=np.int) From 82e2afb0d08e43273ead26b631d4e257c758b301 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 16 Nov 2020 17:24:02 +1100 Subject: [PATCH 009/185] add release test --- .github/workflows/release-workflow.yml | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/release-workflow.yml diff --git a/.github/workflows/release-workflow.yml b/.github/workflows/release-workflow.yml new file mode 100644 index 0000000..da8f358 --- /dev/null +++ b/.github/workflows/release-workflow.yml @@ -0,0 +1,37 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Python package + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.5, 3.6, 3.7, 3.8] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Build + run: | + python -m pip install --upgrade pip + pip install . + - name: Test with pytest + run: | + pip install .[tests] + pytest tests + - name: Check formatting with black + run: | + pip install black + black --check relm tests \ No newline at end of file From ca87fa44cbfc5a11d401b7e34f07aec518838da1 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 16 Nov 2020 17:31:14 +1100 Subject: [PATCH 010/185] run release test daily to check dependency breaks --- .github/workflows/release-workflow.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release-workflow.yml b/.github/workflows/release-workflow.yml index da8f358..9fb0deb 100644 --- a/.github/workflows/release-workflow.yml +++ b/.github/workflows/release-workflow.yml @@ -3,11 +3,13 @@ name: Python package -on: +"on": push: branches: [ master ] pull_request: branches: [ master ] + schedule: + - cron: "0 0 * * *" jobs: build: From d7a54ab5cfb9fdbfa71fc139ffb58f28ab69aae6 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 16 Nov 2020 17:33:32 +1100 Subject: [PATCH 011/185] decrease min scipy version for python 3.5 compat --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4927ca6..2521660 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ extras_requires = { "docs": ["Sphinx==3.3.0", "sphinx-rtd-theme==0.5.0"], - "tests": ["pytest-benchmark==3.2.3", "pytest==6.0.1", "scipy==1.5.2"] + "tests": ["pytest-benchmark==3.2.3", "pytest==6.0.1", "scipy>=1.4.0"] } setup( From baca82520b799d79c539307a250ffd8dc186f013 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 16 Nov 2020 17:43:59 +1100 Subject: [PATCH 012/185] remove 3.5 support (3.5 reached end of life) --- .github/workflows/release-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-workflow.yml b/.github/workflows/release-workflow.yml index 9fb0deb..d912100 100644 --- a/.github/workflows/release-workflow.yml +++ b/.github/workflows/release-workflow.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.5, 3.6, 3.7, 3.8] + python-version: [3.6, 3.7, 3.8, 3.9] steps: - uses: actions/checkout@v2 From f5d5bba577522e6b5fdbfbda6d5546bdb24241fc Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 17 Nov 2020 09:15:37 +1100 Subject: [PATCH 013/185] Fixed a minor typo rondomized -> randomized. --- examples/first_hit_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/first_hit_query.py b/examples/first_hit_query.py index 43c8c19..2d4851f 100644 --- a/examples/first_hit_query.py +++ b/examples/first_hit_query.py @@ -50,7 +50,7 @@ TRIALS = 16 -# Perform TRIALS independent experiments to capture the rondomized nature of +# Perform TRIALS independent experiments to capture the randomized nature of # of the release mechanism dp_first_hits = np.zeros(TRIALS, dtype=np.int) for i in range(TRIALS): From 65ae19141fd7cf3f03f8237c2df3e5fdf2a5665a Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 17 Nov 2020 10:21:52 +1100 Subject: [PATCH 014/185] Added tests for example scripts --- examples/first_hit_query.py | 6 +++++- examples/histogram_query.py | 5 ++++- tests/test_examples.py | 10 ++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 tests/test_examples.py diff --git a/examples/first_hit_query.py b/examples/first_hit_query.py index 2d4851f..2113b07 100644 --- a/examples/first_hit_query.py +++ b/examples/first_hit_query.py @@ -1,6 +1,7 @@ import numpy as np import matplotlib.pyplot as plt import pandas as pd +import pathlib from relm.mechanisms import AboveThreshold, SparseIndicator, SparseNumeric @@ -11,7 +12,10 @@ # ======================================================================================== # Read the raw data. -data = pd.read_csv("confirmed_cases_table4_likely_source.csv") +filename = "confirmed_cases_table4_likely_source.csv" +path = pathlib.Path(__file__, "..", filename).resolve() +data = pd.read_csv(path) + # Compute the exact first-hit index. exact_counts = data["notification_date"].value_counts().sort_index() diff --git a/examples/histogram_query.py b/examples/histogram_query.py index a8d5bc6..ae928f9 100644 --- a/examples/histogram_query.py +++ b/examples/histogram_query.py @@ -1,6 +1,7 @@ import numpy as np import pandas as pd import matplotlib.pyplot as plt +import pathlib from relm.mechanisms import GeometricMechanism @@ -10,7 +11,9 @@ # ======================================================================================== # Read the raw data. -data = pd.read_csv("pcr_testing_age_group_2020-03-09.csv") +filename = "pcr_testing_age_group_2020-03-09.csv" +path = pathlib.Path(__file__, "..", filename).resolve() +data = pd.read_csv(path) # Compute the exact query responses. exact_counts = data["age_group"].value_counts().sort_index() diff --git a/tests/test_examples.py b/tests/test_examples.py new file mode 100644 index 0000000..dafbfee --- /dev/null +++ b/tests/test_examples.py @@ -0,0 +1,10 @@ +import pathlib +import runpy +import pytest + +path = pathlib.Path(__file__, '..', '..', 'examples').resolve() +scripts = path.glob('*.py') + +@pytest.mark.parametrize('script', scripts) +def test_script_execution(script): + runpy.run_path(script) From 784e56de1b694e699382747c3bde427e87bb289b Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 17 Nov 2020 11:16:03 +1100 Subject: [PATCH 015/185] Added pandas to dependencies in setup.py, removed matplotlib --- examples/histogram_query.py | 2 +- setup.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/histogram_query.py b/examples/histogram_query.py index ae928f9..2d37889 100644 --- a/examples/histogram_query.py +++ b/examples/histogram_query.py @@ -1,6 +1,5 @@ import numpy as np import pandas as pd -import matplotlib.pyplot as plt import pathlib from relm.mechanisms import GeometricMechanism @@ -46,5 +45,6 @@ ) print(df) +# import matplotlib.pyplot as plt # df.plot(x="Age Group", title="Test Counts by Age Group", kind="bar", rot=0) # plt.show() diff --git a/setup.py b/setup.py index 2521660..b0146f5 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,12 @@ extras_requires = { "docs": ["Sphinx==3.3.0", "sphinx-rtd-theme==0.5.0"], - "tests": ["pytest-benchmark==3.2.3", "pytest==6.0.1", "scipy>=1.4.0"] + "tests": [ + "pytest-benchmark==3.2.3", + "pytest==6.0.1", + "scipy>=1.4.0", + "pandas>=1.0.1", + ], } setup( From af71c40a2e8c54fbc11fbce79c19320917b74987 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 17 Nov 2020 11:29:12 +1100 Subject: [PATCH 016/185] Removed one more dangling matplotlib import --- examples/first_hit_query.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/first_hit_query.py b/examples/first_hit_query.py index 2113b07..3c800b7 100644 --- a/examples/first_hit_query.py +++ b/examples/first_hit_query.py @@ -1,5 +1,4 @@ import numpy as np -import matplotlib.pyplot as plt import pandas as pd import pathlib From 99bd34c12f7b774a6fccc53a09023727483732c4 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 17 Nov 2020 11:46:03 +1100 Subject: [PATCH 017/185] black formatting --- docs-source/conf.py | 22 ++++++++++++---------- tests/test_examples.py | 7 ++++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/docs-source/conf.py b/docs-source/conf.py index 71b6145..cc4472c 100644 --- a/docs-source/conf.py +++ b/docs-source/conf.py @@ -14,17 +14,19 @@ import sys try: - build_folder = next(filter(lambda fn: "lib" in fn, os.listdir('../build'))) + build_folder = next(filter(lambda fn: "lib" in fn, os.listdir("../build"))) except StopIteration: - RuntimeError("Project must be built before building docs. Run 'python setup.py install'.") + RuntimeError( + "Project must be built before building docs. Run 'python setup.py install'." + ) -sys.path.insert(0, os.path.abspath(os.path.join('..', 'build', 'build_folder'))) +sys.path.insert(0, os.path.abspath(os.path.join("..", "build", "build_folder"))) # -- Project information ----------------------------------------------------- -project = 'Differential Privacy' -copyright = '2020, Kieran Ricardo, Michael Purcell' -author = 'Kieran Ricardo, Michael Purcell' +project = "Differential Privacy" +copyright = "2020, Kieran Ricardo, Michael Purcell" +author = "Kieran Ricardo, Michael Purcell" # -- General configuration --------------------------------------------------- @@ -32,17 +34,17 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx.ext.napoleon'] +extensions = ["sphinx.ext.autodoc", "sphinx.ext.coverage", "sphinx.ext.napoleon"] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = '[en]' +language = "[en]" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -66,4 +68,4 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] \ No newline at end of file +html_static_path = ["_static"] diff --git a/tests/test_examples.py b/tests/test_examples.py index dafbfee..2646a60 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -2,9 +2,10 @@ import runpy import pytest -path = pathlib.Path(__file__, '..', '..', 'examples').resolve() -scripts = path.glob('*.py') +path = pathlib.Path(__file__, "..", "..", "examples").resolve() +scripts = path.glob("*.py") -@pytest.mark.parametrize('script', scripts) + +@pytest.mark.parametrize("script", scripts) def test_script_execution(script): runpy.run_path(script) From 3b17050c1c5de4cdf62fced3a290f71afcb3f8fc Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 17 Nov 2020 14:37:43 +1100 Subject: [PATCH 018/185] Playing with hyperparameters --- examples/histogram_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/histogram_query.py b/examples/histogram_query.py index 2d37889..df37dcb 100644 --- a/examples/histogram_query.py +++ b/examples/histogram_query.py @@ -4,7 +4,7 @@ from relm.mechanisms import GeometricMechanism -EPSILON = 2 ** -3 +EPSILON = 2 ** -4 SENSITIVITY = 1.0 # ======================================================================================== From 7c714f4b2d75ac65f43a36319da7d24f3d1b98dd Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 17 Nov 2020 14:47:22 +1100 Subject: [PATCH 019/185] Playing with hyperparameters again. --- examples/histogram_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/histogram_query.py b/examples/histogram_query.py index df37dcb..2d37889 100644 --- a/examples/histogram_query.py +++ b/examples/histogram_query.py @@ -4,7 +4,7 @@ from relm.mechanisms import GeometricMechanism -EPSILON = 2 ** -4 +EPSILON = 2 ** -3 SENSITIVITY = 1.0 # ======================================================================================== From 42193a761bdcb6de4b0bcc9252eff88072ecd439 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 17 Nov 2020 15:39:35 +1100 Subject: [PATCH 020/185] add basic privacy accounting --- relm/accountant.py | 14 ++++++++++++++ tests/test_accountant.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 relm/accountant.py create mode 100644 tests/test_accountant.py diff --git a/relm/accountant.py b/relm/accountant.py new file mode 100644 index 0000000..e4217e3 --- /dev/null +++ b/relm/accountant.py @@ -0,0 +1,14 @@ +class PrivacyAccountant: + def __init__(self, privacy_budget): + self.privacy_budget = privacy_budget + self.mechanisms = [] + + @property + def privacy_consumed(self): + return sum(m.get_privacy_consumption() for m in self.mechanisms) + + def check_valid(self): + return self.privacy_consumed < self.privacy_budget + + def add_mechanism(self, mechanism): + self.mechanisms.append(mechanism) diff --git a/tests/test_accountant.py b/tests/test_accountant.py new file mode 100644 index 0000000..aa658af --- /dev/null +++ b/tests/test_accountant.py @@ -0,0 +1,38 @@ +import numpy as np +from relm.mechanisms import LaplaceMechanism +from relm.accountant import PrivacyAccountant + + +def test_add_mechanism(): + accountant = PrivacyAccountant(10) + n = np.random.randint(3, 100) + + for _ in range(n): + mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) + accountant.add_mechanism(mechanism) + + assert len(accountant.mechanisms) == n + + +def test_privacy_consumed(): + accountant = PrivacyAccountant(1000000) + epsilons = 10 * np.random.random(10) + + vals = np.zeros(10) + for i, e in enumerate(epsilons): + mechanism = LaplaceMechanism(e, precision=20, sensitivity=1) + accountant.add_mechanism(mechanism) + _ = mechanism.release(vals) + assert accountant.privacy_consumed == epsilons[: i + 1].sum() + + +def test_check_valid(): + accountant = PrivacyAccountant(20) + vals = np.zeros(10) + for _ in range(20): + assert accountant.check_valid() + mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) + accountant.add_mechanism(mechanism) + _ = mechanism.release(vals) + + assert not accountant.check_valid() From 88e2404904a1e6b53742cb2c3caf48497536646f Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 17 Nov 2020 16:06:59 +1100 Subject: [PATCH 021/185] adds doc strings --- relm/accountant.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/relm/accountant.py b/relm/accountant.py index e4217e3..8d4b0e3 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -1,4 +1,11 @@ class PrivacyAccountant: + """ + This class tracks the privacy consumption of multiple mechanisms. + + Args: + privacy_budget: the maximum privacy loss allowed across all mechanisms + """ + def __init__(self, privacy_budget): self.privacy_budget = privacy_budget self.mechanisms = [] @@ -8,7 +15,21 @@ def privacy_consumed(self): return sum(m.get_privacy_consumption() for m in self.mechanisms) def check_valid(self): + """ + Checks that the privacy consumed is less than the privacy budget. + + Returns: + bool + """ return self.privacy_consumed < self.privacy_budget def add_mechanism(self, mechanism): + """ + Adds a mechanism to be tracked by the privacy accountant. + + Args: + mechanism: a ReleaseMechanism to be tracked + + """ + self.mechanisms.append(mechanism) From f397d6a513cd4a25d0ae1cb713560aa5aa914cef Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 17 Nov 2020 16:30:06 +1100 Subject: [PATCH 022/185] _is_valid now checks if the attached Accountant (if any) has exceeded its privacy budget --- relm/accountant.py | 6 +++++- relm/mechanisms.py | 12 +++++++++++- tests/test_accountant.py | 10 ++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/relm/accountant.py b/relm/accountant.py index 8d4b0e3..28a4a08 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -21,7 +21,8 @@ def check_valid(self): Returns: bool """ - return self.privacy_consumed < self.privacy_budget + is_valid = self.privacy_consumed < self.privacy_budget + return is_valid def add_mechanism(self, mechanism): """ @@ -32,4 +33,7 @@ def add_mechanism(self, mechanism): """ + # connect the account to the mechanisms + # creates a circular loop + mechanism.accountant = self self.mechanisms.append(mechanism) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 01c26e6..1a7f98e 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -7,9 +7,19 @@ class ReleaseMechanism: def __init__(self, epsilon): self.epsilon = epsilon self._is_valid = True + self.accountant = None def _check_valid(self): - if not self._is_valid: + + is_valid = self._is_valid + if self.accountant is not None: + is_valid &= self.accountant.check_valid() + + if not is_valid: + # delete the reference to accountant to break the circular loop + # allows both this Mechanism and the Accountant to be deleted by GC + self._is_valid = False + self.accountant = None raise RuntimeError( "Mechanism has exhausted has exhausted its privacy budget." ) diff --git a/tests/test_accountant.py b/tests/test_accountant.py index aa658af..e8724a2 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -1,6 +1,7 @@ import numpy as np from relm.mechanisms import LaplaceMechanism from relm.accountant import PrivacyAccountant +import pytest def test_add_mechanism(): @@ -36,3 +37,12 @@ def test_check_valid(): _ = mechanism.release(vals) assert not accountant.check_valid() + + # check that any new mechanisms are invalidated if added to the accountant + mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) + mechanism._check_valid() + + assert mechanism.accountant is not None + accountant.add_mechanism(mechanism) + with pytest.raises(RuntimeError): + mechanism._check_valid() From b590b2a82adda5dfae417be66579ed4bc0c1ab13 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 17 Nov 2020 16:34:14 +1100 Subject: [PATCH 023/185] slightly clean up _check_valid --- relm/mechanisms.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 1a7f98e..ad40c09 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -11,14 +11,12 @@ def __init__(self, epsilon): def _check_valid(self): - is_valid = self._is_valid if self.accountant is not None: - is_valid &= self.accountant.check_valid() + self._is_valid &= self.accountant.check_valid() - if not is_valid: + if not self._is_valid: # delete the reference to accountant to break the circular loop # allows both this Mechanism and the Accountant to be deleted by GC - self._is_valid = False self.accountant = None raise RuntimeError( "Mechanism has exhausted has exhausted its privacy budget." From 240d0cb1ba163366be461003e5f36145782227cf Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 17 Nov 2020 16:36:37 +1100 Subject: [PATCH 024/185] Changed name of package in setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b0146f5..84a48e0 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ } setup( - name="differential-privacy", + name="relm", version="0.1.0", classifiers=[ "Intended Audience :: Developers", From a4b1899163de527e5b69e7e8776d3cc431722d24 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 17 Nov 2020 16:44:27 +1100 Subject: [PATCH 025/185] fix tests --- tests/test_accountant.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_accountant.py b/tests/test_accountant.py index e8724a2..78c67e6 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -24,7 +24,7 @@ def test_privacy_consumed(): mechanism = LaplaceMechanism(e, precision=20, sensitivity=1) accountant.add_mechanism(mechanism) _ = mechanism.release(vals) - assert accountant.privacy_consumed == epsilons[: i + 1].sum() + assert np.isclose(accountant.privacy_consumed, epsilons[: i + 1].sum()) def test_check_valid(): @@ -42,7 +42,9 @@ def test_check_valid(): mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) mechanism._check_valid() - assert mechanism.accountant is not None accountant.add_mechanism(mechanism) + assert mechanism.accountant is not None with pytest.raises(RuntimeError): mechanism._check_valid() + + assert mechanism.accountant is None From e4e9870ef4de2044e7d2c81c453671d827486d52 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 10:55:26 +1100 Subject: [PATCH 026/185] removed circular logic --- Cargo.lock | 22 +++++++++++----------- relm/accountant.py | 15 ++++++++++----- relm/mechanisms.py | 14 +++++++++++++- tests/test_accountant.py | 2 +- 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68ff828..031dcb6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,17 +90,6 @@ dependencies = [ "syn", ] -[[package]] -name = "differential-privacy" -version = "0.1.0" -dependencies = [ - "numpy", - "pyo3", - "rand", - "rayon", - "rug", -] - [[package]] name = "either" version = "1.6.1" @@ -504,6 +493,17 @@ version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +[[package]] +name = "relm-backend" +version = "0.1.0" +dependencies = [ + "numpy", + "pyo3", + "rand", + "rayon", + "rug", +] + [[package]] name = "rug" version = "1.11.0" diff --git a/relm/accountant.py b/relm/accountant.py index 28a4a08..11af8ae 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -8,11 +8,11 @@ class PrivacyAccountant: def __init__(self, privacy_budget): self.privacy_budget = privacy_budget - self.mechanisms = [] + self._privacy_losses = dict() @property def privacy_consumed(self): - return sum(m.get_privacy_consumption() for m in self.mechanisms) + return sum(p for _, p in self._privacy_losses.items()) def check_valid(self): """ @@ -24,6 +24,9 @@ def check_valid(self): is_valid = self.privacy_consumed < self.privacy_budget return is_valid + def update(self, mechanism): + self._privacy_losses[hash(mechanism)] = mechanism.get_privacy_consumption() + def add_mechanism(self, mechanism): """ Adds a mechanism to be tracked by the privacy accountant. @@ -33,7 +36,9 @@ def add_mechanism(self, mechanism): """ - # connect the account to the mechanisms - # creates a circular loop + if mechanism.accountant is not None: + raise RuntimeError( + "mechanism: attempted to add a mechanism to two accountants." + ) mechanism.accountant = self - self.mechanisms.append(mechanism) + self._privacy_losses[hash(mechanism)] = mechanism.get_privacy_consumption() diff --git a/relm/mechanisms.py b/relm/mechanisms.py index ad40c09..900596f 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -8,6 +8,7 @@ def __init__(self, epsilon): self.epsilon = epsilon self._is_valid = True self.accountant = None + self._id = np.random.randint(low=0, high=2 ** 60) def _check_valid(self): @@ -22,6 +23,13 @@ def _check_valid(self): "Mechanism has exhausted has exhausted its privacy budget." ) + def _update_accountant(self): + if self.accountant is not None: + self.accountant.update(self) + + def __hash__(self): + return self._id + def release(self, values): """ Releases a differential private query response. @@ -74,6 +82,7 @@ def release(self, values): self._check_valid() self._is_valid = False + self._update_accountant() args = (values, self.sensitivity, self.epsilon, self.precision) return backend.laplace_mechanism(*args) @@ -113,6 +122,7 @@ def release(self, values): """ self._check_valid() self._is_valid = False + self._update_accountant() return backend.geometric_mechanism(values, self.sensitivity, self.epsilon) @@ -174,6 +184,8 @@ def release(self, values): if self.current_count == self.cutoff: self._is_valid = False + self._update_accountant() + if self.epsilon3 > 0: sliced_values = values[indices] temp = self.sensitivity * self.cutoff @@ -385,7 +397,7 @@ def release(self, values): args = (values, self.B, self.lam, self.quanta) release_values = backend.snapping(*args) self._is_valid = False - + self._update_accountant() return release_values def get_privacy_consumption(self): diff --git a/tests/test_accountant.py b/tests/test_accountant.py index 78c67e6..300d165 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -12,7 +12,7 @@ def test_add_mechanism(): mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) accountant.add_mechanism(mechanism) - assert len(accountant.mechanisms) == n + assert len(accountant._privacy_losses) == n def test_privacy_consumed(): From 01c415f9f061c0853ce02924ed4efdc7499aa889 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 10:58:11 +1100 Subject: [PATCH 027/185] remove accountant deletion on invalidation --- relm/mechanisms.py | 3 --- tests/test_accountant.py | 2 -- 2 files changed, 5 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 900596f..d776a0b 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -16,9 +16,6 @@ def _check_valid(self): self._is_valid &= self.accountant.check_valid() if not self._is_valid: - # delete the reference to accountant to break the circular loop - # allows both this Mechanism and the Accountant to be deleted by GC - self.accountant = None raise RuntimeError( "Mechanism has exhausted has exhausted its privacy budget." ) diff --git a/tests/test_accountant.py b/tests/test_accountant.py index 300d165..c4950b3 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -46,5 +46,3 @@ def test_check_valid(): assert mechanism.accountant is not None with pytest.raises(RuntimeError): mechanism._check_valid() - - assert mechanism.accountant is None From 1aad37a4d5b8d853d5b8fef33c2cdf7f02d7bc9d Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 11:29:41 +1100 Subject: [PATCH 028/185] check that mechanisms will never exceed privacy budget --- relm/accountant.py | 19 +++++++++---------- tests/test_accountant.py | 30 ++++++------------------------ 2 files changed, 15 insertions(+), 34 deletions(-) diff --git a/relm/accountant.py b/relm/accountant.py index 11af8ae..7b6af10 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -9,21 +9,12 @@ class PrivacyAccountant: def __init__(self, privacy_budget): self.privacy_budget = privacy_budget self._privacy_losses = dict() + self._max_privacy_loss = 0 @property def privacy_consumed(self): return sum(p for _, p in self._privacy_losses.items()) - def check_valid(self): - """ - Checks that the privacy consumed is less than the privacy budget. - - Returns: - bool - """ - is_valid = self.privacy_consumed < self.privacy_budget - return is_valid - def update(self, mechanism): self._privacy_losses[hash(mechanism)] = mechanism.get_privacy_consumption() @@ -40,5 +31,13 @@ def add_mechanism(self, mechanism): raise RuntimeError( "mechanism: attempted to add a mechanism to two accountants." ) + + if self._max_privacy_loss + mechanism.epsilon > self.privacy_budget: + raise ValueError( + f"mechanism: using this mechanism could exceed the privacy budget of {self.privacy_budget}" + f" with a total privacy loss of {self._max_privacy_loss + mechanism.epsilon}" + + ) mechanism.accountant = self self._privacy_losses[hash(mechanism)] = mechanism.get_privacy_consumption() + self._max_privacy_loss += mechanism.epsilon diff --git a/tests/test_accountant.py b/tests/test_accountant.py index c4950b3..8e18ca8 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -6,13 +6,16 @@ def test_add_mechanism(): accountant = PrivacyAccountant(10) - n = np.random.randint(3, 100) - for _ in range(n): + for _ in range(10): mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) accountant.add_mechanism(mechanism) - assert len(accountant._privacy_losses) == n + assert len(accountant._privacy_losses) == 10 + + with pytest.raises(ValueError): + mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) + accountant.add_mechanism(mechanism) def test_privacy_consumed(): @@ -25,24 +28,3 @@ def test_privacy_consumed(): accountant.add_mechanism(mechanism) _ = mechanism.release(vals) assert np.isclose(accountant.privacy_consumed, epsilons[: i + 1].sum()) - - -def test_check_valid(): - accountant = PrivacyAccountant(20) - vals = np.zeros(10) - for _ in range(20): - assert accountant.check_valid() - mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) - accountant.add_mechanism(mechanism) - _ = mechanism.release(vals) - - assert not accountant.check_valid() - - # check that any new mechanisms are invalidated if added to the accountant - mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) - mechanism._check_valid() - - accountant.add_mechanism(mechanism) - assert mechanism.accountant is not None - with pytest.raises(RuntimeError): - mechanism._check_valid() From 2c9aa7956db7af9711e8970d4847c4a664c4c71e Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 12:14:58 +1100 Subject: [PATCH 029/185] changed name to privacy consumed --- relm/accountant.py | 4 ++-- relm/mechanisms.py | 11 ++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/relm/accountant.py b/relm/accountant.py index 7b6af10..7739c90 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -16,7 +16,7 @@ def privacy_consumed(self): return sum(p for _, p in self._privacy_losses.items()) def update(self, mechanism): - self._privacy_losses[hash(mechanism)] = mechanism.get_privacy_consumption() + self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed() def add_mechanism(self, mechanism): """ @@ -39,5 +39,5 @@ def add_mechanism(self, mechanism): ) mechanism.accountant = self - self._privacy_losses[hash(mechanism)] = mechanism.get_privacy_consumption() + self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed() self._max_privacy_loss += mechanism.epsilon diff --git a/relm/mechanisms.py b/relm/mechanisms.py index d776a0b..3d05065 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -12,9 +12,6 @@ def __init__(self, epsilon): def _check_valid(self): - if self.accountant is not None: - self._is_valid &= self.accountant.check_valid() - if not self._is_valid: raise RuntimeError( "Mechanism has exhausted has exhausted its privacy budget." @@ -39,7 +36,7 @@ def release(self, values): """ raise NotImplementedError() - def get_privacy_consumption(self): + def privacy_consumed(self): """ Computes the privacy budget consumed by the mechanism so far. """ @@ -83,7 +80,7 @@ def release(self, values): args = (values, self.sensitivity, self.epsilon, self.precision) return backend.laplace_mechanism(*args) - def get_privacy_consumption(self): + def privacy_consumed(self): """ Computes the privacy budget consumed by the mechanism so far. """ @@ -192,7 +189,7 @@ def release(self, values): else: return indices - def get_privacy_consumption(self): + def privacy_consumed(self): """ Computes the privacy budget consumed by the mechanism so far. """ @@ -397,7 +394,7 @@ def release(self, values): self._update_accountant() return release_values - def get_privacy_consumption(self): + def privacy_consumed(self): """ Computes the privacy budget consumed by the mechanism so far. """ From 84c8b82a781902909a64136a32bccfeed01e9ee9 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 12:17:12 +1100 Subject: [PATCH 030/185] changed privacy consumed to attribute --- relm/accountant.py | 4 ++-- relm/mechanisms.py | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/relm/accountant.py b/relm/accountant.py index 7739c90..75dc0e9 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -16,7 +16,7 @@ def privacy_consumed(self): return sum(p for _, p in self._privacy_losses.items()) def update(self, mechanism): - self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed() + self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed def add_mechanism(self, mechanism): """ @@ -39,5 +39,5 @@ def add_mechanism(self, mechanism): ) mechanism.accountant = self - self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed() + self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed self._max_privacy_loss += mechanism.epsilon diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 3d05065..90e5ba6 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -36,6 +36,7 @@ def release(self, values): """ raise NotImplementedError() + @property def privacy_consumed(self): """ Computes the privacy budget consumed by the mechanism so far. @@ -80,6 +81,7 @@ def release(self, values): args = (values, self.sensitivity, self.epsilon, self.precision) return backend.laplace_mechanism(*args) + @property def privacy_consumed(self): """ Computes the privacy budget consumed by the mechanism so far. @@ -189,6 +191,7 @@ def release(self, values): else: return indices + @property def privacy_consumed(self): """ Computes the privacy budget consumed by the mechanism so far. @@ -394,6 +397,7 @@ def release(self, values): self._update_accountant() return release_values + @property def privacy_consumed(self): """ Computes the privacy budget consumed by the mechanism so far. From 8b1a6506d31055eff920121d0772b72d325b4a0f Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 12:17:44 +1100 Subject: [PATCH 031/185] changed privacy consumed to attribute --- relm/accountant.py | 1 - 1 file changed, 1 deletion(-) diff --git a/relm/accountant.py b/relm/accountant.py index 75dc0e9..a085b0a 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -36,7 +36,6 @@ def add_mechanism(self, mechanism): raise ValueError( f"mechanism: using this mechanism could exceed the privacy budget of {self.privacy_budget}" f" with a total privacy loss of {self._max_privacy_loss + mechanism.epsilon}" - ) mechanism.accountant = self self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed From bae9493ef22acbcc4902975300e6ecf23a897630 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 13:09:20 +1100 Subject: [PATCH 032/185] add support for disjoint queries --- relm/accountant.py | 39 ++++++++++++++++++++++++++++++++------- tests/test_accountant.py | 18 ++++++++++++++++++ 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/relm/accountant.py b/relm/accountant.py index a085b0a..c451379 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -9,11 +9,18 @@ class PrivacyAccountant: def __init__(self, privacy_budget): self.privacy_budget = privacy_budget self._privacy_losses = dict() + self._standard_mechanisms = set() + self._disjoint_mechanism_groups = [] self._max_privacy_loss = 0 @property def privacy_consumed(self): - return sum(p for _, p in self._privacy_losses.items()) + _privacy_consumed = sum(p for _, p in self._privacy_losses.items()) + for disjoint_mechanisms in self._disjoint_mechanism_groups: + _privacy_consumed += max(self._privacy_losses[m] for m in disjoint_mechanisms) + _privacy_consumed -= sum(self._privacy_losses[m] for m in disjoint_mechanisms) + + return _privacy_consumed def update(self, mechanism): self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed @@ -27,16 +34,34 @@ def add_mechanism(self, mechanism): """ - if mechanism.accountant is not None: - raise RuntimeError( - "mechanism: attempted to add a mechanism to two accountants." - ) - if self._max_privacy_loss + mechanism.epsilon > self.privacy_budget: raise ValueError( f"mechanism: using this mechanism could exceed the privacy budget of {self.privacy_budget}" f" with a total privacy loss of {self._max_privacy_loss + mechanism.epsilon}" ) + self._add_mechanism(mechanism) + self._max_privacy_loss += mechanism.epsilon + + def add_disjoint_mechanisms(self, mechanisms): + + max_epsilon = max(mechanism.epsilon for mechanism in mechanisms) + if self._max_privacy_loss + max_epsilon > self.privacy_budget: + raise ValueError( + f"mechanism: using this mechanism could exceed the privacy budget of {self.privacy_budget}" + f" with a total privacy loss of {self._max_privacy_loss + max_epsilon}" + ) + + for mechanism in mechanisms: + self._add_mechanism(mechanism) + + self._disjoint_mechanism_groups.append(set(hash(mechanism) for mechanism in mechanisms)) + self._max_privacy_loss += max_epsilon + + def _add_mechanism(self, mechanism): + if mechanism.accountant is not None: + raise RuntimeError( + "mechanism: attempted to add a mechanism to two accountants." + ) + mechanism.accountant = self self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed - self._max_privacy_loss += mechanism.epsilon diff --git a/tests/test_accountant.py b/tests/test_accountant.py index 8e18ca8..5adcbc1 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -28,3 +28,21 @@ def test_privacy_consumed(): accountant.add_mechanism(mechanism) _ = mechanism.release(vals) assert np.isclose(accountant.privacy_consumed, epsilons[: i + 1].sum()) + + +def test_add_disjoint_mechanisms(): + + accountant = PrivacyAccountant(1000000) + + mechanisms = [LaplaceMechanism(20, precision=20, sensitivity=1) for _ in range(1000)] + accountant.add_disjoint_mechanisms(mechanisms) + + mechanisms = [LaplaceMechanism(4, precision=20, sensitivity=1) for _ in range(1000)] + accountant.add_disjoint_mechanisms(mechanisms) + + accountant.add_mechanism(LaplaceMechanism(100, precision=20, sensitivity=1)) + + values = np.zeros(1) + _ = [mechanism.release(values) for mechanism in mechanisms] + assert accountant.privacy_consumed == 4 + assert accountant._max_privacy_loss == 124 From f3c74a0cea8d802a30ccbf0c99f947a302483288 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 18 Nov 2020 13:09:53 +1100 Subject: [PATCH 033/185] Added a ReportNoisyMax release mechanism. --- relm/mechanisms.py | 46 ++++++++++++++++++++++++++++++++++++++++ tests/test_mechanisms.py | 6 ++++++ 2 files changed, 52 insertions(+) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 01c26e6..5248249 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -388,3 +388,49 @@ def get_privacy_consumption(self): return 0 else: return self.epsilon + + +class ReportNoisyMax(ReleaseMechanism): + """ + Secure implementation of the ReportNoisyMax mechanism. This mechanism can be used + once after which its privacy budget will be exhausted and it can no longer be used. + + This mechanism adds Laplace noise to each of a set of counting queries and + returns both the index of the largest perturbed value (the argmax) and the + largest perturbed value. + + Args: + epsilon: the maximum privacy loss of the mechanism. + precision: number of fractional bits to use in the internal fixed point representation. + """ + + def __init__(self, epsilon, precision): + self.sensitivity = 1.0 + self.precision = precision + super(ReportNoisyMax, self).__init__(epsilon) + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the outputs of a collection of counting queries. + + Returns: + A tuple containing the (argmax, max) of the perturbed values. + """ + self._check_valid() + self._is_valid = False + args = (values, self.sensitivity, self.epsilon, self.precision) + perturbed_values = backend.laplace_mechanism(*args) + argmax = perturbed_values.argmax() + return (argmax, perturbed_values[argmax]) + + def get_privacy_consumption(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index ee98364..17471bb 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -8,6 +8,7 @@ AboveThreshold, SparseIndicator, SparseNumeric, + ReportNoisyMax, ) @@ -78,3 +79,8 @@ def test_sparse_numeric(benchmark): def test_SnappingMechanism(benchmark): mechanism = SnappingMechanism(epsilon=1.0, B=10) _test_mechanism(benchmark, mechanism) + + +def test_ReportNoisyMax(benchmark): + mechanism = ReportNoisyMax(epsilon=0.1, precision=35) + _test_mechanism(benchmark, mechanism) From e1f2741c27bab3bf0214fb8cfc8fb8264fb98caf Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 13:12:13 +1100 Subject: [PATCH 034/185] add docstring --- relm/accountant.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/relm/accountant.py b/relm/accountant.py index c451379..5c86f66 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -43,7 +43,13 @@ def add_mechanism(self, mechanism): self._max_privacy_loss += mechanism.epsilon def add_disjoint_mechanisms(self, mechanisms): + """ + Adds mechanisms that release queries operating over disjoint subsets of the database. This allows for + more precise privacy accounting. + Args: + mechanisms: a list of ReleaseMechanism's that release queries operating over disjoint queries. + """ max_epsilon = max(mechanism.epsilon for mechanism in mechanisms) if self._max_privacy_loss + max_epsilon > self.privacy_budget: raise ValueError( From ae5cd53471edc5a1552feac7d23da2fb1c8cef88 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 13:16:33 +1100 Subject: [PATCH 035/185] remove unused variable --- relm/accountant.py | 1 - 1 file changed, 1 deletion(-) diff --git a/relm/accountant.py b/relm/accountant.py index 5c86f66..c27b0e1 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -9,7 +9,6 @@ class PrivacyAccountant: def __init__(self, privacy_budget): self.privacy_budget = privacy_budget self._privacy_losses = dict() - self._standard_mechanisms = set() self._disjoint_mechanism_groups = [] self._max_privacy_loss = 0 From 33abd7bb165bec66547f17c87648af7091db31d8 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 18 Nov 2020 13:25:56 +1100 Subject: [PATCH 036/185] black formatting --- relm/accountant.py | 12 +++++++++--- tests/test_accountant.py | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/relm/accountant.py b/relm/accountant.py index c27b0e1..faf9509 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -16,8 +16,12 @@ def __init__(self, privacy_budget): def privacy_consumed(self): _privacy_consumed = sum(p for _, p in self._privacy_losses.items()) for disjoint_mechanisms in self._disjoint_mechanism_groups: - _privacy_consumed += max(self._privacy_losses[m] for m in disjoint_mechanisms) - _privacy_consumed -= sum(self._privacy_losses[m] for m in disjoint_mechanisms) + _privacy_consumed += max( + self._privacy_losses[m] for m in disjoint_mechanisms + ) + _privacy_consumed -= sum( + self._privacy_losses[m] for m in disjoint_mechanisms + ) return _privacy_consumed @@ -59,7 +63,9 @@ def add_disjoint_mechanisms(self, mechanisms): for mechanism in mechanisms: self._add_mechanism(mechanism) - self._disjoint_mechanism_groups.append(set(hash(mechanism) for mechanism in mechanisms)) + self._disjoint_mechanism_groups.append( + set(hash(mechanism) for mechanism in mechanisms) + ) self._max_privacy_loss += max_epsilon def _add_mechanism(self, mechanism): diff --git a/tests/test_accountant.py b/tests/test_accountant.py index 5adcbc1..2ff3b14 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -34,7 +34,9 @@ def test_add_disjoint_mechanisms(): accountant = PrivacyAccountant(1000000) - mechanisms = [LaplaceMechanism(20, precision=20, sensitivity=1) for _ in range(1000)] + mechanisms = [ + LaplaceMechanism(20, precision=20, sensitivity=1) for _ in range(1000) + ] accountant.add_disjoint_mechanisms(mechanisms) mechanisms = [LaplaceMechanism(4, precision=20, sensitivity=1) for _ in range(1000)] From 01bbd2f46b3763906d659ecec8bee086964b78d0 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 18 Nov 2020 13:33:56 +1100 Subject: [PATCH 037/185] Added ReportNoisyMax to automatic documentation system --- docs-source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-source/index.rst b/docs-source/index.rst index 90a1497..029b690 100644 --- a/docs-source/index.rst +++ b/docs-source/index.rst @@ -14,7 +14,7 @@ Mechanisms ================================================ .. automodule:: relm.mechanisms - :members: LaplaceMechanism, GeometricMechanism, SnappingMechanism, AboveThreshold, SparseIndicator, SparseNumeric + :members: LaplaceMechanism, GeometricMechanism, SnappingMechanism, AboveThreshold, SparseIndicator, SparseNumeric, ReportNoisyMax Indices and tables From d88e39442088072bf6281517790bc17bdf7a872c Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 18 Nov 2020 13:46:12 +1100 Subject: [PATCH 038/185] Modified ReportNoisyMax to work with PrivacyAccountant --- relm/mechanisms.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index d1d0408..bc32f4d 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -439,12 +439,14 @@ def release(self, values): """ self._check_valid() self._is_valid = False + self._update_accountant() args = (values, self.sensitivity, self.epsilon, self.precision) perturbed_values = backend.laplace_mechanism(*args) argmax = perturbed_values.argmax() return (argmax, perturbed_values[argmax]) - def get_privacy_consumption(self): + @property + def privacy_consumed(self): """ Computes the privacy budget consumed by the mechanism so far. """ From 72756f9b2f257dd6a9c4a4cc1b04619fa8ca6c66 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 18 Nov 2020 13:59:56 +1100 Subject: [PATCH 039/185] Added crypto-secure tie-breaker to ReportNoisyMax --- relm/mechanisms.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index bc32f4d..b4a8db6 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -1,5 +1,6 @@ import math import numpy as np +import secrets from relm import backend @@ -442,8 +443,9 @@ def release(self, values): self._update_accountant() args = (values, self.sensitivity, self.epsilon, self.precision) perturbed_values = backend.laplace_mechanism(*args) - argmax = perturbed_values.argmax() - return (argmax, perturbed_values[argmax]) + valmax = np.max(perturbed_values) + argmax = secrets.choice(np.where(perturbed_values == valmax)[0]) + return (argmax, valmax) @property def privacy_consumed(self): From b702b5d6e25b62c9c4ad9bbc0456d94c836a7ed9 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 19 Nov 2020 14:51:19 +1100 Subject: [PATCH 040/185] create composition base class and parallel composition class --- relm/composition.py | 49 +++++++++++++++++++++++++++++++++++++++ tests/test_accountant.py | 21 +---------------- tests/test_composition.py | 28 ++++++++++++++++++++++ 3 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 relm/composition.py create mode 100644 tests/test_composition.py diff --git a/relm/composition.py b/relm/composition.py new file mode 100644 index 0000000..304cd4c --- /dev/null +++ b/relm/composition.py @@ -0,0 +1,49 @@ +from .mechanisms import ReleaseMechanism + + +class ComposedRelease: + """ + A base class for calculating the privacy loss of the composition + of multiple ReleaseMechanism. + """ + + def __init__(self, mechanisms): + # set the privacy losses to be the epsilon for each mechanism to calculate the upper limit of privacy loss + self._privacy_losses = dict((hash(m), m.epsilon) for m in mechanisms) + self.epsilon = self.privacy_consumed + # set the privacy losses to the true values + self._privacy_losses = dict((hash(m), m.privacy_consumed) for m in mechanisms) + + # set the mechanisms to report to the ComposedRelease class + for mechanism in mechanisms: + mechanism.accountant = self + + self.accountant = None + + def update(self, mechanism): + self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed + if self.accountant is not None: + self.accountant.update(self) + + @property + def privacy_consumed(self): + raise NotImplementedError + + +class ParallelRelease(ComposedRelease): + """ + A base class for calculating the privacy loss of the composition + of multiple ReleaseMechanisms operating over disjoint subsets of the database. + + Usage: + accountant = PrivacyAccountant(privacy_budget=2) + mechanisms = [LaplaceMechanism(1, 1, precision=20) for _ in range(1000)] + parallel_mechanisms = ParallelRelease(mechanisms) + # data releases still occur with the mechanisms + mechanisms[0].release(data) + + """ + + @property + def privacy_consumed(self): + return max(p for _, p in self._privacy_losses.items()) diff --git a/tests/test_accountant.py b/tests/test_accountant.py index 2ff3b14..866f4eb 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -1,6 +1,7 @@ import numpy as np from relm.mechanisms import LaplaceMechanism from relm.accountant import PrivacyAccountant +from relm.composition import ParallelRelease import pytest @@ -28,23 +29,3 @@ def test_privacy_consumed(): accountant.add_mechanism(mechanism) _ = mechanism.release(vals) assert np.isclose(accountant.privacy_consumed, epsilons[: i + 1].sum()) - - -def test_add_disjoint_mechanisms(): - - accountant = PrivacyAccountant(1000000) - - mechanisms = [ - LaplaceMechanism(20, precision=20, sensitivity=1) for _ in range(1000) - ] - accountant.add_disjoint_mechanisms(mechanisms) - - mechanisms = [LaplaceMechanism(4, precision=20, sensitivity=1) for _ in range(1000)] - accountant.add_disjoint_mechanisms(mechanisms) - - accountant.add_mechanism(LaplaceMechanism(100, precision=20, sensitivity=1)) - - values = np.zeros(1) - _ = [mechanism.release(values) for mechanism in mechanisms] - assert accountant.privacy_consumed == 4 - assert accountant._max_privacy_loss == 124 diff --git a/tests/test_composition.py b/tests/test_composition.py new file mode 100644 index 0000000..fa9b074 --- /dev/null +++ b/tests/test_composition.py @@ -0,0 +1,28 @@ +from relm.mechanisms import LaplaceMechanism +from relm.accountant import PrivacyAccountant +from relm.composition import ParallelRelease +import numpy as np + + +def test_parallel_release(): + accountant = PrivacyAccountant(1000000) + + mechanisms = [ + LaplaceMechanism(20, precision=20, sensitivity=1) for _ in range(1000) + ] + para_mechs = ParallelRelease(mechanisms) + accountant.add_mechanism(para_mechs) + + mechanisms = [LaplaceMechanism(4, precision=20, sensitivity=1) for _ in range(1000)] + para_mechs = ParallelRelease(mechanisms) + print("Privacy consumed:", para_mechs.privacy_consumed) + accountant.add_mechanism(para_mechs) + + accountant.add_mechanism(LaplaceMechanism(100, precision=20, sensitivity=1)) + + values = np.zeros(1) + _ = [mechanism.release(values) for mechanism in mechanisms] + + assert accountant.privacy_consumed == 4 + assert accountant._max_privacy_loss == 124 + assert para_mechs.privacy_consumed == 4 From 7174fa1b605dc549b723b28b0660c593a5a95cfe Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 19 Nov 2020 15:09:02 +1100 Subject: [PATCH 041/185] revert accountant back --- relm/accountant.py | 37 ++++++------------------------------- tests/test_accountant.py | 2 +- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/relm/accountant.py b/relm/accountant.py index faf9509..877181e 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -37,42 +37,17 @@ def add_mechanism(self, mechanism): """ - if self._max_privacy_loss + mechanism.epsilon > self.privacy_budget: - raise ValueError( - f"mechanism: using this mechanism could exceed the privacy budget of {self.privacy_budget}" - f" with a total privacy loss of {self._max_privacy_loss + mechanism.epsilon}" + if mechanism.accountant is not None: + raise RuntimeError( + "mechanism: attempted to add a mechanism to two accountants." ) - self._add_mechanism(mechanism) - self._max_privacy_loss += mechanism.epsilon - def add_disjoint_mechanisms(self, mechanisms): - """ - Adds mechanisms that release queries operating over disjoint subsets of the database. This allows for - more precise privacy accounting. - - Args: - mechanisms: a list of ReleaseMechanism's that release queries operating over disjoint queries. - """ - max_epsilon = max(mechanism.epsilon for mechanism in mechanisms) - if self._max_privacy_loss + max_epsilon > self.privacy_budget: + if self._max_privacy_loss + mechanism.epsilon > self.privacy_budget: raise ValueError( f"mechanism: using this mechanism could exceed the privacy budget of {self.privacy_budget}" - f" with a total privacy loss of {self._max_privacy_loss + max_epsilon}" - ) - - for mechanism in mechanisms: - self._add_mechanism(mechanism) - - self._disjoint_mechanism_groups.append( - set(hash(mechanism) for mechanism in mechanisms) - ) - self._max_privacy_loss += max_epsilon - - def _add_mechanism(self, mechanism): - if mechanism.accountant is not None: - raise RuntimeError( - "mechanism: attempted to add a mechanism to two accountants." + f" with a total privacy loss of {self._max_privacy_loss + mechanism.epsilon}" ) mechanism.accountant = self self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed + self._max_privacy_loss += mechanism.epsilon diff --git a/tests/test_accountant.py b/tests/test_accountant.py index 866f4eb..944ee31 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -12,7 +12,7 @@ def test_add_mechanism(): mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) accountant.add_mechanism(mechanism) - assert len(accountant._privacy_losses) == 10 + assert accountant._max_privacy_loss == 10 with pytest.raises(ValueError): mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) From cbf7287dc69052b22e0ea706a6111fcd7d552848 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 19 Nov 2020 15:10:27 +1100 Subject: [PATCH 042/185] revert accountant back --- relm/accountant.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/relm/accountant.py b/relm/accountant.py index 877181e..b86aa8e 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -14,16 +14,7 @@ def __init__(self, privacy_budget): @property def privacy_consumed(self): - _privacy_consumed = sum(p for _, p in self._privacy_losses.items()) - for disjoint_mechanisms in self._disjoint_mechanism_groups: - _privacy_consumed += max( - self._privacy_losses[m] for m in disjoint_mechanisms - ) - _privacy_consumed -= sum( - self._privacy_losses[m] for m in disjoint_mechanisms - ) - - return _privacy_consumed + return sum(p for _, p in self._privacy_losses.items()) def update(self, mechanism): self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed @@ -47,7 +38,6 @@ def add_mechanism(self, mechanism): f"mechanism: using this mechanism could exceed the privacy budget of {self.privacy_budget}" f" with a total privacy loss of {self._max_privacy_loss + mechanism.epsilon}" ) - mechanism.accountant = self self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed self._max_privacy_loss += mechanism.epsilon From 8388ccd8d9eca0c724b35698985c26c92b30eacc Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 19 Nov 2020 15:10:56 +1100 Subject: [PATCH 043/185] revert accountant back --- relm/accountant.py | 1 - 1 file changed, 1 deletion(-) diff --git a/relm/accountant.py b/relm/accountant.py index b86aa8e..a085b0a 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -9,7 +9,6 @@ class PrivacyAccountant: def __init__(self, privacy_budget): self.privacy_budget = privacy_budget self._privacy_losses = dict() - self._disjoint_mechanism_groups = [] self._max_privacy_loss = 0 @property From fe92520848d635f7e9020da90604ae44696c8db5 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 19 Nov 2020 15:11:22 +1100 Subject: [PATCH 044/185] revert accountant back --- tests/test_accountant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_accountant.py b/tests/test_accountant.py index 944ee31..866f4eb 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -12,7 +12,7 @@ def test_add_mechanism(): mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) accountant.add_mechanism(mechanism) - assert accountant._max_privacy_loss == 10 + assert len(accountant._privacy_losses) == 10 with pytest.raises(ValueError): mechanism = LaplaceMechanism(1, precision=20, sensitivity=1) From 6a4ad8d52e91ece573b42e16ae9222587947ecd8 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 19 Nov 2020 15:12:07 +1100 Subject: [PATCH 045/185] revert accountant back --- tests/test_accountant.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_accountant.py b/tests/test_accountant.py index 866f4eb..8e18ca8 100644 --- a/tests/test_accountant.py +++ b/tests/test_accountant.py @@ -1,7 +1,6 @@ import numpy as np from relm.mechanisms import LaplaceMechanism from relm.accountant import PrivacyAccountant -from relm.composition import ParallelRelease import pytest From 3f744eab38b295bc5d9901554802f698344bf4b7 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Fri, 20 Nov 2020 10:43:56 +1100 Subject: [PATCH 046/185] added sequential release + tests --- relm/composition.py | 21 ++++++++++++++++++++- tests/test_composition.py | 21 +++++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/relm/composition.py b/relm/composition.py index 304cd4c..8aa6812 100644 --- a/relm/composition.py +++ b/relm/composition.py @@ -32,7 +32,7 @@ def privacy_consumed(self): class ParallelRelease(ComposedRelease): """ - A base class for calculating the privacy loss of the composition + A class for calculating the privacy loss of the composition of multiple ReleaseMechanisms operating over disjoint subsets of the database. Usage: @@ -47,3 +47,22 @@ class ParallelRelease(ComposedRelease): @property def privacy_consumed(self): return max(p for _, p in self._privacy_losses.items()) + + +class SequentialRelease(ComposedRelease): + """ + A class for calculating the privacy loss of the composition + of multiple ReleaseMechanisms. + + Usage: + accountant = PrivacyAccountant(privacy_budget=2) + mechanisms = [LaplaceMechanism(1, 1, precision=20) for _ in range(1000)] + parallel_mechanisms = ParallelRelease(mechanisms) + # data releases still occur with the mechanisms + mechanisms[0].release(data) + + """ + + @property + def privacy_consumed(self): + return sum(p for _, p in self._privacy_losses.items()) diff --git a/tests/test_composition.py b/tests/test_composition.py index fa9b074..1b9249a 100644 --- a/tests/test_composition.py +++ b/tests/test_composition.py @@ -1,6 +1,6 @@ from relm.mechanisms import LaplaceMechanism from relm.accountant import PrivacyAccountant -from relm.composition import ParallelRelease +from relm.composition import ParallelRelease, SequentialRelease import numpy as np @@ -15,7 +15,6 @@ def test_parallel_release(): mechanisms = [LaplaceMechanism(4, precision=20, sensitivity=1) for _ in range(1000)] para_mechs = ParallelRelease(mechanisms) - print("Privacy consumed:", para_mechs.privacy_consumed) accountant.add_mechanism(para_mechs) accountant.add_mechanism(LaplaceMechanism(100, precision=20, sensitivity=1)) @@ -26,3 +25,21 @@ def test_parallel_release(): assert accountant.privacy_consumed == 4 assert accountant._max_privacy_loss == 124 assert para_mechs.privacy_consumed == 4 + assert para_mechs.epsilon == 4 + + +def test_sequential_release(): + accountant = PrivacyAccountant(1000000) + + mechanisms = [ + LaplaceMechanism(20, precision=20, sensitivity=1) for _ in range(1000) + ] + seq_mechs = SequentialRelease(mechanisms) + accountant.add_mechanism(seq_mechs) + + values = np.zeros(1) + _ = [mechanism.release(values) for mechanism in mechanisms] + + assert accountant.privacy_consumed == 20000 + assert seq_mechs.privacy_consumed == 20000 + assert seq_mechs.epsilon == 20000 From a61453eae9cc2fd19951e0d3abea3d8efa755e74 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 24 Nov 2020 13:46:41 +1100 Subject: [PATCH 047/185] Added an (insecure) all-python draft of the ExponentialMechanism --- relm/mechanisms.py | 48 ++++++++++++++++++++++++++++++++++++---- tests/test_mechanisms.py | 30 +++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index b4a8db6..f94f136 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -55,9 +55,8 @@ class LaplaceMechanism(ReleaseMechanism): Args: epsilon: the maximum privacy loss of the mechanism. - sensitivity: the sensitivity of the query that this will be applied to + sensitivity: the sensitivity of the query to which this mechanism will be applied. precision: number of fractional bits to use in the internal fixed point representation. - """ def __init__(self, epsilon, sensitivity, precision): @@ -100,8 +99,7 @@ class GeometricMechanism(LaplaceMechanism): Args: epsilon: the maximum privacy loss of the mechanism. - sensitivity: the sensitivity of the query that this will be applied to - + sensitivity: the sensitivity of the query to which this mechanism will be applied. """ def __init__(self, epsilon, sensitivity): @@ -123,6 +121,48 @@ def release(self, values): return backend.geometric_mechanism(values, self.sensitivity, self.epsilon) +class ExponentialMechanism(ReleaseMechanism): + """ + Insecure implementation of the Exponential Mechanism. This mechanism can be used once + after which its privacy budget will be exhausted and it can no longer be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + utility_function: the utility function. + sensitivity: the sensitivity of the utility function. + """ + + def __init__(self, epsilon, utility_function, sensitivity, output_range): + self.utility_function = utility_function + self.sensitivity = sensitivity + self.output_range = output_range + super(ExponentialMechanism, self).__init__(epsilon) + + def release(self, values, _k=1): + self._check_valid() + self._is_valid = False + self._update_accountant() + + output_utilities = self.utility_function(values) + log_weights = self.epsilon * output_utilities / (2 * self.sensitivity) + weights = np.exp(log_weights) + # probs = scipy.special.softmax(log_weights) + + rng = secrets.SystemRandom() + output = np.array(rng.choices(self.output_range, weights=weights, k=_k)) + return output + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon + + class SparseGeneric(ReleaseMechanism): def __init__( self, diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 17471bb..1c5a1ad 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -4,6 +4,7 @@ from relm.mechanisms import ( LaplaceMechanism, GeometricMechanism, + ExponentialMechanism, SnappingMechanism, AboveThreshold, SparseIndicator, @@ -48,6 +49,35 @@ def test_GeometricMechanism(benchmark): assert pval > 0.001 +def test_ExponentialMechanism(benchmark): + n = 10 + output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) + utility_function = lambda x: -np.abs(output_range - np.mean(x)) + mechanism = ExponentialMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + ) + _test_mechanism(benchmark, mechanism) + # Goodness of fit test + n = 16 + output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) + utility_function = lambda x: -np.abs(output_range - np.mean(x)) + data = np.zeros(1) + TRIALS = 2 ** 10 + mechanism = ExponentialMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + ) + values = mechanism.release(data, _k=TRIALS) + z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) + score, pval = scipy.stats.ks_2samp(values, z) + assert pval > 0.001 + + def test_above_threshold(benchmark): mechanism = AboveThreshold(epsilon=1, sensitivity=1.0, threshold=0.1) _test_mechanism(benchmark, mechanism) From 1d3edc178d19cb34c761c09c2cc972a61e084c90 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 24 Nov 2020 14:03:55 +1100 Subject: [PATCH 048/185] Added a _release function to allow for efficient GoF testing --- relm/mechanisms.py | 14 +++++++++++--- tests/test_mechanisms.py | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index f94f136..90b5920 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -138,7 +138,16 @@ def __init__(self, epsilon, utility_function, sensitivity, output_range): self.output_range = output_range super(ExponentialMechanism, self).__init__(epsilon) - def release(self, values, _k=1): + def release(self, values): + return self._release(values, k=1) + + def _release(self, values, k): + """ + Release k independent outputs from the mechanism. This is useful for + goodness-of-fit testing. Using k > 1 is inconsistent with all privacy + accounting and should never be used to prepare real data releases. + """ + self._check_valid() self._is_valid = False self._update_accountant() @@ -146,10 +155,9 @@ def release(self, values, _k=1): output_utilities = self.utility_function(values) log_weights = self.epsilon * output_utilities / (2 * self.sensitivity) weights = np.exp(log_weights) - # probs = scipy.special.softmax(log_weights) rng = secrets.SystemRandom() - output = np.array(rng.choices(self.output_range, weights=weights, k=_k)) + output = np.array(rng.choices(self.output_range, weights=weights, k=k)) return output @property diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 1c5a1ad..bced3b4 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -72,7 +72,7 @@ def test_ExponentialMechanism(benchmark): sensitivity=1.0, output_range=output_range, ) - values = mechanism.release(data, _k=TRIALS) + values = mechanism._release(data, k=TRIALS) z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) score, pval = scipy.stats.ks_2samp(values, z) assert pval > 0.001 From c9abbbac6b8e07a994307779824ce1c83fc1bc09 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 24 Nov 2020 15:53:58 +1100 Subject: [PATCH 049/185] Started migrating ExponentialMechanism to rust --- relm/mechanisms.py | 9 +++++++-- src/lib.rs | 16 ++++++++++++++++ src/mechanisms.rs | 3 +++ src/samplers.rs | 8 ++++++++ tests/test_mechanisms.py | 2 +- 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 90b5920..f6afad2 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -156,8 +156,13 @@ def _release(self, values, k): log_weights = self.epsilon * output_utilities / (2 * self.sensitivity) weights = np.exp(log_weights) - rng = secrets.SystemRandom() - output = np.array(rng.choices(self.output_range, weights=weights, k=k)) + # rng = secrets.SystemRandom() + # output = np.array(rng.choices(self.output_range, weights=weights, k=k)) + + n = len(self.output_range) + choices = np.arange(n, dtype=np.uint64) + indices = backend.exponential_mechanism(choices, weights, k) + output = np.array([self.output_range[i] for i in indices]) return output @property diff --git a/src/lib.rs b/src/lib.rs index 5f2f73f..7586226 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -65,5 +65,21 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { mechanisms::geometric_mechanism(data, sensitivity, epsilon).to_pyarray(py) } + + #[pyfn(m, "exponential_mechanism")] + fn py_exponential_mechanism<'a>( + py: Python<'a>, + // data: &'a PyArray1, + // sensitivity: f64, + // epsilon: f64, + choices: &'a PyArray1, + weights: &'a PyArray1, + k: u64, + ) -> &'a PyArray1 { + let choices = choices.to_vec().unwrap(); + let weights = weights.to_vec().unwrap(); + mechanisms::exponential_mechanism(choices, weights, k).to_pyarray(py) + } + Ok(()) } diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 2a883eb..c5b2b66 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -44,3 +44,6 @@ pub fn geometric_mechanism(data: Vec, sensitivity: f64, epsilon: f64) -> Ve } +pub fn exponential_mechanism(choices: Vec, weights: Vec, k: u64) -> Vec { + (0..k).map(|_| samplers::discrete(&choices, &weights)).collect() +} diff --git a/src/samplers.rs b/src/samplers.rs index ffbb448..947827a 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -1,8 +1,16 @@ use rand::prelude::*; +use rand::distributions::WeightedIndex; + use rug::Integer; use crate::utils; +pub fn discrete(choices: &Vec, weights: &Vec) -> u64 { + let mut rng = rand::thread_rng(); + let dist = WeightedIndex::new(weights).unwrap(); + choices[dist.sample(&mut rng)] +} + pub fn uniform(scale: f64) -> f64 { /// Returns a sample from the [0, scale) uniform distribution diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index bced3b4..ddb6be2 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -65,7 +65,7 @@ def test_ExponentialMechanism(benchmark): output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) data = np.zeros(1) - TRIALS = 2 ** 10 + TRIALS = 2 ** 0 mechanism = ExponentialMechanism( epsilon=1.0, utility_function=utility_function, From 6f46ac04d97218293225365a4156a2038d22faad Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 24 Nov 2020 16:31:59 +1100 Subject: [PATCH 050/185] Moved WeightedIndex generation into src/mechanisms --- relm/mechanisms.py | 3 --- src/mechanisms.rs | 7 ++++++- src/samplers.rs | 3 +-- tests/test_mechanisms.py | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index f6afad2..1b309cf 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -156,9 +156,6 @@ def _release(self, values, k): log_weights = self.epsilon * output_utilities / (2 * self.sensitivity) weights = np.exp(log_weights) - # rng = secrets.SystemRandom() - # output = np.array(rng.choices(self.output_range, weights=weights, k=k)) - n = len(self.output_range) choices = np.arange(n, dtype=np.uint64) indices = backend.exponential_mechanism(choices, weights, k) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index c5b2b66..f11827f 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -1,3 +1,6 @@ +use rand::prelude::*; +use rand::distributions::WeightedIndex; + use rayon::prelude::*; use crate::samplers; use crate::utils; @@ -45,5 +48,7 @@ pub fn geometric_mechanism(data: Vec, sensitivity: f64, epsilon: f64) -> Ve pub fn exponential_mechanism(choices: Vec, weights: Vec, k: u64) -> Vec { - (0..k).map(|_| samplers::discrete(&choices, &weights)).collect() + let mut rng = rand::thread_rng(); + let dist = WeightedIndex::new(weights).unwrap(); + (0..k).map(|_| samplers::discrete(&choices, &dist)).collect() } diff --git a/src/samplers.rs b/src/samplers.rs index 947827a..e5ef927 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -5,9 +5,8 @@ use rug::Integer; use crate::utils; -pub fn discrete(choices: &Vec, weights: &Vec) -> u64 { +pub fn discrete(choices: &Vec, dist: &WeightedIndex) -> u64 { let mut rng = rand::thread_rng(); - let dist = WeightedIndex::new(weights).unwrap(); choices[dist.sample(&mut rng)] } diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index ddb6be2..bced3b4 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -65,7 +65,7 @@ def test_ExponentialMechanism(benchmark): output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) data = np.zeros(1) - TRIALS = 2 ** 0 + TRIALS = 2 ** 10 mechanism = ExponentialMechanism( epsilon=1.0, utility_function=utility_function, From e585bf7b7fd8261f32d165466d69c2a84ab03394 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 24 Nov 2020 16:37:03 +1100 Subject: [PATCH 051/185] Removed extraneous "use rand" stuff from src/mechanisms.rs --- src/mechanisms.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index f11827f..943595e 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -1,4 +1,3 @@ -use rand::prelude::*; use rand::distributions::WeightedIndex; use rayon::prelude::*; @@ -48,7 +47,6 @@ pub fn geometric_mechanism(data: Vec, sensitivity: f64, epsilon: f64) -> Ve pub fn exponential_mechanism(choices: Vec, weights: Vec, k: u64) -> Vec { - let mut rng = rand::thread_rng(); let dist = WeightedIndex::new(weights).unwrap(); (0..k).map(|_| samplers::discrete(&choices, &dist)).collect() } From a024bbaebb893c2ee56ec9c43b1c53018be3f2d1 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 24 Nov 2020 17:32:24 +1100 Subject: [PATCH 052/185] Moved computation of weights from python -> rust --- relm/mechanisms.py | 11 ++++++----- src/lib.rs | 10 +++++----- src/mechanisms.rs | 6 +++++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 1b309cf..37834df 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -152,13 +152,14 @@ def _release(self, values, k): self._is_valid = False self._update_accountant() - output_utilities = self.utility_function(values) - log_weights = self.epsilon * output_utilities / (2 * self.sensitivity) - weights = np.exp(log_weights) - n = len(self.output_range) choices = np.arange(n, dtype=np.uint64) - indices = backend.exponential_mechanism(choices, weights, k) + + utilities = self.utility_function(values) + indices = backend.exponential_mechanism( + choices, utilities, self.sensitivity, self.epsilon, k + ) + output = np.array([self.output_range[i] for i in indices]) return output diff --git a/src/lib.rs b/src/lib.rs index 7586226..e17b3c5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -70,15 +70,15 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { fn py_exponential_mechanism<'a>( py: Python<'a>, // data: &'a PyArray1, - // sensitivity: f64, - // epsilon: f64, choices: &'a PyArray1, - weights: &'a PyArray1, + utilities: &'a PyArray1, + sensitivity: f64, + epsilon: f64, k: u64, ) -> &'a PyArray1 { let choices = choices.to_vec().unwrap(); - let weights = weights.to_vec().unwrap(); - mechanisms::exponential_mechanism(choices, weights, k).to_pyarray(py) + let utilities = utilities.to_vec().unwrap(); + mechanisms::exponential_mechanism(choices, utilities, sensitivity, epsilon, k).to_pyarray(py) } Ok(()) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 943595e..05f9491 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -46,7 +46,11 @@ pub fn geometric_mechanism(data: Vec, sensitivity: f64, epsilon: f64) -> Ve } -pub fn exponential_mechanism(choices: Vec, weights: Vec, k: u64) -> Vec { +pub fn exponential_mechanism(choices: Vec, utilities: Vec, sensitivity: f64, epsilon: f64, k: u64) -> Vec { + let weights: Vec = utilities.par_iter() + .map(|u| epsilon * u / (2.0f64 * sensitivity)) + .map(|u| u.exp()) + .collect(); let dist = WeightedIndex::new(weights).unwrap(); (0..k).map(|_| samplers::discrete(&choices, &dist)).collect() } From 551715df243e29cbbbd46fa05d04e13445960313 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 24 Nov 2020 17:58:21 +1100 Subject: [PATCH 053/185] Moved computation of choices from python -> rust --- relm/mechanisms.py | 11 +++++------ src/lib.rs | 5 +---- src/mechanisms.rs | 5 ++++- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 37834df..3065b72 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -152,16 +152,15 @@ def _release(self, values, k): self._is_valid = False self._update_accountant() - n = len(self.output_range) - choices = np.arange(n, dtype=np.uint64) - utilities = self.utility_function(values) indices = backend.exponential_mechanism( - choices, utilities, self.sensitivity, self.epsilon, k + utilities, + self.sensitivity, + self.epsilon, + k, ) - output = np.array([self.output_range[i] for i in indices]) - return output + return np.array([self.output_range[i] for i in indices]) @property def privacy_consumed(self): diff --git a/src/lib.rs b/src/lib.rs index e17b3c5..57c824f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -69,16 +69,13 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { #[pyfn(m, "exponential_mechanism")] fn py_exponential_mechanism<'a>( py: Python<'a>, - // data: &'a PyArray1, - choices: &'a PyArray1, utilities: &'a PyArray1, sensitivity: f64, epsilon: f64, k: u64, ) -> &'a PyArray1 { - let choices = choices.to_vec().unwrap(); let utilities = utilities.to_vec().unwrap(); - mechanisms::exponential_mechanism(choices, utilities, sensitivity, epsilon, k).to_pyarray(py) + mechanisms::exponential_mechanism(utilities, sensitivity, epsilon, k).to_pyarray(py) } Ok(()) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 05f9491..db1ff16 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -1,4 +1,5 @@ use rand::distributions::WeightedIndex; +use std::convert::TryInto; use rayon::prelude::*; use crate::samplers; @@ -46,11 +47,13 @@ pub fn geometric_mechanism(data: Vec, sensitivity: f64, epsilon: f64) -> Ve } -pub fn exponential_mechanism(choices: Vec, utilities: Vec, sensitivity: f64, epsilon: f64, k: u64) -> Vec { +pub fn exponential_mechanism(utilities: Vec, sensitivity: f64, epsilon: f64, k: u64) -> Vec { let weights: Vec = utilities.par_iter() .map(|u| epsilon * u / (2.0f64 * sensitivity)) .map(|u| u.exp()) .collect(); let dist = WeightedIndex::new(weights).unwrap(); + let n: u64 = utilities.len().try_into().unwrap(); + let choices: Vec = (0..n).collect(); (0..k).map(|_| samplers::discrete(&choices, &dist)).collect() } From 41d145c1ce3d0c723b67935f0e6329eb31f502a0 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 26 Nov 2020 10:24:13 +1100 Subject: [PATCH 054/185] Added an implementation of the ExponentialMechanism using the "Gumbel trick". --- relm/mechanisms.py | 32 +++++++++++++++++++++++++------- src/lib.rs | 30 ++++++++++++++++++++++++++---- src/samplers.rs | 11 +++++++++++ src/utils.rs | 10 ++++++++++ tests/test_mechanisms.py | 39 ++++++++++++++++++++++++++++++++++++--- 5 files changed, 108 insertions(+), 14 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 3065b72..60293d8 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -132,10 +132,18 @@ class ExponentialMechanism(ReleaseMechanism): sensitivity: the sensitivity of the utility function. """ - def __init__(self, epsilon, utility_function, sensitivity, output_range): + def __init__( + self, + epsilon, + utility_function, + sensitivity, + output_range, + method="gumbel_trick", + ): self.utility_function = utility_function self.sensitivity = sensitivity self.output_range = output_range + self.method = method super(ExponentialMechanism, self).__init__(epsilon) def release(self, values): @@ -153,12 +161,22 @@ def _release(self, values, k): self._update_accountant() utilities = self.utility_function(values) - indices = backend.exponential_mechanism( - utilities, - self.sensitivity, - self.epsilon, - k, - ) + if self.method == "weighted_index": + indices = backend.exponential_mechanism_weighted_index( + utilities, + self.sensitivity, + self.epsilon, + k, + ) + elif self.method == "gumbel_trick": + indices = backend.exponential_mechanism_gumbel_trick( + utilities, + self.sensitivity, + self.epsilon, + k, + ) + else: + raise ValueError() return np.array([self.output_range[i] for i in indices]) diff --git a/src/lib.rs b/src/lib.rs index 57c824f..97bfae2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -66,16 +66,38 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { } - #[pyfn(m, "exponential_mechanism")] - fn py_exponential_mechanism<'a>( + #[pyfn(m, "exponential_mechanism_weighted_index")] + fn py_exponential_mechanism_weighted_index<'a>( py: Python<'a>, utilities: &'a PyArray1, sensitivity: f64, epsilon: f64, - k: u64, + k: usize, ) -> &'a PyArray1 { let utilities = utilities.to_vec().unwrap(); - mechanisms::exponential_mechanism(utilities, sensitivity, epsilon, k).to_pyarray(py) + mechanisms::exponential_mechanism_weighted_index( + utilities, + sensitivity, + epsilon, + k, + ).to_pyarray(py) + } + + #[pyfn(m, "exponential_mechanism_gumbel_trick")] + fn py_exponential_mechanism_gumbel_trick<'a>( + py: Python<'a>, + utilities: &'a PyArray1, + sensitivity: f64, + epsilon: f64, + k: usize, + ) -> &'a PyArray1 { + let utilities = utilities.to_vec().unwrap(); + mechanisms::exponential_mechanism_gumbel_trick( + utilities, + sensitivity, + epsilon, + k, + ).to_pyarray(py) } Ok(()) diff --git a/src/samplers.rs b/src/samplers.rs index e5ef927..917cd36 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -31,6 +31,17 @@ pub fn geometric(scale: f64) -> f64 { } +pub fn gumbel(scale: f64) -> f64 { + /// Returns a sample from the Gumbel distribution + /// + /// # Arguments + /// + /// * `scale` = The scale parameter of the Gumbel distribution + let mut rng = rand::thread_rng(); + -scale * (-rng.gen::().ln()).ln() +} + + pub fn uniform_double(scale: f64) -> f64 { /// Returns a sample from the [0, scale) uniform distribution /// diff --git a/src/utils.rs b/src/utils.rs index cef23fe..567444a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,4 +1,5 @@ use rug::{float::Round, Float, Integer}; +use std::cmp::Ordering::Equal; pub fn clamp(x: f64, bound: f64) -> f64 { if x < -bound { @@ -18,6 +19,15 @@ pub fn ln_rn(x: f64) -> f64 { } +pub fn argmax(slice: &Vec) -> usize { + slice.iter() + .enumerate() + .max_by(|(_, x), (_, y)| x.partial_cmp(y).unwrap_or(Equal)) + .map(|(i, _)| i) + .unwrap() +} + + pub fn fp_laplace_bit_biases(scale: f64, precision: i32) -> Vec{ let mut biases: Vec = vec![0; 64]; diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index bced3b4..c33c950 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -49,28 +49,61 @@ def test_GeometricMechanism(benchmark): assert pval > 0.001 -def test_ExponentialMechanism(benchmark): +def test_ExponentialMechanismWeightedIndex(benchmark): + n = 6 + output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) + utility_function = lambda x: -np.abs(output_range - np.mean(x)) + mechanism = ExponentialMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + method="weighted_index", + ) + _test_mechanism(benchmark, mechanism) + # Goodness of fit test n = 10 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) + data = np.zeros(1) + TRIALS = 2 ** 12 + mechanism = ExponentialMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + method="weighted_index", + ) + values = mechanism._release(data, k=TRIALS) + z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) + score, pval = scipy.stats.ks_2samp(values, z) + assert pval > 0.001 + + +def test_ExponentialMechanismGumbelTrick(benchmark): + n = 6 + output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) + utility_function = lambda x: -np.abs(output_range - np.mean(x)) mechanism = ExponentialMechanism( epsilon=1.0, utility_function=utility_function, sensitivity=1.0, output_range=output_range, + method="gumbel_trick", ) _test_mechanism(benchmark, mechanism) # Goodness of fit test - n = 16 + n = 10 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) data = np.zeros(1) - TRIALS = 2 ** 10 + TRIALS = 2 ** 12 mechanism = ExponentialMechanism( epsilon=1.0, utility_function=utility_function, sensitivity=1.0, output_range=output_range, + method="gumbel_trick", ) values = mechanism._release(data, k=TRIALS) z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) From 6af6e4d872789620d099d94563c27866866d9977 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 26 Nov 2020 10:25:32 +1100 Subject: [PATCH 055/185] Added ExponentialMechanism to auto-docs build --- docs-source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-source/index.rst b/docs-source/index.rst index 029b690..f1023a0 100644 --- a/docs-source/index.rst +++ b/docs-source/index.rst @@ -14,7 +14,7 @@ Mechanisms ================================================ .. automodule:: relm.mechanisms - :members: LaplaceMechanism, GeometricMechanism, SnappingMechanism, AboveThreshold, SparseIndicator, SparseNumeric, ReportNoisyMax + :members: LaplaceMechanism, GeometricMechanism, SnappingMechanism, AboveThreshold, SparseIndicator, SparseNumeric, ReportNoisyMax, ExponentialMechanism Indices and tables From 3f6c800da1ac8a203c00aee721bfba601b4f1562 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 26 Nov 2020 10:26:19 +1100 Subject: [PATCH 056/185] Simple formatting changes --- src/mechanisms.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index db1ff16..dc4c13d 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -47,7 +47,13 @@ pub fn geometric_mechanism(data: Vec, sensitivity: f64, epsilon: f64) -> Ve } -pub fn exponential_mechanism(utilities: Vec, sensitivity: f64, epsilon: f64, k: u64) -> Vec { +pub fn exponential_mechanism_weighted_index( + utilities: Vec, + sensitivity: f64, + epsilon: f64, + k: usize) +-> Vec { + let weights: Vec = utilities.par_iter() .map(|u| epsilon * u / (2.0f64 * sensitivity)) .map(|u| u.exp()) @@ -57,3 +63,24 @@ pub fn exponential_mechanism(utilities: Vec, sensitivity: f64, epsilon: f64 let choices: Vec = (0..n).collect(); (0..k).map(|_| samplers::discrete(&choices, &dist)).collect() } + + +pub fn exponential_mechanism_gumbel_trick( + utilities: Vec, + sensitivity: f64, + epsilon: f64, + k: usize) +-> Vec { + + let log_weights: Vec = utilities.par_iter() + .map(|u| epsilon * u / (2.0f64 * sensitivity)) + .collect(); + let mut indices: Vec = vec![0; k]; + for i in 0..k { + let noisy_log_weights: Vec = log_weights.par_iter() + .map(|w| w + samplers::gumbel(1.0f64)) + .collect(); + indices[i] = utils::argmax(&noisy_log_weights).try_into().unwrap(); + } + indices +} From 7f8b0f7a13f330d9976c801c5af3890a45c8bd0b Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 27 Nov 2020 11:43:32 +1100 Subject: [PATCH 057/185] Added a sample_and_flip method for ExponentialMechanism --- relm/mechanisms.py | 7 +++++++ src/lib.rs | 19 +++++++++++++++++++ src/mechanisms.rs | 27 +++++++++++++++++++++++++++ src/samplers.rs | 14 +++++++++++++- tests/test_mechanisms.py | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 1 deletion(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 60293d8..3276bb4 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -175,6 +175,13 @@ def _release(self, values, k): self.epsilon, k, ) + elif self.method == "sample_and_flip": + indices = backend.exponential_mechanism_sample_and_flip( + utilities, + self.sensitivity, + self.epsilon, + k, + ) else: raise ValueError() diff --git a/src/lib.rs b/src/lib.rs index 97bfae2..fc4ca79 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -83,6 +83,7 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { ).to_pyarray(py) } + #[pyfn(m, "exponential_mechanism_gumbel_trick")] fn py_exponential_mechanism_gumbel_trick<'a>( py: Python<'a>, @@ -100,5 +101,23 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { ).to_pyarray(py) } + + #[pyfn(m, "exponential_mechanism_sample_and_flip")] + fn py_exponential_mechanism_sample_and_flip<'a>( + py: Python<'a>, + utilities: &'a PyArray1, + sensitivity: f64, + epsilon: f64, + k: usize, + ) -> &'a PyArray1 { + let utilities = utilities.to_vec().unwrap(); + mechanisms::exponential_mechanism_sample_and_flip( + utilities, + sensitivity, + epsilon, + k, + ).to_pyarray(py) + } + Ok(()) } diff --git a/src/mechanisms.rs b/src/mechanisms.rs index dc4c13d..944c31d 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -84,3 +84,30 @@ pub fn exponential_mechanism_gumbel_trick( } indices } + + +pub fn exponential_mechanism_sample_and_flip( + utilities: Vec, + sensitivity: f64, + epsilon: f64, + k: usize) +-> Vec { + + let log_weights: Vec = utilities.par_iter() + .map(|u| epsilon * u / (2.0f64 * sensitivity)) + .collect(); + let n: u64 = utilities.len().try_into().unwrap(); + let mut indices: Vec = vec![0; k]; + for i in 0..k { + let mut flag: bool = false; + while !flag { + let index: u64 = samplers::uniform_integer(&n); + let p: f64 = (epsilon * log_weights[i] / (2.0f64 * sensitivity)).exp(); + flag = samplers::bernoulli(&p); + if flag { + indices[i] = index; + } + } + } + indices +} diff --git a/src/samplers.rs b/src/samplers.rs index 917cd36..1276856 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -1,5 +1,5 @@ use rand::prelude::*; -use rand::distributions::WeightedIndex; +use rand::distributions::{WeightedIndex, Bernoulli}; use rug::Integer; use crate::utils; @@ -11,6 +11,18 @@ pub fn discrete(choices: &Vec, dist: &WeightedIndex) -> u64 { } +pub fn uniform_integer(n: &u64) -> u64 { + let mut rng = rand::thread_rng(); + let result: u64 = rng.gen_range(0, *n); + result +} + +pub fn bernoulli(p: &f64) -> bool { + let mut rng = rand::thread_rng(); + let dist = Bernoulli::new(*p).unwrap(); + dist.sample(&mut rand::thread_rng()) +} + pub fn uniform(scale: f64) -> f64 { /// Returns a sample from the [0, scale) uniform distribution /// diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index c33c950..8dc6c1a 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -111,6 +111,42 @@ def test_ExponentialMechanismGumbelTrick(benchmark): assert pval > 0.001 +def test_ExponentialMechanismSampleAndFlip(benchmark): + n = 6 # This gets *really* slow if n in mcuh bigger than 6. + output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) + utility_function = lambda x: -np.abs(output_range - np.mean(x)) + mechanism = ExponentialMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + method="sample_and_flip", + ) + _test_mechanism(benchmark, mechanism) + # The Goodness-of-Fit test does not work well for SampleAndFlip. If n is set large + # enough to make the fit good enough, then there are many low-probability + # outputs in the output_range. This means that the acceptance rate + # in the rejection sampling subroutine is very low. This makes this method + # extremely slow for large n. + # Goodness of fit test + # n = 6 + # output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) + # utility_function = lambda x: -np.abs(output_range - np.mean(x)) + # data = np.zeros(1) + # TRIALS = 2 ** 12 + # mechanism = ExponentialMechanism( + # epsilon=1.0, + # utility_function=utility_function, + # sensitivity=1.0, + # output_range=output_range, + # method="sample_and_flip", + # ) + # values = mechanism._release(data, k=TRIALS) + # z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) + # score, pval = scipy.stats.ks_2samp(values, z) + # assert pval > 0.001 + + def test_above_threshold(benchmark): mechanism = AboveThreshold(epsilon=1, sensitivity=1.0, threshold=0.1) _test_mechanism(benchmark, mechanism) From 414aa5b066ae33d1ba2c2efd8f043587eb092bbf Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 27 Nov 2020 12:53:44 +1100 Subject: [PATCH 058/185] Fixed some silyl problems with `sample_and_flip` method for ExponentialMechanism --- src/mechanisms.rs | 17 +++++++++------ tests/test_mechanisms.py | 47 ++++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 944c31d..fbd4257 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -93,21 +93,24 @@ pub fn exponential_mechanism_sample_and_flip( k: usize) -> Vec { - let log_weights: Vec = utilities.par_iter() - .map(|u| epsilon * u / (2.0f64 * sensitivity)) + let argmax: usize = utils::argmax(&utilities); + let max_utility: f64 = utilities[argmax]; + + let mut normalized_log_weights: Vec = utilities.par_iter() + .map(|u| epsilon * (u - max_utility) / (2.0f64 * sensitivity)) .collect(); + let n: u64 = utilities.len().try_into().unwrap(); let mut indices: Vec = vec![0; k]; for i in 0..k { let mut flag: bool = false; + let mut index: usize = 0; while !flag { - let index: u64 = samplers::uniform_integer(&n); - let p: f64 = (epsilon * log_weights[i] / (2.0f64 * sensitivity)).exp(); + index = samplers::uniform_integer(&n).try_into().unwrap(); + let p: f64 = normalized_log_weights[index].exp(); flag = samplers::bernoulli(&p); - if flag { - indices[i] = index; - } } + indices[i] = index.try_into().unwrap(); } indices } diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 8dc6c1a..ada2206 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -62,7 +62,7 @@ def test_ExponentialMechanismWeightedIndex(benchmark): ) _test_mechanism(benchmark, mechanism) # Goodness of fit test - n = 10 + n = 6 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) data = np.zeros(1) @@ -93,7 +93,7 @@ def test_ExponentialMechanismGumbelTrick(benchmark): ) _test_mechanism(benchmark, mechanism) # Goodness of fit test - n = 10 + n = 6 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) data = np.zeros(1) @@ -123,28 +123,29 @@ def test_ExponentialMechanismSampleAndFlip(benchmark): method="sample_and_flip", ) _test_mechanism(benchmark, mechanism) - # The Goodness-of-Fit test does not work well for SampleAndFlip. If n is set large - # enough to make the fit good enough, then there are many low-probability - # outputs in the output_range. This means that the acceptance rate - # in the rejection sampling subroutine is very low. This makes this method - # extremely slow for large n. # Goodness of fit test - # n = 6 - # output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) - # utility_function = lambda x: -np.abs(output_range - np.mean(x)) - # data = np.zeros(1) - # TRIALS = 2 ** 12 - # mechanism = ExponentialMechanism( - # epsilon=1.0, - # utility_function=utility_function, - # sensitivity=1.0, - # output_range=output_range, - # method="sample_and_flip", - # ) - # values = mechanism._release(data, k=TRIALS) - # z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) - # score, pval = scipy.stats.ks_2samp(values, z) - # assert pval > 0.001 + # Notice that this is a different GoF test than for the other + # ExponentialMechanism methods. That is because sample_and_flip + # does not work well with large output_range sets. + n = 6 + output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) + utility_function = lambda x: -np.abs(output_range - np.mean(x)) + data = np.zeros(1) + TRIALS = 2 ** 12 + mechanism = ExponentialMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + method="sample_and_flip", + ) + values = mechanism._release(data, k=TRIALS) + # weights = np.exp(-np.abs(output_range) / 2.0) + # probs = weights / np.sum(weights) + # z = np.random.choice(output_range, size=TRIALS, replace=True, p=probs) + z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) + score, pval = scipy.stats.ks_2samp(values, z) + assert pval > 0.001 def test_above_threshold(benchmark): From fcab27ede19e46fea1f813ded9f6821dd5b1c851 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 27 Nov 2020 14:13:19 +1100 Subject: [PATCH 059/185] Removed the `k` argument from ExponentialMechanism stuff --- src/lib.rs | 27 ++++++++--------- src/mechanisms.rs | 41 ++++++++++---------------- tests/test_mechanisms.py | 63 +++++++++++++++++++++------------------- 3 files changed, 60 insertions(+), 71 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fc4ca79..768ef34 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -72,15 +72,14 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { utilities: &'a PyArray1, sensitivity: f64, epsilon: f64, - k: usize, - ) -> &'a PyArray1 { + ) -> PyResult { let utilities = utilities.to_vec().unwrap(); - mechanisms::exponential_mechanism_weighted_index( + let index: u64 = mechanisms::exponential_mechanism_weighted_index( utilities, sensitivity, epsilon, - k, - ).to_pyarray(py) + ); + Ok(index) } @@ -90,15 +89,14 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { utilities: &'a PyArray1, sensitivity: f64, epsilon: f64, - k: usize, - ) -> &'a PyArray1 { + ) -> PyResult { let utilities = utilities.to_vec().unwrap(); - mechanisms::exponential_mechanism_gumbel_trick( + let index: u64 = mechanisms::exponential_mechanism_gumbel_trick( utilities, sensitivity, epsilon, - k, - ).to_pyarray(py) + ); + Ok(index) } @@ -108,15 +106,14 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { utilities: &'a PyArray1, sensitivity: f64, epsilon: f64, - k: usize, - ) -> &'a PyArray1 { + ) -> PyResult { let utilities = utilities.to_vec().unwrap(); - mechanisms::exponential_mechanism_sample_and_flip( + let index: u64 = mechanisms::exponential_mechanism_sample_and_flip( utilities, sensitivity, epsilon, - k, - ).to_pyarray(py) + ); + Ok(index) } Ok(()) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index fbd4257..165771a 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -51,8 +51,7 @@ pub fn exponential_mechanism_weighted_index( utilities: Vec, sensitivity: f64, epsilon: f64, - k: usize) --> Vec { +) -> u64 { let weights: Vec = utilities.par_iter() .map(|u| epsilon * u / (2.0f64 * sensitivity)) @@ -61,7 +60,7 @@ pub fn exponential_mechanism_weighted_index( let dist = WeightedIndex::new(weights).unwrap(); let n: u64 = utilities.len().try_into().unwrap(); let choices: Vec = (0..n).collect(); - (0..k).map(|_| samplers::discrete(&choices, &dist)).collect() + samplers::discrete(&choices, &dist) } @@ -69,20 +68,15 @@ pub fn exponential_mechanism_gumbel_trick( utilities: Vec, sensitivity: f64, epsilon: f64, - k: usize) --> Vec { +) -> u64 { let log_weights: Vec = utilities.par_iter() .map(|u| epsilon * u / (2.0f64 * sensitivity)) .collect(); - let mut indices: Vec = vec![0; k]; - for i in 0..k { - let noisy_log_weights: Vec = log_weights.par_iter() - .map(|w| w + samplers::gumbel(1.0f64)) - .collect(); - indices[i] = utils::argmax(&noisy_log_weights).try_into().unwrap(); - } - indices + let noisy_log_weights: Vec = log_weights.par_iter() + .map(|w| w + samplers::gumbel(1.0f64)) + .collect(); + utils::argmax(&noisy_log_weights).try_into().unwrap() } @@ -90,8 +84,7 @@ pub fn exponential_mechanism_sample_and_flip( utilities: Vec, sensitivity: f64, epsilon: f64, - k: usize) --> Vec { +) -> u64 { let argmax: usize = utils::argmax(&utilities); let max_utility: f64 = utilities[argmax]; @@ -101,16 +94,12 @@ pub fn exponential_mechanism_sample_and_flip( .collect(); let n: u64 = utilities.len().try_into().unwrap(); - let mut indices: Vec = vec![0; k]; - for i in 0..k { - let mut flag: bool = false; - let mut index: usize = 0; - while !flag { - index = samplers::uniform_integer(&n).try_into().unwrap(); - let p: f64 = normalized_log_weights[index].exp(); - flag = samplers::bernoulli(&p); - } - indices[i] = index.try_into().unwrap(); + let mut flag: bool = false; + let mut index: usize = 0; + while !flag { + index = samplers::uniform_integer(&n).try_into().unwrap(); + let p: f64 = normalized_log_weights[index].exp(); + flag = samplers::bernoulli(&p); } - indices + index.try_into().unwrap() } diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index ada2206..5092ea9 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -67,14 +67,17 @@ def test_ExponentialMechanismWeightedIndex(benchmark): utility_function = lambda x: -np.abs(output_range - np.mean(x)) data = np.zeros(1) TRIALS = 2 ** 12 - mechanism = ExponentialMechanism( - epsilon=1.0, - utility_function=utility_function, - sensitivity=1.0, - output_range=output_range, - method="weighted_index", - ) - values = mechanism._release(data, k=TRIALS) + values = np.empty(TRIALS) + for i in range(TRIALS): + mechanism = ExponentialMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + method="weighted_index", + ) + values[i] = mechanism.release(data) + z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) score, pval = scipy.stats.ks_2samp(values, z) assert pval > 0.001 @@ -98,14 +101,17 @@ def test_ExponentialMechanismGumbelTrick(benchmark): utility_function = lambda x: -np.abs(output_range - np.mean(x)) data = np.zeros(1) TRIALS = 2 ** 12 - mechanism = ExponentialMechanism( - epsilon=1.0, - utility_function=utility_function, - sensitivity=1.0, - output_range=output_range, - method="gumbel_trick", - ) - values = mechanism._release(data, k=TRIALS) + values = np.empty(TRIALS) + for i in range(TRIALS): + mechanism = ExponentialMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + method="gumbel_trick", + ) + values[i] = mechanism.release(data) + z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) score, pval = scipy.stats.ks_2samp(values, z) assert pval > 0.001 @@ -124,25 +130,22 @@ def test_ExponentialMechanismSampleAndFlip(benchmark): ) _test_mechanism(benchmark, mechanism) # Goodness of fit test - # Notice that this is a different GoF test than for the other - # ExponentialMechanism methods. That is because sample_and_flip - # does not work well with large output_range sets. n = 6 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) data = np.zeros(1) TRIALS = 2 ** 12 - mechanism = ExponentialMechanism( - epsilon=1.0, - utility_function=utility_function, - sensitivity=1.0, - output_range=output_range, - method="sample_and_flip", - ) - values = mechanism._release(data, k=TRIALS) - # weights = np.exp(-np.abs(output_range) / 2.0) - # probs = weights / np.sum(weights) - # z = np.random.choice(output_range, size=TRIALS, replace=True, p=probs) + values = np.empty(TRIALS) + for i in range(TRIALS): + mechanism = ExponentialMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + method="sample_and_flip", + ) + values[i] = mechanism.release(data) + z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) score, pval = scipy.stats.ks_2samp(values, z) assert pval > 0.001 From d0b9667656c1ea0f6f0140ade5ad90a0924bc198 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 27 Nov 2020 14:16:01 +1100 Subject: [PATCH 060/185] Removing `k` from ExponentialMechanism --- relm/mechanisms.py | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 3276bb4..80e9220 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -147,45 +147,34 @@ def __init__( super(ExponentialMechanism, self).__init__(epsilon) def release(self, values): - return self._release(values, k=1) - - def _release(self, values, k): - """ - Release k independent outputs from the mechanism. This is useful for - goodness-of-fit testing. Using k > 1 is inconsistent with all privacy - accounting and should never be used to prepare real data releases. - """ - + # return self._release(values, k=1) self._check_valid() self._is_valid = False self._update_accountant() utilities = self.utility_function(values) if self.method == "weighted_index": - indices = backend.exponential_mechanism_weighted_index( + index = backend.exponential_mechanism_weighted_index( utilities, self.sensitivity, self.epsilon, - k, ) elif self.method == "gumbel_trick": - indices = backend.exponential_mechanism_gumbel_trick( + index = backend.exponential_mechanism_gumbel_trick( utilities, self.sensitivity, self.epsilon, - k, ) elif self.method == "sample_and_flip": - indices = backend.exponential_mechanism_sample_and_flip( + index = backend.exponential_mechanism_sample_and_flip( utilities, self.sensitivity, self.epsilon, - k, ) else: raise ValueError() - return np.array([self.output_range[i] for i in indices]) + return self.output_range[index] @property def privacy_consumed(self): From ec3687e56258521b8835d59291580b5c36961625 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 27 Nov 2020 14:24:45 +1100 Subject: [PATCH 061/185] Removed convoluted logic for samplers::discrete --- src/mechanisms.rs | 4 +--- src/samplers.rs | 11 +++++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 165771a..103d863 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -58,9 +58,7 @@ pub fn exponential_mechanism_weighted_index( .map(|u| u.exp()) .collect(); let dist = WeightedIndex::new(weights).unwrap(); - let n: u64 = utilities.len().try_into().unwrap(); - let choices: Vec = (0..n).collect(); - samplers::discrete(&choices, &dist) + samplers::discrete(&dist) } diff --git a/src/samplers.rs b/src/samplers.rs index 1276856..4e236c8 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -1,16 +1,23 @@ use rand::prelude::*; use rand::distributions::{WeightedIndex, Bernoulli}; +use std::convert::TryInto; use rug::Integer; use crate::utils; -pub fn discrete(choices: &Vec, dist: &WeightedIndex) -> u64 { +// pub fn discrete(choices: &Vec, dist: &WeightedIndex) -> u64 { +// let mut rng = rand::thread_rng(); +// choices[dist.sample(&mut rng)] +//} + +pub fn discrete(dist: &WeightedIndex) -> u64 { let mut rng = rand::thread_rng(); - choices[dist.sample(&mut rng)] + dist.sample(&mut rng).try_into().unwrap() } + pub fn uniform_integer(n: &u64) -> u64 { let mut rng = rand::thread_rng(); let result: u64 = rng.gen_range(0, *n); From 10fdfda287fbbcaeea668c7d560263c0b6ef2376 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 27 Nov 2020 16:09:51 +1100 Subject: [PATCH 062/185] Faster argmax function --- src/utils.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/utils.rs b/src/utils.rs index 567444a..0493026 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -20,11 +20,18 @@ pub fn ln_rn(x: f64) -> f64 { pub fn argmax(slice: &Vec) -> usize { - slice.iter() - .enumerate() - .max_by(|(_, x), (_, y)| x.partial_cmp(y).unwrap_or(Equal)) - .map(|(i, _)| i) - .unwrap() + let mut max_val = slice[0]; + let mut max_idx: usize = 0; + let mut idx = 0; + for &val in slice { + if val > max_val { + max_idx = idx; + max_val = val; + } + idx += 1; + } + + max_idx } From af818aabaae4a863e636be0e8960a317cd6d1026 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 27 Nov 2020 16:35:11 +1100 Subject: [PATCH 063/185] Moved validity checking for method into constructor of ExponentialMechanism --- relm/mechanisms.py | 56 +++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 80e9220..6a924c3 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -128,8 +128,14 @@ class ExponentialMechanism(ReleaseMechanism): Args: epsilon: the maximum privacy loss of the mechanism. - utility_function: the utility function. + utility_function: the utility function. This should accpet an array of values + produced by the query function and return an 1D array of + utilities of the same size as output_range. sensitivity: the sensitivity of the utility function. + output_range: an array of possible output values for the mechanism. + method: a string that specifies which algorithm will be used to sample + from the output distribution. Currently, three options are supported: + "weighted_index", "gumbel_trick", and "sample_and_flip". """ def __init__( @@ -144,36 +150,40 @@ def __init__( self.sensitivity = sensitivity self.output_range = output_range self.method = method + if method == "weighted_index": + sampler = lambda utilities: backend.exponential_mechanism_weighted_index( + utilities, sensitivity, epsilon + ) + elif method == "gumbel_trick": + sampler = lambda utilities: backend.exponential_mechanism_gumbel_trick( + utilities, sensitivity, epsilon + ) + elif method == "sample_and_flip": + sampler = lambda utilities: backend.exponential_mechanism_sample_and_flip( + utilities, sensitivity, epsilon + ) + else: + raise ValueError("Sampling method '%s' not supported." % method) + self.sampler = sampler super(ExponentialMechanism, self).__init__(epsilon) def release(self, values): - # return self._release(values, k=1) + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + + Returns: + An element of output_range set of the mechanism. + """ + self._check_valid() self._is_valid = False self._update_accountant() utilities = self.utility_function(values) - if self.method == "weighted_index": - index = backend.exponential_mechanism_weighted_index( - utilities, - self.sensitivity, - self.epsilon, - ) - elif self.method == "gumbel_trick": - index = backend.exponential_mechanism_gumbel_trick( - utilities, - self.sensitivity, - self.epsilon, - ) - elif self.method == "sample_and_flip": - index = backend.exponential_mechanism_sample_and_flip( - utilities, - self.sensitivity, - self.epsilon, - ) - else: - raise ValueError() - + index = self.sampler(utilities) return self.output_range[index] @property From 3431e444c30e722d682b14d8647b3172d53e483c Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Mon, 30 Nov 2020 10:14:28 +1100 Subject: [PATCH 064/185] Changed method to specify method in ExponentialMechanism --- relm/mechanisms.py | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 6a924c3..a235907 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -146,26 +146,11 @@ def __init__( output_range, method="gumbel_trick", ): + super(ExponentialMechanism, self).__init__(epsilon) self.utility_function = utility_function self.sensitivity = sensitivity self.output_range = output_range self.method = method - if method == "weighted_index": - sampler = lambda utilities: backend.exponential_mechanism_weighted_index( - utilities, sensitivity, epsilon - ) - elif method == "gumbel_trick": - sampler = lambda utilities: backend.exponential_mechanism_gumbel_trick( - utilities, sensitivity, epsilon - ) - elif method == "sample_and_flip": - sampler = lambda utilities: backend.exponential_mechanism_sample_and_flip( - utilities, sensitivity, epsilon - ) - else: - raise ValueError("Sampling method '%s' not supported." % method) - self.sampler = sampler - super(ExponentialMechanism, self).__init__(epsilon) def release(self, values): """ @@ -183,7 +168,7 @@ def release(self, values): self._update_accountant() utilities = self.utility_function(values) - index = self.sampler(utilities) + index = self._sampler(utilities) return self.output_range[index] @property @@ -196,6 +181,30 @@ def privacy_consumed(self): else: return self.epsilon + @property + def method(self): + return self._method + + @method.setter + def method(self, value): + if value == "weighted_index": + sampler = lambda utilities: backend.exponential_mechanism_weighted_index( + utilities, self.sensitivity, self.epsilon + ) + elif value == "gumbel_trick": + sampler = lambda utilities: backend.exponential_mechanism_gumbel_trick( + utilities, self.sensitivity, self.epsilon + ) + elif value == "sample_and_flip": + sampler = lambda utilities: backend.exponential_mechanism_sample_and_flip( + utilities, self.sensitivity, self.epsilon + ) + else: + raise ValueError("Sampling method '%s' not supported." % method) + + self._method = value + self._sampler = sampler + class SparseGeneric(ReleaseMechanism): def __init__( From 28ab52c972f444dd4f08b0d37dbeb1fc48bb2685 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 30 Nov 2020 13:30:45 +1100 Subject: [PATCH 065/185] added exact computation for sample and flip exponential mechanisms --- src/mechanisms.rs | 3 +-- src/samplers.rs | 21 +++++++++++++++++++++ src/utils.rs | 7 +++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 103d863..a67fbfd 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -96,8 +96,7 @@ pub fn exponential_mechanism_sample_and_flip( let mut index: usize = 0; while !flag { index = samplers::uniform_integer(&n).try_into().unwrap(); - let p: f64 = normalized_log_weights[index].exp(); - flag = samplers::bernoulli(&p); + flag = samplers::log_bernoulli(normalized_log_weights[index]); } index.try_into().unwrap() } diff --git a/src/samplers.rs b/src/samplers.rs index 4e236c8..99b8a90 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -30,6 +30,27 @@ pub fn bernoulli(p: &f64) -> bool { dist.sample(&mut rand::thread_rng()) } + +pub fn log_bernoulli(log_p: f64) -> bool { + let mut rng = rand::thread_rng(); + let mut num_required_bits = 64; + + let bias = utils::bernoulli_bias(log_p, num_required_bits); + let mut rand_bits = Integer::from(rng.next_u64()); + + while Integer::from(&rand_bits - &bias).abs() <= 1 { + num_required_bits += 64; + // calculate a more precise bias + let bias = utils::bernoulli_bias(log_p, num_required_bits); + // sample the next 64 bits from the random uniform + rand_bits <<= 64; + rand_bits += Integer::from(rng.next_u64()); + } + + bias > rand_bits +} + + pub fn uniform(scale: f64) -> f64 { /// Returns a sample from the [0, scale) uniform distribution /// diff --git a/src/utils.rs b/src/utils.rs index 0493026..ac71e3d 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -61,3 +61,10 @@ pub fn exponential_bias(scale: f64, pow2: i32, required_bits: i32) -> Integer { let bias = (Float::with_val(num_bits, 1.0) + d.exp()).recip() << required_bits; bias.trunc().to_integer().unwrap() } + + +pub fn bernoulli_bias(scale: f64, required_bits: i32) -> Integer { + let num_bits = (required_bits + 10) as u32; + let bias = (Float::with_val(num_bits, scale)).exp() << required_bits; + bias.trunc().to_integer().unwrap() +} From ea687cc5154c5cd1e11c5d37331620c2f6ed6690 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Mon, 30 Nov 2020 17:27:07 +1100 Subject: [PATCH 066/185] Added an implementation of the PermuteAndFlipMechanism --- relm/mechanisms.py | 58 ++++++++++++++++++++++++++++++++++++++ src/lib.rs | 17 +++++++++++ src/mechanisms.rs | 61 ++++++++++++++++++++++++++++++++++------ src/utils.rs | 3 +- tests/test_mechanisms.py | 39 +++++++++++++++++++++++-- 5 files changed, 165 insertions(+), 13 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index a235907..cb7a55e 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -206,6 +206,64 @@ def method(self, value): self._sampler = sampler +class PermuteAndFlipMechanism(ReleaseMechanism): + """ + Insecure mplementation of the Permute-And-Flip Mechanism. This mechanism can be used + once after which its privacy budget will be exhausted and it can no longer be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + utility_function: the utility function. This should accpet an array of values + produced by the query function and return an 1D array of + utilities of the same size as output_range. + sensitivity: the sensitivity of the utility function. + output_range: an array of possible output values for the mechanism. + """ + + def __init__( + self, + epsilon, + utility_function, + sensitivity, + output_range, + ): + super(PermuteAndFlipMechanism, self).__init__(epsilon) + self.utility_function = utility_function + self.sensitivity = sensitivity + self.output_range = output_range + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + + Returns: + An element of output_range set of the mechanism. + """ + + self._check_valid() + self._is_valid = False + self._update_accountant() + + utilities = self.utility_function(values) + index = backend.permute_and_flip_mechanism( + utilities, self.sensitivity, self.epsilon + ) + return self.output_range[index] + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon + + class SparseGeneric(ReleaseMechanism): def __init__( self, diff --git a/src/lib.rs b/src/lib.rs index 768ef34..c4958f3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -116,5 +116,22 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { Ok(index) } + + #[pyfn(m, "permute_and_flip_mechanism")] + fn py_permute_and_flip_mechanism<'a>( + py: Python<'a>, + utilities: &'a PyArray1, + sensitivity: f64, + epsilon: f64, + ) -> PyResult { + let utilities = utilities.to_vec().unwrap(); + let index: u64 = mechanisms::permute_and_flip_mechanism( + utilities, + sensitivity, + epsilon, + ); + Ok(index) + } + Ok(()) } diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 103d863..5ad53bd 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -1,4 +1,8 @@ +use rand::{thread_rng, seq}; use rand::distributions::WeightedIndex; +use rand::seq::SliceRandom; +use rand::prelude::IteratorRandom; + use std::convert::TryInto; use rayon::prelude::*; @@ -84,20 +88,61 @@ pub fn exponential_mechanism_sample_and_flip( epsilon: f64, ) -> u64 { + let scale: f64 = epsilon / (2.0f64 * sensitivity); let argmax: usize = utils::argmax(&utilities); let max_utility: f64 = utilities[argmax]; - let mut normalized_log_weights: Vec = utilities.par_iter() - .map(|u| epsilon * (u - max_utility) / (2.0f64 * sensitivity)) - .collect(); - let n: u64 = utilities.len().try_into().unwrap(); let mut flag: bool = false; - let mut index: usize = 0; + let mut current: usize = 0; while !flag { - index = samplers::uniform_integer(&n).try_into().unwrap(); - let p: f64 = normalized_log_weights[index].exp(); + current = samplers::uniform_integer(&n).try_into().unwrap(); + let p: f64 = (scale * (utilities[current] - max_utility)).exp(); flag = samplers::bernoulli(&p); } - index.try_into().unwrap() + current.try_into().unwrap() +} + + +pub fn permute_and_flip_mechanism( + utilities: Vec, + sensitivity: f64, + epsilon: f64, +) -> u64 { + + let scale: f64 = epsilon / (2.0f64 * sensitivity); + let argmax: usize = utils::argmax(&utilities); + let max_utility: f64 = utilities[argmax]; + + let n: usize = utilities.len(); + let mut indices: Vec = (0..n).collect(); + + let mut flag: bool = false; + let mut idx: usize = 0; + let mut current: usize = 0; + + // indices.shuffle(&mut thread_rng()); + // while !flag { + // current = indices[idx]; + // let p: f64 = (scale * (utilities[current]-max_utility)).exp(); + // flag = samplers::bernoulli(&p); + // idx += 1; + // } + + let mut rng = thread_rng(); + while !flag { + let temp = (idx..n).choose(&mut rng).unwrap(); + //let foo = indices[temp]; + current = indices[temp]; + indices[temp] = indices[idx]; + // indices[idx] = foo; + // current = indices[idx]; + // current = foo; + let p: f64 = (scale * (utilities[current]-max_utility)).exp(); + flag = samplers::bernoulli(&p); + idx += 1; + } + + current.try_into().unwrap() + } diff --git a/src/utils.rs b/src/utils.rs index 0493026..036f835 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,5 +1,4 @@ use rug::{float::Round, Float, Integer}; -use std::cmp::Ordering::Equal; pub fn clamp(x: f64, bound: f64) -> f64 { if x < -bound { @@ -19,7 +18,7 @@ pub fn ln_rn(x: f64) -> f64 { } -pub fn argmax(slice: &Vec) -> usize { +pub fn argmax(slice: &Vec) -> usize { let mut max_val = slice[0]; let mut max_idx: usize = 0; let mut idx = 0; diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 5092ea9..2666c8f 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -5,6 +5,7 @@ LaplaceMechanism, GeometricMechanism, ExponentialMechanism, + PermuteAndFlipMechanism, SnappingMechanism, AboveThreshold, SparseIndicator, @@ -50,7 +51,7 @@ def test_GeometricMechanism(benchmark): def test_ExponentialMechanismWeightedIndex(benchmark): - n = 6 + n = 8 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) mechanism = ExponentialMechanism( @@ -84,7 +85,7 @@ def test_ExponentialMechanismWeightedIndex(benchmark): def test_ExponentialMechanismGumbelTrick(benchmark): - n = 6 + n = 8 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) mechanism = ExponentialMechanism( @@ -118,7 +119,7 @@ def test_ExponentialMechanismGumbelTrick(benchmark): def test_ExponentialMechanismSampleAndFlip(benchmark): - n = 6 # This gets *really* slow if n in mcuh bigger than 6. + n = 8 # This gets *really* slow if n in mcuh bigger than 6. output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) utility_function = lambda x: -np.abs(output_range - np.mean(x)) mechanism = ExponentialMechanism( @@ -151,6 +152,38 @@ def test_ExponentialMechanismSampleAndFlip(benchmark): assert pval > 0.001 +def test_PermuteAndFlipMechanism(benchmark): + n = 8 # This gets *really* slow if n in mcuh bigger than 6. + output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) + utility_function = lambda x: -np.abs(output_range - np.mean(x)) + mechanism = PermuteAndFlipMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + ) + _test_mechanism(benchmark, mechanism) + # Goodness of fit test + n = 6 + output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) + utility_function = lambda x: -np.abs(output_range - np.mean(x)) + data = np.zeros(1) + TRIALS = 2 ** 12 + values = np.empty(TRIALS) + for i in range(TRIALS): + mechanism = PermuteAndFlipMechanism( + epsilon=1.0, + utility_function=utility_function, + sensitivity=1.0, + output_range=output_range, + ) + values[i] = mechanism.release(data) + + z = scipy.stats.laplace.rvs(scale=2.0, size=TRIALS) + score, pval = scipy.stats.ks_2samp(values, z) + assert pval > 0.001 + + def test_above_threshold(benchmark): mechanism = AboveThreshold(epsilon=1, sensitivity=1.0, threshold=0.1) _test_mechanism(benchmark, mechanism) From 777d69565f178a3a88e1ca55bc54ea069c774034 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 1 Dec 2020 13:11:04 +1100 Subject: [PATCH 067/185] Changed implementation to make run time independent of the noise. --- src/mechanisms.rs | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 5ad53bd..53c0071 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -111,38 +111,41 @@ pub fn permute_and_flip_mechanism( ) -> u64 { let scale: f64 = epsilon / (2.0f64 * sensitivity); + let argmax: usize = utils::argmax(&utilities); let max_utility: f64 = utilities[argmax]; let n: usize = utilities.len(); let mut indices: Vec = (0..n).collect(); - let mut flag: bool = false; - let mut idx: usize = 0; - let mut current: usize = 0; + indices.shuffle(&mut thread_rng()); + + let bits: Vec = utilities.par_iter() + .map(|u| (scale * (u - max_utility)).exp()) + .map(|p| samplers::bernoulli(&p)) + .collect(); + + let mut shuffled_bits: Vec = vec![false; n]; + for i in 0..n { + shuffled_bits[i] = bits[indices[i]]; + } + + let idx: usize = utils::argmax(&shuffled_bits); + indices[idx].try_into().unwrap() - // indices.shuffle(&mut thread_rng()); + // let mut flag: bool = false; + // let mut idx: usize = 0; + // let mut current: usize = 0; + // + // let mut rng = thread_rng(); // while !flag { + // let temp = (idx..n).choose(&mut rng).unwrap(); + // indices.swap(idx, temp); // current = indices[idx]; // let p: f64 = (scale * (utilities[current]-max_utility)).exp(); // flag = samplers::bernoulli(&p); // idx += 1; // } - - let mut rng = thread_rng(); - while !flag { - let temp = (idx..n).choose(&mut rng).unwrap(); - //let foo = indices[temp]; - current = indices[temp]; - indices[temp] = indices[idx]; - // indices[idx] = foo; - // current = indices[idx]; - // current = foo; - let p: f64 = (scale * (utilities[current]-max_utility)).exp(); - flag = samplers::bernoulli(&p); - idx += 1; - } - - current.try_into().unwrap() - + // + // current.try_into().unwrap() } From 8447e4c8828016d4031f5dcc2c61de9d76d8492f Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 1 Dec 2020 13:27:49 +1100 Subject: [PATCH 068/185] Simple reformatting --- src/mechanisms.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 53c0071..314a3b7 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -1,4 +1,4 @@ -use rand::{thread_rng, seq}; +use rand::{thread_rng, seq, Rng}; use rand::distributions::WeightedIndex; use rand::seq::SliceRandom; use rand::prelude::IteratorRandom; @@ -132,14 +132,14 @@ pub fn permute_and_flip_mechanism( let idx: usize = utils::argmax(&shuffled_bits); indices[idx].try_into().unwrap() - + // // let mut flag: bool = false; // let mut idx: usize = 0; // let mut current: usize = 0; // // let mut rng = thread_rng(); // while !flag { - // let temp = (idx..n).choose(&mut rng).unwrap(); + // let temp = rng.gen_range(idx, n); // indices.swap(idx, temp); // current = indices[idx]; // let p: f64 = (scale * (utilities[current]-max_utility)).exp(); From c3d0cec626b4f5db645c8173ebdf8f5572e3eab9 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 1 Dec 2020 13:28:30 +1100 Subject: [PATCH 069/185] Removed old commented out code --- src/mechanisms.rs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 314a3b7..4737cad 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -132,20 +132,4 @@ pub fn permute_and_flip_mechanism( let idx: usize = utils::argmax(&shuffled_bits); indices[idx].try_into().unwrap() - // - // let mut flag: bool = false; - // let mut idx: usize = 0; - // let mut current: usize = 0; - // - // let mut rng = thread_rng(); - // while !flag { - // let temp = rng.gen_range(idx, n); - // indices.swap(idx, temp); - // current = indices[idx]; - // let p: f64 = (scale * (utilities[current]-max_utility)).exp(); - // flag = samplers::bernoulli(&p); - // idx += 1; - // } - // - // current.try_into().unwrap() } From a994b57ae59be32fe4700496c1223b86a7a6a057 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 1 Dec 2020 14:15:15 +1100 Subject: [PATCH 070/185] variable name change --- src/mechanisms.rs | 2 +- src/samplers.rs | 7 +++---- src/utils.rs | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index a67fbfd..d2b9f4c 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -96,7 +96,7 @@ pub fn exponential_mechanism_sample_and_flip( let mut index: usize = 0; while !flag { index = samplers::uniform_integer(&n).try_into().unwrap(); - flag = samplers::log_bernoulli(normalized_log_weights[index]); + flag = samplers::bernoulli_log_p(normalized_log_weights[index]); } index.try_into().unwrap() } diff --git a/src/samplers.rs b/src/samplers.rs index 99b8a90..fdb344f 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -31,17 +31,17 @@ pub fn bernoulli(p: &f64) -> bool { } -pub fn log_bernoulli(log_p: f64) -> bool { +pub fn bernoulli_log_p(log_p: f64) -> bool { let mut rng = rand::thread_rng(); let mut num_required_bits = 64; - let bias = utils::bernoulli_bias(log_p, num_required_bits); + let bias = utils::exp_rn(log_p, num_required_bits); let mut rand_bits = Integer::from(rng.next_u64()); while Integer::from(&rand_bits - &bias).abs() <= 1 { num_required_bits += 64; // calculate a more precise bias - let bias = utils::bernoulli_bias(log_p, num_required_bits); + let bias = utils::exp_rn(log_p, num_required_bits); // sample the next 64 bits from the random uniform rand_bits <<= 64; rand_bits += Integer::from(rng.next_u64()); @@ -168,7 +168,6 @@ fn sample_exact_exponential_bit(scale: f64, pow2: i32, rand_bits: u64) -> i64 { rand_bits <<= 64; rand_bits += Integer::from(rng.next_u64()); } - if bias > rand_bits { return 1; } else { diff --git a/src/utils.rs b/src/utils.rs index ac71e3d..79fc7b6 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -63,7 +63,7 @@ pub fn exponential_bias(scale: f64, pow2: i32, required_bits: i32) -> Integer { } -pub fn bernoulli_bias(scale: f64, required_bits: i32) -> Integer { +pub fn exp_rn(scale: f64, required_bits: i32) -> Integer { let num_bits = (required_bits + 10) as u32; let bias = (Float::with_val(num_bits, scale)).exp() << required_bits; bias.trunc().to_integer().unwrap() From 1852147353cd91ce9d94f12519fe636c6d9f5e5f Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 1 Dec 2020 14:44:05 +1100 Subject: [PATCH 071/185] Trying out a one-pass version of PermuteAndFlip --- src/mechanisms.rs | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 4737cad..d8f18e2 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -118,18 +118,37 @@ pub fn permute_and_flip_mechanism( let n: usize = utilities.len(); let mut indices: Vec = (0..n).collect(); - indices.shuffle(&mut thread_rng()); + // indices.shuffle(&mut thread_rng()); + // + // let bits: Vec = utilities.par_iter() + // .map(|u| (scale * (u - max_utility)).exp()) + // .map(|p| samplers::bernoulli(&p)) + // .collect(); + // + // let mut shuffled_bits: Vec = vec![false; n]; + // for i in 0..n { + // shuffled_bits[i] = bits[indices[i]]; + // } + // + // let idx: usize = utils::argmax(&shuffled_bits); + // indices[idx].try_into().unwrap() + + let mut rng = thread_rng(); - let bits: Vec = utilities.par_iter() - .map(|u| (scale * (u - max_utility)).exp()) - .map(|p| samplers::bernoulli(&p)) - .collect(); + let mut flag: bool = false; + let mut current: usize = 0; - let mut shuffled_bits: Vec = vec![false; n]; - for i in 0..n { - shuffled_bits[i] = bits[indices[i]]; + let mut choice = 0; + flag = false; + for idx in 0..n { + let temp = rng.gen_range(idx, n); + indices.swap(temp, idx); + current = indices[idx]; + let p: f64 = (scale * (utilities[current]-max_utility)).exp(); + if samplers::bernoulli(&p) & !flag { + flag = true; + choice = current; + } } - - let idx: usize = utils::argmax(&shuffled_bits); - indices[idx].try_into().unwrap() + choice.try_into().unwrap() } From b0c82264831372d7060b5392262a97f0e513199d Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 1 Dec 2020 15:03:31 +1100 Subject: [PATCH 072/185] Restoring old version of PermuteAndFlip --- src/mechanisms.rs | 41 +++++++++++------------------------------ 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index d8f18e2..4737cad 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -118,37 +118,18 @@ pub fn permute_and_flip_mechanism( let n: usize = utilities.len(); let mut indices: Vec = (0..n).collect(); - // indices.shuffle(&mut thread_rng()); - // - // let bits: Vec = utilities.par_iter() - // .map(|u| (scale * (u - max_utility)).exp()) - // .map(|p| samplers::bernoulli(&p)) - // .collect(); - // - // let mut shuffled_bits: Vec = vec![false; n]; - // for i in 0..n { - // shuffled_bits[i] = bits[indices[i]]; - // } - // - // let idx: usize = utils::argmax(&shuffled_bits); - // indices[idx].try_into().unwrap() - - let mut rng = thread_rng(); + indices.shuffle(&mut thread_rng()); - let mut flag: bool = false; - let mut current: usize = 0; + let bits: Vec = utilities.par_iter() + .map(|u| (scale * (u - max_utility)).exp()) + .map(|p| samplers::bernoulli(&p)) + .collect(); - let mut choice = 0; - flag = false; - for idx in 0..n { - let temp = rng.gen_range(idx, n); - indices.swap(temp, idx); - current = indices[idx]; - let p: f64 = (scale * (utilities[current]-max_utility)).exp(); - if samplers::bernoulli(&p) & !flag { - flag = true; - choice = current; - } + let mut shuffled_bits: Vec = vec![false; n]; + for i in 0..n { + shuffled_bits[i] = bits[indices[i]]; } - choice.try_into().unwrap() + + let idx: usize = utils::argmax(&shuffled_bits); + indices[idx].try_into().unwrap() } From 0e17eca3069827514676d09f63266aecbb9d526a Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 1 Dec 2020 15:44:03 +1100 Subject: [PATCH 073/185] fix --- src/mechanisms.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 8d0c10e..7cd2086 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -97,7 +97,8 @@ pub fn exponential_mechanism_sample_and_flip( let mut current: usize = 0; while !flag { current = samplers::uniform_integer(&n).try_into().unwrap(); - flag = samplers::bernoulli_log_p(normalized_log_weights[index]); + let log_p = (scale * (utilities[current] - max_utility)); + flag = samplers::bernoulli_log_p(log_p); } current.try_into().unwrap() } From 48162f951e823a236c6790bd9f7019be63cabb69 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 2 Dec 2020 10:22:02 +1100 Subject: [PATCH 074/185] Reverted permute_and_flip to me non-constant time. --- src/mechanisms.rs | 32 ++++++++++++++++---------------- src/samplers.rs | 13 ++++--------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 7cd2086..f24dd64 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -1,7 +1,5 @@ -use rand::{thread_rng, seq, Rng}; +use rand::{thread_rng, Rng}; use rand::distributions::WeightedIndex; -use rand::seq::SliceRandom; -use rand::prelude::IteratorRandom; use std::convert::TryInto; @@ -96,8 +94,8 @@ pub fn exponential_mechanism_sample_and_flip( let mut flag: bool = false; let mut current: usize = 0; while !flag { - current = samplers::uniform_integer(&n).try_into().unwrap(); - let log_p = (scale * (utilities[current] - max_utility)); + current = samplers::uniform_integer(n).try_into().unwrap(); + let log_p = scale * (utilities[current] - max_utility); flag = samplers::bernoulli_log_p(log_p); } current.try_into().unwrap() @@ -118,18 +116,20 @@ pub fn permute_and_flip_mechanism( let n: usize = utilities.len(); let mut indices: Vec = (0..n).collect(); - indices.shuffle(&mut thread_rng()); - - let bits: Vec = utilities.par_iter() - .map(|u| (scale * (u - max_utility)).exp()) - .map(|p| samplers::bernoulli(&p)) + let mut normalized_log_weights: Vec = utilities.par_iter() + .map(|u| (scale * (u - max_utility))) .collect(); - let mut shuffled_bits: Vec = vec![false; n]; - for i in 0..n { - shuffled_bits[i] = bits[indices[i]]; + let mut rng = thread_rng(); + let mut flag: bool = false; + let mut idx: usize = 0; + let mut current: usize = 0; + while !flag { + let temp = rng.gen_range(idx, n); + indices.swap(idx, temp); + current = indices[idx]; + flag = samplers::bernoulli_log_p(normalized_log_weights[current]); + idx += 1; } - - let idx: usize = utils::argmax(&shuffled_bits); - indices[idx].try_into().unwrap() + current.try_into().unwrap() } diff --git a/src/samplers.rs b/src/samplers.rs index fdb344f..67be5ac 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -6,11 +6,6 @@ use rug::Integer; use crate::utils; -// pub fn discrete(choices: &Vec, dist: &WeightedIndex) -> u64 { -// let mut rng = rand::thread_rng(); -// choices[dist.sample(&mut rng)] -//} - pub fn discrete(dist: &WeightedIndex) -> u64 { let mut rng = rand::thread_rng(); dist.sample(&mut rng).try_into().unwrap() @@ -18,15 +13,15 @@ pub fn discrete(dist: &WeightedIndex) -> u64 { -pub fn uniform_integer(n: &u64) -> u64 { +pub fn uniform_integer(n: u64) -> u64 { let mut rng = rand::thread_rng(); - let result: u64 = rng.gen_range(0, *n); + let result: u64 = rng.gen_range(0, n); result } -pub fn bernoulli(p: &f64) -> bool { +pub fn bernoulli(p: f64) -> bool { let mut rng = rand::thread_rng(); - let dist = Bernoulli::new(*p).unwrap(); + let dist = Bernoulli::new(p).unwrap(); dist.sample(&mut rand::thread_rng()) } From ab811c37ab104cb577a598a32f2dfd373db2cf4e Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 2 Dec 2020 10:34:33 +1100 Subject: [PATCH 075/185] Some simple refactoring to make things easier to read. --- src/mechanisms.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index f24dd64..f2cc273 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -113,13 +113,13 @@ pub fn permute_and_flip_mechanism( let argmax: usize = utils::argmax(&utilities); let max_utility: f64 = utilities[argmax]; - let n: usize = utilities.len(); - let mut indices: Vec = (0..n).collect(); - let mut normalized_log_weights: Vec = utilities.par_iter() .map(|u| (scale * (u - max_utility))) .collect(); + let n: usize = utilities.len(); + let mut indices: Vec = (0..n).collect(); + let mut rng = thread_rng(); let mut flag: bool = false; let mut idx: usize = 0; From 37e1c8517aca7f2cf49f947a79ac9b6f3975f08f Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 2 Dec 2020 13:07:13 +1100 Subject: [PATCH 076/185] Implemented the "effective epsilon" trick. Some of the literature describes all release mechanisms as if the sensitivity of the underlying query is 1.0. They then state that these mechanisms privide epsilon * sensitivity - DP. This has the advantage of simplifiying the delicate and expensive arbitrary- precision floating-point computations in the rust code. As a part of this, I also modified the class strucutre a little bit. Because the GeometricMechanism operates on integer-valued data and adds integer-valued noise, we don't need to adjust the sensitivity to account for floating-point to fixed-point conversion errors like we do for the LaplaceMechanism. As such, it made sense to change the parent class of GemetricMechanism to the base ReleaseMechanism class instead of LaplaceMechanism. This simplified the constructor for GeometricMechanism now that we're doing the effective epsilon trick. --- relm/mechanisms.py | 71 ++++++++++++++++++++++++++++++---------------- src/lib.rs | 18 +++--------- src/mechanisms.rs | 25 +++++++--------- 3 files changed, 62 insertions(+), 52 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index cb7a55e..e704f38 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -60,9 +60,12 @@ class LaplaceMechanism(ReleaseMechanism): """ def __init__(self, epsilon, sensitivity, precision): + super(LaplaceMechanism, self).__init__(epsilon) self.sensitivity = sensitivity self.precision = precision - super(LaplaceMechanism, self).__init__(epsilon) + self.effective_epsilon = self.epsilon / ( + self.sensitivity + 2.0 ** -self.precision + ) def release(self, values): """ @@ -78,7 +81,7 @@ def release(self, values): self._check_valid() self._is_valid = False self._update_accountant() - args = (values, self.sensitivity, self.epsilon, self.precision) + args = (values, self.effective_epsilon, self.precision) return backend.laplace_mechanism(*args) @property @@ -92,7 +95,7 @@ def privacy_consumed(self): return self.epsilon -class GeometricMechanism(LaplaceMechanism): +class GeometricMechanism(ReleaseMechanism): """ Secure implementation of the Geometric mechanism. This mechanism can be used once after which its privacy budget will be exhausted and it can no longer be used. @@ -103,7 +106,9 @@ class GeometricMechanism(LaplaceMechanism): """ def __init__(self, epsilon, sensitivity): - super(GeometricMechanism, self).__init__(epsilon, sensitivity, precision=0) + super(GeometricMechanism, self).__init__(epsilon) + self.sensitivity = sensitivity + self.effective_epsilon = self.epsilon / self.sensitivity def release(self, values): """ @@ -118,7 +123,17 @@ def release(self, values): self._check_valid() self._is_valid = False self._update_accountant() - return backend.geometric_mechanism(values, self.sensitivity, self.epsilon) + return backend.geometric_mechanism(values, self.effective_epsilon) + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon class ExponentialMechanism(ReleaseMechanism): @@ -152,6 +167,8 @@ def __init__( self.output_range = output_range self.method = method + self.effective_epsilon = self.epsilon / (2.0 * sensitivity) + def release(self, values): """ Releases a differential private query response. @@ -189,15 +206,15 @@ def method(self): def method(self, value): if value == "weighted_index": sampler = lambda utilities: backend.exponential_mechanism_weighted_index( - utilities, self.sensitivity, self.epsilon + utilities, self.effective_epsilon ) elif value == "gumbel_trick": sampler = lambda utilities: backend.exponential_mechanism_gumbel_trick( - utilities, self.sensitivity, self.epsilon + utilities, self.effective_epsilon ) elif value == "sample_and_flip": sampler = lambda utilities: backend.exponential_mechanism_sample_and_flip( - utilities, self.sensitivity, self.epsilon + utilities, self.effective_epsilon ) else: raise ValueError("Sampling method '%s' not supported." % method) @@ -232,6 +249,8 @@ def __init__( self.sensitivity = sensitivity self.output_range = output_range + self.effective_epsilon = self.epsilon / (2.0 * sensitivity) + def release(self, values): """ Releases a differential private query response. @@ -248,9 +267,7 @@ def release(self, values): self._update_accountant() utilities = self.utility_function(values) - index = backend.permute_and_flip_mechanism( - utilities, self.sensitivity, self.epsilon - ) + index = backend.permute_and_flip_mechanism(utilities, self.effective_epsilon) return self.output_range[index] @property @@ -277,7 +294,8 @@ def __init__( precision=35, ): epsilon = epsilon1 + epsilon2 + epsilon3 - self.epsilon = epsilon + super(SparseGeneric, self).__init__(epsilon) + self.epsilon1 = epsilon1 self.epsilon2 = epsilon2 self.epsilon3 = epsilon3 @@ -288,18 +306,19 @@ def __init__( self.precision = precision self.current_count = 0 - temp = np.array([threshold], dtype=np.float64) - args = (temp, sensitivity, epsilon1, precision) + self.effective_epsilon1 = self.epsilon1 / self.sensitivity + self.effective_epsilon2 = self.epsilon2 / (self.cutoff * self.sensitivity) + if not self.monotonic: + self.effective_epsilon2 /= 2.0 + self.effective_epsilon3 = self.epsilon3 / (self.cutoff * self.sensitivity) + + temp = np.array([self.threshold], dtype=np.float64) + args = (temp, self.effective_epsilon1, self.precision) self.perturbed_threshold = backend.laplace_mechanism(*args)[0] - super(SparseGeneric, self).__init__(epsilon) def all_above_threshold(self, values): - if self.monotonic: - b = (self.sensitivity * self.cutoff) / self.epsilon2 - else: - b = (2.0 * self.sensitivity * self.cutoff) / self.epsilon2 return backend.all_above_threshold( - values, b, self.perturbed_threshold, self.precision + values, self.effective_epsilon2, self.perturbed_threshold, self.precision ) def release(self, values): @@ -326,8 +345,11 @@ def release(self, values): if self.epsilon3 > 0: sliced_values = values[indices] - temp = self.sensitivity * self.cutoff - args = (sliced_values, temp, self.epsilon3, self.precision) + args = ( + sliced_values, + self.effective_epsilon3, + self.precision, + ) release_values = backend.laplace_mechanism(*args) return indices, release_values else: @@ -565,9 +587,10 @@ class ReportNoisyMax(ReleaseMechanism): """ def __init__(self, epsilon, precision): + super(ReportNoisyMax, self).__init__(epsilon) self.sensitivity = 1.0 self.precision = precision - super(ReportNoisyMax, self).__init__(epsilon) + self.effective_epsilon = self.epsilon / self.sensitivity def release(self, values): """ @@ -582,7 +605,7 @@ def release(self, values): self._check_valid() self._is_valid = False self._update_accountant() - args = (values, self.sensitivity, self.epsilon, self.precision) + args = (values, self.effective_epsilon, self.precision) perturbed_values = backend.laplace_mechanism(*args) valmax = np.max(perturbed_values) argmax = secrets.choice(np.where(perturbed_values == valmax)[0]) diff --git a/src/lib.rs b/src/lib.rs index c4958f3..0a848e8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,14 +18,14 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { fn py_all_above_threshold<'a>( py: Python<'a>, data: &'a PyArray1, - scale: f64, + epsilon: f64, threshold: f64, precision: i32, ) -> &'a PyArray1 { /// Simple python wrapper of the exponential function. Converts /// the rust vector into a numpy array let data = data.to_vec().unwrap(); - mechanisms::all_above_threshold(data, scale, threshold, precision).to_pyarray(py) + mechanisms::all_above_threshold(data, epsilon, threshold, precision).to_pyarray(py) } #[pyfn(m, "snapping")] @@ -46,23 +46,21 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { fn py_laplace_mechanism<'a>( py: Python<'a>, data: &'a PyArray1, - sensitivity: f64, epsilon: f64, precision: i32, ) -> &'a PyArray1 { let data = data.to_vec().unwrap(); - mechanisms::laplace_mechanism(data, sensitivity, epsilon, precision).to_pyarray(py) + mechanisms::laplace_mechanism(data, epsilon, precision).to_pyarray(py) } #[pyfn(m, "geometric_mechanism")] fn py_geometric_mechanism<'a>( py: Python<'a>, data: &'a PyArray1, - sensitivity: f64, epsilon: f64, ) -> &'a PyArray1 { let data = data.to_vec().unwrap(); - mechanisms::geometric_mechanism(data, sensitivity, epsilon).to_pyarray(py) + mechanisms::geometric_mechanism(data, epsilon).to_pyarray(py) } @@ -70,13 +68,11 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { fn py_exponential_mechanism_weighted_index<'a>( py: Python<'a>, utilities: &'a PyArray1, - sensitivity: f64, epsilon: f64, ) -> PyResult { let utilities = utilities.to_vec().unwrap(); let index: u64 = mechanisms::exponential_mechanism_weighted_index( utilities, - sensitivity, epsilon, ); Ok(index) @@ -87,13 +83,11 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { fn py_exponential_mechanism_gumbel_trick<'a>( py: Python<'a>, utilities: &'a PyArray1, - sensitivity: f64, epsilon: f64, ) -> PyResult { let utilities = utilities.to_vec().unwrap(); let index: u64 = mechanisms::exponential_mechanism_gumbel_trick( utilities, - sensitivity, epsilon, ); Ok(index) @@ -104,13 +98,11 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { fn py_exponential_mechanism_sample_and_flip<'a>( py: Python<'a>, utilities: &'a PyArray1, - sensitivity: f64, epsilon: f64, ) -> PyResult { let utilities = utilities.to_vec().unwrap(); let index: u64 = mechanisms::exponential_mechanism_sample_and_flip( utilities, - sensitivity, epsilon, ); Ok(index) @@ -121,13 +113,11 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { fn py_permute_and_flip_mechanism<'a>( py: Python<'a>, utilities: &'a PyArray1, - sensitivity: f64, epsilon: f64, ) -> PyResult { let utilities = utilities.to_vec().unwrap(); let index: u64 = mechanisms::permute_and_flip_mechanism( utilities, - sensitivity, epsilon, ); Ok(index) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index f2cc273..af755fa 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -8,7 +8,8 @@ use crate::samplers; use crate::utils; -pub fn all_above_threshold(data: Vec, scale: f64, threshold: f64, precision: i32) -> Vec{ +pub fn all_above_threshold(data: Vec, epsilon: f64, threshold: f64, precision: i32) -> Vec{ + let scale = 1.0 / epsilon; let biases: Vec = utils::fp_laplace_bit_biases(scale, precision); data.par_iter() .map(|&p| (p * 2.0f64.powi(precision)).round()) @@ -29,8 +30,8 @@ pub fn snapping(data: Vec, bound: f64, lambda: f64, quanta: f64) -> Vec, sensitivity: f64, epsilon: f64, precision: i32) -> Vec { - let scale = (sensitivity + 2.0f64.powi(-precision)) / epsilon; +pub fn laplace_mechanism(data: Vec, epsilon: f64, precision: i32) -> Vec { + let scale = 1.0 / epsilon; let biases: Vec = utils::fp_laplace_bit_biases(scale, precision); data.par_iter() .map(|&x| (x * 2.0f64.powi(precision)).round()) @@ -40,8 +41,8 @@ pub fn laplace_mechanism(data: Vec, sensitivity: f64, epsilon: f64, precisi } -pub fn geometric_mechanism(data: Vec, sensitivity: f64, epsilon: f64) -> Vec { - let scale = sensitivity / epsilon; +pub fn geometric_mechanism(data: Vec, epsilon: f64) -> Vec { + let scale = 1.0 / epsilon; let biases: Vec = utils::fp_laplace_bit_biases(scale, 0); data.par_iter() .map(|&x| x + samplers::fixed_point_laplace(&biases, scale, 0)) @@ -51,12 +52,11 @@ pub fn geometric_mechanism(data: Vec, sensitivity: f64, epsilon: f64) -> Ve pub fn exponential_mechanism_weighted_index( utilities: Vec, - sensitivity: f64, epsilon: f64, ) -> u64 { let weights: Vec = utilities.par_iter() - .map(|u| epsilon * u / (2.0f64 * sensitivity)) + .map(|u| epsilon * u) .map(|u| u.exp()) .collect(); let dist = WeightedIndex::new(weights).unwrap(); @@ -66,12 +66,11 @@ pub fn exponential_mechanism_weighted_index( pub fn exponential_mechanism_gumbel_trick( utilities: Vec, - sensitivity: f64, epsilon: f64, ) -> u64 { let log_weights: Vec = utilities.par_iter() - .map(|u| epsilon * u / (2.0f64 * sensitivity)) + .map(|u| epsilon * u) .collect(); let noisy_log_weights: Vec = log_weights.par_iter() .map(|w| w + samplers::gumbel(1.0f64)) @@ -82,11 +81,10 @@ pub fn exponential_mechanism_gumbel_trick( pub fn exponential_mechanism_sample_and_flip( utilities: Vec, - sensitivity: f64, epsilon: f64, ) -> u64 { - let scale: f64 = epsilon / (2.0f64 * sensitivity); + let scale: f64 = epsilon; let argmax: usize = utils::argmax(&utilities); let max_utility: f64 = utilities[argmax]; @@ -104,11 +102,10 @@ pub fn exponential_mechanism_sample_and_flip( pub fn permute_and_flip_mechanism( utilities: Vec, - sensitivity: f64, epsilon: f64, ) -> u64 { - let scale: f64 = epsilon / (2.0f64 * sensitivity); + let scale: f64 = epsilon; let argmax: usize = utils::argmax(&utilities); let max_utility: f64 = utilities[argmax]; @@ -119,7 +116,7 @@ pub fn permute_and_flip_mechanism( let n: usize = utilities.len(); let mut indices: Vec = (0..n).collect(); - + let mut rng = thread_rng(); let mut flag: bool = false; let mut idx: usize = 0; From 827cd621e5b1534d3cc92e4519e018718387e094 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 2 Dec 2020 16:35:46 +1100 Subject: [PATCH 077/185] implementation of private mutliplicative weights --- relm/mechanisms.py | 61 ++++++++++++++++++++++++++++++++++++++++ tests/test_mechanisms.py | 17 +++++++++++ 2 files changed, 78 insertions(+) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index cb7a55e..29d4f3d 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -597,3 +597,64 @@ def privacy_consumed(self): return 0 else: return self.epsilon + + +class MultiplicativeWeights(ReleaseMechanism): + """ + Secure implementation of the private Multiplicative Weights mechanism. + This mechanism can be used to answer multiple linear queries. + + Args: + epsilon: the privacy parameter to use + cutoff: the number of queries that access the private data + threshold: the error tolerable + learning_rate: the learning rate of the multiplicative weights algorithm + data: a 1D numpy array of the underlying database + """ + def __init__(self, epsilon, cutoff, threshold, learning_rate, data): + super(MultiplicativeWeights, self).__init__(epsilon) + self.data = data + self.learning_rate = learning_rate + self.sparse_numeric = SparseNumeric(epsilon, sensitivity=1, threshold=threshold, cutoff=cutoff) + self.data_est = np.ones(len(data)) / len(data) + + @property + def privacy_consumed(self): + return self.sparse_numeric.privacy_consumed + + def update_weights(self, est_answer, noisy_answer, query): + if noisy_answer < est_answer: + r = query + else: + r = 1 - query + + self.data_est *= np.exp(-r * self.learning_rate) + self.data_est /= self.data_est.sum() + + def release(self, queries): + """ + Returns private answers to the queries. + + Args: + queries: a list of queries as 1D 1/0 indicator numpy arrays + Returns: + a numpy array of the private query responses + """ + + results = [] + l1_norm = self.data.sum() + for query in queries: + true_answer = (query * self.data).sum() + # this assumes that the l1 norm of the database is public + est_answer = (query * self.data_est).sum() * l1_norm + error = true_answer - est_answer + errors = np.array([error, -error]) + + indices, release_values = self.sparse_numeric.release(errors) + if len(indices) == 0: + results.append(est_answer) + else: + noisy_answer = est_answer + (1 - 2 * indices[0]) * release_values[0] + results.append(noisy_answer) + + return np.array(results) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 2666c8f..627b324 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -11,6 +11,7 @@ SparseIndicator, SparseNumeric, ReportNoisyMax, + MultiplicativeWeights, ) @@ -220,3 +221,19 @@ def test_SnappingMechanism(benchmark): def test_ReportNoisyMax(benchmark): mechanism = ReportNoisyMax(epsilon=0.1, precision=35) _test_mechanism(benchmark, mechanism) + + +def test_MultiplicativeWeights(): + data = np.random.randint(0, 10, 1000) + query = np.random.randint(0, 1, 1000) + + mechanism = MultiplicativeWeights(50, 100, 0, 0.1, data) + with pytest.raises(RuntimeError): + for _ in range(200): + _ = mechanism.release([query]) + + assert mechanism.privacy_consumed == 50 + + mechanism = MultiplicativeWeights(50, 100, 10, 0.1, data) + for _ in range(200): + _ = mechanism.release([query]) \ No newline at end of file From 86b59bf16c6e24ea3369c22a9975c0b9da14e104 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 2 Dec 2020 16:50:29 +1100 Subject: [PATCH 078/185] better test --- tests/test_mechanisms.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 627b324..ddbb2c1 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -225,15 +225,20 @@ def test_ReportNoisyMax(benchmark): def test_MultiplicativeWeights(): data = np.random.randint(0, 10, 1000) - query = np.random.randint(0, 1, 1000) + query = np.random.randint(0, 2, 1000) + queries = [query] * 1000 - mechanism = MultiplicativeWeights(50, 100, 0, 0.1, data) + # test privacy consumption + mechanism = MultiplicativeWeights(50, 25, 0, 0.1, data) with pytest.raises(RuntimeError): - for _ in range(200): - _ = mechanism.release([query]) + results = mechanism.release(queries) assert mechanism.privacy_consumed == 50 - mechanism = MultiplicativeWeights(50, 100, 10, 0.1, data) - for _ in range(200): - _ = mechanism.release([query]) \ No newline at end of file + # ridiculous mechanism to test convergence + mechanism = MultiplicativeWeights(10000, 2000, 100, 0.5, data) + _ = mechanism.release([query]) + results = mechanism.release(queries) + assert len(results) == len(queries) + assert np.isclose(results.mean(), (query * data).sum(), rtol=0.1) + assert abs((mechanism.data_est * query).sum() * data.sum() - (data * query).sum()) < 200 From 513090f789f16bb4a7d4092f9fd0eb67521c3a5c Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 2 Dec 2020 16:50:58 +1100 Subject: [PATCH 079/185] black formatting --- relm/mechanisms.py | 5 ++++- tests/test_mechanisms.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 29d4f3d..98fc892 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -611,11 +611,14 @@ class MultiplicativeWeights(ReleaseMechanism): learning_rate: the learning rate of the multiplicative weights algorithm data: a 1D numpy array of the underlying database """ + def __init__(self, epsilon, cutoff, threshold, learning_rate, data): super(MultiplicativeWeights, self).__init__(epsilon) self.data = data self.learning_rate = learning_rate - self.sparse_numeric = SparseNumeric(epsilon, sensitivity=1, threshold=threshold, cutoff=cutoff) + self.sparse_numeric = SparseNumeric( + epsilon, sensitivity=1, threshold=threshold, cutoff=cutoff + ) self.data_est = np.ones(len(data)) / len(data) @property diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index ddbb2c1..c6b0c50 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -241,4 +241,7 @@ def test_MultiplicativeWeights(): results = mechanism.release(queries) assert len(results) == len(queries) assert np.isclose(results.mean(), (query * data).sum(), rtol=0.1) - assert abs((mechanism.data_est * query).sum() * data.sum() - (data * query).sum()) < 200 + assert ( + abs((mechanism.data_est * query).sum() * data.sum() - (data * query).sum()) + < 200 + ) From 74bea43efb95f6b22c55aa561425d3df3d7210ce Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 09:41:56 +1100 Subject: [PATCH 080/185] make l1 norm issue explicit --- relm/mechanisms.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 98fc892..6a48c7a 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -621,6 +621,9 @@ def __init__(self, epsilon, cutoff, threshold, learning_rate, data): ) self.data_est = np.ones(len(data)) / len(data) + # this assumes that the l1 norm of the database is public + self.l1_norm = data.sum() + @property def privacy_consumed(self): return self.sparse_numeric.privacy_consumed @@ -645,15 +648,14 @@ def release(self, queries): """ results = [] - l1_norm = self.data.sum() for query in queries: true_answer = (query * self.data).sum() - # this assumes that the l1 norm of the database is public - est_answer = (query * self.data_est).sum() * l1_norm + est_answer = (query * self.data_est).sum() * self.l1_norm + error = true_answer - est_answer errors = np.array([error, -error]) - indices, release_values = self.sparse_numeric.release(errors) + if len(indices) == 0: results.append(est_answer) else: From ecf3657ee3b5d4f65f7ad2dda36f664249ff96ae Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 10:38:39 +1100 Subject: [PATCH 081/185] initial function --- relm/mechanisms.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index e704f38..48d120e 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -620,3 +620,32 @@ def privacy_consumed(self): return 0 else: return self.epsilon + + +class SmallDB(ReleaseMechanism): + + def __init__(self, epsilon, queries, data, alpha): + self.queries = queries + self.data = data + self.alpha = alpha + + l1_norm = int(len(queries) / (alpha ** 2)) + 1 + func = lambda code: self.utility_function(queries, data, self.l1_norm, code) + self.exponential_mechanism = ExponentialMechanism( + epsilon, func, 1, np.arange(len(data) ** l1_norm) + ) + + + @staticmethod + def utility_function(queries, data, l1_norm, code): + y = np.zeros_like(data) + l = len(data) + for idx in range(l1_norm): + y[code % l] += 1 + code //= l + + return np.abs(queries.dot(y) - queries.dot(data)).max() + + def release(self): + pass + From c2827844bab800b2aa964db3d784fd8c2acdf713 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 10:43:19 +1100 Subject: [PATCH 082/185] actually update weights! and make test more strict --- relm/mechanisms.py | 1 + tests/test_mechanisms.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 6a48c7a..92f42d4 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -661,5 +661,6 @@ def release(self, queries): else: noisy_answer = est_answer + (1 - 2 * indices[0]) * release_values[0] results.append(noisy_answer) + self.update_weights(est_answer, noisy_answer, query) return np.array(results) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index c6b0c50..6d675e2 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -243,5 +243,5 @@ def test_MultiplicativeWeights(): assert np.isclose(results.mean(), (query * data).sum(), rtol=0.1) assert ( abs((mechanism.data_est * query).sum() * data.sum() - (data * query).sum()) - < 200 + < 100 ) From e010fec49f6971ae3a3ecb6f227116fc45460b93 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 10:45:44 +1100 Subject: [PATCH 083/185] stricter test --- tests/test_mechanisms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 6d675e2..5035947 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -226,7 +226,7 @@ def test_ReportNoisyMax(benchmark): def test_MultiplicativeWeights(): data = np.random.randint(0, 10, 1000) query = np.random.randint(0, 2, 1000) - queries = [query] * 1000 + queries = [query] * 20000 # test privacy consumption mechanism = MultiplicativeWeights(50, 25, 0, 0.1, data) From d7070ef53f7c71451679d4ecbcde448c3ed33eb5 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 10:54:42 +1100 Subject: [PATCH 084/185] oblivious to data --- relm/mechanisms.py | 24 ++++++++++++------------ tests/test_mechanisms.py | 11 +++++------ 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 92f42d4..fdca45c 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -609,20 +609,21 @@ class MultiplicativeWeights(ReleaseMechanism): cutoff: the number of queries that access the private data threshold: the error tolerable learning_rate: the learning rate of the multiplicative weights algorithm - data: a 1D numpy array of the underlying database + l1_norm: the l1 norm of the database + histogram_size: the number of elements in the database historgam format """ - def __init__(self, epsilon, cutoff, threshold, learning_rate, data): + def __init__( + self, epsilon, cutoff, threshold, learning_rate, l1_norm, histogram_size + ): super(MultiplicativeWeights, self).__init__(epsilon) - self.data = data + self.learning_rate = learning_rate self.sparse_numeric = SparseNumeric( epsilon, sensitivity=1, threshold=threshold, cutoff=cutoff ) - self.data_est = np.ones(len(data)) / len(data) - - # this assumes that the l1 norm of the database is public - self.l1_norm = data.sum() + self.data_est = np.ones(histogram_size) / histogram_size + self.l1_norm = l1_norm @property def privacy_consumed(self): @@ -637,22 +638,21 @@ def update_weights(self, est_answer, noisy_answer, query): self.data_est *= np.exp(-r * self.learning_rate) self.data_est /= self.data_est.sum() - def release(self, queries): + def release(self, values, queries): """ Returns private answers to the queries. Args: queries: a list of queries as 1D 1/0 indicator numpy arrays + values: a numpy array of the query results Returns: a numpy array of the private query responses """ results = [] - for query in queries: - true_answer = (query * self.data).sum() + for idx, query in enumerate(queries): est_answer = (query * self.data_est).sum() * self.l1_norm - - error = true_answer - est_answer + error = values[idx] - est_answer errors = np.array([error, -error]) indices, release_values = self.sparse_numeric.release(errors) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 5035947..e1004bc 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -227,18 +227,17 @@ def test_MultiplicativeWeights(): data = np.random.randint(0, 10, 1000) query = np.random.randint(0, 2, 1000) queries = [query] * 20000 - + values = [(query * data).sum() for query in queries] # test privacy consumption - mechanism = MultiplicativeWeights(50, 25, 0, 0.1, data) + mechanism = MultiplicativeWeights(50, 25, 0, 0.1, data.sum(), len(data)) with pytest.raises(RuntimeError): - results = mechanism.release(queries) + results = mechanism.release(values, queries) assert mechanism.privacy_consumed == 50 # ridiculous mechanism to test convergence - mechanism = MultiplicativeWeights(10000, 2000, 100, 0.5, data) - _ = mechanism.release([query]) - results = mechanism.release(queries) + mechanism = MultiplicativeWeights(10000, 2000, 100, 0.5, data.sum(), len(data)) + results = mechanism.release(values, queries) assert len(results) == len(queries) assert np.isclose(results.mean(), (query * data).sum(), rtol=0.1) assert ( From d3f84834f2d8aebc7fd222ae5fedb05342bf6730 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 16:27:44 +1100 Subject: [PATCH 085/185] fix utility function --- relm/mechanisms.py | 41 +++++++++++++++++++++++++++------------- tests/test_mechanisms.py | 13 +++++++++++++ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 48d120e..cdcdaf4 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -185,6 +185,7 @@ def release(self, values): self._update_accountant() utilities = self.utility_function(values) + print("########", utilities) index = self._sampler(utilities) return self.output_range[index] @@ -623,29 +624,43 @@ def privacy_consumed(self): class SmallDB(ReleaseMechanism): - def __init__(self, epsilon, queries, data, alpha): - self.queries = queries - self.data = data - self.alpha = alpha - l1_norm = int(len(queries) / (alpha ** 2)) + 1 - func = lambda code: self.utility_function(queries, data, self.l1_norm, code) + + func = lambda code: self.utility_function(queries, data, l1_norm, code) + output_range = np.arange(len(data) ** l1_norm) + # print("####", len(data) ** l1_norm) + self.exponential_mechanism = ExponentialMechanism( - epsilon, func, 1, np.arange(len(data) ** l1_norm) + epsilon, func, 1, output_range ) + code = self.exponential_mechanism.release(output_range) + self.db = self.decode(code, l1_norm, len(data)) + @property + def privacy_consumed(self): + return self.exponential_mechanism.privacy_consumed @staticmethod - def utility_function(queries, data, l1_norm, code): - y = np.zeros_like(data) - l = len(data) + def decode(code, l1_norm, l): + y = np.zeros(l, dtype=np.uint64) for idx in range(l1_norm): y[code % l] += 1 code //= l + return y + + @staticmethod + def utility_function(queries, data, l1_norm, codes): + out = [] + l = len(data) + for code in codes: + y = SmallDB.decode(code, l1_norm, l) - return np.abs(queries.dot(y) - queries.dot(data)).max() + est_answer = queries.dot(y) / l1_norm + answer = queries.dot(data) / data.sum() + out.append(-np.abs(est_answer - answer).max().astype(np.float64)) - def release(self): - pass + return np.array(out) + def release(self, queries): + return np.dot(queries, self.db) / self.db.sum() diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 2666c8f..85ad336 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -11,6 +11,7 @@ SparseIndicator, SparseNumeric, ReportNoisyMax, + SmallDB, ) @@ -220,3 +221,15 @@ def test_SnappingMechanism(benchmark): def test_ReportNoisyMax(benchmark): mechanism = ReportNoisyMax(epsilon=0.1, precision=35) _test_mechanism(benchmark, mechanism) + + +def test_SmallDB(): + data = np.random.randint(0, 10, 3) + queries = np.vstack([np.random.randint(0, 2, 3) for _ in range(3)]) + epsilon = 1000000000 + mechanism = SmallDB(epsilon, queries, data, 0.9) + + assert np.allclose( + queries.dot(data) / data.sum(), mechanism.release(queries), atol=0.1 + ) + assert epsilon == mechanism.privacy_consumed From 4ebb869bc76216a2dceab36ff50f992aafb0bf43 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 16:32:25 +1100 Subject: [PATCH 086/185] add docstrings --- relm/mechanisms.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index cdcdaf4..d88fdd0 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -624,6 +624,16 @@ def privacy_consumed(self): class SmallDB(ReleaseMechanism): + """ + A offline Release Mechanism for answering a large number of queries. + + Args: + epsilon: the privacy parameter + queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) + data: a 1D array of the database in histogram format + alpha: the relative accuracy of the mechanism + """ + def __init__(self, epsilon, queries, data, alpha): l1_norm = int(len(queries) / (alpha ** 2)) + 1 @@ -663,4 +673,13 @@ def utility_function(queries, data, l1_norm, codes): return np.array(out) def release(self, queries): + """ + Releases differential private responses to queries. + + Args: + queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) + + Returns: + A numpy array of perturbed values. + """ return np.dot(queries, self.db) / self.db.sum() From f191e39edcee120dc96c52d123aecb22d56066d8 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 16:32:35 +1100 Subject: [PATCH 087/185] remove comment --- relm/mechanisms.py | 1 - 1 file changed, 1 deletion(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index d88fdd0..d71ea7b 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -639,7 +639,6 @@ def __init__(self, epsilon, queries, data, alpha): func = lambda code: self.utility_function(queries, data, l1_norm, code) output_range = np.arange(len(data) ** l1_norm) - # print("####", len(data) ** l1_norm) self.exponential_mechanism = ExponentialMechanism( epsilon, func, 1, output_range From e76582f9f738cabcc81d7818b55c10c635f6bcd9 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 16:34:52 +1100 Subject: [PATCH 088/185] more doc strings --- relm/mechanisms.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index d71ea7b..018961e 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -652,6 +652,9 @@ def privacy_consumed(self): @staticmethod def decode(code, l1_norm, l): + """ + Transform integer code into small database. + """ y = np.zeros(l, dtype=np.uint64) for idx in range(l1_norm): y[code % l] += 1 From 29f65fa5f06bae1cca91b7b7df648ba6bbdd3934 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 3 Dec 2020 16:39:51 +1100 Subject: [PATCH 089/185] Revert "oblivious to data" This reverts commit d7070ef53f7c71451679d4ecbcde448c3ed33eb5. --- relm/mechanisms.py | 24 ++++++++++++------------ tests/test_mechanisms.py | 11 ++++++----- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index fdca45c..92f42d4 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -609,21 +609,20 @@ class MultiplicativeWeights(ReleaseMechanism): cutoff: the number of queries that access the private data threshold: the error tolerable learning_rate: the learning rate of the multiplicative weights algorithm - l1_norm: the l1 norm of the database - histogram_size: the number of elements in the database historgam format + data: a 1D numpy array of the underlying database """ - def __init__( - self, epsilon, cutoff, threshold, learning_rate, l1_norm, histogram_size - ): + def __init__(self, epsilon, cutoff, threshold, learning_rate, data): super(MultiplicativeWeights, self).__init__(epsilon) - + self.data = data self.learning_rate = learning_rate self.sparse_numeric = SparseNumeric( epsilon, sensitivity=1, threshold=threshold, cutoff=cutoff ) - self.data_est = np.ones(histogram_size) / histogram_size - self.l1_norm = l1_norm + self.data_est = np.ones(len(data)) / len(data) + + # this assumes that the l1 norm of the database is public + self.l1_norm = data.sum() @property def privacy_consumed(self): @@ -638,21 +637,22 @@ def update_weights(self, est_answer, noisy_answer, query): self.data_est *= np.exp(-r * self.learning_rate) self.data_est /= self.data_est.sum() - def release(self, values, queries): + def release(self, queries): """ Returns private answers to the queries. Args: queries: a list of queries as 1D 1/0 indicator numpy arrays - values: a numpy array of the query results Returns: a numpy array of the private query responses """ results = [] - for idx, query in enumerate(queries): + for query in queries: + true_answer = (query * self.data).sum() est_answer = (query * self.data_est).sum() * self.l1_norm - error = values[idx] - est_answer + + error = true_answer - est_answer errors = np.array([error, -error]) indices, release_values = self.sparse_numeric.release(errors) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index e1004bc..5035947 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -227,17 +227,18 @@ def test_MultiplicativeWeights(): data = np.random.randint(0, 10, 1000) query = np.random.randint(0, 2, 1000) queries = [query] * 20000 - values = [(query * data).sum() for query in queries] + # test privacy consumption - mechanism = MultiplicativeWeights(50, 25, 0, 0.1, data.sum(), len(data)) + mechanism = MultiplicativeWeights(50, 25, 0, 0.1, data) with pytest.raises(RuntimeError): - results = mechanism.release(values, queries) + results = mechanism.release(queries) assert mechanism.privacy_consumed == 50 # ridiculous mechanism to test convergence - mechanism = MultiplicativeWeights(10000, 2000, 100, 0.5, data.sum(), len(data)) - results = mechanism.release(values, queries) + mechanism = MultiplicativeWeights(10000, 2000, 100, 0.5, data) + _ = mechanism.release([query]) + results = mechanism.release(queries) assert len(results) == len(queries) assert np.isclose(results.mean(), (query * data).sum(), rtol=0.1) assert ( From 9e44988e320254c696604b98fe042323883d36c7 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Fri, 4 Dec 2020 14:58:13 +1100 Subject: [PATCH 090/185] use error as parameter for mechanism --- relm/mechanisms.py | 28 ++++++++++++++++++++++------ tests/test_mechanisms.py | 8 ++++++-- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 92f42d4..b148d66 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -606,23 +606,39 @@ class MultiplicativeWeights(ReleaseMechanism): Args: epsilon: the privacy parameter to use - cutoff: the number of queries that access the private data - threshold: the error tolerable + error: the error of the mechanism + num_queries: the number of queries answered by the mechanism learning_rate: the learning rate of the multiplicative weights algorithm data: a 1D numpy array of the underlying database """ - def __init__(self, epsilon, cutoff, threshold, learning_rate, data): + def __init__(self, epsilon, error, num_queries, learning_rate, data): super(MultiplicativeWeights, self).__init__(epsilon) self.data = data self.learning_rate = learning_rate + self.l1_norm = data.sum() + self.data_est = np.ones(len(data)) / len(data) + # normalize error + self.alpha = error / (self.l1_norm * 3) + + # solve inequality of Theorem 4.14 (Dwork and Roth) for beta + self.beta = epsilon * self.l1_norm * self.alpha ** 3 + self.beta /= 32 * np.log(len(data)) + self.beta -= np.log(num_queries) + self.beta = np.exp(-self.beta) * 32 * np.log(len(data)) / (self.alpha ** 2) + + cutoff = 4 * np.log(len(data)) / (self.alpha ** 2) + self.threshold = 18 * cutoff / (epsilon * self.l1_norm) + self.threshold *= np.log(2 * num_queries) + np.log(4 * cutoff / self.beta) + self.cutoff = int(cutoff) + self.sparse_numeric = SparseNumeric( - epsilon, sensitivity=1, threshold=threshold, cutoff=cutoff + epsilon, sensitivity=1, threshold=self.threshold, cutoff=self.cutoff ) - self.data_est = np.ones(len(data)) / len(data) + # this assumes that the l1 norm of the database is public - self.l1_norm = data.sum() + @property def privacy_consumed(self): diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 5035947..c91a0d2 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -229,14 +229,18 @@ def test_MultiplicativeWeights(): queries = [query] * 20000 # test privacy consumption - mechanism = MultiplicativeWeights(50, 25, 0, 0.1, data) + mechanism = MultiplicativeWeights(50, 0.01, 20000, 100, data) + print(mechanism.beta) + print(mechanism.threshold) + print(mechanism.cutoff) + raise ValueError with pytest.raises(RuntimeError): results = mechanism.release(queries) assert mechanism.privacy_consumed == 50 # ridiculous mechanism to test convergence - mechanism = MultiplicativeWeights(10000, 2000, 100, 0.5, data) + mechanism = MultiplicativeWeights(10000, 0.01, 20000, 0.1, data) _ = mechanism.release([query]) results = mechanism.release(queries) assert len(results) == len(queries) From 706445061045e79d7de48c2d2a384bc6d2e519ab Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Fri, 4 Dec 2020 15:00:53 +1100 Subject: [PATCH 091/185] update test --- tests/test_mechanisms.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index c91a0d2..a17ea16 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -229,22 +229,22 @@ def test_MultiplicativeWeights(): queries = [query] * 20000 # test privacy consumption - mechanism = MultiplicativeWeights(50, 0.01, 20000, 100, data) - print(mechanism.beta) - print(mechanism.threshold) - print(mechanism.cutoff) - raise ValueError - with pytest.raises(RuntimeError): - results = mechanism.release(queries) + mechanism = MultiplicativeWeights(50, 100, 20000, 0.2, data) - assert mechanism.privacy_consumed == 50 + # with pytest.raises(RuntimeError): + # results = mechanism.release(queries) + # + # assert mechanism.privacy_consumed == 50 # ridiculous mechanism to test convergence mechanism = MultiplicativeWeights(10000, 0.01, 20000, 0.1, data) + print(mechanism.beta) + print(mechanism.threshold) + print(mechanism.cutoff) _ = mechanism.release([query]) results = mechanism.release(queries) assert len(results) == len(queries) - assert np.isclose(results.mean(), (query * data).sum(), rtol=0.1) + # assert np.isclose(results.mean(), (query * data).sum(), rtol=0.1) assert ( abs((mechanism.data_est * query).sum() * data.sum() - (data * query).sum()) < 100 From 04d58d657c85ab7aa1e0968483d261576327dee4 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Fri, 4 Dec 2020 15:09:39 +1100 Subject: [PATCH 092/185] fix beta calc --- relm/mechanisms.py | 1 + tests/test_mechanisms.py | 17 ++--------------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index b148d66..bd2b135 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -630,6 +630,7 @@ def __init__(self, epsilon, error, num_queries, learning_rate, data): cutoff = 4 * np.log(len(data)) / (self.alpha ** 2) self.threshold = 18 * cutoff / (epsilon * self.l1_norm) self.threshold *= np.log(2 * num_queries) + np.log(4 * cutoff / self.beta) + self.threshold *= self.l1_norm self.cutoff = int(cutoff) self.sparse_numeric = SparseNumeric( diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index a17ea16..2034f2e 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -228,23 +228,10 @@ def test_MultiplicativeWeights(): query = np.random.randint(0, 2, 1000) queries = [query] * 20000 - # test privacy consumption - mechanism = MultiplicativeWeights(50, 100, 20000, 0.2, data) - - # with pytest.raises(RuntimeError): - # results = mechanism.release(queries) - # - # assert mechanism.privacy_consumed == 50 - - # ridiculous mechanism to test convergence - mechanism = MultiplicativeWeights(10000, 0.01, 20000, 0.1, data) - print(mechanism.beta) - print(mechanism.threshold) - print(mechanism.cutoff) - _ = mechanism.release([query]) + mechanism = MultiplicativeWeights(10000, 100, 20000, 0.1, data) results = mechanism.release(queries) + assert len(results) == len(queries) - # assert np.isclose(results.mean(), (query * data).sum(), rtol=0.1) assert ( abs((mechanism.data_est * query).sum() * data.sum() - (data * query).sum()) < 100 From debb9f01462228489f5baed2f61cbd49ad9cba53 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Fri, 4 Dec 2020 15:11:51 +1100 Subject: [PATCH 093/185] auto calc learning rate --- relm/mechanisms.py | 6 +++--- tests/test_mechanisms.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index bd2b135..f7c888c 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -608,18 +608,18 @@ class MultiplicativeWeights(ReleaseMechanism): epsilon: the privacy parameter to use error: the error of the mechanism num_queries: the number of queries answered by the mechanism - learning_rate: the learning rate of the multiplicative weights algorithm data: a 1D numpy array of the underlying database """ - def __init__(self, epsilon, error, num_queries, learning_rate, data): + def __init__(self, epsilon, error, num_queries, data): super(MultiplicativeWeights, self).__init__(epsilon) self.data = data - self.learning_rate = learning_rate + self.l1_norm = data.sum() self.data_est = np.ones(len(data)) / len(data) # normalize error self.alpha = error / (self.l1_norm * 3) + self.learning_rate = self.alpha / 2 # solve inequality of Theorem 4.14 (Dwork and Roth) for beta self.beta = epsilon * self.l1_norm * self.alpha ** 3 diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 2034f2e..d8b1121 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -228,7 +228,7 @@ def test_MultiplicativeWeights(): query = np.random.randint(0, 2, 1000) queries = [query] * 20000 - mechanism = MultiplicativeWeights(10000, 100, 20000, 0.1, data) + mechanism = MultiplicativeWeights(10000, 100, 20000, data) results = mechanism.release(queries) assert len(results) == len(queries) From 0f787b0a2e0b3c4a5f3431336dec810489d7e70f Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Fri, 4 Dec 2020 15:12:09 +1100 Subject: [PATCH 094/185] black formatting --- relm/mechanisms.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index f7c888c..ff82e91 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -637,10 +637,8 @@ def __init__(self, epsilon, error, num_queries, data): epsilon, sensitivity=1, threshold=self.threshold, cutoff=self.cutoff ) - # this assumes that the l1 norm of the database is public - @property def privacy_consumed(self): return self.sparse_numeric.privacy_consumed From 5108f447ea826ed454c08195caad691686a3073a Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 7 Dec 2020 15:11:42 +1100 Subject: [PATCH 095/185] rust implementation --- Cargo.lock | 1 + Cargo.toml | 1 + relm/mechanisms.py | 20 +++++++---- src/lib.rs | 21 ++++++++++- src/mechanisms.rs | 76 ++++++++++++++++++++++++++++++++++++++++ tests/test_mechanisms.py | 11 ++++++ 6 files changed, 122 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 031dcb6..7c8aa85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -497,6 +497,7 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" name = "relm-backend" version = "0.1.0" dependencies = [ + "ndarray", "numpy", "pyo3", "rand", diff --git a/Cargo.toml b/Cargo.toml index af266dd..e977544 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,4 @@ rand = "0.7.3" rayon = "1.4.1" numpy = "0.11.0" rug = "1.11.0" +ndarray = "0.13.1" diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 018961e..c6ce0b9 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -637,14 +637,20 @@ class SmallDB(ReleaseMechanism): def __init__(self, epsilon, queries, data, alpha): l1_norm = int(len(queries) / (alpha ** 2)) + 1 - func = lambda code: self.utility_function(queries, data, l1_norm, code) - output_range = np.arange(len(data) ** l1_norm) + assert (np.sort(np.unique(queries)) == np.array([0, 1])).all() + assert (data >= 0).all() + + if data.dtype == np.int64: + data = data.astype(np.uint64) + + assert data.dtype == np.uint64 + + answers = queries.dot(data) / data.sum() + breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) + queries = np.concatenate([np.where(queries[i, :])[0] for i in range(queries.shape[0])]).astype(np.uint64) + + db = backend.small_db(epsilon, l1_norm, len(data), queries, answers, breaks) - self.exponential_mechanism = ExponentialMechanism( - epsilon, func, 1, output_range - ) - code = self.exponential_mechanism.release(output_range) - self.db = self.decode(code, l1_norm, len(data)) @property def privacy_consumed(self): diff --git a/src/lib.rs b/src/lib.rs index 0a848e8..144e5c7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ #![allow(unused_doc_comments)] use pyo3::prelude::{pymodule, PyModule, PyResult, Python}; -use numpy::{PyArray1, ToPyArray}; +use numpy::{PyArray1, ToPyArray, PyArray2}; mod utils; @@ -123,5 +123,24 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { Ok(index) } + #[pyfn(m, "small_db")] + fn py_small_db<'a>( + py: Python<'a>, + epsilon: f64, + l1_norm: usize, + size: u64, + queries: &'a PyArray1, + answers: &'a PyArray1, + breaks: &'a PyArray1 +) -> PyResult { + let queries = queries.to_vec().unwrap(); + let answers = answers.to_vec().unwrap(); + let breaks = breaks.to_vec().unwrap(); + let breaks = breaks.iter().map(|&x| x as usize).collect(); + let db = mechanisms::small_db(epsilon, l1_norm, size, queries, answers, breaks); + + Ok(1.0) + } + Ok(()) } diff --git a/src/mechanisms.rs b/src/mechanisms.rs index af755fa..1752ea5 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -1,7 +1,9 @@ use rand::{thread_rng, Rng}; use rand::distributions::WeightedIndex; +use ndarray::Array2; use std::convert::TryInto; +use std::collections::HashMap; use rayon::prelude::*; use crate::samplers; @@ -130,3 +132,77 @@ pub fn permute_and_flip_mechanism( } current.try_into().unwrap() } + + +pub fn small_db( + epsilon: f64, l1_norm: usize, size: u64, queries: Vec, answers: Vec, breaks: Vec +) -> HashMap { + let mut db: HashMap = HashMap::with_capacity(l1_norm); + + let mut idx = 0; + + loop { + random_small_db(&mut db, l1_norm, size); + + let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); + + let log_p = -0.5 * epsilon * error; + let flag = samplers::bernoulli_log_p(log_p); + if flag { + break + } + idx += 1; + if idx > 100 { + println!("Wooohoo!"); + break; + } + } + + db +} + + +fn random_small_db(db: &mut HashMap, l1_norm: usize, size: u64) { + db.clear(); + let mut rng = thread_rng(); + for _ in 0..l1_norm { + let idx: u64 = rng.gen_range(0, size); + db.entry(idx).or_insert(0); + if let Some(x) = db.get_mut(&idx) { + *x += 1; + } + } +} + + +fn small_db_max_error( + db: &HashMap, queries: &Vec, answers: &Vec, breaks: &Vec, l1_norm: usize +) -> f64 { + + let mut max_error: f64 = 0.0; + let mut result: u64 = 0; + let mut error: f64 = 0.0; + + let mut start: usize = 0; + for (i, &stop) in breaks.iter().enumerate() { + result = 0; + for j in start..stop { + let idx = queries[j]; + result += match db.get(&idx) { + Some(x) => {*x} + None => 0 + }; + } + + start = stop; + + let normalized_result = (result as f64) / (l1_norm as f64); + + error = (normalized_result - answers[i]).abs(); + if error > max_error { + max_error = error; + } + } + + max_error +} diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 85ad336..23476d4 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -233,3 +233,14 @@ def test_SmallDB(): queries.dot(data) / data.sum(), mechanism.release(queries), atol=0.1 ) assert epsilon == mechanism.privacy_consumed + + +def test_rust_SmallDB(): + data = np.random.randint(0, 10, 3) + queries = np.vstack([np.random.randint(0, 2, 3) for _ in range(3)]) + for i in range(3): + print(f"Actual {i} Q Idxs: ", np.where(queries[i, :])[0]) + epsilon = 1000000000 + mechanism = SmallDB(epsilon, queries, data, 0.9) + + raise NotImplementedError From 2482e09e526b1141b1e606b675d38479425d3ac9 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 7 Dec 2020 16:11:51 +1100 Subject: [PATCH 096/185] return dense vector + cleanup --- relm/mechanisms.py | 33 ++++++--------------------------- src/lib.rs | 5 ++--- src/mechanisms.rs | 25 +++++++++++++------------ tests/test_mechanisms.py | 20 ++++++++++++++------ 4 files changed, 35 insertions(+), 48 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index c6ce0b9..a84aeef 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -647,39 +647,18 @@ def __init__(self, epsilon, queries, data, alpha): answers = queries.dot(data) / data.sum() breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) - queries = np.concatenate([np.where(queries[i, :])[0] for i in range(queries.shape[0])]).astype(np.uint64) - - db = backend.small_db(epsilon, l1_norm, len(data), queries, answers, breaks) + queries = np.concatenate( + [np.where(queries[i, :])[0] for i in range(queries.shape[0])] + ).astype(np.uint64) + self.db = backend.small_db( + epsilon, l1_norm, len(data), queries, answers, breaks + ) @property def privacy_consumed(self): return self.exponential_mechanism.privacy_consumed - @staticmethod - def decode(code, l1_norm, l): - """ - Transform integer code into small database. - """ - y = np.zeros(l, dtype=np.uint64) - for idx in range(l1_norm): - y[code % l] += 1 - code //= l - return y - - @staticmethod - def utility_function(queries, data, l1_norm, codes): - out = [] - l = len(data) - for code in codes: - y = SmallDB.decode(code, l1_norm, l) - - est_answer = queries.dot(y) / l1_norm - answer = queries.dot(data) / data.sum() - out.append(-np.abs(est_answer - answer).max().astype(np.float64)) - - return np.array(out) - def release(self, queries): """ Releases differential private responses to queries. diff --git a/src/lib.rs b/src/lib.rs index 144e5c7..0fccccf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -132,14 +132,13 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { queries: &'a PyArray1, answers: &'a PyArray1, breaks: &'a PyArray1 -) -> PyResult { +) -> &'a PyArray1 { let queries = queries.to_vec().unwrap(); let answers = answers.to_vec().unwrap(); let breaks = breaks.to_vec().unwrap(); let breaks = breaks.iter().map(|&x| x as usize).collect(); - let db = mechanisms::small_db(epsilon, l1_norm, size, queries, answers, breaks); - Ok(1.0) + mechanisms::small_db(epsilon, l1_norm, size, queries, answers, breaks).to_pyarray(py) } Ok(()) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 1752ea5..7415693 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -136,35 +136,36 @@ pub fn permute_and_flip_mechanism( pub fn small_db( epsilon: f64, l1_norm: usize, size: u64, queries: Vec, answers: Vec, breaks: Vec -) -> HashMap { - let mut db: HashMap = HashMap::with_capacity(l1_norm); +) -> Vec { - let mut idx = 0; + // store the db in a sparse vector (implemented with a HashMap) + let mut db: HashMap = HashMap::with_capacity(l1_norm); loop { + // sample another random small db random_small_db(&mut db, l1_norm, size); let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); let log_p = -0.5 * epsilon * error; let flag = samplers::bernoulli_log_p(log_p); - if flag { - break - } - idx += 1; - if idx > 100 { - println!("Wooohoo!"); - break; - } + if flag { break } + } + + // convert the sparse small db to a dense vector + let mut db_vec: Vec = vec![0; size as usize]; + for (&idx, &val) in db.iter() { + db_vec[idx as usize] = val; } - db + db_vec } fn random_small_db(db: &mut HashMap, l1_norm: usize, size: u64) { db.clear(); let mut rng = thread_rng(); + for _ in 0..l1_norm { let idx: u64 = rng.gen_range(0, size); db.entry(idx).or_insert(0); diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 23476d4..b1d5e49 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -236,11 +236,19 @@ def test_SmallDB(): def test_rust_SmallDB(): - data = np.random.randint(0, 10, 3) - queries = np.vstack([np.random.randint(0, 2, 3) for _ in range(3)]) - for i in range(3): - print(f"Actual {i} Q Idxs: ", np.where(queries[i, :])[0]) - epsilon = 1000000000 + + size = 1000 + + data = np.random.randint(0, 10, size) + queries = np.vstack([np.random.randint(0, 2, size) for _ in range(3)]) + + epsilon = 1 mechanism = SmallDB(epsilon, queries, data, 0.9) + errors = abs(queries.dot(data) / data.sum() - mechanism.release(queries)) + + assert len(mechanism.db) == size + assert mechanism.db.sum() == int(len(queries) / (0.9 ** 2)) + 1 - raise NotImplementedError + epsilon = 1 + mechanism = SmallDB(epsilon, queries, data, 0.001) + errors = abs(queries.dot(data) / data.sum() - mechanism.release(queries)) From 91604a0ac05afc18b593dc783f45fef6d39904d6 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 7 Dec 2020 16:12:51 +1100 Subject: [PATCH 097/185] remove old test --- tests/test_mechanisms.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index b1d5e49..c409f72 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -224,18 +224,6 @@ def test_ReportNoisyMax(benchmark): def test_SmallDB(): - data = np.random.randint(0, 10, 3) - queries = np.vstack([np.random.randint(0, 2, 3) for _ in range(3)]) - epsilon = 1000000000 - mechanism = SmallDB(epsilon, queries, data, 0.9) - - assert np.allclose( - queries.dot(data) / data.sum(), mechanism.release(queries), atol=0.1 - ) - assert epsilon == mechanism.privacy_consumed - - -def test_rust_SmallDB(): size = 1000 From e47ba5679ade922d68936bf3d0a9a1758c66f984 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 7 Dec 2020 16:27:34 +1100 Subject: [PATCH 098/185] add comments --- relm/mechanisms.py | 42 +++++++++++++++++++++++++++++------------- src/mechanisms.rs | 13 ++++++++++++- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index a84aeef..e7258de 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -5,6 +5,7 @@ class ReleaseMechanism: + def __init__(self, epsilon): self.epsilon = epsilon self._is_valid = True @@ -630,13 +631,13 @@ class SmallDB(ReleaseMechanism): Args: epsilon: the privacy parameter queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) - data: a 1D array of the database in histogram format alpha: the relative accuracy of the mechanism """ def __init__(self, epsilon, queries, data, alpha): - l1_norm = int(len(queries) / (alpha ** 2)) + 1 + super(SmallDB, self).__init__(epsilon) + self.alpha = alpha assert (np.sort(np.unique(queries)) == np.array([0, 1])).all() assert (data >= 0).all() @@ -644,20 +645,15 @@ def __init__(self, epsilon, queries, data, alpha): data = data.astype(np.uint64) assert data.dtype == np.uint64 - - answers = queries.dot(data) / data.sum() - breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) - queries = np.concatenate( - [np.where(queries[i, :])[0] for i in range(queries.shape[0])] - ).astype(np.uint64) - - self.db = backend.small_db( - epsilon, l1_norm, len(data), queries, answers, breaks - ) + self.data = data + self.db = None @property def privacy_consumed(self): - return self.exponential_mechanism.privacy_consumed + if self._is_valid: + return 0 + else: + return self.epsilon def release(self, queries): """ @@ -665,8 +661,28 @@ def release(self, queries): Args: queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) + data: a 1D array of the database in histogram format Returns: A numpy array of perturbed values. """ + + self._check_valid() + + l1_norm = int(len(queries) / (self.alpha ** 2)) + 1 + + answers = queries.dot(self.data) / self.data.sum() + + # store the indices of 1s of the queries in a flattened vector + sparse_queries = np.concatenate( + [np.where(queries[i, :])[0] for i in range(queries.shape[0])] + ).astype(np.uint64) + + # store the indices of where each line ends in sparse_queries + breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) + + self.db = backend.small_db( + self.epsilon, l1_norm, len(self.data), sparse_queries, answers, breaks + ) + return np.dot(queries, self.db) / self.db.sum() diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 7415693..1dda07c 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -163,11 +163,17 @@ pub fn small_db( fn random_small_db(db: &mut HashMap, l1_norm: usize, size: u64) { + /// generates a random sparse database with size `size` and a norm of `l1_norm` in place + /// overwrites previous db for time and space efficiency + db.clear(); let mut rng = thread_rng(); for _ in 0..l1_norm { + + // randomly select an index of the database to increment let idx: u64 = rng.gen_range(0, size); + db.entry(idx).or_insert(0); if let Some(x) = db.get_mut(&idx) { *x += 1; @@ -185,8 +191,13 @@ fn small_db_max_error( let mut error: f64 = 0.0; let mut start: usize = 0; + + // breaks determines the index of `queries` at which the distinct queries end/start + // iterate through queries for (i, &stop) in breaks.iter().enumerate() { + // calculate result of query result = 0; + // iterate through the indices stored in the query for j in start..stop { let idx = queries[j]; result += match db.get(&idx) { @@ -197,8 +208,8 @@ fn small_db_max_error( start = stop; + // store largest error let normalized_result = (result as f64) / (l1_norm as f64); - error = (normalized_result - answers[i]).abs(); if error > max_error { max_error = error; From 5f5a5da443b19775ed57d575702da1726ce32a41 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Mon, 7 Dec 2020 16:27:51 +1100 Subject: [PATCH 099/185] black formatting --- relm/mechanisms.py | 1 - 1 file changed, 1 deletion(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index e7258de..ab45f0c 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -5,7 +5,6 @@ class ReleaseMechanism: - def __init__(self, epsilon): self.epsilon = epsilon self._is_valid = True From 6b1cb3b3f200057a3e68f790d983f2bc53c68374 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 8 Dec 2020 10:41:01 +1100 Subject: [PATCH 100/185] review comments - assert, unused imports, and utility --- relm/mechanisms.py | 18 +++++++++++++++--- src/lib.rs | 2 +- src/mechanisms.rs | 5 ++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index ab45f0c..2262e26 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -637,13 +637,25 @@ def __init__(self, epsilon, queries, data, alpha): super(SmallDB, self).__init__(epsilon) self.alpha = alpha - assert (np.sort(np.unique(queries)) == np.array([0, 1])).all() - assert (data >= 0).all() + + if not (np.sort(np.unique(queries)) == np.array([0, 1])).all(): + raise ValueError( + f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" + ) + + if not (data >= 0).all(): + raise ValueError( + f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" + ) if data.dtype == np.int64: data = data.astype(np.uint64) - assert data.dtype == np.uint64 + if data.dtype != np.uint64: + raise ValueError( + f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" + ) + self.data = data self.db = None diff --git a/src/lib.rs b/src/lib.rs index 0fccccf..9d1b8e4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ #![allow(unused_doc_comments)] use pyo3::prelude::{pymodule, PyModule, PyResult, Python}; -use numpy::{PyArray1, ToPyArray, PyArray2}; +use numpy::{PyArray1, ToPyArray}; mod utils; diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 1dda07c..368048f 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -1,6 +1,5 @@ use rand::{thread_rng, Rng}; use rand::distributions::WeightedIndex; -use ndarray::Array2; use std::convert::TryInto; use std::collections::HashMap; @@ -146,8 +145,8 @@ pub fn small_db( random_small_db(&mut db, l1_norm, size); let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); - - let log_p = -0.5 * epsilon * error; + let utility = -error; + let log_p = 0.5 * epsilon * utility; let flag = samplers::bernoulli_log_p(log_p); if flag { break } } From ab19a2fbaca62ec7ae0b523f96c4fab59ad5894a Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 8 Dec 2020 10:45:06 +1100 Subject: [PATCH 101/185] remove flag variable --- src/mechanisms.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 368048f..b0a3b74 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -147,8 +147,7 @@ pub fn small_db( let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); let utility = -error; let log_p = 0.5 * epsilon * utility; - let flag = samplers::bernoulli_log_p(log_p); - if flag { break } + if samplers::bernoulli_log_p(log_p) { break } } // convert the sparse small db to a dense vector From 22e44ef7380e42f8db3fcb23e17c7da3a0a12d5f Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 8 Dec 2020 10:49:45 +1100 Subject: [PATCH 102/185] fix in[ut validation and test it --- relm/mechanisms.py | 2 +- tests/test_mechanisms.py | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 2262e26..2fcb760 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -638,7 +638,7 @@ def __init__(self, epsilon, queries, data, alpha): super(SmallDB, self).__init__(epsilon) self.alpha = alpha - if not (np.sort(np.unique(queries)) == np.array([0, 1])).all(): + if ((queries != 0) & (queries != 1)).any(): raise ValueError( f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" ) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index c409f72..45a6174 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -240,3 +240,14 @@ def test_SmallDB(): epsilon = 1 mechanism = SmallDB(epsilon, queries, data, 0.001) errors = abs(queries.dot(data) / data.sum() - mechanism.release(queries)) + + _ = SmallDB(epsilon, np.ones((1, size)), data, 0.001) + _ = SmallDB(epsilon, np.zeros((1, size)), data, 0.001) + with pytest.raises(ValueError): + queries = np.ones((1, size)) + queries[0, 2] = -1 + _ = SmallDB(epsilon, queries, data, 0.001) + + with pytest.raises(ValueError): + data[0] = -2 + _ = SmallDB(epsilon, np.ones((1, size)), data, 0.001) From 7b84c6b39d0fcecbdee844a9a4217e59379ca032 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 8 Dec 2020 10:56:00 +1100 Subject: [PATCH 103/185] more input validation and tests --- relm/mechanisms.py | 10 ++++++++-- tests/test_mechanisms.py | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 2fcb760..645648b 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -630,7 +630,7 @@ class SmallDB(ReleaseMechanism): Args: epsilon: the privacy parameter queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) - alpha: the relative accuracy of the mechanism + alpha: the relative error of the mechanism in range [0, 1] """ def __init__(self, epsilon, queries, data, alpha): @@ -638,6 +638,12 @@ def __init__(self, epsilon, queries, data, alpha): super(SmallDB, self).__init__(epsilon) self.alpha = alpha + if not type(alpha) is float: + raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") + + if (alpha < 0) or (alpha > 1): + raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") + if ((queries != 0) & (queries != 1)).any(): raise ValueError( f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" @@ -652,7 +658,7 @@ def __init__(self, epsilon, queries, data, alpha): data = data.astype(np.uint64) if data.dtype != np.uint64: - raise ValueError( + raise TypeError( f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" ) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 45a6174..6871c48 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -241,6 +241,7 @@ def test_SmallDB(): mechanism = SmallDB(epsilon, queries, data, 0.001) errors = abs(queries.dot(data) / data.sum() - mechanism.release(queries)) + # input validation _ = SmallDB(epsilon, np.ones((1, size)), data, 0.001) _ = SmallDB(epsilon, np.zeros((1, size)), data, 0.001) with pytest.raises(ValueError): @@ -249,5 +250,18 @@ def test_SmallDB(): _ = SmallDB(epsilon, queries, data, 0.001) with pytest.raises(ValueError): - data[0] = -2 - _ = SmallDB(epsilon, np.ones((1, size)), data, 0.001) + data_copy = data.copy() + data_copy[3] = -2 + _ = SmallDB(epsilon, np.ones((1, size)), data_copy, 0.001) + + with pytest.raises(TypeError): + _ = SmallDB(epsilon, np.ones((1, size)), data.astype(np.int32), 0.001) + + with pytest.raises(TypeError): + _ = SmallDB(epsilon, np.ones((1, size)), data, 1) + + with pytest.raises(ValueError): + _ = SmallDB(epsilon, np.ones((1, size)), data, -0.1) + + with pytest.raises(ValueError): + _ = SmallDB(epsilon, np.ones((1, size)), data, 1.1) From 528ce905d1744c40a88aed6281e26ac111aa0213 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 8 Dec 2020 11:01:18 +1100 Subject: [PATCH 104/185] fix args --- relm/mechanisms.py | 18 +++++++++--------- tests/test_mechanisms.py | 27 +++++++++++++++------------ 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 645648b..d4d699c 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -629,11 +629,11 @@ class SmallDB(ReleaseMechanism): Args: epsilon: the privacy parameter - queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) + data: a 1D array of the database in histogram format alpha: the relative error of the mechanism in range [0, 1] """ - def __init__(self, epsilon, queries, data, alpha): + def __init__(self, epsilon, data, alpha): super(SmallDB, self).__init__(epsilon) self.alpha = alpha @@ -644,11 +644,6 @@ def __init__(self, epsilon, queries, data, alpha): if (alpha < 0) or (alpha > 1): raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") - if ((queries != 0) & (queries != 1)).any(): - raise ValueError( - f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" - ) - if not (data >= 0).all(): raise ValueError( f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" @@ -678,7 +673,6 @@ def release(self, queries): Args: queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) - data: a 1D array of the database in histogram format Returns: A numpy array of perturbed values. @@ -686,8 +680,12 @@ def release(self, queries): self._check_valid() - l1_norm = int(len(queries) / (self.alpha ** 2)) + 1 + if ((queries != 0) & (queries != 1)).any(): + raise ValueError( + f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" + ) + l1_norm = int(len(queries) / (self.alpha ** 2)) + 1 answers = queries.dot(self.data) / self.data.sum() # store the indices of 1s of the queries in a flattened vector @@ -702,4 +700,6 @@ def release(self, queries): self.epsilon, l1_norm, len(self.data), sparse_queries, answers, breaks ) + self._is_valid = False + return np.dot(queries, self.db) / self.db.sum() diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 6871c48..bcfa57e 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -231,37 +231,40 @@ def test_SmallDB(): queries = np.vstack([np.random.randint(0, 2, size) for _ in range(3)]) epsilon = 1 - mechanism = SmallDB(epsilon, queries, data, 0.9) + mechanism = SmallDB(epsilon, data, 0.9) errors = abs(queries.dot(data) / data.sum() - mechanism.release(queries)) assert len(mechanism.db) == size assert mechanism.db.sum() == int(len(queries) / (0.9 ** 2)) + 1 epsilon = 1 - mechanism = SmallDB(epsilon, queries, data, 0.001) + mechanism = SmallDB(epsilon, data, 0.001) errors = abs(queries.dot(data) / data.sum() - mechanism.release(queries)) # input validation - _ = SmallDB(epsilon, np.ones((1, size)), data, 0.001) - _ = SmallDB(epsilon, np.zeros((1, size)), data, 0.001) + mechanism = SmallDB(epsilon, data, 0.001) + _ = mechanism.release(np.ones((1, size))) + mechanism = SmallDB(epsilon, data, 0.001) + _ = mechanism.release(np.zeros((1, size))) with pytest.raises(ValueError): - queries = np.ones((1, size)) - queries[0, 2] = -1 - _ = SmallDB(epsilon, queries, data, 0.001) + mechanism = SmallDB(epsilon, data, 0.001) + qs = np.ones((1, size)) + qs[0, 2] = -1 + _ = mechanism.release(qs) with pytest.raises(ValueError): data_copy = data.copy() data_copy[3] = -2 - _ = SmallDB(epsilon, np.ones((1, size)), data_copy, 0.001) + _ = SmallDB(epsilon, data_copy, 0.001) with pytest.raises(TypeError): - _ = SmallDB(epsilon, np.ones((1, size)), data.astype(np.int32), 0.001) + _ = SmallDB(epsilon, data.astype(np.int32), 0.001) with pytest.raises(TypeError): - _ = SmallDB(epsilon, np.ones((1, size)), data, 1) + _ = SmallDB(epsilon, data, 1) with pytest.raises(ValueError): - _ = SmallDB(epsilon, np.ones((1, size)), data, -0.1) + _ = SmallDB(epsilon, data, -0.1) with pytest.raises(ValueError): - _ = SmallDB(epsilon, np.ones((1, size)), data, 1.1) + _ = SmallDB(epsilon, data, 1.1) From 79d9073c7334bf9a1e95b770df8b5e0dda85c1a8 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 8 Dec 2020 11:03:34 +1100 Subject: [PATCH 105/185] return db --- relm/mechanisms.py | 4 ++-- tests/test_mechanisms.py | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index d4d699c..14e50b8 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -696,10 +696,10 @@ def release(self, queries): # store the indices of where each line ends in sparse_queries breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) - self.db = backend.small_db( + db = backend.small_db( self.epsilon, l1_norm, len(self.data), sparse_queries, answers, breaks ) self._is_valid = False - return np.dot(queries, self.db) / self.db.sum() + return db diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index bcfa57e..a75c230 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -232,14 +232,16 @@ def test_SmallDB(): epsilon = 1 mechanism = SmallDB(epsilon, data, 0.9) - errors = abs(queries.dot(data) / data.sum() - mechanism.release(queries)) + db = mechanism.release(queries) + errors = abs(queries.dot(data) / data.sum() - queries.dot(db) / db.sum()) - assert len(mechanism.db) == size - assert mechanism.db.sum() == int(len(queries) / (0.9 ** 2)) + 1 + assert len(db) == size + assert db.sum() == int(len(queries) / (0.9 ** 2)) + 1 epsilon = 1 mechanism = SmallDB(epsilon, data, 0.001) - errors = abs(queries.dot(data) / data.sum() - mechanism.release(queries)) + db = mechanism.release(queries) + errors = abs(queries.dot(data) / data.sum() - queries.dot(db) / db.sum()) # input validation mechanism = SmallDB(epsilon, data, 0.001) From 6c87570d57a794c6b1d2d39cf2bc5e1f880d72c3 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 8 Dec 2020 14:28:24 +1100 Subject: [PATCH 106/185] add statistical test --- tests/test_mechanisms.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index a75c230..8c3bb7d 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -226,22 +226,29 @@ def test_ReportNoisyMax(benchmark): def test_SmallDB(): size = 1000 - data = np.random.randint(0, 10, size) queries = np.vstack([np.random.randint(0, 2, size) for _ in range(3)]) epsilon = 1 - mechanism = SmallDB(epsilon, data, 0.9) - db = mechanism.release(queries) - errors = abs(queries.dot(data) / data.sum() - queries.dot(db) / db.sum()) + alpha = 0.1 + beta = 0.0001 + errors = [] + + for _ in range(10): + mechanism = SmallDB(epsilon, data, alpha) + db = mechanism.release(queries) + errors.append( + abs(queries.dot(data) / data.sum() - queries.dot(db) / db.sum()).max() + ) - assert len(db) == size - assert db.sum() == int(len(queries) / (0.9 ** 2)) + 1 + errors = np.array(errors) - epsilon = 1 - mechanism = SmallDB(epsilon, data, 0.001) - db = mechanism.release(queries) - errors = abs(queries.dot(data) / data.sum() - queries.dot(db) / db.sum()) + x = np.log(len(data)) * np.log(len(queries)) / (alpha ** 2) + np.log(1 / beta) + error_bound = alpha + 2 * x / (epsilon * data.sum()) + + assert (errors < error_bound).all() + assert len(db) == size + assert db.sum() == int(len(queries) / (alpha ** 2)) + 1 # input validation mechanism = SmallDB(epsilon, data, 0.001) From 76568c4f0fb1bda932ead482efeb0d01cb7b267d Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 9 Dec 2020 10:51:51 +1100 Subject: [PATCH 107/185] make mult weights consistent w/ smalldb --- relm/mechanisms.py | 10 +++++----- tests/test_mechanisms.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index 96daf94..c60f31f 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -712,19 +712,19 @@ class MultiplicativeWeights(ReleaseMechanism): Args: epsilon: the privacy parameter to use - error: the error of the mechanism - num_queries: the number of queries answered by the mechanism data: a 1D numpy array of the underlying database + alpha: the relative error of the mechanism + num_queries: the number of queries answered by the mechanism """ - def __init__(self, epsilon, error, num_queries, data): + def __init__(self, epsilon, data, alpha, num_queries): super(MultiplicativeWeights, self).__init__(epsilon) self.data = data self.l1_norm = data.sum() self.data_est = np.ones(len(data)) / len(data) - # normalize error - self.alpha = error / (self.l1_norm * 3) + + self.alpha = alpha self.learning_rate = self.alpha / 2 # solve inequality of Theorem 4.14 (Dwork and Roth) for beta diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 7778912..21a98c9 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -285,7 +285,7 @@ def test_MultiplicativeWeights(): query = np.random.randint(0, 2, 1000) queries = [query] * 20000 - mechanism = MultiplicativeWeights(10000, 100, 20000, data) + mechanism = MultiplicativeWeights(10000, data, 100 / data.sum(), 20000) results = mechanism.release(queries) assert len(results) == len(queries) From f05197a4c5fe30cab4e4420ee68d18dc20ed5acb Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 9 Dec 2020 11:03:41 +1100 Subject: [PATCH 108/185] add input validation --- relm/mechanisms.py | 32 +++++++++++++++++++++++++++++++- tests/test_mechanisms.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index c60f31f..bfcb092 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -638,7 +638,7 @@ def __init__(self, epsilon, data, alpha): super(SmallDB, self).__init__(epsilon) self.alpha = alpha - if not type(alpha) is float: + if not type(alpha) in (float, np.float64): raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") if (alpha < 0) or (alpha > 1): @@ -719,6 +719,36 @@ class MultiplicativeWeights(ReleaseMechanism): def __init__(self, epsilon, data, alpha, num_queries): super(MultiplicativeWeights, self).__init__(epsilon) + + if not type(alpha) in (float, np.float64): + raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") + + if (alpha < 0) or (alpha > 1): + raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") + + if not (data >= 0).all(): + raise ValueError( + f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" + ) + + if data.dtype == np.int64: + data = data.astype(np.uint64) + + if data.dtype != np.uint64: + raise TypeError( + f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" + ) + + if type(num_queries) is not int: + raise TypeError( + f"num_queries: num_queries must be an int. Found {type(num_queries)}" + ) + + if num_queries <= 0: + raise ValueError( + f"num_queries: num_queries must be positive. Found {num_queries}" + ) + self.data = data self.l1_norm = data.sum() diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 21a98c9..469e6d8 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -285,7 +285,11 @@ def test_MultiplicativeWeights(): query = np.random.randint(0, 2, 1000) queries = [query] * 20000 - mechanism = MultiplicativeWeights(10000, data, 100 / data.sum(), 20000) + epsilon = 10000 + num_queries = len(queries) + alpha = 100 / data.sum() + + mechanism = MultiplicativeWeights(epsilon, data, alpha, num_queries) results = mechanism.release(queries) assert len(results) == len(queries) @@ -293,3 +297,29 @@ def test_MultiplicativeWeights(): abs((mechanism.data_est * query).sum() * data.sum() - (data * query).sum()) < 100 ) + + with pytest.raises(ValueError): + data_copy = data.copy() + data_copy[3] = -2 + _ = MultiplicativeWeights(epsilon, data_copy, alpha, num_queries) + + with pytest.raises(TypeError): + _ = MultiplicativeWeights(epsilon, data.astype(np.int32), alpha, num_queries) + + with pytest.raises(TypeError): + _ = MultiplicativeWeights(epsilon, data, 1, num_queries) + + with pytest.raises(ValueError): + _ = MultiplicativeWeights(epsilon, data, -0.1, num_queries) + + with pytest.raises(ValueError): + _ = MultiplicativeWeights(epsilon, data, 1.1, num_queries) + + with pytest.raises(ValueError): + _ = MultiplicativeWeights(epsilon, data, alpha, 0) + + with pytest.raises(ValueError): + _ = MultiplicativeWeights(epsilon, data, alpha, -1) + + with pytest.raises(TypeError): + _ = MultiplicativeWeights(epsilon, data, alpha, float(num_queries)) From e3fd1c50b769e734ef3dd9d01ee5f2121ce9e5e4 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 9 Dec 2020 11:17:20 +1100 Subject: [PATCH 109/185] restructure repo --- relm/mechanisms.py | 705 ------------------------- relm/mechanisms/__init__.py | 4 + relm/mechanisms/base.py | 42 ++ relm/mechanisms/data_perturbation.py | 85 +++ relm/mechanisms/output_perturbation.py | 193 +++++++ relm/mechanisms/selection.py | 148 ++++++ relm/mechanisms/sparse.py | 245 +++++++++ 7 files changed, 717 insertions(+), 705 deletions(-) delete mode 100644 relm/mechanisms.py create mode 100644 relm/mechanisms/__init__.py create mode 100644 relm/mechanisms/base.py create mode 100644 relm/mechanisms/data_perturbation.py create mode 100644 relm/mechanisms/output_perturbation.py create mode 100644 relm/mechanisms/selection.py create mode 100644 relm/mechanisms/sparse.py diff --git a/relm/mechanisms.py b/relm/mechanisms.py deleted file mode 100644 index 14e50b8..0000000 --- a/relm/mechanisms.py +++ /dev/null @@ -1,705 +0,0 @@ -import math -import numpy as np -import secrets -from relm import backend - - -class ReleaseMechanism: - def __init__(self, epsilon): - self.epsilon = epsilon - self._is_valid = True - self.accountant = None - self._id = np.random.randint(low=0, high=2 ** 60) - - def _check_valid(self): - - if not self._is_valid: - raise RuntimeError( - "Mechanism has exhausted has exhausted its privacy budget." - ) - - def _update_accountant(self): - if self.accountant is not None: - self.accountant.update(self) - - def __hash__(self): - return self._id - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy array of the output of a query. - - Returns: - A numpy array of perturbed values. - """ - raise NotImplementedError() - - @property - def privacy_consumed(self): - """ - Computes the privacy budget consumed by the mechanism so far. - """ - raise NotImplementedError() - - -class LaplaceMechanism(ReleaseMechanism): - """ - Secure implementation of the Laplace mechanism. This mechanism can be used once - after which its privacy budget will be exhausted and it can no longer be used. - - Under the hood this mechanism samples exactly from a 64-bit fixed point - Laplace mechanism bit by bit. - - Args: - epsilon: the maximum privacy loss of the mechanism. - sensitivity: the sensitivity of the query to which this mechanism will be applied. - precision: number of fractional bits to use in the internal fixed point representation. - """ - - def __init__(self, epsilon, sensitivity, precision): - super(LaplaceMechanism, self).__init__(epsilon) - self.sensitivity = sensitivity - self.precision = precision - self.effective_epsilon = self.epsilon / ( - self.sensitivity + 2.0 ** -self.precision - ) - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy array of the output of a query. - - Returns: - A numpy array of perturbed values. - """ - - self._check_valid() - self._is_valid = False - self._update_accountant() - args = (values, self.effective_epsilon, self.precision) - return backend.laplace_mechanism(*args) - - @property - def privacy_consumed(self): - """ - Computes the privacy budget consumed by the mechanism so far. - """ - if self._is_valid: - return 0 - else: - return self.epsilon - - -class GeometricMechanism(ReleaseMechanism): - """ - Secure implementation of the Geometric mechanism. This mechanism can be used once - after which its privacy budget will be exhausted and it can no longer be used. - - Args: - epsilon: the maximum privacy loss of the mechanism. - sensitivity: the sensitivity of the query to which this mechanism will be applied. - """ - - def __init__(self, epsilon, sensitivity): - super(GeometricMechanism, self).__init__(epsilon) - self.sensitivity = sensitivity - self.effective_epsilon = self.epsilon / self.sensitivity - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy array of the output of a query. - - Returns: - A numpy array of perturbed values. - """ - self._check_valid() - self._is_valid = False - self._update_accountant() - return backend.geometric_mechanism(values, self.effective_epsilon) - - @property - def privacy_consumed(self): - """ - Computes the privacy budget consumed by the mechanism so far. - """ - if self._is_valid: - return 0 - else: - return self.epsilon - - -class ExponentialMechanism(ReleaseMechanism): - """ - Insecure implementation of the Exponential Mechanism. This mechanism can be used once - after which its privacy budget will be exhausted and it can no longer be used. - - Args: - epsilon: the maximum privacy loss of the mechanism. - utility_function: the utility function. This should accpet an array of values - produced by the query function and return an 1D array of - utilities of the same size as output_range. - sensitivity: the sensitivity of the utility function. - output_range: an array of possible output values for the mechanism. - method: a string that specifies which algorithm will be used to sample - from the output distribution. Currently, three options are supported: - "weighted_index", "gumbel_trick", and "sample_and_flip". - """ - - def __init__( - self, - epsilon, - utility_function, - sensitivity, - output_range, - method="gumbel_trick", - ): - super(ExponentialMechanism, self).__init__(epsilon) - self.utility_function = utility_function - self.sensitivity = sensitivity - self.output_range = output_range - self.method = method - - self.effective_epsilon = self.epsilon / (2.0 * sensitivity) - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy array of the output of a query. - - Returns: - An element of output_range set of the mechanism. - """ - - self._check_valid() - self._is_valid = False - self._update_accountant() - - utilities = self.utility_function(values) - print("########", utilities) - index = self._sampler(utilities) - return self.output_range[index] - - @property - def privacy_consumed(self): - """ - Computes the privacy budget consumed by the mechanism so far. - """ - if self._is_valid: - return 0 - else: - return self.epsilon - - @property - def method(self): - return self._method - - @method.setter - def method(self, value): - if value == "weighted_index": - sampler = lambda utilities: backend.exponential_mechanism_weighted_index( - utilities, self.effective_epsilon - ) - elif value == "gumbel_trick": - sampler = lambda utilities: backend.exponential_mechanism_gumbel_trick( - utilities, self.effective_epsilon - ) - elif value == "sample_and_flip": - sampler = lambda utilities: backend.exponential_mechanism_sample_and_flip( - utilities, self.effective_epsilon - ) - else: - raise ValueError("Sampling method '%s' not supported." % method) - - self._method = value - self._sampler = sampler - - -class PermuteAndFlipMechanism(ReleaseMechanism): - """ - Insecure mplementation of the Permute-And-Flip Mechanism. This mechanism can be used - once after which its privacy budget will be exhausted and it can no longer be used. - - Args: - epsilon: the maximum privacy loss of the mechanism. - utility_function: the utility function. This should accpet an array of values - produced by the query function and return an 1D array of - utilities of the same size as output_range. - sensitivity: the sensitivity of the utility function. - output_range: an array of possible output values for the mechanism. - """ - - def __init__( - self, - epsilon, - utility_function, - sensitivity, - output_range, - ): - super(PermuteAndFlipMechanism, self).__init__(epsilon) - self.utility_function = utility_function - self.sensitivity = sensitivity - self.output_range = output_range - - self.effective_epsilon = self.epsilon / (2.0 * sensitivity) - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy array of the output of a query. - - Returns: - An element of output_range set of the mechanism. - """ - - self._check_valid() - self._is_valid = False - self._update_accountant() - - utilities = self.utility_function(values) - index = backend.permute_and_flip_mechanism(utilities, self.effective_epsilon) - return self.output_range[index] - - @property - def privacy_consumed(self): - """ - Computes the privacy budget consumed by the mechanism so far. - """ - if self._is_valid: - return 0 - else: - return self.epsilon - - -class SparseGeneric(ReleaseMechanism): - def __init__( - self, - epsilon1, - epsilon2, - epsilon3, - sensitivity, - threshold, - cutoff, - monotonic, - precision=35, - ): - epsilon = epsilon1 + epsilon2 + epsilon3 - super(SparseGeneric, self).__init__(epsilon) - - self.epsilon1 = epsilon1 - self.epsilon2 = epsilon2 - self.epsilon3 = epsilon3 - self.sensitivity = sensitivity - self.threshold = threshold - self.cutoff = cutoff - self.monotonic = monotonic - self.precision = precision - self.current_count = 0 - - self.effective_epsilon1 = self.epsilon1 / self.sensitivity - self.effective_epsilon2 = self.epsilon2 / (self.cutoff * self.sensitivity) - if not self.monotonic: - self.effective_epsilon2 /= 2.0 - self.effective_epsilon3 = self.epsilon3 / (self.cutoff * self.sensitivity) - - temp = np.array([self.threshold], dtype=np.float64) - args = (temp, self.effective_epsilon1, self.precision) - self.perturbed_threshold = backend.laplace_mechanism(*args)[0] - - def all_above_threshold(self, values): - return backend.all_above_threshold( - values, self.effective_epsilon2, self.perturbed_threshold, self.precision - ) - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy arrays of query responses. Each element is the response to a different query. - - Returns: - A tuple of numpy arrays containing the perturbed values and the corresponding indices. - """ - self._check_valid() - - remaining = self.cutoff - self.current_count - indices = self.all_above_threshold(values) - indices = indices[:remaining] - self.current_count += len(indices) - - if self.current_count == self.cutoff: - self._is_valid = False - - self._update_accountant() - - if self.epsilon3 > 0: - sliced_values = values[indices] - args = ( - sliced_values, - self.effective_epsilon3, - self.precision, - ) - release_values = backend.laplace_mechanism(*args) - return indices, release_values - else: - return indices - - @property - def privacy_consumed(self): - """ - Computes the privacy budget consumed by the mechanism so far. - """ - if self._is_valid: - return self.epsilon1 + (self.current_count / self.cutoff) * ( - self.epsilon2 + self.epsilon3 - ) - else: - return self.epsilon - - -class SparseNumeric(SparseGeneric): - """ - Secure implementation of the SparseNumeric mechanism. - This mechanism can used repeatedly until `cutoff` positive queries have been answered - after which the mechanism is exhausted and cannot be used. - - Args: - epsilon: the maximum privacy loss of the mechanism. - sensitivity: the sensitivity of the query function - threshold: the threshold to use - cutoff: the number of positive queries that can be answered - e2_weight: the relative amount of the privacy budget to allocate to - perturbing the answers for comparison. If set to None (default) this will be - auto-calculated. - e3_weight: the relative amount of the privacy budget to allocate to - perturbing the answers for release. If set to None (default) this will be - auto-calculated. - monotonic: boolean indicating whether the queries are monotonic. - """ - - def __init__( - self, - epsilon, - sensitivity, - threshold, - cutoff, - e2_weight=None, - e3_weight=None, - monotonic=False, - precision=35, - ): - e1_weight = 1.0 - if e2_weight is None: - if monotonic: - e2_weight = (cutoff) ** (2.0 / 3.0) - else: - e2_weight = (2.0 * cutoff) ** (2.0 / 3.0) - if e3_weight is None: - e3_weight = e1_weight + e2_weight - epsilon_weights = (e1_weight, e2_weight, e3_weight) - total_weight = sum(epsilon_weights) - epsilon1 = (epsilon_weights[0] / total_weight) * epsilon - epsilon2 = (epsilon_weights[1] / total_weight) * epsilon - epsilon3 = (epsilon_weights[2] / total_weight) * epsilon - super(SparseNumeric, self).__init__( - epsilon1, - epsilon2, - epsilon3, - sensitivity, - threshold, - cutoff, - monotonic, - precision, - ) - - -class SparseIndicator(SparseNumeric): - """ - Secure implementation of the SparseIndicator mechanism. - This mechanism can used repeatedly until `cutoff` positive queries have been answered - after which the mechanism is exhausted and cannot be used. - - Args: - epsilon: the maximum privacy loss of the mechanism. - sensitivity: the sensitivity of the query function - threshold: the threshold to use - cutoff: the number of positive queries that can be answered - e2_weight: the relative amount of the privacy budget to allocate to - perturbing the answers for comparison. If set to None (default) this will be - auto-calculated. - monotonic: boolean indicating whether the queries are monotonic. - """ - - def __init__( - self, - epsilon, - sensitivity, - threshold, - cutoff, - e2_weight=None, - monotonic=False, - precision=35, - ): - e3_weight = 0.0 - super(SparseIndicator, self).__init__( - epsilon, - sensitivity, - threshold, - cutoff, - e2_weight, - e3_weight, - monotonic, - precision, - ) - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy arrays of query responses. Each element is the response to a different query. - - Returns: - A tuple of numpy arrays containing the indices of noisy queries above the threshold. - """ - return super(SparseIndicator, self).release(values) - - -class AboveThreshold(SparseIndicator): - """ - Secure implementation of the AboveThreshold mechanism. This returns the index - of the first query above the threshold after which the mechanism will be exhausted. - - Args: - epsilon: the maximum privacy loss of the mechanism. - sensitivity: the sensitivity of the query function - threshold: the threshold to use - e2_weight: the relative amount of the privacy budget to allocate to - perturbing the answers for comparison. If set to None (default) this will be - auto-calculated. - monotonic: boolean indicating whether the queries are monotonic. - """ - - def __init__( - self, - epsilon, - sensitivity, - threshold, - e2_weight=None, - monotonic=False, - precision=35, - ): - cutoff = 1 - super(AboveThreshold, self).__init__( - epsilon, sensitivity, threshold, cutoff, e2_weight, monotonic, precision - ) - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy arrays of query responses. Each element is the response to a different query. - - Returns: - The index of the first noisy query above the threshold. - """ - indices = super(AboveThreshold, self).release(values) - if len(indices) > 0: - index = int(indices[0]) - else: - index = None - return index - - -class SnappingMechanism(ReleaseMechanism): - """ - Secure implementation of the Snapping mechanism. This mechanism can be used once - after which its privacy budget will be exhausted and it can no longer be used. - - Args: - epsilon: the maximum privacy loss of the mechanism. - B: the bound of the range to use for the snapping mechanism. - B should ideally be larger than the range of outputs expected but the larger B is - the less accurate the results. - """ - - def __init__(self, epsilon, B): - lam = (1 + 2 ** (-49) * B) / epsilon - if (B <= lam) or (B >= (2 ** 46 * lam)): - raise ValueError() - self.lam = lam - self.quanta = 2 ** math.ceil(math.log2(self.lam)) - self.B = B - super(SnappingMechanism, self).__init__(epsilon) - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy array of the output of a query. - - Returns: - A numpy array of perturbed values. - """ - self._check_valid() - args = (values, self.B, self.lam, self.quanta) - release_values = backend.snapping(*args) - self._is_valid = False - self._update_accountant() - return release_values - - @property - def privacy_consumed(self): - """ - Computes the privacy budget consumed by the mechanism so far. - """ - if self._is_valid: - return 0 - else: - return self.epsilon - - -class ReportNoisyMax(ReleaseMechanism): - """ - Secure implementation of the ReportNoisyMax mechanism. This mechanism can be used - once after which its privacy budget will be exhausted and it can no longer be used. - - This mechanism adds Laplace noise to each of a set of counting queries and - returns both the index of the largest perturbed value (the argmax) and the - largest perturbed value. - - Args: - epsilon: the maximum privacy loss of the mechanism. - precision: number of fractional bits to use in the internal fixed point representation. - """ - - def __init__(self, epsilon, precision): - super(ReportNoisyMax, self).__init__(epsilon) - self.sensitivity = 1.0 - self.precision = precision - self.effective_epsilon = self.epsilon / self.sensitivity - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy array of the outputs of a collection of counting queries. - - Returns: - A tuple containing the (argmax, max) of the perturbed values. - """ - self._check_valid() - self._is_valid = False - self._update_accountant() - args = (values, self.effective_epsilon, self.precision) - perturbed_values = backend.laplace_mechanism(*args) - valmax = np.max(perturbed_values) - argmax = secrets.choice(np.where(perturbed_values == valmax)[0]) - return (argmax, valmax) - - @property - def privacy_consumed(self): - """ - Computes the privacy budget consumed by the mechanism so far. - """ - if self._is_valid: - return 0 - else: - return self.epsilon - - -class SmallDB(ReleaseMechanism): - """ - A offline Release Mechanism for answering a large number of queries. - - Args: - epsilon: the privacy parameter - data: a 1D array of the database in histogram format - alpha: the relative error of the mechanism in range [0, 1] - """ - - def __init__(self, epsilon, data, alpha): - - super(SmallDB, self).__init__(epsilon) - self.alpha = alpha - - if not type(alpha) is float: - raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") - - if (alpha < 0) or (alpha > 1): - raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") - - if not (data >= 0).all(): - raise ValueError( - f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" - ) - - if data.dtype == np.int64: - data = data.astype(np.uint64) - - if data.dtype != np.uint64: - raise TypeError( - f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" - ) - - self.data = data - self.db = None - - @property - def privacy_consumed(self): - if self._is_valid: - return 0 - else: - return self.epsilon - - def release(self, queries): - """ - Releases differential private responses to queries. - - Args: - queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) - - Returns: - A numpy array of perturbed values. - """ - - self._check_valid() - - if ((queries != 0) & (queries != 1)).any(): - raise ValueError( - f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" - ) - - l1_norm = int(len(queries) / (self.alpha ** 2)) + 1 - answers = queries.dot(self.data) / self.data.sum() - - # store the indices of 1s of the queries in a flattened vector - sparse_queries = np.concatenate( - [np.where(queries[i, :])[0] for i in range(queries.shape[0])] - ).astype(np.uint64) - - # store the indices of where each line ends in sparse_queries - breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) - - db = backend.small_db( - self.epsilon, l1_norm, len(self.data), sparse_queries, answers, breaks - ) - - self._is_valid = False - - return db diff --git a/relm/mechanisms/__init__.py b/relm/mechanisms/__init__.py new file mode 100644 index 0000000..620cbdc --- /dev/null +++ b/relm/mechanisms/__init__.py @@ -0,0 +1,4 @@ +from .sparse import * +from .selection import * +from .output_perturbation import * +from .data_perturbation import * diff --git a/relm/mechanisms/base.py b/relm/mechanisms/base.py new file mode 100644 index 0000000..2cd583d --- /dev/null +++ b/relm/mechanisms/base.py @@ -0,0 +1,42 @@ +import numpy as np + + +class ReleaseMechanism: + def __init__(self, epsilon): + self.epsilon = epsilon + self._is_valid = True + self.accountant = None + self._id = np.random.randint(low=0, high=2 ** 60) + + def _check_valid(self): + + if not self._is_valid: + raise RuntimeError( + "Mechanism has exhausted has exhausted its privacy budget." + ) + + def _update_accountant(self): + if self.accountant is not None: + self.accountant.update(self) + + def __hash__(self): + return self._id + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + + Returns: + A numpy array of perturbed values. + """ + raise NotImplementedError() + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + raise NotImplementedError() diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py new file mode 100644 index 0000000..8aca09a --- /dev/null +++ b/relm/mechanisms/data_perturbation.py @@ -0,0 +1,85 @@ +from .base import ReleaseMechanism +import numpy as np +from relm import backend + + +class SmallDB(ReleaseMechanism): + """ + A offline Release Mechanism for answering a large number of queries. + + Args: + epsilon: the privacy parameter + data: a 1D array of the database in histogram format + alpha: the relative error of the mechanism in range [0, 1] + """ + + def __init__(self, epsilon, data, alpha): + + super(SmallDB, self).__init__(epsilon) + self.alpha = alpha + + if not type(alpha) is float: + raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") + + if (alpha < 0) or (alpha > 1): + raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") + + if not (data >= 0).all(): + raise ValueError( + f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" + ) + + if data.dtype == np.int64: + data = data.astype(np.uint64) + + if data.dtype != np.uint64: + raise TypeError( + f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" + ) + + self.data = data + self.db = None + + @property + def privacy_consumed(self): + if self._is_valid: + return 0 + else: + return self.epsilon + + def release(self, queries): + """ + Releases differential private responses to queries. + + Args: + queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) + + Returns: + A numpy array of perturbed values. + """ + + self._check_valid() + + if ((queries != 0) & (queries != 1)).any(): + raise ValueError( + f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" + ) + + l1_norm = int(len(queries) / (self.alpha ** 2)) + 1 + answers = queries.dot(self.data) / self.data.sum() + + # store the indices of 1s of the queries in a flattened vector + sparse_queries = np.concatenate( + [np.where(queries[i, :])[0] for i in range(queries.shape[0])] + ).astype(np.uint64) + + # store the indices of where each line ends in sparse_queries + breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) + + db = backend.small_db( + self.epsilon, l1_norm, len(self.data), sparse_queries, answers, breaks + ) + + self._is_valid = False + + return db diff --git a/relm/mechanisms/output_perturbation.py b/relm/mechanisms/output_perturbation.py new file mode 100644 index 0000000..b8f4b6d --- /dev/null +++ b/relm/mechanisms/output_perturbation.py @@ -0,0 +1,193 @@ +from .base import ReleaseMechanism +import numpy as np +from relm import backend + + +class LaplaceMechanism(ReleaseMechanism): + """ + Secure implementation of the Laplace mechanism. This mechanism can be used once + after which its privacy budget will be exhausted and it can no longer be used. + + Under the hood this mechanism samples exactly from a 64-bit fixed point + Laplace mechanism bit by bit. + + Args: + epsilon: the maximum privacy loss of the mechanism. + sensitivity: the sensitivity of the query to which this mechanism will be applied. + precision: number of fractional bits to use in the internal fixed point representation. + """ + + def __init__(self, epsilon, sensitivity, precision): + super(LaplaceMechanism, self).__init__(epsilon) + self.sensitivity = sensitivity + self.precision = precision + self.effective_epsilon = self.epsilon / ( + self.sensitivity + 2.0 ** -self.precision + ) + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + + Returns: + A numpy array of perturbed values. + """ + + self._check_valid() + self._is_valid = False + self._update_accountant() + args = (values, self.effective_epsilon, self.precision) + return backend.laplace_mechanism(*args) + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon + + +class GeometricMechanism(ReleaseMechanism): + """ + Secure implementation of the Geometric mechanism. This mechanism can be used once + after which its privacy budget will be exhausted and it can no longer be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + sensitivity: the sensitivity of the query to which this mechanism will be applied. + """ + + def __init__(self, epsilon, sensitivity): + super(GeometricMechanism, self).__init__(epsilon) + self.sensitivity = sensitivity + self.effective_epsilon = self.epsilon / self.sensitivity + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + + Returns: + A numpy array of perturbed values. + """ + self._check_valid() + self._is_valid = False + self._update_accountant() + return backend.geometric_mechanism(values, self.effective_epsilon) + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon + + +class SnappingMechanism(ReleaseMechanism): + """ + Secure implementation of the Snapping mechanism. This mechanism can be used once + after which its privacy budget will be exhausted and it can no longer be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + B: the bound of the range to use for the snapping mechanism. + B should ideally be larger than the range of outputs expected but the larger B is + the less accurate the results. + """ + + def __init__(self, epsilon, B): + lam = (1 + 2 ** (-49) * B) / epsilon + if (B <= lam) or (B >= (2 ** 46 * lam)): + raise ValueError() + self.lam = lam + self.quanta = 2 ** math.ceil(math.log2(self.lam)) + self.B = B + super(SnappingMechanism, self).__init__(epsilon) + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + + Returns: + A numpy array of perturbed values. + """ + self._check_valid() + args = (values, self.B, self.lam, self.quanta) + release_values = backend.snapping(*args) + self._is_valid = False + self._update_accountant() + return release_values + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon + + +class ReportNoisyMax(ReleaseMechanism): + """ + Secure implementation of the ReportNoisyMax mechanism. This mechanism can be used + once after which its privacy budget will be exhausted and it can no longer be used. + + This mechanism adds Laplace noise to each of a set of counting queries and + returns both the index of the largest perturbed value (the argmax) and the + largest perturbed value. + + Args: + epsilon: the maximum privacy loss of the mechanism. + precision: number of fractional bits to use in the internal fixed point representation. + """ + + def __init__(self, epsilon, precision): + super(ReportNoisyMax, self).__init__(epsilon) + self.sensitivity = 1.0 + self.precision = precision + self.effective_epsilon = self.epsilon / self.sensitivity + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the outputs of a collection of counting queries. + + Returns: + A tuple containing the (argmax, max) of the perturbed values. + """ + self._check_valid() + self._is_valid = False + self._update_accountant() + args = (values, self.effective_epsilon, self.precision) + perturbed_values = backend.laplace_mechanism(*args) + valmax = np.max(perturbed_values) + argmax = secrets.choice(np.where(perturbed_values == valmax)[0]) + return (argmax, valmax) + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon diff --git a/relm/mechanisms/selection.py b/relm/mechanisms/selection.py new file mode 100644 index 0000000..44bb0d8 --- /dev/null +++ b/relm/mechanisms/selection.py @@ -0,0 +1,148 @@ +from .base import ReleaseMechanism +from relm import backend + + +class ExponentialMechanism(ReleaseMechanism): + """ + Insecure implementation of the Exponential Mechanism. This mechanism can be used once + after which its privacy budget will be exhausted and it can no longer be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + utility_function: the utility function. This should accpet an array of values + produced by the query function and return an 1D array of + utilities of the same size as output_range. + sensitivity: the sensitivity of the utility function. + output_range: an array of possible output values for the mechanism. + method: a string that specifies which algorithm will be used to sample + from the output distribution. Currently, three options are supported: + "weighted_index", "gumbel_trick", and "sample_and_flip". + """ + + def __init__( + self, + epsilon, + utility_function, + sensitivity, + output_range, + method="gumbel_trick", + ): + super(ExponentialMechanism, self).__init__(epsilon) + self.utility_function = utility_function + self.sensitivity = sensitivity + self.output_range = output_range + self.method = method + + self.effective_epsilon = self.epsilon / (2.0 * sensitivity) + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + + Returns: + An element of output_range set of the mechanism. + """ + + self._check_valid() + self._is_valid = False + self._update_accountant() + + utilities = self.utility_function(values) + print("########", utilities) + index = self._sampler(utilities) + return self.output_range[index] + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon + + @property + def method(self): + return self._method + + @method.setter + def method(self, value): + if value == "weighted_index": + sampler = lambda utilities: backend.exponential_mechanism_weighted_index( + utilities, self.effective_epsilon + ) + elif value == "gumbel_trick": + sampler = lambda utilities: backend.exponential_mechanism_gumbel_trick( + utilities, self.effective_epsilon + ) + elif value == "sample_and_flip": + sampler = lambda utilities: backend.exponential_mechanism_sample_and_flip( + utilities, self.effective_epsilon + ) + else: + raise ValueError("Sampling method '%s' not supported." % method) + + self._method = value + self._sampler = sampler + + +class PermuteAndFlipMechanism(ReleaseMechanism): + """ + Insecure mplementation of the Permute-And-Flip Mechanism. This mechanism can be used + once after which its privacy budget will be exhausted and it can no longer be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + utility_function: the utility function. This should accpet an array of values + produced by the query function and return an 1D array of + utilities of the same size as output_range. + sensitivity: the sensitivity of the utility function. + output_range: an array of possible output values for the mechanism. + """ + + def __init__( + self, + epsilon, + utility_function, + sensitivity, + output_range, + ): + super(PermuteAndFlipMechanism, self).__init__(epsilon) + self.utility_function = utility_function + self.sensitivity = sensitivity + self.output_range = output_range + + self.effective_epsilon = self.epsilon / (2.0 * sensitivity) + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + + Returns: + An element of output_range set of the mechanism. + """ + + self._check_valid() + self._is_valid = False + self._update_accountant() + + utilities = self.utility_function(values) + index = backend.permute_and_flip_mechanism(utilities, self.effective_epsilon) + return self.output_range[index] + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon diff --git a/relm/mechanisms/sparse.py b/relm/mechanisms/sparse.py new file mode 100644 index 0000000..2302bf7 --- /dev/null +++ b/relm/mechanisms/sparse.py @@ -0,0 +1,245 @@ +from .base import ReleaseMechanism +import numpy as np +from relm import backend + + +class SparseGeneric(ReleaseMechanism): + def __init__( + self, + epsilon1, + epsilon2, + epsilon3, + sensitivity, + threshold, + cutoff, + monotonic, + precision=35, + ): + epsilon = epsilon1 + epsilon2 + epsilon3 + super(SparseGeneric, self).__init__(epsilon) + + self.epsilon1 = epsilon1 + self.epsilon2 = epsilon2 + self.epsilon3 = epsilon3 + self.sensitivity = sensitivity + self.threshold = threshold + self.cutoff = cutoff + self.monotonic = monotonic + self.precision = precision + self.current_count = 0 + + self.effective_epsilon1 = self.epsilon1 / self.sensitivity + self.effective_epsilon2 = self.epsilon2 / (self.cutoff * self.sensitivity) + if not self.monotonic: + self.effective_epsilon2 /= 2.0 + self.effective_epsilon3 = self.epsilon3 / (self.cutoff * self.sensitivity) + + temp = np.array([self.threshold], dtype=np.float64) + args = (temp, self.effective_epsilon1, self.precision) + self.perturbed_threshold = backend.laplace_mechanism(*args)[0] + + def all_above_threshold(self, values): + return backend.all_above_threshold( + values, self.effective_epsilon2, self.perturbed_threshold, self.precision + ) + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy arrays of query responses. Each element is the response to a different query. + + Returns: + A tuple of numpy arrays containing the perturbed values and the corresponding indices. + """ + self._check_valid() + + remaining = self.cutoff - self.current_count + indices = self.all_above_threshold(values) + indices = indices[:remaining] + self.current_count += len(indices) + + if self.current_count == self.cutoff: + self._is_valid = False + + self._update_accountant() + + if self.epsilon3 > 0: + sliced_values = values[indices] + args = ( + sliced_values, + self.effective_epsilon3, + self.precision, + ) + release_values = backend.laplace_mechanism(*args) + return indices, release_values + else: + return indices + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return self.epsilon1 + (self.current_count / self.cutoff) * ( + self.epsilon2 + self.epsilon3 + ) + else: + return self.epsilon + + +class SparseNumeric(SparseGeneric): + """ + Secure implementation of the SparseNumeric mechanism. + This mechanism can used repeatedly until `cutoff` positive queries have been answered + after which the mechanism is exhausted and cannot be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + sensitivity: the sensitivity of the query function + threshold: the threshold to use + cutoff: the number of positive queries that can be answered + e2_weight: the relative amount of the privacy budget to allocate to + perturbing the answers for comparison. If set to None (default) this will be + auto-calculated. + e3_weight: the relative amount of the privacy budget to allocate to + perturbing the answers for release. If set to None (default) this will be + auto-calculated. + monotonic: boolean indicating whether the queries are monotonic. + """ + + def __init__( + self, + epsilon, + sensitivity, + threshold, + cutoff, + e2_weight=None, + e3_weight=None, + monotonic=False, + precision=35, + ): + e1_weight = 1.0 + if e2_weight is None: + if monotonic: + e2_weight = (cutoff) ** (2.0 / 3.0) + else: + e2_weight = (2.0 * cutoff) ** (2.0 / 3.0) + if e3_weight is None: + e3_weight = e1_weight + e2_weight + epsilon_weights = (e1_weight, e2_weight, e3_weight) + total_weight = sum(epsilon_weights) + epsilon1 = (epsilon_weights[0] / total_weight) * epsilon + epsilon2 = (epsilon_weights[1] / total_weight) * epsilon + epsilon3 = (epsilon_weights[2] / total_weight) * epsilon + super(SparseNumeric, self).__init__( + epsilon1, + epsilon2, + epsilon3, + sensitivity, + threshold, + cutoff, + monotonic, + precision, + ) + + +class SparseIndicator(SparseNumeric): + """ + Secure implementation of the SparseIndicator mechanism. + This mechanism can used repeatedly until `cutoff` positive queries have been answered + after which the mechanism is exhausted and cannot be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + sensitivity: the sensitivity of the query function + threshold: the threshold to use + cutoff: the number of positive queries that can be answered + e2_weight: the relative amount of the privacy budget to allocate to + perturbing the answers for comparison. If set to None (default) this will be + auto-calculated. + monotonic: boolean indicating whether the queries are monotonic. + """ + + def __init__( + self, + epsilon, + sensitivity, + threshold, + cutoff, + e2_weight=None, + monotonic=False, + precision=35, + ): + e3_weight = 0.0 + super(SparseIndicator, self).__init__( + epsilon, + sensitivity, + threshold, + cutoff, + e2_weight, + e3_weight, + monotonic, + precision, + ) + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy arrays of query responses. Each element is the response to a different query. + + Returns: + A tuple of numpy arrays containing the indices of noisy queries above the threshold. + """ + return super(SparseIndicator, self).release(values) + + +class AboveThreshold(SparseIndicator): + """ + Secure implementation of the AboveThreshold mechanism. This returns the index + of the first query above the threshold after which the mechanism will be exhausted. + + Args: + epsilon: the maximum privacy loss of the mechanism. + sensitivity: the sensitivity of the query function + threshold: the threshold to use + e2_weight: the relative amount of the privacy budget to allocate to + perturbing the answers for comparison. If set to None (default) this will be + auto-calculated. + monotonic: boolean indicating whether the queries are monotonic. + """ + + def __init__( + self, + epsilon, + sensitivity, + threshold, + e2_weight=None, + monotonic=False, + precision=35, + ): + cutoff = 1 + super(AboveThreshold, self).__init__( + epsilon, sensitivity, threshold, cutoff, e2_weight, monotonic, precision + ) + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy arrays of query responses. Each element is the response to a different query. + + Returns: + The index of the first noisy query above the threshold. + """ + indices = super(AboveThreshold, self).release(values) + if len(indices) > 0: + index = int(indices[0]) + else: + index = None + return index From a2308acae16dcae380a6afcb4d3db44332e744db Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 9 Dec 2020 16:14:30 +1100 Subject: [PATCH 110/185] add find_packages --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 84a48e0..2620ebc 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ #!/usr/bin/env python import sys -from setuptools import setup +from setuptools import setup, find_packages try: from setuptools_rust import RustExtension @@ -38,7 +38,7 @@ "Operating System :: POSIX", "Operating System :: MacOS :: MacOS X", ], - packages=["relm"], + packages=find_packages(), rust_extensions=[RustExtension("relm.backend")], install_requires=install_requires, extras_require=extras_requires, From f7cd2310dcc98ccaeec0b59426254c9675c40a1b Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 9 Dec 2020 16:24:17 +1100 Subject: [PATCH 111/185] add secret import back in --- relm/mechanisms/output_perturbation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/relm/mechanisms/output_perturbation.py b/relm/mechanisms/output_perturbation.py index b8f4b6d..74df648 100644 --- a/relm/mechanisms/output_perturbation.py +++ b/relm/mechanisms/output_perturbation.py @@ -1,6 +1,7 @@ from .base import ReleaseMechanism import numpy as np from relm import backend +import secrets class LaplaceMechanism(ReleaseMechanism): From 7c8b9c0d86266060c3e589855524c273c763aa9d Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 9 Dec 2020 16:28:46 +1100 Subject: [PATCH 112/185] add math import back in --- relm/mechanisms/output_perturbation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/relm/mechanisms/output_perturbation.py b/relm/mechanisms/output_perturbation.py index 74df648..aa0c250 100644 --- a/relm/mechanisms/output_perturbation.py +++ b/relm/mechanisms/output_perturbation.py @@ -2,6 +2,7 @@ import numpy as np from relm import backend import secrets +import math class LaplaceMechanism(ReleaseMechanism): From 6e4e5c7a57f997a3f73f8a56dcdf5d6cf0672daa Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 10 Dec 2020 16:42:16 +1100 Subject: [PATCH 113/185] add basic histogram db utils --- relm/histogram.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 relm/histogram.py diff --git a/relm/histogram.py b/relm/histogram.py new file mode 100644 index 0000000..5af9581 --- /dev/null +++ b/relm/histogram.py @@ -0,0 +1,56 @@ +import numpy as np +import pandas as pd + + +class Histogram: + + def __init__(self, df): + self.df = df.copy() + counts = df.groupby(by=list(df.columns[:-1])).count() + + self.df.fillna(-999999, inplace=True) + self.df['dummy'] = np.ones(len(self.df)) + + columns = self.df.columns[:-1] + + self.column_sets = [] + self.column_dict = dict((col, i) for i, col in enumerate(columns)) + self.column_incr = [] + + incr = 1 + for column in columns: + self.column_incr.append(incr) + col_vals = set(pd.unique(self.df[column])) + self.column_sets.append(dict((y, x) for x, y in enumerate(col_vals))) + incr *= len(col_vals) + + idxs = [] + vals = [] + + for row in counts.index: + query = dict(zip(columns, row)) + idxs.append(self.get_idx(query)) + vals.append(counts.loc[row].dummy) + + self.idxs = np.array(idxs) + self.vals = np.array(vals) + + def get_idx(self, query): + idx = 0 + for col, val in query.items(): + i = self.column_dict[col] + idx += self.column_sets[i][val] * self.column_incr[i] + + return idx + + def get_query_vector(self, query): + + idxs = np.array([self.get_idx(query)]) + for i, col in enumerate(self.column_dict.keys()): + if query.get(col, None) is None: + new_idxs = np.arange(len(self.column_sets[i])) * self.column_incr[i] + idxs = idxs[:, None] + new_idxs[None, :] + idxs = idxs.flatten() + + return idxs + From 5b8e3c7fe3c286c8b09029131e70953c79dbdc0b Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 15 Dec 2020 11:14:48 +1100 Subject: [PATCH 114/185] add basic histogram db utils --- relm/histogram.py | 54 +++++++++++++++++++++++++++++++++++++---- setup.py | 3 +-- tests/test_histogram.py | 28 +++++++++++++++++++++ 3 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 tests/test_histogram.py diff --git a/relm/histogram.py b/relm/histogram.py index 5af9581..5ccc642 100644 --- a/relm/histogram.py +++ b/relm/histogram.py @@ -3,15 +3,22 @@ class Histogram: + """ + A class for converting a pandas Dataframe to histogram format as required by + some DP mechanisms. + + Args: + df: the Dataframe of the database + """ def __init__(self, df): - self.df = df.copy() + df = df.copy() counts = df.groupby(by=list(df.columns[:-1])).count() - self.df.fillna(-999999, inplace=True) - self.df['dummy'] = np.ones(len(self.df)) + df.fillna(-999999, inplace=True) + df['dummy'] = np.ones(len(df)) - columns = self.df.columns[:-1] + columns = df.columns[:-1] self.column_sets = [] self.column_dict = dict((col, i) for i, col in enumerate(columns)) @@ -20,7 +27,7 @@ def __init__(self, df): incr = 1 for column in columns: self.column_incr.append(incr) - col_vals = set(pd.unique(self.df[column])) + col_vals = set(pd.unique(df[column])) self.column_sets.append(dict((y, x) for x, y in enumerate(col_vals))) incr *= len(col_vals) @@ -36,6 +43,16 @@ def __init__(self, df): self.vals = np.array(vals) def get_idx(self, query): + """ + Returns the index of the histogram database corresponding to the query. + The query must specify a value for each column of the underlying dataframe. + + Args: + query: a dictionary of column: value pairs specifying the query. + + Returns: + the index of the database histogram corresponding to the query + """ idx = 0 for col, val in query.items(): i = self.column_dict[col] @@ -44,6 +61,15 @@ def get_idx(self, query): return idx def get_query_vector(self, query): + """ + Returns the indices of the histogram database corresponding to the query. + + Args: + query: a dictionary of (column: value) pairs specifying the query. + + Returns: + the indices of the database histogram corresponding to the query + """ idxs = np.array([self.get_idx(query)]) for i, col in enumerate(self.column_dict.keys()): @@ -54,3 +80,21 @@ def get_query_vector(self, query): return idxs +# +# for row in one_day.itertuples(index=False): +# query = dict(zip(columns[:-1], row[:-1])) +# +# num_remove = np.random.randint(1, 3) +# for col in np.random.choice(columns[:-1], size=num_remove, replace=False): +# del query[col] +# +# # ground truth +# mask = np.ones(len(one_day)).astype(bool) +# for col, val in query.items(): +# mask &= one_day[col] == val +# +# # dp style db +# _idxs = get_idxs(query, column_sets, column_incr, column_dict) +# val = vals[np.isin(idxs, _idxs)].sum() +# +# assert mask.sum() == val \ No newline at end of file diff --git a/setup.py b/setup.py index 84a48e0..31392b0 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ from setuptools_rust import RustExtension setup_requires = ["setuptools-rust>=0.10.1", "wheel"] -install_requires = ["numpy>=1.14.5"] +install_requires = ["numpy>=1.14.5", "pandas>=1.0.1"] extras_requires = { "docs": ["Sphinx==3.3.0", "sphinx-rtd-theme==0.5.0"], @@ -24,7 +24,6 @@ "pytest-benchmark==3.2.3", "pytest==6.0.1", "scipy>=1.4.0", - "pandas>=1.0.1", ], } diff --git a/tests/test_histogram.py b/tests/test_histogram.py new file mode 100644 index 0000000..5ef1657 --- /dev/null +++ b/tests/test_histogram.py @@ -0,0 +1,28 @@ +import pandas as pd +import numpy as np +from relm.histogram import Histogram + + +def test_Histogram(): + df = pd.read_csv("examples/pcr_testing_age_group_2020-03-09.csv") + columns = df.columns + + db = Histogram(df) + + for row in df.itertuples(index=False): + query = dict(zip(columns[:-1], row[:-1])) + + num_remove = np.random.randint(1, len(columns)) + for col in np.random.choice(columns[:-1], size=num_remove, replace=False): + del query[col] + + # ground truth + mask = np.ones(len(df)).astype(bool) + for col, val in query.items(): + mask &= df[col] == val + + # dp style db + _idxs = db.get_idxs(query) + val = db.vals[np.isin(db.idxs, _idxs)].sum() + + assert mask.sum() == val From e885b02190d64c61ea1e0776cb50a0344d2178b3 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 15 Dec 2020 11:24:24 +1100 Subject: [PATCH 115/185] review feedback --- relm/mechanisms.py | 16 +++++++++------- tests/test_mechanisms.py | 24 +++++++++++++----------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index bfcb092..b1daaed 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -705,7 +705,7 @@ def release(self, queries): return db -class MultiplicativeWeights(ReleaseMechanism): +class PrivateMultiplicativeWeights(ReleaseMechanism): """ Secure implementation of the private Multiplicative Weights mechanism. This mechanism can be used to answer multiple linear queries. @@ -718,7 +718,7 @@ class MultiplicativeWeights(ReleaseMechanism): """ def __init__(self, epsilon, data, alpha, num_queries): - super(MultiplicativeWeights, self).__init__(epsilon) + super(PrivateMultiplicativeWeights, self).__init__(epsilon) if not type(alpha) in (float, np.float64): raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") @@ -749,9 +749,8 @@ def __init__(self, epsilon, data, alpha, num_queries): f"num_queries: num_queries must be positive. Found {num_queries}" ) - self.data = data - self.l1_norm = data.sum() + self.data = data / self.l1_norm self.data_est = np.ones(len(data)) / len(data) self.alpha = alpha @@ -764,13 +763,16 @@ def __init__(self, epsilon, data, alpha, num_queries): self.beta = np.exp(-self.beta) * 32 * np.log(len(data)) / (self.alpha ** 2) cutoff = 4 * np.log(len(data)) / (self.alpha ** 2) + self.cutoff = int(cutoff) self.threshold = 18 * cutoff / (epsilon * self.l1_norm) self.threshold *= np.log(2 * num_queries) + np.log(4 * cutoff / self.beta) self.threshold *= self.l1_norm - self.cutoff = int(cutoff) self.sparse_numeric = SparseNumeric( - epsilon, sensitivity=1, threshold=self.threshold, cutoff=self.cutoff + epsilon, + sensitivity=(1 / self.l1_norm), + threshold=self.threshold, + cutoff=self.cutoff, ) # this assumes that the l1 norm of the database is public @@ -801,7 +803,7 @@ def release(self, queries): results = [] for query in queries: true_answer = (query * self.data).sum() - est_answer = (query * self.data_est).sum() * self.l1_norm + est_answer = (query * self.data_est).sum() error = true_answer - est_answer errors = np.array([error, -error]) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 469e6d8..27c16a4 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -12,7 +12,7 @@ SparseNumeric, ReportNoisyMax, SmallDB, - MultiplicativeWeights, + PrivateMultiplicativeWeights, ) @@ -280,7 +280,7 @@ def test_SmallDB(): _ = SmallDB(epsilon, data, 1.1) -def test_MultiplicativeWeights(): +def test_PrivateMultiplicativeWeights(): data = np.random.randint(0, 10, 1000) query = np.random.randint(0, 2, 1000) queries = [query] * 20000 @@ -289,7 +289,7 @@ def test_MultiplicativeWeights(): num_queries = len(queries) alpha = 100 / data.sum() - mechanism = MultiplicativeWeights(epsilon, data, alpha, num_queries) + mechanism = PrivateMultiplicativeWeights(epsilon, data, alpha, num_queries) results = mechanism.release(queries) assert len(results) == len(queries) @@ -301,25 +301,27 @@ def test_MultiplicativeWeights(): with pytest.raises(ValueError): data_copy = data.copy() data_copy[3] = -2 - _ = MultiplicativeWeights(epsilon, data_copy, alpha, num_queries) + _ = PrivateMultiplicativeWeights(epsilon, data_copy, alpha, num_queries) with pytest.raises(TypeError): - _ = MultiplicativeWeights(epsilon, data.astype(np.int32), alpha, num_queries) + _ = PrivateMultiplicativeWeights( + epsilon, data.astype(np.int32), alpha, num_queries + ) with pytest.raises(TypeError): - _ = MultiplicativeWeights(epsilon, data, 1, num_queries) + _ = PrivateMultiplicativeWeights(epsilon, data, 1, num_queries) with pytest.raises(ValueError): - _ = MultiplicativeWeights(epsilon, data, -0.1, num_queries) + _ = PrivateMultiplicativeWeights(epsilon, data, -0.1, num_queries) with pytest.raises(ValueError): - _ = MultiplicativeWeights(epsilon, data, 1.1, num_queries) + _ = PrivateMultiplicativeWeights(epsilon, data, 1.1, num_queries) with pytest.raises(ValueError): - _ = MultiplicativeWeights(epsilon, data, alpha, 0) + _ = PrivateMultiplicativeWeights(epsilon, data, alpha, 0) with pytest.raises(ValueError): - _ = MultiplicativeWeights(epsilon, data, alpha, -1) + _ = PrivateMultiplicativeWeights(epsilon, data, alpha, -1) with pytest.raises(TypeError): - _ = MultiplicativeWeights(epsilon, data, alpha, float(num_queries)) + _ = PrivateMultiplicativeWeights(epsilon, data, alpha, float(num_queries)) From bc671f8a4301e38b990668c51456f472ef0bfebf Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 15 Dec 2020 11:41:12 +1100 Subject: [PATCH 116/185] fix erros --- relm/histogram.py | 40 +++++++++++++++------------------------- tests/test_histogram.py | 7 ++++--- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/relm/histogram.py b/relm/histogram.py index 5ccc642..53fbf04 100644 --- a/relm/histogram.py +++ b/relm/histogram.py @@ -13,13 +13,10 @@ class Histogram: def __init__(self, df): df = df.copy() - counts = df.groupby(by=list(df.columns[:-1])).count() - df.fillna(-999999, inplace=True) - df['dummy'] = np.ones(len(df)) - + df["dummy"] = np.ones(len(df)) + counts = df.groupby(by=list(df.columns[:-1])).count() columns = df.columns[:-1] - self.column_sets = [] self.column_dict = dict((col, i) for i, col in enumerate(columns)) self.column_incr = [] @@ -41,6 +38,7 @@ def __init__(self, df): self.idxs = np.array(idxs) self.vals = np.array(vals) + self.size = incr def get_idx(self, query): """ @@ -78,23 +76,15 @@ def get_query_vector(self, query): idxs = idxs[:, None] + new_idxs[None, :] idxs = idxs.flatten() - return idxs - -# -# for row in one_day.itertuples(index=False): -# query = dict(zip(columns[:-1], row[:-1])) -# -# num_remove = np.random.randint(1, 3) -# for col in np.random.choice(columns[:-1], size=num_remove, replace=False): -# del query[col] -# -# # ground truth -# mask = np.ones(len(one_day)).astype(bool) -# for col, val in query.items(): -# mask &= one_day[col] == val -# -# # dp style db -# _idxs = get_idxs(query, column_sets, column_incr, column_dict) -# val = vals[np.isin(idxs, _idxs)].sum() -# -# assert mask.sum() == val \ No newline at end of file + vec = np.zeros(self.size) + vec[idxs] = 1 + return vec + + def get_db(self): + """ + Returns the database in histogram format. + """ + + db = np.zeros(self.size) + db[self.idxs] = self.vals + return db diff --git a/tests/test_histogram.py b/tests/test_histogram.py index 5ef1657..89d9572 100644 --- a/tests/test_histogram.py +++ b/tests/test_histogram.py @@ -7,7 +7,8 @@ def test_Histogram(): df = pd.read_csv("examples/pcr_testing_age_group_2020-03-09.csv") columns = df.columns - db = Histogram(df) + hist = Histogram(df) + db = hist.get_db() for row in df.itertuples(index=False): query = dict(zip(columns[:-1], row[:-1])) @@ -22,7 +23,7 @@ def test_Histogram(): mask &= df[col] == val # dp style db - _idxs = db.get_idxs(query) - val = db.vals[np.isin(db.idxs, _idxs)].sum() + query_vec = hist.get_query_vector(query) + val = (query_vec * db).sum() assert mask.sum() == val From dd3fe4e473ae98a6b59de91062a1dffb79fda6db Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Tue, 15 Dec 2020 11:45:17 +1100 Subject: [PATCH 117/185] made _get_idx non user facing --- relm/histogram.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/relm/histogram.py b/relm/histogram.py index 53fbf04..33818dd 100644 --- a/relm/histogram.py +++ b/relm/histogram.py @@ -33,24 +33,24 @@ def __init__(self, df): for row in counts.index: query = dict(zip(columns, row)) - idxs.append(self.get_idx(query)) + idxs.append(self._get_idx(query)) vals.append(counts.loc[row].dummy) self.idxs = np.array(idxs) self.vals = np.array(vals) self.size = incr - def get_idx(self, query): - """ - Returns the index of the histogram database corresponding to the query. - The query must specify a value for each column of the underlying dataframe. + def _get_idx(self, query): - Args: - query: a dictionary of column: value pairs specifying the query. + # Returns the index of the histogram database corresponding to the query. + # The query must specify a value for each column of the underlying dataframe. + + # Args: + # query: a dictionary of column: value pairs specifying the query. + + # Returns: + # the index of the database histogram corresponding to the query - Returns: - the index of the database histogram corresponding to the query - """ idx = 0 for col, val in query.items(): i = self.column_dict[col] @@ -69,7 +69,7 @@ def get_query_vector(self, query): the indices of the database histogram corresponding to the query """ - idxs = np.array([self.get_idx(query)]) + idxs = np.array([self._get_idx(query)]) for i, col in enumerate(self.column_dict.keys()): if query.get(col, None) is None: new_idxs = np.arange(len(self.column_sets[i])) * self.column_incr[i] From f554de7158d3a57fd2383a85cbaf37022a699201 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Wed, 16 Dec 2020 15:40:11 +1100 Subject: [PATCH 118/185] fix nan filling - all columns have original type --- relm/histogram.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/relm/histogram.py b/relm/histogram.py index 33818dd..36f83d0 100644 --- a/relm/histogram.py +++ b/relm/histogram.py @@ -12,11 +12,16 @@ class Histogram: """ def __init__(self, df): - df = df.copy() - df.fillna(-999999, inplace=True) - df["dummy"] = np.ones(len(df)) - counts = df.groupby(by=list(df.columns[:-1])).count() - columns = df.columns[:-1] + _df = df.fillna(-999999) + for col in df.columns: + mask = _df[col] == -999999 + arr = _df[col].copy() + arr[mask] = arr[mask].astype(df[col].dtype) + _df[col] = arr + + _df["dummy"] = np.ones(len(_df)) + counts = _df.groupby(by=list(_df.columns[:-1])).count() + columns = _df.columns[:-1] self.column_sets = [] self.column_dict = dict((col, i) for i, col in enumerate(columns)) self.column_incr = [] @@ -24,7 +29,7 @@ def __init__(self, df): incr = 1 for column in columns: self.column_incr.append(incr) - col_vals = set(pd.unique(df[column])) + col_vals = set(pd.unique(_df[column])) self.column_sets.append(dict((y, x) for x, y in enumerate(col_vals))) incr *= len(col_vals) From 81c0530d2a129c8f4e752479a08cda10785d2aa2 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 17 Dec 2020 10:32:41 +1100 Subject: [PATCH 119/185] added sparse support for histogram and smalldb queries --- relm/histogram.py | 9 +++++--- relm/mechanisms/data_perturbation.py | 33 ++++++++++++++++++---------- tests/test_mechanisms.py | 30 +++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 15 deletions(-) diff --git a/relm/histogram.py b/relm/histogram.py index 36f83d0..0cc0a24 100644 --- a/relm/histogram.py +++ b/relm/histogram.py @@ -1,5 +1,6 @@ import numpy as np import pandas as pd +import scipy.sparse as sps class Histogram: @@ -81,8 +82,10 @@ def get_query_vector(self, query): idxs = idxs[:, None] + new_idxs[None, :] idxs = idxs.flatten() - vec = np.zeros(self.size) - vec[idxs] = 1 + rows = np.zeros_like(idxs) + vals = np.ones_like(idxs) + + vec = sps.csr_matrix((vals, (rows, idxs)), shape=(1, self.size)) return vec def get_db(self): @@ -90,6 +93,6 @@ def get_db(self): Returns the database in histogram format. """ - db = np.zeros(self.size) + db = np.zeros(self.size, dtype=np.uint64) db[self.idxs] = self.vals return db diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index 8aca09a..56be452 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -1,6 +1,7 @@ from .base import ReleaseMechanism import numpy as np from relm import backend +import scipy.sparse as sps class SmallDB(ReleaseMechanism): @@ -60,21 +61,29 @@ def release(self, queries): self._check_valid() - if ((queries != 0) & (queries != 1)).any(): - raise ValueError( - f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" - ) - - l1_norm = int(len(queries) / (self.alpha ** 2)) + 1 + l1_norm = int(queries.shape[0] / (self.alpha ** 2)) + 1 answers = queries.dot(self.data) / self.data.sum() - # store the indices of 1s of the queries in a flattened vector - sparse_queries = np.concatenate( - [np.where(queries[i, :])[0] for i in range(queries.shape[0])] - ).astype(np.uint64) + error_str = ( + f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" + ) + + if type(queries) is sps.csr.csr_matrix: + if ((queries.data != 0) & (queries.data != 1)).any(): + raise ValueError(error_str) + sparse_queries = queries.indices.astype(np.uint64) + breaks = queries.indptr[1:].astype(np.uint64) - # store the indices of where each line ends in sparse_queries - breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) + else: + if ((queries != 0) & (queries != 1)).any(): + raise ValueError(error_str) + # store the indices of 1s of the queries in a flattened vector + sparse_queries = np.concatenate( + [np.where(queries[i, :])[0] for i in range(queries.shape[0])] + ).astype(np.uint64) + + # store the indices of where each line ends in sparse_queries + breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) db = backend.small_db( self.epsilon, l1_norm, len(self.data), sparse_queries, answers, breaks diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 8c3bb7d..2e2f538 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -1,4 +1,5 @@ import numpy as np +import scipy import scipy.stats import pytest from relm.mechanisms import ( @@ -277,3 +278,32 @@ def test_SmallDB(): with pytest.raises(ValueError): _ = SmallDB(epsilon, data, 1.1) + + +def test_SmallDB_sparse(): + + size = 1000 + data = np.random.randint(0, 10, size) + queries = np.vstack([np.random.randint(0, 2, size) for _ in range(3)]) + queries = scipy.sparse.csr_matrix(queries) + + epsilon = 1 + alpha = 0.1 + beta = 0.0001 + errors = [] + + for _ in range(10): + mechanism = SmallDB(epsilon, data, alpha) + db = mechanism.release(queries) + errors.append( + abs(queries.dot(data) / data.sum() - queries.dot(db) / db.sum()).max() + ) + + errors = np.array(errors) + + x = np.log(len(data)) * np.log(queries.shape[0]) / (alpha ** 2) + np.log(1 / beta) + error_bound = alpha + 2 * x / (epsilon * data.sum()) + + assert (errors < error_bound).all() + assert len(db) == size + assert db.sum() == int(queries.shape[0] / (alpha ** 2)) + 1 From 0a3837c96e27adcbebe1f803ae81bab1208021f7 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Thu, 17 Dec 2020 11:52:41 +1100 Subject: [PATCH 120/185] threshold calc fix --- relm/mechanisms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index b1daaed..f73d9a5 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -758,7 +758,7 @@ def __init__(self, epsilon, data, alpha, num_queries): # solve inequality of Theorem 4.14 (Dwork and Roth) for beta self.beta = epsilon * self.l1_norm * self.alpha ** 3 - self.beta /= 32 * np.log(len(data)) + self.beta /= 36 * np.log(len(data)) self.beta -= np.log(num_queries) self.beta = np.exp(-self.beta) * 32 * np.log(len(data)) / (self.alpha ** 2) From 74398c635b9bc8c21a086a9f21722d6e5d1af6ef Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Fri, 18 Dec 2020 10:28:35 +1100 Subject: [PATCH 121/185] remove threshold unormalization --- relm/mechanisms.py | 1 - 1 file changed, 1 deletion(-) diff --git a/relm/mechanisms.py b/relm/mechanisms.py index f73d9a5..d7302ac 100644 --- a/relm/mechanisms.py +++ b/relm/mechanisms.py @@ -766,7 +766,6 @@ def __init__(self, epsilon, data, alpha, num_queries): self.cutoff = int(cutoff) self.threshold = 18 * cutoff / (epsilon * self.l1_norm) self.threshold *= np.log(2 * num_queries) + np.log(4 * cutoff / self.beta) - self.threshold *= self.l1_norm self.sparse_numeric = SparseNumeric( epsilon, From 34c6cc4c1951466d45cbd334040d280a263433d0 Mon Sep 17 00:00:00 2001 From: kieranricardo Date: Fri, 18 Dec 2020 16:44:31 +1100 Subject: [PATCH 122/185] added sparse support for multiplicative weights --- relm/mechanisms/data_perturbation.py | 163 +++++++++++++++++++++++---- tests/test_mechanisms.py | 18 +++ 2 files changed, 161 insertions(+), 20 deletions(-) diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index 56be452..4b42642 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -2,6 +2,7 @@ import numpy as np from relm import backend import scipy.sparse as sps +from relm.mechanisms import SparseNumeric class SmallDB(ReleaseMechanism): @@ -64,26 +65,7 @@ def release(self, queries): l1_norm = int(queries.shape[0] / (self.alpha ** 2)) + 1 answers = queries.dot(self.data) / self.data.sum() - error_str = ( - f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" - ) - - if type(queries) is sps.csr.csr_matrix: - if ((queries.data != 0) & (queries.data != 1)).any(): - raise ValueError(error_str) - sparse_queries = queries.indices.astype(np.uint64) - breaks = queries.indptr[1:].astype(np.uint64) - - else: - if ((queries != 0) & (queries != 1)).any(): - raise ValueError(error_str) - # store the indices of 1s of the queries in a flattened vector - sparse_queries = np.concatenate( - [np.where(queries[i, :])[0] for i in range(queries.shape[0])] - ).astype(np.uint64) - - # store the indices of where each line ends in sparse_queries - breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) + sparse_queries, breaks = _process_queries(queries) db = backend.small_db( self.epsilon, l1_norm, len(self.data), sparse_queries, answers, breaks @@ -92,3 +74,144 @@ def release(self, queries): self._is_valid = False return db + + +class PrivateMultiplicativeWeights(ReleaseMechanism): + """ + Secure implementation of the private Multiplicative Weights mechanism. + This mechanism can be used to answer multiple linear queries. + + Args: + epsilon: the privacy parameter to use + data: a 1D numpy array of the underlying database + alpha: the relative error of the mechanism + num_queries: the number of queries answered by the mechanism + """ + + def __init__(self, epsilon, data, alpha, num_queries): + super(PrivateMultiplicativeWeights, self).__init__(epsilon) + + if not type(alpha) in (float, np.float64): + raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") + + if (alpha < 0) or (alpha > 1): + raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") + + if not (data >= 0).all(): + raise ValueError( + f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" + ) + + if data.dtype == np.int64: + data = data.astype(np.uint64) + + if data.dtype != np.uint64: + raise TypeError( + f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" + ) + + if type(num_queries) is not int: + raise TypeError( + f"num_queries: num_queries must be an int. Found {type(num_queries)}" + ) + + if num_queries <= 0: + raise ValueError( + f"num_queries: num_queries must be positive. Found {num_queries}" + ) + + self.l1_norm = data.sum() + self.data = data / self.l1_norm + self.data_est = np.ones(len(data)) / len(data) + + self.alpha = alpha + self.learning_rate = self.alpha / 2 + + # solve inequality of Theorem 4.14 (Dwork and Roth) for beta + self.beta = epsilon * self.l1_norm * self.alpha ** 3 + self.beta /= 36 * np.log(len(data)) + self.beta -= np.log(num_queries) + self.beta = np.exp(-self.beta) * 32 * np.log(len(data)) / (self.alpha ** 2) + + cutoff = 4 * np.log(len(data)) / (self.alpha ** 2) + self.cutoff = int(cutoff) + self.threshold = 18 * cutoff / (epsilon * self.l1_norm) + self.threshold *= np.log(2 * num_queries) + np.log(4 * cutoff / self.beta) + + self.sparse_numeric = SparseNumeric( + epsilon, + sensitivity=(1 / self.l1_norm), + threshold=self.threshold, + cutoff=self.cutoff, + ) + + # this assumes that the l1 norm of the database is public + + @property + def privacy_consumed(self): + return self.sparse_numeric.privacy_consumed + + def update_weights(self, est_answer, noisy_answer, query): + if noisy_answer < est_answer: + r = query + else: + r = 1 - query + + self.data_est *= np.exp(-r * self.learning_rate) + self.data_est /= self.data_est.sum() + + def release(self, queries): + """ + Returns private answers to the queries. + + Args: + queries: a list of queries as 1D 1/0 indicator numpy arrays + Returns: + a numpy array of the private query responses + """ + + results = [] + for query in queries: + if type(query) is sps.csr.csr_matrix: + query = np.asarray(query.todense()).flatten() + + true_answer = (query * self.data).sum() + est_answer = (query * self.data_est).sum() + + error = true_answer - est_answer + errors = np.array([error, -error]) + indices, release_values = self.sparse_numeric.release(errors) + + if len(indices) == 0: + results.append(est_answer) + else: + noisy_answer = est_answer + (1 - 2 * indices[0]) * release_values[0] + results.append(noisy_answer) + self.update_weights(est_answer, noisy_answer, query) + + return np.array(results) + + +def _process_queries(queries): + error_str = ( + f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" + ) + + if type(queries) is sps.csr.csr_matrix: + if ((queries.data != 0) & (queries.data != 1)).any(): + raise ValueError(error_str) + sparse_queries = queries.indices.astype(np.uint64) + breaks = queries.indptr[1:].astype(np.uint64) + + else: + if ((queries != 0) & (queries != 1)).any(): + raise ValueError(error_str) + # store the indices of 1s of the queries in a flattened vector + sparse_queries = np.concatenate( + [np.where(queries[i, :])[0] for i in range(queries.shape[0])] + ).astype(np.uint64) + + # store the indices of where each line ends in sparse_queries + breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) + + return sparse_queries, breaks diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 6a960c3..087a4a6 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -311,9 +311,11 @@ def test_SmallDB_sparse(): def test_PrivateMultiplicativeWeights(): + data = np.random.randint(0, 10, 1000) query = np.random.randint(0, 2, 1000) queries = [query] * 20000 + queries = np.vstack(queries) epsilon = 10000 num_queries = len(queries) @@ -355,3 +357,19 @@ def test_PrivateMultiplicativeWeights(): with pytest.raises(TypeError): _ = PrivateMultiplicativeWeights(epsilon, data, alpha, float(num_queries)) + + +def test_PrivateMultiplicativeWeights_sparse(): + + data = np.random.randint(0, 10, 1000) + query = np.random.randint(0, 2, 1000) + queries = [query] * 200 + queries = np.vstack(queries) + queries = scipy.sparse.csr_matrix(queries) + + epsilon = 10000 + num_queries = queries.shape[0] + alpha = 100 / data.sum() + + mechanism = PrivateMultiplicativeWeights(epsilon, data, alpha, num_queries) + _ = mechanism.release(queries) From e2c5a938a8c96207eaba23b559c92d9fd502bb65 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 14 Jan 2021 15:46:09 +1100 Subject: [PATCH 123/185] Added a jupyter-notebook usage tutorial --- relm_demo.ipynb | 657 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 657 insertions(+) create mode 100644 relm_demo.ipynb diff --git a/relm_demo.ipynb b/relm_demo.ipynb new file mode 100644 index 0000000..24854a5 --- /dev/null +++ b/relm_demo.ipynb @@ -0,0 +1,657 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Histogram Queries\n", + "Using RelM for basic differentially private release is fairly striaghtforward.\n", + "For example, suppose that the database consists of records indicating the age group of each patient who received a COVID-19 test on 09 March, 2020.\n", + "Each patient is classified as belonging to one of eight age groups: 0-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, and 70+.\n", + "One common way to summarise this kind of data is with a histogram.\n", + "That is, to report the number of patients that were classified as belonging to each age group.\n", + "\n", + "The Laplace mechanism can be used to produce a differentially private histogram that summarises the data without compromising the privacy of the patients whose data comprise the database. To do so, Laplace noise is added to the count for each age group and the noisy counts are released instead of the exact counts." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Basic Usage\n", + "To produce such a differentially private histogram using Relm a user would:\n", + " - Read the raw data\n", + " - Compute the exact query responses\n", + " - Create a differentially private release mechanism\n", + " - Compute perturbed query responses" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from collections import Counter\n", + "from tabulate import tabulate" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Read the raw data\n", + "data = pd.read_csv(\"examples/pcr_testing_age_group_2020-03-09.csv\")\n", + "\n", + "# Compute the exact query responses\n", + "exact_counts = data[\"age_group\"].value_counts().sort_index()\n", + "values = exact_counts.values" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a differentially private release mechanism\n", + "from relm.mechanisms import LaplaceMechanism\n", + "mechanism = LaplaceMechanism(epsilon=0.1, sensitivity=1.0, precision=35)\n", + "\n", + "# Compute perturbed query response\n", + "perturbed_counts = mechanism.release(values=values.astype(np.float))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualising the Results\n", + "Notice that the magnitude of the differences between the exact counts and perturbed counts depends only on the value of the privacy paramter `epsilon`. Smaller values of epsilon yield larger perturbations. Larger perturbations yeild lower utility.\n", + "\n", + "A simple way to try to understand this effect is to compare the two histograms to one another. If the value of `epsilon` is not too small, then we expect that the two histograms will look similar." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "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", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238235.137868
110-19386396.126739
220-29688697.949542
330-39779773.883889
440-49621617.471460
550-59582584.219098
660-69344298.745236
770+261299.241292
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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T7J58+aMJ/cePXrUueSugcMkXiY0T+8hWbVx40aOO+44PvjgAwAuueQS7r//fgB++MMfkp+fT/fu3bnppl0dAm+99Rbf/OY3OfHEE+nTpw8bN25k/PjxFBYWkpeXR2Fh4W77uPfeeykoKODUU08Fon7pCy+8kLZt27Ju3TrOPfdcevbsSd++fVm4cCEAEyZMYNKkSRXb6NGjByUlJZSUlNC1a1euvvpqunfvzqBBg9i6dSszZ86kqKiISy+9lLy8PLZu3crYsWPp1q0bPXv2ZMyYMRys1HIXkVrZunUreXl5FfPjxo3j4osv5p577uHyyy/nJz/5CevXr+fqq68G4LbbbuPwww9nx44dDBw4kIULF3L88cdz8cUXU1hYSO/evdm0aRNNmjThlltuoaioiHvuuWeP/S5atIiCgoI9ygFuuukmTjrpJJ5++mlee+01Ro4cWe2vi6VLl/LYY49x//33c9FFF/Hkk09y2WWXcc899zBp0iTy8/NZt24ds2bN4v3338fM2LBhQy3euexScheRWqmqW+bb3/42TzzxBNdeey0LFiyoKH/88ceZOnUq5eXlrFixgvfeew8zo127dvTu3RuAZs2a1SqmN954gyefjO5nPmDAANauXcvGjXu/rWvnzp0rvqROPvlkSkpK9qjTrFkzcnJyuOqqqxg6dCjnnHNOreLMJnXLiEhW7Ny5kyVLltC4cWPWrYsudfnkk0+YNGkSs2fPZuHChQwdOpRt27bh7jU+3a979+7Mn1/5Xt2RVGdfmxkNGjRg586dFWXJ544fcsghFdP169envHzPe6c3aNCAefPmccEFF/D0008zePDgGsW8Pym5i0hWTJ48ma5du/LYY49x5ZVXsn37djZt2sShhx5K8+bNWbVqFS+++CIAxx9/PGVlZbz11lsAbN68mfLycg477DA2b96ccvvXXXcd06ZNY+7cuRVljzzyCCtXrqRfv348+uijALz++uscccQRNGvWjNzcXN5++20A3n77bT755JNqX0dyDF988QUbN25kyJAhTJkyJWsHkjNB3TIiMXIgzhaq3Oc+ePBgrrzySh544AHmzZvHYYcdRr9+/bj11lu5+eabOemkk+jevTtHH300p512GgCNGjWisLCQH/3oR2zdupXGjRvz6quv0r9/fyZOnEheXl5FX35C27ZtmTFjBmPGjGH16tXU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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Extract the set of possible age groups\n", + "age_groups = np.sort(data[\"age_group\"].unique())\n", + "# Reformat the age group names for nicer display\n", + "age_ranges = np.array([a.lstrip(\"AgeGroup_\") for a in age_groups])\n", + "\n", + "# Create a dataframe with both exact and perturbed counts\n", + "df = pd.DataFrame(\n", + " {\n", + " \"Age Group\": age_ranges,\n", + " \"Exact Counts\": values,\n", + " \"Perturbed Counts\": perturbed_counts,\n", + " }\n", + ")\n", + "\n", + "# Display the two histograms as a table\n", + "display(df.style.set_caption(\"Test Counts by Age Group\"))\n", + "\n", + "# Plot the two histograms as bar graphs\n", + "df.plot(x=\"Age Group\", title=\"Test Counts by Age Group\", kind=\"bar\", rot=0)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integer Counts\n", + "In this example, all of the exact counts are integers. That is because they are the result of so-called counting queries. The perturbed counts produced by the Laplace mechanism are real-valued. In some applications, e.g. when some downstream processing assumes it will receive integer-valued data, we may need the perturbed counts to be integers. One way to achieve this is by simply rounding the outputs of the Laplace mechanism to the nearest integer. Because this differentially private release mechanisms are not affected by this kind of post-processing, doing so will not affect any privacy guarantees.\n", + "\n", + "Alternatively, we could use the geometric mechanism to compute the permuted counts. The geometric mechanism is simply a discrete version of the Laplace mechanism and it produces integer valued perturbations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Basic Usage\n", + "As before, to produce such a differentially private histogram using Relm a user would:\n", + " - Read the raw data\n", + " - Compute the exact query responses\n", + " - Create a differentially private release mechanism\n", + " - Compute perturbed query responses" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a differentially private release mechanism\n", + "from relm.mechanisms import GeometricMechanism\n", + "mechanism = GeometricMechanism(epsilon=0.1, sensitivity=1.0)\n", + "\n", + "# Compute perturbed query response\n", + "perturbed_counts = mechanism.release(values=values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualising the Results\n", + "As with the Laplace mechanism, we can plot the exact histogram alongside the differentially private histogram to get an idea if we have used too small a value for `epsilon`." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238243
110-19386382
220-29688683
330-39779759
440-49621616
550-59582592
660-69344290
770+261252
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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zqZNmzKe3Lt161brkrsGDhORjNuwYQNHHXUU77//PgAXXHAB9913HwA//vGPyc/Pp2vXrtx4484Ogblz5/Ld736XY489ll69erFhwwbGjRtHYWEheXl5FBYW7rKP3/3udxQUFHDiiScCUb/0ueeeS+vWrVm7di1nnnkm3bt3p3fv3ixYsACAm266iQkTJpRvo1u3bixbtoxly5bRuXNnrrjiCrp27crAgQPZsmULM2bMoKioiAsvvJC8vDy2bNnCmDFj6NKlC927d2f06NHsr9RyF5Ea2bJlC3l5eeXzY8eO5fzzz+eee+7hkksu4Wc/+xnr1q3jiiuuAOC2227j4IMPZvv27fTv358FCxZw9NFHc/7551NYWEjPnj3ZuHEjjRo14pZbbqGoqIh77rlnt/0uXLiQgoKC3coBbrzxRo477jiefPJJXnnlFUaMGJHy18WSJUt45JFHuO+++zjvvPN4/PHHueiii7jnnnuYMGEC+fn5rF27lpkzZ/Lee+9hZqxfv74G71x2KbmLSI1U1i3z/e9/n8cee4yrrrqK+fPnl5c/+uijTJ48mW3btrFixQreffddzIw2bdrQs2dPAJo0aVKjmF577TUefzy6n3m/fv1Ys2YNGzbs+bauHTt2LP+SOv7441m2bNludZo0aUJOTg6XX345Q4YM4fTTT69RnNmkbhkRyYodO3awePFiGjZsyNq10aUuH3/8MRMmTGDWrFksWLCAIUOGsHXrVty9yqf7de3alXnzKt6rO5Ls7Gszo169euzYsaO8LPHc8QMOOKB8um7dumzbtvu90+vVq8ecOXM455xzePLJJxk0aFCVYt6b1HKXeLmpaZr19tyKk5qbOHEinTt35vbbb+eyyy7j9ddfZ+PGjRx44IE0bdqUlStX8vzzz3Pqqady9NFHU1payty5c+nZsyebNm2iYcOGHHTQQWzatCnp9q+++mp69erFkCFDOOGEEwB4+OGHGTBgAH369GHatGnccMMNvPrqqxxyyCE0adKE3NxcnnnmGQDeeustPv7445SvIzGGL7/8ks2bNzN48GB69+7NEUcckaF3K/OU3EViZF+cLVSxz33QoEFcdtll3H///cyZM4eDDjqIPn36cOutt3LzzTdz3HHH0bVrVw4//HBOOukkABo0aEBhYSE/+clP2LJlCw0bNuTll1+mb9++jB8/nry8vPK+/DKtW7dm+vTpjB49mlWrVlGnTh369OnD2WefzU033cSll15K9+7dadSoEVOmRGMZnnPOOUydOpW8vDx69uzJkUcemfL1XXLJJVx55ZU0bNiQ559/nqFDh5b/2pg4cWKG383M2S/uoZqfn++6WYdUpkqnQuakec/qmLTcFy9eTOfOnfd1GLIXJPuszWyeu+cnq68+dxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRhSchcRiSGd5y4SJ+lexJX29lKfMlo25O+2bdvo3LkzU6ZMqdKojJMmTWLUqFFVHsnxpptuonHjxtUevGtP60+dOpW77roLd8fdueyyyzI+SNjtt9/OL37xi4xuM5Fa7iJSI2VjyyxcuJAGDRrw+9//Pu11t2/fzqRJk9i8eXOV9plsaIBMef7555k0aRIvvvgiixYt4q233qJp0wx/aRIl92xScheRjDnllFNYunQpEA0F0KtXL/Ly8vjRj37E9u3bAWjcuDHjxo3jhBNO4LbbbqO0tJS+ffvSt2/f8uVlZsyYwSWXXAJEV4pec8019O3bl+uvvx6A+fPn069fPzp16lQ+pDDAr3/9a3r27En37t13GVb4tttu46ijjmLAgAHlwxFXdMcddzBhwoTy8dtzcnLKR7QsLi6md+/edO/enbPOOot169YBcOqpp1J2IeYXX3xBbm4uEI0Ff/bZZzNo0CA6derEddddB8CYMWPKr+y98MIL+eqrrxgyZAjHHnss3bp122144+pQcheRjNi2bRvPP/88xxxzDIsXL6awsJB//OMfFBcXU7duXaZNmwbAV199Rbdu3XjzzTcZN24cbdu2Zfbs2cyePTvlPj744ANefvllfvOb3wCwYMECnn32WV5//XVuueUWSktLefHFF1myZAlz5syhuLiYefPm8be//Y158+Yxffp03n77bZ544gnmzp2bdB8LFy7k+OOPT7psxIgR3HnnnSxYsIBjjjmGm2++OWXMxcXFFBYW8s4771BYWMjy5csZP358+S+eadOm8cILL9C2bVvmz5/PwoULMzIgWco+dzM7Ckj8GjkcGAdMDeW5wDLgPHdfF26i/VtgMLAZuMTd36pxpCKyX0ocW+aUU05h5MiRTJ48mXnz5pUP4btlyxZatWoFRH3055xzTrX2NWzYMOrWrVs+P3ToUBo2bEjDhg3p27cvc+bM4bXX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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Extract the set of possible age groups\n", + "age_groups = np.sort(data[\"age_group\"].unique())\n", + "# Reformat the age group names for nicer display\n", + "age_ranges = np.array([a.lstrip(\"AgeGroup_\") for a in age_groups])\n", + "\n", + "# Create a dataframe with both exact and perturbed counts\n", + "df = pd.DataFrame(\n", + " {\n", + " \"Age Group\": age_ranges,\n", + " \"Exact Counts\": values,\n", + " \"Perturbed Counts\": perturbed_counts,\n", + " }\n", + ")\n", + "\n", + "# Display the two histograms as a table\n", + "display(df.style.set_caption(\"Test Counts by Age Group\"))\n", + "\n", + "# Plot the two histograms as bar graphs\n", + "df.plot(x=\"Age Group\", title=\"Test Counts by Age Group\", kind=\"bar\", rot=0)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sparse Mechanisms\n", + "We have three mechanisms that take advantage of sparsity to answer more queries about the data for a given privacy budget. All of these mechanisms compare noisy query responses to a noisy threshold value. If a noisy response does not exceed the noisy threshold, then the mechanism reports only that the value did not exceed the threshold. Otherwise, the mechanism reports that the value exceeded the threshold. Furthermore, in the latter case some mechanisms release more information about the underlying exact count. This extra information is computed using some other differentially private mechanism and therefore imposes some additional privacy costs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Wrangling\n", + "All three of our mechanims share an input format. We require a sequence of exact query responses and a threshold value to which these responses will be compared." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Read the raw data\n", + "fp = 'examples/20200811_QLD_dummy_dataset_individual_v2.xlsx'\n", + "data = pd.read_excel(fp)\n", + "\n", + "# Limit our attention to the onset date column\n", + "data.drop(list(data.columns[1:]), axis=1, inplace=True) \n", + "\n", + "# Remove data with no onset date listed\n", + "mask = data['ONSET_DATE'].notna()\n", + "data = data[mask]\n", + "\n", + "# Compute the exact query responses\n", + "queries = [(pd.Timestamp('2020-01-01') + i*pd.Timedelta('1d'),) for i in range(366)]\n", + "exact_counts = dict.fromkeys(queries, 0)\n", + "exact_counts.update(data.value_counts())\n", + "\n", + "dates, values = zip(*sorted(exact_counts.items()))\n", + "values = np.array(values, dtype=np.float64)\n", + "\n", + "# Set the threshold value\n", + "threshold = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Above Threshold\n", + "The simplest of the sparse release mechanisms simply reports the index of the first query response that exceeds the specified threshold." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Basic Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "from relm.mechanisms import AboveThreshold\n", + "mechanism = AboveThreshold(epsilon=1.0, sensitivity=1.0, threshold=threshold)\n", + "index = mechanism.release(values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Empirical Distribution\n", + "Because `AboveThreshold` returns a single index, we can run many experiments and plot a histogram of the results of those experiments to get an empirical estimate of the distribution of the mechanism's output." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "TRIALS = 2**10\n", + "results = np.zeros(TRIALS)\n", + "for i in range(TRIALS):\n", + " mechanism = AboveThreshold(epsilon=1.0, sensitivity=1.0, threshold=threshold)\n", + " index = mechanism.release(values)\n", + " results[i] = index " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Visualising the Results" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The index of the first exact count that exceeds the threshold is: 105\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "print(\"The index of the first exact count that exceeds the threshold is: %i\\n\" % np.argmax(values >= threshold))\n", + "\n", + "histogram = dict.fromkeys(np.arange(min(results), max(results)), 0)\n", + "histogram.update(Counter(results))\n", + "\n", + "plt.xlabel(\"Index\")\n", + "plt.ylabel(\"Count\")\n", + "plt.title(\"Distribution of above_threshold.release(values)\")\n", + "plt.plot(list(histogram.keys()), list(histogram.values()))\n", + "plt.axvline(x=np.argmax(values >= threshold), color='orange')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sparse Indicator\n", + "The `SparseIndicator` is a straightforward extension of the `AboveThreshold` mechanism. Here, we find the indices of several values that exceeds the specified threshold. The number of indices that this mechanism will return is controlled by the `cutoff` parameter." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Basic Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "from relm.mechanisms import SparseIndicator\n", + "mechanism = SparseIndicator(epsilon=1.0, sensitivity=1.0, threshold=100, cutoff=3)\n", + "indices = mechanism.release(values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Visualise the Results" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- --- ---\n", + "103 105 106\n", + "101 105 106\n", + "101 105 106\n", + "102 105 106\n", + "105 106 109\n", + " 99 101 102\n", + "101 102 105\n", + "101 104 105\n", + " 99 101 102\n", + "105 106 108\n", + "105 107 108\n", + "105 106 107\n", + "101 105 106\n", + " 93 102 105\n", + "101 105 108\n", + "101 105 106\n", + "--- --- ---\n" + ] + } + ], + "source": [ + "TRIALS = 16\n", + "table = []\n", + "for i in range(TRIALS):\n", + " mechanism = SparseIndicator(epsilon=1.0, sensitivity=1.0, threshold=100, cutoff=3)\n", + " indices = mechanism.release(values)\n", + " table.append(indices)\n", + " \n", + "print(tabulate(table))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sparse Numeric\n", + "The `SparseNumeric` mechanism returns perturbed values alongside the indices of the exact values that exceeded the threshold." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Basic Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "from relm.mechanisms import SparseNumeric\n", + "mechanism = SparseNumeric(epsilon=4.0, sensitivity=1.0, threshold=100, cutoff=3) \n", + "indices, perturbed_values = mechanism.release(values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Visualise the Results" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "------------------------- ------------------------- -------------------------\n", + "(105, 115.21839387400541) (106, 97.59114407023299) (107, 100.34940313908737)\n", + "(105, 117.25417732610367) (106, 104.23912824635045) (108, 117.06529281983967)\n", + "(105, 115.95392468789942) (106, 105.70285632926971) (108, 117.4615241655847)\n", + "(105, 118.29109141643858) (106, 103.15804938206566) (108, 115.5464560847904)\n", + "(105, 117.70329438816407) (106, 104.40444786503213) (108, 116.99608848118805)\n", + "(101, 94.689048372471) (105, 116.0949394107738) (106, 103.06983450354892)\n", + "(105, 113.67421829584055) (106, 101.9473055737617) (107, 99.95925076899584)\n", + "(105, 116.9078528387472) (106, 105.79938419235987) (108, 115.9914550249523)\n", + "(105, 116.80950692723854) (106, 102.6301665683568) (107, 100.67531148143462)\n", + "(105, 115.72742036447744) (106, 107.88994258278399) (107, 102.52016868776991)\n", + "(105, 117.62578285107156) (106, 103.69083602391765) (108, 117.29039524923428)\n", + "(105, 118.25597266215482) (108, 116.37365036283154) (109, 125.8640080386831)\n", + "(102, 91.96496936277254) (105, 117.32759563691798) (108, 115.16448612802196)\n", + "(101, 94.46173246507533) (105, 120.20045540650608) (106, 107.19329122189083)\n", + "(105, 117.54825980460737) (108, 115.51091231877217) (109, 124.62289204221452)\n", + "(99, 91.71742801251821) (102, 92.58659511143924) (105, 122.91757382065407)\n", + "------------------------- ------------------------- -------------------------\n" + ] + } + ], + "source": [ + "TRIALS = 2**4\n", + "table = []\n", + "for i in range(TRIALS):\n", + " mechanism = SparseNumeric(epsilon=4.0, sensitivity=1.0, threshold=100, cutoff=3) \n", + " indices, perturbed_values = mechanism.release(values)\n", + " table.append(list(zip(indices, perturbed_values)))\n", + "\n", + "print(tabulate(table))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 6b80c8a477abb0e5874cd82c4456267ba6de0ce5 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 14 Jan 2021 15:47:27 +1100 Subject: [PATCH 124/185] Added data for new tutorial examples --- ...200811_QLD_dummy_dataset_individual_v2.xlsx | Bin 0 -> 824726 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 examples/20200811_QLD_dummy_dataset_individual_v2.xlsx diff --git a/examples/20200811_QLD_dummy_dataset_individual_v2.xlsx b/examples/20200811_QLD_dummy_dataset_individual_v2.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..1c34a10404595f5a8d7a0566c6d88896d7bf190e GIT binary patch literal 824726 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 J!0b%^NlHQL6-)jhi4Oo^yB_M3|( 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 }bD2NeT5(u@EsA3e>4nNM(oYU=$<%8J%-$HJX> zGqWwf<;o1HOU6!mEPH%hC24B}6o)X}D?4UG;gT|P(pL?k8kCXKse>DBO7cpei}RxU z9Dh5+%C#Gq=5~ISoJfBA{QQ5jCJJT^(lSwQ5N8Ip48pg3fY*x=bM3Zb{0qA)ew`&FE9AxdGo4qiGdwOHrB}xyLTN6$*2i~FwMK+0Q+X@fFxqmbL zh#P9*zb)%EY4D=`oUiSQl(H7EEq)`)vmjUGbZrJOAIan;MZ^e^L5ZFjq4i-+Y}gnWLJ6LDH3=QG2kVbi#K;f5m?m$+jfm(Y`+$EoB610nykW%`UYxUnC_V&ZefYy| zN4gOL$Nps{i{_%4YoLuZUwPP19A48F>OFbDi&Nn!gXYrU7>u(fe?eEDecC1;ln&_a z@{(Gf_oE%5BS;u3^5p5I;K@5H3}HBAHSH58QPQYSOg~UX#^K=0B#G|jr^4>~=CoX^ zp;b0l(FvIRbyhLj&7xWT2BZeMNn^7nH_N|GrQMJ_BXzN?gX%F%25V)rhA^iBmE~R~ zPHYIlQk5_ALSRSa4@^`&dj^y66jy7KmCT!&!GfMInE$_6KmSD7?~weY?v-SS9mJg? zcxT*vn(hyK8J>;vn$O$gW#4w-qv-W#^(+P%+=L77!VNAR={g{29MUKT9 zYdTRSVGVS_|8;`?9fUVvek71P`X1TVH@Icd9ykwVZk)nD0+XLZX^rW3?sh3N5S#=& zVNQI$j7{yF0Q(R=)&;MHeMr!1YxTnKOMy)fYrB+k_{SONgz%V?=k^hO^{-i7z$lgd zhg3gTW$P{Zwo4e1I_eoj7Eh0!EZGyfxdu)8T_`qSu;s(^0>mExS4GD5Kr0#OtGoe2 zUTW6=*@NDW3XQ57)BwO5Jac62NjU)-g879670FV{u$*HhG9Q962a zD0qiA8)*l$O~XCb(dX_IF+)5&_HSHmRZKE*AQZk14(;|S=l$6d;jJu&a9f=#tVzza zu{s4?yk^!M$>B+|{He(U*JC^EUp*3G{<$zvePu++YSm`f=ZwgC(^(pi3(2R+;YbXj z@+)BENo?hBc|Y+WT)#WN$P*o!tcIYqd$iQ z50$`?%#tx>*sD#%HOGqkXBTJL%EZYKxzn~Hz0TpgFd@Uu^e(_z1IBQw@u#E$J&B!E zgF;$ubyl+}Tb``9Q2%h)c-RQ+$|8Gq%;F4>hU9k*u3^d)T?q6cUr_)NTk0QX-Ca65 z5dG$hV0d9SK&}Sjt^})rE}v2biUJ36q&_yE|M%*q3L=y(@r@{QAXx~vX!BK)QO*xe zwi;VDhbFQYERb&mVi|@vY#2QuPj&0l3uJLzQFDu8l`^8L8ND`e=oY-|>M@__b1vOFc)VPKyWPia*!6zoDpYeGbDEH>1mg~(QN3$hdMae) zro4}XWTlhBZ=f_ByG=m8tl>gWuEXJf~}+r2IBkIQ04GJG$q3J zm)A9sH40cUIvb$LcTwMXo*mhWQ(6(r>k@jQ^n8dPKGS`E**?YU$N0>${9aZ>0gfm; z*VLdc>V!cpL~FMYUl&BNHnsnS+%80OQiY>AY5S1-#qrnUSrzPs5Nmto@vg69y0v>X zP;pYN02&AX33A#YMeM!SZd8E?z&(Wj-{xL{3*E_$<%fnG{za25!e$fk2SQF#f!$Zo z<8tCxxNiiPR=BSime&2hN=G*8XwhS6acy*W1pkPE(OUST34u0OoPkka*vGU4T09KC z_0+aU$TcV8Jdave`Zl(<)LOcdrS9vdlC#1tj^Ea{c{+0w;+~`;;(PfQLX8dXLIC=k z&{d=R4uUJ6DPxMMM1U8qRT8H4glZ<6eoe5@>StHp{s}w9#NiDnXHvU{ir-$h=pK-j z73@0MqAy}PAL6}V`X)om)RHUIr_yeUM-E;#jg@MsLa~(bbapi zKUBMKHl4|NnQiqp3#HchN!d5|1+l}^@yn2ZkP#!;&drCq}|ASU%rn%&Z<_RxeRFu)AN0!8fM zzs#r=5=sIw>3%4+$2mhb0)&|<-1+t!0P%jYAzoyH5#zGOM;HJa4~& zlW@A;ag4R;O4TK5Z|=kX-I|a=2Ha6*!I5je^&y;C?oW@s-xd+VwOeN>Y|J|m5X{2m z!*MtWU2pSzXu~lt0HM_!774rG{SZ-2!jgFk`^^g5Tl8>@7Q3Gdug1A6MKac%2Vh)_ z^^$zLr+O!I`+e|!QP2nW^p_uI?%hIJh?`j?b!*|BuRLtQ1RFsz^QazRowIww*jK%} z=>1KRY(xxRscfYxoec~0Tje(3l%gZ!vCl`S>&K{sG3g+ghrMbz0{8D17EV92gD&?z z?XXO37V-3Dj0KZd%!i*g4cRHf1g(VKhPpH~v zk>V82(^0A8MGEg72;as^T)rND!r$QUiThM;DeReg8o^uMCL_OY8>EgtN5`P><(q#I z^J}>CJ~)*6RS^@|R{6I@?S#WrCA`RuHVj8M43zKtByirRk|W<5Y*9{%W@@8F$-Wnn zR%l@VnQ42-29Fp#NnsafT@2519&w!cG^xP^U$t^uF^I#bL2e?ErD+WHWE+ zdciU3Du-o5QZ4I6XfZ2GW2?}*$9su3xEsJskk)12jpN=A#x;lil9;8V7}m|H$@DWr z%S8dC*%Ep}QqYm<`o`r7OgPjhmahe#L73(L3`<_T8Nl#fH%mDf8+n7>&@e#?!T~cTBIUM z_AP`vvhS3sM2oGGD9dEuvy~`j+CNVAada} z^fUXlLSk{*w@OTJApNt;&vbtMb4Jpp?}b6a*Y!ly5r7^6aMxzpysAP-tdRnIW18S@ zMu86OVYKVE)9B3;Offu$UvFcmJ@vEOoT;~sFnz<&9C*M%l&-D4%xZ0fW$?$rG!D1Y znXi*O`4f$R1jnVSH9k5i*?+?CX$Jr5WlwKm%smGVubPbkif16Gx< zR}FuFt^RiO{cTmFUo$g1au0;x0m0Hm&)RP^-*7_Ks6Ui}?#uwPO(SjCg@b?7ofFF^ z-%c0ZZq%?d1Bty|Y91mvBUYjWA)HGU{H%BPyn+sHdXK1qQ%b*t`k#&R=qz!X+gBod z@cKhep10L2nKFOgg(U1X(cm3!Xk^-2W8s3T7P%cg0X9nmTrAj1jj+f_Y$7ilEKEJy zciPL(zs*(p3+$U9Ofop}xPtT%l7kr~Mc9xCCe%;6qXlbRTy7>~UqRw7Z-tnS!tL7H z)p@#Viuu;eRuzs5+0w%**;XiSoCdg^#dutQ!0VRR!i*Vt!K3Elz{nn~f|%PamDE%E z^=|7_F0FXCIaFP5li`rLd{suULr!9rmNO600+66=_*En0?e!G+hYg0+my!jt~x>GoV65!lJHx!${>HAeto(6o=kmS!yggm~!nXT{`=XhxPD+xP;*zxcufQ1n8x zza2r>cXUb|P!D|9CNAXS&;>1^KO5vDwmMzGo4!L&*#fni`pVjkCZ(^^+V;7$Qa0aoRt4DgF%x=5w-A3H@cr`(dH<2h1Te$hs?n9dcC*YcQ3{NDpd=nQg zw%uc4Zx5v^}UF5A0#br!trPXpZg&0!UkME4f`@vRuB zGgZ1RAiNwn7pd5rp4{7R6JcSq`G~Bf*fC&QWdinBhHQ|&u=9052QqGbN#Vgxv_CyD zrLlT97255r_Vg+z(6`$+^Z*g!od>Sx`H;ggO& z229Yl;ZnN~CiBr#uA~CC+^D(nLfvWopz!p&NT;q&XtxGU(q?ont-nfkQ>49pjG@zK z6zp$vY^!m*3OSosX5yY~kGOxe%yejLM%aEeWK{aLj$fRB+U($-(maA!4?DJ5%`+{T*hxV<$pm90I3` zPTF(eQkx;}E(-r!$>xqLYo~<->6oj~LD@Q=`DvK?uL`5#zy8sGEBT8sU^xk$b0OE$ zPbl!pBC^3IUNL=FDmPfx3aRjViYmsY)dc<=KGrA^j+&GvE3L~wTV$k)92k3Of#gUV zlDh#30dD&Zw&Ds%<-vc7BeuXo9+T@MUx4@nj6j1>Tm~fE@4P(bM<5y^o@NF6)y3B* z>*3pocaSpe-_M}}8CuzQY8xx80(uI_La^2O%QMiw6uWmb;`M3}7p3@)Vp0uAxg+Re zhS2pAdhS>&1+_LQqp~~;LGs>=8$!*1AQ+J(*mKh^fdN16$8*XXqyXO%s)VON4{SvZ zmKY=ZY6PbjO%eKS4`E?Aq*W35HrebfjlvRG8PKWF`af_oW?rh!L{C34?%el}NjuKlV&6q^*`_io{40J;*J}E;eIB zQ8Q*+cv&v-P*jo6P{&!Qht-R%ODh}m%Kb?E4Cv_|tIk<;Sx+af^7_^$$}@UcDiL1JCUQ`F4?_C9U&)7)YIDCIN}_p|A5PUq1UA%0 zG<7_?>{9j>Ect+@-oXJ31?{^ckB?5;;HPhg-c5*{+su75XTi`@_=xaT6c(GEr))-j z^Nm?DLQx>cG_&PQ@R0T&@#+^hNg<6OZQ&*Unjm*M~0hvQWMl8kK|Tv146Q-yA&50O z61g20Ua{TZwzfCn`CokFN?%r-p&7kKmq49NT-V$&!tPHOGdv3wHEVi7mH5DVJcR%H zC$4({J-;oA021h65*J5e?3_MLQ*FnksqnqIA`pl$0x$6ICy0Qu894?c4BWu@#zry7 zLbRv(7PA&=Y+U%@1o=THd!qZ0QNGk?KzKHT)oJw+_fL#*PVj6*NxGgAK+qmA-HM*= zhMK;dSw*eZp(P-ki;HGJrFT#APiYt+WqkZ^Thz)2??2YiO0#i7NF8PABD>n|GpMN4 zJ~y;-X={}9arYcw`eMNFCj`U;(5D+3d*54Z6FAr!jCqd`kbc!NHcq>^ZCm9o_W<6e zF9~_`Uk}%07iVvQaqT}=RXw`ZQ2xHb^+ErC6@Bh(d&BzbH%fwqpC+AqOT?z}9yxGg z+3uS|+_AA8CQ%VPsUl?FvC;aGqjQqe8BoD(RUhAluDbGT=dg5o#nCkCwL-8=1*02x zm*+ln(e?0`jgqNBMJ<-Pll85~P7ufQme1b;YMS-HoeNUQf%CU+%?+2bxye7%-etUE zCRIK|(>pR`x=MOTpwu;yFW22VKiXwm2?BL>I3a@gyZ}>C3CcG-i{n*aYdSK?kw&uA zUN`ju#mz&Rf>)iB(m0ySWQa=V$kP+Lj&&!UC{JQ2!d?6B1>Ur{8*<+Pxo{or%hh`JMCA-gPSCMNezNB#D3$)`464@{{~CyQl2e=X*n^Cx3gdCYc&bst;Uy!yhM38B)=h;> z92Dg#d~fjsj5}f8M|jZ3Nkmw*`x|#x=G)JuvT}=vmVUP95=a_m#iGmfR%6_GVh33G znw%_;qH;RP+B47Y_w7b5FR@T1u{osNwIlU|leq9ibwE!m9B8Txf+t zuJX5D(NHa=6>BBFeO9F7?|Sc3`kNPT&3bow45%G1h$dRteq1YDO^#CpGyL$ZJ zP9>0rq)|$zulU!f#+)F0ExvF62ZD*KsOUbOL~tR|sgksjS#1ro)Kxh!?CXkO6R-@t zxlxb)c>Pvgb%2lUeWOVI%4hFBy;28zV(#j^>jI$No-Y^4Z2W#Rwr8#Rj_KLN6e0bq zLykh~feqe4Q#b6~7`=BrZa*<8CAtSRaE)&oDi3J?Srk9u{k9suJWvu?-9 z2f0X|W^y1g+QHq0(0T(_XTGbCXc0)vW5)ilc#JRZY`b9xby@2tfXD(9Bt8T?)`^5C zhaV`A`5hq2a6yw6tpr}5A5|_fJ9F}*Z1cRW1E8AfRDpTLGX~`x6$vx(BNMerBhPCF zS63f;^eFify9chI!AtxUC%2woj~6UbhF&koL=0|?9NEzs!4E*~EG&4`^q!*&!v{d5 zPSCm~58<8{G{dn2el(%li{ z(eMj>7Pw_52)P0f<3JzM7LwSNhAPqnM8lJEw&g=fr!IOy>d-8cU~J7l8h;;p&Q%(o zfBj*p%A=#k5RW!&fL(l7*6AjD?pgnu(yKndz+4P2Y#V70ixNJmsR!C)?`UWfxp0`p zkCO@tC>rmgEB$*{VU|XEVT0K}+bN(k1YSrAh1|r*tolI8 z+m$iqU0mE@^;ul&CFQW1KDT~qV{=sw!HeUG=1dlX%^ zrBi`!ZKB??7>a@dyF2BMl!_b0a3ZK=j-O!xQ;65Xq@s@{ofc*b$wWk$F^EbC0y&BA ziS+JOSO|=SH36i00Wyc}qEUP95KeN*6f_SM@w9>_x`2ODsPq30N!_c)M-_Q-?-0ZH z8_o>vUGIMvnZjr4%Gd{p&Z%ezxzaV`W6l4PVH!%4-W|1n?=@4hd*_qS

B}Q41(sD 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

)PH;$fT%X&H$&6m;DkmPbS_43)bG(i~F*mV(^ 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 Date: Thu, 14 Jan 2021 15:48:52 +1100 Subject: [PATCH 125/185] Moved relm_demo to examples folder --- relm_demo.ipynb => examples/relm_demo.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename relm_demo.ipynb => examples/relm_demo.ipynb (100%) diff --git a/relm_demo.ipynb b/examples/relm_demo.ipynb similarity index 100% rename from relm_demo.ipynb rename to examples/relm_demo.ipynb From f018d8645b3833a75360bd9b0536027640e4e9d5 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 14 Jan 2021 15:50:54 +1100 Subject: [PATCH 126/185] Changed paths to reflect new file locations --- examples/relm_demo.ipynb | 243 ++++++++++++++++++++------------------- 1 file changed, 125 insertions(+), 118 deletions(-) diff --git a/examples/relm_demo.ipynb b/examples/relm_demo.ipynb index 24854a5..feb19ea 100644 --- a/examples/relm_demo.ipynb +++ b/examples/relm_demo.ipynb @@ -28,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -42,12 +42,12 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Read the raw data\n", - "data = pd.read_csv(\"examples/pcr_testing_age_group_2020-03-09.csv\")\n", + "data = pd.read_csv(\"pcr_testing_age_group_2020-03-09.csv\")\n", "\n", "# Compute the exact query responses\n", "exact_counts = data[\"age_group\"].value_counts().sort_index()\n", @@ -56,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -80,66 +80,66 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238235.13786800-9238241.968346
110-19386396.126739110-19386371.595060
220-29688697.949542220-29688682.629824
330-39779773.883889330-39779768.288186
440-49621617.471460440-49621625.749218
550-59582584.219098550-59582577.070481
660-69344298.745236660-69344287.981099
770+261299.241292770+261256.436250
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -147,7 +147,7 @@ }, { "data": { - "image/png": "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T7J58+aMJ/cePXrUueSugcMkXiY0T+8hWbVx40aOO+44PvjgAwAuueQS7r//fgB++MMfkp+fT/fu3bnppl0dAm+99Rbf/OY3OfHEE+nTpw8bN25k/PjxFBYWkpeXR2Fh4W77uPfeeykoKODUU08Fon7pCy+8kLZt27Ju3TrOPfdcevbsSd++fVm4cCEAEyZMYNKkSRXb6NGjByUlJZSUlNC1a1euvvpqunfvzqBBg9i6dSszZ86kqKiISy+9lLy8PLZu3crYsWPp1q0bPXv2ZMyYMRys1HIXkVrZunUreXl5FfPjxo3j4osv5p577uHyyy/nJz/5CevXr+fqq68G4LbbbuPwww9nx44dDBw4kIULF3L88cdz8cUXU1hYSO/evdm0aRNNmjThlltuoaioiHvuuWeP/S5atIiCgoI9ygFuuukmTjrpJJ5++mlee+01Ro4cWe2vi6VLl/LYY49x//33c9FFF/Hkk09y2WWXcc899zBp0iTy8/NZt24ds2bN4v3338fM2LBhQy3euexScheRWqmqW+bb3/42TzzxBNdeey0LFiyoKH/88ceZOnUq5eXlrFixgvfeew8zo127dvTu3RuAZs2a1SqmN954gyefjO5nPmDAANauXcvGjXu/rWvnzp0rvqROPvlkSkpK9qjTrFkzcnJyuOqqqxg6dCjnnHNOreLMJnXLiEhW7Ny5kyVLltC4cWPWrYsudfnkk0+YNGkSs2fPZuHChQwdOpRt27bh7jU+3a979+7Mn1/5Xt2RVGdfmxkNGjRg586dFWXJ544fcsghFdP169envHzPe6c3aNCAefPmccEFF/D0008zePDgGsW8Pym5i0hWTJ48ma5du/LYY49x5ZVXsn37djZt2sShhx5K8+bNWbVqFS+++CIAxx9/PGVlZbz11lsAbN68mfLycg477DA2b96ccvvXXXcd06ZNY+7cuRVljzzyCCtXrqRfv348+uijALz++uscccQRNGvWjNzcXN5++20A3n77bT755JNqX0dyDF988QUbN25kyJAhTJkyJWsHkjNB3TIiMXIgzhaq3Oc+ePBgrrzySh544AHmzZvHYYcdRr9+/bj11lu5+eabOemkk+jevTtHH300p512GgCNGjWisLCQH/3oR2zdupXGjRvz6quv0r9/fyZOnEheXl5FX35C27ZtmTFjBmPGjGH16tXUq1ePfv36cf755zNhwgSuuOIKevbsSZMmTZg2LRrL8IILLmD69Onk5eXRu3dvjj322Gpf3+WXX84111xD48aNefHFFxk2bFjFr43Jkydn+N3MnIPiHqr5+fmum3VIVWp0KmROmvesnrD3/te6YsmSJXTt2vVAhyH7QarP2szmu3t+qvrqlhERiSEldxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRjSee4icZLpQdHSOGU0MeRveXk5Xbt2Zdq0aTUalXHKlCmMHj26xiM5TpgwgaZNm+7z4F17W3/69OncdddduDvuzpVXXpnxQcJuv/12fv7zn2d0m8nUcheRWkmMLbNo0SIaNWrEb37zm7TX3bFjB1OmTGHLli012meqoQEy5cUXX2TKlCm8/PLLLF68mLfffpvmzTM/kujtt9+e8W0mU3IXkYw544wzWLZsGRANBdCnTx/y8vL4wQ9+wI4dOwBo2rQp48eP55RTTuG2226jrKyM/v37079//4rlCTNnzuTyyy8HoitFr7/+evr378+NN94IwIIFCxgwYABdunSpGFIY4Fe/+hW9e/emZ8+euw0rfNttt3Hcccdx1llnVQxHXNkdd9zBpEmTKsZvz8nJqRjRsri4mL59+9KzZ0/OO+881q9fD8CZZ55J4kLMzz//nNzcXCAaC/78889n8ODBdOnShRtuuAGAsWPHVlzZe+mll/Lll18ydOhQTjzxRHr06LHH8Mb7QsldRDKivLycF198kRNOOIElS5ZQWFjIX//6V4qLi6lfv37FWC9ffvklPXr0YO7cuYwfP5727dszZ84c5syZU+0+PvzwQ1599VV+/etfA7Bw4UKef/55/v73v3PLLbdQVlbGyy+/zNKlS5k3bx7FxcXMnz+fP//5z8yfP58ZM2bwzjvv8NRTT1WMY1PZokWLOPnkk1MuGzlyJHfeeScLFy7khBNO4Oabb6425uLiYgoLC3n33XcpLCxk+fLlTJw4seIXz6OPPspLL71E+/btWbBgAYsWLcrIgGTV9rmb2XFA8tfI0cB4YHoozwVKgIvcfX24ifb/AEOALcDl7v52rSMVkYNS8tgyZ5xxBqNGjWLq1KnMnz+/YgjfrVu30qZNGyDqo7/gggv2aV/Dhw+nfv36FfPDhg2jcePGNG7cmP79+zNv3jzeeOMNXn75ZU466SQgGuxr6dKlbN68mfPOO6+ib/+73/1ujfa9ceNGNmzYwLe+9S0ACgoKGD68+juKDhw4sKJbp1u3bnz66ad06tRptzonnHACY8aM4cYbb+Scc87hjDPOqFFsqVSb3N39AyAPwMzqA/8AZhHd+Hq2u080s7Fh/kbgbKBLeJwC3BeeRSSGUo3n7u4UFBRwxx137FE/JydntwRdWfLQv8lD8gIceuihVdZNzLs748aN4wc/+MFuy6ZMmZLWsMKJoYQHDBhQbd2E5KGEK8eczlDCxx57LPPnz+eFF15g3LhxDBo0iPHjx6e9/1Rq2i0zEPjI3T8FhgHTQvk04NwwPQyY7pE3gRZm1q5WUYpInTJw4EBmzpzJ6tWrAVi3bh2ffvppyrqVh/Vt27YtS5YsYefOncyaNWuv+3nmmWfYtm0ba9eu5fXXX6d379585zvf4aGHHuKLL74A4B//+AerV6+mX79+zJo1i61bt7J582b+8Ic/pNzmuHHjuOGGG1i5ciUA//znP7n77rtp3rw5LVu25C9/+QsADz/8cEUrPjc3t2Js+ZkzZ6b1HjVs2JDt27cDUFZWRpMmTbjssssYM2ZMxbDEtVHTUyFHAI+F6bbuvgLA3VeYWZtQ3gFYnrROaShbkbwhMxsNjAY48sgjaxiG7HfpnmIXk9EW66yD5P3v1q0bt956K4MGDWLnzp00bNiQe++9l6OOOmqPuqNHj+bss8+mXbt2zJkzh4kTJ3LOOefQqVMnevToUZGkU+nTpw9Dhw7ls88+4xe/+AXt27enffv2LFmypOLeqk2bNuWRRx6hV69eXHzxxeTl5XHUUUdV2fUxZMgQVq1axVlnnVVxE5Err7wSgGnTpnHNNdewZcsWjj76aH77298CMGbMGC666CIefvjhtFv8o0ePpmfPnvTq1YuRI0fys5/9jHr16tGwYUPuu+++tLaxN2kP+WtmjYAyoLu7rzKzDe7eImn5endvaWbPA3e4+xuhfDZwg7unvmUKGvK3TjiAyV1D/lZNQ/5+fWRzyN+zgbfdfVWYX5XobgnPq0N5KZB8tKAj0ZeCiIjsJzXplrmEXV0yAM8CBcDE8PxMUvl1ZjaD6EDqxkT3jRxcatYizmIgIpJxaSV3M2sCfBtIPvw8EXjczEYBnwGJc4JeIDoNchnRqZBXZCxaEdnDvtxcWuqWfbljXlrJ3d23AK0qla0lOnumcl0Hrq1xJCJSYzk5Oaxdu5ZWrVopwceUu7N27Vpycmr281kDh4nUYR07dqS0tJQ1a9Yc6FAki3JycujYsWON1lFyF6nDGjZsSOfOnQ90GHIQ0tgyIiIxpOQuIhJDSu4iIjGk5C4iEkNK7iIiMaTkLiISQ0ruIiIxpOQuIhJDSu4iIjGk5C4iEkNK7iIiMaTkLiISQ0ruIiIxpFEhRTIk3TtblUwcmuVIRJTcRfa/dG82DrG5kbfsf2l1y5hZCzObaWbvm9kSMzvVzA43s1fMbGl4bhnqmpndbWbLzGyhmfXK7ksQEZHK0u1z/x/gJXc/HjgRWAKMBWa7exdgdpgHOBvoEh6jgfsyGrGIiFSr2uRuZs2AfsCDAO7+lbtvAIYB00K1acC5YXoYMN0jbwItzKxdxiMXEZEqpdNyPxpYA/zWzN4xswfM7FCgrbuvAAjPbUL9DsDypPVLQ9luzGy0mRWZWZHu/ygiklnpJPcGQC/gPnc/CfiSXV0wqaS6BbvvUeA+1d3z3T2/devWaQUrIiLpSSe5lwKl7j43zM8kSvarEt0t4Xl1Uv1OSet3BMoyE66IiKSj2uTu7iuB5WZ2XCgaCLwHPAsUhLIC4Jkw/SwwMpw10xfYmOi+ERGR/SPd89x/BDxqZo2Aj4EriL4YHjezUcBnwPBQ9wVgCLAM2BLqikhdo/Px67S0kru7FwP5KRYNTFHXgWtrGZeIZEnaV9LmZDkQySqNLSMiEkNK7iIiMaTkLiISQ0ruIiIxpOQuIhJDSu4iIjGk5C4iEkNK7iIiMaTkLiISQ0ruIiIxpOQuIhJDSu4iIjGk5C4iEkNK7iIiMaTkLiISQ0ruIiIxpOQuIhJDSu4iIjGUVnI3sxIze9fMis2sKJQdbmavmNnS8NwylJuZ3W1my8xsoZn1yuYLEBGRPdWk5d7f3fPcPXEv1bHAbHfvAswO8wBnA13CYzRwX6aCFRGR9NSmW2YYMC1MTwPOTSqf7pE3gRZm1q4W+xERkRpKN7k78LKZzTez0aGsrbuvAAjPbUJ5B2B50rqloWw3ZjbazIrMrGjNmjX7Fr2IiKTUIM16p7l7mZm1AV4xs/f3UtdSlPkeBe5TgakA+fn5eywXEZF9l1bL3d3LwvNqYBbQB1iV6G4Jz6tD9VKgU9LqHYGyTAUsIiLVqza5m9mhZnZYYhoYBCwCngUKQrUC4Jkw/SwwMpw10xfYmOi+ERGR/SOdbpm2wCwzS9T/vbu/ZGZvAY+b2SjgM2B4qP8CMARYBmwBrsh41CIislfVJnd3/xg4MUX5WmBginIHrs1IdCIisk90haqISAwpuYuIxJCSu4hIDCm5i4jEkJK7iEgMKbmLiMSQkruISAwpuYuIxJCSu4hIDCm5i4jEkJK7iEgMKbmLiMSQkruISAwpuYuIxJCSu4hIDCm5i4jEkJK7iEgMpZ3czay+mb1jZs+F+c5mNtfMlppZoZk1CuWHhPllYXludkIXEZGq1KTl/hNgSdL8ncBkd+8CrAdGhfJRwHp3PwaYHOqJiMh+lFZyN7OOwFDggTBvwABgZqgyDTg3TA8L84TlA0N9ERHZT9JtuU8BbgB2hvlWwAZ3Lw/zpUCHMN0BWA4Qlm8M9XdjZqPNrMjMitasWbOP4YuISCoNqqtgZucAq919vpmdmShOUdXTWLarwH0qMBUgPz9/j+VfGxOap1lvY3bjEJFYqTa5A6cB3zWzIUAO0IyoJd/CzBqE1nlHoCzULwU6AaVm1gBoDqzLeOQiIlKlartl3H2cu3d091xgBPCau18KzAEuDNUKgGfC9LNhnrD8NXf/+rbMRUQOgHRa7lW5EZhhZrcC7wAPhvIHgYfNbBlRi31E7UKse3LHPp923ZKcLAYiIl9bNUru7v468HqY/hjok6LONmB4BmITEZF9pCtURURiSMldRCSGlNxFRGJIyV1EJIaU3EVEYkjJXUQkhpTcRURiSMldRCSGlNxFRGKoNsMPiIhkTbrDeJRMHJrlSOomtdxFRGJIyV1EJIaU3EVEYkjJXUQkhpTcRURiSMldRCSGlNxFRGJIyV1EJIaqTe5mlmNm88xsgZktNrObQ3lnM5trZkvNrNDMGoXyQ8L8srA8N7svQUREKkun5f5PYIC7nwjkAYPNrC9wJzDZ3bsA64FRof4oYL27HwNMDvVERGQ/qja5e+SLMNswPBwYAMwM5dOAc8P0sDBPWD7QzCxjEYuISLXSGlvGzOoD84FjgHuBj4AN7l4eqpQCHcJ0B2A5gLuXm9lGoBXweaVtjgZGAxx55JG1exUi8vU1oXkN6m7MXhzV7jvNODMUY1oHVN19h7vnAR2BPkDXVNXCc6pWuu9R4D7V3fPdPb9169bpxisiImmo0dky7r4BeB3oC7Qws0TLvyNQFqZLgU4AYXlzYF0mghURkfSkc7ZMazNrEaYbA2cBS4A5wIWhWgHwTJh+NswTlr/m7nu03EVEJHvS6XNvB0wL/e71gMfd/Tkzew+YYWa3Au8AD4b6DwIPm9kyohb7iCzELSIie1Ftcnf3hcBJKco/Jup/r1y+DRiekehERGSf6ApVEZEYUnIXEYkhJXcRkRhSchcRiaG0rlAVEZE95Y59Pu26JTlZDCQFtdxFRGJIyV1EJIaU3EVEYkjJXUQkhpTcRURiSMldRCSG6typkOmeelSS8730NnggB+8XEckStdxFRGJIyV1EJIaU3EVEYkjJXUQkhpTcRURiKJ17qHYyszlmtsTMFpvZT0L54Wb2ipktDc8tQ7mZ2d1mtszMFppZr2y/CBER2V06Lfdy4D/cvSvQF7jWzLoBY4HZ7t4FmB3mAc4GuoTHaOC+jEctIiJ7VW1yd/cV7v52mN4MLAE6AMOAaaHaNODcMD0MmO6RN4EWZtYu45GLiEiVatTnbma5RDfLngu0dfcVEH0BAG1CtQ7A8qTVSkOZiIjsJ2kndzNrCjwJ/Lu7b9pb1RRlnmJ7o82syMyK1qxZk24YIiKShrSSu5k1JErsj7r7U6F4VaK7JTyvDuWlQKek1TsCZZW36e5T3T3f3fNbt269r/GLiEgK6ZwtY8CDwBJ3/++kRc8CBWG6AHgmqXxkOGumL7Ax0X0jIiL7RzoDh50GfB9418yKQ9nPgYnA42Y2CvgMGB6WvQAMAZYBW4ArMhqxiIhUq9rk7u5vkLofHWBgivoOXFvLuEREpBZ0haqISAwpuYuIxJCSu4hIDCm5i4jEkJK7iEgMKbmLiMSQkruISAwpuYuIxJCSu4hIDCm5i4jEkJK7iEgMKbmLiMSQkruISAwpuYuIxJCSu4hIDCm5i4jEkJK7iEgMKbmLiMRQOjfIfsjMVpvZoqSyw83sFTNbGp5bhnIzs7vNbJmZLTSzXtkMXkREUkun5f47YHClsrHAbHfvAswO8wBnA13CYzRwX2bCFBGRmqg2ubv7n4F1lYqHAdPC9DTg3KTy6R55E2hhZu0yFayIiKRnX/vc27r7CoDw3CaUdwCWJ9UrDWV7MLPRZlZkZkVr1qzZxzBERCSVTB9QtRRlnqqiu09193x3z2/dunWGwxAR+Xrb1+S+KtHdEp5Xh/JSoFNSvY5A2b6HJyIi+2Jfk/uzQEGYLgCeSSofGc6a6QtsTHTfiIjI/tOgugpm9hhwJnCEmZUCNwETgcfNbBTwGTA8VH8BGAIsA7YAV2QhZhERqUa1yd3dL6li0cAUdR24trZBiYhI7egKVRGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRhSchcRiSEldxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRhSchcRiSEldxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRhSchcRiaGsJHczG2xmH5jZMjMbm419iIhI1TKe3M2sPnAvcDbQDbjEzLplej8iIlK1bLTc+wDL3P1jd3KCXWEAAAnUSURBVP8KmAEMy8J+RESkCubumd2g2YXAYHe/Ksx/HzjF3a+rVG80MDrMHgd8kNFA4Ajg8wxvMxsUZ2bVhTjrQoygODMtG3Ee5e6tUy1okOEdAViKsj2+Qdx9KjA1C/uPgjArcvf8bG0/UxRnZtWFOOtCjKA4M21/x5mNbplSoFPSfEegLAv7ERGRKmQjub8FdDGzzmbWCBgBPJuF/YiISBUy3i3j7uVmdh3wR6A+8JC7L870ftKQtS6fDFOcmVUX4qwLMYLizLT9GmfGD6iKiMiBpytURURiSMldRCSG6nRyT2eYAzO708wWhcfFWYzlITNbbWaLksoON7NXzGxpeG5ZxbrXhdfgZnZEUnlLM5tlZgvNbJ6Z9chAnJ3MbI6ZLTGzxWb2kxrG+mh4zxeF19wwG7GaWU7YzoIQ582hvLOZzQ1xFoaD9qnWfylp3d+EK6cxsxPN7O9m9q6Z/cHMmtUmzrDN+mb2jpk9V5MYk9Z/ttLfTcZjDNstCdssNrOiUJbu5/47M/skrFtsZnmhPNOfewszm2lm74e/0VNrEKOZ2W1m9mFY98fZiDHFfo9Lel+KzWyTmf17unFnjbvXyQfRwdqPgKOBRsACoFulOkOBV4gOHB8KFAHNshRPP6AXsCip7C5gbJgeC9xZxbonAblACXBEUvmvgJvC9PHA7AzE2Q7oFaYPAz4kGiYi3ViHEF3LYMBjwA+zEWvYftMw3RCYC/QFHgdGhPLfJPafYv1mSdt5Mmmdt4BvhekrgV9m4D29Hvg98FyYTyvGsPz8sG7y303GYwzb2u3vq4Z/o78DLkxRnunPfRpwVZhuBLSoQYxXANOBemG+TTZirCb++sBK4Kh04g7v65lZiSVbLzLbD+BU4I9J8+OAcZXq/Az4r6T5B4GLshhTbqV/0g+AdmG6HfBBNevv9s8HPA+cnjT/EdA2wzE/A3y7prGGej8Fbst2rEAT4G3gFKIr/Bqk+huoYt2GwB+Ai8P8JnadSNAJeK+WsXUEZgMDgOeIvkzSihFoCrxB9OWa/HeT0Rir+vuqyd8oVSf3jH3uQDPgk8Rr34cY5wHHZDPGNF7DIOCv6cZNFpN7Xe6W6QAsT5ovDWXJFgBnm1mT0N3Rn90vsMq2tu6+AiA8t6nh+guIWnaYWR+i1kDHTAVnZrlEvxrm1jTW0B3zfeClbMUaujuKgdVEv8A+Aja4e3mokuozT17/j2HdzcDMULwI+G6YHk7t/x6mADcAO8N8qxrE+Evg18CWSuWZjjHBgZfNbL5Fw39AzT7320LXxmQzOySUZfJzPxpYA/w2dHM9YGaH1iDGfwEuNrMiM3vRzLpkIcbqjCD6RUsN4s6Kupzcqx3mwN1fBl4A/kb0hv8dKE+x3sFqItAyJLgfAe+QofjNrClRd8W/u/umfdjE/wF/dve/ZCtWd9/h7nlE/4h9gK6pqu1l/e8QtZgOIWpZQ9TNca2ZzSfqlvpqX+Mzs3OA1e4+P7k4nRhDn/Ux7j4rRf2MxVjJae7ei2jE1mvNrF8N1h1H1KXRGzgcuDGUZ/Jzb0DUtXmfu58EfEnUnZGuQ4BtHl3ifz/wUBZirFI4tvJd4Ilq6n0n0T8f6j8Q5udmNKBs/BzYHw9Sd8vcBBSHx3dTrPN7YEgWY8oljW4Zogu8ioEHKq1fQqWfzUnLLCyv9TEDoq6KPwLX70us4X1+mtC3mc1YK+3zZ6To8iDq50x87rekWLcAuCdF+bHAvFrEdAdRy7yEqJ91C/BoOjECPyQalqMkbOMr4PVMx7iX2CcAY2r6NxqWnUk4vpDJzx34BlCSNH8GUZdKWjEC7wO5SbFs3B9/m0nbHga8nDR/QLtlMr7B/fUg+pb/GOjMrgOq3SvVqQ+0CtM9iX7uNshiTLnsntx/xe4HVO6qZv0Sdu9zbwE0CtNXA9MzEKMRHXSaUqk8rViBq4h+CTWuVJ7RWIHWQIsw3Rj4C3AOUaso+WDlv6VYt2nSP1UDoBC4LswnDrLVC+/DlRn67CsSXjoxVvN3k/EYiU4oOCxp+m/A4Bp87on304i6oiZm6XP/C3BcmJ4Q4ks3xomJ9yp8Hm9lI8a9xD4DuCJpvtq4UXKv8s0cQnS2x0fAf6ZYngO8Fx5vAnlZjOUxYAWwnaglNoqo/3U2sDQ8H17Fuj8O65QTteYSLZFTw7rvA08BLTMQ5+lE3QQL2dWSHFKDWMvD+51Yd3w2YiX6Mn4nxLkoaT9HEx04W0aURA9JsW5bojNOFgKLgf9lV0v6J+Fv5sOQDKw2cSbt80x2JfdqY6y0bi67J/eMxxhiWhAeixP/LzX43F8D3g2fxSPsOpMp0597HtFZbQuJfh22rEGMLYha+u8SdcGemK3/oxT7bgKsBZonlVUbN1lM7hp+QEQkhuryAVUREamCkruISAwpuYuIxJCSu4hIDCm5i4jEkJK71Glmdp5Fo2ken+HtXhYutV8cRpd8wMxaZHIfItmk5C513SVEg2+NyNQGzWww0aBoZ7t7d6JL4v9GdP585br1M7VfkUxScpc6K4yPcxrRBWMjksrrmdn/hVb3c2b2gpldGJadbGZ/CoNn/dHM2qXY9H8CY9z9H1Axxs1D7v5B2EaJmY03szeA4WaWZ2Zvhpb+rMS43Wb2upnlh+kjzKwkTF9uZs9YNOb8B2Z2U9beJPnaUnKXuuxc4CV3/xBYZ2a9Qvn5RFd9nkA0XMKpUDGS5f8SDV17MtHAUrel2G53oiGG92abu5/u7jOIhgi40d17El0dmU6y7gNcSnRF5vDEl4BIpii5S112CdF4HoTnS8L06cAT7r7T3VcCc0L5cUAP4JUwIt9/Uc3Qr2Z2Qhix7yPb/U5ehWF5c6IxcP4UyqcR3bilOq+4+1p330p0SfzpaawjkrYGBzoAkX1hZq2IhvHtYWZONEicm9kNpB52l1C+2N1PrWbzi4n62ee4+7tAnpndQzSAWcKXaYRZzq4GVE6lZZXH/dA4IJJRarlLXXUh0eh+R7l7rrt3IrqLz+lEB1gvCH3vbYkG9YJoCNbWZlbRTWNm3VNs+w5gkpklt+obp6iHu28E1pvZGaHo+0CiFV8CnJwUb7Jvh3tsNibqXvprOi9aJF1quUtddQnRiInJngS+B1wLDCQawfBDojtNbXT3r8KB1btDd0oDouFrFydvxN1fMLPWwIvhbJgNYVt/rCKWAuA3ZtaEaBjqK0L5JOBxM/s+0aiKyd4AHgaOAX7v7kU1efEi1dGokBJLZtbU3b8I3TfziO5CtPJAxwXR2TJAvrtfd6BjkfhSy13i6rlw0VEj4JcHS2IX2V/UchcRiSEdUBURiSEldxGRGFJyFxGJISV3EZEYUnIXEYmh/w852p0Qh9UYDgAAAABJRU5ErkJggg==\n", + "image/png": "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P/44mzdvznhy79WrV71L7ho4TEQyrry8nGOPPZb33nsPgIsvvph7770XgO9973vk5+fTs2dPbrxxd4fAG2+8wde+9jVOOOEE+vXrR3l5ORMnTqSwsJC8vDwKCwv32MdvfvMbCgoKOOWUU4CoX/qCCy6gffv2rF+/nnPOOYfevXvTv39/Fi1aBMBNN93E5MmTK7fRq1cvSkpKKCkpoXv37lx11VX07NmTIUOGsHXrVmbNmkVRURGXXHIJeXl5bN26lfHjx9OjRw969+7NuHHjOFip5S4idbJ161by8vIq5ydMmMBFF13E3XffzWWXXcYPf/hDNmzYwFVXXQXAbbfdxuGHH87OnTsZPHgwixYt4rjjjuOiiy6isLCQvn37smnTJpo1a8Ytt9xCUVERd9999177Xbx4MQUFBXuVA9x4442ceOKJPPnkk7zyyiuMHj065a+LZcuW8cgjj3Dvvfdy4YUX8vjjj3PppZdy9913M3nyZPLz81m/fj2zZ8/m3XffxczYuHFjHd657FJyl3i5qWWa9XSLz0yprlvmG9/4Bo899hjXXHMNCxcurCx/9NFHmTZtGjt27GDlypW88847mBkdOnSgb9++ALRo0aJOMb322ms8/nh0P/NBgwaxbt06ysv3/Zl37dq18kvqpJNOoqSkZK86LVq0ICcnhyuvvJLhw4dz9tln1ynObFK3jIhkxa5du1i6dClNmzZl/froUpePPvqIyZMnM2fOHBYtWsTw4cPZtm0b7l7j0/169uzJggVV79UdSXb2tZnRqFEjdu3aVVmWeO74IYccUjndsGFDduzY+97pjRo1Yv78+Zx//vk8+eSTDB06tEYx709K7iKSFVOmTKF79+488sgjXHHFFWzfvp1NmzZx6KGH0rJlS1avXs3zzz8PwHHHHUdZWRlvvPEGAJs3b2bHjh0cdthhbN68Oen2r732WqZPn868efMqyx566CFWrVrFgAEDePjhhwF49dVXOeKII2jRogW5ubm8+eabALz55pt89NFHKV9HYgyfffYZ5eXlDBs2jKlTp2btQHImqFtGJEYOxNlCVfvchw4dyhVXXMF9993H/PnzOeywwxgwYAC33norN998MyeeeCI9e/bk6KOP5tRTTwWgSZMmFBYW8v3vf5+tW7fStGlTXn75ZQYOHMikSZPIy8ur7Muv0L59e2bOnMm4ceNYs2YNDRo0YMCAAZx33nncdNNNXH755fTu3ZtmzZoxfXo0luH555/PjBkzyMvLo2/fvhxzzDEpX99ll13G1VdfTdOmTXn++ecZMWJE5a+NKVOmZPjdzJyD4h6q+fn5rpt1SHVqdCpkTpr3rI5Jn/vSpUvp3r37gQ5D9oNkn7WZLXD3/GT11S0jIhJDSu4iIjGk5C4iEkNK7iIiMaTkLiISQ0ruIiIxpPPcReIk3eEX0t5e6lNGK4b83bFjB927d2f69Ok1GpVx6tSpjB07tsYjOd500000b9681oN37Wv9GTNmcOedd+LuuDtXXHFFxgcJ+8UvfsFPfvKTjG4zkVruIlInFWPLLF68mCZNmvDb3/427XV37tzJ1KlT2bJlS432mWxogEx5/vnnmTp1Ki+++CJLlizhzTffpGXLDH9pEiX3bFJyF5GMOf3001m+fDkQDQXQr18/8vLy+O53v8vOnTsBaN68ORMnTuTkk0/mtttuo6ysjIEDBzJw4MDK5RVmzZrFZZddBkRXil533XUMHDiQG264AYCFCxcyaNAgunXrVjmkMMAvf/lL+vbtS+/evfcYVvi2227j2GOP5cwzz6wcjriq22+/ncmTJ1eO356Tk1M5omVxcTH9+/end+/enHvuuWzYsAGAM844g4oLMT/99FNyc3OBaCz48847j6FDh9KtWzeuv/56AMaPH195Ze8ll1zC559/zvDhwznhhBPo1avXXsMb14aSu4hkxI4dO3j++ec5/vjjWbp0KYWFhfztb3+juLiYhg0bVo718vnnn9OrVy/mzZvHxIkT6dixI3PnzmXu3Lkp9/H+++/z8ssv86tf/QqARYsW8eyzz/KPf/yDW265hbKyMl588UWWLVvG/PnzKS4uZsGCBfzlL39hwYIFzJw5k7feeosnnniichybqhYvXsxJJ52UdNno0aO54447WLRoEccffzw333xzypiLi4spLCzk7bffprCwkBUrVjBp0qTKXzwPP/wwL7zwAh07dmThwoUsXrw4IwOSpexzN7NjgcSvkaOBicCMUJ4LlAAXuvuGcBPtXwPDgC3AZe7+Zp0jFZGDUuLYMqeffjpjxoxh2rRpLFiwoHII361bt9KuXTsg6qM///zza7WvkSNH0rBhw8r5ESNG0LRpU5o2bcrAgQOZP38+r732Gi+++CInnngiEA32tWzZMjZv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\n", "text/plain": [ "

" ] @@ -205,7 +205,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -227,66 +227,66 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923824300-9238236
110-19386382110-19386375
220-29688683220-29688679
330-39779759330-39779778
440-49621616440-49621664
550-59582592550-59582588
660-69344290660-69344358
770+261252770+261219
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -294,7 +294,7 @@ }, { "data": { - "image/png": "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zqZNmzKe3Lt161brkrsGDhORjNuwYQNHHXUU77//PgAXXHAB9913HwA//vGPyc/Pp2vXrtx4484Ogblz5/Ld736XY489ll69erFhwwbGjRtHYWEheXl5FBYW7rKP3/3udxQUFHDiiScCUb/0ueeeS+vWrVm7di1nnnkm3bt3p3fv3ixYsACAm266iQkTJpRvo1u3bixbtoxly5bRuXNnrrjiCrp27crAgQPZsmULM2bMoKioiAsvvJC8vDy2bNnCmDFj6NKlC927d2f06NHsr9RyF5Ea2bJlC3l5eeXzY8eO5fzzz+eee+7hkksu4Wc/+xnr1q3jiiuuAOC2227j4IMPZvv27fTv358FCxZw9NFHc/7551NYWEjPnj3ZuHEjjRo14pZbbqGoqIh77rlnt/0uXLiQgoKC3coBbrzxRo477jiefPJJXnnlFUaMGJHy18WSJUt45JFHuO+++zjvvPN4/PHHueiii7jnnnuYMGEC+fn5rF27lpkzZ/Lee+9hZqxfv74G71x2KbmLSI1U1i3z/e9/n8cee4yrrrqK+fPnl5c/+uijTJ48mW3btrFixQreffddzIw2bdrQs2dPAJo0aVKjmF577TUefzy6n3m/fv1Ys2YNGzbs+bauHTt2LP+SOv7441m2bNludZo0aUJOTg6XX345Q4YM4fTTT69RnNmkbhkRyYodO3awePFiGjZsyNq10aUuH3/8MRMmTGDWrFksWLCAIUOGsHXrVty9yqf7de3alXnzKt6rO5Ls7Gszo169euzYsaO8LPHc8QMOOKB8um7dumzbtvu90+vVq8ecOXM455xzePLJJxk0aFCVYt6b1HKXeLmpaZr19tyKk5qbOHEinTt35vbbb+eyyy7j9ddfZ+PGjRx44IE0bdqUlStX8vzzz3Pqqady9NFHU1payty5c+nZsyebNm2iYcOGHHTQQWzatCnp9q+++mp69erFkCFDOOGEEwB4+OGHGTBgAH369GHatGnccMMNvPrqqxxyyCE0adKE3NxcnnnmGQDeeustPv7445SvIzGGL7/8ks2bNzN48GB69+7NEUcckaF3K/OU3EViZF+cLVSxz33QoEFcdtll3H///cyZM4eDDjqIPn36cOutt3LzzTdz3HHH0bVrVw4//HBOOukkABo0aEBhYSE/+clP2LJlCw0bNuTll1+mb9++jB8/nry8vPK+/DKtW7dm+vTpjB49mlWrVlGnTh369OnD2WefzU033cSll15K9+7dadSoEVOmRGMZnnPOOUydOpW8vDx69uzJkUcemfL1XXLJJVx55ZU0bNiQ559/nqFDh5b/2pg4cWKG383M2S/uoZqfn++6WYdUpkqnQuakec/qmLTcFy9eTOfOnfd1GLIXJPuszWyeu+cnq68+dxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRhSchcRiSGd5y4SJ+lexJX29lKfMlo25O+2bdvo3LkzU6ZMqdKojJMmTWLUqFFVHsnxpptuonHjxtUevGtP60+dOpW77roLd8fdueyyyzI+SNjtt9/OL37xi4xuM5Fa7iJSI2VjyyxcuJAGDRrw+9//Pu11t2/fzqRJk9i8eXOV9plsaIBMef7555k0aRIvvvgiixYt4q233qJp0wx/aRIl92xScheRjDnllFNYunQpEA0F0KtXL/Ly8vjRj37E9u3bAWjcuDHjxo3jhBNO4LbbbqO0tJS+ffvSt2/f8uVlZsyYwSWXXAJEV4pec8019O3bl+uvvx6A+fPn069fPzp16lQ+pDDAr3/9a3r27En37t13GVb4tttu46ijjmLAgAHlwxFXdMcddzBhwoTy8dtzcnLKR7QsLi6md+/edO/enbPOOot169YBcOqpp1J2IeYXX3xBbm4uEI0Ff/bZZzNo0CA6derEddddB8CYMWPKr+y98MIL+eqrrxgyZAjHHnss3bp122144+pQcheRjNi2bRvPP/88xxxzDIsXL6awsJB//OMfFBcXU7duXaZNmwbAV199Rbdu3XjzzTcZN24cbdu2Zfbs2cyePTvlPj744ANefvllfvOb3wCwYMECnn32WV5//XVuueUWSktLefHFF1myZAlz5syhuLiYefPm8be//Y158+Yxffp03n77bZ544gnmzp2bdB8LFy7k+OOPT7psxIgR3HnnnSxYsIBjjjmGm2++OWXMxcXFFBYW8s4771BYWMjy5csZP358+S+eadOm8cILL9C2bVvmz5/PwoULMzIgWco+dzM7Ckj8GjkcGAdMDeW5wDLgPHdfF26i/VtgMLAZuMTd36pxpCKyX0ocW+aUU05h5MiRTJ48mXnz5pUP4btlyxZatWoFRH3055xzTrX2NWzYMOrWrVs+P3ToUBo2bEjDhg3p27cvc+bM4bXX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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -346,12 +346,12 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# Read the raw data\n", - "fp = 'examples/20200811_QLD_dummy_dataset_individual_v2.xlsx'\n", + "fp = '20200811_QLD_dummy_dataset_individual_v2.xlsx'\n", "data = pd.read_excel(fp)\n", "\n", "# Limit our attention to the onset date column\n", @@ -390,7 +390,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -409,7 +409,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -430,7 +430,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -444,16 +444,16 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 20, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -494,7 +494,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -512,7 +512,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -520,22 +520,22 @@ "output_type": "stream", "text": [ "--- --- ---\n", - "103 105 106\n", - "101 105 106\n", - "101 105 106\n", - "102 105 106\n", - "105 106 109\n", - " 99 101 102\n", - "101 102 105\n", - "101 104 105\n", + "105 107 108\n", + " 99 100 105\n", " 99 101 102\n", "105 106 108\n", - "105 107 108\n", + "105 108 109\n", + " 99 105 108\n", + "100 101 105\n", "105 106 107\n", - "101 105 106\n", - " 93 102 105\n", - "101 105 108\n", - "101 105 106\n", + " 96 99 102\n", + " 99 105 106\n", + "109 111 112\n", + "105 107 109\n", + " 99 105 107\n", + "105 108 109\n", + " 98 99 102\n", + "102 105 106\n", "--- --- ---\n" ] } @@ -568,7 +568,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -586,7 +586,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -594,22 +594,22 @@ "output_type": "stream", "text": [ "------------------------- ------------------------- -------------------------\n", - "(105, 115.21839387400541) (106, 97.59114407023299) (107, 100.34940313908737)\n", - "(105, 117.25417732610367) (106, 104.23912824635045) (108, 117.06529281983967)\n", - "(105, 115.95392468789942) (106, 105.70285632926971) (108, 117.4615241655847)\n", - "(105, 118.29109141643858) (106, 103.15804938206566) (108, 115.5464560847904)\n", - "(105, 117.70329438816407) (106, 104.40444786503213) (108, 116.99608848118805)\n", - "(101, 94.689048372471) (105, 116.0949394107738) (106, 103.06983450354892)\n", - "(105, 113.67421829584055) (106, 101.9473055737617) (107, 99.95925076899584)\n", - "(105, 116.9078528387472) (106, 105.79938419235987) (108, 115.9914550249523)\n", - "(105, 116.80950692723854) (106, 102.6301665683568) (107, 100.67531148143462)\n", - "(105, 115.72742036447744) (106, 107.88994258278399) (107, 102.52016868776991)\n", - "(105, 117.62578285107156) (106, 103.69083602391765) (108, 117.29039524923428)\n", - "(105, 118.25597266215482) (108, 116.37365036283154) (109, 125.8640080386831)\n", - "(102, 91.96496936277254) (105, 117.32759563691798) (108, 115.16448612802196)\n", - "(101, 94.46173246507533) (105, 120.20045540650608) (106, 107.19329122189083)\n", - "(105, 117.54825980460737) (108, 115.51091231877217) (109, 124.62289204221452)\n", - "(99, 91.71742801251821) (102, 92.58659511143924) (105, 122.91757382065407)\n", + "(105, 116.86301270168042) (106, 104.66698977630585) (108, 117.90948712985846)\n", + "(105, 116.84805969989975) (106, 100.70492207063944) (107, 98.94894027765258)\n", + "(102, 94.60873103816994) (105, 115.24950254906435) (106, 101.89972415295779)\n", + "(102, 85.46495872995001) (105, 120.65363638370764) (106, 96.22690888174111)\n", + "(105, 115.82634760456858) (107, 99.8266276405775) (108, 117.31345148742548)\n", + "(105, 116.89359707120457) (106, 114.01741777965799) (107, 99.98686217752402)\n", + "(105, 115.69634647871135) (106, 102.40202455918188) (108, 115.88957359318738)\n", + "(99, 91.01373517361935) (105, 113.63138593288022) (106, 104.51405676017748)\n", + "(99, 87.87686746797408) (101, 88.16181562762358) (105, 116.3749273797439)\n", + "(99, 91.99253759768908) (105, 117.06808546034154) (106, 101.02893703174777)\n", + "(99, 91.40812978745089) (105, 118.21763951570028) (106, 103.326115835167)\n", + "(101, 93.94811056635808) (105, 116.366947379458) (106, 100.71689835435245)\n", + "(105, 119.58112427822198) (106, 102.34542989198235) (108, 113.25067036983091)\n", + "(105, 117.57580304853036) (106, 106.4215264247905) (107, 96.6622728513612)\n", + "(101, 95.63776704837801) (102, 93.02601603831863) (105, 115.77281294006389)\n", + "(105, 116.93756830657367) (108, 121.3811954879202) (109, 126.25681609366438)\n", "------------------------- ------------------------- -------------------------\n" ] } @@ -625,6 +625,13 @@ "print(tabulate(table))" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, From bab5caebd4e6287456d10e4769ccaeeba79723a0 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 15 Jan 2021 11:46:48 +1100 Subject: [PATCH 127/185] Removed old print debugging statement --- relm/mechanisms/selection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relm/mechanisms/selection.py b/relm/mechanisms/selection.py index 44bb0d8..b6bd1bd 100644 --- a/relm/mechanisms/selection.py +++ b/relm/mechanisms/selection.py @@ -51,7 +51,7 @@ def release(self, values): self._update_accountant() utilities = self.utility_function(values) - print("########", utilities) + #print("########", utilities) index = self._sampler(utilities) return self.output_range[index] From 32e01fef7545f73943d1a39e14e9ca3f7e260cbf Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 15 Jan 2021 12:04:50 +1100 Subject: [PATCH 128/185] Added sections on ExponentialMechanism and ReportNoisyMax --- examples/relm_demo.ipynb | 1052 ++++++++++++++++++++++++++++++-------- 1 file changed, 848 insertions(+), 204 deletions(-) diff --git a/examples/relm_demo.ipynb b/examples/relm_demo.ipynb index feb19ea..4ab531b 100644 --- a/examples/relm_demo.ipynb +++ b/examples/relm_demo.ipynb @@ -4,26 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Histogram Queries\n", - "Using RelM for basic differentially private release is fairly striaghtforward.\n", - "For example, suppose that the database consists of records indicating the age group of each patient who received a COVID-19 test on 09 March, 2020.\n", - "Each patient is classified as belonging to one of eight age groups: 0-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, and 70+.\n", - "One common way to summarise this kind of data is with a histogram.\n", - "That is, to report the number of patients that were classified as belonging to each age group.\n", - "\n", - "The Laplace mechanism can be used to produce a differentially private histogram that summarises the data without compromising the privacy of the patients whose data comprise the database. To do so, Laplace noise is added to the count for each age group and the noisy counts are released instead of the exact counts." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Basic Usage\n", - "To produce such a differentially private histogram using Relm a user would:\n", - " - Read the raw data\n", - " - Compute the exact query responses\n", - " - Create a differentially private release mechanism\n", - " - Compute perturbed query responses" + "## Generic Imports" ] }, { @@ -37,12 +18,32 @@ "import matplotlib.pyplot as plt\n", "\n", "from collections import Counter\n", - "from tabulate import tabulate" + "\n", + "# Note: imports from the relm module will be done as needed below" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Mechanisms\n", + "Using RelM for basic differentially private release is fairly striaghtforward.\n", + "For example, suppose that the database consists of records indicating the age group of each patient who received a COVID-19 test on 09 March, 2020.\n", + "Each patient is classified as belonging to one of eight age groups: 0-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, and 70+.\n", + "One common way to summarise this kind of data is with a histogram.\n", + "That is, to report the number of patients that were classified as belonging to each age group." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Wrangling" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -54,9 +55,24 @@ "values = exact_counts.values" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Laplace Mechanism\n", + "The Laplace mechanism can be used to produce a differentially private histogram that summarises the data without compromising the privacy of the patients whose data comprise the database. To do so, Laplace noise is added to the count for each age group and the noisy counts are released instead of the exact counts." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Basic Usage" + ] + }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -72,7 +88,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Visualising the Results\n", + "#### Visualising the Results\n", "Notice that the magnitude of the differences between the exact counts and perturbed counts depends only on the value of the privacy paramter `epsilon`. Smaller values of epsilon yield larger perturbations. Larger perturbations yeild lower utility.\n", "\n", "A simple way to try to understand this effect is to compare the two histograms to one another. If the value of `epsilon` is not too small, then we expect that the two histograms will look similar." @@ -80,66 +96,66 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238241.96834600-9238229.368824
110-19386371.595060110-19386385.459906
220-29688682.629824220-29688687.872696
330-39779768.288186330-39779778.083646
440-49621625.749218440-49621627.634140
550-59582577.070481550-59582598.804677
660-69344287.981099660-69344334.127363
770+261256.436250770+261249.754652
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -147,7 +163,7 @@ }, { "data": { - "image/png": "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P/44mzdvznhy79WrV71L7ho4TEQyrry8nGOPPZb33nsPgIsvvph7770XgO9973vk5+fTs2dPbrxxd4fAG2+8wde+9jVOOOEE+vXrR3l5ORMnTqSwsJC8vDwKCwv32MdvfvMbCgoKOOWUU4CoX/qCCy6gffv2rF+/nnPOOYfevXvTv39/Fi1aBMBNN93E5MmTK7fRq1cvSkpKKCkpoXv37lx11VX07NmTIUOGsHXrVmbNmkVRURGXXHIJeXl5bN26lfHjx9OjRw969+7NuHHjOFip5S4idbJ161by8vIq5ydMmMBFF13E3XffzWWXXcYPf/hDNmzYwFVXXQXAbbfdxuGHH87OnTsZPHgwixYt4rjjjuOiiy6isLCQvn37smnTJpo1a8Ytt9xCUVERd9999177Xbx4MQUFBXuVA9x4442ceOKJPPnkk7zyyiuMHj065a+LZcuW8cgjj3Dvvfdy4YUX8vjjj3PppZdy9913M3nyZPLz81m/fj2zZ8/m3XffxczYuHFjHd657FJyl3i5qWWa9XSLz0yprlvmG9/4Bo899hjXXHMNCxcurCx/9NFHmTZtGjt27GDlypW88847mBkdOnSgb9++ALRo0aJOMb322ms8/nh0P/NBgwaxbt06ysv3/Zl37dq18kvqpJNOoqSkZK86LVq0ICcnhyuvvJLhw4dz9tln1ynObFK3jIhkxa5du1i6dClNmzZl/froUpePPvqIyZMnM2fOHBYtWsTw4cPZtm0b7l7j0/169uzJggVV79UdSXb2tZnRqFEjdu3aVVmWeO74IYccUjndsGFDduzY+97pjRo1Yv78+Zx//vk8+eSTDB06tEYx709K7iKSFVOmTKF79+488sgjXHHFFWzfvp1NmzZx6KGH0rJlS1avXs3zzz8PwHHHHUdZWRlvvPEGAJs3b2bHjh0cdthhbN68Oen2r732WqZPn868efMqyx566CFWrVrFgAEDePjhhwF49dVXOeKII2jRogW5ubm8+eabALz55pt89NFHKV9HYgyfffYZ5eXlDBs2jKlTp2btQHImqFtGJEYOxNlCVfvchw4dyhVXXMF9993H/PnzOeywwxgwYAC33norN998MyeeeCI9e/bk6KOP5tRTTwWgSZMmFBYW8v3vf5+tW7fStGlTXn75ZQYOHMikSZPIy8ur7Muv0L59e2bOnMm4ceNYs2YNDRo0YMCAAZx33nncdNNNXH755fTu3ZtmzZoxfXo0luH555/PjBkzyMvLo2/fvhxzzDEpX99ll13G1VdfTdOmTXn++ecZMWJE5a+NKVOmZPjdzJyD4h6q+fn5rpt1SHVqdCpkTpr3rI5Jn/vSpUvp3r37gQ5D9oNkn7WZLXD3/GT11S0jIhJDSu4iIjGk5C4iEkNK7iIiMaTkLiISQ0ruIiIxpPPcReIk3eEX0t5e6lNGK4b83bFjB927d2f69Ok1GpVx6tSpjB07tsYjOd500000b9681oN37Wv9GTNmcOedd+LuuDtXXHFFxgcJ+8UvfsFPfvKTjG4zkVruIlInFWPLLF68mCZNmvDb3/427XV37tzJ1KlT2bJlS432mWxogEx5/vnnmTp1Ki+++CJLlizhzTffpGXLDH9pEiX3bFJyF5GMOf3001m+fDkQDQXQr18/8vLy+O53v8vOnTsBaN68ORMnTuTkk0/mtttuo6ysjIEDBzJw4MDK5RVmzZrFZZddBkRXil533XUMHDiQG264AYCFCxcyaNAgunXrVjmkMMAvf/lL+vbtS+/evfcYVvi2227j2GOP5cwzz6wcjriq22+/ncmTJ1eO356Tk1M5omVxcTH9+/end+/enHvuuWzYsAGAM844g4oLMT/99FNyc3OBaCz48847j6FDh9KtWzeuv/56AMaPH195Ze8ll1zC559/zvDhwznhhBPo1avXXsMb14aSu4hkxI4dO3j++ec5/vjjWbp0KYWFhfztb3+juLiYhg0bVo718vnnn9OrVy/mzZvHxIkT6dixI3PnzmXu3Lkp9/H+++/z8ssv86tf/QqARYsW8eyzz/KPf/yDW265hbKyMl588UWWLVvG/PnzKS4uZsGCBfzlL39hwYIFzJw5k7feeosnnniichybqhYvXsxJJ52UdNno0aO54447WLRoEccffzw333xzypiLi4spLCzk7bffprCwkBUrVjBp0qTKXzwPP/wwL7zwAh07dmThwoUsXrw4IwOSpexzN7NjgcSvkaOBicCMUJ4LlAAXuvuGcBPtXwPDgC3AZe7+Zp0jFZGDUuLYMqeffjpjxoxh2rRpLFiwoHII361bt9KuXTsg6qM///zza7WvkSNH0rBhw8r5ESNG0LRpU5o2bcrAgQOZP38+r732Gi+++CInnngiEA32tWzZMjZv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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEWCAYAAACdaNcBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAApmUlEQVR4nO3dfZxVZb338c9XEAEVlQcJRR0sVB7EwQbUVDQxRDExlYK0IDXr3NrRytcRjyfFinPsxFEz7fYmMzEfgDSV48NJoCg9GQiGBCKBQTiBQPgAGJAjv/uPtQY2w56ZvWf2Rmb5fb9e+7XXvta11vrttWd++9rXWutaigjMzCxb9vqgAzAzs9JzcjczyyAndzOzDHJyNzPLICd3M7MMcnI3M8sgJ3ezOiSdLqn6g47DrDmc3D9EJG3KeWyTtDnn9cVNWN8sSZc3UqeNpHGSlkp6V9IKSfdKqmjyGykstj0qQaf7ICQNLPN2ekqaLGmdpA3pfv+hpO7l3K7teZzcP0QiYr/aB7AS+HRO2YNl2uwjwHnA54EDgOOAecDgMm1vjyNJwBeAN4HRZdzOx4DZwCqgf0R0AE4GXgNOqWeZ1uWKxz5gEeHHh/ABrADOTKf3AsaSJIH1wFSgYzqvLfBAWv428CLQFRgPvA9sATYBd+bZxpnAZuCwBuI4BJhGkviWAV/OmXcf8N2c16cD1XXew7XAAuAdYEoa777pdrelsW1KtzMQmAtsANYAt9YT0+lANfCvwN/S7VyczhuQLts6p/6FwPwG3uOgNJ5L0v3YJmdeK+C/0u0sB64Conb9JF+IPwFWA38Fvgu0qmc7DwD/3cjnXvvergPeAH4G7APcTvKlsCqd3ietPwZ4vs46AvhYzmd0NzAd2Aj8Bjjig/779iPccjcA/hk4HziNJAm+BdyVzhtNkmAOAzoBXwU2R8QNwHPAVZG0/K/Ks94zgTkR8XoD236YJNkcAlwE/LukYlr1nwWGAj2AfsCYiHgXOBtYFTt+mawCfgD8IJIW7UdJvsTq8xGgM3AoyT6YKOnoiHiRJEF/KqfuJSRJsj6jgf8m+fIBODdn3pfTWCuB40k+h1yTgBrgY0B/YAhQX1fYmcCjDcRR6yNAR+AI4ArgBuDENIbjSL4E/62A9dS6GPgOyf6aD5TrV6AVwcndAL4C3BAR1RGxFRgHXJT+ZH+PJKl/LCLej4h5EbGhwPV2Imlx5iXpMJLugusiYktEzAfuIenCKNQdEbEqIt4kSaCVDdR9D/iYpM4RsSkift/Iur8VEVsj4jfAUyRfJJAk3EvS99AROAt4KN8KJLUHRgAPRcR7JN1UuV0znyX5wqmOiLeAW3KW7UqS+K+JiHcjYi1wGzCynng7k7TGa5e/StLb6TGVH+fU2wbclL63zSTJ+dsRsTYi1gE3U9xn8FRE/Db927kBOCn9bO0D5ORukLTgHksTwdvAYpIul64kLdJfApMlrZL0n5L2LnC964FuDcw/BHgzIjbmlP2FpLVcqDdypv8O7NdA3cuAo4BXJb0o6dwG6r6V/gLIjeuQdPoB4NOS9iNJzs9FRH1fYp8haXk/nb5+EDhbUpf09SFA7i+b3OkjgL2B1Tmfzf8DDq5nWzvt74i4MyIOJOlmyf3M1kXElpzXh6TvL997LcT2mCNiE0kXWzHLWxk4uRsk/5xnR8SBOY+2EfHXiHgvIm6OiN7AJ0i6FL6YLtfYkKIzgIENnKmxCugoaf+cssNJ+pYB3gXa58z7SBHvaZfYImJpRIwiSY7fAx6RtG89yx9UZ97habxExF+BF0gS9xdovEtmP2ClpDeAn5Mk2lHp/NVA7v7JbfG+DmwFOud8Lh0iok8925oJXNBALLXq7ptVJF8ktba/V+p8BpLyfQaH5czfj6TLZ1WeerYbObkbJAfExks6AkBSF0nD0+lPSjpWUiuSA5HvkbTqITmweGR9K42IGSQH2h6T9HFJrSXtL+mrki5N++J/B/yHpLaS+pG0rmv7bOcD50jqmCaVa4p4T2uATpIOqC2QdImkLhGxjeTgMDnvJZ+b01M5TyX5Uvt5zrz7gX8BjgUey7ewpENJzgo6l6S7qJKkT/t77OiamQpcLelQSQeSHOgEIP018CzwX5I6SNpL0kclnVZPvOOAUyXdmm4bSZ2BXg28R0iOe/xb+rl3Bm4k+XUC8DLQR1KlpLbpNuo6R9IpktqQ9L3PbuQ4i+0GTu4GyYHGacCzkjYCvwdOSOd9hKSfeANJd81v2PGP/wOSvvm3JN1Rz7ovIumSmEJyRstCoIqkVQ9JC7aCpKX3GElf8PR03s9IkssKkiRXe0CyURHxKknS+nPapXEIyYHXRZI2pbGPrNM9kesNkgPLq0i+bL6arrPWY6TdWXW6b3J9geQsmmcj4o3aB3AH0E9SX+DH6XtbAPyBZF/VsONL54tAG+CVNJ5HqKerKyL+RHJgtDvwcvpZ/m/6Hr5VT4yQnIEzN43hj8BLaVntOr9N8nktBZ7Ps/xDwE0k3TEfJ+nDtw+YInyzDrOmkPQa8JX0F0qp1nk2cHdEHNFo5T2ApPtITk8t5uwa2w3ccjdrAkkXkvRd/6qZ62kn6Zy0y+pQkhZw3m4es2L46jSzIkmaBfQGvpD23zdrdSSnHk4hudDpKZI+b7NmcbeMmVkGuVvGzCyD9ohumc6dO0dFRcUHHYaZWYsyb968v0VEl3zz9ojkXlFRwdy5cz/oMMzMWhRJf6lvXkHdMpK+LmmRpIWSHk4vOOkoaXo6XvR0SQfl1L9e0jJJSySdVYo3YWZmhWs0uaenZ/0zUBURfUmGKB1JMkTszIjoSXLZ89i0fu90fh+Si0Z+lF7daGZmu0mhB1RbA+3SUQLbk1zxNpxkdDzS5/PT6eHA5HTEueUkY3SX9e4zZma2s0b73CPir5ImkNy5ZzPwbEQ8K6lr7Uh4EbFaUu1IdYeSXL5eq5o8o/xJuoJkLGkOP/zw5r0Lsw+p9957j+rqarZsqW8UBcuCtm3b0r17d/beu9ABWQtI7mlf+nCSmyG8Dfxc0iUNLZKnLN8IfROBiQBVVVU+2d6sCaqrq9l///2pqKgguZufZU1EsH79eqqrq+nRo0fByxXSLXMmsDwi1qU3G/gFydCvayR1A0if16b1q9l52NLuePhPs7LYsmULnTp1cmLPMEl06tSp6F9nhST3lcCJktqnN/odTDI64DR2DFs6GnginZ4GjJS0j6QeQE9gTlFRmVnBnNizrymfcSF97rMlPUIyDGgNybCkE0luQDBV0mUkXwAj0vqLJE0lGaK0BrgyIhoaM9vMzEqsoIuYIuImktHqcm0lacXnqz8eGN+80MysWBVjnyrp+lbcMqzROq1ateLYY4/d/nrkyJGMHTu2JNufP38+q1at4pxzzsk7f86cOVx77bWsWbMGSZxyyinccccdtG/fPm/9prjvvvsYMmQIhxzSsu4cuEdcoWrWkGIS1oq2ny+s4rh3mhiN1dWuXTvmz59flnXPnz+fuXPn5k3ua9asYcSIEUyePJmTTjqJiODRRx9l48aNJU/uffv2bXHJ3QOHmVnJvfPOOxx99NEsWbIEgFGjRvHjH/8YgH/6p3+iqqqKPn36cNNNOzoEXnzxRT7xiU9w3HHHMXDgQN555x1uvPFGpkyZQmVlJVOm7HwjrrvuuovRo0dz0kknAUm/9EUXXUTXrl158803Of/88+nXrx8nnngiCxYsAGDcuHFMmDBh+zr69u3LihUrWLFiBb169eLLX/4yffr0YciQIWzevJlHHnmEuXPncvHFF1NZWcnmzZsZO3YsvXv3pl+/flx77bVl3Y/N4Za7mTXL5s2bqays3P76+uuv53Of+xx33nknY8aM4eqrr+att97iy1/+MgDjx4+nY8eOvP/++wwePJgFCxZwzDHH8LnPfY4pU6YwYMAANmzYQPv27fn2t7/N3LlzufPOO3fZ7sKFCxk9evQu5QA33XQT/fv35/HHH+dXv/oVX/ziFxv9dbF06VIefvhhfvzjH/PZz36WRx99lEsuuYQ777yTCRMmUFVVxZtvvsljjz3Gq6++iiTefvvtpu62snNyN7Nmqa9b5lOf+hQ///nPufLKK3n55Ze3l0+dOpWJEydSU1PD6tWreeWVV5BEt27dGDBgAAAdOnRoVkzPP/88jz76KABnnHEG69ev5513Gu6K69Gjx/YvqY9//OOsWLFilzodOnSgbdu2XH755QwbNoxzzz23WXGWk7tlzKwstm3bxuLFi2nXrh1vvvkmAMuXL2fChAnMnDmTBQsWMGzYMLZs2UJEFH26X58+fZg3b17eefluQiSJ1q1bs23bjptn5Z47vs8++2yfbtWqFTU1Nbuso3Xr1syZM4cLL7yQxx9/nKFDhxYV8+7k5G5mZXHbbbfRq1cvHn74YS699FLee+89NmzYwL777ssBBxzAmjVreOaZZwA45phjWLVqFS+++CIAGzdupKamhv3335+NGzfmXf9VV13FpEmTmD179vayBx54gDfeeINBgwbx4IMPAjBr1iw6d+5Mhw4dqKio4KWXXgLgpZdeYvny5Y2+j9wYNm3axDvvvMM555zD7bffXrYDyaXgbhmzDCnk1MVSq9vnPnToUC699FLuuece5syZw/7778+gQYP47ne/y80330z//v3p06cPRx55JCeffDIAbdq0YcqUKXzta19j8+bNtGvXjhkzZvDJT36SW265hcrKyu19+bW6du3K5MmTufbaa1m7di177bUXgwYN4oILLmDcuHF86Utfol+/frRv355Jk5IxDi+88ELuv/9+KisrGTBgAEcddVSj72/MmDF89atfpV27djzzzDMMHz58+6+N2267rbQ7s4T2iHuoVlVVhW/WYfXxqZD1W7x4Mb169fqgw7DdIN9nLWleRFTlq+9uGTOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczyyCf526WJeMOKPH6Gj9ltHbI35qaGnr16sWkSZMKHpVxxYoV/O53v+Pzny/wFNYcFRUVzJ07l86dOxe9bEPLb9q0iW9+85vMmDGDtm3b0qlTJ77//e9zwgknNGk7+TQ2lHEpuOVuZs1SO7bMwoULadOmDXfffXdBy9XU1LBixQoeeuihorf5/vvlu//P5ZdfTseOHVm6dCmLFi3ivvvu429/+1tJtzF//nyefvrpkq6zLid3MyuZU089lWXLlvHuu+9y6aWXMmDAAPr3788TTyR34bzvvvsYMWIEn/70pxkyZAhjx47lueeeo7Kykttuu4377ruPq666avv6zj33XGbNmgXAfvvtx4033sgJJ5zACy+8AMD3v/99Bg4cyMCBA1m2bBkA69at48ILL2TAgAEMGDCA//3f/wVg/fr1DBkyhP79+/OVr3wl7/gzr732GrNnz+a73/0ue+2VpMcjjzySYcOSK39vvfVW+vbtS9++fbn99tuB5NdH3759t69jwoQJjBs3DoDTTz+d6667joEDB3LUUUfx3HPP8Y9//GOXoYx/85vfUFlZSWVlJf379693yIViuFvGzEqipqaGZ555hqFDhzJ+/HjOOOMM7r33Xt5++20GDhzImWeeCcALL7zAggUL6NixI7NmzWLChAk8+eSTQJL86/Puu+/St29fvv3tb28v69ChA3PmzOH+++/nmmuu4cknn+Tqq6/m61//OqeccgorV67krLPOYvHixdx8882ccsop3HjjjTz11FNMnDhxl20sWrSIyspKWrVqtcu8efPm8dOf/pTZs2cTEZxwwgmcdtppHHTQQY3ulzlz5vD0009z8803M2PGjF2GMv70pz/NXXfdxcknn8ymTZto27Zto/u7MY0md0lHA7mj5B8J3Ajcn5ZXACuAz0bEW+ky1wOXAe8D/xwRv2x2pGa2R8odW+bUU0/lsssu4xOf+ATTpk3bfmOMLVu2sHLlSiAZCrhjx45Fb6dVq1ZceOGFO5WNGjVq+/PXv/51AGbMmMErr7yyvc6GDRvY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\n", "text/plain": [ "
" ] @@ -165,13 +181,10 @@ "age_ranges = np.array([a.lstrip(\"AgeGroup_\") for a in age_groups])\n", "\n", "# Create a dataframe with both exact and perturbed counts\n", - "df = pd.DataFrame(\n", - " {\n", - " \"Age Group\": age_ranges,\n", - " \"Exact Counts\": values,\n", - " \"Perturbed Counts\": perturbed_counts,\n", - " }\n", - ")\n", + "column_names = [\"Age Group\", \"Exact Counts\", \"Perturbed Counts\"]\n", + "column_values = [age_ranges, values, perturbed_counts]\n", + "table = {k: v for (k, v) in zip(column_names, column_values)}\n", + "df = pd.DataFrame(table)\n", "\n", "# Display the two histograms as a table\n", "display(df.style.set_caption(\"Test Counts by Age Group\"))\n", @@ -185,7 +198,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Integer Counts\n", + "### Geometric Mechanism\n", "In this example, all of the exact counts are integers. That is because they are the result of so-called counting queries. The perturbed counts produced by the Laplace mechanism are real-valued. In some applications, e.g. when some downstream processing assumes it will receive integer-valued data, we may need the perturbed counts to be integers. One way to achieve this is by simply rounding the outputs of the Laplace mechanism to the nearest integer. Because this differentially private release mechanisms are not affected by this kind of post-processing, doing so will not affect any privacy guarantees.\n", "\n", "Alternatively, we could use the geometric mechanism to compute the permuted counts. The geometric mechanism is simply a discrete version of the Laplace mechanism and it produces integer valued perturbations." @@ -195,17 +208,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Basic Usage\n", - "As before, to produce such a differentially private histogram using Relm a user would:\n", - " - Read the raw data\n", - " - Compute the exact query responses\n", - " - Create a differentially private release mechanism\n", - " - Compute perturbed query responses" + "#### Basic Usage" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -221,72 +229,72 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Visualising the Results\n", + "#### Visualising the Results\n", "As with the Laplace mechanism, we can plot the exact histogram alongside the differentially private histogram to get an idea if we have used too small a value for `epsilon`." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923823600-9238228
110-19386375110-19386380
220-29688679220-29688691
330-39779778330-39779829
440-49621664440-49621619
550-59582588550-59582596
660-69344358660-69344335
770+261219770+261271
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -294,7 +302,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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xx13cPPNN1NZWclrr73Gww8/zEsvvYQk3njjjabutrJzcjezZqmvW+bTn/40v/zlL7nyyit58cUXd5TPmDGDKVOmUFNTw7p161i6dCmS6NatG4MGDQKgQ4cOzYrpmWee4aGHHgLgjDPOYNOmTbz5ZsNdcb169drxJXX88cezevXqnep06NCBtm3bcvnllzNixAjOPffcZsVZTgV1y0j6hqQlkhZLeiC9U30nSbMkrUifO+bUnyBppaTlks4qX/hmtqfavn07y5Yto127drz22msArFq1iptvvpk5c+awaNEiRowYwbvvvktEFH26X79+/ViwYEHeefluQiSJ1q1bs337BzfPyj13fJ999tkx3apVK2pqanZaR+vWrZk/fz4XXnghjzzyCMOHDy8q5l2p0eSe3tfxH4HKiOgPtAJGA+OBORHRG5iTvkZS33R+P5K7zf9EUqvyhG9me6pbb72VPn368MADD3DppZfy3nvvsXnzZvbdd18OOOAA1q9fz5NPPgnA0Ucfzdq1a3nuuecA2LJlCzU1Ney///5s2bIl7/qvuuoqpk6dyrx583aU3Xvvvbz66qsMGTKE++67D4C5c+fSuXNnOnToQM+ePXn++ecBeP7551m1alWj7yM3hq1bt/Lmm29yzjnncNttt5XtQHIpFNot0xpoJ+k9oD2wFpgAnJ7OnwrMBa4DRgLTImIbsErSSmAw8GzpwjazfAo5dbHU6va5Dx8+nEsvvZS77rqL+fPns//++zNkyBC+973vceONNzJw4ED69evHEUccwcknnwxAmzZtmD59Ol//+td55513aNeuHbNnz+ZTn/oUN910ExUVFTv68mt17dqVadOmce2117Jhwwb22msvhgwZwgUXXMCkSZP48pe/zIABA2jfvj1Tp04F4MILL+QXv/gFFRUVDBo0iCOPPLLR9zdu3Di+9rWv0a5dO5588klGjhy549fGrbfeWtqdWUIF3UNV0tXAZJIb+D4VERdLeiMiDsyp83pEdJR0B/CHiLg3Lf8Z8GREPFhnnVcAVwAcdthhx//lL/WOOW9WuI/YqZDLli2jT58+uzsM2wXyfdaSFkREZb76hXTLdCRpjfcCDgH2lXRJQ4vkKdvpGyQipkREZURUdumS9y5RZmbWRIUcUD0TWBURGyPiPeBXwCeB9ZK6AaTPG9L61UCPnOW7k3TjmJnZ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\n", "text/plain": [ "
" ] @@ -306,19 +314,149 @@ } ], "source": [ - "# Extract the set of possible age groups\n", - "age_groups = np.sort(data[\"age_group\"].unique())\n", - "# Reformat the age group names for nicer display\n", - "age_ranges = np.array([a.lstrip(\"AgeGroup_\") for a in age_groups])\n", + "# Create a dataframe with both exact and perturbed counts\n", + "column_values = [age_ranges, values, perturbed_counts]\n", + "table = {k: v for (k, v) in zip(column_names, column_values)}\n", + "df = pd.DataFrame(table)\n", "\n", + "# Display the two histograms as a table\n", + "display(df.style.set_caption(\"Test Counts by Age Group\"))\n", + "\n", + "# Plot the two histograms as bar graphs\n", + "df.plot(x=\"Age Group\", title=\"Test Counts by Age Group\", kind=\"bar\", rot=0)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exponential Mechanism" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Basic Usage\n", + "The `ExponentialMechanism` does not lend itself to vectorised queries as easily as the `LaplaceMechanism` or `GeometricMechanism`. So, to produce a histogram query that is comparable to those discussed above we wrap the query releases in a loop and compute them one at a time." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a differentially private release mechanism\n", + "from relm.mechanisms import ExponentialMechanism\n", + "\n", + "output_range = np.arange(2**10)\n", + "utility_function = lambda x: -abs(output_range - x)\n", + "\n", + "perturbed_counts = np.empty(len(values), dtype=np.int)\n", + "for i, value in enumerate(values.astype(np.float)):\n", + " mechanism = ExponentialMechanism(epsilon=0.1,\n", + " utility_function=utility_function,\n", + " sensitivity=1.0,\n", + " output_range=output_range)\n", + "\n", + " # Compute perturbed query responses\n", + " perturbed_counts[i] = mechanism.release(values=value)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Visualising the Results" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "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", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238239
110-19386387
220-29688689
330-39779780
440-49621621
550-59582580
660-69344344
770+261260
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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qir69OnDuHE7OgReeOEFPvaxj3HccccxcOBA3n77bW688UamTp1KZWUlU6e+/0Zcd955J6NHj+akk04Ckn7piy66iK5du/LGG29w/vnn069fP0488UQWLFgAwPjx45k4ceL2Nvr27cuKFStYsWIFvXr14otf/CJ9+vRhyJAhbN68mYcffpjq6mouvvhiKisr2bx5M2PHjqV3797069ePa6+9tqzbsSW8525mLbJ582YqKyu3v77++uv5zGc+wx133MGYMWO4+uqrefPNN/niF78IwIQJE+jYsSPvvfcegwcPZsGCBRxzzDF85jOfYerUqQwYMIANGzbQvn17vvnNb1JdXc0dd9yx03oXLlzI6NGjdyoHGDduHP379+exxx7jl7/8JZ///Oeb/HWxdOlSHnroIX74wx/y6U9/mkceeYRLLrmEO+64g4kTJ1JVVcUbb7zBo48+yiuvvIIk3nrrreZutrJzcjezFmmoW+YTn/gEP/3pT7nyyit56aWXtpdPmzaNSZMmUVtby+rVq3n55ZeRRLdu3RgwYAAAHTp0aFFMzz33HI888ggAZ5xxBuvXr+fttxvviuvRo8f2L6mPfvSjrFixYqc6HTp0oG3btlx++eUMGzaMc889t0VxlpO7ZcysLLZt28bixYtp164db7zxBgDLly9n4sSJzJo1iwULFjBs2DC2bNlCRBR9ul+fPn2YN29e3nn5bkIkidatW7Nt246bZ+WeO77PPvtsn27VqhW1tbU7tdG6dWvmzp3LhRdeyGOPPcbQoUOLinlXcnI3s7K49dZb6dWrFw899BCXXnop7777Lhs2bGDfffflgAMOYM2aNTz99NMAHHPMMaxatYoXXngBgI0bN1JbW8v+++/Pxo0b87Z/1VVXMXnyZObMmbO97P777+f1119n0KBBPPDAAwDMnj2bzp0706FDByoqKnjxxRcBePHFF1m+fHmT7yM3hk2bNvH2229zzjnncNttt5XtQHIpuFvGLEMKOXWx1Or3uQ8dOpRLL72Uu+++m7lz57L//vszaNAgvv3tb3PTTTfRv39/+vTpw5FHHsnJJ58MQJs2bZg6dSpf+cpX2Lx5M+3atWPmzJl8/OMf5+abb6aysnJ7X36drl27MmXKFK699lrWrl3LXnvtxaBBg7jgggsYP348X/jCF+jXrx/t27dn8uRkjMMLL7yQ++67j8rKSgYMGMBRRx3V5PsbM2YMX/7yl2nXrh1PP/00w4cP3/5r49Zbby3txiyh3eIeqlVVVeGbdVhDfCpkwxYvXkyvXr0+6DBsF8j3WUuaFxFV+eq7W8bMLIOc3M3MMsjJ3cwsg5zczcwyyMndzCyDnNzNzDLI57mbZcn4A0rcXtOnjNYN+VtbW0uvXr2YPHlywaMyrlixgt/97nd89rMFnsKao6Kigurqajp37lz0so0tv2nTJr7+9a8zc+ZM2rZtS6dOnfjud7/LCSec0Kz15NPUUMal4D13M2uRurFlFi5cSJs2bbjrrrsKWq62tpYVK1bw4IMPFr3O994r3/1/Lr/8cjp27MjSpUtZtGgR9957L3/7299Kuo758+fz1FNPlbTN+pzczaxkTj31VJYtW8Y777zDpZdeyoABA+jfvz+PP57chfPee+9lxIgRfPKTn2TIkCGMHTuWZ599lsrKSm699Vbuvfderrrqqu3tnXvuucyePRuA/fbbjxtvvJETTjiB559/HoDvfve7DBw4kIEDB7Js2TIA1q1bx4UXXsiAAQMYMGAAv/3tbwFYv349Q4YMoX///nzpS1/KO/7Mq6++ypw5c/j2t7/NXnsl6fHII49k2LDkyt9bbrmFvn370rdvX2677TYg+fXRt2/f7W1MnDiR8ePHA3D66adz3XXXMXDgQI466iieffZZ/vGPf+w0lPGvf/1rKisrqayspH///g0OuVAMd8uYWUnU1tby9NNPM3ToUCZMmMAZZ5zBPffcw1tvvcXAgQM588wzAXj++edZsGABHTt2ZPbs2UycOJEnnngCSJJ/Q9555x369u3LN7/5ze1lHTp0YO7cudx3331cc801PPHEE1x99dV89atf5ZRTTmHlypWcddZZLF68mJtuuolTTjmFG2+8kSeffJJJkybttI5FixZRWVlJq1atdpo3b948fvzjHzNnzhwighNOOIHTTjuNgw46qMntMnfuXJ566iluuukmZs6cudNQxp/85Ce58847Ofnkk9m0aRNt27Ztcns3pcnkLuloIHeU/COBG4H70vIKYAXw6Yh4M13meuAy4D3gXyPiFy2O1Mx2S7ljy5x66qlcdtllfOxjH2P69Onbb4yxZcsWVq5cCSRDAXfs2LHo9bRq1YoLL7zwfWWjRo3a/vzVr34VgJkzZ/Lyyy9vr7NhwwY2btzIb37zG372s58BMGzYsCaTcn3PPfccn/rUp9h3330BuOCCC3j22Wc577zzGl3uggsuABoeRhjg5JNP5mtf+xoXX3wxF1xwAd27dy8qtnwKuUH2EqASQFIr4K/Ao8BYYFZE3CxpbPr6Okm9gZFAH+AQYKako3yTbLNsyjeee90t744++uj3lc+ZM2d7csynsSF527Ztu9Mede4wwXXT27Zt4/nnn6ddu3Y7td/UsMJ9+vThpZdeYtu2bdu7ZXLfU7Exw46hhBsaRhhg7NixDBs2jKeeeooTTzyRmTNncswxxzQaa1OK7XMfDLwaEX8BhgOT0/LJwPnp9HBgSkRsjYjlwDJgYIuiNLM9yllnncX3v//97QnxD3/4Q9569Yf0raioYP78+Wzbto3XXnuNuXPnNrqeulvvTZ06dfvt9oYMGfK+OzfVffHkDgP89NNP8+abb+7U3oc//GGqqqoYN27c9tiXLl3K448/zqBBg3jsscf4+9//zjvvvMOjjz7KqaeeSteuXVm7di3r169n69at27uYGlP/fb/66qsce+yxXHfddVRVVfHKK6802UZTiu1zHwk8lE53jYjVABGxWtLBafmhwO9zlqlJy95H0hXAFQCHH354kWGYWV67yWiX3/jGN7jmmmvo168fEUFFRUXepNevXz9at27Ncccdx5gxY7jmmmvo0aMHxx57LH379uX4449vdD1bt27lhBNOYNu2bTz0UJKabr/9dq688kr69etHbW0tgwYN4q677mLcuHGMGjWK448/ntNOO63BvHP33Xfz9a9/nY985CO0b99++6mQxx9/PGPGjGHgwGRf9fLLL6d///4A2w/09ujRo6A97vpDGT/33HP86le/olWrVvTu3Zuzzz67yTaaUvCQv5LaAKuAPhGxRtJbEXFgzvw3I+IgSXcCz0fE/Wn5j4CnIuKRhtr2kL/WGA/52zAP+fvPo5xD/p4NvBgRa9LXayR1S1fQDVibltcAh+Us153kS8HMzHaRYrplRrGjSwZgOjAauDl9fjyn/EFJt5AcUO0JNN5xZh8I7xGbZVdByV1Se+ATwJdyim8Gpkm6DFgJjACIiEWSpgEvA7XAlT5Txqx8mnNzaduzNOeOeQUl94j4O9CpXtl6krNn8tWfAEwoOhozK0rbtm1Zv349nTp1coLPqIhg/fr1RV/Y5CtUzfZg3bt3p6am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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ "# Create a dataframe with both exact and perturbed counts\n", - "df = pd.DataFrame(\n", - " {\n", - " \"Age Group\": age_ranges,\n", - " \"Exact Counts\": values,\n", - " \"Perturbed Counts\": perturbed_counts,\n", - " }\n", - ")\n", + "column_values = [age_ranges, values, perturbed_counts]\n", + "table = {k: v for (k, v) in zip(column_names, column_values)}\n", + "df = pd.DataFrame(table)\n", "\n", "# Display the two histograms as a table\n", "display(df.style.set_caption(\"Test Counts by Age Group\"))\n", @@ -333,7 +471,7 @@ "metadata": {}, "source": [ "## Sparse Mechanisms\n", - "We have three mechanisms that take advantage of sparsity to answer more queries about the data for a given privacy budget. All of these mechanisms compare noisy query responses to a noisy threshold value. If a noisy response does not exceed the noisy threshold, then the mechanism reports only that the value did not exceed the threshold. Otherwise, the mechanism reports that the value exceeded the threshold. Furthermore, in the latter case some mechanisms release more information about the underlying exact count. This extra information is computed using some other differentially private mechanism and therefore imposes some additional privacy costs." + "We currently have four mechanisms that take advantage of sparsity to answer more queries about the data for a given privacy budget. All of these mechanisms compare noisy query responses to a noisy threshold value. If a noisy response does not exceed the noisy threshold, then the mechanism reports only that the value did not exceed the threshold. Otherwise, the mechanism reports that the value exceeded the threshold. Furthermore, in the latter case some mechanisms release more information about the underlying exact count. This extra information is computed using some other differentially private mechanism and therefore imposes some additional privacy costs." ] }, { @@ -346,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -367,10 +505,7 @@ "exact_counts.update(data.value_counts())\n", "\n", "dates, values = zip(*sorted(exact_counts.items()))\n", - "values = np.array(values, dtype=np.float64)\n", - "\n", - "# Set the threshold value\n", - "threshold = 100" + "values = np.array(values, dtype=np.float64)" ] }, { @@ -390,12 +525,12 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "from relm.mechanisms import AboveThreshold\n", - "mechanism = AboveThreshold(epsilon=1.0, sensitivity=1.0, threshold=threshold)\n", + "mechanism = AboveThreshold(epsilon=1.0, sensitivity=1.0, threshold=100)\n", "index = mechanism.release(values)" ] }, @@ -409,11 +544,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "TRIALS = 2**10\n", + "threshold = 100\n", "results = np.zeros(TRIALS)\n", "for i in range(TRIALS):\n", " mechanism = AboveThreshold(epsilon=1.0, sensitivity=1.0, threshold=threshold)\n", @@ -430,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -444,16 +580,16 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 10, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -472,7 +608,7 @@ "\n", "plt.xlabel(\"Index\")\n", "plt.ylabel(\"Count\")\n", - "plt.title(\"Distribution of above_threshold.release(values)\")\n", + "plt.title(\"Distribution of AboveThreshold outputs\")\n", "plt.plot(list(histogram.keys()), list(histogram.values()))\n", "plt.axvline(x=np.argmax(values >= threshold), color='orange')" ] @@ -494,7 +630,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -507,48 +643,193 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Visualise the Results" + "#### Visualising the Results" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 35, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "--- --- ---\n", - "105 107 108\n", - " 99 100 105\n", - " 99 101 102\n", - "105 106 108\n", - "105 108 109\n", - " 99 105 108\n", - "100 101 105\n", - "105 106 107\n", - " 96 99 102\n", - " 99 105 106\n", - "109 111 112\n", - "105 107 109\n", - " 99 105 107\n", - "105 108 109\n", - " 98 99 102\n", - "102 105 106\n", - "--- --- ---\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Hit 1Hit 2Hit 3Hit 4
094102105107
1101105106107
29899101102
396102103105
4103105109114
599101102105
6101105106108
7105106108109
8101105108109
996102105106
10100105108109
11106107108116
128194105106
1391101102105
14105106108109
1595105108109
\n", + "
" + ], + "text/plain": [ + " Hit 1 Hit 2 Hit 3 Hit 4\n", + "0 94 102 105 107\n", + "1 101 105 106 107\n", + "2 98 99 101 102\n", + "3 96 102 103 105\n", + "4 103 105 109 114\n", + "5 99 101 102 105\n", + "6 101 105 106 108\n", + "7 105 106 108 109\n", + "8 101 105 108 109\n", + "9 96 102 105 106\n", + "10 100 105 108 109\n", + "11 106 107 108 116\n", + "12 81 94 105 106\n", + "13 91 101 102 105\n", + "14 105 106 108 109\n", + "15 95 105 108 109" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ "TRIALS = 16\n", - "table = []\n", + "cutoff = 4\n", + "threshold = 100\n", + "indices = np.empty((TRIALS, cutoff), dtype=np.int)\n", "for i in range(TRIALS):\n", - " mechanism = SparseIndicator(epsilon=1.0, sensitivity=1.0, threshold=100, cutoff=3)\n", - " indices = mechanism.release(values)\n", - " table.append(indices)\n", + " mechanism = SparseIndicator(epsilon=1.0, sensitivity=1.0, threshold=threshold, cutoff=cutoff)\n", + " indices[i] = mechanism.release(values)\n", " \n", - "print(tabulate(table))" + "df = pd.DataFrame(indices, columns=[\"Hit %i\" % (j+1) for j in range(cutoff)])\n", + "display(df)" ] }, { @@ -556,7 +837,7 @@ "metadata": {}, "source": [ "### Sparse Numeric\n", - "The `SparseNumeric` mechanism returns perturbed values alongside the indices of the exact values that exceeded the threshold." + "The `SparseNumeric` mechanism returns perturbed values alongside the indices of the values that exceeded the threshold." ] }, { @@ -568,12 +849,12 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "from relm.mechanisms import SparseNumeric\n", - "mechanism = SparseNumeric(epsilon=4.0, sensitivity=1.0, threshold=100, cutoff=3) \n", + "mechanism = SparseNumeric(epsilon=1.0, sensitivity=1.0, threshold=100, cutoff=3) \n", "indices, perturbed_values = mechanism.release(values)" ] }, @@ -581,63 +862,426 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Visualise the Results" + "## Visualising the Results\n", + "Notice that in these experiemnts we have set `epsilon=4.0`. This is a larger value than we use in the other sparse mechanisms. Because the `SparseNumeric` mechanism releases more information about the underlying exact query responses than does `SparseIndices`, for example, it consumes the available privacy budget more quickly. To achieve comparable utility with respect the the indices returned by the two mechanisms, we therefore need to a larger value for `epsilon`." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 36, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------------------- ------------------------- -------------------------\n", - "(105, 116.86301270168042) (106, 104.66698977630585) (108, 117.90948712985846)\n", - "(105, 116.84805969989975) (106, 100.70492207063944) (107, 98.94894027765258)\n", - "(102, 94.60873103816994) (105, 115.24950254906435) (106, 101.89972415295779)\n", - "(102, 85.46495872995001) (105, 120.65363638370764) (106, 96.22690888174111)\n", - "(105, 115.82634760456858) (107, 99.8266276405775) (108, 117.31345148742548)\n", - "(105, 116.89359707120457) (106, 114.01741777965799) (107, 99.98686217752402)\n", - "(105, 115.69634647871135) (106, 102.40202455918188) (108, 115.88957359318738)\n", - "(99, 91.01373517361935) (105, 113.63138593288022) (106, 104.51405676017748)\n", - "(99, 87.87686746797408) (101, 88.16181562762358) (105, 116.3749273797439)\n", - "(99, 91.99253759768908) (105, 117.06808546034154) (106, 101.02893703174777)\n", - "(99, 91.40812978745089) (105, 118.21763951570028) (106, 103.326115835167)\n", - "(101, 93.94811056635808) (105, 116.366947379458) (106, 100.71689835435245)\n", - "(105, 119.58112427822198) (106, 102.34542989198235) (108, 113.25067036983091)\n", - "(105, 117.57580304853036) (106, 106.4215264247905) (107, 96.6622728513612)\n", - "(101, 95.63776704837801) (102, 93.02601603831863) (105, 115.77281294006389)\n", - "(105, 116.93756830657367) (108, 121.3811954879202) (109, 126.25681609366438)\n", - "------------------------- ------------------------- -------------------------\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Hit 1Value 1Hit 2Value 2Hit 3Value 3
09990.20333110197.75731110291.648990
110194.340670105122.579838106100.876128
2105118.903293106102.987799107100.371351
3105116.532725106105.859721108116.563867
4105116.936132106102.78235110799.969280
5105115.974266106103.163012108116.861566
610195.732867105117.949430106100.865401
7105118.591914106103.981879108115.848683
89992.03328410195.896887105119.808208
9105121.441415106103.699879108120.406410
10105118.940523108115.912710109124.466447
11105116.405978106105.307053108119.001507
1210192.14004610294.313373105117.241695
13105115.682623107101.469930108116.969223
14105117.094847106103.217929107100.898039
1510194.221751105117.251703106103.248741
\n", + "
" + ], + "text/plain": [ + " Hit 1 Value 1 Hit 2 Value 2 Hit 3 Value 3\n", + "0 99 90.203331 101 97.757311 102 91.648990\n", + "1 101 94.340670 105 122.579838 106 100.876128\n", + "2 105 118.903293 106 102.987799 107 100.371351\n", + "3 105 116.532725 106 105.859721 108 116.563867\n", + "4 105 116.936132 106 102.782351 107 99.969280\n", + "5 105 115.974266 106 103.163012 108 116.861566\n", + "6 101 95.732867 105 117.949430 106 100.865401\n", + "7 105 118.591914 106 103.981879 108 115.848683\n", + "8 99 92.033284 101 95.896887 105 119.808208\n", + "9 105 121.441415 106 103.699879 108 120.406410\n", + "10 105 118.940523 108 115.912710 109 124.466447\n", + "11 105 116.405978 106 105.307053 108 119.001507\n", + "12 101 92.140046 102 94.313373 105 117.241695\n", + "13 105 115.682623 107 101.469930 108 116.969223\n", + "14 105 117.094847 106 103.217929 107 100.898039\n", + "15 101 94.221751 105 117.251703 106 103.248741" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ "TRIALS = 2**4\n", - "table = []\n", + "cutoff = 3\n", + "threshold = 100\n", + "indices = np.empty(shape=(TRIALS, cutoff), dtype=np.int)\n", + "perturbed_values = np.empty(shape=(TRIALS, cutoff), dtype=np.float)\n", "for i in range(TRIALS):\n", - " mechanism = SparseNumeric(epsilon=4.0, sensitivity=1.0, threshold=100, cutoff=3) \n", - " indices, perturbed_values = mechanism.release(values)\n", - " table.append(list(zip(indices, perturbed_values)))\n", + " mechanism = SparseNumeric(epsilon=4.0, sensitivity=1.0, threshold=threshold, cutoff=cutoff) \n", + " indices[i], perturbed_values[i] = mechanism.release(values)\n", "\n", - "print(tabulate(table))" + "hit_names = [\"Hit %i\" % (j+1) for j in range(cutoff)]\n", + "value_names = [\"Value %i\" % (j+1) for j in range(cutoff)]\n", + "column_pairs = zip(hit_names, value_names)\n", + "column_names = [val for pair in column_pairs for val in pair]\n", + "value_pairs = zip(indices.transpose(), perturbed_values.transpose())\n", + "column_values = [val for pair in value_pairs for val in pair]\n", + "table = {k: v for (k, v) in zip(column_names, column_values)}\n", + "df = pd.DataFrame(table)\n", + "display(df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Report Noisy Max" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Basic Usage" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from relm.mechanisms import ReportNoisyMax\n", + "mechanism = ReportNoisyMax(epsilon=1.0, precision=35) \n", + "index, perturbed_value = mechanism.release(values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Empirical Distribution\n", + "Because `ReportNoisyMax` returns a single index and a single value, we can run many experiments and plot a histogram of the results of those experiments to get an empirical estimate of the distribution of the mechanism's output." + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "TRIALS = 2**10\n", + "indices = np.zeros(TRIALS)\n", + "perturbed_values = np.zeros(TRIALS)\n", + "for i in range(TRIALS):\n", + " mechanism = ReportNoisyMax(epsilon=0.5, precision=35)\n", + " indices[i], perturbed_values[i] = mechanism.release(values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Visualising the Results\n", + "The `ReportNoisyMax` mechanism resturns two values, an index and a perturbed query response. We analyze the distribution of each output individually. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Indices" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The index of the greatest exact count is: 128\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "print(\"The index of the greatest exact count is: %i\\n\" % np.argmax(values))\n", + "\n", + "histogram = dict.fromkeys(np.arange(min(indices), max(indices)), 0)\n", + "histogram.update(Counter(indices))\n", + "\n", + "plt.xlabel(\"Index\")\n", + "plt.ylabel(\"Count\")\n", + "plt.title(\"Distribution of ReportNoisyMax output indices\")\n", + "plt.plot(list(histogram.keys()), list(histogram.values()))\n", + "plt.axvline(x=np.argmax(values), color='orange')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Perturbed Values" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The greatest exact count is: 156\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "print(\"The greatest exact count is: %i\\n\" % np.max(values))\n", + "\n", + "#histogram = dict.fromkeys(np.arange(min(results), max(results)), 0)\n", + "#histogram.update(Counter(results))\n", + "\n", + "plt.hist(perturbed_values, bins=128)\n", + "\n", + "plt.xlabel(\"Perturbed Value\")\n", + "plt.ylabel(\"Count\")\n", + "plt.title(\"Distribution of ReportNoisyMax output values\")\n", + "plt.axvline(x=np.max(values), color='orange')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Correlated Noise Mechanisms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### SmallDB Mechanism" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Online Multiplicative Weights Mechanism" + ] } ], "metadata": { @@ -656,7 +1300,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.5" } }, "nbformat": 4, From adbc8d40e62994a0c0c8c974e75b8c9de922fca2 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 19 Jan 2021 13:28:31 +1100 Subject: [PATCH 129/185] Added histogram to __init__.py --- relm/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/relm/__init__.py b/relm/__init__.py index b889561..e027cfe 100644 --- a/relm/__init__.py +++ b/relm/__init__.py @@ -1,3 +1,4 @@ __all__ = ["mechanisms"] from relm import mechanisms +from relm import histogram From 1104df30889a14aec1adcd2da7ec5ab019b9710d Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 19 Jan 2021 13:40:26 +1100 Subject: [PATCH 130/185] black formatting --- relm/mechanisms/selection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relm/mechanisms/selection.py b/relm/mechanisms/selection.py index b6bd1bd..8c65b0c 100644 --- a/relm/mechanisms/selection.py +++ b/relm/mechanisms/selection.py @@ -51,7 +51,7 @@ def release(self, values): self._update_accountant() utilities = self.utility_function(values) - #print("########", utilities) + # print("########", utilities) index = self._sampler(utilities) return self.output_range[index] From 68f8d396e3e1aada751502433cc8c17c90d8c330 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 19 Jan 2021 14:04:31 +1100 Subject: [PATCH 131/185] Added a notebook for demonstrating/testing the SmallDB release mechanism --- examples/crisper_smalldb.ipynb | 155 +++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 examples/crisper_smalldb.ipynb diff --git a/examples/crisper_smalldb.ipynb b/examples/crisper_smalldb.ipynb new file mode 100644 index 0000000..281f69a --- /dev/null +++ b/examples/crisper_smalldb.ipynb @@ -0,0 +1,155 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "from relm.histogram import Histogram\n", + "from relm.mechanisms import SmallDB\n", + "import numpy as np\n", + "from itertools import product\n", + "import scipy.sparse as sps" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "fp = '20200811_QLD_dummy_dataset_individual_v2.xlsx'\n", + "df = pd.read_excel(fp)\n", + "df.drop([\"NOTF_ID\", \"LGA\", \"HHS\"] + list(df.columns[12:]), axis=1, inplace=True)\n", + "\n", + "hist = Histogram(df)\n", + "real_database = hist.get_db()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "from itertools import product\n", + "queries = []\n", + "\n", + "cols = [\"AGEGRP5\"]\n", + "vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", + "queries.extend(dict(zip(cols, val)) for val in vals)\n", + "\n", + "queries = sps.vstack([hist.get_query_vector(q) for q in queries])" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "smalldb = SmallDB(epsilon=4.0, data=real_database, alpha=0.001)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 4.32 s, sys: 502 ms, total: 4.83 s\n", + "Wall time: 4.83 s\n" + ] + } + ], + "source": [ + "%time synthetic_database = smalldb.release(queries)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(28554240,)\n", + "(28554240,)\n", + "(10, 28554240)\n" + ] + } + ], + "source": [ + "print(real_database.shape)\n", + "print(synthetic_database.shape)\n", + "print(queries.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "real_responses = (queries @ real_database)/real_database.sum()\n", + "synthetic_responses = (queries @ synthetic_database) / synthetic_database.sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.0113 0.0103 0.2348 0.1523 0.1408 0.1436 0.1028 0.0889 0.0955 0.0197]\n", + "[0.10003129 0.09983509 0.10008959 0.10009699 0.10006889 0.10003929\n", + " 0.09992659 0.09997089 0.10002019 0.09992119]\n" + ] + } + ], + "source": [ + "print(real_responses)\n", + "print(synthetic_responses)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 495e0fb5574dec9a574f9482a070d8c8ccc199e2 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 20 Jan 2021 15:50:06 +1100 Subject: [PATCH 132/185] Debugging the SmallDB mechanism --- examples/crisper_smalldb.ipynb | 79 ++++++--------- examples/dummy_smalldb.ipynb | 139 +++++++++++++++++++++++++++ relm/mechanisms/data_perturbation.py | 28 +++++- src/mechanisms.rs | 69 +++++++++++-- 4 files changed, 255 insertions(+), 60 deletions(-) create mode 100644 examples/dummy_smalldb.ipynb diff --git a/examples/crisper_smalldb.ipynb b/examples/crisper_smalldb.ipynb index 281f69a..5f03be4 100644 --- a/examples/crisper_smalldb.ipynb +++ b/examples/crisper_smalldb.ipynb @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -31,14 +31,31 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from itertools import product\n", + "# _cols = [\"AGEGRP5\", \"SEX\", \"INDIG_STATUS\"]\n", "queries = []\n", "\n", - "cols = [\"AGEGRP5\"]\n", + "# # this creates the queries for:\n", + "# # df.groupby([\"AGEGRP5\", \"SEX\", \"INDIG_STATUS\", col]).count()\n", + "# # where col is in [\"HOSPITALISED\", \"VENTILATED\", \"ICU\", \"DIED_OF_CONDITION\"]\n", + "# for col in [\"HOSPITALISED\", \"VENTILATED\", \"ICU\", \"DIED_OF_CONDITION\"]:\n", + "# cols = _cols + [col,]\n", + "# vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", + "# queries.extend(dict(zip(cols, val)) for val in vals)\n", + "\n", + "# # this creates the queries for:\n", + "# # df.groupby([\"ONSET_DATE\", \"AGEGRP5\", \"INDIG_STATUS\", \"SEX\"]).count()\n", + "# cols = [\"ONSET_DATE\", \"AGEGRP5\", \"INDIG_STATUS\", \"SEX\"]\n", + "# vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", + "# queries.extend(dict(zip(cols, val)) for val in vals)\n", + "\n", + "# this creates the queries for:\n", + "# df.groupby([\"ONSET_DATE\", \"POSTCODE\"]).count()\n", + "cols = [\"ONSET_DATE\", \"POSTCODE\"]\n", "vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", "queries.extend(dict(zip(cols, val)) for val in vals)\n", "\n", @@ -47,55 +64,25 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "smalldb = SmallDB(epsilon=4.0, data=real_database, alpha=0.001)" + "smalldb = SmallDB(epsilon=4.0, data=real_database, alpha=0.1)" ] }, { "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4.32 s, sys: 502 ms, total: 4.83 s\n", - "Wall time: 4.83 s\n" - ] - } - ], - "source": [ - "%time synthetic_database = smalldb.release(queries)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(28554240,)\n", - "(28554240,)\n", - "(10, 28554240)\n" - ] - } - ], + "outputs": [], "source": [ - "print(real_database.shape)\n", - "print(synthetic_database.shape)\n", - "print(queries.shape)" + "synthetic_database = smalldb.release(queries)" ] }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -105,19 +92,9 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.0113 0.0103 0.2348 0.1523 0.1408 0.1436 0.1028 0.0889 0.0955 0.0197]\n", - "[0.10003129 0.09983509 0.10008959 0.10009699 0.10006889 0.10003929\n", - " 0.09992659 0.09997089 0.10002019 0.09992119]\n" - ] - } - ], + "outputs": [], "source": [ "print(real_responses)\n", "print(synthetic_responses)" diff --git a/examples/dummy_smalldb.ipynb b/examples/dummy_smalldb.ipynb new file mode 100644 index 0000000..6f5297f --- /dev/null +++ b/examples/dummy_smalldb.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "from relm.histogram import Histogram\n", + "from relm.mechanisms import SmallDB\n", + "import numpy as np\n", + "from itertools import product\n", + "import scipy.sparse as sps" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame()\n", + "dummy = np.random.choice(np.arange(3), size=10000, p=[0.1,0.35,0.55]) \n", + "df[\"DUMMY\"] = dummy\n", + "\n", + "dummy2 = np.zeros(10000, dtype=np.int)\n", + "df[\"DUMMY2\"] = dummy2\n", + "\n", + "hist = Histogram(df)\n", + "real_database = hist.get_db()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from itertools import product\n", + "queries = []\n", + "\n", + "cols = [\"DUMMY\"]\n", + "vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", + "queries.extend(dict(zip(cols, val)) for val in vals)\n", + "\n", + "queries = sps.vstack([hist.get_query_vector(q) for q in queries])\n", + "\n", + "queries = np.array([[1,1,0],\n", + " [0,1,1],\n", + " [1,0,1]])\n", + "queries = sps.csr.csr_matrix(queries)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "smalldb = SmallDB(epsilon=1.0, data=real_database, alpha=0.05)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "synthetic_database = smalldb.release(queries)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "real_responses = (queries @ real_database)/real_database.sum()\n", + "synthetic_responses = (queries @ synthetic_database) / synthetic_database.sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.4529 0.8999 0.6472]\n", + "[0.45583333 0.9 0.64416667]\n" + ] + } + ], + "source": [ + "print(real_responses)\n", + "print(synthetic_responses)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index 56be452..0fbcc38 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -3,6 +3,10 @@ from relm import backend import scipy.sparse as sps +# Imports for SmallDB debugging code +from itertools import combinations_with_replacement +from relm.mechanisms import ExponentialMechanism + class SmallDB(ReleaseMechanism): """ @@ -89,6 +93,28 @@ def release(self, queries): self.epsilon, l1_norm, len(self.data), sparse_queries, answers, breaks ) - self._is_valid = False + # For debugging purposes, replace this call to the rust backend with + # a call to the ExponentialMechanism code with an appropriate output_range + # and utility_function. + + # print("Hit the debugging code") + # + # n = len(self.data) + # f = lambda x: np.bincount(x, minlength=n) + # output_range = list( + # map(f, combinations_with_replacement(np.arange(n), l1_norm)) + # ) + # utility_function = lambda _: np.array( + # [-np.max(queries.dot(x) / l1_norm - answers) for x in output_range] + # ) + # mechanism = ExponentialMechanism( + # epsilon=self.epsilon, + # utility_function=utility_function, + # sensitivity=1.0, + # output_range=output_range, + # method="sample_and_flip", + # ) + # db = mechanism.release(answers) + self._is_valid = False return db diff --git a/src/mechanisms.rs b/src/mechanisms.rs index b0a3b74..6d939ac 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -1,5 +1,6 @@ use rand::{thread_rng, Rng}; use rand::distributions::WeightedIndex; +use rand::seq::IteratorRandom; use std::convert::TryInto; use std::collections::HashMap; @@ -140,14 +141,52 @@ pub fn small_db( // store the db in a sparse vector (implemented with a HashMap) let mut db: HashMap = HashMap::with_capacity(l1_norm); + // let mut normalizer: f64 = f64::MIN; + // for i in 0..1000 { + // random_small_db(&mut db, l1_norm, size); + // + // let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); + // let utility = -error * (l1_norm as f64); + // println!("{:?}", utility); + // println!("{:?}", normalizer); + // + // if utility > normalizer { + // normalizer = utility; + // } + // } + + // let unnormalized_answers = answers.iter().map(|x| x * (l1_norm as f64)); + + let min_errors = answers.iter() + .map(|x| x * (l1_norm as f64)) + .map(|x| (x - x.round()).abs()); + let mut max_min_error: f64 = 0.0; + for (i, min_error) in min_errors.enumerate() { + if min_error > max_min_error { + max_min_error = min_error; + } + } + + let mut normalizer: f64 = -max_min_error; + loop { // sample another random small db random_small_db(&mut db, l1_norm, size); let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); - let utility = -error; - let log_p = 0.5 * epsilon * utility; + let utility = -error * (l1_norm as f64); + //println!("{:?}", utility); + //println!("{:?}", normalizer); + + let log_p = epsilon * (utility - normalizer); if samplers::bernoulli_log_p(log_p) { break } + + // if utility > normalizer { + // normalizer = utility; + // } else { + // let log_p = epsilon * (utility - normalizer); + // if samplers::bernoulli_log_p(log_p) { break } + // } } // convert the sparse small db to a dense vector @@ -167,14 +206,28 @@ fn random_small_db(db: &mut HashMap, l1_norm: usize, size: u64) { db.clear(); let mut rng = thread_rng(); - for _ in 0..l1_norm { + // Use the "stars and bars" approach to generate a random database + let num_bars: usize = (size as usize) - 1; + let slots: usize = l1_norm + num_bars; + let mut partitions: Vec = vec![0; num_bars + 2]; + partitions[0]= -1; + let mut temp = (0..slots).choose_multiple(&mut rng, num_bars); + temp.sort(); + for (i,idx) in temp.iter().enumerate() { + partitions[i+1] = *idx as i64; + } + partitions[num_bars+1] = slots as i64; - // randomly select an index of the database to increment - let idx: u64 = rng.gen_range(0, size); + let mut values: Vec = vec![0; size as usize]; + for i in 0..size.try_into().unwrap() { + values[i] = ((partitions[i+1] - partitions[i]) - 1) as u64; + } - db.entry(idx).or_insert(0); - if let Some(x) = db.get_mut(&idx) { - *x += 1; + for i in 0..size.try_into().unwrap() { + let value: u64 = ((partitions[i+1] - partitions[i]) - 1) as u64; + if value > 0 { + let key: u64 = i as u64; + db.insert(key, value); } } } From cb8c7c89d79c96bd65de23765c3a07ee2ff32aef Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 21 Jan 2021 11:44:50 +1100 Subject: [PATCH 133/185] Minor changes to demo files --- examples/crisper_smalldb.ipynb | 21 +- examples/dummy_smalldb.ipynb | 23 +- examples/relm_demo.ipynb | 557 +++++++++++++++++---------------- relm/histogram.py | 2 + 4 files changed, 309 insertions(+), 294 deletions(-) diff --git a/examples/crisper_smalldb.ipynb b/examples/crisper_smalldb.ipynb index 5f03be4..f6902f9 100644 --- a/examples/crisper_smalldb.ipynb +++ b/examples/crisper_smalldb.ipynb @@ -23,15 +23,15 @@ "source": [ "fp = '20200811_QLD_dummy_dataset_individual_v2.xlsx'\n", "df = pd.read_excel(fp)\n", - "df.drop([\"NOTF_ID\", \"LGA\", \"HHS\"] + list(df.columns[12:]), axis=1, inplace=True)\n", - "\n", + "# df.drop([\"NOTF_ID\", \"LGA\", \"HHS\"] + list(df.columns[12:]), axis=1, inplace=True)\n", + "df.drop(list(df.columns[1:6]) + list(df.columns[7:]), axis=1, inplace=True)\n", "hist = Histogram(df)\n", "real_database = hist.get_db()" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -64,11 +64,11 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "smalldb = SmallDB(epsilon=4.0, data=real_database, alpha=0.1)" + "smalldb = SmallDB(epsilon=0.001, data=real_database, alpha=0.1)" ] }, { @@ -100,6 +100,15 @@ "print(synthetic_responses)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "queries" + ] + }, { "cell_type": "code", "execution_count": null, @@ -124,7 +133,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/examples/dummy_smalldb.ipynb b/examples/dummy_smalldb.ipynb index 6f5297f..31b33b3 100644 --- a/examples/dummy_smalldb.ipynb +++ b/examples/dummy_smalldb.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -25,16 +25,13 @@ "dummy = np.random.choice(np.arange(3), size=10000, p=[0.1,0.35,0.55]) \n", "df[\"DUMMY\"] = dummy\n", "\n", - "dummy2 = np.zeros(10000, dtype=np.int)\n", - "df[\"DUMMY2\"] = dummy2\n", - "\n", "hist = Histogram(df)\n", "real_database = hist.get_db()" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -55,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -64,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -73,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -83,15 +80,15 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[0.4529 0.8999 0.6472]\n", - "[0.45583333 0.9 0.64416667]\n" + "[0.4639 0.894 0.6421]\n", + "[0.46416667 0.8925 0.64333333]\n" ] } ], @@ -131,7 +128,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/examples/relm_demo.ipynb b/examples/relm_demo.ipynb index 4ab531b..a588719 100644 --- a/examples/relm_demo.ipynb +++ b/examples/relm_demo.ipynb @@ -43,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -72,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -96,66 +96,66 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238229.36882400-9238236.567457
110-19386385.459906110-19386383.710575
220-29688687.872696220-29688694.847584
330-39779778.083646330-39779762.346705
440-49621627.634140440-49621632.455271
550-59582598.804677550-59582581.389267
660-69344334.127363660-69344351.455088
770+261249.754652770+261243.848760
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -163,7 +163,7 @@ }, { "data": { - "image/png": "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qqqKPn36cNNNOzoEXnzxRT7xiU9w3HHHMXDgQN555x1uvPFGpkyZQmVlJVOm7HwjrrvuuovRo0dz0kknAUm/9EUXXUTXrl158803Of/88+nXrx8nnngiCxYsAGDcuHFMmDBh+zr69u3LihUrWLFiBb169eLLX/4yffr0YciQIWzevJlHHnmEuXPncvHFF1NZWcnmzZsZO3YsvXv3pl+/flx77bVl3Y/N4Za7mTXL5s2bqays3P76+uuv53Of+xx33nknY8aM4eqrr+att97iy1/+MgDjx4+nY8eOvP/++wwePJgFCxZwzDHH8LnPfY4pU6YwYMAANmzYQPv27fn2t7/N3LlzufPOO3fZ7sKFCxk9evQu5QA33XQT/fv35/HHH+dXv/oVX/ziFxv9dbF06VIefvhhfvzjH/PZz36WRx99lEsuuYQ777yTCRMmUFVVxZtvvsljjz3Gq6++iiTefvvtpu62snNyN7Nmqa9b5lOf+hQ///nPufLKK3n55Ze3l0+dOpWJEydSU1PD6tWreeWVV5BEt27dGDBgAAAdOnRoVkzPP/88jz76KABnnHEG69ev5513Gu6K69Gjx/YvqY9//OOsWLFilzodOnSgbdu2XH755QwbNoxzzz23WXGWk7tlzKwstm3bxuLFi2nXrh1vvvkmAMuXL2fChAnMnDmTBQsWMGzYMLZs2UJEFH26X58+fZg3b17eefluQiSJ1q1bs23bjptn5Z47vs8++2yfbtWqFTU1Nbuso3Xr1syZM4cLL7yQxx9/nKFDhxYV8+7k5G5mZXHbbbfRq1cvHn74YS699FLee+89NmzYwL777ssBBxzAmjVreOaZZwA45phjWLVqFS+++CIAGzdupKamhv3335+NGzfmXf9VV13FpEmTmD179vayBx54gDfeeINBgwbx4IMPAjBr1iw6d+5Mhw4dqKio4KWXXgLgpZdeYvny5Y2+j9wYNm3axDvvvMM555zD7bffXrYDyaXgbhmzDCnk1MVSq9vnPnToUC699FLuuece5syZw/7778+gQYP47ne/y80330z//v3p06cPRx55JCeffDIAbdq0YcqUKXzta19j8+bNtGvXjhkzZvDJT36SW265hcrKyu19+bW6du3K5MmTufbaa1m7di177bUXgwYN4oILLmDcuHF86Utfol+/frRv355Jk5IxDi+88ELuv/9+KisrGTBgAEcddVSj72/MmDF89atfpV27djzzzDMMHz58+6+N2267rbQ7s4T2iHuoVlVVhW/WYfXxqZD1W7x4Mb169fqgw7DdIN9nLWleRFTlq+9uGTOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczyyCf526WJeMOKPH6Gj9ltHbI35qaGnr16sWkSZMKHpVxxYoV/O53v+Pzny/wFNYcFRUVzJ07l86dOxe9bEPLb9q0iW9+85vMmDGDtm3b0qlTJ77//e9zwgknNGk7+TQ2lHEpuOVuZs1SO7bMwoULadOmDXfffXdBy9XU1LBixQoeeuihorf5/vvlu//P5ZdfTseOHVm6dCmLFi3ivvvu429/+1tJtzF//nyefvrpkq6zLid3MyuZU089lWXLlvHuu+9y6aWXMmDAAPr3788TTyR34bzvvvsYMWIEn/70pxkyZAhjx47lueeeo7Kykttuu4377ruPq666avv6zj33XGbNmgXAfvvtx4033sgJJ5zACy+8AMD3v/99Bg4cyMCBA1m2bBkA69at48ILL2TAgAEMGDCA//3f/wVg/fr1DBkyhP79+/OVr3wl7/gzr732GrNnz+a73/0ue+2VpMcjjzySYcOSK39vvfVW+vbtS9++fbn99tuB5NdH3759t69jwoQJjBs3DoDTTz+d6667joEDB3LUUUfx3HPP8Y9//GOXoYx/85vfUFlZSWVlJf379693yIViuFvGzEqipqaGZ555hqFDhzJ+/HjOOOMM7r33Xt5++20GDhzImWeeCcALL7zAggUL6NixI7NmzWLChAk8+eSTQJL86/Puu+/St29fvv3tb28v69ChA3PmzOH+++/nmmuu4cknn+Tqq6/m61//OqeccgorV67krLPOYvHixdx8882ccsop3HjjjTz11FNMnDhxl20sWrSIyspKWrVqtcu8efPm8dOf/pTZs2cTEZxwwgmcdtppHHTQQY3ulzlz5vD0009z8803M2PGjF2GMv70pz/NXXfdxcknn8ymTZto27Zto/u7MY0md0lHA7mj5B8J3Ajcn5ZXACuAz0bEW+ky1wOXAe8D/xwRv2x2pGa2R8odW+bUU0/lsssu4xOf+ATTpk3bfmOMLVu2sHLlSiAZCrhjx45Fb6dVq1ZceOGFO5WNGjVq+/PXv/51AGbMmMErr7yyvc6GDRvY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\n", + "image/png": "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OgReeOEFPvaxj3H88cfTv39/3nnnHW666SYmT55MVVUVkydvfyOuu+66i5EjR3LyyScDSb/0xRdfTOfOnXnzzTe54IIL6NOnDyeddBIvv/wyAGPHjmX8+PFb19G7d2+WLVvGsmXL6NGjB1/84hfp1asXgwYNYuPGjTzyyCPMmTOHSy65hKqqKjZu3Mjo0aPp2bMnffr04brrrivrfmwOt9zNrFk2btxIVVXV1tc33HADn/nMZ7jzzjsZNWoU11xzDW+99RZf/OIXARg3bhzt27fn/fffZ+DAgbz88ssce+yxfOYzn2Hy5Mn069ePdevW0aZNG775zW8yZ84c7rzzzh22O3/+fEaOHLlDOcCYMWPo27cvP//5z/nVr37F5z//+SZ/XSxevJiHH36YH/7wh3z605/m0Ucf5dJLL+XOO+9k/PjxVFdX8+abb/LYY4/x6quvIom33357Z3db2Tm5m1mzNNQt84lPfIKf/vSnXHXVVbz00ktby6dMmcKECROora1l5cqVvPLKK0iiS5cu9OvXD4C2bds2K6bnnnuORx99FIAzzzyTtWvX8s477zS6TLdu3bZ+SX30ox9l2bJlO9Rp27YtrVq14oorrmDIkCGcd955zYqznJzcLVvGHlRgvcb/0a35tmzZwsKFC2ndujVvvvkmXbt2ZenSpYwfP54XXniBdu3aMWrUKDZt2kREFH26X69evZg7dy5Dhw7dYV6+mxBJokWLFmzZsu3mWbnnju+3335bpysqKti4ceMO62jRogWzZ89mxowZTJo0iTvvvJNf/apZd1osG/e5m1lZ3HbbbfTo0YOHH36Yyy67jPfee49169ax//77c9BBB7Fq1SqefvppAI499lhWrFjBCy+8AMD69eupra3lwAMPZP369XnXf/XVVzNx4kRmzZq1teyBBx7gjTfeYMCAATz44IMAzJw5k44dO9K2bVsqKyt58cUXAXjxxRdZunRpk+8jN4YNGzbwzjvvcO6553L77beX7UByKbjlbpYhu+Nsofp97oMHD+ayyy7jnnvuYfbs2Rx44IEMGDCAb3/729x888307duXXr16cdRRR3HKKacA0LJlSyZPnsxXvvIVNm7cSOvWrZk+fTof//jHueWWW6iqqtral1+nc+fOTJo0ieuuu47Vq1ezzz77MGDAAC688ELGjh3LF77wBfr06UObNm2YODEZ4/Ciiy7i/vvvp6qqin79+nH00Uc3+f5GjRrFl7/8ZVq3bs3TTz/N0KFDt/7auO2220q7M0toj7iHanV1dfhmHdaQok6FbPXZwipmpFtm4cKF9OjRY3eHYbtAvs9a0tyIqM5X390yZmYZ5ORuZpZBTu5mZhnk5G5mlkFO7mZmGeTkbmaWQT7P3SxLCr1Ct+D1NX3KaN2Qv7W1tfTo0YOJEycWPCrjsmXL+P3vf89nP1vgKaw5KisrmTNnDh07dix62caW37BhA1//+teZPn06rVq1okOHDnz3u9/lxBNP3Knt5NPUUMal4Ja7mTVL3dgy8+fPp2XLltx9990FLVdbW8uyZct46KGHit7m+++X7/4/V1xxBe3bt2fx4sUsWLCA++67j7///e8l3ca8efN46qmnSrrO+pzczaxkTjvtNJYsWcK7777LZZddRr9+/ejbty+PP57chfO+++5j2LBhfPKTn2TQoEGMHj2aZ599lqqqKm677Tbuu+8+rr766q3rO++885g5cyYABxxwADfddBMnnngizz//PADf/e536d+/P/3792fJkiUArFmzhosuuoh+/frRr18/fve73wGwdu1aBg0aRN++ffnSl76Ud/yZ1157jVmzZvHtb3+bffZJ0uNRRx3FkCHJlb+33norvXv3pnfv3tx+++1A8uujd+/eW9cxfvx4xo4dC8AZZ5zB9ddfT//+/Tn66KN59tln+ec//7nDUMa/+c1vqKqqoqqqir59+zY45EIx3C1jZiVRW1vL008/zeDBgxk3bhxnnnkm9957L2+//Tb9+/fnrLPOAuD555/n5Zdfpn379sycOZPx48fzxBNPAEnyb8i7775L7969+eY3v7m1rG3btsyePZv777+fa6+9lieeeIJrrrmGr371q5x66qksX76cs88+m4ULF3LzzTdz6qmnctNNN/Hkk08yYcKEHbaxYMECqqqqqKio2GHe3Llz+fGPf8ysWbOICE488UROP/102rVr1+R+mT17Nk899RQ333wz06dP32Eo409+8pPcddddnHLKKWzYsIFWrVo1ub+b0mRyl3QMkDtK/lHATcD9aXklsAz4dES8lS5zA3A58D7wrxHxy2ZHamZ7pNyxZU477TQuv/xyPvaxjzF16tStN8bYtGkTy5cvB5KhgNu3b1/0dioqKrjooou2KxsxYsTW569+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\n", "text/plain": [ "
" ] @@ -213,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -235,66 +235,66 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923822800-9238232
110-19386380110-19386402
220-29688691220-29688699
330-39779829330-39779776
440-49621619440-49621615
550-59582596550-59582583
660-69344335660-69344356
770+261271770+261266
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -302,7 +302,7 @@ }, { "data": { - "image/png": "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xx13cPPNN1NZWclrr73Gww8/zEsvvYQk3njjjabutrJzcjezZqmvW+bTn/40v/zlL7nyyit58cUXd5TPmDGDKVOmUFNTw7p161i6dCmS6NatG4MGDQKgQ4cOzYrpmWee4aGHHgLgjDPOYNOmTbz5ZsNdcb169drxJXX88cezevXqnep06NCBtm3bcvnllzNixAjOPffcZsVZTgV1y0j6hqQlkhZLeiC9U30nSbMkrUifO+bUnyBppaTlks4qX/hmtqfavn07y5Yto127drz22msArFq1iptvvpk5c+awaNEiRowYwbvvvktEFH26X79+/ViwYEHeefluQiSJ1q1bs337BzfPyj13fJ999tkx3apVK2pqanZaR+vWrZk/fz4XXnghjzzyCMOHDy8q5l2p0eSe3tfxH4HKiOgPtAJGA+OBORHRG5iTvkZS33R+P5K7zf9EUqvyhG9me6pbb72VPn368MADD3DppZfy3nvvsXnzZvbdd18OOOAA1q9fz5NPPgnA0Ucfzdq1a3nuuecA2LJlCzU1Ney///5s2bIl7/qvuuoqpk6dyrx583aU3Xvvvbz66qsMGTKE++67D4C5c+fSuXNnOnToQM+ePXn++ecBeP7551m1alWj7yM3hq1bt/Lmm29yzjnncNttt5XtQHIpFNot0xpoJ+k9oD2wFpgAnJ7OnwrMBa4DRgLTImIbsErSSmAw8GzpwjazfAo5dbHU6va5Dx8+nEsvvZS77rqL+fPns//++zNkyBC+973vceONNzJw4ED69evHEUccwcknnwxAmzZtmD59Ol//+td55513aNeuHbNnz+ZTn/oUN910ExUVFTv68mt17dqVadOmce2117Jhwwb22msvhgwZwgUXXMCkSZP48pe/zIABA2jfvj1Tp04F4MILL+QXv/gFFRUVDBo0iCOPPLLR9zdu3Di+9rWv0a5dO5588klGjhy549fGrbfeWtqdWUIF3UNV0tXAZJIb+D4VERdLeiMiDsyp83pEdJR0B/CHiLg3Lf8Z8GREPFhnnVcAVwAcdthhx//lL/WOOW9WuI/YqZDLli2jT58+uzsM2wXyfdaSFkREZb76hXTLdCRpjfcCDgH2lXRJQ4vkKdvpGyQipkREZURUdumS9y5RZmbWRIUcUD0TWBURGyPiPeBXwCeB9ZK6AaTPG9L61UCPnOW7k3TjmJnZ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\n", + "image/png": "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r169GDNme4fASy+9xCc+8QlOOOEE+vfvz7vvvsvNN9/M5MmTqaysZPLkHW/EdffddzNy5EhOOeUUIOmXvuSSS+jcuTNvvfUWF154IX369OHkk09m/vz5AIwdO5bx48dvW0fv3r1Zvnw5y5cvp0ePHnz5y1+mV69eDBo0iE2bNvHoo48yZ84cLr30UiorK9m0aROjR4+mZ8+e9OnTh+uvv76s+7Ep3HI3sybZtGkTlZWV217feOONfO5zn+Ouu+5i1KhRXHvttbz99tt8+ctfBmDcuHG0b9+eDz74gIEDBzJ//nyOO+44Pve5zzF58mT69evH+vXradu2Ld/+9reZM2cOd911107bXbBgASNHjtypHGDMmDH07duXJ554gl/96ld88YtfbPTXxZIlS3jkkUf48Y9/zGc/+1kee+wxLrvsMu666y7Gjx9PVVUVb731Fo8//jivvfYaknjnnXd2dbeVnZO7mTVJfd0yn/rUp/j5z3/O1VdfzSuvvLKtfMqUKUyYMIGamhpWrVrFq6++iiS6dOlCv379AGjXrl2TYnrhhRd47LHHADjrrLNYt24d7777boPLdOvWbduX1Mc//nGWL1++U5127drRunVrrrzySoYMGcL555/fpDjLyd0yZlYWW7duZdGiRbRp04a33noLgGXLljF+/HhmzJjB/PnzGTJkCJs3byYiij7dr1evXsydOzfvvHw3IZJEy5Yt2bp1+82zcs8d32+//bZNt2jRgpqamp3W0bJlS2bPns3FF1/ME088weDBg4uKeXdycjezsrj99tvp0aMHjzzyCJdffjnvv/8+69evZ//99+eggw5i9erVPPvsswAcd9xxrFy5kpdeegmADRs2UFNTw4EHHsiGDRvyrv+aa65h4sSJzJo1a1vZgw8+yJtvvsmAAQN46KGHAJg5cyYdO3akXbt2VFRU8PLLLwPw8ssvs2zZskbfR24MGzdu5N133+W8887jjjvuKNuB5FJwt4xZhuyJs4Xq9rkPHjyYyy+/nHvvvZfZs2dz4IEHMmDAAL773e9yyy230LdvX3r16sXRRx/NqaeeCkCrVq2YPHkyX/va19i0aRNt2rRh+vTpfPKTn+TWW2+lsrJyW19+rc6dOzNp0iSuv/561qxZwz777MOAAQO46KKLGDt2LF/60pfo06cPbdu2ZeLEZIzDiy++mAceeIDKykr69evHMccc0+j7GzVqFF/96ldp06YNzz77LEOHDt32a+P2228v7c4sob3iHqpVVVXhm3VYfYo6FbL15wurOLbh/tfmYtGiRfTo0WNPh2G7Qb7PWtLciKjKV9/dMmZmGeTkbmaWQU7uZmYZ5ORuZpZBTu5mZhnk5G5mlkE+z90sS0o9KFoBp4zWDvlbU1NDjx49mDhxYsGjMi5fvpzf/e53fP7zBZ7CmqOiooI5c+bQsWPHopdtaPmNGzfyzW9+k+nTp9O6dWs6dOjA97//fU466aRd2k4+jQ1lXApuuZtZk9SOLbNgwQJatWrFPffcU9ByNTU1LF++nIcffrjobX7wQfnu/3PllVfSvn17lixZwsKFC7n//vv529/+VtJtzJs3j2eeeaak66zLyd3MSub0009n6dKlvPfee1x++eX069ePvn378uSTyV0477//foYNG8anP/1pBg0axOjRo3n++eeprKzk9ttv5/777+eaa67Ztr7zzz+fmTNnAnDAAQdw8803c9JJJ/Hiiy8C8P3vf5/+/fvTv39/li5dCsDatWu5+OKL6devH/369eN///d/AVi3bh2DBg2ib9++fOUrX8k7/szrr7/OrFmz+O53v8s++yTp8eijj2bIkOTK39tuu43evXvTu3dv7rjjDiD59dG7d+9t6xg/fjxjx44F4Mwzz+SGG26gf//+HHPMMTz//PP84x//2Gko49/85jdUVlZSWVlJ37596x1yoRjuljGzkqipqeHZZ59l8ODBjBs3jrPOOov77ruPd955h/79+3P22WcD8OKLLzJ//nzat2/PzJkzGT9+PE899RSQJP/6vPfee/Tu3Ztvf/vb28ratWvH7NmzeeCBB7juuut46qmnuPbaa/n617/OaaedxooVKzjnnHNYtGgRt9xyC6eddho333wzTz/9NBMmTNhpGwsXLqSyspIWLVrsNG/u3Ln89Kc/ZdasWUQEJ510EmeccQaHHHJIo/tl9uzZPPPMM9xyyy1Mnz59p6GMP/3pT3P33Xdz6qmnsnHjRlq3bt3o/m5Mo8ld0rFA7ij5RwM3Aw+k5RXAcuCzEfF2usyNwBXAB8A/R8Qvmxypme2VcseWOf3007niiiv4xCc+wdSpU7fdGGPz5s2sWLECSIYCbt++fdHbadGiBRdffPEOZSNGjNj2/PWvfx2A6dOn8+qrr26r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\n", "text/plain": [ "
" ] @@ -381,59 +381,59 @@ "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923823900-9238238
110-19386387110-19386354
220-29688689220-29688692
330-39779780330-39779790
440-49621621440-49621620
550-59582580550-59582587
660-69344344660-69344321
770+261260770+261238
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -441,7 +441,7 @@ }, { "data": { - "image/png": "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qir69OnDuHE7OgReeOEFPvaxj3HccccxcOBA3n77bW688UamTp1KZWUlU6e+/0Zcd955J6NHj+akk04Ckn7piy66iK5du/LGG29w/vnn069fP0488UQWLFgAwPjx45k4ceL2Nvr27cuKFStYsWIFvXr14otf/CJ9+vRhyJAhbN68mYcffpjq6mouvvhiKisr2bx5M2PHjqV3797069ePa6+9tqzbsSW8525mLbJ582YqKyu3v77++uv5zGc+wx133MGYMWO4+uqrefPNN/niF78IwIQJE+jYsSPvvfcegwcPZsGCBRxzzDF85jOfYerUqQwYMIANGzbQvn17vvnNb1JdXc0dd9yx03oXLlzI6NGjdyoHGDduHP379+exxx7jl7/8JZ///Oeb/HWxdOlSHnroIX74wx/y6U9/mkceeYRLLrmEO+64g4kTJ1JVVcUbb7zBo48+yiuvvIIk3nrrreZutrJzcjezFmmoW+YTn/gEP/3pT7nyyit56aWXtpdPmzaNSZMmUVtby+rVq3n55ZeRRLdu3RgwYAAAHTp0aFFMzz33HI888ggAZ5xxBuvXr+fttxvviuvRo8f2L6mPfvSjrFixYqc6HTp0oG3btlx++eUMGzaMc889t0VxlpO7ZcysLLZt28bixYtp164db7zxBgDLly9n4sSJzJo1iwULFjBs2DC2bNlCRBR9ul+fPn2YN29e3nn5bkIkidatW7Nt246bZ+WeO77PPvtsn27VqhW1tbU7tdG6dWvmzp3LhRdeyGOPPcbQoUOLinlXcnI3s7K49dZb6dWrFw899BCXXnop7777Lhs2bGDfffflgAMOYM2aNTz99NMAHHPMMaxatYoXXngBgI0bN1JbW8v+++/Pxo0b87Z/1VVXMXnyZObMmbO97P777+f1119n0KBBPPDAAwDMnj2bzp0706FDByoqKnjxxRcBePHFF1m+fHmT7yM3hk2bNvH2229zzjnncNttt5XtQHIpuFvGLEMKOXWx1Or3uQ8dOpRLL72Uu+++m7lz57L//vszaNAgvv3tb3PTTTfRv39/+vTpw5FHHsnJJ58MQJs2bZg6dSpf+cpX2Lx5M+3atWPmzJl8/OMf5+abb6aysnJ7X36drl27MmXKFK699lrWrl3LXnvtxaBBg7jgggsYP348X/jCF+jXrx/t27dn8uRkjMMLL7yQ++67j8rKSgYMGMBRRx3V5PsbM2YMX/7yl2nXrh1PP/00w4cP3/5r49Zbby3txiyh3eIeqlVVVeGbdVhDfCpkwxYvXkyvXr0+6DBsF8j3WUuaFxFV+eq7W8bMLIOc3M3MMsjJ3cwsg5zczcwyyMndzCyDnNzNzDLI57mbZcn4A0rcXtOnjNYN+VtbW0uvXr2YPHlywaMyrlixgt/97nd89rMFnsKao6Kigurqajp37lz0so0tv2nTJr7+9a8zc+ZM2rZtS6dOnfjud7/LCSec0Kz15NPUUMal4D13M2uRurFlFi5cSJs2bbjrrrsKWq62tpYVK1bw4IMPFr3O994r3/1/Lr/8cjp27MjSpUtZtGgR9957L3/7299Kuo758+fz1FNPlbTN+pzczaxkTj31VJYtW8Y777zDpZdeyoABA+jfvz+PP57chfPee+9lxIgRfPKTn2TIkCGMHTuWZ599lsrKSm699Vbuvfderrrqqu3tnXvuucyePRuA/fbbjxtvvJETTjiB559/HoDvfve7DBw4kIEDB7Js2TIA1q1bx4UXXsiAAQMYMGAAv/3tbwFYv349Q4YMoX///nzpS1/KO/7Mq6++ypw5c/j2t7/NXnsl6fHII49k2LDkyt9bbrmFvn370rdvX2677TYg+fXRt2/f7W1MnDiR8ePHA3D66adz3XXXMXDgQI466iieffZZ/vGPf+w0lPGvf/1rKisrqayspH///g0OuVAMd8uYWUnU1tby9NNPM3ToUCZMmMAZZ5zBPffcw1tvvcXAgQM588wzAXj++edZsGABHTt2ZPbs2UycOJEnnngCSJJ/Q9555x369u3LN7/5ze1lHTp0YO7cudx3331cc801PPHEE1x99dV89atf5ZRTTmHlypWcddZZLF68mJtuuolTTjmFG2+8kSeffJJJkybttI5FixZRWVlJq1atdpo3b948fvzjHzNnzhwighNOOIHTTjuNgw46qMntMnfuXJ566iluuukmZs6cudNQxp/85Ce58847Ofnkk9m0aRNt27Ztcns3pcnkLuloIHeU/COBG4H70vIKYAXw6Yh4M13meuAy4D3gXyPiFy2O1Mx2S7ljy5x66qlcdtllfOxjH2P69Onbb4yxZcsWVq5cCSRDAXfs2LHo9bRq1YoLL7zwfWWjRo3a/vzVr34VgJkzZ/Lyyy9vr7NhwwY2btzIb37zG372s58BMGzYsCaTcn3PPfccn/rUp9h3330BuOCCC3j22Wc577zzGl3uggsuABoeRhjg5JNP5mtf+xoXX3wxF1xwAd27dy8qtnwKuUH2EqASQFIr4K/Ao8BYYFZE3CxpbPr6Okm9gZFAH+AQYKako3yTbLNsyjeee90t744++uj3lc+ZM2d7csynsSF527Ztu9Mede4wwXXT27Zt4/nnn6ddu3Y7td/UsMJ9+vThpZdeYtu2bdu7ZXLfU7Exw46hhBsaRhhg7NixDBs2jKeeeooTTzyRmTNncswxxzQaa1OK7XMfDLwaEX8BhgOT0/LJwPnp9HBgSkRsjYjlwDJgYIuiNLM9yllnncX3v//97QnxD3/4Q9569Yf0raioYP78+Wzbto3XXnuNuXPnNrqeulvvTZ06dfvt9oYMGfK+OzfVffHkDgP89NNP8+abb+7U3oc//GGqqqoYN27c9tiXLl3K448/zqBBg3jsscf4+9//zjvvvMOjjz7KqaeeSteuXVm7di3r169n69at27uYGlP/fb/66qsce+yxXHfddVRVVfHKK6802UZTiu1zHwk8lE53jYjVABGxWtLBafmhwO9zlqlJy95H0hXAFQCHH354kWGYWV67yWiX3/jGN7jmmmvo168fEUFFRUXepNevXz9at27Ncccdx5gxY7jmmmvo0aMHxx57LH379uX4449vdD1bt27lhBNOYNu2bTz0UJKabr/9dq688kr69etHbW0tgwYN4q677mLcuHGMGjWK448/ntNOO63BvHP33Xfz9a9/nY985CO0b99++6mQxx9/PGPGjGHgwGRf9fLLL6d///4A2w/09ujRo6A97vpDGT/33HP86le/olWrVvTu3Zuzzz67yTaaUvCQv5LaAKuAPhGxRtJbEXFgzvw3I+IgSXcCz0fE/Wn5j4CnIuKRhtr2kL/WGA/52zAP+fvPo5xD/p4NvBgRa9LXayR1S1fQDVibltcAh+Us153kS8HMzHaRYrplRrGjSwZgOjAauDl9fjyn/EFJt5AcUO0JNN5xZh8I7xGbZVdByV1Se+ATwJdyim8Gpkm6DFgJjACIiEWSpgEvA7XAlT5Txqx8mnNzaduzNOeOeQUl94j4O9CpXtl6krNn8tWfAEwoOhozK0rbtm1Zv349nTp1coLPqIhg/fr1RV/Y5CtUzfZg3bt3p6am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\n", + "image/png": "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+UkOP/xwBg0axFtvvcU111zD1KlTqaioYOrU907EdcsttzB69GiOPvpoIOmXPuecc+jatSuvv/46Z555Jv379+eoo45i/vz5AEyYMIFJkyZt3Ua/fv1Yvnw5y5cvp3fv3lx88cX07duXoUOHsnHjRh544AGqqqo477zzqKioYOPGjYwdO5Y+ffrQv39/rrzyyrK+jy1R0HnuETGeZBKBXJtJWvH56k8EJrYsNDPbGWzcuJGKioqtj8eNG8fnPvc5br75ZsaMGcPll1/OG2+8wcUXXwzAxIkT6dixI++++y5Dhgxh/vz5HHrooXzuc59j6tSpDBw4kHXr1tG+fXu++93vUlVVxc0337zdfhcsWMDo0aO3KwcYP348AwYM4OGHH+a3v/0tX/ziF5v8dbF06VLuu+8+brvtNj772c/y4IMPcv7553PzzTczadIkKisref3113nooYd46aWXkMSbb77Z3Let7D4QA4eZNaaYfuTlbcsYiOXVULfMpz/9aX75y19y6aWX8uKLL24tnzZtGpMnT6a2tpZVq1axaNEiJNGtWzcGDhwIQIcOHVoU0zPPPMODDz4IwIknnsjatWt5663Gu+J69uy59UvqE5/4BMuXL9+uTocOHWjbti0XXXQRw4cP57TTTmtRnOXk4QfMrCy2bNnC4sWLadeuHa+//joAr7zyCpMmTWLmzJnMnz+f4cOHs2nTJiKi6NP9+vbty9y5c/M+l28SIkm0bt2aLVu2TZ6Ve+74brvttnW5VatW1NbWbreN1q1bM2fOHM4++2wefvhhhg0bVlTMO5KTu5mVxQ033EDv3r257777uOCCC3jnnXdYt24du+++O3vttRerV6/miSeeAODQQw9l5cqVPPfccwCsX7+e2tpa9txzT9avX593+5dddhlTpkxh9uzZW8t+8Ytf8NprrzF48GDuueceAGbNmkXnzp3p0KEDPXr04Pnnnwfg+eef55VXXmnydeTGsGHDBt566y1OPfVUbrzxxrIdSC4Fd8uYZUghpy6WWv0+92HDhnHBBRdw++23M2fOHPbcc08GDx7M97//fa699loGDBhA3759OfDAAznmmGMAaNOmDVOnTuVrX/saGzdupF27dsyYMYNPfepTXHfddVRUVGzty6/TtWtX7r//fq688krWrFnDLrvswuDBgznrrLOYMGECX/rSl+jfvz/t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\n", "text/plain": [ "
" ] @@ -484,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -525,7 +525,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -544,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -566,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -580,16 +580,16 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 34, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -630,7 +630,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -648,7 +648,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -681,115 +681,115 @@ " \n", " \n", " 0\n", - " 94\n", - " 102\n", " 105\n", " 107\n", + " 108\n", + " 109\n", " \n", " \n", " 1\n", - " 101\n", + " 102\n", " 105\n", " 106\n", - " 107\n", + " 108\n", " \n", " \n", " 2\n", - " 98\n", " 99\n", - " 101\n", - " 102\n", + " 105\n", + " 106\n", + " 108\n", " \n", " \n", " 3\n", - " 96\n", - " 102\n", - " 103\n", " 105\n", + " 106\n", + " 108\n", + " 109\n", " \n", " \n", " 4\n", - " 103\n", + " 90\n", + " 99\n", + " 102\n", " 105\n", - " 109\n", - " 114\n", " \n", " \n", " 5\n", - " 99\n", - " 101\n", - " 102\n", " 105\n", + " 106\n", + " 107\n", + " 108\n", " \n", " \n", " 6\n", + " 99\n", " 101\n", + " 102\n", " 105\n", - " 106\n", - " 108\n", " \n", " \n", " 7\n", - " 105\n", - " 106\n", - " 108\n", - " 109\n", + " 99\n", + " 100\n", + " 101\n", + " 102\n", " \n", " \n", " 8\n", + " 98\n", " 101\n", " 105\n", - " 108\n", - " 109\n", + " 106\n", " \n", " \n", " 9\n", - " 96\n", - " 102\n", " 105\n", - " 106\n", + " 108\n", + " 109\n", + " 110\n", " \n", " \n", " 10\n", + " 78\n", + " 82\n", " 100\n", - " 105\n", - " 108\n", - " 109\n", + " 101\n", " \n", " \n", " 11\n", - " 106\n", - " 107\n", - " 108\n", - " 116\n", + " 97\n", + " 99\n", + " 101\n", + " 102\n", " \n", " \n", " 12\n", - " 81\n", - " 94\n", + " 99\n", + " 101\n", + " 102\n", " 105\n", - " 106\n", " \n", " \n", " 13\n", - " 91\n", - " 101\n", - " 102\n", + " 99\n", + " 100\n", " 105\n", + " 106\n", " \n", " \n", " 14\n", + " 101\n", + " 102\n", " 105\n", " 106\n", - " 108\n", - " 109\n", " \n", " \n", " 15\n", - " 95\n", " 105\n", - " 108\n", " 109\n", + " 111\n", + " 113\n", " \n", " \n", "\n", @@ -797,22 +797,22 @@ ], "text/plain": [ " Hit 1 Hit 2 Hit 3 Hit 4\n", - "0 94 102 105 107\n", - "1 101 105 106 107\n", - "2 98 99 101 102\n", - "3 96 102 103 105\n", - "4 103 105 109 114\n", - "5 99 101 102 105\n", - "6 101 105 106 108\n", - "7 105 106 108 109\n", - "8 101 105 108 109\n", - "9 96 102 105 106\n", - "10 100 105 108 109\n", - "11 106 107 108 116\n", - "12 81 94 105 106\n", - "13 91 101 102 105\n", - "14 105 106 108 109\n", - "15 95 105 108 109" + "0 105 107 108 109\n", + "1 102 105 106 108\n", + "2 99 105 106 108\n", + "3 105 106 108 109\n", + "4 90 99 102 105\n", + "5 105 106 107 108\n", + "6 99 101 102 105\n", + "7 99 100 101 102\n", + "8 98 101 105 106\n", + "9 105 108 109 110\n", + "10 78 82 100 101\n", + "11 97 99 101 102\n", + "12 99 101 102 105\n", + "13 99 100 105 106\n", + "14 101 102 105 106\n", + "15 105 109 111 113" ] }, "metadata": {}, @@ -849,7 +849,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -868,7 +868,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -903,147 +903,147 @@ " \n", " \n", " 0\n", - " 99\n", - " 90.203331\n", - " 101\n", - " 97.757311\n", - " 102\n", - " 91.648990\n", + " 105\n", + " 119.910940\n", + " 106\n", + " 108.072849\n", + " 108\n", + " 117.503564\n", " \n", " \n", " 1\n", - " 101\n", - " 94.340670\n", " 105\n", - " 122.579838\n", - " 106\n", - " 100.876128\n", + " 115.307708\n", + " 108\n", + " 117.121047\n", + " 109\n", + " 127.881792\n", " \n", " \n", " 2\n", + " 102\n", + " 92.038135\n", " 105\n", - " 118.903293\n", + " 116.128564\n", " 106\n", - " 102.987799\n", - " 107\n", - " 100.371351\n", + " 101.611371\n", " \n", " \n", " 3\n", " 105\n", - " 116.532725\n", + " 117.610280\n", " 106\n", - " 105.859721\n", - " 108\n", - " 116.563867\n", + " 102.272893\n", + " 107\n", + " 100.720009\n", " \n", " \n", " 4\n", " 105\n", - " 116.936132\n", + " 116.753340\n", " 106\n", - " 102.782351\n", + " 104.331020\n", " 107\n", - " 99.969280\n", + " 101.926183\n", " \n", " \n", " 5\n", " 105\n", - " 115.974266\n", - " 106\n", - " 103.163012\n", + " 118.389840\n", + " 107\n", + " 105.192731\n", " 108\n", - " 116.861566\n", + " 117.567172\n", " \n", " \n", " 6\n", - " 101\n", - " 95.732867\n", " 105\n", - " 117.949430\n", + " 112.539023\n", " 106\n", - " 100.865401\n", + " 103.449801\n", + " 107\n", + " 100.833485\n", " \n", " \n", " 7\n", + " 101\n", + " 96.753215\n", " 105\n", - " 118.591914\n", + " 116.695646\n", " 106\n", - " 103.981879\n", - " 108\n", - " 115.848683\n", + " 104.575352\n", " \n", " \n", " 8\n", - " 99\n", - " 92.033284\n", - " 101\n", - " 95.896887\n", " 105\n", - " 119.808208\n", + " 117.673095\n", + " 106\n", + " 104.861882\n", + " 108\n", + " 118.395198\n", " \n", " \n", " 9\n", " 105\n", - " 121.441415\n", + " 118.362381\n", " 106\n", - " 103.699879\n", + " 103.939418\n", " 108\n", - " 120.406410\n", + " 117.322911\n", " \n", " \n", " 10\n", " 105\n", - " 118.940523\n", + " 116.453419\n", + " 106\n", + " 105.011922\n", " 108\n", - " 115.912710\n", - " 109\n", - " 124.466447\n", + " 117.839589\n", " \n", " \n", " 11\n", + " 101\n", + " 95.109907\n", " 105\n", - " 116.405978\n", + " 117.830054\n", " 106\n", - " 105.307053\n", - " 108\n", - " 119.001507\n", + " 101.405169\n", " \n", " \n", " 12\n", - " 101\n", - " 92.140046\n", - " 102\n", - " 94.313373\n", " 105\n", - " 117.241695\n", + " 116.847663\n", + " 106\n", + " 106.521048\n", + " 108\n", + " 117.010967\n", " \n", " \n", " 13\n", " 105\n", - " 115.682623\n", + " 115.514138\n", + " 106\n", + " 106.151399\n", " 107\n", - " 101.469930\n", - " 108\n", - " 116.969223\n", + " 100.723549\n", " \n", " \n", " 14\n", " 105\n", - " 117.094847\n", + " 116.782518\n", " 106\n", - " 103.217929\n", - " 107\n", - " 100.898039\n", + " 101.342892\n", + " 108\n", + " 119.078203\n", " \n", " \n", " 15\n", - " 101\n", - " 94.221751\n", " 105\n", - " 117.251703\n", + " 114.856210\n", " 106\n", - " 103.248741\n", + " 104.270722\n", + " 108\n", + " 116.884983\n", " \n", " \n", "\n", @@ -1051,22 +1051,22 @@ ], "text/plain": [ " Hit 1 Value 1 Hit 2 Value 2 Hit 3 Value 3\n", - "0 99 90.203331 101 97.757311 102 91.648990\n", - "1 101 94.340670 105 122.579838 106 100.876128\n", - "2 105 118.903293 106 102.987799 107 100.371351\n", - "3 105 116.532725 106 105.859721 108 116.563867\n", - "4 105 116.936132 106 102.782351 107 99.969280\n", - "5 105 115.974266 106 103.163012 108 116.861566\n", - "6 101 95.732867 105 117.949430 106 100.865401\n", - "7 105 118.591914 106 103.981879 108 115.848683\n", - "8 99 92.033284 101 95.896887 105 119.808208\n", - "9 105 121.441415 106 103.699879 108 120.406410\n", - "10 105 118.940523 108 115.912710 109 124.466447\n", - "11 105 116.405978 106 105.307053 108 119.001507\n", - "12 101 92.140046 102 94.313373 105 117.241695\n", - "13 105 115.682623 107 101.469930 108 116.969223\n", - "14 105 117.094847 106 103.217929 107 100.898039\n", - "15 101 94.221751 105 117.251703 106 103.248741" + "0 105 119.910940 106 108.072849 108 117.503564\n", + "1 105 115.307708 108 117.121047 109 127.881792\n", + "2 102 92.038135 105 116.128564 106 101.611371\n", + "3 105 117.610280 106 102.272893 107 100.720009\n", + "4 105 116.753340 106 104.331020 107 101.926183\n", + "5 105 118.389840 107 105.192731 108 117.567172\n", + "6 105 112.539023 106 103.449801 107 100.833485\n", + "7 101 96.753215 105 116.695646 106 104.575352\n", + "8 105 117.673095 106 104.861882 108 118.395198\n", + "9 105 118.362381 106 103.939418 108 117.322911\n", + "10 105 116.453419 106 105.011922 108 117.839589\n", + "11 101 95.109907 105 117.830054 106 101.405169\n", + "12 105 116.847663 106 106.521048 108 117.010967\n", + "13 105 115.514138 106 106.151399 107 100.723549\n", + "14 105 116.782518 106 101.342892 108 119.078203\n", + "15 105 114.856210 106 104.270722 108 116.884983" ] }, "metadata": {}, @@ -1110,7 +1110,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -1129,7 +1129,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -1137,7 +1137,7 @@ "indices = np.zeros(TRIALS)\n", "perturbed_values = np.zeros(TRIALS)\n", "for i in range(TRIALS):\n", - " mechanism = ReportNoisyMax(epsilon=0.5, precision=35)\n", + " mechanism = ReportNoisyMax(epsilon=0.1, precision=35)\n", " indices[i], perturbed_values[i] = mechanism.release(values)" ] }, @@ -1158,7 +1158,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -1172,16 +1172,16 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 39, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1214,7 +1214,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1228,16 +1228,16 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 40, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEWCAYAAABhffzLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAepklEQVR4nO3dfbwcVX3H8c+X8BAwQUAumCDhoqAVsAQN4GPLkwoqAkV5KEJsqUH7QiugEgUlqLWoKGq1alBKQI1ilQqiSEARUAQChhBEBDEiJE1CAAmIKOHXP+YsmWx27929ubMP93zfr9e+dvfMzJnfzs7+9syZ2bOKCMzMLB8bdDsAMzPrLCd+M7PMOPGbmWXGid/MLDNO/GZmmXHiNzPLjBP/KJD0JUkfHKW6pkh6VNK49PxqSf8yGnWn+n4oafpo1dfGej8q6QFJ/9fpdXebpGMkXdHtOKwxSedL+mi34+gkJ/5hSFos6XFJqyQ9LOnnkt4u6eltFxFvj4iPtFjXAUPNExH3RsSEiFg9CrHPkvS1uvoPiog561t3m3FsD5wC7BIRz24wfR9JT6UvvFWS7pT0T52MsS6W++rKZkkKSW8ulW2YygaHqzMivh4Rr1nPuGoxvKuu/N2pfNb61D/aWtnXu1lf7pz4W3NwREwEdgDOAk4FvjraK5G04WjX2SN2AFZGxPIh5lkSEROAzYGTgHMlvaAj0SXDbP8HgQ/XjsS65DdA/dHacancrGVO/G2IiD9GxCXAkcB0SbvB2oeKkraW9P10dPCgpGslbSDpQmAKcGlq2b5P0mBqrR0v6V7gx6WychJ6nqQbJf1R0vckbZXW1ah1uljSAZIOBD4AHJnWd2ua/nTXUYrrdEm/l7Rc0gWSnpmm1eKYLune1E1zWrNtI+mZafkVqb7TU/0HAPOAySmO84fZxhERP6BItH9binOmpN9KWinpotI2qMU5Q9ISSUslnVKKaxNJn0nTlqTHm5S3n6RTUxfUXOCHpVgflTQ5VXU58BfgLe28/jTtrZKuS48l6Zy0vf8oaaGk3STtKWlZ+X2XdLikBaXV3ARsJmnXNH1XYNNUXltmy7T/rZD0UHr8nDRtq/R6D07PJ0i6W9JxTV7TZEmXpP34bklvK01bq3ukvC8Os683e5/aqq9BrHdIekPp+YZpn31xev5tSf+Xtvk1tW3YoJ6n36tSWUjaKT3eRNLZ6TOxTEU376ZpWsPPfqP1dFtPBtXrIuJG4D7gVQ0mn5KmDQDbUiTfiIhjgXspjh4mRMQnSsv8PfBC4LVNVnkc8M/AZOBJ4HMtxHg58DHgW2l9uzeY7a3pti/wXGAC8Pm6eV4JvADYH/iQpBc2WeV/As9M9fx9ivmfIuJK4CBSiz4i3jpU3CnJvxHYGrg7Fb8LODTVOxl4CPhC3aL7AjsDrwFmak23wGnAS4GpwO7AXsDppeWeDWxFcVRyXF2sEyJiSZovgA8CZ0jaqNXX32C+1wB/Bzwf2IKiEbEyIm4CVgKvLs37FuDCuuUvTHVD0fq/oG76BsB/p9czBXic9J5GxIMU+9G5krYBzgEWRER9HTVzKfblycCbgI9J2r/JvE8bZl9v9j6NtL5yrEeXnr8WeCAibknPf5jWuw1wC/D14dbbxMcp3rupwE7AdsCH0rSGn/0RrqdSTvwjt4QiYdT7KzAJ2CEi/hoR18bwAyLNiojHIuLxJtMvjIhFEfEYRfI5QqPT5XAM8OmIuCciHgXeDxyltY82zoyIxyPiVuBWiuS5lhTLkcD7I2JVRCwGPgUc20YskyU9TJGoLgZOjohfpmknAKdFxH0R8QQwC3hTgzgfi4jbKBJfLQkcA3w4IpZHxArgzLq4ngLOiIgnhtj+AKSjvRXAWifb23z9fwUmAn8DKCLuiIiladoc0hFFOqJ5LfCNuuW/BhydvnyOSs/LMa6MiO9ExJ8iYhXw7xRfRLXpVwDfBq4CXk+xbdeh4rzMK4FTI+LPEbEA+EqT19SOZu/T+voG8EZJm6Xn/0hp20XEeem9qe0/uysd3bZKkoC3ASdFxINp+36M4n2AkX32u8KJf+S2o+iOqPdJipbqFZLukTSzhbr+0Mb03wMbUbSI19fkVF+57g0pWis15atw/kRxVFBva2DjBnVt10YsSyJiC4o+/s8B+5Wm7QBcnA6hHwbuAFbXxVm/jWpdNI1e4+TS8xUR8ec24jyd4ihifKms5dcfET+maIF/AVgmabakzdPkrwEHS5oAHAFcW/pSqC1/L8X+9THgrohYa9+RtJmkL6fupkeAa4At6hoKs4HdgP+OiJVNXudkoJbchnxNbWr2Pq2XiLibYr84OCX/N5ISv6Rxks5S0VX4CLA4LdbuZ2gA2Ay4ubQvXp7KYWSf/a5w4h8BSXtSfACuq5+WWhWnRMRzgYOBk0uHx82+/YdrFWxfejyFomXxAPAYxY5Yi2sca3bCVupdQpFUy3U/CSwbZrl6D6SY6uu6v816SC2yU4EXSTo0Ff8BOCgitijdxkdEuf76bVTromn0GpeUntdvoyG3WUTMo/hw/2upuK3XHxGfi4iXALtSdBu8N5XfD1wPHEbRsq7v5qm5gKJboVEXzSkUXXN7R8TmFN1KAIKn95Evp2XfUeu7bmAJsJWkiU1e01r7HkWX2Vovs0m9zd6nkdZXVuvuOQT4VfoygKL1fwhwAEV33GAqV4M66j9T5TgeoDgi3bW0Hz4zXZQw3Ge/pzjxt0HS5ukE0jeBr6XD1fp53iBpp3RY+AhFy7R2aeYyij7gdr1F0i6pJfNh4H/S5Z6/AcZLen069D8d2KS03DJgcIgTTHOBkyTtmFqZtXMCT7YTXIrlIuDfJU2UtANwMnXdEG3U9xeKrpJa3+mXUt07AEgakHRI3WIfTK3dXSn61r+VyucCp6dltk51DhXXMuBZw3QDnAY8fYKxndev4iTu3un9egz4M2v2DygS8vuAF1F0eTXyLYo+8osaTJtIkZweTt1FZ9RN/0C6/2fgbOCCRt2G6Uji58B/SBov6W+B41nTN74AeJ2KE8bPBt5dV0Wzfb3Z+zTS+sq+SbFd3sHaXWQTgScozqFsRrGfN3MrsKukqZLGU3QLARARTwHnAuekcyRI2k7Sa9PjoT77PcWJvzWXSlpF0fI8Dfg0jU/cQXEC6UrgUYrW239FxNVp2n9QJKGHJb2njfVfCJxP0e0ynuJkJxHxR4qW51coWmKPUZxcqvl2ul8p6RbWdV6q+xrgdxRJ6J1txFX2zrT+eyiOhL6R6h+p84ApKq5A+SxwCcUh9CrgF8DedfP/lKIlfhVwdurLBvgoMB9YCNxGcWKv6Y91IuLXFF8W96T3aZ2uiIj4GXBjXXGrr39ziuTxEEVXx0qKBFxzMalrK53TaRTj4xFxZZNzEp+huNLnAYrtdHltgqSXUHwhHZe+rD5O0ZJu1iVxNEXreEmK64x0xAPFfnMrRbfJFaxJ4DXN9vVm79NI63ta6ha7Hnh53fIXUGzr+4FfUWyXhiLiNxSNqyuBu1j3qP7UFP8vUrfRlRRHWDD0Z7+nqEfPPZi1RMUPqH4HbNTukUqvkvRb4IR0RdSYMBbfp37mFr9ZD5F0OEUr/MfdjsXGrrH6S1GzviPpamAX4NjUn2xWCXf1mJllxl09ZmaZ6Yuunq233joGBwe7HYZ12yN3Fvebd3TsNrO+dfPNNz8QEQP15X2R+AcHB5k/f363w7Buu3Kf4v6Aq7sZhVnfkPT7RuXu6jEzy4wTv5lZZpz4zcwy48RvZpYZJ34zs8w48ZuZZcaJ38wsM078ZmaZceI3M8uME7/1ncGZlzE487Juh2HWt5z4zcwy48RvZpYZJ34zs8w48ZuZZaYvhmW2PJRP2C4+6/VdjMRsbHOL38wsM078ZmaZceI3M8uME7+ZWWac+M3MMuPEb2aWGSd+M7PMVJb4JY2XdKOkWyXdLunMVD5L0v2SFqTb66qKwczM1lXlD7ieAPaLiEclbQRcJ+mHado5EXF2hes2M7MmKkv8ERHAo+npRukWVa3PzMxaU2kfv6RxkhYAy4F5EXFDmnSipIWSzpO0ZZNlZ0iaL2n+ihUrqgzTzCwrlSb+iFgdEVOB5wB7SdoN+CLwPGAqsBT4VJNlZ0fEtIiYNjAwUGWYZmZZ6chVPRHxMHA1cGBELEtfCE8B5wJ7dSIGMzMrVHlVz4CkLdLjTYEDgF9LmlSa7TBgUVUxmJnZuqq8qmcSMEfSOIovmIsi4vuSLpQ0leJE72LghApjMDOzOlVe1bMQ2KNB+bFVrdPMzIbnX+5aTxqcedlaf8xiZqPHid/MLDNO/GZmmXHiNzPLjBO/mVlmnPjNzDLjxG9mlhknfjOzzDjxm5llxonfzCwzVY7VYzZqBmdexjefu7LbYZiNCW7xm5llxonfzCwzTvxmZplx4jczy4wTv5lZZnxVj/W98rj9i896fRcjMesPbvGbmWWmyj9bHy/pRkm3Srpd0pmpfCtJ8yTdle63rCoGMzNbV5Ut/ieA/SJid2AqcKCklwIzgasiYmfgqvTczMw6pLLEH4VH09ON0i2AQ4A5qXwOcGhVMZiZ2boq7eOXNE7SAmA5MC8ibgC2jYilAOl+mybLzpA0X9L8FStWVBmmjSGN/qTdf9xutrZKE39ErI6IqcBzgL0k7dbGsrMjYlpETBsYGKgsRjOz3HTkqp6IeBi4GjgQWCZpEkC6X96JGMzMrFDlVT0DkrZIjzcFDgB+DVwCTE+zTQe+V1UMZma2rip/wDUJmCNpHMUXzEUR8X1J1wMXSToeuBd4c4UxmJlZncoSf0QsBPZoUL4S2L+q9ZqZ2dD8y10zs8w48ZuZZcaJ38wsM078ZmaZceI3M8uME79lw0M3mBWc+M3MMuPEb2aWGSd+M7PMOPGbmWXGid/MLDNVDtJmtt58FY7Z6HOL38wsM078ZmaZceI3M8uME7+ZWWac+M3MMuPEb2aWmSr/bH17ST+RdIek2yX9WyqfJel+SQvS7XVVxWBmZuuq8jr+J4FTIuIWSROBmyXNS9POiYizK1y3mZk1UeWfrS8FlqbHqyTdAWxX1frMzKw1HenjlzQI7AHckIpOlLRQ0nmStuxEDGZmVqg88UuaAHwHeHdEPAJ8EXgeMJXiiOBTTZabIWm+pPkrVqyoOkwzs2xUmvglbUSR9L8eEd8FiIhlEbE6Ip4CzgX2arRsRMyOiGkRMW1gYKDKMM3MslLlVT0CvgrcERGfLpVPKs12GLCoqhjMzGxdVV7V8wrgWOA2SQtS2QeAoyVNBQJYDJxQYQxmZlanyqt6rgPUYNIPqlqnmZkNz+PxW0fUj6u/+KzXj3qdZtYaD9lgZpYZJ34zs8w48ZuZZcaJ38wsM078ZmaZceI3M8uME7+ZWWac+M3MMuPEb2aWmZYSv6RXtFJmZma9r9UhG/4TeHELZWYtKQ+3MBrDN1ShFmO78Y10ObNOGTLxS3oZ8HJgQNLJpUmbA+OqDMzMzKoxXIt/Y2BCmm9iqfwR4E1VBWVmZtUZMvFHxE+Bn0o6PyJ+36GYzMysQq328W8iaTYwWF4mIvarIigzM6tOq4n/28CXgK8Aq6sLx6x6/XBi2axKrSb+JyPii5VGYmZmHdHqD7gulfSvkiZJ2qp2qzQyMzOrRKst/unp/r2lsgCe22wBSdsDFwDPBp4CZkfEZ9MXxrcozhcsBo6IiIfaC9vMzEaqpcQfETuOoO4ngVMi4hZJE4GbJc0D3gpcFRFnSZoJzAROHUH9ZmY2Ai0lfknHNSqPiAuaLRMRS4Gl6fEqSXcA2wGHAPuk2eYAV+PEb2bWMa129exZejwe2B+4haIrZ1iSBoE9gBuAbdOXAhGxVNI2TZaZAcwAmDJlSothWi8oXzVTxfyjycMrWI5a7ep5Z/m5pGcCF7ayrKQJwHeAd0fEI5JaCiwiZgOzAaZNmxYtLWRmZsMa6bDMfwJ2Hm4mSRtRJP2vR8R3U/EySZPS9EnA8hHGYGZmI9BqH/+lFFfxQDE42wuBi4ZZRsBXgTsi4tOlSZdQXCV0Vrr/Xpsxm5nZemi1j//s0uMngd9HxH3DLPMK4FjgNkkLUtkHKBL+RZKOB+4F3tx6uGZmtr5a7eP/qaRtWXOS964WlrkOaNahv39r4ZmZ2Whr9R+4jgBupGidHwHcIMnDMpuZ9aFWu3pOA/aMiOUAkgaAK4H/qSowMzOrRqtX9WxQS/rJyjaWNTOzHtJqi/9yST8C5qbnRwI/qCYkMzOr0nD/ubsTxS9t3yvpH4BXUpywvR74egfiMzOzUTZcd81ngFUAEfHdiDg5Ik6iaO1/ptrQzDpncOZlXR06wqyThkv8gxGxsL4wIuZTDKtsZmZ9ZrjEP36IaZuOZiBmZtYZwyX+myS9rb4w/er25mpCMjOzKg13Vc+7gYslHcOaRD8N2Bg4rMK4zMysIkMm/ohYBrxc0r7Abqn4soj4ceWRWc9odNIz1/HrPX6/jQWtjtXzE+AnFcdiZmYd4F/fmpllxonfzCwzTvxmZplx4jczy0yrg7SZNVS+4mcsXOniYRssB27xm5llprLEL+k8ScslLSqVzZJ0v6QF6fa6qtZvZmaNVdniPx84sEH5ORExNd08pr+ZWYdVlvgj4hrgwarqNzOzkenGyd0TJR0HzAdOiYiHGs0kaQYwA2DKlCkdDM9a4ZOgZv2r0yd3vwg8D5gKLAU+1WzGiJgdEdMiYtrAwECHwjMzG/s6mvgjYllErI6Ip4Bzgb06uX4zM+tw4pc0qfT0MGBRs3nNzKwalfXxS5oL7ANsLek+4AxgH0lTgQAWAydUtX4zM2usssQfEUc3KP5qVeszM7PWeMgGs2H4CiYbazxkg5lZZpz4zcwy48RvZpYZJ34zs8z45K6NSb12QrYWz1j4zwLrf27xm5llxonfzCwzTvxmZplx4jczy4xP7mak3ROMvXaCtJc02pb128vbz3qVW/xmZplx4jczy4wTv5lZZpz4zcwy48RvZpYZX9VjoybHq1jW5zV7GAfrFrf4zcwyU1nil3SepOWSFpXKtpI0T9Jd6X7LqtZvZmaNVdniPx84sK5sJnBVROwMXJWem5lZB1WW+CPiGuDBuuJDgDnp8Rzg0KrWb2ZmjXX65O62EbEUICKWStqm2YySZgAzAKZMmdKh8MaeRicfy2U+sdibfOLXqtSzJ3cjYnZETIuIaQMDA90Ox8xszOh04l8maRJAul/e4fWbmWWv04n/EmB6ejwd+F6H129mlr0qL+ecC1wPvEDSfZKOB84CXi3pLuDV6bmZmXVQZSd3I+LoJpP2r2qdZmY2vJ49uWtmaxuceVmWw2LY6HPiNzPLjBO/mVlmnPjNzDLjxG9mlhmPxz9GtXsS0CcNu2803wMPy2FDcYvfzCwzTvxmZplx4jczy4wTv5lZZpz4zcwy48Tfx/wTfqvxvmDtcOI3M8uME7+ZWWac+M3MMuPEb2aWGQ/Z0ONqJ+yq+tm9TwjmY6TDOLS7nIeL6H1u8ZuZZaYrLX5Ji4FVwGrgyYiY1o04zMxy1M2unn0j4oEurt/MLEvu6jEzy0y3En8AV0i6WdKMLsVgZpalbnX1vCIilkjaBpgn6dcRcU15hvSFMANgypQp3YixY+qvrPGVEFYzGn+o06krt1pZj6/46Q1dafFHxJJ0vxy4GNirwTyzI2JaREwbGBjodIhmZmNWxxO/pGdImlh7DLwGWNTpOMzMctWNrp5tgYsl1db/jYi4vAtxmJllqeOJPyLuAXbv9HrNzKzgIRu6ZDRO2o1GvdZZo3nydX3e66GGAql6mJBOr8fW5ev4zcwy48RvZpYZJ34zs8w48ZuZZcYnd836TBUn8HvlooBWTvj6pPD6c4vfzCwzTvxmZplx4jczy4wTv5lZZpz4zcwy46t6RkmjccYbXX0wlq/IsP7TjeEi2qm/1St3xsqVPp16HW7xm5llxonfzCwzTvxmZplx4jczy8yYP7nb6knXoZZrpL6uoZb1yVfrR6Ox37b7B+zrW/do/pl7o/obfe7bXU+7+aeKE71u8ZuZZcaJ38wsM11J/JIOlHSnpLslzexGDGZmuep44pc0DvgCcBCwC3C0pF06HYeZWa660eLfC7g7Iu6JiL8A3wQO6UIcZmZZUkR0doXSm4ADI+Jf0vNjgb0j4sS6+WYAM9LTFwB3Vhza1sADFa9jNPVbvNB/MfdbvNB/MfdbvNBfMe8QEQP1hd24nFMNytb59omI2cDs6sMpSJofEdM6tb711W/xQv/F3G/xQv/F3G/xQn/GXK8bXT33AduXnj8HWNKFOMzMstSNxH8TsLOkHSVtDBwFXNKFOMzMstTxrp6IeFLSicCPgHHAeRFxe6fjaKBj3UqjpN/ihf6Lud/ihf6Lud/ihf6MeS0dP7lrZmbd5V/umpllxonfzCwzYy7xSzpP0nJJi0plsyTdL2lBur2uNO39aeiIOyW9tkmdW0maJ+mudL9lt2KW9GpJN0u6Ld3v16TOpq+5w/EOSnq8VP6lJnX20jY+plS2QNJTkqY2qLOj2ziVvzPtq7dL+kSpvCf342Yx9+p+PES8PbEfj5qIGFM34O+AFwOLSmWzgPc0mHcX4FZgE2BH4LfAuAbzfQKYmR7PBD7exZj3ACanx7sB9zeps+HyXYh3sDzfEHX2zDauW+5FwD09so33Ba4ENknPt0n3vbwfN4u5V/fjZvH2xH48Wrcx1+KPiGuAB1uc/RDgmxHxRET8DribYkiJRvPNSY/nAIeub5xl7cQcEb+MiNrvHm4HxkvaZDTjaSGGdrZxq3pmG9c5Gpg7mrG0okm87wDOiogn0jzLU3kv78cNY+7h/bjZNm5Vpdt4tIy5xD+EEyUtTId3tcOv7YA/lOa5L5XV2zYilgKk+22qDfVpjWIuOxz4ZW0nHcHyo63Z+naU9EtJP5X0qibL9uo2PpKhE38nt/HzgVdJuiFtyz1TeS/vx81iLuul/XioeHt5P25LLon/i8DzgKnAUuBTqbyl4SO6pFnMAEjaFfg4cMJIlq9As/UtBaZExB7AycA3JG1ecSytGm4b7w38KSIWrbvo8MtXYENgS+ClwHuBiySJ3t6Pm8UM9OR+3CzeXt6P25ZF4o+IZRGxOiKeAs5lzWFwq8NHLJM0CSDdt3v417YhYkbSc4CLgeMi4rftLt/JeFP3w8r0+GaK/ufnN6iip7ZxchRDtPY7vY0p9tfvRuFG4CmKAcN6dj+mecw9uR83i7eX9+ORyCLx196I5DCg1oK7BDhK0iaSdgR2Bm5sUMUlwPT0eDrwvapirWkWs6QtgMuA90fEz9pdvipDxDug4j8YkPRcim18T4MqemYbp2kbAG+mGDa87eUr8r/Afmndzwc2phglsmf3Y5rE3Kv7Mc3j7dn9eES6fXZ5tG8ULbSlwF8pvr2PBy4EbgMWUrwxk0rzn0bx7X0ncFCp/CvAtPT4WcBVwF3pfqtuxQycDjwGLCjdtmkQc9PX3OF4D6c4eXcrcAtwcK9v4zT/PsAvGtTTzW28MfA1iuR3C7BfH+zHDWPu4f24Wbw9sR+P1s1DNpiZZSaLrh4zM1vDid/MLDNO/GZmmXHiNzPLjBO/mVlmnPit50lanUZEXCTp25I2a2PZQUn/OML1Lpa09UiWbba8pPMlnVBXdqikHwxRz/mS3jTSOMzqOfFbP3g8IqZGxG7AX4C3t7KQpA0pRlVsO/HXfqxTgbkUvwguG/IXwmajzYnf+s21wE6SnpEG7bopDZx1CICkt6ajgkuBK4CzKAbdWiDppDT987XKJH1f0j7p8aOSPizpBuBlaZb3Srox3XZK8w1I+k5a902SXpHKnyXpihTPl2k8hs6VwN+Ufta/GXAA8L+SPpTqWyRpdnlMm1K8Tx9FSJom6er0uOH2MGvEid/6RmrBH0TxS87TgB9HxJ4UY6h/UtIz0qwvA6ZHxH4UY6Jfm44YzhlmFc+gGHN974i4LpU9EhF7AZ8HPpPKPguck9Z9OMUvNwHOAK6LYiCvS4Ap9SuIiNXAd4EjUtEbgZ9ExCrg8xGxZzqy2RR4Q0sbpjDU9jBby4bdDsCsBZtKWpAeXwt8Ffg58EZJ70nl41mTaOdFxEjG3l8NfKeubG7pvvbFcQCwS6lBvrmkiRR/7PEPABFxmaSHmqxnLvBJii+Qo4ALUvm+kt4HbAZsRTFEwKUtxv4aGm+PO1pc3jLixG/94PGImFouSN0gh0fEnXXle1OMAdPMk6x9pDu+9PjPqUVeFg0ebwC8LCIer1t3/fzN/AyYJGl34OUUA6yNB/6LYsyXP0iaVRdbo/jL0xtuD7NG3NVj/epHwDtr/eCS9mgy3ypgYun5YmCqpA0kbc/ww/weWbq/Pj2+AjixNoPW/B/vNcAxqewginHd1xHFAFkXUfxD0w8i4s+sSeIPSJoANLuKZzHwkvT48FJ5q9vDzInf+tZHgI2AhSr+LPsjTeZbCDwp6VZJJ1G0tn9HcZ7gbIqRFoeySTrZ+2/ASansXcA0Ff8K9SvWXGV0JvB3km6h6Hq5d4h65wK7k4Z9joiHKcabv41iaOCbmix3JvBZSddSdE3VtLo9zDw6p5lZbtziNzPLjBO/mVlmnPjNzDLjxG9mlhknfjOzzDjxm5llxonfzCwz/w+pOEUEj64QEwAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1282,6 +1282,13 @@ "source": [ "### Online Multiplicative Weights Mechanism" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/relm/histogram.py b/relm/histogram.py index 0cc0a24..cf72828 100644 --- a/relm/histogram.py +++ b/relm/histogram.py @@ -38,6 +38,8 @@ def __init__(self, df): vals = [] for row in counts.index: + if not isinstance(row, tuple): + row = (row,) query = dict(zip(columns, row)) idxs.append(self._get_idx(query)) vals.append(counts.loc[row].dummy) From 7769f42d00f9a41f07f0b533fe13d4d9dc1ac57a Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 21 Jan 2021 12:05:54 +1100 Subject: [PATCH 134/185] Changed the interface for hist.get_query_vector The old version didn't let you specify an arbitrary list of key/value pairs that a query should "hit". To make that possible, I changed the expected input from a dict of key/value pairs to list of dicts of key value pairs. It's a bit ugly, but necessary to capture the full range of possible queries. --- relm/histogram.py | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/relm/histogram.py b/relm/histogram.py index cf72828..2f928af 100644 --- a/relm/histogram.py +++ b/relm/histogram.py @@ -77,15 +77,30 @@ def get_query_vector(self, query): the indices of the database histogram corresponding to the query """ - idxs = np.array([self._get_idx(query)]) - for i, col in enumerate(self.column_dict.keys()): - if query.get(col, None) is None: - new_idxs = np.arange(len(self.column_sets[i])) * self.column_incr[i] - idxs = idxs[:, None] + new_idxs[None, :] - idxs = idxs.flatten() - - rows = np.zeros_like(idxs) - vals = np.ones_like(idxs) + if not isinstance(query, list): + query = [query] + + idxs_list = [] + rows_list = [] + vals_list = [] + for sub_query in query: + sub_idxs = np.array([self._get_idx(sub_query)]) + for i, col in enumerate(self.column_dict.keys()): + if sub_query.get(col, None) is None: + new_sub_idxs = np.arange(len(self.column_sets[i])) * self.column_incr[i] + sub_idxs = sub_idxs[:, None] + new_sub_idxs[None, :] + sub_idxs = sub_idxs.flatten() + + sub_rows = np.zeros_like(sub_idxs) + sub_vals = np.ones_like(sub_idxs) + + idxs_list.append(sub_idxs) + rows_list.append(sub_rows) + vals_list.append(sub_vals) + + idxs = np.concatenate(idxs_list) + rows = np.concatenate(rows_list) + vals = np.concatenate(vals_list) vec = sps.csr_matrix((vals, (rows, idxs)), shape=(1, self.size)) return vec From b8ba7fff11d562a0e6a4d97702de75a8f9bb5ed0 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 21 Jan 2021 14:00:54 +1100 Subject: [PATCH 135/185] Modified SmallDB usage to be consistent with other mechanisms --- examples/dummy_smalldb.ipynb | 239 ++++++-- examples/relm_demo.ipynb | 828 +++++++++++++++++---------- relm/histogram.py | 10 + relm/mechanisms/data_perturbation.py | 46 +- src/mechanisms.rs | 25 - 5 files changed, 741 insertions(+), 407 deletions(-) diff --git a/examples/dummy_smalldb.ipynb b/examples/dummy_smalldb.ipynb index 31b33b3..ad16e35 100644 --- a/examples/dummy_smalldb.ipynb +++ b/examples/dummy_smalldb.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -17,92 +17,259 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "df = pd.DataFrame()\n", - "dummy = np.random.choice(np.arange(3), size=10000, p=[0.1,0.35,0.55]) \n", - "df[\"DUMMY\"] = dummy\n", + "data = pd.DataFrame()\n", + "test_results = np.random.choice([\"Negative\", \"Positive\", \"N/A\"], size=10000, p=[0.55,0.35,0.1]) \n", + "data[\"Test Result\"] = test_results\n", "\n", - "hist = Histogram(df)\n", - "real_database = hist.get_db()" + "hist = Histogram(data)\n", + "real_database = hist.get_db()\n", + "db_size = real_database.size" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from itertools import product\n", - "queries = []\n", - "\n", - "cols = [\"DUMMY\"]\n", - "vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", - "queries.extend(dict(zip(cols, val)) for val in vals)\n", "\n", + "queries = [[{\"Test Result\": \"Negative\"}, {\"Test Result\": \"Positive\"}],\n", + " [{\"Test Result\": \"Positive\"}, {\"Test Result\": \"N/A\"}],\n", + " [{\"Test Result\": \"Negative\"}, {\"Test Result\": \"N/A\"}]]\n", "queries = sps.vstack([hist.get_query_vector(q) for q in queries])\n", "\n", - "queries = np.array([[1,1,0],\n", - " [0,1,1],\n", - " [1,0,1]])\n", - "queries = sps.csr.csr_matrix(queries)" + "# queries = np.array([[1,1,0],\n", + "# [0,1,1],\n", + "# [1,0,1]])\n", + "# queries = sps.csr.csr_matrix(queries)\n", + "\n", + "values = (queries @ real_database)/real_database.sum()" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "smalldb = SmallDB(epsilon=1.0, data=real_database, alpha=0.05)" + "smalldb = SmallDB(epsilon=1.0, alpha=0.05)" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "synthetic_database = smalldb.release(queries)" + "synthetic_database = smalldb.release(values, queries, db_size)" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "real_responses = (queries @ real_database)/real_database.sum()\n", - "synthetic_responses = (queries @ synthetic_database) / synthetic_database.sum()" + "TRIALS = 2**4\n", + "synthetic_responses = np.empty((TRIALS, queries.shape[0]))\n", + "for i in range(TRIALS):\n", + " smalldb = SmallDB(epsilon=1.0, alpha=0.05)\n", + " synthetic_database = smalldb.release(values, queries, db_size)\n", + " synthetic_responses[i] = (queries @ synthetic_database) / synthetic_database.sum()" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.4639 0.894 0.6421]\n", - "[0.46416667 0.8925 0.64333333]\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", + "
Query 0Query 1Query 2
Real Responses0.9005000.4477000.651800
TRIAL 00.9008330.4458330.653333
TRIAL 10.9008330.4491670.650000
TRIAL 20.9016670.4475000.650833
TRIAL 30.9016670.4466670.651667
TRIAL 40.9008330.4475000.651667
TRIAL 50.8991670.4475000.653333
TRIAL 60.8966670.4516670.651667
TRIAL 70.9016670.4466670.651667
TRIAL 80.9008330.4475000.651667
TRIAL 90.9016670.4441670.654167
TRIAL 100.8983330.4491670.652500
TRIAL 110.9008330.4483330.650833
TRIAL 120.9016670.4475000.650833
TRIAL 130.9016670.4475000.650833
TRIAL 140.9008330.4475000.651667
TRIAL 150.9016670.4466670.651667
\n", + "
" + ], + "text/plain": [ + " Query 0 Query 1 Query 2\n", + "Real Responses 0.900500 0.447700 0.651800\n", + "TRIAL 0 0.900833 0.445833 0.653333\n", + "TRIAL 1 0.900833 0.449167 0.650000\n", + "TRIAL 2 0.901667 0.447500 0.650833\n", + "TRIAL 3 0.901667 0.446667 0.651667\n", + "TRIAL 4 0.900833 0.447500 0.651667\n", + "TRIAL 5 0.899167 0.447500 0.653333\n", + "TRIAL 6 0.896667 0.451667 0.651667\n", + "TRIAL 7 0.901667 0.446667 0.651667\n", + "TRIAL 8 0.900833 0.447500 0.651667\n", + "TRIAL 9 0.901667 0.444167 0.654167\n", + "TRIAL 10 0.898333 0.449167 0.652500\n", + "TRIAL 11 0.900833 0.448333 0.650833\n", + "TRIAL 12 0.901667 0.447500 0.650833\n", + "TRIAL 13 0.901667 0.447500 0.650833\n", + "TRIAL 14 0.900833 0.447500 0.651667\n", + "TRIAL 15 0.901667 0.446667 0.651667" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "print(real_responses)\n", - "print(synthetic_responses)" + "df = pd.DataFrame(data=np.row_stack((values, synthetic_responses)),\n", + " columns=[\"Query %i\" % i for i in range(queries.shape[0])],\n", + " index=[\"Real Responses\"] + [\"TRIAL %i\" % i for i in range(TRIALS)])\n", + "\n", + "display(df)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n" + ] + } + ], + "source": [ + "print(db_size)" + ] }, { "cell_type": "code", diff --git a/examples/relm_demo.ipynb b/examples/relm_demo.ipynb index a588719..c41ca1c 100644 --- a/examples/relm_demo.ipynb +++ b/examples/relm_demo.ipynb @@ -15,9 +15,11 @@ "source": [ "import numpy as np\n", "import pandas as pd\n", + "import scipy.sparse as sps\n", "import matplotlib.pyplot as plt\n", "\n", "from collections import Counter\n", + "from itertools import product\n", "\n", "# Note: imports from the relm module will be done as needed below" ] @@ -79,8 +81,6 @@ "# Create a differentially private release mechanism\n", "from relm.mechanisms import LaplaceMechanism\n", "mechanism = LaplaceMechanism(epsilon=0.1, sensitivity=1.0, precision=35)\n", - "\n", - "# Compute perturbed query response\n", "perturbed_counts = mechanism.release(values=values.astype(np.float))" ] }, @@ -103,59 +103,59 @@ "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238236.56745700-9238222.083581
110-19386383.710575110-19386386.294492
220-29688694.847584220-29688675.054709
330-39779762.346705330-39779781.616796
440-49621632.455271440-49621627.073361
550-59582581.389267550-59582590.627503
660-69344351.455088660-69344348.706589
770+261243.848760770+261258.880069
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -163,7 +163,7 @@ }, { "data": { - "image/png": "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OgReeOEFPvaxj3H88cfTv39/3nnnHW666SYmT55MVVUVkydvfyOuu+66i5EjR3LyyScDSb/0xRdfTOfOnXnzzTe54IIL6NOnDyeddBIvv/wyAGPHjmX8+PFb19G7d2+WLVvGsmXL6NGjB1/84hfp1asXgwYNYuPGjTzyyCPMmTOHSy65hKqqKjZu3Mjo0aPp2bMnffr04brrrivrfmwOt9zNrFk2btxIVVXV1tc33HADn/nMZ7jzzjsZNWoU11xzDW+99RZf/OIXARg3bhzt27fn/fffZ+DAgbz88ssce+yxfOYzn2Hy5Mn069ePdevW0aZNG775zW8yZ84c7rzzzh22O3/+fEaOHLlDOcCYMWPo27cvP//5z/nVr37F5z//+SZ/XSxevJiHH36YH/7wh3z605/m0Ucf5dJLL+XOO+9k/PjxVFdX8+abb/LYY4/x6quvIom33357Z3db2Tm5m1mzNNQt84lPfIKf/vSnXHXVVbz00ktby6dMmcKECROora1l5cqVvPLKK0iiS5cu9OvXD4C2bds2K6bnnnuORx99FIAzzzyTtWvX8s477zS6TLdu3bZ+SX30ox9l2bJlO9Rp27YtrVq14oorrmDIkCGcd955zYqznJzcLVvGHlRgvcb/0a35tmzZwsKFC2ndujVvvvkmXbt2ZenSpYwfP54XXniBdu3aMWrUKDZt2kREFH26X69evZg7dy5Dhw7dYV6+mxBJokWLFmzZsu3mWbnnju+3335bpysqKti4ceMO62jRogWzZ89mxowZTJo0iTvvvJNf/apZd1osG/e5m1lZ3HbbbfTo0YOHH36Yyy67jPfee49169ax//77c9BBB7Fq1SqefvppAI499lhWrFjBCy+8AMD69eupra3lwAMPZP369XnXf/XVVzNx4kRmzZq1teyBBx7gjTfeYMCAATz44IMAzJw5k44dO9K2bVsqKyt58cUXAXjxxRdZunRpk+8jN4YNGzbwzjvvcO6553L77beX7UByKbjlbpYhu+Nsofp97oMHD+ayyy7jnnvuYfbs2Rx44IEMGDCAb3/729x888307duXXr16cdRRR3HKKacA0LJlSyZPnsxXvvIVNm7cSOvWrZk+fTof//jHueWWW6iqqtral1+nc+fOTJo0ieuuu47Vq1ezzz77MGDAAC688ELGjh3LF77wBfr06UObNm2YODEZ4/Ciiy7i/vvvp6qqin79+nH00Uc3+f5GjRrFl7/8ZVq3bs3TTz/N0KFDt/7auO2220q7M0toj7iHanV1dfhmHdaQok6FbPXZwipmpFtm4cKF9OjRY3eHYbtAvs9a0tyIqM5X390yZmYZ5ORuZpZBTu5mZhnk5G5mlkFO7mZmGeTkbmaWQT7P3SxLCr1Ct+D1NX3KaN2Qv7W1tfTo0YOJEycWPCrjsmXL+P3vf89nP1vgKaw5KisrmTNnDh07dix62caW37BhA1//+teZPn06rVq1okOHDnz3u9/lxBNP3Knt5NPUUMal4Ja7mTVL3dgy8+fPp2XLltx9990FLVdbW8uyZct46KGHit7m+++X7/4/V1xxBe3bt2fx4sUsWLCA++67j7///e8l3ca8efN46qmnSrrO+pzczaxkTjvtNJYsWcK7777LZZddRr9+/ejbty+PP57chfO+++5j2LBhfPKTn2TQoEGMHj2aZ599lqqqKm677Tbuu+8+rr766q3rO++885g5cyYABxxwADfddBMnnngizz//PADf/e536d+/P/3792fJkiUArFmzhosuuoh+/frRr18/fve73wGwdu1aBg0aRN++ffnSl76Ud/yZ1157jVmzZvHtb3+bffZJ0uNRRx3FkCHJlb+33norvXv3pnfv3tx+++1A8uujd+/eW9cxfvx4xo4dC8AZZ5zB9ddfT//+/Tn66KN59tln+ec//7nDUMa/+c1vqKqqoqqqir59+zY45EIx3C1jZiVRW1vL008/zeDBgxk3bhxnnnkm9957L2+//Tb9+/fnrLPOAuD555/n5Zdfpn379sycOZPx48fzxBNPAEnyb8i7775L7969+eY3v7m1rG3btsyePZv777+fa6+9lieeeIJrrrmGr371q5x66qksX76cs88+m4ULF3LzzTdz6qmnctNNN/Hkk08yYcKEHbaxYMECqqqqqKio2GHe3Llz+fGPf8ysWbOICE488UROP/102rVr1+R+mT17Nk899RQ333wz06dP32Eo409+8pPcddddnHLKKWzYsIFWrVo1ub+b0mRyl3QMkDtK/lHATcD9aXklsAz4dES8lS5zA3A58D7wrxHxy2ZHamZ7pNyxZU477TQuv/xyPvaxjzF16tStN8bYtGkTy5cvB5KhgNu3b1/0dioqKrjooou2KxsxYsTW569+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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEWCAYAAACdaNcBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAApp0lEQVR4nO3dfZxVZb338c9XEAEVlQcJRQULlQdxsAE1FU0MUUxMpSAtSM06t3a08nWE40mw4hw7cdRMu73JTMwHIE3l+FACRWkZCIYEIoFBOIFA+AAYkCO/+4+1BrbDnpm9Z/YGZvV9v177tde+1rXW+u21Z3772tda61qKCMzMLFv22dMBmJlZ6Tm5m5llkJO7mVkGObmbmWWQk7uZWQY5uZuZZZCTu1ktks6UVLWn4zBrCif3fyKSNuc8tkvakvP60kasb7akKxuo00rSeEnLJL0raaWkeyV1a/QbKSy2vSpBp/sgJA0o83Z6SJoiab2kjel+/76kruXcru19nNz/iUTEATUPYBXwyZyyB8u02UeAC4DPAgcBJwDzgUFl2t5eR5KAzwFvAqPKuJ2PAHOA1UC/iGgHnAq8BpxWxzItyxWP7WER4cc/4QNYCZydTu8DjCFJAhuAaUD7dF5r4IG0/G3gRaAzMAF4H9gKbAbuzLONs4EtwBH1xHEYMJ0k8S0Hvpgz7z7g2zmvzwSqar2H64GFwDvA1DTe/dPtbk9j25xuZwAwD9gIrAVurSOmM4Eq4N+Bv6XbuTSd1z9dtmVO/YuBBfW8x4FpPJel+7FVzrwWwP+k21kBXANEzfpJvhB/BKwB/gp8G2hRx3YeAP63gc+95r3dALwB/ATYD7id5EthdTq9X1p/NPB8rXUE8JGcz+huYAawCfg1cNSe/vv2I9xyNwD+FbgQOIMkCb4F3JXOG0WSYI4AOgBfBrZExI3Ac8A1kbT8r8mz3rOBuRHxej3bfpgk2RwGXAL8p6RiWvWfBoYA3YG+wOiIeBc4F1gdO3+ZrAa+B3wvkhbth0m+xOryIaAjcDjJPpgk6diIeJEkQX8ip+5lJEmyLqOA/yX58gE4P2feF9NYK4ATST6HXJOBauAjQD9gMFBXV9jZwKP1xFHjQ0B74CjgKuBG4OQ0hhNIvgT/o4D11LgU+BbJ/loAlOtXoBXByd0AvgTcGBFVEbENGA9ckv5kf48kqX8kIt6PiPkRsbHA9XYgaXHmJekIku6CGyJia0QsAO4h6cIo1B0RsToi3iRJoBX11H0P+IikjhGxOSJ+38C6vxER2yLi18BTJF8kkCTcy9L30B44B3go3woktQWGAw9FxHsk3VS5XTOfJvnCqYqIt4BbcpbtTJL4r4uIdyNiHXAbMKKOeDuStMZrlr9G0tvpMZUf5tTbDoxL39sWkuT8zYhYFxHrgZsp7jN4KiJ+k/7t3Aickn62tgc5uRskLbjH0kTwNrCEpMulM0mL9BfAFEmrJf23pH0LXO8GoEs98w8D3oyITTllfyFpLRfqjZzpvwMH1FP3CuAY4FVJL0o6v566b6W/AHLjOiydfgD4pKQDSJLzcxFR15fYp0ha3k+nrx8EzpXUKX19GJD7yyZ3+ihgX2BNzmfz/4BD69jWB/Z3RNwZEQeTdLPkfmbrI2JrzuvD0veX770WYkfMEbGZpIutmOWtDJzcDZJ/znMj4uCcR+uI+GtEvBcRN0dEL+BjJF0Kn0+Xa2hI0ZnAgHrO1FgNtJd0YE7ZkSR9ywDvAm1z5n2oiPe0S2wRsSwiRpIkx+8Aj0jav47lD6k178g0XiLir8ALJIn7czTcJXMAsErSG8BPSRLtyHT+GiB3/+S2eF8HtgEdcz6XdhHRu45tzQIuqieWGrX3zWqSL5IaO94rtT4DSfk+gyNy5h9A0uWzOk89242c3A2SA2ITJB0FIKmTpGHp9MclHS+pBcmByPdIWvWQHFg8uq6VRsRMkgNtj0n6qKSWkg6U9GVJl6d98b8D/ktSa0l9SVrXNX22C4DzJLVPk8p1RbyntUAHSQfVFEi6TFKniNhOcnCYnPeSz83pqZynk3yp/TRn3v3AvwHHA4/lW1jS4SRnBZ1P0l1UQdKn/R12ds1MA66VdLikg0kOdAKQ/hp4FvgfSe0k7SPpw5LOqCPe8cDpkm5Nt42kjkDPet4jJMc9/iP93DsCN5H8OgF4GegtqUJS63QbtZ0n6TRJrUj63uc0cJzFdgMnd4PkQON04FlJm4DfAyel8z5E0k+8kaS75tfs/Mf/Hknf/FuS7qhj3ZeQdElMJTmjZRFQSdKqh6QF242kpfcYSV/wjHTeT0iSy0qSJFdzQLJBEfEqSdL6c9qlcRjJgdfFkjansY+o1T2R6w2SA8urSb5svpyus8ZjpN1Ztbpvcn2O5CyaZyPijZoHcAfQV1If4Ifpe1sI/IFkX1Wz80vn80Ar4JU0nkeoo6srIv5EcmC0K/By+ln+Nn0P36gjRkjOwJmXxvBH4KW0rGad3yT5vJYBz+dZ/iFgHEl3zEdJ+vBtD1OEb9Zh1hiSXgO+lP5CKdU6zwXujoijGqy8F5B0H8npqcWcXWO7gVvuZo0g6WKSvutfNnE9bSSdl3ZZHU7SAs7bzWNWDF+dZlYkSbOBXsDn0v77Jq2O5NTDqSQXOj1F0udt1iTuljEzyyB3y5iZZdBe0S3TsWPH6Nat254Ow8ysWZk/f/7fIqJTvnl7RXLv1q0b8+bN29NhmJk1K5L+Utc8d8uYmWVQQcld0lclLZa0SNLD6dWE7SXNSG8GMEPSITn1x0paLmmppHPKF76ZmeXTYHJPz739V6AyIvqQjD89gmT871kR0YNkTIsxaf1e6fzeJFcE/iC9dN3MzHaTQvvcWwJtJL1HMojQamAsycD/kAyBOptkXIxhwJR0+M8VkpaTjA/9QunCNjOA9957j6qqKrZurWsUBcuC1q1b07VrV/bdt9ABWQtI7hHxV0kTSW7LtgV4NiKeldS5ZpjTiFgjqWYY0sNJxiapUUWeIVwlXUVyowCOPPLIggM2s52qqqo48MAD6datG8nd/CxrIoINGzZQVVVF9+7dC16ukG6ZQ0ha491JxmjeX9Jl9S2SL75dCiImRURlRFR26pT3TB4za8DWrVvp0KGDE3uGSaJDhw5F/zor5IDq2cCKiFif3knmZyTjeq+V1CXdeBdgXVq/ig+OSd0Vj+1sVjZO7NnXmM+4kOS+CjhZUtv0Lu6DSIZ+nc7OMalHAU+k09OBEZL2k9Qd6AHMLToyMzNrtEL63OdIeoRkjOdqkjGnJ5HcXWaapCtIvgCGp/UXS5pGMv50NXB1RNR3QwQzK5FuY54q6fpW3jK0wTotWrTg+OOP3/F6xIgRjBkzpiTbX7BgAatXr+a8887LO3/u3Llcf/31rF27Fkmcdtpp3HHHHbRt2zZv/ca47777GDx4MIcd1rzuHFjQ2TIRMY5kKNJc20ha8fnqTwAmNC00s0QxCWtl688WVnH8O42Mxmpr06YNCxYsKMu6FyxYwLx58/Im97Vr1zJ8+HCmTJnCKaecQkTw6KOPsmnTppIn9z59+jS75O4rVM2s5N555x2OPfZYli5dCsDIkSP54Q9/CMC//Mu/UFlZSe/evRk3bmeb8cUXX+RjH/sYJ5xwAgMGDOCdd97hpptuYurUqVRUVDB16gdvxHXXXXcxatQoTjnlFCDpl77kkkvo3Lkzb775JhdeeCF9+/bl5JNPZuHChQCMHz+eiRMn7lhHnz59WLlyJStXrqRnz5588YtfpHfv3gwePJgtW7bwyCOPMG/ePC699FIqKirYsmULY8aMoVevXvTt25frr7++rPuxKfaKsWXMrPnasmULFRUVO16PHTuWz3zmM9x5552MHj2aa6+9lrfeeosvfvGLAEyYMIH27dvz/vvvM2jQIBYuXMhxxx3HZz7zGaZOnUr//v3ZuHEjbdu25Zvf/Cbz5s3jzjvv3GW7ixYtYtSoUbuUA4wbN45+/frx+OOP88tf/pLPf/7zDf66WLZsGQ8//DA//OEP+fSnP82jjz7KZZddxp133snEiROprKzkzTff5LHHHuPVV19FEm+//XZjd1vZObmbWZPU1S3ziU98gp/+9KdcffXVvPzyyzvKp02bxqRJk6iurmbNmjW88sorSKJLly70798fgHbt2jUppueff55HH30UgLPOOosNGzbwzjv1d8V17959x5fURz/6UVauXLlLnXbt2tG6dWuuvPJKhg4dyvnnn9+kOMvJ3TJmVhbbt29nyZIltGnThjfffBOAFStWMHHiRGbNmsXChQsZOnQoW7duJSKKPt2vd+/ezJ8/P++8fDchkkTLli3Zvn3nzbNyzx3fb7/9dky3aNGC6urqXdbRsmVL5s6dy8UXX8zjjz/OkCFDiop5d3JyN7OyuO222+jZsycPP/wwl19+Oe+99x4bN25k//3356CDDmLt2rU888wzABx33HGsXr2aF198EYBNmzZRXV3NgQceyKZNm/Ku/5prrmHy5MnMmTNnR9kDDzzAG2+8wcCBA3nwwQcBmD17Nh07dqRdu3Z069aNl156CYCXXnqJFStWNPg+cmPYvHkz77zzDueddx6333572Q4kl4K7ZcwypJBTF0utdp/7kCFDuPzyy7nnnnuYO3cuBx54IAMHDuTb3/42N998M/369aN3794cffTRnHrqqQC0atWKqVOn8pWvfIUtW7bQpk0bZs6cycc//nFuueUWKioqdvTl1+jcuTNTpkzh+uuvZ926deyzzz4MHDiQiy66iPHjx/OFL3yBvn370rZtWyZPngzAxRdfzP33309FRQX9+/fnmGOOafD9jR49mi9/+cu0adOGZ555hmHDhu34tXHbbbeVdmeW0F5xD9XKysrwzTqsLj4Vsm5LliyhZ8+eezoM2w3yfdaS5kdEZb767pYxM8sgJ3czswxycjczyyAndzOzDHJyNzPLICd3M7MM8nnuZlky/qASr6/hU0Zrhvytrq6mZ8+eTJ48ueBRGVeuXMnvfvc7PvvZAk9hzdGtWzfmzZtHx44di162vuU3b97M17/+dWbOnEnr1q3p0KED3/3udznppJMatZ18GhrKuBTccjezJqkZW2bRokW0atWKu+++u6DlqqurWblyJQ899FDR23z//fLdIuLKK6+kffv2LFu2jMWLF3Pffffxt7/9raTbWLBgAU8//XRJ11mbk7uZlczpp5/O8uXLeffdd7n88svp378//fr144knkhu13XfffQwfPpxPfvKTDB48mDFjxvDcc89RUVHBbbfdxn333cc111yzY33nn38+s2fPBuCAAw7gpptu4qSTTuKFF14A4Lvf/S4DBgxgwIABLF++HID169dz8cUX079/f/r3789vf/tbADZs2MDgwYPp168fX/rSl/KOP/Paa68xZ84cvv3tb7PPPkl6PProoxk6NLny99Zbb6VPnz706dOH22+/HUh+ffTp02fHOiZOnMj48eMBOPPMM7nhhhsYMGAAxxxzDM899xz/+Mc/dhnK+Ne//jUVFRVUVFTQr1+/OodcKIa7ZcysJKqrq3nmmWcYMmQIEyZM4KyzzuLee+/l7bffZsCAAZx99tkAvPDCCyxcuJD27dsze/ZsJk6cyJNPPgkkyb8u7777Ln369OGb3/zmjrJ27doxd+5c7r//fq677jqefPJJrr32Wr761a9y2mmnsWrVKs455xyWLFnCzTffzGmnncZNN93EU089xaRJk3bZxuLFi6moqKBFixa7zJs/fz4//vGPmTNnDhHBSSedxBlnnMEhhxzS4H6ZO3cuTz/9NDfffDMzZ87cZSjjT37yk9x1112ceuqpbN68mdatWze4vxvSYHKXdCyQO0r+0cBNwP1peTdgJfDpiHgrXWYscAXwPvCvEfGLJkdqZnul3LFlTj/9dK644go+9rGPMX369B03xti6dSurVq0CkqGA27dvX/R2WrRowcUXX/yBspEjR+54/upXvwrAzJkzeeWVV3bU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\n", "text/plain": [ "
" ] @@ -213,15 +213,13 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Create a differentially private release mechanism\n", "from relm.mechanisms import GeometricMechanism\n", "mechanism = GeometricMechanism(epsilon=0.1, sensitivity=1.0)\n", - "\n", - "# Compute perturbed query response\n", "perturbed_counts = mechanism.release(values=values)" ] }, @@ -235,66 +233,66 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923823200-9238243
110-19386402110-19386383
220-29688699220-29688652
330-39779776330-39779780
440-49621615440-49621613
550-59582583550-59582542
660-69344356660-69344332
770+261266770+261253
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -302,7 +300,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEWCAYAAACdaNcBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAprklEQVR4nO3dfZxVZb338c9XEAEVlQcJRR0sVB7EwQbUVDQxRDExlYK0IDXr3NrRytcRjyfBinPsxFEz7fYmMzEfgDSV48NJoCg9GQiGBCKBQTiBQPgAGJAjv/uPtQY2w56ZvZm9gVl+36/Xfu21r3WttX577Znfvva11rqWIgIzM8uWffZ0AGZmVnpO7mZmGeTkbmaWQU7uZmYZ5ORuZpZBTu5mZhnk5G5Wh6QzJVXv6TjMmsLJ/UNE0sacx1ZJm3JeX7oL65sp6cpG6rSSNFbSEknvSVou6T5JFbv8RgqLba9K0Ok+CEn9y7yd7pImSVoraX26338oqWs5t2t7Hyf3D5GIOKD2AawAPp1T9lCZNvsocAHweeAg4ARgLjCwTNvb60gS8AXgLWBkGbfzMWAWsBLoGxHtgFOB14HT6lmmZbnisT0sIvz4ED6A5cDZ6fQ+wGiSJLAOmAK0T+e1Bh5My98BXgI6A+OAD4DNwEbgrjzbOBvYBBzRQByHAVNJEt9S4Ms58+4Hvpvz+kygus57uB6YD7wLTE7j3T/d7tY0to3pdvoDc4D1wGrgtnpiOhOoBv4V+Fu6nUvTef3SZVvm1L8YmNfAexyQxnNZuh9b5cxrAfxXup1lwDVA1K6f5AvxJ8Aq4K/Ad4EW9WznQeC/G/nca9/bDcCbwM+A/YA7SL4UVqbT+6X1RwEv1FlHAB/L+YzuAaYBG4DfAEft6b9vP8ItdwPgn4ELgTNIkuDbwN3pvJEkCeYIoAPwVWBTRNwEPA9cE0nL/5o86z0bmB0RbzSw7UdIks1hwCXAv0sqplX/WWAw0A3oA4yKiPeAc4GVsf2XyUrgB8APImnRfpTkS6w+HwE6AoeT7IMJko6NiJdIEvSncupeRpIk6zMS+G+SLx+A83PmfTmNtRI4keRzyDURqAE+BvQFBgH1dYWdDTzWQBy1PgK0B44CrgJuAk5OYziB5Evw3wpYT61Lge+Q7K95QLl+BVoRnNwN4CvATRFRHRFbgLHAJelP9vdJkvrHIuKDiJgbEesLXG8HkhZnXpKOIOkuuCEiNkfEPOBeki6MQt0ZESsj4i2SBFrZQN33gY9J6hgRGyPi942s+1sRsSUifgM8TfJFAknCvSx9D+2Bc4CH861AUltgGPBwRLxP0k2V2zXzWZIvnOqIeBu4NWfZziSJ/7qIeC8i1gC3A8PribcjSWu8dvlrJL2THlP5cU69rcCY9L1tIknO346INRGxFriF4j6DpyPit+nfzk3AKelna3uQk7tB0oJ7PE0E7wCLSLpcOpO0SH8JTJK0UtJ/Stq3wPWuA7o0MP8w4K2I2JBT9heS1nKh3syZ/jtwQAN1rwCOAV6T9JKk8xuo+3b6CyA3rsPS6QeBT0s6gCQ5Px8R9X2JfYak5f1M+voh4FxJndLXhwG5v2xyp48C9gVW5Xw2/w84tJ5t7bC/I+KuiDiYpJsl9zNbGxGbc14flr6/fO+1ENtijoiNJF1sxSxvZeDkbpD8c54bEQfnPFpHxF8j4v2IuCUiegKfIOlS+GK6XGNDik4H+jdwpsZKoL2kA3PKjiTpWwZ4D2ibM+8jRbynnWKLiCURMYIkOX4PeFTS/vUsf0ideUem8RIRfwVeJEncX6DxLpkDgBWS3gR+TpJoR6TzVwG5+ye3xfsGsAXomPO5tIuIXvVsawZwUQOx1Kq7b1aSfJHU2vZeqfMZSMr3GRyRM/8Aki6flXnq2W7k5G6QHBAbJ+koAEmdJA1Npz8p6XhJLUgORL5P0qqH5MDi0fWtNCKmkxxoe1zSxyW1lHSgpK9Kujzti/8d8B+SWkvqQ9K6ru2znQecJ6l9mlSuK+I9rQY6SDqotkDSZZI6RcRWkoPD5LyXfG5JT+U8neRL7ec58x4A/gU4Hng838KSDic5K+h8ku6iSpI+7e+xvWtmCnCtpMMlHUxyoBOA9NfAc8B/SWonaR9JH5V0Rj3xjgVOl3Rbum0kdQR6NPAeITnu8W/p594RuJnk1wnAK0AvSZWSWqfbqOs8SadJakXS9z6rkeMsths4uRskBxqnAs9J2gD8HjgpnfcRkn7i9STdNb9h+z/+D0j65t+WdGc9676EpEtiMskZLQuAKpJWPSQt2AqSlt7jJH3B09J5PyNJLstJklztAclGRcRrJEnrz2mXxmEkB14XStqYxj68TvdErjdJDiyvJPmy+Wq6zlqPk3Zn1em+yfUFkrNonouIN2sfwJ1AH0m9gR+n720+8AeSfVXD9i+dLwKtgFfTeB6lnq6uiPgTyYHRrsAr6Wf5v+l7+FY9MUJyBs6cNIY/Ai+nZbXr/DbJ57UEeCHP8g8DY0i6Yz5O0odve5gifLMOs10h6XXgK+kvlFKt81zgnog4qtHKewFJ95OcnlrM2TW2G7jlbrYLJF1M0nf9qyaup42k89Iuq8NJWsB5u3nMiuGr08yKJGkm0BP4Qtp/36TVkZx6OJnkQqenSfq8zZrE3TJmZhnkbhkzswzaK7plOnbsGBUVFXs6DDOzZmXu3Ll/i4hO+ebtFcm9oqKCOXPm7OkwzMyaFUl/qW9eQd0ykr4uaaGkBZIeSS84aS9pWjpe9DRJh+TUv1HSUkmLJZ1TijdhZmaFazS5p6dn/TNQFRG9SYYoHU4yROyMiOhOctnz6LR+z3R+L5KLRn6UXt1oZma7SaEHVFsCbdJRAtuSXPE2lGR0PNLnC9PpocCkdMS5ZSRjdJf17jNmZrajRvvcI+KvksaT3LlnE/BcRDwnqXPtSHgRsUpS7Uh1h5Ncvl6rmjyj/Em6imQsaY488simvQuzD6n333+f6upqNm+ubxQFy4LWrVvTtWtX9t230AFZC0juaV/6UJKbIbwD/FzSZQ0tkqcs3wh9E4AJAFVVVT7Z3mwXVFdXc+CBB1JRUUFyNz/Lmohg3bp1VFdX061bt4KXK6Rb5mxgWUSsTW828AuSoV9XS+oCkD6vSetXs+OwpV3x8J9mZbF582Y6dOjgxJ5hkujQoUPRv84KSe4rgJMltU1v9DuQZHTAqWwftnQk8GQ6PRUYLmk/Sd2A7sDsoqIys4I5sWffrnzGhfS5z5L0KMkwoDUkw5JOILkBwRRJV5B8AQxL6y+UNIVkiNIa4OqIaGjMbDMzK7GCLmKKiDEko9Xl2kLSis9XfxwwrmmhmVmxKkY/XdL1Lb91SKN1WrRowfHHH7/t9fDhwxk9enRJtj9v3jxWrlzJeeedl3f+7Nmzuf7661m9ejWSOO2007jzzjtp27Zt3vq74v7772fQoEEcdljzunPgXnGFqllDiklYhSQjK602bdowb968sqx73rx5zJkzJ29yX716NcOGDWPSpEmccsopRASPPfYYGzZsKHly7927d7NL7h44zLJl7EGFPays3n33XY499lgWL14MwIgRI/jxj38MwD/90z9RVVVFr169GDNme4fASy+9xCc+8QlOOOEE+vfvz7vvvsvNN9/M5MmTqaysZPLkHW/EdffddzNy5EhOOeUUIOmXvuSSS+jcuTNvvfUWF154IX369OHkk09m/vz5AIwdO5bx48dvW0fv3r1Zvnw5y5cvp0ePHnz5y1+mV69eDBo0iE2bNvHoo48yZ84cLr30UiorK9m0aROjR4+mZ8+e9OnTh+uvv76s+7Ep3HI3sybZtGkTlZWV217feOONfO5zn+Ouu+5i1KhRXHvttbz99tt8+ctfBmDcuHG0b9+eDz74gIEDBzJ//nyOO+44Pve5zzF58mT69evH+vXradu2Ld/+9reZM2cOd911107bXbBgASNHjtypHGDMmDH07duXJ554gl/96ld88YtfbPTXxZIlS3jkkUf48Y9/zGc/+1kee+wxLrvsMu666y7Gjx9PVVUVb731Fo8//jivvfYaknjnnXd2dbeVnZO7mTVJfd0yn/rUp/j5z3/O1VdfzSuvvLKtfMqUKUyYMIGamhpWrVrFq6++iiS6dOlCv379AGjXrl2TYnrhhRd47LHHADjrrLNYt24d7777boPLdOvWbduX1Mc//nGWL1++U5127drRunVrrrzySoYMGcL555/fpDjLyd0yZlYWW7duZdGiRbRp04a33noLgGXLljF+/HhmzJjB/PnzGTJkCJs3byYiij7dr1evXsydOzfvvHw3IZJEy5Yt2bp1+82zcs8d32+//bZNt2jRgpqamp3W0bJlS2bPns3FF1/ME088weDBg4uKeXdycjezsrj99tvp0aMHjzzyCJdffjnvv/8+69evZ//99+eggw5i9erVPPvsswAcd9xxrFy5kpdeegmADRs2UFNTw4EHHsiGDRvyrv+aa65h4sSJzJo1a1vZgw8+yJtvvsmAAQN46KGHAJg5cyYdO3akXbt2VFRU8PLLLwPw8ssvs2zZskbfR24MGzdu5N133+W8887jjjvuKNuB5FJwt4xZhuyJs4Xq9rkPHjyYyy+/nHvvvZfZs2dz4IEHMmDAAL773e9yyy230LdvX3r16sXRRx/NqaeeCkCrVq2YPHkyX/va19i0aRNt2rRh+vTpfPKTn+TWW2+lsrJyW19+rc6dOzNp0iSuv/561qxZwz777MOAAQO46KKLGDt2LF/60pfo06cPbdu2ZeLEZIzDiy++mAceeIDKykr69evHMccc0+j7GzVqFF/96ldp06YNzz77LEOHDt32a+P2228v7c4sob3iHqpVVVXhm3VYfYo6FbL15wurOLbh/tfmYtGiRfTo0WNPh2G7Qb7PWtLciKjKV9/dMmZmGeTkbmaWQU7uZmYZ5ORuZpZBTu5mZhnk5G5mlkE+z90sS0o9KFoBp4zWDvlbU1NDjx49mDhxYsGjMi5fvpzf/e53fP7zBZ7CmqOiooI5c+bQsWPHopdtaPmNGzfyzW9+k+nTp9O6dWs6dOjA97//fU466aRd2k4+jQ1lXApuuZtZk9SOLbNgwQJatWrFPffcU9ByNTU1LF++nIcffrjobX7wQfnu/3PllVfSvn17lixZwsKFC7n//vv529/+VtJtzJs3j2eeeaak66zLyd3MSub0009n6dKlvPfee1x++eX069ePvn378uSTyV0477//foYNG8anP/1pBg0axOjRo3n++eeprKzk9ttv5/777+eaa67Ztr7zzz+fmTNnAnDAAQdw8803c9JJJ/Hiiy8C8P3vf5/+/fvTv39/li5dCsDatWu5+OKL6devH/369eN///d/AVi3bh2DBg2ib9++fOUrX8k7/szrr7/OrFmz+O53v8s++yTp8eijj2bIkOTK39tuu43evXvTu3dv7rjjDiD59dG7d+9t6xg/fjxjx44F4Mwzz+SGG26gf//+HHPMMTz//PP84x//2Gko49/85jdUVlZSWVlJ37596x1yoRjuljGzkqipqeHZZ59l8ODBjBs3jrPOOov77ruPd955h/79+3P22WcD8OKLLzJ//nzat2/PzJkzGT9+PE899RSQJP/6vPfee/Tu3Ztvf/vb28ratWvH7NmzeeCBB7juuut46qmnuPbaa/n617/OaaedxooVKzjnnHNYtGgRt9xyC6eddho333wzTz/9NBMmTNhpGwsXLqSyspIWLVrsNG/u3Ln89Kc/ZdasWUQEJ510EmeccQaHHHJIo/tl9uzZPPPMM9xyyy1Mnz59p6GMP/3pT3P33Xdz6qmnsnHjRlq3bt3o/m5Mo8ld0rFA7ij5RwM3Aw+k5RXAcuCzEfF2usyNwBXAB8A/R8Qvmxypme2VcseWOf3007niiiv4xCc+wdSpU7fdGGPz5s2sWLECSIYCbt++fdHbadGiBRdffPEOZSNGjNj2/PWvfx2A6dOn8+qrr26r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\n", + "image/png": "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igr69evHhAk7OwSef/55Pvaxj3HMMccwePBg3nrrLa6//nqmT59OeXk506e/+0Zct99+O2PHjuWEE04Akn7pCy64gO7du/P6669z7rnnMmDAAI4//ngWLlwIwMSJE5k8efKOdfTv35+qqiqqqqro06cPX/ziF+nXrx/Dhg1j8+bNPPjgg1RWVnLhhRdSXl7O5s2bGT9+PH379mXAgAFcffXVJd2PLeGWu5m1yObNmykvL9/x+tprr+Uzn/kMt912G+PGjePKK6/kjTfe4Itf/CIAkyZNonPnzmzbto2hQ4eycOFCjjrqKD7zmc8wffp0Bg0axIYNG+jYsSPf/va3qays5Lbbbttlu4sWLWLs2LG7lANMmDCBgQMH8sgjj/DrX/+az3/+843+uli2bBkPPPAAP/7xj/n0pz/NQw89xEUXXcRtt93G5MmTqaio4PXXX+fhhx/m5ZdfRhJvvvlmc3dbyTm5m1mL1Nct84lPfIKf//znXH755bz44os7ymfMmMGUKVOoqalh9erVvPTSS0iiR48eDBo0CIBOnTq1KKZnn32Whx56CIDTTjuN9evX89ZbDXfF9erVa8eX1Ec/+lGqqqp2qdOpUyfat2/PpZdeyogRIzj77LNbFGcpuVvGzEpi+/btLFmyhA4dOvD6668DsGLFCiZPnszs2bNZuHAhI0aMYMuWLUREk0/369evH/Pnz887L99NiCTRtm1btm/fefOs3HPH99prrx3Tbdq0oaamZpd1tG3blnnz5nH++efzyCOPMHz48CbFvDs5uZtZSdx888306dOHBx54gIsvvph33nmHDRs2sPfee7PffvuxZs0annzySQCOOuooVq1axfPPPw/Axo0bqampYd9992Xjxo1513/FFVcwdepU5s6du6Ps3nvv5bXXXmPIkCHcd999AMyZM4euXbvSqVMnysrKeOGFFwB44YUXWLFiRaPvIzeGTZs28dZbb3HWWWdxyy23lOxAcjG4W8YsQwo5dbHY6va5Dx8+nIsvvpg777yTefPmse+++zJkyBC++93vcsMNNzBw4ED69evH4YcfzoknnghAu3btmD59Ol/96lfZvHkzHTp0YNasWXz84x/nxhtvpLy8fEdffq3u3bszbdo0rr76atauXcsee+zBkCFDOO+885g4cSJf+MIXGDBgAB07dmTq1GSMw/PPP5977rmH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\n", "text/plain": [ "
" ] @@ -344,7 +342,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -360,8 +358,7 @@ " utility_function=utility_function,\n", " sensitivity=1.0,\n", " output_range=output_range)\n", - "\n", - " # Compute perturbed query responses\n", + " \n", " perturbed_counts[i] = mechanism.release(values=value)" ] }, @@ -374,66 +371,66 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923823800-9238253
110-19386354110-19386409
220-29688692220-29688672
330-39779790330-39779773
440-49621620440-49621569
550-59582587550-59582591
660-69344321660-69344312
770+261238770+261359
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -441,7 +438,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEWCAYAAACdaNcBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAApoUlEQVR4nO3de7xUZd338c9XEAEVk4OEYoKJykHc2AY1FU0MUVTMQ0FakKfq0dLKV8LtnWDFnd1xq5n2+KCpWB4gTeX2UApFaRm4USQOEpiEOxB2eAAMyC2/54+1Noyb2XvP7D2Dsvy+X695zZprrrXWb2b2/s0111rruhQRmJlZtuzyfgdgZmal5+RuZpZBTu5mZhnk5G5mlkFO7mZmGeTkbmaWQU7uZvVIOkFS9fsdh1lLOLl/iEjakHPbImljzuPzmrG9WZIuaqJOG0kTJC2V9Lak5ZLukNSj2S+ksNg+UAk6fQ9C0qAy76eXpPsl1Uhal77vP5HUvZz7tQ8eJ/cPkYjYo+4GrABOzym7p0y7fQA4A/g8sBdwODAXGFKm/X3gSBLwBeB1YHQZ93MQMBtYCQyIiA7AMcDLwLENrNO6XPHY+ywifPsQ3oDlwEnp8i7AWJIksBaYBnRMn2sL/CItfxN4DugKTATeBTYBG4Cb8+zjJGAjsH8jcewLTCdJfMuAi3Oeuwv4fs7jE4Dqeq/hSmA+8BYwNY1393S/W9LYNqT7GQRUAeuA1cD1DcR0AlAN/Afwz3Q/56XPDUzXbZ1T/2xgXiOvcXAaz/np+9gm57lWwP+k+3kFuAyIuu2TfCH+DFgF/AP4PtCqgf38AvjfJj73utd2FfAa8HNgN+BGki+Flenybmn9McAz9bYRwEE5n9GtwFPAeuD3wAHv99+3b+GWuwHwdeBM4HiSJPgGcEv63GiSBLM/0An4CrAxIq4GngYui6Tlf1me7Z4EzImIVxvZ930kyWZf4BzgvyQV06r/LDAM6An0B8ZExNvAKcDK2PbLZCXwY+DHkbRoP07yJdaQjwKdgf1I3oPJkg6JiOdIEvSnc+qeT5IkGzIa+F+SLx+A03KeuziNtQI4guRzyDUFqAUOAgYAQ4GGusJOAh5sJI46HwU6AgcAlwBXA0elMRxO8iX4nwVsp855wPdI3q95QLl+BVoRnNwN4MvA1RFRHRGbgQnAOelP9ndIkvpBEfFuRMyNiHUFbrcTSYszL0n7k3QXXBURmyJiHnA7SRdGoW6KiJUR8TpJAq1opO47wEGSOkfEhoj4cxPb/k5EbI6I3wOPkXyRQJJwz09fQ0fgZODefBuQ1B44F7g3It4h6abK7Zr5LMkXTnVEvAFcl7NuV5LEf0VEvB0Ra4AbgJENxNuZpDVet/5lkt5Mj6ncllNvCzA+fW0bSZLzdyNiTUTUANdS3GfwWET8If3buRo4Ov1s7X3k5G6QtOAeShPBm8Biki6XriQt0t8A90taKem/Je1a4HbXAt0aeX5f4PWIWJ9T9neS1nKhXstZ/hewRyN1LwQOBl6S9Jyk0xqp+0b6CyA3rn3T5V8Ap0vagyQ5Px0RDX2JfYak5f14+vge4BRJXdLH+wK5v2xylw8AdgVW5Xw2/w/Yp4F9vef9joibI+IjJN0suZ9ZTURsynm8b/r68r3WQmyNOSI2kHSxFbO+lYGTu0Hyz3lKRHwk59Y2Iv4REe9ExLUR0Qf4JEmXwhfT9ZoaUnQGMKiRMzVWAh0l7ZlT9jGSvmWAt4H2Oc99tIjXtF1sEbE0IkaRJMcfAg9I2r2B9feu99zH0niJiH8Az5Ik7i/QdJfMHsAKSa8BvyRJtKPS51cBue9Pbov3VWAz0Dnnc+kQEX0b2NdM4KxGYqlT/71ZSfJFUmfra6XeZyAp32ewf87ze5B0+azMU892ICd3g+SA2ERJBwBI6iJpRLr8KUmHSWpFciDyHZJWPSQHFg9saKMRMYPkQNtDkj4hqbWkPSV9RdIFaV/8n4AfSGorqT9J67quz3YecKqkjmlSuaKI17Qa6CRpr7oCSedL6hIRW0gODpPzWvK5Nj2V8ziSL7Vf5jx3N/Bt4DDgoXwrS9qP5Kyg00i6iypI+rR/yLaumWnA5ZL2k/QRkgOdAKS/Bp4E/kdSB0m7SPq4pOMbiHcCcJyk69N9I6kz0LuR1wjJcY//TD/3zsA1JL9OAF4E+kqqkNQ23Ud9p0o6VlIbkr732U0cZ7EdwMndIDnQOB14UtJ64M/AkelzHyXpJ15H0l3ze7b94/+YpG/+DUk3NbDtc0i6JKaSnNGyAKgkadVD0oLtQdLSe4ikL/ip9LmfkySX5SRJru6AZJMi4iWSpPW3tEtjX5IDrwslbUhjH1mveyLXayQHlleSfNl8Jd1mnYdIu7Pqdd/k+gLJWTRPRsRrdTfgJqC/pH7Abelrmw+8QPJe1bLtS+eLQBtgURrPAzTQ1RURfyU5MNodeDH9LP+YvobvNBAjJGfgVKUx/AV4Pi2r2+Z3ST6vpcAzeda/FxhP0h3zCZI+fHufKcKTdZg1h6SXgS+nv1BKtc1TgFsj4oAmK38ASLqL5PTUYs6usR3ALXezZpB0Nknf9W9buJ12kk5Nu6z2I2kB5+3mMSuGr04zK5KkWUAf4Atp/32LNkdy6uFUkgudHiPp8zZrEXfLmJllkLtlzMwy6APRLdO5c+fo0aPH+x2GmdlOZe7cuf+MiC75nvtAJPcePXpQVVX1fodhZrZTkfT3hp5zt4yZWQY5uZuZZZCTu5lZBhXU5y7pGyRjSAfJ5clfIhlMaCrJpePLgc+mQ5YiaRzJGCHvAl+PiN+UOnAzg3feeYfq6mo2bWpoFAXLgrZt29K9e3d23bXQAVkLSO7pVXNfB/pExEZJ00jGk+4DzIyI6ySNJZnJ5ypJfdLn+5IM+zlD0sER0dgATWbWDNXV1ey555706NGDZDY/y5qIYO3atVRXV9OzZ8+C1yu0W6Y10C6dvKE9yUBEI0gmLSC9PzNdHgHcn04E8ArJ1GllnRTY7MNq06ZNdOrUyYk9wyTRqVOnon+dNZnc07GrJ5FMqLwKeCsingS61k1QkN7XTSCwH++dcKCaPJMvSLpEUpWkqpqamqKCNrNtnNizrzmfcZPJXdLeJK3xniTdLLtLOr+xVfKU5Zs4YXJEVEZEZZcuec/BNzOzZirkgOpJwCvp3IpI+hXJjDyrJXWLiFWSugFr0vrVvHc2me54VhazHaLH2MdKur3l1w1vsk6rVq047LDDtj4eOXIkY8eOLcn+582bx8qVKzn11FPzPj9nzhyuvPJKVq9ejSSOPfZYbrrpJtq3b5+3fnPcddddDB06lH333blmDiwkua8Ajkon+t1IMrNMFcn0W6NJJvQdDTyS1p8O3CvpepKWfi9gTonjNstvwl5N1wGY8FZ54/gQadeuHfPmzSvLtufNm0dVVVXe5L569WrOPfdc7r//fo4++mgiggcffJD169eXPLn369dvp0vuhfS5zyaZ/eV5ktMgdwEmkyT1T0taCnw6fUxELCSZOmwR8GvgUp8pY/bh8tZbb3HIIYewZMkSAEaNGsVtt90GwFe/+lUqKyvp27cv48eP37rOc889xyc/+UkOP/xwBg0axFtvvcU111zD1KlTqaioYOrU907EdcsttzB69GiOPvpoIOmXPuecc+jatSuvv/46Z555Jv379+eoo45i/vz5AEyYMIFJkyZt3Ua/fv1Yvnw5y5cvp3fv3lx88cX07duXoUOHsnHjRh544AGqqqo477zzqKioYOPGjYwdO5Y+ffrQv39/rrzyyrK+jy1R0HnuETGeZBKBXJtJWvH56k8EJrYsNDPbGWzcuJGKioqtj8eNG8fnPvc5br75ZsaMGcPll1/OG2+8wcUXXwzAxIkT6dixI++++y5Dhgxh/vz5HHrooXzuc59j6tSpDBw4kHXr1tG+fXu++93vUlVVxc0337zdfhcsWMDo0aO3KwcYP348AwYM4OGHH+a3v/0tX/ziF5v8dbF06VLuu+8+brvtNj772c/y4IMPcv7553PzzTczadIkKisref3113nooYd46aWXkMSbb77Z3Let7D4QA4eZNaaYfuTlbcsYiOXVULfMpz/9aX75y19y6aWX8uKLL24tnzZtGpMnT6a2tpZVq1axaNEiJNGtWzcGDhwIQIcOHVoU0zPPPMODDz4IwIknnsjatWt5663Gu+J69uy59UvqE5/4BMuXL9+uTocOHWjbti0XXXQRw4cP57TTTmtRnOXk4QfMrCy2bNnC4sWLadeuHa+//joAr7zyCpMmTWLmzJnMnz+f4cOHs2nTJiKi6NP9+vbty9y5c/M+l28SIkm0bt2aLVu2TZ6Ve+74brvttnW5VatW1NbWbreN1q1bM2fOHM4++2wefvhhhg0bVlTMO5KTu5mVxQ033EDv3r257777uOCCC3jnnXdYt24du+++O3vttRerV6/miSeeAODQQw9l5cqVPPfccwCsX7+e2tpa9txzT9avX593+5dddhlTpkxh9uzZW8t+8Ytf8NprrzF48GDuueceAGbNmkXnzp3p0KEDPXr04Pnnnwfg+eef55VXXmnydeTGsGHDBt566y1OPfVUbrzxxrIdSC4Fd8uYZUghpy6WWv0+92HDhnHBBRdw++23M2fOHPbcc08GDx7M97//fa699loGDBhA3759OfDAAznmmGMAaNOmDVOnTuVrX/saGzdupF27dsyYMYNPfepTXHfddVRUVGzty6/TtWtX7r//fq688krWrFnDLrvswuDBgznrrLOYMGECX/rSl+jfvz/t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\n", + "image/png": "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nowevaVD4MUXX+RjH/sYxx13HP369eOdd97hxhtvZNKkSVRVVTFp0tY34rrzzjsZMWIEJ510EpD0S1900UV06tSJN998k/PPP5/evXtz4oknMmfOHADGjBnDuHHjNq+jV69eLFmyhCVLltC9e3e++MUv0rNnTwYOHMj69et5+OGHqamp4eKLL6aqqor169czatQoevToQe/evbn22mvLuh93hFvuZrZD1q9fT1VV1ebX119/PZ/5zGe44447GDlyJFdffTVvvfUWX/ziFwEYO3Ys7dq14/3332fAgAHMmTOHY445hs985jNMmjSJvn37smbNGtq0acO3v/1tampquOOOO7bZ7ty5cxkxYsQ25QCjR4+mT58+PPbYY/z617/m85//fLO/LhYuXMhDDz3Ej3/8Yz796U/zyCOPcMkll3DHHXcwbtw4qqurefPNN3n00Ud59dVXkcTbb7+9vbut7JzczWyHNNYt84lPfIKf//znXHnllbz88subyydPnsz48eOpq6tj+fLlvPLKK0iic+fO9O3bF4C2bdvuUEzPP/88jzzyCABnnHEGq1ev5p133mlyma5du27+kvroRz/KkiVLtqnTtm1bKioquPzyyxk8eDDnnnvuDsVZTu6WMbOy2LRpE/Pnz6d169a8+eabACxevJhx48Yxbdo05syZw+DBg9mwYQMRUfTpfj179mTWrFl55+W7CZEkWrZsyaZNW26elXvu+D777LN5ukWLFtTV1W2zjpYtWzJz5kwuvPBCHnvsMQYNGlRUzDuTk7uZlcWtt95K9+7deeihh7j00kt57733WLNmDfvuuy8HHHAAK1as4OmnnwbgmGOOYdmyZbz44osArF27lrq6Ovbff3/Wrl2bd/1XXXUVEyZMYMaMGZvL7r//ft544w369+/PAw88AMD06dPp0KEDbdu2pbKykpdeegmAl156icWLFzf7PnJjWLduHe+88w7nnHMOt912W9kOJJeCu2XMMmRXnC3UsM990KBBXHrppdx9993MnDmT/fffn/79+/Pd736Xm266iT59+tCzZ0+OPPJITj75ZABatWrFpEmT+OpXv8r69etp3bo1U6dO5eMf/zg333wzVVVVm/vy63Xq1ImJEydy7bXXsnLlSvbaay/69+/PBRdcwJgxY/jCF75A7969adOmDRMmJGMcXnjhhdx3331UVVXRt29fjjrqqGbf38iRI/nyl79M69atefrppxkyZMjmXxu33npraXdmCe0W91Ctrq4O36zDGlPUqZAVny2s4pim+1/3FPPnz6d79+67OgzbCfJ91pJmRUR1vvruljEzyyAndzOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswzyee5mWVLqQdEKOGW0fsjfuro6unfvzoQJEwoelXHJkiX84Q9/4LOfLfAU1hyVlZXU1NTQoUOHopdtavl169bxzW9+k6lTp1JRUUH79u35/ve/zwknnLBd28mnuaGMS8EtdzPbIfVjy8ydO5dWrVpx1113FbRcXV0dS5Ys4cEHHyx6m++/X777/1x++eW0a9eOhQsXMm/ePO69917+8Y9/lHQbs2fP5qmnnirpOhtycjezkjn11FNZtGgR7777Lpdeeil9+/alT58+PP54chfOe++9l6FDh/LJT36SgQMHMmrUKJ577jmqqqq49dZbuffee7nqqqs2r+/cc89l+vTpAOy3337ceOONnHDCCbzwwgsAfP/736dfv37069ePRYsWAbBq1SouvPBC+vbtS9++ffn9738PwOrVqxk4cCB9+vThS1/6Ut7xZ1577TVmzJjBd7/7XfbaK0mPRx55JIMHJ1f+3nLLLfTq1YtevXpx2223Acmvj169em1ex7hx4xgzZgwAp59+Otdddx39+vXjqKOO4rnnnuNf//rXNkMZ//a3v6Wqqoqqqir69OnT6JALxXC3jJmVRF1dHU8//TSDBg1i7NixnHHGGdxzzz28/fbb9OvXjzPPPBOAF154gTlz5tCuXTumT5/OuHHjeOKJJ4Ak+Tfm3XffpVevXnz729/eXNa2bVtmzpzJfffdxzXXXMMTTzzB1Vdfzde//nVOOeUUli5dyllnncX8+fO56aabOOWUU7jxxht58sknGT9+/DbbmDdvHlVVVbRo0WKbebNmzeKnP/0pM2bMICI44YQTOO200zjooIOa3S8zZ87kqaee4qabbmLq1KnbDGX8yU9+kjvvvJOTTz6ZdevWUVFR0ez+bk6zyV3S0UDuKPlHAjcC96XllcAS4NMR8Va6zPXAZcD7wNci4lc7HKmZ7ZZyx5Y59dRTueyyy/jYxz7GlClTNt8YY8OGDSxduhRIhgJu165d0dtp0aIFF1544VZlw4cP3/z89a9/HYCpU6fyyiuvbK6zZs0a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\n", "text/plain": [ "
" ] @@ -484,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -525,7 +522,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -544,7 +541,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -566,7 +563,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -580,16 +577,16 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 19, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -630,7 +627,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -648,7 +645,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -680,114 +677,114 @@ " \n", " \n", " \n", - " 0\n", + " Trial 0\n", + " 99\n", " 105\n", " 107\n", " 108\n", - " 109\n", " \n", " \n", - " 1\n", + " Trial 1\n", + " 101\n", " 102\n", " 105\n", " 106\n", - " 108\n", " \n", " \n", - " 2\n", - " 99\n", + " Trial 2\n", + " 97\n", + " 104\n", " 105\n", " 106\n", - " 108\n", " \n", " \n", - " 3\n", + " Trial 3\n", " 105\n", " 106\n", + " 107\n", " 108\n", - " 109\n", " \n", " \n", - " 4\n", - " 90\n", - " 99\n", - " 102\n", - " 105\n", - " \n", - " \n", - " 5\n", - " 105\n", + " Trial 4\n", " 106\n", - " 107\n", " 108\n", + " 109\n", + " 110\n", " \n", " \n", - " 6\n", - " 99\n", + " Trial 5\n", " 101\n", - " 102\n", " 105\n", + " 109\n", + " 110\n", " \n", " \n", - " 7\n", + " Trial 6\n", " 99\n", " 100\n", - " 101\n", " 102\n", + " 105\n", " \n", " \n", - " 8\n", - " 98\n", - " 101\n", + " Trial 7\n", " 105\n", " 106\n", + " 108\n", + " 109\n", + " \n", + " \n", + " Trial 8\n", + " 94\n", + " 101\n", + " 102\n", + " 105\n", " \n", " \n", - " 9\n", + " Trial 9\n", " 105\n", " 108\n", " 109\n", - " 110\n", + " 111\n", " \n", " \n", - " 10\n", - " 78\n", - " 82\n", - " 100\n", - " 101\n", + " Trial 10\n", + " 102\n", + " 105\n", + " 108\n", + " 109\n", " \n", " \n", - " 11\n", - " 97\n", + " Trial 11\n", " 99\n", - " 101\n", " 102\n", + " 106\n", + " 107\n", " \n", " \n", - " 12\n", + " Trial 12\n", + " 98\n", " 99\n", " 101\n", " 102\n", - " 105\n", " \n", " \n", - " 13\n", - " 99\n", - " 100\n", + " Trial 13\n", + " 96\n", + " 101\n", " 105\n", " 106\n", " \n", " \n", - " 14\n", - " 101\n", + " Trial 14\n", " 102\n", " 105\n", " 106\n", + " 107\n", " \n", " \n", - " 15\n", + " Trial 15\n", " 105\n", - " 109\n", + " 108\n", " 111\n", " 113\n", " \n", @@ -796,23 +793,23 @@ "" ], "text/plain": [ - " Hit 1 Hit 2 Hit 3 Hit 4\n", - "0 105 107 108 109\n", - "1 102 105 106 108\n", - "2 99 105 106 108\n", - "3 105 106 108 109\n", - "4 90 99 102 105\n", - "5 105 106 107 108\n", - "6 99 101 102 105\n", - "7 99 100 101 102\n", - "8 98 101 105 106\n", - "9 105 108 109 110\n", - "10 78 82 100 101\n", - "11 97 99 101 102\n", - "12 99 101 102 105\n", - "13 99 100 105 106\n", - "14 101 102 105 106\n", - "15 105 109 111 113" + " Hit 1 Hit 2 Hit 3 Hit 4\n", + "Trial 0 99 105 107 108\n", + "Trial 1 101 102 105 106\n", + "Trial 2 97 104 105 106\n", + "Trial 3 105 106 107 108\n", + "Trial 4 106 108 109 110\n", + "Trial 5 101 105 109 110\n", + "Trial 6 99 100 102 105\n", + "Trial 7 105 106 108 109\n", + "Trial 8 94 101 102 105\n", + "Trial 9 105 108 109 111\n", + "Trial 10 102 105 108 109\n", + "Trial 11 99 102 106 107\n", + "Trial 12 98 99 101 102\n", + "Trial 13 96 101 105 106\n", + "Trial 14 102 105 106 107\n", + "Trial 15 105 108 111 113" ] }, "metadata": {}, @@ -828,7 +825,9 @@ " mechanism = SparseIndicator(epsilon=1.0, sensitivity=1.0, threshold=threshold, cutoff=cutoff)\n", " indices[i] = mechanism.release(values)\n", " \n", - "df = pd.DataFrame(indices, columns=[\"Hit %i\" % (j+1) for j in range(cutoff)])\n", + "df = pd.DataFrame(indices,\n", + " columns=[\"Hit %i\" % (j+1) for j in range(cutoff)],\n", + " index=[\"Trial %i\" % i for i in range(TRIALS)])\n", "display(df)" ] }, @@ -849,7 +848,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -862,13 +861,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Visualising the Results\n", + "#### Visualising the Results\n", "Notice that in these experiemnts we have set `epsilon=4.0`. This is a larger value than we use in the other sparse mechanisms. Because the `SparseNumeric` mechanism releases more information about the underlying exact query responses than does `SparseIndices`, for example, it consumes the available privacy budget more quickly. To achieve comparable utility with respect the the indices returned by the two mechanisms, we therefore need to a larger value for `epsilon`." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -902,171 +901,171 @@ " \n", " \n", " \n", - " 0\n", + " Trial 0\n", + " 101\n", + " 96.879770\n", " 105\n", - " 119.910940\n", - " 106\n", - " 108.072849\n", - " 108\n", - " 117.503564\n", + " 113.851512\n", + " 107\n", + " 99.414630\n", " \n", " \n", - " 1\n", + " Trial 1\n", " 105\n", - " 115.307708\n", + " 121.425789\n", + " 106\n", + " 102.608127\n", " 108\n", - " 117.121047\n", - " 109\n", - " 127.881792\n", + " 118.983717\n", " \n", " \n", - " 2\n", - " 102\n", - " 92.038135\n", + " Trial 2\n", " 105\n", - " 116.128564\n", + " 117.123712\n", " 106\n", - " 101.611371\n", + " 103.991304\n", + " 107\n", + " 101.750900\n", " \n", " \n", - " 3\n", + " Trial 3\n", " 105\n", - " 117.610280\n", + " 114.364158\n", " 106\n", - " 102.272893\n", - " 107\n", - " 100.720009\n", + " 105.542748\n", + " 108\n", + " 110.053167\n", " \n", " \n", - " 4\n", + " Trial 4\n", + " 91\n", + " 67.352507\n", " 105\n", - " 116.753340\n", + " 117.092939\n", " 106\n", - " 104.331020\n", - " 107\n", - " 101.926183\n", + " 97.401881\n", " \n", " \n", - " 5\n", + " Trial 5\n", + " 99\n", + " 89.696951\n", " 105\n", - " 118.389840\n", - " 107\n", - " 105.192731\n", - " 108\n", - " 117.567172\n", + " 116.939303\n", + " 106\n", + " 103.345784\n", " \n", " \n", - " 6\n", + " Trial 6\n", " 105\n", - " 112.539023\n", + " 119.751585\n", " 106\n", - " 103.449801\n", - " 107\n", - " 100.833485\n", + " 103.699765\n", + " 108\n", + " 117.385299\n", " \n", " \n", - " 7\n", + " Trial 7\n", " 101\n", - " 96.753215\n", + " 92.571017\n", + " 102\n", + " 92.378663\n", " 105\n", - " 116.695646\n", - " 106\n", - " 104.575352\n", + " 122.396314\n", " \n", " \n", - " 8\n", + " Trial 8\n", " 105\n", - " 117.673095\n", + " 113.760323\n", " 106\n", - " 104.861882\n", + " 105.355705\n", " 108\n", - " 118.395198\n", + " 120.389826\n", " \n", " \n", - " 9\n", + " Trial 9\n", + " 99\n", + " 92.460085\n", + " 101\n", + " 94.759696\n", " 105\n", - " 118.362381\n", - " 106\n", - " 103.939418\n", - " 108\n", - " 117.322911\n", + " 121.876233\n", " \n", " \n", - " 10\n", + " Trial 10\n", + " 102\n", + " 92.938386\n", " 105\n", - " 116.453419\n", + " 117.156862\n", " 106\n", - " 105.011922\n", - " 108\n", - " 117.839589\n", + " 105.019749\n", " \n", " \n", - " 11\n", + " Trial 11\n", + " 99\n", + " 93.968010\n", " 101\n", - " 95.109907\n", - " 105\n", - " 117.830054\n", - " 106\n", - " 101.405169\n", + " 94.454280\n", + " 102\n", + " 93.431528\n", " \n", " \n", - " 12\n", + " Trial 12\n", " 105\n", - " 116.847663\n", + " 122.831802\n", " 106\n", - " 106.521048\n", + " 105.388515\n", " 108\n", - " 117.010967\n", + " 113.150899\n", " \n", " \n", - " 13\n", + " Trial 13\n", + " 99\n", + " 91.873998\n", " 105\n", - " 115.514138\n", + " 116.898725\n", " 106\n", - " 106.151399\n", - " 107\n", - " 100.723549\n", + " 103.640250\n", " \n", " \n", - " 14\n", + " Trial 14\n", + " 101\n", + " 93.329636\n", " 105\n", - " 116.782518\n", + " 118.057045\n", " 106\n", - " 101.342892\n", - " 108\n", - " 119.078203\n", + " 103.180338\n", " \n", " \n", - " 15\n", + " Trial 15\n", " 105\n", - " 114.856210\n", + " 116.747797\n", " 106\n", - " 104.270722\n", + " 104.143762\n", " 108\n", - " 116.884983\n", + " 113.922130\n", " \n", " \n", "\n", "" ], "text/plain": [ - " Hit 1 Value 1 Hit 2 Value 2 Hit 3 Value 3\n", - "0 105 119.910940 106 108.072849 108 117.503564\n", - "1 105 115.307708 108 117.121047 109 127.881792\n", - "2 102 92.038135 105 116.128564 106 101.611371\n", - "3 105 117.610280 106 102.272893 107 100.720009\n", - "4 105 116.753340 106 104.331020 107 101.926183\n", - "5 105 118.389840 107 105.192731 108 117.567172\n", - "6 105 112.539023 106 103.449801 107 100.833485\n", - "7 101 96.753215 105 116.695646 106 104.575352\n", - "8 105 117.673095 106 104.861882 108 118.395198\n", - "9 105 118.362381 106 103.939418 108 117.322911\n", - "10 105 116.453419 106 105.011922 108 117.839589\n", - "11 101 95.109907 105 117.830054 106 101.405169\n", - "12 105 116.847663 106 106.521048 108 117.010967\n", - "13 105 115.514138 106 106.151399 107 100.723549\n", - "14 105 116.782518 106 101.342892 108 119.078203\n", - "15 105 114.856210 106 104.270722 108 116.884983" + " Hit 1 Value 1 Hit 2 Value 2 Hit 3 Value 3\n", + "Trial 0 101 96.879770 105 113.851512 107 99.414630\n", + "Trial 1 105 121.425789 106 102.608127 108 118.983717\n", + "Trial 2 105 117.123712 106 103.991304 107 101.750900\n", + "Trial 3 105 114.364158 106 105.542748 108 110.053167\n", + "Trial 4 91 67.352507 105 117.092939 106 97.401881\n", + "Trial 5 99 89.696951 105 116.939303 106 103.345784\n", + "Trial 6 105 119.751585 106 103.699765 108 117.385299\n", + "Trial 7 101 92.571017 102 92.378663 105 122.396314\n", + "Trial 8 105 113.760323 106 105.355705 108 120.389826\n", + "Trial 9 99 92.460085 101 94.759696 105 121.876233\n", + "Trial 10 102 92.938386 105 117.156862 106 105.019749\n", + "Trial 11 99 93.968010 101 94.454280 102 93.431528\n", + "Trial 12 105 122.831802 106 105.388515 108 113.150899\n", + "Trial 13 99 91.873998 105 116.898725 106 103.640250\n", + "Trial 14 101 93.329636 105 118.057045 106 103.180338\n", + "Trial 15 105 116.747797 106 104.143762 108 113.922130" ] }, "metadata": {}, @@ -1090,7 +1089,7 @@ "value_pairs = zip(indices.transpose(), perturbed_values.transpose())\n", "column_values = [val for pair in value_pairs for val in pair]\n", "table = {k: v for (k, v) in zip(column_names, column_values)}\n", - "df = pd.DataFrame(table)\n", + "df = pd.DataFrame(table, index=[\"Trial %i\" % i for i in range(TRIALS)])\n", "display(df)" ] }, @@ -1110,7 +1109,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -1129,7 +1128,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -1158,7 +1157,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -1172,16 +1171,16 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 29, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1214,7 +1213,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -1228,16 +1227,16 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 30, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1269,6 +1268,40 @@ "## Correlated Noise Mechanisms" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Wrangling" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# Generate some synthetic data\n", + "data = pd.DataFrame()\n", + "test_results = np.random.choice([\"Negative\", \"Positive\", \"N/A\"], size=10000, p=[0.55,0.35,0.1]) \n", + "data[\"Test Result\"] = test_results\n", + "\n", + "# Compute a histogram representation of the data\n", + "from relm.histogram import Histogram\n", + "hist = Histogram(data)\n", + "real_database = hist.get_db()\n", + "db_size = real_database.size\n", + "\n", + "# Specify the queries to be answered\n", + "queries = [[{\"Test Result\": \"Negative\"}, {\"Test Result\": \"Positive\"}],\n", + " [{\"Test Result\": \"Positive\"}, {\"Test Result\": \"N/A\"}],\n", + " [{\"Test Result\": \"Negative\"}, {\"Test Result\": \"N/A\"}]]\n", + "queries = sps.vstack([hist.get_query_vector(q) for q in queries])\n", + "\n", + "# Compute the exact query responses\n", + "values = (queries @ real_database)/real_database.sum()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1280,15 +1313,204 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Online Multiplicative Weights Mechanism" + "#### Basic Usage" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from relm.mechanisms import SmallDB\n", + "smalldb = SmallDB(epsilon=1.0, alpha=0.05)\n", + "synthetic_database = smalldb.release(values, queries, db_size)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Visualising the Results" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Query 0Query 1Query 2
Exact Responses0.8981000.4441000.657800
TRIAL 00.9000000.4408330.659167
TRIAL 10.8991670.4383330.662500
TRIAL 20.8966670.4441670.659167
TRIAL 30.8975000.4441670.658333
TRIAL 40.8966670.4450000.658333
TRIAL 50.9000000.4408330.659167
TRIAL 60.8966670.4458330.657500
TRIAL 70.8991670.4433330.657500
TRIAL 80.8983330.4425000.659167
TRIAL 90.8991670.4441670.656667
TRIAL 100.8966670.4458330.657500
TRIAL 110.8991670.4425000.658333
TRIAL 120.9008330.4416670.657500
TRIAL 130.8975000.4441670.658333
TRIAL 140.8991670.4425000.658333
TRIAL 150.8966670.4458330.657500
\n", + "
" + ], + "text/plain": [ + " Query 0 Query 1 Query 2\n", + "Exact Responses 0.898100 0.444100 0.657800\n", + "TRIAL 0 0.900000 0.440833 0.659167\n", + "TRIAL 1 0.899167 0.438333 0.662500\n", + "TRIAL 2 0.896667 0.444167 0.659167\n", + "TRIAL 3 0.897500 0.444167 0.658333\n", + "TRIAL 4 0.896667 0.445000 0.658333\n", + "TRIAL 5 0.900000 0.440833 0.659167\n", + "TRIAL 6 0.896667 0.445833 0.657500\n", + "TRIAL 7 0.899167 0.443333 0.657500\n", + "TRIAL 8 0.898333 0.442500 0.659167\n", + "TRIAL 9 0.899167 0.444167 0.656667\n", + "TRIAL 10 0.896667 0.445833 0.657500\n", + "TRIAL 11 0.899167 0.442500 0.658333\n", + "TRIAL 12 0.900833 0.441667 0.657500\n", + "TRIAL 13 0.897500 0.444167 0.658333\n", + "TRIAL 14 0.899167 0.442500 0.658333\n", + "TRIAL 15 0.896667 0.445833 0.657500" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "TRIALS = 2**4\n", + "synthetic_responses = np.empty((TRIALS, queries.shape[0]))\n", + "for i in range(TRIALS):\n", + " smalldb = SmallDB(epsilon=1.0, alpha=0.05)\n", + " synthetic_database = smalldb.release(values, queries, db_size)\n", + " synthetic_responses[i] = (queries @ synthetic_database) / synthetic_database.sum()\n", + " \n", + "df = pd.DataFrame(data=np.row_stack((values, synthetic_responses)),\n", + " columns=[\"Query %i\" % i for i in range(queries.shape[0])],\n", + " index=[\"Exact Responses\"] + [\"TRIAL %i\" % i for i in range(TRIALS)])\n", + "\n", + "display(df)" + ] } ], "metadata": { diff --git a/relm/histogram.py b/relm/histogram.py index 2f928af..30a82da 100644 --- a/relm/histogram.py +++ b/relm/histogram.py @@ -113,3 +113,13 @@ def get_db(self): db = np.zeros(self.size, dtype=np.uint64) db[self.idxs] = self.vals return db + +class ObliviousHistogram(Histogram): + def __init__(self, column_dict, column_sets, column_incr, db_size): + self.column_dict = column_dict + self.column_sets = column_sets + self.column_incr = column_incr + self.db_size = db_size + + def get_db(self): + raise NotImplementedError diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index 0fbcc38..44246de 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -18,7 +18,7 @@ class SmallDB(ReleaseMechanism): alpha: the relative error of the mechanism in range [0, 1] """ - def __init__(self, epsilon, data, alpha): + def __init__(self, epsilon, alpha): super(SmallDB, self).__init__(epsilon) self.alpha = alpha @@ -29,22 +29,6 @@ def __init__(self, epsilon, data, alpha): if (alpha < 0) or (alpha > 1): raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") - if not (data >= 0).all(): - raise ValueError( - f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" - ) - - if data.dtype == np.int64: - data = data.astype(np.uint64) - - if data.dtype != np.uint64: - raise TypeError( - f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" - ) - - self.data = data - self.db = None - @property def privacy_consumed(self): if self._is_valid: @@ -52,7 +36,7 @@ def privacy_consumed(self): else: return self.epsilon - def release(self, queries): + def release(self, values, queries, db_size): """ Releases differential private responses to queries. @@ -66,7 +50,6 @@ def release(self, queries): self._check_valid() l1_norm = int(queries.shape[0] / (self.alpha ** 2)) + 1 - answers = queries.dot(self.data) / self.data.sum() error_str = ( f"queries: queries must only contain 1s and 0s. Found {np.unique(queries)}" @@ -90,31 +73,8 @@ def release(self, queries): breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) db = backend.small_db( - self.epsilon, l1_norm, len(self.data), sparse_queries, answers, breaks + self.epsilon, l1_norm, db_size, sparse_queries, values, breaks ) - # For debugging purposes, replace this call to the rust backend with - # a call to the ExponentialMechanism code with an appropriate output_range - # and utility_function. - - # print("Hit the debugging code") - # - # n = len(self.data) - # f = lambda x: np.bincount(x, minlength=n) - # output_range = list( - # map(f, combinations_with_replacement(np.arange(n), l1_norm)) - # ) - # utility_function = lambda _: np.array( - # [-np.max(queries.dot(x) / l1_norm - answers) for x in output_range] - # ) - # mechanism = ExponentialMechanism( - # epsilon=self.epsilon, - # utility_function=utility_function, - # sensitivity=1.0, - # output_range=output_range, - # method="sample_and_flip", - # ) - # db = mechanism.release(answers) - self._is_valid = False return db diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 6d939ac..9893aa1 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -141,22 +141,6 @@ pub fn small_db( // store the db in a sparse vector (implemented with a HashMap) let mut db: HashMap = HashMap::with_capacity(l1_norm); - // let mut normalizer: f64 = f64::MIN; - // for i in 0..1000 { - // random_small_db(&mut db, l1_norm, size); - // - // let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); - // let utility = -error * (l1_norm as f64); - // println!("{:?}", utility); - // println!("{:?}", normalizer); - // - // if utility > normalizer { - // normalizer = utility; - // } - // } - - // let unnormalized_answers = answers.iter().map(|x| x * (l1_norm as f64)); - let min_errors = answers.iter() .map(|x| x * (l1_norm as f64)) .map(|x| (x - x.round()).abs()); @@ -175,18 +159,9 @@ pub fn small_db( let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); let utility = -error * (l1_norm as f64); - //println!("{:?}", utility); - //println!("{:?}", normalizer); let log_p = epsilon * (utility - normalizer); if samplers::bernoulli_log_p(log_p) { break } - - // if utility > normalizer { - // normalizer = utility; - // } else { - // let log_p = epsilon * (utility - normalizer); - // if samplers::bernoulli_log_p(log_p) { break } - // } } // convert the sparse small db to a dense vector From 4325f109a957c135f05e442562da4980e5b750a6 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 21 Jan 2021 14:04:49 +1100 Subject: [PATCH 136/185] Added a default precision for release mechanisms --- examples/relm_demo.ipynb | 6 +++--- relm/mechanisms/output_perturbation.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/relm_demo.ipynb b/examples/relm_demo.ipynb index c41ca1c..9f18e81 100644 --- a/examples/relm_demo.ipynb +++ b/examples/relm_demo.ipynb @@ -28,7 +28,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Simple Mechanisms\n", + "## Basic Mechanisms\n", "Using RelM for basic differentially private release is fairly striaghtforward.\n", "For example, suppose that the database consists of records indicating the age group of each patient who received a COVID-19 test on 09 March, 2020.\n", "Each patient is classified as belonging to one of eight age groups: 0-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, and 70+.\n", @@ -1114,7 +1114,7 @@ "outputs": [], "source": [ "from relm.mechanisms import ReportNoisyMax\n", - "mechanism = ReportNoisyMax(epsilon=1.0, precision=35) \n", + "mechanism = ReportNoisyMax(epsilon=1.0) \n", "index, perturbed_value = mechanism.release(values)" ] }, @@ -1136,7 +1136,7 @@ "indices = np.zeros(TRIALS)\n", "perturbed_values = np.zeros(TRIALS)\n", "for i in range(TRIALS):\n", - " mechanism = ReportNoisyMax(epsilon=0.1, precision=35)\n", + " mechanism = ReportNoisyMax(epsilon=0.1)\n", " indices[i], perturbed_values[i] = mechanism.release(values)" ] }, diff --git a/relm/mechanisms/output_perturbation.py b/relm/mechanisms/output_perturbation.py index aa0c250..db77882 100644 --- a/relm/mechanisms/output_perturbation.py +++ b/relm/mechanisms/output_perturbation.py @@ -19,7 +19,7 @@ class LaplaceMechanism(ReleaseMechanism): precision: number of fractional bits to use in the internal fixed point representation. """ - def __init__(self, epsilon, sensitivity, precision): + def __init__(self, epsilon, sensitivity, precision=35): super(LaplaceMechanism, self).__init__(epsilon) self.sensitivity = sensitivity self.precision = precision @@ -159,7 +159,7 @@ class ReportNoisyMax(ReleaseMechanism): precision: number of fractional bits to use in the internal fixed point representation. """ - def __init__(self, epsilon, precision): + def __init__(self, epsilon, precision=35): super(ReportNoisyMax, self).__init__(epsilon) self.sensitivity = 1.0 self.precision = precision From 6889c25cccc1e098654a74a4900e4b0fba3a9a6f Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 21 Jan 2021 14:13:35 +1100 Subject: [PATCH 137/185] Minor demo changes --- examples/relm_demo.ipynb | 926 ++------------------------------------- 1 file changed, 47 insertions(+), 879 deletions(-) diff --git a/examples/relm_demo.ipynb b/examples/relm_demo.ipynb index 9f18e81..9f85b62 100644 --- a/examples/relm_demo.ipynb +++ b/examples/relm_demo.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# RelM: Usage Examples" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -9,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -45,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -74,13 +81,13 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Create a differentially private release mechanism\n", "from relm.mechanisms import LaplaceMechanism\n", - "mechanism = LaplaceMechanism(epsilon=0.1, sensitivity=1.0, precision=35)\n", + "mechanism = LaplaceMechanism(epsilon=0.1, sensitivity=1.0)\n", "perturbed_counts = mechanism.release(values=values.astype(np.float))" ] }, @@ -96,84 +103,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "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", - "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238222.083581
110-19386386.294492
220-29688675.054709
330-39779781.616796
440-49621627.073361
550-59582590.627503
660-69344348.706589
770+261258.880069
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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/Mu/UFlZSe/evRk3bmeb8cUXX+RjH/sYJ5xwAgMGDOCdd97hpptuYurUqVRUVDB16gdvxHXXXXcxatQoTjnlFCDpl77kkkvo3Lkzb775JhdeeCF9+/bl5JNPZuHChQCMHz+eiRMn7lhHnz59WLlyJStXrqRnz5588YtfpHfv3gwePJgtW7bwyCOPMG/ePC699FIqKirYsmULY8aMoVevXvTt25frr7++rPuxKfaKsWXMrPnasmULFRUVO16PHTuWz3zmM9x5552MHj2aa6+9lrfeeosvfvGLAEyYMIH27dvz/vvvM2jQIBYuXMhxxx3HZz7zGaZOnUr//v3ZuHEjbdu25Zvf/Cbz5s3jzjvv3GW7ixYtYtSoUbuUA4wbN45+/frx+OOP88tf/pLPf/7zDf66WLZsGQ8//DA//OEP+fSnP82jjz7KZZddxp133snEiROprKzkzTff5LHHHuPVV19FEm+//XZjd1vZObmbWZPU1S3ziU98gp/+9KdcffXVvPzyyzvKp02bxqRJk6iurmbNmjW88sorSKJLly70798fgHbt2jUppueff55HH30UgLPOOosNGzbwzjv1d8V17959x5fURz/6UVauXLlLnXbt2tG6dWuuvPJKhg4dyvnnn9+kOMvJ3TJmVhbbt29nyZIltGnThjfffBOAFStWMHHiRGbNmsXChQsZOnQoW7duJSKKPt2vd+/ezJ8/P++8fDchkkTLli3Zvn3nzbNyzx3fb7/9dky3aNGC6urqXdbRsmVL5s6dy8UXX8zjjz/OkCFDiop5d3JyN7OyuO222+jZsycPP/wwl19+Oe+99x4bN25k//3356CDDmLt2rU888wzABx33HGsXr2aF198EYBNmzZRXV3NgQceyKZNm/Ku/5prrmHy5MnMmTNnR9kDDzzAG2+8wcCBA3nwwQcBmD17Nh07dqRdu3Z069aNl156CYCXXnqJFStWNPg+cmPYvHkz77zzDueddx6333572Q4kl4K7ZcwypJBTF0utdp/7kCFDuPzyy7nnnnuYO3cuBx54IAMHDuTb3/42N998M/369aN3794cffTRnHrqqQC0atWKqVOn8pWvfIUtW7bQpk0bZs6cycc//nFuueUWKioqdvTl1+jcuTNTpkzh+uuvZ926deyzzz4MHDiQiy66iPHjx/OFL3yBvn370rZtWyZPngzAxRdfzP33309FRQX9+/fnmGOOafD9jR49mi9/+cu0adOGZ555hmHDhu34tXHbbbeVdmeW0F5xD9XKysrwzTqsLj4Vsm5LliyhZ8+eezoM2w3yfdaS5kdEZb767pYxM8sgJ3czswxycjczyyAndzOzDHJyNzPLICd3M7MM8nnuZlky/qASr6/hU0Zrhvytrq6mZ8+eTJ48ueBRGVeuXMnvfvc7PvvZAk9hzdGtWzfmzZtHx44di162vuU3b97M17/+dWbOnEnr1q3p0KED3/3udznppJMatZ18GhrKuBTccjezJqkZW2bRokW0atWKu+++u6DlqqurWblyJQ899FDR23z//fLdIuLKK6+kffv2LFu2jMWLF3Pffffxt7/9raTbWLBgAU8//XRJ11mbk7uZlczpp5/O8uXLeffdd7n88svp378//fr144knkhu13XfffQwfPpxPfvKTDB48mDFjxvDcc89RUVHBbbfdxn333cc111yzY33nn38+s2fPBuCAAw7gpptu4qSTTuKFF14A4Lvf/S4DBgxgwIABLF++HID169dz8cUX079/f/r3789vf/tbADZs2MDgwYPp168fX/rSl/KOP/Paa68xZ84cvv3tb7PPPkl6PProoxk6NLny99Zbb6VPnz706dOH22+/HUh+ffTp02fHOiZOnMj48eMBOPPMM7nhhhsYMGAAxxxzDM899xz/+Mc/dhnK+Ne//jUVFRVUVFTQr1+/OodcKIa7ZcysJKqrq3nmmWcYMmQIEyZM4KyzzuLee+/l7bffZsCAAZx99tkAvPDCCyxcuJD27dsze/ZsJk6cyJNPPgkkyb8u7777Ln369OGb3/zmjrJ27doxd+5c7r//fq677jqefPJJrr32Wr761a9y2mmnsWrVKs455xyWLFnCzTffzGmnncZNN93EU089xaRJk3bZxuLFi6moqKBFixa7zJs/fz4//vGPmTNnDhHBSSedxBlnnMEhhxzS4H6ZO3cuTz/9NDfffDMzZ87cZSjjT37yk9x1112ceuqpbN68mdatWze4vxvSYHKXdCyQO0r+0cBNwP1peTdgJfDpiHgrXWYscAXwPvCvEfGLJkdqZnul3LFlTj/9dK644go+9rGPMX369B03xti6dSurVq0CkqGA27dvX/R2WrRowcUXX/yBspEjR+54/upXvwrAzJkzeeWVV3bU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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Extract the set of possible age groups\n", "age_groups = np.sort(data[\"age_group\"].unique())\n", @@ -213,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -233,84 +165,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "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", - "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238243
110-19386383
220-29688652
330-39779780
440-49621613
550-59582542
660-69344332
770+261253
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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igr69evHhAk7OwSef/55Pvaxj3HMMccwePBg3nrrLa6//nqmT59OeXk506e/+0Zct99+O2PHjuWEE04Akn7pCy64gO7du/P6669z7rnnMmDAAI4//ngWLlwIwMSJE5k8efKOdfTv35+qqiqqqqro06cPX/ziF+nXrx/Dhg1j8+bNPPjgg1RWVnLhhRdSXl7O5s2bGT9+PH379mXAgAFcffXVJd2PLeGWu5m1yObNmykvL9/x+tprr+Uzn/kMt912G+PGjePKK6/kjTfe4Itf/CIAkyZNonPnzmzbto2hQ4eycOFCjjrqKD7zmc8wffp0Bg0axIYNG+jYsSPf/va3qays5Lbbbttlu4sWLWLs2LG7lANMmDCBgQMH8sgjj/DrX/+az3/+843+uli2bBkPPPAAP/7xj/n0pz/NQw89xEUXXcRtt93G5MmTqaio4PXXX+fhhx/m5ZdfRhJvvvlmc3dbyTm5m1mL1Nct84lPfIKf//znXH755bz44os7ymfMmMGUKVOoqalh9erVvPTSS0iiR48eDBo0CIBOnTq1KKZnn32Whx56CIDTTjuN9evX89ZbDXfF9erVa8eX1Ec/+lGqqqp2qdOpUyfat2/PpZdeyogRIzj77LNbFGcpuVvGzEpi+/btLFmyhA4dOvD6668DsGLFCiZPnszs2bNZuHAhI0aMYMuWLUREk0/369evH/Pnz887L99NiCTRtm1btm/fefOs3HPH99prrx3Tbdq0oaamZpd1tG3blnnz5nH++efzyCOPMHz48CbFvDs5uZtZSdx888306dOHBx54gIsvvph33nmHDRs2sPfee7PffvuxZs0annzySQCOOuooVq1axfPPPw/Axo0bqampYd9992Xjxo1513/FFVcwdepU5s6du6Ps3nvv5bXXXmPIkCHcd999AMyZM4euXbvSqVMnysrKeOGFFwB44YUXWLFiRaPvIzeGTZs28dZbb3HWWWdxyy23lOxAcjG4W8YsQwo5dbHY6va5Dx8+nIsvvpg777yTefPmse+++zJkyBC++93vcsMNNzBw4ED69evH4YcfzoknnghAu3btmD59Ol/96lfZvHkzHTp0YNasWXz84x/nxhtvpLy8fEdffq3u3bszbdo0rr76atauXcsee+zBkCFDOO+885g4cSJf+MIXGDBgAB07dmTq1GSMw/PPP5977rmH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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Create a dataframe with both exact and perturbed counts\n", "column_values = [age_ranges, values, perturbed_counts]\n", @@ -342,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -371,84 +228,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "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", - "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238253
110-19386409
220-29688672
330-39779773
440-49621569
550-59582591
660-69344312
770+261359
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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nowevaVD4MUXX+RjH/sYxx13HP369eOdd97hxhtvZNKkSVRVVTFp0tY34rrzzjsZMWIEJ510EpD0S1900UV06tSJN998k/PPP5/evXtz4oknMmfOHADGjBnDuHHjNq+jV69eLFmyhCVLltC9e3e++MUv0rNnTwYOHMj69et5+OGHqamp4eKLL6aqqor169czatQoevToQe/evbn22mvLuh93hFvuZrZD1q9fT1VV1ebX119/PZ/5zGe44447GDlyJFdffTVvvfUWX/ziFwEYO3Ys7dq14/3332fAgAHMmTOHY445hs985jNMmjSJvn37smbNGtq0acO3v/1tampquOOOO7bZ7ty5cxkxYsQ25QCjR4+mT58+PPbYY/z617/m85//fLO/LhYuXMhDDz3Ej3/8Yz796U/zyCOPcMkll3DHHXcwbtw4qqurefPNN3n00Ud59dVXkcTbb7+9vbut7JzczWyHNNYt84lPfIKf//znXHnllbz88subyydPnsz48eOpq6tj+fLlvPLKK0iic+fO9O3bF4C2bdvuUEzPP/88jzzyCABnnHEGq1ev5p133mlyma5du27+kvroRz/KkiVLtqnTtm1bKioquPzyyxk8eDDnnnvuDsVZTu6WMbOy2LRpE/Pnz6d169a8+eabACxevJhx48Yxbdo05syZw+DBg9mwYQMRUfTpfj179mTWrFl55+W7CZEkWrZsyaZNW26elXvu+D777LN5ukWLFtTV1W2zjpYtWzJz5kwuvPBCHnvsMQYNGlRUzDuTk7uZlcWtt95K9+7deeihh7j00kt57733WLNmDfvuuy8HHHAAK1as4OmnnwbgmGOOYdmyZbz44osArF27lrq6Ovbff3/Wrl2bd/1XXXUVEyZMYMaMGZvL7r//ft544w369+/PAw88AMD06dPp0KEDbdu2pbKykpdeegmAl156icWLFzf7PnJjWLduHe+88w7nnHMOt912W9kOJJeCu2XMMmRXnC3UsM990KBBXHrppdx9993MnDmT/fffn/79+/Pd736Xm266iT59+tCzZ0+OPPJITj75ZABatWrFpEmT+OpXv8r69etp3bo1U6dO5eMf/zg333wzVVVVm/vy63Xq1ImJEydy7bXXsnLlSvbaay/69+/PBRdcwJgxY/jCF75A7969adOmDRMmJGMcXnjhhdx3331UVVXRt29fjjrqqGbf38iRI/nyl79M69atefrppxkyZMjmXxu33npraXdmCe0W91Ctrq4O36zDGlPUqZAVny2s4pim+1/3FPPnz6d79+67OgzbCfJ91pJmRUR1vvruljEzyyAndzOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswzyee5mWVLqQdEKOGW0fsjfuro6unfvzoQJEwoelXHJkiX84Q9/4LOfLfAU1hyVlZXU1NTQoUOHopdtavl169bxzW9+k6lTp1JRUUH79u35/ve/zwknnLBd28mnuaGMS8EtdzPbIfVjy8ydO5dWrVpx1113FbRcXV0dS5Ys4cEHHyx6m++/X777/1x++eW0a9eOhQsXMm/ePO69917+8Y9/lHQbs2fP5qmnnirpOhtycjezkjn11FNZtGgR7777Lpdeeil9+/alT58+PP54chfOe++9l6FDh/LJT36SgQMHMmrUKJ577jmqqqq49dZbuffee7nqqqs2r+/cc89l+vTpAOy3337ceOONnHDCCbzwwgsAfP/736dfv37069ePRYsWAbBq1SouvPBC+vbtS9++ffn9738PwOrVqxk4cCB9+vThS1/6Ut7xZ1577TVmzJjBd7/7XfbaK0mPRx55JIMHJ1f+3nLLLfTq1YtevXpx2223Acmvj169em1ex7hx4xgzZgwAp59+Otdddx39+vXjqKOO4rnnnuNf//rXNkMZ//a3v6Wqqoqqqir69OnT6JALxXC3jJmVRF1dHU8//TSDBg1i7NixnHHGGdxzzz28/fbb9OvXjzPPPBOAF154gTlz5tCuXTumT5/OuHHjeOKJJ4Ak+Tfm3XffpVevXnz729/eXNa2bVtmzpzJfffdxzXXXMMTTzzB1Vdfzde//nVOOeUUli5dyllnncX8+fO56aabOOWUU7jxxht58sknGT9+/DbbmDdvHlVVVbRo0WKbebNmzeKnP/0pM2bMICI44YQTOO200zjooIOa3S8zZ87kqaee4qabbmLq1KnbDGX8yU9+kjvvvJOTTz6ZdevWUVFR0ez+bk6zyV3S0UDuKPlHAjcC96XllcAS4NMR8Va6zPXAZcD7wNci4lc7HKmZ7ZZyx5Y59dRTueyyy/jYxz7GlClTNt8YY8OGDSxduhRIhgJu165d0dtp0aIFF1544VZlw4cP3/z89a9/HYCpU6fyyiuvbK6zZs0a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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Create a dataframe with both exact and perturbed counts\n", "column_values = [age_ranges, values, perturbed_counts]\n", @@ -481,7 +263,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -522,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -541,7 +323,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -563,40 +345,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The index of the first exact count that exceeds the threshold is: 105\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "print(\"The index of the first exact count that exceeds the threshold is: %i\\n\" % np.argmax(values >= threshold))\n", "\n", @@ -627,7 +378,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -645,177 +396,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Hit 1Hit 2Hit 3Hit 4
Trial 099105107108
Trial 1101102105106
Trial 297104105106
Trial 3105106107108
Trial 4106108109110
Trial 5101105109110
Trial 699100102105
Trial 7105106108109
Trial 894101102105
Trial 9105108109111
Trial 10102105108109
Trial 1199102106107
Trial 129899101102
Trial 1396101105106
Trial 14102105106107
Trial 15105108111113
\n", - "
" - ], - "text/plain": [ - " Hit 1 Hit 2 Hit 3 Hit 4\n", - "Trial 0 99 105 107 108\n", - "Trial 1 101 102 105 106\n", - "Trial 2 97 104 105 106\n", - "Trial 3 105 106 107 108\n", - "Trial 4 106 108 109 110\n", - "Trial 5 101 105 109 110\n", - "Trial 6 99 100 102 105\n", - "Trial 7 105 106 108 109\n", - "Trial 8 94 101 102 105\n", - "Trial 9 105 108 109 111\n", - "Trial 10 102 105 108 109\n", - "Trial 11 99 102 106 107\n", - "Trial 12 98 99 101 102\n", - "Trial 13 96 101 105 106\n", - "Trial 14 102 105 106 107\n", - "Trial 15 105 108 111 113" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "TRIALS = 16\n", "cutoff = 4\n", @@ -848,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -867,211 +450,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Hit 1Value 1Hit 2Value 2Hit 3Value 3
Trial 010196.879770105113.85151210799.414630
Trial 1105121.425789106102.608127108118.983717
Trial 2105117.123712106103.991304107101.750900
Trial 3105114.364158106105.542748108110.053167
Trial 49167.352507105117.09293910697.401881
Trial 59989.696951105116.939303106103.345784
Trial 6105119.751585106103.699765108117.385299
Trial 710192.57101710292.378663105122.396314
Trial 8105113.760323106105.355705108120.389826
Trial 99992.46008510194.759696105121.876233
Trial 1010292.938386105117.156862106105.019749
Trial 119993.96801010194.45428010293.431528
Trial 12105122.831802106105.388515108113.150899
Trial 139991.873998105116.898725106103.640250
Trial 1410193.329636105118.057045106103.180338
Trial 15105116.747797106104.143762108113.922130
\n", - "
" - ], - "text/plain": [ - " Hit 1 Value 1 Hit 2 Value 2 Hit 3 Value 3\n", - "Trial 0 101 96.879770 105 113.851512 107 99.414630\n", - "Trial 1 105 121.425789 106 102.608127 108 118.983717\n", - "Trial 2 105 117.123712 106 103.991304 107 101.750900\n", - "Trial 3 105 114.364158 106 105.542748 108 110.053167\n", - "Trial 4 91 67.352507 105 117.092939 106 97.401881\n", - "Trial 5 99 89.696951 105 116.939303 106 103.345784\n", - "Trial 6 105 119.751585 106 103.699765 108 117.385299\n", - "Trial 7 101 92.571017 102 92.378663 105 122.396314\n", - "Trial 8 105 113.760323 106 105.355705 108 120.389826\n", - "Trial 9 99 92.460085 101 94.759696 105 121.876233\n", - "Trial 10 102 92.938386 105 117.156862 106 105.019749\n", - "Trial 11 99 93.968010 101 94.454280 102 93.431528\n", - "Trial 12 105 122.831802 106 105.388515 108 113.150899\n", - "Trial 13 99 91.873998 105 116.898725 106 103.640250\n", - "Trial 14 101 93.329636 105 118.057045 106 103.180338\n", - "Trial 15 105 116.747797 106 104.143762 108 113.922130" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "TRIALS = 2**4\n", "cutoff = 3\n", @@ -1109,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1128,7 +509,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1157,40 +538,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The index of the greatest exact count is: 128\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "print(\"The index of the greatest exact count is: %i\\n\" % np.argmax(values))\n", "\n", @@ -1213,40 +563,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The greatest exact count is: 156\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "print(\"The greatest exact count is: %i\\n\" % np.max(values))\n", "\n", @@ -1277,7 +596,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1318,7 +637,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1336,167 +655,9 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Query 0Query 1Query 2
Exact Responses0.8981000.4441000.657800
TRIAL 00.9000000.4408330.659167
TRIAL 10.8991670.4383330.662500
TRIAL 20.8966670.4441670.659167
TRIAL 30.8975000.4441670.658333
TRIAL 40.8966670.4450000.658333
TRIAL 50.9000000.4408330.659167
TRIAL 60.8966670.4458330.657500
TRIAL 70.8991670.4433330.657500
TRIAL 80.8983330.4425000.659167
TRIAL 90.8991670.4441670.656667
TRIAL 100.8966670.4458330.657500
TRIAL 110.8991670.4425000.658333
TRIAL 120.9008330.4416670.657500
TRIAL 130.8975000.4441670.658333
TRIAL 140.8991670.4425000.658333
TRIAL 150.8966670.4458330.657500
\n", - "
" - ], - "text/plain": [ - " Query 0 Query 1 Query 2\n", - "Exact Responses 0.898100 0.444100 0.657800\n", - "TRIAL 0 0.900000 0.440833 0.659167\n", - "TRIAL 1 0.899167 0.438333 0.662500\n", - "TRIAL 2 0.896667 0.444167 0.659167\n", - "TRIAL 3 0.897500 0.444167 0.658333\n", - "TRIAL 4 0.896667 0.445000 0.658333\n", - "TRIAL 5 0.900000 0.440833 0.659167\n", - "TRIAL 6 0.896667 0.445833 0.657500\n", - "TRIAL 7 0.899167 0.443333 0.657500\n", - "TRIAL 8 0.898333 0.442500 0.659167\n", - "TRIAL 9 0.899167 0.444167 0.656667\n", - "TRIAL 10 0.896667 0.445833 0.657500\n", - "TRIAL 11 0.899167 0.442500 0.658333\n", - "TRIAL 12 0.900833 0.441667 0.657500\n", - "TRIAL 13 0.897500 0.444167 0.658333\n", - "TRIAL 14 0.899167 0.442500 0.658333\n", - "TRIAL 15 0.896667 0.445833 0.657500" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "TRIALS = 2**4\n", "synthetic_responses = np.empty((TRIALS, queries.shape[0]))\n", @@ -1511,6 +672,13 @@ "\n", "display(df)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From d02852bd9d77a6d5e21b52de26cfef00bcfcf231 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 27 Jan 2021 08:46:52 +1100 Subject: [PATCH 138/185] Minor mods to crisper demo --- crisper_smalldb.ipynb | 159 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 crisper_smalldb.ipynb diff --git a/crisper_smalldb.ipynb b/crisper_smalldb.ipynb new file mode 100644 index 0000000..3557758 --- /dev/null +++ b/crisper_smalldb.ipynb @@ -0,0 +1,159 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "from relm.histogram import Histogram\n", + "from relm.mechanisms import SmallDB\n", + "import numpy as np\n", + "from itertools import product\n", + "import scipy.sparse as sps\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "fp = 'examples/20200811_QLD_dummy_dataset_individual_v2.xlsx'\n", + "df = pd.read_excel(fp)\n", + "df.drop([\"NOTF_ID\", \"LGA\", \"HHS\"] + list(df.columns[12:]), axis=1, inplace=True)\n", + "\n", + "hist = Histogram(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "_cols = [\"AGEGRP5\", \"SEX\", \"INDIG_STATUS\"]\n", + "queries = []\n", + "\n", + "# this creates the queries for:\n", + "# df.groupby([\"AGEGRP5\", \"SEX\", \"INDIG_STATUS\", col]).count()\n", + "# where col is in [\"HOSPITALISED\", \"VENTILATED\", \"ICU\", \"DIED_OF_CONDITION\"]\n", + "for col in [\"HOSPITALISED\", \"VENTILATED\", \"ICU\", \"DIED_OF_CONDITION\"]:\n", + " cols = _cols + [col,]\n", + " vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", + " queries.extend(dict(zip(cols, val)) for val in vals)\n", + "\n", + "# this creates the queries for:\n", + "# df.groupby([\"ONSET_DATE\", \"AGEGRP5\", \"INDIG_STATUS\", \"SEX\"]).count()\n", + "cols = [\"ONSET_DATE\", \"AGEGRP5\", \"INDIG_STATUS\", \"SEX\"]\n", + "vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", + "queries.extend(dict(zip(cols, val)) for val in vals)\n", + "\n", + "# this creates the queries for:\n", + "# df.groupby([\"ONSET_DATE\", \"POSTCODE\"]).count()\n", + "cols = [\"ONSET_DATE\", \"POSTCODE\"]\n", + "vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", + "queries.extend(dict(zip(cols, val)) for val in vals)\n", + "\n", + "queries = sps.vstack([hist.get_query_vector(q) for q in queries])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "smalldb = SmallDB(epsilon=4, data=hist.get_db(), alpha=0.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 2min 1s, sys: 1.68 s, total: 2min 3s\n", + "Wall time: 2min 3s\n" + ] + } + ], + "source": [ + "%time x = smalldb.release(queries)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 0, 0, ..., 1, 0, 0], dtype=uint64)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "28554240" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From a30123e193329c22df5cdb1284075f8c3ea00972 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 27 Jan 2021 08:47:30 +1100 Subject: [PATCH 139/185] Minor mods to crisper_demo.ipynb --- examples/crisper_smalldb.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/crisper_smalldb.ipynb b/examples/crisper_smalldb.ipynb index 5f03be4..04c29d2 100644 --- a/examples/crisper_smalldb.ipynb +++ b/examples/crisper_smalldb.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -64,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ From 7e3d432f5f89edab6d4a75a39e8a2f1da6c43708 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 27 Jan 2021 12:32:52 +1100 Subject: [PATCH 140/185] Modified SmallDB release mechanisms to correctly account for db_size --- examples/relm_demo.ipynb | 931 +++++++++++++++++++++++++-- relm/mechanisms/data_perturbation.py | 7 +- src/lib.rs | 3 +- src/mechanisms.rs | 28 +- tests/test_mechanisms.py | 84 ++- 5 files changed, 941 insertions(+), 112 deletions(-) diff --git a/examples/relm_demo.ipynb b/examples/relm_demo.ipynb index 9f85b62..6a231ba 100644 --- a/examples/relm_demo.ipynb +++ b/examples/relm_demo.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -81,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -103,9 +103,84 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "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", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238240.699646
110-19386389.346272
220-29688703.319253
330-39779785.929981
440-49621607.201483
550-59582576.704968
660-69344366.029920
770+261266.907717
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Extract the set of possible age groups\n", "age_groups = np.sort(data[\"age_group\"].unique())\n", @@ -145,7 +220,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -165,9 +240,84 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "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", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238236
110-19386356
220-29688697
330-39779768
440-49621604
550-59582581
660-69344345
770+261286
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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FOvXr097cu/WrVutS+4aOExE0q60tJQjjjiCjz/+GIALL7yQBx54AICf/OQn5Obm0rVrV266aXuHwLvvvssPf/hDjj76aHr16kVpaSljx44lPz+fnJwc8vPzd9jHvffeS15eHscffzwQ9Uufd955tG7dmtWrV3PWWWfRvXt3evfuzbx58wC4+eabGT9+fPk2unXrRlFREUVFRXTu3JmrrrqKrl27MmDAADZu3Mi0adMoKCjg4osvJicnh40bNzJ69Gi6dOlC9+7dGTVqFPsqtdxFpEY2btxITk5O+fyYMWO44IILuOeee7jsssv4+c9/zpo1a7jqqqsAuP322znwwAPZunUr/fv3Z968eRx55JFccMEF5Ofn07NnT9atW0ejRo249dZbKSgo4J577tlpv/PnzycvL2+ncoCbbrqJY445hmeeeYbXX3+d4cOHV/nrYtGiRTz++OM88MADnH/++Tz11FNccskl3HPPPYwfP57c3FxWr17N9OnT+eijjzAz1q5dW4N3LrOU3CVebm6aYj3d4jNdKuuWOfXUU3nyySe55pprmDt3bnn5E088waRJk9iyZQtLly7lww8/xMxo06YNPXv2BKBJkyY1iuntt9/mqaei+5n369ePVatWUVq668+8Y8eO5V9Sxx57LEVFRTvVadKkCVlZWVx55ZUMHjyYM844o0ZxZpK6ZUQkI7Zt28bChQtp2LAhq1dHl7p8/vnnjB8/nhkzZjBv3jwGDx7Mpk2bcPdqn+7XtWtX5sypeK/uSLKzr82MevXqsW3btvKyxHPH99tvv/LpunXrsmXLzvdOr1evHrNnz+bcc8/lmWeeYeDAgdWKeU9ScheRjJgwYQKdO3fm8ccf54orrmDz5s2sW7eO/fffn6ZNm7J8+XJeeuklAI488khKSkp49913AVi/fj1btmzhgAMOYP369Um3f+211zJ58mRmzZpVXvboo4+ybNky+vTpw2OPPQbAG2+8wUEHHUSTJk3Izs7mvffeA+C9997j888/r/J1JMbwzTffUFpayqBBg5g4cWLGDiSng7plRGJkb5wtVLHPfeDAgVxxxRU8+OCDzJ49mwMOOIA+ffpw2223ccstt3DMMcfQtWtXDj30UE444QQAGjRoQH5+Pj/96U/ZuHEjDRs25LXXXqNv376MGzeOnJyc8r78Mq1bt2bq1KmMGjWKFStWUKdOHfr06cM555zDzTffzOWXX0737t1p1KgRkydHYxmee+65TJkyhZycHHr27Mnhhx9e5eu77LLLuPrqq2nYsCEvvfQSQ4YMKf+1MWHChDS/m+mzT9xDNTc313WzDqlMtU6FzErxntUx6XNfuHAhnTt33tthyB6Q7LM2sznunpusvrplRERiSMldRCSGlNxFRGJIyV1EJIaU3EVEYkjJXUQkhnSeu0icpDr8Qsrbq/qU0bIhf7ds2ULnzp2ZPHlytUZlnDhxIiNHjqz2SI4333wzjRs33u3Bu3a1/pQpU7jrrrtwd9ydK664Iu2DhP32t7/ll7/8ZVq3mUgtdxGpkbKxZebPn0+DBg24//77U15369atTJw4kQ0bNlRrn8mGBkiXl156iYkTJ/LKK6+wYMEC3nvvPZo2TfOXJlFyzyQldxFJm5NOOonFixcD0VAAvXr1Iicnhx//+Mds3boVgMaNGzN27FiOO+44br/9dkpKSujbty99+/YtX15m2rRpXHbZZUB0peh1111H3759ufHGGwGYO3cu/fr1o1OnTuVDCgP87ne/o2fPnnTv3n2HYYVvv/12jjjiCE455ZTy4YgruuOOOxg/fnz5+O1ZWVnlI1oWFhbSu3dvunfvztlnn82aNWsAOPnkkym7EPPrr78mOzsbiMaCP+eccxg4cCCdOnXihhtuAGD06NHlV/ZefPHFfPvttwwePJijjz6abt267TS88e5QcheRtNiyZQsvvfQSRx11FAsXLiQ/P5+///3vFBYWUrdu3fKxXr799lu6devGrFmzGDt2LG3btmXmzJnMnDmzyn188sknvPbaa/z+978HYN68ebzwwgv885//5NZbb6WkpIRXXnmFRYsWMXv2bAoLC5kzZw5vvvkmc+bMYerUqbz//vs8/fTT5ePYVDR//nyOPfbYpMuGDx/OnXfeybx58zjqqKO45ZZbqoy5sLCQ/Px8PvjgA/Lz81myZAnjxo0r/8Xz2GOP8fLLL9O2bVvmzp3L/Pnz0zIgWZV97mZ2BJD4NXIoMBaYEsqzgSLgfHdfE26i/QdgELABuMzd36txpCKyT0ocW+akk05ixIgRTJo0iTlz5pQP4btx40ZatWoFRH3055577m7ta+jQodStW7d8fsiQITRs2JCGDRvSt29fZs+ezdtvv80rr7zCMcccA0SDfS1atIj169dz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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Create a dataframe with both exact and perturbed counts\n", "column_values = [age_ranges, values, perturbed_counts]\n", @@ -199,7 +349,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -228,9 +378,84 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "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", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238228
110-19386414
220-29688683
330-39779780
440-49621620
550-59582572
660-69344396
770+261271
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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fvrpuDtPPPEEW7duTXty79atW61L7ho4TETSbvPmzZx44om89957AFxyySXcd999AHz/+98nNzeXrl27cvPNezsE3nzzTb7xjW9wyimn0Lt3bzZv3syECRPIz88nJyeH/Pz8ffbx29/+lry8PE4//XQg6pe+6KKLaN26NRs2bOC8886je/fu9OnTh8WLFwMwceJEJk+eXLaNbt26UVRURFFREZ07d+aaa66ha9euDBw4kO3btzNr1iwKCgq49NJLycnJYfv27YwbN44uXbrQvXt3xo4dy+FKLXcRqZHt27eTk5NTNj9+/HhGjBjBPffcwxVXXMGPfvQjNm7cyDXXXAPA7bffztFHH83u3bsZMGAAixcv5qSTTmLEiBHk5+fTq1cvtmzZQqNGjbj11lspKCjgnnvu2W+/S5YsIS8vb79ygJtvvpkePXrw1FNP8eqrrzJq1KhKf10sX76cRx99lPvuu4+LL76YJ554gssuu4x77rmHyZMnk5uby4YNG5g9ezbvvvsuZsamTZtq8M5llpK7iNRIRd0y3/rWt3j88ce57rrrWLRoUVn5Y489xrRp09i1axerVq3inXfewcxo06YNvXr1AqBJkyY1iun111/niSei+5n379+f9evXs3nzgbviOnbsWPYldeqpp1JUVLRfnSZNmpCVlcXVV1/NkCFDGDp0aI3izCR1y4hIRuzZs4dly5bRsGFDNmyILnX56KOPmDx5MnPmzGHx4sUMGTKEHTt24O5VPt2va9euLFhQ/l7dkWRnX5sZ9erVY8+ePWVlieeOH3HEEWXTdevWZdeu/e+dXq9ePebPn8+FF17IU089xaBBg6oU88Gk5C4iGTFlyhQ6d+7Mo48+ylVXXcXOnTvZsmULRx55JE2bNmXNmjW88MILAJx00kmUlJTw5ptvArB161Z27drFUUcdxdatW5Nu//rrr2f69OnMmzevrOzhhx9m9erV9O3bl0ceeQSA1157jWOOOYYmTZqQnZ3NwoULAVi4cCEfffRRpa8jMYbPP/+czZs3M3jwYKZOnZqxA8npoG4ZkRhJ5dTFdCvf5z5o0CCuuuoq7r//fubPn89RRx1F3759ue2227jlllvo0aMHXbt25fjjj+eMM84AoEGDBuTn5/ODH/yA7du307BhQ1555RX69evHpEmTyMnJKevLL9W6dWtmzpzJ2LFjWbt2LXXq1KFv375ccMEFTJw4kSuvvJLu3bvTqFEjpk+PxjK88MILmTFjBjk5OfTq1YsTTjih0td3xRVXcO2119KwYUNeeOEFhg0bVvZrY8qUKWl+N9PnsLiHam5urutmHVIRnQpZsWXLltG5c+dDHYYcBMk+azNb4O65yeqrW0ZEJIaU3EVEYkjJXUQkhpTcRURiSMldRCSGlNxFRGJI57mLxMnEpmneXuWnjJYO+btr1y46d+7M9OnTqzQq49SpUxkzZkyVR3KcOHEijRs3rvbgXQdaf8aMGdx11124O+7OVVddlfZBwn75y1/y05/+NK3bTKSWu4jUSOnYMkuWLKFBgwb87ne/S3nd3bt3M3XqVLZt21alfSYbGiBdXnjhBaZOncpLL73E0qVLWbhwIU2bpvlLkyi5Z5KSu4ikzVlnncWKFSuAaCiA3r17k5OTw/e+9z12794NQOPGjZkwYQKnnXYat99+OyUlJfTr149+/fqVLS81a9YsrrjiCiC6UvSGG26gX79+3HTTTQAsWrSI/v3706lTp7IhhQF+9atf0atXL7p3777PsMK33347J554Iuecc07ZcMTl3XHHHUyePLls/PasrKyyES0LCwvp06cP3bt35/zzz2fjxo0AnH322ZReiPnZZ5+RnZ0NRGPBX3DBBQwaNIhOnTpx4403AjBu3LiyK3svvfRSvvjiC4YMGcIpp5xCt27d9hveuDqU3EUkLXbt2sULL7zAySefzLJly8jPz+fvf/87hYWF1K1bt2ysly+++IJu3boxb948JkyYQNu2bZk7dy5z586tdB/vv/8+r7zyCr/+9a8BWLx4Mc899xz//Oc/ufXWWykpKeGll15i+fLlzJ8/n8LCQhYsWMBf//pXFixYwMyZM3nrrbd48skny8axKW/JkiWceuqpSZeNGjWKO++8k8WLF3PyySdzyy23VBpzYWEh+fn5vP322+Tn57Ny5UomTZpU9ovnkUce4cUXX6Rt27YsWrSIJUuWpGVAskr73M3sRCDxa+R4YAIwI5RnA0XAxe6+MdxE+zfAYGAbcIW7L6xxpCJyWEocW+ass85i9OjRTJs2jQULFpQN4bt9+3ZatWoFRH30F154YbX2NXz4cOrWrVs2P2zYMBo2bEjDhg3p168f8+fP5/XXX+ell16iR48eQDTY1/Lly9m6dSvnn39+Wd/+d77znSrte/PmzWzatIlvfvObAOTl5TF8eOV3FB0wYEBZt06XLl34+OOP6dChwz51Tj75ZMaOHctNN93E0KFDOeuss6oUWzKVJnd3fw/IATCzusCnwGyiG1/PcfdJZjYuzN8EnAt0Co/TgHvDs4jEULLx3N2dvLw87rjjjv3qZ2Vl7ZOgy0sc+jdxSF6AI488ssK6pfPuzvjx4/ne9763z7KpU6emNKxw6VDC/fv3r7RuqcShhMvHnMpQwieccAILFizg+eefZ/z48QwcOJAJEyakvP9kqtotMwD4wN0/BoYB00P5dOC8MD0MmOGRN4BmZtamRlGKSK0yYMAAZs2axdq1awHYsGEDH3/8cdK65Yf1bd26NcuWLWPPnj3Mnj37gPt5+umn2bFjB+vXr+e1116jV69efPvb3+bBBx/k888/B+DTTz9l7dq19O3bl9mzZ7N9+3a2bt3Kn/70p6TbHD9+PDfeeCOrV68G4F//+hd33303TZs2pXnz5vztb38D4KGHHiprxWdnZ5eNLT9r1qyU3qP69euzc+dOAEpKSmjUqBGXXXYZY8eOLRuWuCaqeirkSODRMN3a3VcBuPsqM2sVytsBKxPWKQ5lqxI3ZGZjgDEAxx57bBXDEJGkDpPRLrt06cJtt93GwIED2bNnD/Xr1+e3v/0txx133H51x4wZw7nnnkubNm2YO3cukyZNYujQoXTo0IFu3bqVJelkevfuzZAhQ/jkk0/4+c9/Ttu2bWnbti3Lli0ru7dq48aNefjhh+nZsycjRowgJyeH4447rsKuj8GDB7NmzRrOOeecspuIXHXVVQBMnz6da6+9lm3btnH88cfz+9//HoCxY8dy8cUX89BDD6Xc4h8zZgzdu3enZ8+ejBo1ip/85CfUqVOH+vXrc++996a0jQNJechfM2sAlABd3X2NmW1y92YJyze6e3Mzew64w91fD+VzgBvdPfktU9CQv3JgGvK3Yhry96sjk0P+ngssdPc1YX5NaXdLeF4byouBxKMF7Ym+FERE5CCpSrfMJeztkgF4BsgDJoXnpxPKrzezmUQHUjeXdt/I4aVKLeJDcIcfEam+lJK7mTUCvgUkHn6eBDxmZqOBT4DSc4KeJzoNcgXRqZBXpi1aOXRSvaw9Jt0dtUl1bi4ttUt17piXUnJ3921Ai3Jl64nOnilf14HrqhyJiFRZVlYW69evp0WLFkrwMeXurF+/nqysrCqtp4HDRGqx9u3bU1xczLp16w51KJJBWVlZtG/fvkrrKLmL1GL169enY8eOhzoMOQxpbBkRkRhSchcRiSEldxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRhSchcRiSEldxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRjSqJAiaZLqna1Svs8r6OYnUm1quYuIxFBKyd3MmpnZLDN718yWmdnpZna0mb1sZsvDc/NQ18zsbjNbYWaLzaxnZl+CiIiUl2rL/TfAi+5+EnAKsAwYB8xx907AnDAPcC7QKTzGAPemNWIREalUpcndzJoAfYEHANz9S3ffBAwDpodq04HzwvQwYIZH3gCamVmbtEcuIiIVSqXlfjywDvi9mb1lZveb2ZFAa3dfBRCeW4X67YCVCesXhzIRETlIUknu9YCewL3u3gP4gr1dMMkkuwW771fJbIyZFZhZgW7uKyKSXqkk92Kg2N3nhflZRMl+TWl3S3hem1C/Q8L67YGS8ht192nunuvuuS1btqxu/CIikkSlyd3dVwMrzezEUDQAeAd4BsgLZXnA02H6GWBUOGumD7C5tPtGREQOjlQvYvoB8IiZNQA+BK4k+mJ4zMxGA58Aw0Pd54HBwApgW6grIiIHUUrJ3d0LgdwkiwYkqevAdTWMS0QyJOUraScNyXAkkkm6QlVEJIaU3EVEYkgDh4lIchObVqGuBjg73KjlLiISQ0ruIiIxpOQuIhJDSu4iIjGk5C4iEkNK7iIiMaTkLiISQ0ruIiIxpOQuIhJDSu4iIjGk5C4iEkNK7iIiMaTkLiISQ0ruIiIxpOQuIhJDKSV3Mysys7fNrNDMCkLZ0Wb2spktD8/NQ7mZ2d1mtsLMFptZz0y+ABER2V9VWu793D3H3UvvpToOmOPunYA5YR7gXKBTeIwB7k1XsCIikpqadMsMA6aH6enAeQnlMzzyBtDMzNrUYD8iIlJFqSZ3B14yswVmNiaUtXb3VQDhuVUobwesTFi3OJTtw8zGmFmBmRWsW7euetGLiEhSqd5D9Qx3LzGzVsDLZvbuAepakjLfr8B9GjANIDc3d7/lIiJSfSm13N29JDyvBWYDvYE1pd0t4XltqF4MdEhYvT1Qkq6ARUSkcpUmdzM70syOKp0GBgJLgGeAvFAtD3g6TD8DjApnzfQBNpd234iIyMGRSrdMa2C2mZXW/6O7v2hmbwKPmdlo4BNgeKj/PDAYWAFsA65Me9QiInJAlSZ3d/8QOCVJ+XpgQJJyB65LS3QiIlItukJVRCSGlNxFRGJIyV1EJIaU3EVEYkjJXUQkhpTcRURiSMldRCSGlNxFRGJIyV1EJIaU3EVEYkjJXUQkhpTcRURiSMldRCSGlNxFRGJIyV1EJIaU3EVEYkjJXUQkhlK5zR4AZlYXKAA+dfehZtYRmAkcDSwELnf3L83sCGAGcCqwHhjh7kVpjzwuJjZNsd7mzMYhIrFSlZb7j4BlCfN3AlPcvROwERgdykcDG93968CUUE9ERA6ilJK7mbUHhgD3h3kD+gOzQpXpwHlheliYJywfEOqLiMhBkmrLfSpwI7AnzLcANrn7rjBfDLQL0+2AlQBh+eZQX0REDpJKk7uZDQXWuvuCxOIkVT2FZYnbHWNmBWZWsG7dupSCFRGR1KRyQPUM4DtmNhjIApoQteSbmVm90DpvD5SE+sVAB6DYzOoBTYEN5Tfq7tOAaQC5ubn7JX8RkZSkelICfKVOTKi05e7u4929vbtnAyOBV939UmAucFGolgc8HaafCfOE5a+6u5K3iMhBlPKpkEncBMw0s9uAt4AHQvkDwENmtoKoxT6yZiHWPtnjnku5blFWBgMRka+sKiV3d38NeC1Mfwj0TlJnBzA8DbGJiEg16QpVEZEYUnIXEYkhJXcRkRhSchcRiSEldxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRiqyfADIiIZk+owHhrCIzm13EVEYkjJXUQkhpTcRURiSMldRCSGlNxFRGJIyV1EJIaU3EVEYkjJXUQkhipN7maWZWbzzWyRmS01s1tCeUczm2dmy80s38wahPIjwvyKsDw7sy9BRETKS6Xl/i+gv7ufAuQAg8ysD3AnMMXdOwEbgdGh/mhgo7t/HZgS6omIyEFUaXL3yOdhtn54ONAfmBXKpwPnhelhYZ6wfICZWdoiFhGRSqXU525mdc2sEFgLvAx8AGxy912hSjHQLky3A1YChOWbgRZJtjnGzArMrGDdunU1exUiIrKPlJK7u+929xygPdAb6JysWnhO1kr3/Qrcp7l7rrvntmzZMtV4RUQkBVU6W8bdNwGvAX2AZmZWOqpke6AkTBcDHQDC8qbAhnQEKyIiqUnlbJmWZtYsTDcEzgGWAXOBi0K1PODpMP1MmCcsf9Xd92u5i4hI5qQynnsbYLqZ1SX6MnjM3Z81s3eAmWZ2G/AW8ECo/wDwkJmtIGqxj8xA3CIicgCVJnd3Xwz0SFL+IVH/e/nyHcDwtEQnIiLVoitURURiSMldRCSGdA9VEZGDYWLTFOttTsvu1HIXEYkhJXcRkRhSt4yISDVlj3su5bpFWRkMJAm13EVEYkjJXUQkhpTcRURiSMldRCSGlNxFRGKo1p0tk+rR6aJJQzIciYjI4UstdxGRGKp1LfeUHeRLfUVEDidquYuIxJCSu4hIDCm5i4jEkJK7iEgMpXKD7A5mNtfMlpnZUjP7USg/2sxeNrPl4bl5KDczu9vMVpjZYjPrmekXISIi+0ql5b4L+C937wz0Aa4zsy7AOGCOu3cC5oR5gHOBTuExBrg37VGLiMgBVZrc3X2Vuy8M01uBZUA7YBgwPVSbDpwXpocBMzzyBtDMzNqkPXIREalQlfrczSwb6AHMA1q7+yqIvgCAVqFaO2BlwmrFoaz8tsaYWYGZFaxbt67qkYuISIVSTu5m1hh4AvhPd99yoKpJyny/Avdp7p7r7rktW7ZMNQwREUlBSsndzOoTJfZH3P3JULymtLslPK8N5cVAh4TV2wMl6QlXRERSkcrZMgY8ACxz9/9JWPQMkBem84CnE8pHhbNm+gCbS7tvRETk4EhlbJkzgMuBt82sMJT9FJgEPGZmo4FPgOFh2fPAYGAFsA24Mq0Ri4hIpSpN7u7+Osn70QEGJKnvwHU1jEtERGpAV6iKiMSQkruISAwpuYuIxJCSu4hIDCm5i4jEkJK7iEgMKbmLiMSQkruISAwpuYuIxJCSu4hIDCm5i4jEkJK7iEgMKbmLiMSQkruISAwpuYuIxJCSu4hIDCm5i4jEUCr3UH3QzNaa2ZKEsqPN7GUzWx6em4dyM7O7zWyFmS02s56ZDF5ERJJLpeX+B2BQubJxwBx37wTMCfMA5wKdwmMMcG96whQRkaqoNLm7+1+BDeWKhwHTw/R04LyE8hkeeQNoZmZt0hWsiIikprp97q3dfRVAeG4VytsBKxPqFYey/ZjZGDMrMLOCdevWVTMMERFJJt0HVC1JmSer6O7T3D3X3XNbtmyZ5jBERL7aqpvc15R2t4TntaG8GOiQUK89UFL98EREpDqqm9yfAfLCdB7wdEL5qHDWTB9gc2n3jYiIHDz1KqtgZo8CZwPHmFkxcDMwCXjMzEYDnwDDQ/XngcHACmAbcGUGYhYRkUpUmtzd/ZIKFg1IUteB62oalIiI1IyuUBURiSEldxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRhSchcRiSEldxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRhSchcRiSEldxGRGFJyFxGJISV3EZEYUnIXEYkhJXcRkRjKSHI3s0Fm9p6ZrTCzcZnYh4iIVCztyd3M6gK/Bc4FugCXmFmXdO9HREQqlomWe29ghbt/6O5fAjOBYRnYj4iIVMDcPVr5lQQAAAnGSURBVL0bNLsIGOTuV4f5y4HT3P36cvXGAGPC7InAe2kNBI4BPkvzNjNBcaZXbYizNsQIijPdMhHnce7eMtmCemneEYAlKdvvG8TdpwHTMrD/KAizAnfPzdT200VxpldtiLM2xAiKM90OdpyZ6JYpBjokzLcHSjKwHxERqUAmkvubQCcz62hmDYCRwDMZ2I+IiFQg7d0y7r7LzK4H/gzUBR5096Xp3k8KMtblk2aKM71qQ5y1IUZQnOl2UONM+wFVERE59HSFqohIDCm5i4jEUK1O7qkMc2Bmd5rZkvAYkcFYHjSztWa2JKHsaDN72cyWh+fmFax7fXgNbmbHJJQ3N7PZZrbYzOabWbc0xNnBzOaa2TIzW2pmP6pirI+E93xJeM31MxGrmWWF7SwKcd4Syjua2bwQZ344aJ9s/RcT1v1duHIaMzvFzP5pZm+b2Z/MrElN4gzbrGtmb5nZs1WJMWH9Z8r93aQ9xrDdorDNQjMrCGWpfu5/MLOPwrqFZpYTytP9uTczs1lm9m74Gz29CjGamd1uZu+HdX+YiRiT7PfEhPel0My2mNl/php3xrh7rXwQHaz9ADgeaAAsArqUqzMEeJnowPGRQAHQJEPx9AV6AksSyu4CxoXpccCdFazbA8gGioBjEsp/Bdwcpk8C5qQhzjZAzzB9FPA+0TARqcY6mOhaBgMeBb6fiVjD9huH6frAPKAP8BgwMpT/rnT/SdZvkrCdJxLWeRP4Zpi+CvhFGt7TG4A/As+G+ZRiDMsvCOsm/t2kPcawrX3+vqr4N/oH4KIk5en+3KcDV4fpBkCzKsR4JTADqBPmW2UixkrirwusBo5LJe7wvp6dkVgy9SIz/QBOB/6cMD8eGF+uzk+AnyXMPwBcnMGYssv9k74HtAnTbYD3Kll/n38+4DngzIT5D4DWaY75aeBbVY011PsxcHumYwUaAQuB04iu8KuX7G+ggnXrA38CRoT5Lew9kaAD8E4NY2sPzAH6A88SfZmkFCPQGHid6Ms18e8mrTFW9PdVlb9RKk7uafvcgSbAR6WvvRoxzge+nskYU3gNA4G/pxo3GUzutblbph2wMmG+OJQlWgSca2aNQndHP/a9wCrTWrv7KoDw3KqK6y8iatlhZr2JWgPt0xWcmWUT/WqYV9VYQ3fM5cCLmYo1dHcUAmuJfoF9AGxy912hSrLPPHH9P4d1twKzQvES4Dthejg1/3uYCtwI7AnzLaoQ4y+AXwPbypWnO8ZSDrxkZgssGv4Dqva53x66NqaY2RGhLJ2f+/HAOuD3oZvrfjM7sgox/hswwswKzOwFM+uUgRgrM5LoFy1ViDsjanNyr3SYA3d/CXge+AfRG/5PYFeS9Q5Xk4DmIcH9AHiLNMVvZo2Juiv+0923VGMT/wf81d3/lqlY3X23u+cQ/SP2Bjonq3aA9b9N1GI6gqhlDVE3x3VmtoCoW+rL6sZnZkOBte6+ILE4lRhDn/XX3X12kvppi7GcM9y9J9GIrdeZWd8qrDueqEujF3A0cFMoT+fnXo+oa/Ned+8BfEHUnZGqI4AdHl3ifx/wYAZirFA4tvId4PFK6n27tH8+1L8/zM9La0CZ+DlwMB4k75a5GSgMj+8kWeePwOAMxpRNCt0yRBd4FQL3l1u/iHI/mxOWWVhe42MGRF0VfwZuqE6s4X1+itC3mclYy+3zJyTp8iDq5yz93G9Nsm4ecE+S8hOA+TWI6Q6ilnkRUT/rNuCRVGIEvk80LEdR2MaXwGvpjvEAsU8Exlb1bzQsO5twfCGdnzvwNaAoYf4soi6VlGIE3gWyE2LZfDD+NhO2PQx4KWH+kHbLpH2DB+tB9C3/IdCRvQdUu5arUxdoEaa7E/3crZfBmLLZN7n/in0PqNxVyfpF7Nvn3gxoEKavAWakIUYjOug0tVx5SrECVxP9EmpYrjytsQItgWZhuiHwN2AoUaso8WDlfyRZt3HCP1U9IB+4PsyXHmSrE96Hq9L02ZclvFRirOTvJu0xEp1QcFTC9D+AQVX43EvfTyPqipqUoc/9b8CJYXpiiC/VGCeVvlfh83gzEzEeIPaZwJUJ85XGjZJ7hW/mYKKzPT4A/jvJ8izgnfB4A8jJYCyPAquAnUQtsdFE/a9zgOXh+egK1v1hWGcXUWuutCVyelj3XeBJoHka4jyTqJtgMXtbkoOrEOuu8H6XrjshE7ESfRm/FeJckrCf44kOnK0gSqJHJFm3NdEZJ4uBpcD/srcl/aPwN/N+SAZWkzgT9nk2e5N7pTGWWzebfZN72mMMMS0Kj6Wl/y9V+NxfBd4On8XD7D2TKd2few7RWW2LiX4dNq9CjM2IWvpvE3XBnpKp/6Mk+24ErAeaJpRVGjcZTO4afkBEJIZq8wFVERGpgJK7iEgMKbmLiMSQkruISAwpuYuIxJCSu9RqZna+RaNpnpTm7V4WLrVfGkaXvN/MmqVzHyKZpOQutd0lRINvjUzXBs1sENGgaOe6e1eiS+L/QXT+fPm6ddO1X5F0UnKXWiuMj3MG0QVjIxPK65jZ/4VW97Nm9ryZXRSWnWpmfwmDZ/3ZzNok2fR/A2Pd/VMoG+PmQXd/L2yjyMwmmNnrwHAzyzGzN0JLf3bpuN1m9pqZ5YbpY8ysKExfYWZPWzTm/HtmdnPG3iT5ylJyl9rsPOBFd38f2GBmPUP5BURXfZ5MNFzC6VA2kuX/Eg1deyrRwFK3J9luV6Ihhg9kh7uf6e4ziYYIuMnduxNdHZlKsu4NXEp0Rebw0i8BkXRRcpfa7BKi8TwIz5eE6TOBx919j7uvBuaG8hOBbsDLYUS+n1HJ0K9mdnIYse8D2/dOXvlheVOiMXD+EsqnE924pTIvu/t6d99OdEn8mSmsI5Kyeoc6AJHqMLMWRMP4djMzJxokzs3sRpIPu0soX+rup1ey+aVE/exz3f1tIMfM7iEawKzUFymEuYu9DaiscsvKj/uhcUAkrdRyl9rqIqLR/Y5z92x370B0F58ziQ6wXhj63lsTDeoF0RCsLc2srJvGzLom2fYdwGQzS2zVN0xSD3ffDGw0s7NC0eVAaSu+CDg1Id5E3wr32GxI1L3091RetEiq1HKX2uoSohETEz0BfBe4DhhANILh+0R3mtrs7l+GA6t3h+6UekTD1y5N3Ii7P29mLYEXwtkwm8K2/lxBLHnA78ysEdEw1FeG8snAY2Z2OdGoioleBx4Cvg780d0LqvLiRSqjUSEllsyssbt/Hrpv5hPdhWj1oY4LorNlgFx3v/5QxyLxpZa7xNWz4aKjBsAvDpfELnKwqOUuIhJDOqAqIhJDSu4iIjGk5C4iEkNK7iIiMaTkLiISQ/8fzl2lEJMMOzsAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Create a dataframe with both exact and perturbed counts\n", "column_values = [age_ranges, values, perturbed_counts]\n", @@ -263,7 +488,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -304,7 +529,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -323,7 +548,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -345,9 +570,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The index of the first exact count that exceeds the threshold is: 105\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "print(\"The index of the first exact count that exceeds the threshold is: %i\\n\" % np.argmax(values >= threshold))\n", "\n", @@ -378,7 +634,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -396,9 +652,177 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "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", + "
Hit 1Hit 2Hit 3Hit 4
Trial 093101105108
Trial 198102108109
Trial 2105106107108
Trial 3105111113114
Trial 4105108109113
Trial 59199102105
Trial 6105107108109
Trial 799100105106
Trial 899107108109
Trial 994106107108
Trial 1097102105106
Trial 1199102105106
Trial 12102103106107
Trial 13103106107108
Trial 14107109111112
Trial 15103105108109
\n", + "
" + ], + "text/plain": [ + " Hit 1 Hit 2 Hit 3 Hit 4\n", + "Trial 0 93 101 105 108\n", + "Trial 1 98 102 108 109\n", + "Trial 2 105 106 107 108\n", + "Trial 3 105 111 113 114\n", + "Trial 4 105 108 109 113\n", + "Trial 5 91 99 102 105\n", + "Trial 6 105 107 108 109\n", + "Trial 7 99 100 105 106\n", + "Trial 8 99 107 108 109\n", + "Trial 9 94 106 107 108\n", + "Trial 10 97 102 105 106\n", + "Trial 11 99 102 105 106\n", + "Trial 12 102 103 106 107\n", + "Trial 13 103 106 107 108\n", + "Trial 14 107 109 111 112\n", + "Trial 15 103 105 108 109" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "TRIALS = 16\n", "cutoff = 4\n", @@ -431,7 +855,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -450,9 +874,211 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "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", + "
Hit 1Value 1Hit 2Value 2Hit 3Value 3
Trial 0105117.752289106103.770087107100.590660
Trial 19995.344043105115.415378107100.810423
Trial 210292.268623105117.773489106103.246022
Trial 3105117.368647108117.285285109125.616361
Trial 4105116.436048106100.938261107103.695056
Trial 5105118.238173106103.44900010799.705887
Trial 6105120.294029106105.127541108116.285994
Trial 710195.93945110293.248245105117.368042
Trial 89993.683904105117.149285106103.487716
Trial 910198.00902910295.096966105117.477554
Trial 109990.399927105110.171224106101.625567
Trial 1110296.211625105117.704346108117.283140
Trial 12105119.097207106104.017532107100.665739
Trial 13105117.149950106105.389668107100.011542
Trial 14105117.522155106104.450307108117.613179
Trial 15105116.351702106102.937711107100.708612
\n", + "
" + ], + "text/plain": [ + " Hit 1 Value 1 Hit 2 Value 2 Hit 3 Value 3\n", + "Trial 0 105 117.752289 106 103.770087 107 100.590660\n", + "Trial 1 99 95.344043 105 115.415378 107 100.810423\n", + "Trial 2 102 92.268623 105 117.773489 106 103.246022\n", + "Trial 3 105 117.368647 108 117.285285 109 125.616361\n", + "Trial 4 105 116.436048 106 100.938261 107 103.695056\n", + "Trial 5 105 118.238173 106 103.449000 107 99.705887\n", + "Trial 6 105 120.294029 106 105.127541 108 116.285994\n", + "Trial 7 101 95.939451 102 93.248245 105 117.368042\n", + "Trial 8 99 93.683904 105 117.149285 106 103.487716\n", + "Trial 9 101 98.009029 102 95.096966 105 117.477554\n", + "Trial 10 99 90.399927 105 110.171224 106 101.625567\n", + "Trial 11 102 96.211625 105 117.704346 108 117.283140\n", + "Trial 12 105 119.097207 106 104.017532 107 100.665739\n", + "Trial 13 105 117.149950 106 105.389668 107 100.011542\n", + "Trial 14 105 117.522155 106 104.450307 108 117.613179\n", + "Trial 15 105 116.351702 106 102.937711 107 100.708612" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "TRIALS = 2**4\n", "cutoff = 3\n", @@ -490,7 +1116,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -509,7 +1135,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -538,9 +1164,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The index of the greatest exact count is: 128\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "print(\"The index of the greatest exact count is: %i\\n\" % np.argmax(values))\n", "\n", @@ -563,9 +1220,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The greatest exact count is: 156\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "print(\"The greatest exact count is: %i\\n\" % np.max(values))\n", "\n", @@ -596,13 +1284,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "# Generate some synthetic data\n", "data = pd.DataFrame()\n", - "test_results = np.random.choice([\"Negative\", \"Positive\", \"N/A\"], size=10000, p=[0.55,0.35,0.1]) \n", + "test_results = np.random.choice([\"Negative\", \"Positive\", \"N/A\"], size=500, p=[0.55,0.35,0.1]) \n", "data[\"Test Result\"] = test_results\n", "\n", "# Compute a histogram representation of the data\n", @@ -610,11 +1298,13 @@ "hist = Histogram(data)\n", "real_database = hist.get_db()\n", "db_size = real_database.size\n", + "db_l1_norm = real_database.sum()\n", "\n", "# Specify the queries to be answered\n", "queries = [[{\"Test Result\": \"Negative\"}, {\"Test Result\": \"Positive\"}],\n", " [{\"Test Result\": \"Positive\"}, {\"Test Result\": \"N/A\"}],\n", " [{\"Test Result\": \"Negative\"}, {\"Test Result\": \"N/A\"}]]\n", + "num_queries = len(queries)\n", "queries = sps.vstack([hist.get_query_vector(q) for q in queries])\n", "\n", "# Compute the exact query responses\n", @@ -637,13 +1327,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "from relm.mechanisms import SmallDB\n", - "smalldb = SmallDB(epsilon=1.0, alpha=0.05)\n", - "synthetic_database = smalldb.release(values, queries, db_size)" + "mechanism = SmallDB(epsilon=1.0, alpha=0.1)\n", + "synthetic_database = mechanism.release(values, queries, db_size, db_l1_norm)" ] }, { @@ -655,15 +1345,173 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "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", + "
Query 0Query 1Query 2
Exact Responses0.9080000.4160000.676000
TRIAL 00.9066670.4166670.676667
TRIAL 10.9000000.4300000.670000
TRIAL 20.9100000.4166670.673333
TRIAL 30.8966670.4233330.680000
TRIAL 40.9066670.4166670.676667
TRIAL 50.9066670.4166670.676667
TRIAL 60.9100000.4166670.673333
TRIAL 70.9066670.4166670.676667
TRIAL 80.9066670.4166670.676667
TRIAL 90.9100000.4166670.673333
TRIAL 100.9133330.4100000.676667
TRIAL 110.9066670.4133330.680000
TRIAL 120.9066670.4166670.676667
TRIAL 130.9066670.4166670.676667
TRIAL 140.9033330.4233330.673333
TRIAL 150.9066670.4200000.673333
\n", + "
" + ], + "text/plain": [ + " Query 0 Query 1 Query 2\n", + "Exact Responses 0.908000 0.416000 0.676000\n", + "TRIAL 0 0.906667 0.416667 0.676667\n", + "TRIAL 1 0.900000 0.430000 0.670000\n", + "TRIAL 2 0.910000 0.416667 0.673333\n", + "TRIAL 3 0.896667 0.423333 0.680000\n", + "TRIAL 4 0.906667 0.416667 0.676667\n", + "TRIAL 5 0.906667 0.416667 0.676667\n", + "TRIAL 6 0.910000 0.416667 0.673333\n", + "TRIAL 7 0.906667 0.416667 0.676667\n", + "TRIAL 8 0.906667 0.416667 0.676667\n", + "TRIAL 9 0.910000 0.416667 0.673333\n", + "TRIAL 10 0.913333 0.410000 0.676667\n", + "TRIAL 11 0.906667 0.413333 0.680000\n", + "TRIAL 12 0.906667 0.416667 0.676667\n", + "TRIAL 13 0.906667 0.416667 0.676667\n", + "TRIAL 14 0.903333 0.423333 0.673333\n", + "TRIAL 15 0.906667 0.420000 0.673333" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "TRIALS = 2**4\n", "synthetic_responses = np.empty((TRIALS, queries.shape[0]))\n", "for i in range(TRIALS):\n", - " smalldb = SmallDB(epsilon=1.0, alpha=0.05)\n", - " synthetic_database = smalldb.release(values, queries, db_size)\n", + " mechanism = SmallDB(epsilon=1.0, alpha=0.1)\n", + " synthetic_database = mechanism.release(values, queries, db_size, db_l1_norm)\n", " synthetic_responses[i] = (queries @ synthetic_database) / synthetic_database.sum()\n", " \n", "df = pd.DataFrame(data=np.row_stack((values, synthetic_responses)),\n", @@ -672,13 +1520,6 @@ "\n", "display(df)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -697,7 +1538,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.7.6" } }, "nbformat": 4, diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index 44246de..c5b1e07 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -36,12 +36,15 @@ def privacy_consumed(self): else: return self.epsilon - def release(self, values, queries, db_size): + def release(self, values, queries, db_size, db_l1_norm): """ Releases differential private responses to queries. Args: + values: a numpy array of the exact query responses queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) + db_size: the number of bins in the histogram representation of the database + db_l1_norm: the number of records in the database Returns: A numpy array of perturbed values. @@ -73,7 +76,7 @@ def release(self, values, queries, db_size): breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) db = backend.small_db( - self.epsilon, l1_norm, db_size, sparse_queries, values, breaks + self.epsilon, l1_norm, db_size, db_l1_norm, sparse_queries, values, breaks ) self._is_valid = False diff --git a/src/lib.rs b/src/lib.rs index 9d1b8e4..c740685 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -129,6 +129,7 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { epsilon: f64, l1_norm: usize, size: u64, + db_l1_norm: u64, queries: &'a PyArray1, answers: &'a PyArray1, breaks: &'a PyArray1 @@ -138,7 +139,7 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { let breaks = breaks.to_vec().unwrap(); let breaks = breaks.iter().map(|&x| x as usize).collect(); - mechanisms::small_db(epsilon, l1_norm, size, queries, answers, breaks).to_pyarray(py) + mechanisms::small_db(epsilon, l1_norm, size, db_l1_norm, queries, answers, breaks).to_pyarray(py) } Ok(()) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 9893aa1..fd16dbf 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -135,32 +135,28 @@ pub fn permute_and_flip_mechanism( pub fn small_db( - epsilon: f64, l1_norm: usize, size: u64, queries: Vec, answers: Vec, breaks: Vec + epsilon: f64, l1_norm: usize, size: u64, db_l1_norm: u64, queries: Vec, answers: Vec, breaks: Vec ) -> Vec { // store the db in a sparse vector (implemented with a HashMap) let mut db: HashMap = HashMap::with_capacity(l1_norm); - let min_errors = answers.iter() - .map(|x| x * (l1_norm as f64)) - .map(|x| (x - x.round()).abs()); - let mut max_min_error: f64 = 0.0; - for (i, min_error) in min_errors.enumerate() { - if min_error > max_min_error { - max_min_error = min_error; - } - } - - let mut normalizer: f64 = -max_min_error; - loop { // sample another random small db random_small_db(&mut db, l1_norm, size); let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); - let utility = -error * (l1_norm as f64); - - let log_p = epsilon * (utility - normalizer); + // We need to account for the sensitivity of the normalized linear queries. + // In many definitions of differential privacy, the size of the database is assumed + // to be unknown. In that case, the sensitivity of a normalized linear query is 1.0. + // If we assume that size is known, however, then we can restrict our attention to + // databases of a given size. In that case, the sensitivity of a normalized linear + // query is 1.0/size. This yields much better utility. + let utility = -error * (db_l1_norm as f64); + + // Because the queries are all monotone, we don't need to scale the exponent + // by a multiplicative factor of 0.5 + let log_p = epsilon * utility; if samplers::bernoulli_log_p(log_p) { break } } diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 2e2f538..ff69133 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -225,85 +225,73 @@ def test_ReportNoisyMax(benchmark): def test_SmallDB(): - - size = 1000 - data = np.random.randint(0, 10, size) - queries = np.vstack([np.random.randint(0, 2, size) for _ in range(3)]) - - epsilon = 1 + db_size = 3 + data = np.random.randint(0, 1000, size=db_size) + db_l1_norm = data.sum() + num_queries = 3 + queries = np.vstack([np.random.randint(0, 2, db_size) for _ in range(num_queries)]) + values = queries.dot(data) / data.sum() + + epsilon = 1.0 alpha = 0.1 beta = 0.0001 errors = [] for _ in range(10): - mechanism = SmallDB(epsilon, data, alpha) - db = mechanism.release(queries) - errors.append( - abs(queries.dot(data) / data.sum() - queries.dot(db) / db.sum()).max() - ) + mechanism = SmallDB(epsilon, alpha) + db = mechanism.release(values, queries, db_size, db_l1_norm) + errors.append(abs(values - queries.dot(db) / db.sum()).max()) errors = np.array(errors) - x = np.log(len(data)) * np.log(len(queries)) / (alpha ** 2) + np.log(1 / beta) - error_bound = alpha + 2 * x / (epsilon * data.sum()) + x = (np.log(db_size) * np.log(num_queries) / (alpha ** 2)) + np.log(1 / beta) + error_bound = alpha + 2 * x / (epsilon * db_l1_norm) assert (errors < error_bound).all() - assert len(db) == size - assert db.sum() == int(len(queries) / (alpha ** 2)) + 1 + assert len(db) == db_size + assert db.sum() == int(queries.shape[0] / (alpha ** 2)) + 1 # input validation - mechanism = SmallDB(epsilon, data, 0.001) - _ = mechanism.release(np.ones((1, size))) - mechanism = SmallDB(epsilon, data, 0.001) - _ = mechanism.release(np.zeros((1, size))) - with pytest.raises(ValueError): - mechanism = SmallDB(epsilon, data, 0.001) - qs = np.ones((1, size)) - qs[0, 2] = -1 - _ = mechanism.release(qs) - - with pytest.raises(ValueError): - data_copy = data.copy() - data_copy[3] = -2 - _ = SmallDB(epsilon, data_copy, 0.001) - with pytest.raises(TypeError): - _ = SmallDB(epsilon, data.astype(np.int32), 0.001) + _ = SmallDB(epsilon, 1) - with pytest.raises(TypeError): - _ = SmallDB(epsilon, data, 1) + with pytest.raises(ValueError): + _ = SmallDB(epsilon, -0.1) with pytest.raises(ValueError): - _ = SmallDB(epsilon, data, -0.1) + _ = SmallDB(epsilon, 1.1) with pytest.raises(ValueError): - _ = SmallDB(epsilon, data, 1.1) + mechanism = SmallDB(epsilon, 0.001) + qs = np.ones((1, db_size)) + qs[0, 2] = -1 + _ = mechanism.release(values, qs, db_size, db_l1_norm) def test_SmallDB_sparse(): - - size = 1000 - data = np.random.randint(0, 10, size) - queries = np.vstack([np.random.randint(0, 2, size) for _ in range(3)]) + db_size = 3 + data = np.random.randint(0, 1000, size=db_size) + db_l1_norm = data.sum() + num_queries = 3 + queries = np.vstack([np.random.randint(0, 2, db_size) for _ in range(num_queries)]) queries = scipy.sparse.csr_matrix(queries) + values = queries.dot(data) / data.sum() - epsilon = 1 + epsilon = 1.0 alpha = 0.1 beta = 0.0001 errors = [] for _ in range(10): - mechanism = SmallDB(epsilon, data, alpha) - db = mechanism.release(queries) - errors.append( - abs(queries.dot(data) / data.sum() - queries.dot(db) / db.sum()).max() - ) + mechanism = SmallDB(epsilon, alpha) + db = mechanism.release(values, queries, db_size, db_l1_norm) + errors.append(abs(values - queries.dot(db) / db.sum()).max()) errors = np.array(errors) - x = np.log(len(data)) * np.log(queries.shape[0]) / (alpha ** 2) + np.log(1 / beta) - error_bound = alpha + 2 * x / (epsilon * data.sum()) + x = (np.log(db_size) * np.log(num_queries) / (alpha ** 2)) + np.log(1 / beta) + error_bound = alpha + 2 * x / (epsilon * db_l1_norm) assert (errors < error_bound).all() - assert len(db) == size + assert len(db) == db_size assert db.sum() == int(queries.shape[0] / (alpha ** 2)) + 1 From 8a2fa1bcad53e00099d6a953d69bf98093b3b034 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 27 Jan 2021 13:20:19 +1100 Subject: [PATCH 141/185] Removed some old redundant examples --- examples/crisper_smalldb.ipynb | 141 --------------- examples/dummy_smalldb.ipynb | 303 --------------------------------- 2 files changed, 444 deletions(-) delete mode 100644 examples/crisper_smalldb.ipynb delete mode 100644 examples/dummy_smalldb.ipynb diff --git a/examples/crisper_smalldb.ipynb b/examples/crisper_smalldb.ipynb deleted file mode 100644 index 8a129af..0000000 --- a/examples/crisper_smalldb.ipynb +++ /dev/null @@ -1,141 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import pandas as pd\n", - "from relm.histogram import Histogram\n", - "from relm.mechanisms import SmallDB\n", - "import numpy as np\n", - "from itertools import product\n", - "import scipy.sparse as sps" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fp = '20200811_QLD_dummy_dataset_individual_v2.xlsx'\n", - "df = pd.read_excel(fp)\n", - "# df.drop([\"NOTF_ID\", \"LGA\", \"HHS\"] + list(df.columns[12:]), axis=1, inplace=True)\n", - "df.drop(list(df.columns[1:6]) + list(df.columns[7:]), axis=1, inplace=True)\n", - "hist = Histogram(df)\n", - "real_database = hist.get_db()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from itertools import product\n", - "# _cols = [\"AGEGRP5\", \"SEX\", \"INDIG_STATUS\"]\n", - "queries = []\n", - "\n", - "# # this creates the queries for:\n", - "# # df.groupby([\"AGEGRP5\", \"SEX\", \"INDIG_STATUS\", col]).count()\n", - "# # where col is in [\"HOSPITALISED\", \"VENTILATED\", \"ICU\", \"DIED_OF_CONDITION\"]\n", - "# for col in [\"HOSPITALISED\", \"VENTILATED\", \"ICU\", \"DIED_OF_CONDITION\"]:\n", - "# cols = _cols + [col,]\n", - "# vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", - "# queries.extend(dict(zip(cols, val)) for val in vals)\n", - "\n", - "# # this creates the queries for:\n", - "# # df.groupby([\"ONSET_DATE\", \"AGEGRP5\", \"INDIG_STATUS\", \"SEX\"]).count()\n", - "# cols = [\"ONSET_DATE\", \"AGEGRP5\", \"INDIG_STATUS\", \"SEX\"]\n", - "# vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", - "# queries.extend(dict(zip(cols, val)) for val in vals)\n", - "\n", - "# this creates the queries for:\n", - "# df.groupby([\"ONSET_DATE\", \"POSTCODE\"]).count()\n", - "cols = [\"ONSET_DATE\", \"POSTCODE\"]\n", - "vals = product(*[list(hist.column_sets[hist.column_dict[c]]) for c in cols])\n", - "queries.extend(dict(zip(cols, val)) for val in vals)\n", - "\n", - "queries = sps.vstack([hist.get_query_vector(q) for q in queries])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "smalldb = SmallDB(epsilon=0.001, data=real_database, alpha=0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "synthetic_database = smalldb.release(queries)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "real_responses = (queries @ real_database)/real_database.sum()\n", - "synthetic_responses = (queries @ synthetic_database) / synthetic_database.sum()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(real_responses)\n", - "print(synthetic_responses)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "queries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/dummy_smalldb.ipynb b/examples/dummy_smalldb.ipynb deleted file mode 100644 index ad16e35..0000000 --- a/examples/dummy_smalldb.ipynb +++ /dev/null @@ -1,303 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import pandas as pd\n", - "from relm.histogram import Histogram\n", - "from relm.mechanisms import SmallDB\n", - "import numpy as np\n", - "from itertools import product\n", - "import scipy.sparse as sps" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.DataFrame()\n", - "test_results = np.random.choice([\"Negative\", \"Positive\", \"N/A\"], size=10000, p=[0.55,0.35,0.1]) \n", - "data[\"Test Result\"] = test_results\n", - "\n", - "hist = Histogram(data)\n", - "real_database = hist.get_db()\n", - "db_size = real_database.size" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from itertools import product\n", - "\n", - "queries = [[{\"Test Result\": \"Negative\"}, {\"Test Result\": \"Positive\"}],\n", - " [{\"Test Result\": \"Positive\"}, {\"Test Result\": \"N/A\"}],\n", - " [{\"Test Result\": \"Negative\"}, {\"Test Result\": \"N/A\"}]]\n", - "queries = sps.vstack([hist.get_query_vector(q) for q in queries])\n", - "\n", - "# queries = np.array([[1,1,0],\n", - "# [0,1,1],\n", - "# [1,0,1]])\n", - "# queries = sps.csr.csr_matrix(queries)\n", - "\n", - "values = (queries @ real_database)/real_database.sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "smalldb = SmallDB(epsilon=1.0, alpha=0.05)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "synthetic_database = smalldb.release(values, queries, db_size)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "TRIALS = 2**4\n", - "synthetic_responses = np.empty((TRIALS, queries.shape[0]))\n", - "for i in range(TRIALS):\n", - " smalldb = SmallDB(epsilon=1.0, alpha=0.05)\n", - " synthetic_database = smalldb.release(values, queries, db_size)\n", - " synthetic_responses[i] = (queries @ synthetic_database) / synthetic_database.sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Query 0Query 1Query 2
Real Responses0.9005000.4477000.651800
TRIAL 00.9008330.4458330.653333
TRIAL 10.9008330.4491670.650000
TRIAL 20.9016670.4475000.650833
TRIAL 30.9016670.4466670.651667
TRIAL 40.9008330.4475000.651667
TRIAL 50.8991670.4475000.653333
TRIAL 60.8966670.4516670.651667
TRIAL 70.9016670.4466670.651667
TRIAL 80.9008330.4475000.651667
TRIAL 90.9016670.4441670.654167
TRIAL 100.8983330.4491670.652500
TRIAL 110.9008330.4483330.650833
TRIAL 120.9016670.4475000.650833
TRIAL 130.9016670.4475000.650833
TRIAL 140.9008330.4475000.651667
TRIAL 150.9016670.4466670.651667
\n", - "
" - ], - "text/plain": [ - " Query 0 Query 1 Query 2\n", - "Real Responses 0.900500 0.447700 0.651800\n", - "TRIAL 0 0.900833 0.445833 0.653333\n", - "TRIAL 1 0.900833 0.449167 0.650000\n", - "TRIAL 2 0.901667 0.447500 0.650833\n", - "TRIAL 3 0.901667 0.446667 0.651667\n", - "TRIAL 4 0.900833 0.447500 0.651667\n", - "TRIAL 5 0.899167 0.447500 0.653333\n", - "TRIAL 6 0.896667 0.451667 0.651667\n", - "TRIAL 7 0.901667 0.446667 0.651667\n", - "TRIAL 8 0.900833 0.447500 0.651667\n", - "TRIAL 9 0.901667 0.444167 0.654167\n", - "TRIAL 10 0.898333 0.449167 0.652500\n", - "TRIAL 11 0.900833 0.448333 0.650833\n", - "TRIAL 12 0.901667 0.447500 0.650833\n", - "TRIAL 13 0.901667 0.447500 0.650833\n", - "TRIAL 14 0.900833 0.447500 0.651667\n", - "TRIAL 15 0.901667 0.446667 0.651667" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "df = pd.DataFrame(data=np.row_stack((values, synthetic_responses)),\n", - " columns=[\"Query %i\" % i for i in range(queries.shape[0])],\n", - " index=[\"Real Responses\"] + [\"TRIAL %i\" % i for i in range(TRIALS)])\n", - "\n", - "display(df)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3\n" - ] - } - ], - "source": [ - "print(db_size)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From 03c1052b777ebdc32c5948b17edba62853ca373d Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Wed, 27 Jan 2021 13:45:53 +1100 Subject: [PATCH 142/185] black formatting --- relm/histogram.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/relm/histogram.py b/relm/histogram.py index 30a82da..0e40b00 100644 --- a/relm/histogram.py +++ b/relm/histogram.py @@ -87,7 +87,9 @@ def get_query_vector(self, query): sub_idxs = np.array([self._get_idx(sub_query)]) for i, col in enumerate(self.column_dict.keys()): if sub_query.get(col, None) is None: - new_sub_idxs = np.arange(len(self.column_sets[i])) * self.column_incr[i] + new_sub_idxs = ( + np.arange(len(self.column_sets[i])) * self.column_incr[i] + ) sub_idxs = sub_idxs[:, None] + new_sub_idxs[None, :] sub_idxs = sub_idxs.flatten() @@ -114,6 +116,7 @@ def get_db(self): db[self.idxs] = self.vals return db + class ObliviousHistogram(Histogram): def __init__(self, column_dict, column_sets, column_incr, db_size): self.column_dict = column_dict From e85dc610273c8ff9097cf13c2df98d8d28fb9ddc Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 28 Jan 2021 13:48:37 +1100 Subject: [PATCH 143/185] Added a subroutine to compute an upper bound for max_utility in SmallDB --- src/mechanisms.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/mechanisms.rs b/src/mechanisms.rs index fd16dbf..221150c 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -141,22 +141,42 @@ pub fn small_db( // store the db in a sparse vector (implemented with a HashMap) let mut db: HashMap = HashMap::with_capacity(l1_norm); + // Implement the "sample-and-flip" exponential mechanism with a sampler + // that generates random small databases on demand rather than generating + // a list of all small databases and picking random elements from that list.a + + // Unfortunately, we don't know the max_utility ahead of time. + // Instead, we compute a crude bound for the max_utility based on the + // coarse resolution of the probabilities created by integer counts + // in the bins of the small database histograms. + let mut min_rounding_error: f64 = 0.5; + let n = answers.len(); + for i in 0..n { + let temp = (answers[i] * (l1_norm as f64)); + let rounding_error = (temp - temp.round()).abs() / (l1_norm as f64); + if rounding_error < min_rounding_error{ + min_rounding_error = rounding_error; + } + } + + let max_utility = -min_rounding_error; + loop { // sample another random small db random_small_db(&mut db, l1_norm, size); let error = small_db_max_error(&db, &queries, &answers, &breaks, l1_norm); + let utility = -error; + // We need to account for the sensitivity of the normalized linear queries. // In many definitions of differential privacy, the size of the database is assumed // to be unknown. In that case, the sensitivity of a normalized linear query is 1.0. // If we assume that size is known, however, then we can restrict our attention to // databases of a given size. In that case, the sensitivity of a normalized linear // query is 1.0/size. This yields much better utility. - let utility = -error * (db_l1_norm as f64); - - // Because the queries are all monotone, we don't need to scale the exponent + // Also, because the queries are all monotone, we don't need to scale the exponent // by a multiplicative factor of 0.5 - let log_p = epsilon * utility; + let log_p = epsilon * (db_l1_norm as f64) * (utility - max_utility); if samplers::bernoulli_log_p(log_p) { break } } From a9436e66227dbf5c1400065733c71394ed744c33 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 29 Jan 2021 12:48:58 +1100 Subject: [PATCH 144/185] Modified `PrivateMultiplicativeWeights` to remove need for data access --- examples/relm_demo.ipynb | 702 +++++++++++++++------------ relm/mechanisms/data_perturbation.py | 59 +-- tests/test_mechanisms.py | 33 +- 3 files changed, 434 insertions(+), 360 deletions(-) diff --git a/examples/relm_demo.ipynb b/examples/relm_demo.ipynb index 6a231ba..82fbb5a 100644 --- a/examples/relm_demo.ipynb +++ b/examples/relm_demo.ipynb @@ -110,59 +110,59 @@ "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238240.69964600-9238251.031088
110-19386389.346272110-19386377.839711
220-29688703.319253220-29688690.458008
330-39779785.929981330-39779778.062103
440-49621607.201483440-49621620.090036
550-59582576.704968550-59582579.223553
660-69344366.029920660-69344291.545413
770+261266.907717770+261259.537919
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -170,7 +170,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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0atXL8aM2d4h8MILL/Cxj32M4447jv79+/P2229z4403MnnyZCorK5k8eccbcd15552MHDmSk046CUj6pS+66CI6d+7MG2+8wfnnn0+fPn048cQTmT9/PgBjx45l/Pjx29bRu3dvli9fzvLly+nRowdf/OIX6dWrF4MGDWLTpk08/PDDzJkzh4svvpjKyko2bdrE6NGj6dmzJ3369OHaa68t635sDrfczaxZNm3aRGVl5bbX119/PZ/5zGe44447GDVqFFdffTVvvvkmX/ziFwEYN24c7du357333mPgwIHMnz+fY445hs985jNMnjyZfv36sX79etq2bcu3v/1t5syZwx133LHTdhcsWMDIkSN3KgcYM2YMffv25bHHHuPXv/41n//85xv9dbFkyRIeeughfvzjH/PpT3+aRx55hEsuuYQ77riD8ePHU1VVxRtvvMGjjz7KK6+8giTeeuutpu62snNyN7Nmqa9b5hOf+AQ///nPufLKK3nppZe2lU+ZMoUJEyZQU1PDqlWrePnll5FEly5d6NevHwDt2rVrVkzPPfccjzzyCABnnHEG69at4+23G+6K69at27YvqY9+9KMsX758pzrt2rWjdevWXH755QwZMoRzzz23WXGWk7tlzKwstm7dyqJFi2jTpg1vvPEGAMuWLWP8+PHMmDGD+fPnM2TIEDZv3kxEFH26X69evZg7d27eefluQiSJli1bsnXr9ptn5Z47vs8++2ybbtGiBTU1NTuto2XLlsyePZsLL7yQxx57jMGDBxcV867k5G5mZXHrrbfSo0cPHnroIS699FLeffdd1q9fz7777ssBBxzA6tWrefrppwE45phjWLlyJS+88AIAGzZsoKamhv33358NGzbkXf9VV13FxIkTmTVr1ray+++/n9dff50BAwbwwAMPADBz5kw6duxIu3btqKio4MUXXwTgxRdfZNmyZY2+j9wYNm7cyNtvv80555zDbbfdVrYDyaXgbhmzDCnk1MVSq9vnPnjwYC699FLuvvtuZs+ezf7778+AAQP47ne/y0033UTfvn3p1asXRx55JCeffDIArVq1YvLkyXz1q19l06ZNtGnThunTp/Pxj3+cm2++mcrKym19+bU6d+7MpEmTuPbaa1mzZg177bUXAwYM4IILLmDs2LF84QtfoE+fPrRt25aJE5MxDi+88ELuu+8+Kisr6devH0cddVSj72/UqFF8+ctfpk2bNjz99NMMHTp026+NW2+9tbQ7s4R2i3uoVlVVhW/WYfXxqZD1W7RoET169Hi/w7BdIN9nLWluRFTlq+9uGTOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczyyCf526WJWMPKPH6Gj9ltHbI35qaGnr06MHEiRMLHpVx+fLl/OEPf+Czny3wFNYcFRUVzJkzh44dOxa9bEPLb9y4kW9+85tMnz6d1q1b06FDB77//e9zwgknNGk7+TQ2lHEpuOVuZs1SO7bMggULaNWqFXfddVdBy9XU1LB8+XIefPDBorf53nvlu//P5ZdfTvv27VmyZAkLFy7k3nvv5R//+EdJtzFv3jyeeuqpkq6zLid3MyuZU089laVLl/LOO+9w6aWX0q9fP/r27cvjjyd34bz33nsZNmwYn/zkJxk0aBCjR4/m2WefpbKykltvvZV7772Xq666atv6zj33XGbOnAnAfvvtx4033sgJJ5zA888/D8D3v/99+vfvT//+/Vm6dCkAa9eu5cILL6Rfv37069eP3//+9wCsW7eOQYMG0bdvX770pS/lHX/m1VdfZdasWXz3u99lr72S9HjkkUcyZEhy5e8tt9xC79696d27N7fddhuQ/Pro3bv3tnWMHz+esWPHAnD66adz3XXX0b9/f4466iieffZZ/vWvf+00lPFvf/tbKisrqayspG/fvvUOuVAMd8uYWUnU1NTw9NNPM3jwYMaNG8cZZ5zBPffcw1tvvUX//v0588wzAXj++eeZP38+7du3Z+bMmYwfP54nnngCSJJ/fd555x169+7Nt7/97W1l7dq1Y/bs2dx3331cc801PPHEE1x99dV8/etf55RTTmHFihWcddZZLFq0iJtuuolTTjmFG2+8kSeffJIJEybstI2FCxdSWVlJixYtdpo3d+5cfvrTnzJr1iwighNOOIHTTjuNgw46qNH9Mnv2bJ566iluuukmpk+fvtNQxp/85Ce58847Ofnkk9m4cSOtW7dudH83ptHkLuloIHeU/COBG4H70vIKYDnw6Yh4M13meuAy4D3gaxHxq2ZHama7pdyxZU499VQuu+wyPvaxjzF16tRtN8bYvHkzK1asAJKhgNu3b1/0dlq0aMGFF164Q9mIESO2PX/9618HYPr06bz88svb6qxfv54NGzbw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\n", "text/plain": [ "
" ] @@ -247,59 +247,59 @@ "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923823600-9238232
110-19386356110-19386386
220-29688697220-29688688
330-39779768330-39779785
440-49621604440-49621599
550-59582581550-59582592
660-69344345660-69344361
770+261286770+261256
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -307,7 +307,7 @@ }, { "data": { - "image/png": "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FOvXr097cu/WrVutS+4aOExE0q60tJQjjjiCjz/+GIALL7yQBx54AICf/OQn5Obm0rVrV266aXuHwLvvvssPf/hDjj76aHr16kVpaSljx44lPz+fnJwc8vPzd9jHvffeS15eHscffzwQ9Uufd955tG7dmtWrV3PWWWfRvXt3evfuzbx58wC4+eabGT9+fPk2unXrRlFREUVFRXTu3JmrrrqKrl27MmDAADZu3Mi0adMoKCjg4osvJicnh40bNzJ69Gi6dOlC9+7dGTVqFPsqtdxFpEY2btxITk5O+fyYMWO44IILuOeee7jsssv4+c9/zpo1a7jqqqsAuP322znwwAPZunUr/fv3Z968eRx55JFccMEF5Ofn07NnT9atW0ejRo249dZbKSgo4J577tlpv/PnzycvL2+ncoCbbrqJY445hmeeeYbXX3+d4cOHV/nrYtGiRTz++OM88MADnH/++Tz11FNccskl3HPPPYwfP57c3FxWr17N9OnT+eijjzAz1q5dW4N3LrOU3CVebm6aYj3d4jNdKuuWOfXUU3nyySe55pprmDt3bnn5E088waRJk9iyZQtLly7lww8/xMxo06YNPXv2BKBJkyY1iuntt9/mqaei+5n369ePVatWUVq668+8Y8eO5V9Sxx57LEVFRTvVadKkCVlZWVx55ZUMHjyYM844o0ZxZpK6ZUQkI7Zt28bChQtp2LAhq1dHl7p8/vnnjB8/nhkzZjBv3jwGDx7Mpk2bcPdqn+7XtWtX5sypeK/uSLKzr82MevXqsW3btvKyxHPH99tvv/LpunXrsmXLzvdOr1evHrNnz+bcc8/lmWeeYeDAgdWKeU9ScheRjJgwYQKdO3fm8ccf54orrmDz5s2sW7eO/fffn6ZNm7J8+XJeeuklAI488khKSkp49913AVi/fj1btmzhgAMOYP369Um3f+211zJ58mRmzZpVXvboo4+ybNky+vTpw2OPPQbAG2+8wUEHHUSTJk3Izs7mvffeA+C9997j888/r/J1JMbwzTffUFpayqBBg5g4cWLGDiSng7plRGJkb5wtVLHPfeDAgVxxxRU8+OCDzJ49mwMOOIA+ffpw2223ccstt3DMMcfQtWtXDj30UE444QQAGjRoQH5+Pj/96U/ZuHEjDRs25LXXXqNv376MGzeOnJyc8r78Mq1bt2bq1KmMGjWKFStWUKdOHfr06cM555zDzTffzOWXX0737t1p1KgRkydHYxmee+65TJkyhZycHHr27Mnhhx9e5eu77LLLuPrqq2nYsCEvvfQSQ4YMKf+1MWHChDS/m+mzT9xDNTc313WzDqlMtU6FzErxntUx6XNfuHAhnTt33tthyB6Q7LM2sznunpusvrplRERiSMldRCSGlNxFRGJIyV1EJIaU3EVEYkjJXUQkhnSeu0icpDr8Qsrbq/qU0bIhf7ds2ULnzp2ZPHlytUZlnDhxIiNHjqz2SI4333wzjRs33u3Bu3a1/pQpU7jrrrtwd9ydK664Iu2DhP32t7/ll7/8ZVq3mUgtdxGpkbKxZebPn0+DBg24//77U15369atTJw4kQ0bNlRrn8mGBkiXl156iYkTJ/LKK6+wYMEC3nvvPZo2TfOXJlFyzyQldxFJm5NOOonFixcD0VAAvXr1Iicnhx//+Mds3boVgMaNGzN27FiOO+44br/9dkpKSujbty99+/YtX15m2rRpXHbZZUB0peh1111H3759ufHGGwGYO3cu/fr1o1OnTuVDCgP87ne/o2fPnnTv3n2HYYVvv/12jjjiCE455ZTy4YgruuOOOxg/fnz5+O1ZWVnlI1oWFhbSu3dvunfvztlnn82aNWsAOPnkkym7EPPrr78mOzsbiMaCP+eccxg4cCCdOnXihhtuAGD06NHlV/ZefPHFfPvttwwePJijjz6abt267TS88e5QcheRtNiyZQsvvfQSRx11FAsXLiQ/P5+///3vFBYWUrdu3fKxXr799lu6devGrFmzGDt2LG3btmXmzJnMnDmzyn188sknvPbaa/z+978HYN68ebzwwgv885//5NZbb6WkpIRXXnmFRYsWMXv2bAoLC5kzZw5vvvkmc+bMYerUqbz//vs8/fTT5ePYVDR//nyOPfbYpMuGDx/OnXfeybx58zjqqKO45ZZbqoy5sLCQ/Px8PvjgA/Lz81myZAnjxo0r/8Xz2GOP8fLLL9O2bVvmzp3L/Pnz0zIgWZV97mZ2BJD4NXIoMBaYEsqzgSLgfHdfE26i/QdgELABuMzd36txpCKyT0ocW+akk05ixIgRTJo0iTlz5pQP4btx40ZatWoFRH3055577m7ta+jQodStW7d8fsiQITRs2JCGDRvSt29fZs+ezdtvv80rr7zCMcccA0SDfS1atIj169dz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\n", + "image/png": "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w4dzxhln8OUvf5l//ud/5tlnn2XLli1cfPHFjB07FoBnn32Wa6+9ls2bN7Pffvsxc+ZMbrrpJrZs2cLTTz/N6NGj+dznPrdjGz/60Y8YMWIEJ598MpD0S1988cUAvP7661x++eX85S9/oW3btkycOJE+ffowZswY2rVrx/XXXw9A7969efTRRwE455xzGDBgAM888wxdu3Zl+vTpPPbYY1RXV3PppZfSpk0b5s6dy9ixY5kxYwYtW7Zk0KBBTJgwYXfu2oLtEWPLmNnea8uWLVRWVu54XZeE77jjDkaOHMm1117LG2+8wZe//GUAxo0bR4cOHXj33Xc588wzeeGFFzj22GP53Oc+x9SpU+nXrx8bNmygbdu2fPvb36a6upo77rhjp+0uWrSIESNG7FQOcPPNN9O3b18eeeQRfvOb3/DFL36xyV8Xy5Yt44EHHuAnP/kJn/3sZ3nooYe47LLLuOOOO5gwYQJVVVW8/vrrPPzww7z44otI4s0332zubis7J3cz2yUNdct86lOf4he/+AVXX301zz///I7yadOmMXHiRGpra1m9ejVLlixBEl26dKFfv34AtG/ffpdievrpp3nooYcAOOOMM1i/fj1vvdV4V1z37t13fEmdeOKJrFy5cqc67du3p3Xr1lx55ZUMGTKE8847b5fiLCePLWNmZbF9+3aWLl1KmzZteP311wFYsWIFEyZMYPbs2bzwwgsMGTKErVu3EhFFn+7Xq1cvFixYkHdevpsQSaJly5Zs3/7ezbNyzx3fb7/9dky3aNGC2trandbRsmVL5s+fz0UXXcQjjzzC4MGDi4p5d3JyN7OyuPXWWznuuON44IEHuPzyy3nnnXfYsGED+++/PwceeCBr1qzhiSeeAODYY49l1apVPPvsswBs3LiR2tpaDjjgADZu3Jh3/ddccw2TJ09m3rx5O8ruvfdeXnvtNQYOHMh9990HwJw5c+jYsSPt27enoqKC5557DoDnnnuOFStWNPk+cmPYtGkTb731Fueeey633XZb2Q4kl4K7ZcwypJBTF0utfp/74MGDufzyy7nrrruYP38+BxxwAAMHDuS73/0uY8eOpW/fvvTq1YujjjqKU045BYBWrVoxdepUvva1r7FlyxbatGnDrFmz+OQnP8n48eOprKzc6YBq586dmTJlCtdffz1r165ln332YeDAgVx44YWMGTOGL33pS/Tp04e2bdsyefJkAC666CLuueceKisr6devH0cffXST72/kyJF89atfpU2bNjzxxBMMHTp0x6+NW2+9tbQ7s4T2iHuoVlVVhW/WYQ0p7myZzxdWMSOnQi5dupTjjjvugw7DdoN8n7WkBRFRla++u2XMzDLIyd3MLIOc3M3MMsjJ3cwsg5zczcwyyMndzCyDfJ67WZYUOipmwetr+pTRuiF/a2trOe6445g8eXLBozKuXLmSZ555hs9/vsBTWHNUVFRQXV1Nx44di162seU3bdrEN7/5TWbNmkXr1q055JBD+P73v89JJ53UrO3k09RQxqXglruZ7ZK6sWUWLVpEq1atuPPOOwtarra2lpUrV3L//fcXvc133y3fKOJXXnklHTp0YNmyZSxevJhJkybx97//vaTbWLhwIY8//nhJ11mfk7uZlcypp57K8uXL2bx5M5dffjn9+vWjb9++TJ+e3Mtn0qRJXHLJJXz6059m0KBBjBo1iqeeeorKykpuvfVWJk2axDXXXLNjfeeddx5z5swBoF27dtx0002cdNJJzJ07F4Dvf//79O/fn/79+7N8+XIA1q1bx0UXXUS/fv3o168f//u//wvA+vXrGTRoEH379uUrX/lK3vFnXn75ZebNm8d3v/td9tknSY9HHXUUQ4YkV/7ecsst9O7dm969e3PbbbcBya+P3r1771jHhAkTGDNmDACnn346N9xwA/379+foo4/mqaee4h//+Ac33XQTU6dOpbKykqlTp/K73/2OyspKKisr6du3b4NDLhTD3TJmVhK1tbU88cQTDB48mHHjxnHGGWdw99138+abb9K/f3/OOussAObOncsLL7xAhw4dmDNnDhMmTNgxpvqkSZMaXP/mzZvp3bs33/72t3eUtW/fnvnz53PPPfdw3XXX8eijj3Lttdfy9a9/nQEDBvDKK69w9tlns3TpUsaOHcuAAQO46aabeOyxx5g4ceJO21i8eDGVlZW0aNFip3kLFizgZz/7GfPmzSMiOOmkkzjttNM4+OCDm9wv8+fP5/HHH2fs2LHMmjVrp6GMP/3pT/OjH/2IU045hU2bNtG69a7fmMDJ3cx2Se7YMqeeeipXXHEF//RP/8SMGTN23Mhi69atvPLKK0AyFHCHDh2K3k6LFi246KKL3lc2fPjwHc9f//rXAZg1axZLlizZUWfD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\n", "text/plain": [ "
" ] @@ -385,59 +385,59 @@ "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923822800-9238220
110-19386414110-19386380
220-29688683220-29688664
330-39779780330-39779813
440-49621620440-49621629
550-59582572550-59582598
660-69344396660-69344406
770+261271770+261253
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -445,7 +445,7 @@ }, { "data": { - "image/png": "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fvrpuDtPPPEEW7duTXty79atW61L7ho4TETSbvPmzZx44om89957AFxyySXcd999AHz/+98nNzeXrl27cvPNezsE3nzzTb7xjW9wyimn0Lt3bzZv3syECRPIz88nJyeH/Pz8ffbx29/+lry8PE4//XQg6pe+6KKLaN26NRs2bOC8886je/fu9OnTh8WLFwMwceJEJk+eXLaNbt26UVRURFFREZ07d+aaa66ha9euDBw4kO3btzNr1iwKCgq49NJLycnJYfv27YwbN44uXbrQvXt3xo4dy+FKLXcRqZHt27eTk5NTNj9+/HhGjBjBPffcwxVXXMGPfvQjNm7cyDXXXAPA7bffztFHH83u3bsZMGAAixcv5qSTTmLEiBHk5+fTq1cvtmzZQqNGjbj11lspKCjgnnvu2W+/S5YsIS8vb79ygJtvvpkePXrw1FNP8eqrrzJq1KhKf10sX76cRx99lPvuu4+LL76YJ554gssuu4x77rmHyZMnk5uby4YNG5g9ezbvvvsuZsamTZtq8M5llpK7iNRIRd0y3/rWt3j88ce57rrrWLRoUVn5Y489xrRp09i1axerVq3inXfewcxo06YNvXr1AqBJkyY1iun111/niSei+5n379+f9evXs3nzgbviOnbsWPYldeqpp1JUVLRfnSZNmpCVlcXVV1/NkCFDGDp0aI3izCR1y4hIRuzZs4dly5bRsGFDNmyILnX56KOPmDx5MnPmzGHx4sUMGTKEHTt24O5VPt2va9euLFhQ/l7dkWRnX5sZ9erVY8+ePWVlieeOH3HEEWXTdevWZdeu/e+dXq9ePebPn8+FF17IU089xaBBg6oU88Gk5C4iGTFlyhQ6d+7Mo48+ylVXXcXOnTvZsmULRx55JE2bNmXNmjW88MILAJx00kmUlJTw5ptvArB161Z27drFUUcdxdatW5Nu//rrr2f69OnMmzevrOzhhx9m9erV9O3bl0ceeQSA1157jWOOOYYmTZqQnZ3NwoULAVi4cCEfffRRpa8jMYbPP/+czZs3M3jwYKZOnZqxA8npoG4ZkRhJ5dTFdCvf5z5o0CCuuuoq7r//fubPn89RRx1F3759ue2227jlllvo0aMHXbt25fjjj+eMM84AoEGDBuTn5/ODH/yA7du307BhQ1555RX69evHpEmTyMnJKevLL9W6dWtmzpzJ2LFjWbt2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\n", + "image/png": "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mDx5MlVVVSxatIinnnqKRYsW8e6773LppZfywx/+kIULFzJ79mz23XdfbrrpJi699FKqq6u59NJLd9ju4sWLOeGEE/LGNHHiRAYMGMCiRYv43ve+xxe/+MW89XItX76csWPHsmTJEg488EAefPBBLrnkEiorK7n33nuprq5m8+bNPPTQQyxZsoRFixbxrW/tuTegarJbJiL+LulmYDXJzQSeiIgnJHVJb+BLRKyVdEi6yGEk9+CsU5OW7UDSVcBVAIcffnjz3oWZfWga6pb59Kc/za9+9SvGjh3LwoULt5fPnDmTqVOnUltby9q1a3nhhReQRNeuXRk4cCAAHTp0aFZMzzzzDA8++CAAZ555Jhs3buSNNxrviuvZsycVFRUAnHDCCaxatWqnOh06dKBt27ZceeWVDBs2jPPPP79ZcZZTId0yB5G0xnsChwL7Svp8Y4vkKdvpjiARMTUiKiOisnPnvCNWmlkLtm3bNpYuXUq7du149dVXAVi5ciU333wzc+bMYdGiRQwbNowtW7YQEUWf7te3b18WLFiQd16+mxBJonXr1mzb9sHNs3LPHd9nn322T7dq1Yra2tqd1tG6dWvmz5/PxRdfzG9+8xuGDh1aVMy7UyHdMmcDKyNiQ0S8B/wa+CSwTlJXgPR5fVq/Buies3w3km4cM/sIufXWW+nduzf3338/l19+Oe+99x5vvvkm++67LwcccADr1q3j8ccfB+CYY45hzZo1PPfccwC89dZb1NbWsv/++/PWW2/lXf/VV1/NtGnTmDdv3vayX/7yl7zyyisMHjyYe++9F4C5c+fSqVMnOnToQI8ePXj++ecBeP7551m5cmWT7yM3hk2bNvHGG29w3nnncdttt5XtQHIpFHK2zGrgJEntSbplzgKqgLeB0cCU9PnhtP4s4D5Jt5C09HsB80sct5nlUcipi6VW1+deZ+jQoVx++eXcddddzJ8/n/3335/Bgwfz3e9+lxtvvJEBAwbQt29fjjzySE455RQA2rRpw4wZM/ja177G5s2badeuHbNnz+ZTn/oUU6ZMoaKiggkTJuzQ796lSxemT5/Otddey/r169lrr70YPHgwF110EZMmTeJLX/oS/fv3p3379kyblhwevPjii/nFL35BRUUFAwcO5Kijjmry/Y0ZM4avfvWrtGvXjscff5zhw4dv/7Vx6623lnZnllBB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\n", "text/plain": [ "
" ] @@ -584,7 +584,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 12, @@ -593,7 +593,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -685,84 +685,84 @@ " \n", " \n", " Trial 0\n", - " 93\n", - " 101\n", " 105\n", + " 107\n", " 108\n", + " 109\n", " \n", " \n", " Trial 1\n", - " 98\n", - " 102\n", + " 106\n", + " 107\n", " 108\n", " 109\n", " \n", " \n", " Trial 2\n", + " 99\n", + " 102\n", " 105\n", " 106\n", - " 107\n", - " 108\n", " \n", " \n", " Trial 3\n", - " 105\n", - " 111\n", - " 113\n", - " 114\n", + " 101\n", + " 106\n", + " 107\n", + " 108\n", " \n", " \n", " Trial 4\n", + " 99\n", + " 101\n", " 105\n", - " 108\n", - " 109\n", - " 113\n", + " 107\n", " \n", " \n", " Trial 5\n", - " 91\n", - " 99\n", " 102\n", " 105\n", + " 106\n", + " 107\n", " \n", " \n", " Trial 6\n", + " 99\n", + " 101\n", " 105\n", - " 107\n", - " 108\n", - " 109\n", + " 106\n", " \n", " \n", " Trial 7\n", - " 99\n", - " 100\n", + " 98\n", " 105\n", - " 106\n", + " 108\n", + " 109\n", " \n", " \n", " Trial 8\n", - " 99\n", + " 105\n", + " 106\n", " 107\n", " 108\n", - " 109\n", " \n", " \n", " Trial 9\n", - " 94\n", + " 97\n", + " 101\n", " 106\n", - " 107\n", " 108\n", " \n", " \n", " Trial 10\n", - " 97\n", - " 102\n", + " 99\n", " 105\n", - " 106\n", + " 107\n", + " 108\n", " \n", " \n", " Trial 11\n", - " 99\n", + " 101\n", " 102\n", " 105\n", " 106\n", @@ -771,27 +771,27 @@ " Trial 12\n", " 102\n", " 103\n", - " 106\n", - " 107\n", + " 105\n", + " 108\n", " \n", " \n", " Trial 13\n", - " 103\n", - " 106\n", + " 105\n", " 107\n", " 108\n", + " 109\n", " \n", " \n", " Trial 14\n", - " 107\n", - " 109\n", - " 111\n", - " 112\n", + " 99\n", + " 101\n", + " 105\n", + " 106\n", " \n", " \n", " Trial 15\n", - " 103\n", " 105\n", + " 106\n", " 108\n", " 109\n", " \n", @@ -801,22 +801,22 @@ ], "text/plain": [ " Hit 1 Hit 2 Hit 3 Hit 4\n", - "Trial 0 93 101 105 108\n", - "Trial 1 98 102 108 109\n", - "Trial 2 105 106 107 108\n", - "Trial 3 105 111 113 114\n", - "Trial 4 105 108 109 113\n", - "Trial 5 91 99 102 105\n", - "Trial 6 105 107 108 109\n", - "Trial 7 99 100 105 106\n", - "Trial 8 99 107 108 109\n", - "Trial 9 94 106 107 108\n", - "Trial 10 97 102 105 106\n", - "Trial 11 99 102 105 106\n", - "Trial 12 102 103 106 107\n", - "Trial 13 103 106 107 108\n", - "Trial 14 107 109 111 112\n", - "Trial 15 103 105 108 109" + "Trial 0 105 107 108 109\n", + "Trial 1 106 107 108 109\n", + "Trial 2 99 102 105 106\n", + "Trial 3 101 106 107 108\n", + "Trial 4 99 101 105 107\n", + "Trial 5 102 105 106 107\n", + "Trial 6 99 101 105 106\n", + "Trial 7 98 105 108 109\n", + "Trial 8 105 106 107 108\n", + "Trial 9 97 101 106 108\n", + "Trial 10 99 105 107 108\n", + "Trial 11 101 102 105 106\n", + "Trial 12 102 103 105 108\n", + "Trial 13 105 107 108 109\n", + "Trial 14 99 101 105 106\n", + "Trial 15 105 106 108 109" ] }, "metadata": {}, @@ -910,146 +910,146 @@ " \n", " Trial 0\n", " 105\n", - " 117.752289\n", - " 106\n", - " 103.770087\n", - " 107\n", - " 100.590660\n", + " 117.262669\n", + " 108\n", + " 123.009376\n", + " 109\n", + " 125.388963\n", " \n", " \n", " Trial 1\n", - " 99\n", - " 95.344043\n", " 105\n", - " 115.415378\n", + " 118.547658\n", + " 106\n", + " 104.064030\n", " 107\n", - " 100.810423\n", + " 100.469278\n", " \n", " \n", " Trial 2\n", - " 102\n", - " 92.268623\n", + " 101\n", + " 95.011741\n", " 105\n", - " 117.773489\n", + " 117.134398\n", " 106\n", - " 103.246022\n", + " 103.448672\n", " \n", " \n", " Trial 3\n", " 105\n", - " 117.368647\n", + " 118.249159\n", " 108\n", - " 117.285285\n", + " 111.530956\n", " 109\n", - " 125.616361\n", + " 129.435022\n", " \n", " \n", " Trial 4\n", " 105\n", - " 116.436048\n", + " 113.119498\n", " 106\n", - " 100.938261\n", + " 104.066018\n", " 107\n", - " 103.695056\n", + " 99.563147\n", " \n", " \n", " Trial 5\n", " 105\n", - " 118.238173\n", + " 116.876166\n", " 106\n", - " 103.449000\n", - " 107\n", - " 99.705887\n", + " 94.882927\n", + " 108\n", + " 117.329407\n", " \n", " \n", " Trial 6\n", + " 102\n", + " 91.500096\n", " 105\n", - " 120.294029\n", + " 112.960520\n", " 106\n", - " 105.127541\n", - " 108\n", - " 116.285994\n", + " 103.647990\n", " \n", " \n", " Trial 7\n", - " 101\n", - " 95.939451\n", " 102\n", - " 93.248245\n", + " 93.430881\n", " 105\n", - " 117.368042\n", + " 118.074966\n", + " 107\n", + " 101.492441\n", " \n", " \n", " Trial 8\n", - " 99\n", - " 93.683904\n", " 105\n", - " 117.149285\n", - " 106\n", - " 103.487716\n", + " 115.851676\n", + " 107\n", + " 99.761099\n", + " 108\n", + " 115.686010\n", " \n", " \n", " Trial 9\n", " 101\n", - " 98.009029\n", - " 102\n", - " 95.096966\n", + " 95.691499\n", " 105\n", - " 117.477554\n", + " 115.727988\n", + " 106\n", + " 104.892038\n", " \n", " \n", " Trial 10\n", - " 99\n", - " 90.399927\n", " 105\n", - " 110.171224\n", - " 106\n", - " 101.625567\n", + " 117.357528\n", + " 108\n", + " 116.546237\n", + " 109\n", + " 124.174052\n", " \n", " \n", " Trial 11\n", - " 102\n", - " 96.211625\n", " 105\n", - " 117.704346\n", + " 118.910976\n", + " 106\n", + " 102.760103\n", " 108\n", - " 117.283140\n", + " 114.417216\n", " \n", " \n", " Trial 12\n", " 105\n", - " 119.097207\n", + " 115.031693\n", " 106\n", - " 104.017532\n", + " 105.684317\n", " 107\n", - " 100.665739\n", + " 95.866796\n", " \n", " \n", " Trial 13\n", " 105\n", - " 117.149950\n", + " 119.085506\n", " 106\n", - " 105.389668\n", + " 102.302534\n", " 107\n", - " 100.011542\n", + " 102.615531\n", " \n", " \n", " Trial 14\n", " 105\n", - " 117.522155\n", + " 119.965197\n", " 106\n", - " 104.450307\n", - " 108\n", - " 117.613179\n", + " 104.397808\n", + " 107\n", + " 102.721971\n", " \n", " \n", " Trial 15\n", " 105\n", - " 116.351702\n", + " 120.065230\n", " 106\n", - " 102.937711\n", + " 103.577300\n", " 107\n", - " 100.708612\n", + " 99.419053\n", " \n", " \n", "\n", @@ -1057,22 +1057,22 @@ ], "text/plain": [ " Hit 1 Value 1 Hit 2 Value 2 Hit 3 Value 3\n", - "Trial 0 105 117.752289 106 103.770087 107 100.590660\n", - "Trial 1 99 95.344043 105 115.415378 107 100.810423\n", - "Trial 2 102 92.268623 105 117.773489 106 103.246022\n", - "Trial 3 105 117.368647 108 117.285285 109 125.616361\n", - "Trial 4 105 116.436048 106 100.938261 107 103.695056\n", - "Trial 5 105 118.238173 106 103.449000 107 99.705887\n", - "Trial 6 105 120.294029 106 105.127541 108 116.285994\n", - "Trial 7 101 95.939451 102 93.248245 105 117.368042\n", - "Trial 8 99 93.683904 105 117.149285 106 103.487716\n", - "Trial 9 101 98.009029 102 95.096966 105 117.477554\n", - "Trial 10 99 90.399927 105 110.171224 106 101.625567\n", - "Trial 11 102 96.211625 105 117.704346 108 117.283140\n", - "Trial 12 105 119.097207 106 104.017532 107 100.665739\n", - "Trial 13 105 117.149950 106 105.389668 107 100.011542\n", - "Trial 14 105 117.522155 106 104.450307 108 117.613179\n", - "Trial 15 105 116.351702 106 102.937711 107 100.708612" + "Trial 0 105 117.262669 108 123.009376 109 125.388963\n", + "Trial 1 105 118.547658 106 104.064030 107 100.469278\n", + "Trial 2 101 95.011741 105 117.134398 106 103.448672\n", + "Trial 3 105 118.249159 108 111.530956 109 129.435022\n", + "Trial 4 105 113.119498 106 104.066018 107 99.563147\n", + "Trial 5 105 116.876166 106 94.882927 108 117.329407\n", + "Trial 6 102 91.500096 105 112.960520 106 103.647990\n", + "Trial 7 102 93.430881 105 118.074966 107 101.492441\n", + "Trial 8 105 115.851676 107 99.761099 108 115.686010\n", + "Trial 9 101 95.691499 105 115.727988 106 104.892038\n", + "Trial 10 105 117.357528 108 116.546237 109 124.174052\n", + "Trial 11 105 118.910976 106 102.760103 108 114.417216\n", + "Trial 12 105 115.031693 106 105.684317 107 95.866796\n", + "Trial 13 105 119.085506 106 102.302534 107 102.615531\n", + "Trial 14 105 119.965197 106 104.397808 107 102.721971\n", + "Trial 15 105 120.065230 106 103.577300 107 99.419053" ] }, "metadata": {}, @@ -1178,7 +1178,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 19, @@ -1187,7 +1187,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1234,7 +1234,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 20, @@ -1243,7 +1243,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1290,7 +1290,7 @@ "source": [ "# Generate some synthetic data\n", "data = pd.DataFrame()\n", - "test_results = np.random.choice([\"Negative\", \"Positive\", \"N/A\"], size=500, p=[0.55,0.35,0.1]) \n", + "test_results = np.random.choice([\"Negative\", \"Positive\", \"N/A\"], size=4000, p=[0.55,0.35,0.1]) \n", "data[\"Test Result\"] = test_results\n", "\n", "# Compute a histogram representation of the data\n", @@ -1332,7 +1332,7 @@ "outputs": [], "source": [ "from relm.mechanisms import SmallDB\n", - "mechanism = SmallDB(epsilon=1.0, alpha=0.1)\n", + "mechanism = SmallDB(epsilon=0.01, alpha=0.1)\n", "synthetic_database = mechanism.release(values, queries, db_size, db_l1_norm)" ] }, @@ -1377,105 +1377,105 @@ " \n", " \n", " Exact Responses\n", - " 0.908000\n", - " 0.416000\n", - " 0.676000\n", + " 0.894250\n", + " 0.451250\n", + " 0.654500\n", " \n", " \n", " TRIAL 0\n", - " 0.906667\n", - " 0.416667\n", - " 0.676667\n", + " 0.903333\n", + " 0.470000\n", + " 0.626667\n", " \n", " \n", " TRIAL 1\n", - " 0.900000\n", - " 0.430000\n", - " 0.670000\n", + " 0.953333\n", + " 0.466667\n", + " 0.580000\n", " \n", " \n", " TRIAL 2\n", - " 0.910000\n", - " 0.416667\n", - " 0.673333\n", + " 0.890000\n", + " 0.556667\n", + " 0.553333\n", " \n", " \n", " TRIAL 3\n", - " 0.896667\n", - " 0.423333\n", - " 0.680000\n", + " 0.976667\n", + " 0.300000\n", + " 0.723333\n", " \n", " \n", " TRIAL 4\n", " 0.906667\n", - " 0.416667\n", - " 0.676667\n", + " 0.466667\n", + " 0.626667\n", " \n", " \n", " TRIAL 5\n", - " 0.906667\n", - " 0.416667\n", - " 0.676667\n", + " 0.880000\n", + " 0.460000\n", + " 0.660000\n", " \n", " \n", " TRIAL 6\n", - " 0.910000\n", - " 0.416667\n", - " 0.673333\n", + " 0.903333\n", + " 0.450000\n", + " 0.646667\n", " \n", " \n", " TRIAL 7\n", - " 0.906667\n", - " 0.416667\n", - " 0.676667\n", + " 0.843333\n", + " 0.446667\n", + " 0.710000\n", " \n", " \n", " TRIAL 8\n", - " 0.906667\n", - " 0.416667\n", - " 0.676667\n", + " 0.963333\n", + " 0.463333\n", + " 0.573333\n", " \n", " \n", " TRIAL 9\n", - " 0.910000\n", - " 0.416667\n", - " 0.673333\n", + " 0.890000\n", + " 0.433333\n", + " 0.676667\n", " \n", " \n", " TRIAL 10\n", - " 0.913333\n", - " 0.410000\n", - " 0.676667\n", + " 0.820000\n", + " 0.516667\n", + " 0.663333\n", " \n", " \n", " TRIAL 11\n", - " 0.906667\n", - " 0.413333\n", - " 0.680000\n", + " 0.876667\n", + " 0.473333\n", + " 0.650000\n", " \n", " \n", " TRIAL 12\n", - " 0.906667\n", - " 0.416667\n", - " 0.676667\n", + " 0.883333\n", + " 0.453333\n", + " 0.663333\n", " \n", " \n", " TRIAL 13\n", - " 0.906667\n", - " 0.416667\n", - " 0.676667\n", + " 0.870000\n", + " 0.520000\n", + " 0.610000\n", " \n", " \n", " TRIAL 14\n", - " 0.903333\n", - " 0.423333\n", - " 0.673333\n", + " 0.840000\n", + " 0.460000\n", + " 0.700000\n", " \n", " \n", " TRIAL 15\n", - " 0.906667\n", - " 0.420000\n", - " 0.673333\n", + " 0.856667\n", + " 0.323333\n", + " 0.820000\n", " \n", " \n", "\n", @@ -1483,23 +1483,23 @@ ], "text/plain": [ " Query 0 Query 1 Query 2\n", - "Exact Responses 0.908000 0.416000 0.676000\n", - "TRIAL 0 0.906667 0.416667 0.676667\n", - "TRIAL 1 0.900000 0.430000 0.670000\n", - "TRIAL 2 0.910000 0.416667 0.673333\n", - "TRIAL 3 0.896667 0.423333 0.680000\n", - "TRIAL 4 0.906667 0.416667 0.676667\n", - "TRIAL 5 0.906667 0.416667 0.676667\n", - "TRIAL 6 0.910000 0.416667 0.673333\n", - "TRIAL 7 0.906667 0.416667 0.676667\n", - "TRIAL 8 0.906667 0.416667 0.676667\n", - "TRIAL 9 0.910000 0.416667 0.673333\n", - "TRIAL 10 0.913333 0.410000 0.676667\n", - "TRIAL 11 0.906667 0.413333 0.680000\n", - "TRIAL 12 0.906667 0.416667 0.676667\n", - "TRIAL 13 0.906667 0.416667 0.676667\n", - "TRIAL 14 0.903333 0.423333 0.673333\n", - "TRIAL 15 0.906667 0.420000 0.673333" + "Exact Responses 0.894250 0.451250 0.654500\n", + "TRIAL 0 0.903333 0.470000 0.626667\n", + "TRIAL 1 0.953333 0.466667 0.580000\n", + "TRIAL 2 0.890000 0.556667 0.553333\n", + "TRIAL 3 0.976667 0.300000 0.723333\n", + "TRIAL 4 0.906667 0.466667 0.626667\n", + "TRIAL 5 0.880000 0.460000 0.660000\n", + "TRIAL 6 0.903333 0.450000 0.646667\n", + "TRIAL 7 0.843333 0.446667 0.710000\n", + "TRIAL 8 0.963333 0.463333 0.573333\n", + "TRIAL 9 0.890000 0.433333 0.676667\n", + "TRIAL 10 0.820000 0.516667 0.663333\n", + "TRIAL 11 0.876667 0.473333 0.650000\n", + "TRIAL 12 0.883333 0.453333 0.663333\n", + "TRIAL 13 0.870000 0.520000 0.610000\n", + "TRIAL 14 0.840000 0.460000 0.700000\n", + "TRIAL 15 0.856667 0.323333 0.820000" ] }, "metadata": {}, @@ -1510,7 +1510,7 @@ "TRIALS = 2**4\n", "synthetic_responses = np.empty((TRIALS, queries.shape[0]))\n", "for i in range(TRIALS):\n", - " mechanism = SmallDB(epsilon=1.0, alpha=0.1)\n", + " mechanism = SmallDB(epsilon=0.01, alpha=0.1)\n", " synthetic_database = mechanism.release(values, queries, db_size, db_l1_norm)\n", " synthetic_responses[i] = (queries @ synthetic_database) / synthetic_database.sum()\n", " \n", @@ -1520,6 +1520,80 @@ "\n", "display(df)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Online Multiplicative Weights Mechanism" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Basic Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "from relm.mechanisms import PrivateMultiplicativeWeights\n", + "mechanism = PrivateMultiplicativeWeights(epsilon=100.0, alpha=0.1, num_queries=10000, db_size=db_size, db_l1_norm=db_l1_norm)\n", + "dp_responses = mechanism.release(values, queries)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.89425 0.45125 0.6545 ]\n", + "[0.89488512 0.4513771 0.66694427]\n" + ] + } + ], + "source": [ + "print(values)\n", + "print(dp_responses)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.71523707 0.61561025 0.66915268]\n", + "[0.71523707 0.61561025 0.66915268]\n", + "[0.71523707 0.61561025 0.66915268]\n", + "[0.71523707 0.61561025 0.66915268]\n", + "[0.71523707 0.61561025 0.66915268]\n" + ] + } + ], + "source": [ + "for i in range(5):\n", + " test_responses = mechanism.release(values, queries)\n", + " print(test_responses)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1538,7 +1612,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index aac6833..b68f983 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -77,7 +77,7 @@ class PrivateMultiplicativeWeights(ReleaseMechanism): num_queries: the number of queries answered by the mechanism """ - def __init__(self, epsilon, data, alpha, num_queries): + def __init__(self, epsilon, alpha, num_queries, db_size, db_l1_norm): super(PrivateMultiplicativeWeights, self).__init__(epsilon) if not type(alpha) in (float, np.float64): @@ -86,18 +86,18 @@ def __init__(self, epsilon, data, alpha, num_queries): if (alpha < 0) or (alpha > 1): raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") - if not (data >= 0).all(): - raise ValueError( - f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" - ) - - if data.dtype == np.int64: - data = data.astype(np.uint64) - - if data.dtype != np.uint64: - raise TypeError( - f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" - ) + # if not (data >= 0).all(): + # raise ValueError( + # f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" + # ) + # + # if data.dtype == np.int64: + # data = data.astype(np.uint64) + # + # if data.dtype != np.uint64: + # raise TypeError( + # f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" + # ) if type(num_queries) is not int: raise TypeError( @@ -109,27 +109,28 @@ def __init__(self, epsilon, data, alpha, num_queries): f"num_queries: num_queries must be positive. Found {num_queries}" ) - self.l1_norm = data.sum() - self.data = data / self.l1_norm - self.data_est = np.ones(len(data)) / len(data) + self.db_l1_norm = db_l1_norm + self.db_size = db_size + self.est_data = np.ones(self.db_size) / self.db_size self.alpha = alpha self.learning_rate = self.alpha / 2 # solve inequality of Theorem 4.14 (Dwork and Roth) for beta - self.beta = epsilon * self.l1_norm * self.alpha ** 3 - self.beta /= 36 * np.log(len(data)) + self.beta = epsilon * self.db_l1_norm * self.alpha ** 3 + self.beta /= 36 * np.log(self.db_size) self.beta -= np.log(num_queries) - self.beta = np.exp(-self.beta) * 32 * np.log(len(data)) / (self.alpha ** 2) + self.beta = np.exp(-self.beta) * 32 * np.log(self.db_size) / (self.alpha ** 2) + + cutoff = 4 * np.log(self.db_size) / (self.alpha ** 2) - cutoff = 4 * np.log(len(data)) / (self.alpha ** 2) self.cutoff = int(cutoff) - self.threshold = 18 * cutoff / (epsilon * self.l1_norm) + self.threshold = 18 * cutoff / (epsilon * self.db_l1_norm) self.threshold *= np.log(2 * num_queries) + np.log(4 * cutoff / self.beta) self.sparse_numeric = SparseNumeric( epsilon, - sensitivity=(1 / self.l1_norm), + sensitivity=(1 / self.db_l1_norm), threshold=self.threshold, cutoff=self.cutoff, ) @@ -146,28 +147,28 @@ def update_weights(self, est_answer, noisy_answer, query): else: r = 1 - query - self.data_est *= np.exp(-r * self.learning_rate) - self.data_est /= self.data_est.sum() + self.est_data *= np.exp(-r * self.learning_rate) + self.est_data /= self.est_data.sum() - def release(self, queries): + def release(self, values, queries): """ Returns private answers to the queries. Args: + values: a numpy array of the exact query responses queries: a list of queries as 1D 1/0 indicator numpy arrays Returns: a numpy array of the private query responses """ results = [] - for query in queries: + for query, value in zip(queries, values): if type(query) is sps.csr.csr_matrix: query = np.asarray(query.todense()).flatten() - true_answer = (query * self.data).sum() - est_answer = (query * self.data_est).sum() + est_answer = query.dot(self.est_data) - error = true_answer - est_answer + error = value - est_answer errors = np.array([error, -error]) indices, release_values = self.sparse_numeric.release(errors) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index d45f924..cfea57a 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -309,42 +309,39 @@ def test_PrivateMultiplicativeWeights(): num_queries = len(queries) alpha = 100 / data.sum() - mechanism = PrivateMultiplicativeWeights(epsilon, data, alpha, num_queries) - results = mechanism.release(queries) + values = queries.dot(data) / data.sum() + + mechanism = PrivateMultiplicativeWeights(epsilon, alpha, num_queries, len(data), data.sum()) + results = mechanism.release(values, queries) assert len(results) == len(queries) assert ( - abs((mechanism.data_est * query).sum() * data.sum() - (data * query).sum()) + abs((mechanism.est_data * query).sum() * data.sum() - (data * query).sum()) < 100 ) - with pytest.raises(ValueError): - data_copy = data.copy() - data_copy[3] = -2 - _ = PrivateMultiplicativeWeights(epsilon, data_copy, alpha, num_queries) - with pytest.raises(TypeError): _ = PrivateMultiplicativeWeights( - epsilon, data.astype(np.int32), alpha, num_queries + epsilon, data.astype(np.int32), alpha, num_queries, len(data), data.sum() ) with pytest.raises(TypeError): - _ = PrivateMultiplicativeWeights(epsilon, data, 1, num_queries) + _ = PrivateMultiplicativeWeights(epsilon, 1, num_queries, len(data), data.sum()) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, data, -0.1, num_queries) + _ = PrivateMultiplicativeWeights(epsilon, -0.1, num_queries, len(data), data.sum()) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, data, 1.1, num_queries) + _ = PrivateMultiplicativeWeights(epsilon, 1.1, num_queries, len(data), data.sum()) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, data, alpha, 0) + _ = PrivateMultiplicativeWeights(epsilon, alpha, 0, len(data), data.sum()) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, data, alpha, -1) + _ = PrivateMultiplicativeWeights(epsilon, alpha, -1, len(data), data.sum()) with pytest.raises(TypeError): - _ = PrivateMultiplicativeWeights(epsilon, data, alpha, float(num_queries)) + _ = PrivateMultiplicativeWeights(epsilon, alpha, float(num_queries), len(data), data.sum()) def test_PrivateMultiplicativeWeights_sparse(): @@ -359,5 +356,7 @@ def test_PrivateMultiplicativeWeights_sparse(): num_queries = queries.shape[0] alpha = 100 / data.sum() - mechanism = PrivateMultiplicativeWeights(epsilon, data, alpha, num_queries) - _ = mechanism.release(queries) + values = queries.dot(data) / data.sum() + + mechanism = PrivateMultiplicativeWeights(epsilon, alpha, num_queries, len(data), data.sum()) + _ = mechanism.release(values, queries) From bd3c4d530f159dbc7da89550771fd2dd8b257e11 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 29 Jan 2021 15:58:00 +1100 Subject: [PATCH 145/185] Fiddling with PrivateMultiplicativeWeights --- examples/relm_demo.ipynb | 755 +++++++++++++++------------ relm/mechanisms/data_perturbation.py | 43 +- tests/test_mechanisms.py | 20 +- 3 files changed, 458 insertions(+), 360 deletions(-) diff --git a/examples/relm_demo.ipynb b/examples/relm_demo.ipynb index 82fbb5a..6a7394c 100644 --- a/examples/relm_demo.ipynb +++ b/examples/relm_demo.ipynb @@ -110,59 +110,59 @@ "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-9238251.03108800-9238240.556991
110-19386377.839711110-19386388.869535
220-29688690.458008220-29688700.451966
330-39779778.062103330-39779799.077525
440-49621620.090036440-49621628.460624
550-59582579.223553550-59582578.646627
660-69344291.545413660-69344350.028988
770+261259.537919770+261280.784384
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -170,7 +170,7 @@ }, { "data": { - "image/png": "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0atXL8aM2d4h8MILL/Cxj32M4447jv79+/P2229z4403MnnyZCorK5k8eccbcd15552MHDmSk046CUj6pS+66CI6d+7MG2+8wfnnn0+fPn048cQTmT9/PgBjx45l/Pjx29bRu3dvli9fzvLly+nRowdf/OIX6dWrF4MGDWLTpk08/PDDzJkzh4svvpjKyko2bdrE6NGj6dmzJ3369OHaa68t635sDrfczaxZNm3aRGVl5bbX119/PZ/5zGe44447GDVqFFdffTVvvvkmX/ziFwEYN24c7du357333mPgwIHMnz+fY445hs985jNMnjyZfv36sX79etq2bcu3v/1t5syZwx133LHTdhcsWMDIkSN3KgcYM2YMffv25bHHHuPXv/41n//85xv9dbFkyRIeeughfvzjH/PpT3+aRx55hEsuuYQ77riD8ePHU1VVxRtvvMGjjz7KK6+8giTeeuutpu62snNyN7Nmqa9b5hOf+AQ///nPufLKK3nppZe2lU+ZMoUJEyZQU1PDqlWrePnll5FEly5d6NevHwDt2rVrVkzPPfccjzzyCABnnHEG69at4+23G+6K69at27YvqY9+9KMsX758pzrt2rWjdevWXH755QwZMoRzzz23WXGWk7tlzKwstm7dyqJFi2jTpg1vvPEGAMuWLWP8+PHMmDGD+fPnM2TIEDZv3kxEFH26X69evZg7d27eefluQiSJli1bsnXr9ptn5Z47vs8++2ybbtGiBTU1NTuto2XLlsyePZsLL7yQxx57jMGDBxcV867k5G5mZXHrrbfSo0cPHnroIS699FLeffdd1q9fz7777ssBBxzA6tWrefrppwE45phjWLlyJS+88AIAGzZsoKamhv33358NGzbkXf9VV13FxIkTmTVr1ray+++/n9dff50BAwbwwAMPADBz5kw6duxIu3btqKio4MUXXwTgxRdfZNmyZY2+j9wYNm7cyNtvv80555zDbbfdVrYDyaXgbhmzDCnk1MVSq9vnPnjwYC699FLuvvtuZs+ezf7778+AAQP47ne/y0033UTfvn3p1asXRx55JCeffDIArVq1YvLkyXz1q19l06ZNtGnThunTp/Pxj3+cm2++mcrKym19+bU6d+7MpEmTuPbaa1mzZg177bUXAwYM4IILLmDs2LF84QtfoE+fPrRt25aJE5MxDi+88ELuu+8+Kisr6devH0cddVSj72/UqFF8+ctfpk2bNjz99NMMHTp026+NW2+9tbQ7s4R2i3uoVlVVhW/WYfXxqZD1W7RoET169Hi/w7BdIN9nLWluRFTlq+9uGTOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczyyCf526WJWMPKPH6Gj9ltHbI35qaGnr06MHEiRMLHpVx+fLl/OEPf+Czny3wFNYcFRUVzJkzh44dOxa9bEPLb9y4kW9+85tMnz6d1q1b06FDB77//e9zwgknNGk7+TQ2lHEpuOVuZs1SO7bMggULaNWqFXfddVdBy9XU1LB8+XIefPDBorf53nvlu//P5ZdfTvv27VmyZAkLFy7k3nvv5R//+EdJtzFv3jyeeuqpkq6zLid3MyuZU089laVLl/LOO+9w6aWX0q9fP/r27cvjjyd34bz33nsZNmwYn/zkJxk0aBCjR4/m2WefpbKykltvvZV7772Xq666atv6zj33XGbOnAnAfvvtx4033sgJJ5zA888/D8D3v/99+vfvT//+/Vm6dCkAa9eu5cILL6Rfv37069eP3//+9wCsW7eOQYMG0bdvX770pS/lHX/m1VdfZdasWXz3u99lr72S9HjkkUcyZEhy5e8tt9xC79696d27N7fddhuQ/Pro3bv3tnWMHz+esWPHAnD66adz3XXX0b9/f4466iieffZZ/vWvf+00lPFvf/tbKisrqayspG/fvvUOuVAMd8uYWUnU1NTw9NNPM3jwYMaNG8cZZ5zBPffcw1tvvUX//v0588wzAXj++eeZP38+7du3Z+bMmYwfP54nnngCSJJ/fd555x169+7Nt7/97W1l7dq1Y/bs2dx3331cc801PPHEE1x99dV8/etf55RTTmHFihWcddZZLFq0iJtuuolTTjmFG2+8kSeffJIJEybstI2FCxdSWVlJixYtdpo3d+5cfvrTnzJr1iwighNOOIHTTjuNgw46qNH9Mnv2bJ566iluuukmpk+fvtNQxp/85Ce58847Ofnkk9m4cSOtW7dudH83ptHkLuloIHeU/COBG4H70vIKYDnw6Yh4M13meuAy4D3gaxHxq2ZHama7pdyxZU499VQuu+wyPvaxjzF16tRtN8bYvHkzK1asAJKhgNu3b1/0dlq0aMGFF164Q9mIESO2PX/9618HYPr06bz88svb6qxfv54NGzbw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\n", + "image/png": "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37aNvn37snLlSlauXEmvXr340pe+RJ8+fRg8eDCbNm3i4YcfpqqqiiuuuIKKigo2bdrE2LFj6d27N/369eP6668v6/vYEoUk91XAKZLaK+nVP4dkurUZbJ8HchTwWLo8AxghaR9JPYCewLzShm1mu4tNmzZRUVGx7TZt2jQOOOAA7r77bkaPHs3UqVN5/fXX+dKXvgTAxIkTqaqqYuHChTzzzDMsXLiQ9957j8svv5wf/vCHLFiwgFmzZrHvvvty6623cvnll1NdXc3ll1++w34XLVrESSedlDem8ePH079/fxYuXMh3v/tdvvCFL+Stl2vZsmWMGTOGxYsXc+CBB/LII49w2WWXUVlZyQMPPEB1dTWbNm3i0UcfZfHixSxcuJBvfWv3nYCqkD73uZIeJplXsZZknsdJJDO6T5d0FckXwPC0/mJJ00nmfKwFxkREY5MQm9kerKFumU996lP88pe/ZMyYMSxYsGBb+fTp05k0aRK1tbWsWbOGF198EUl07dqVAQMGANChQ4cWxfTcc8/xyCOPAHD22WezYcMG3nyz8a64Hj16UFFRAcBJJ53EypUrd6rToUMH2rZty9VXX83QoUO58MILWxRnORV0tkxEjI+I4yKib0R8Pj0TZkNEnBMRPdP713LqT4yIj0fEsRHxVPnCN7Pd1datW1myZAnt2rXjtdeS9LBixQpuv/12Zs+ezcKFCxk6dCibN28mIoo+3a9Pnz7Mnz8/73P5JiGSROvWrdm6dfvkWbnnju+zzz7bllu1akVtbe1O22jdujXz5s3j0ksv5de//jVDhgwpKuZdyVeo2m6vmDNAVrYtYyBWlDvvvJNevXrx3e9+lyuvvJLnn3+et956i3333ZcDDjiAtWvX8tRTT3HWWWdx3HHHsXr1al544QUGDBjA22+/Tbt27dh///15++23827/2muvZeDAgQwdOpSTTz4ZgF/84hece+65DBo0iAceeICbbrqJOXPm0KlTJzp06ED37t15/PHHAfjjH//IihUrmnwduTFs3LiRd999lwsuuIBTTjmFo48+ukTvVuk5uZtlSCGnLpZaXZ97nSFDhnDllVdy7733Mm/ePPbff38GDRrEd77zHW655Rb69+9Pnz59OOqoozjttNMAaNOmDdOmTeOrX/0qmzZtol27dsyaNYtPfvKT3HbbbVRUVDBu3Lgd+t27dOnC1KlTuf7661m3bh177bUXgwYN4pJLLmHChAl88YtfpF+/frRv354pU5JLci699FLuv/9+KioqGDBgAMccc0yTr2/06NF85StfoV27djz11FMMGzZs26+NO++8s7RvZgntFnOoVlZWhifrsIYU13L/bGEVM3Iq5JIlS+jVq9eHHYbtAvk+a0nzI6IyX30P+WtmlkFO7mZmGeTkbmaWQU7uZmYZ5ORuZpZBTu5mZhnk89zNsqTQUTEL3l7Tp4zWDflbW1tLr169mDJlSsGjMq5cuZLf//73fPazBZ7CmqN79+5UVVXRqVOnotdtbP2NGzfyzW9+k1mzZtG2bVsOPvhgvv/972+7UKoUmhrKuBTccjezFqkbW2bRokW0adOGe+65p6D1amtrWblyJQ8++GDR+/zgg/INV3X11VfTsWNHli1bxuLFi5k8eTL/+Mc/SrqP6upqnnzyyZJusz4ndzMrmTPOOIPly5fzzjvvcOWVVzJgwAD69+/PY48lg8ZOnjyZ4cOH8+lPf5rBgwczduxYnn32WSoqKrjzzjuZPHky11577bbtXXjhhcyZMweA/fbbj5tvvpmTTz6Z559/HoDvf//7DBw4kIEDB7J8+XIA1q9fz6WXXsqAAQMYMGAA//u//wvAhg0bGDx4MP379+fLX/5y3vFnXn75ZebOnct3vvMd9torSY9HHXUUQ4cmV/7ecccd9O3bl759+/KDH/wASH599O3bd9s2br/9diZMmADAWWedxQ033MDAgQM55phjePbZZ3nvvfd2Gsr4mWee2TaqZv/+/RsccqEY7pYxs5Kora3lqaeeYsiQIUycOJGzzz6b++67jzfeeIOBAwdy7rnnAvD888+zcOFCOnbsyJw5c7j99tu3jfcyefLkBrf/zjvv0LdvX2699dZtZR06dGDevHncf//9XHfddTz++ON87Wtf4+tf/zqnn346q1at4rzzzmPJkiXccsstnH766dx888088cQTTJo0aad9LF68mIqKClq12nna5/nz5/Pzn/+cuXPnEhGcfPLJnHnmmRx00EFNvi/z5s3jySef5JZbbmHWrFnceuutVFVVcffddwPw6U9/mh//+MecdtppbNy4kbZtWz5IkpO7mbVI7tgyZ5xxBldddRWf+MQnmDFjxraJMTZv3syqVauAZCjgjh07Fr2fVq1acemll+5QNnLkyG33X//61wGYNWsWL7744rY6b731Fm+//Ta/+93v+NWvfgXA0KFDm0zK9T333HN85jOfYd999wXgkksu4dlnn+Wiiy5qdL1LLrkEaHgYYYDTTjuNb3zjG1xxxRVccskldOvWrajY8nFyN7MWyTeee92Ud8cee+wO5XPnzt2WHPNpbEjetm3b7tSizh0muG5569atPP/887Rr126n7Tc1rHCfPn1YsGABW7du3dYtk/uaio0Ztg8l3NAwwgBjx45l6NChPPnkk5xyyinMmjWL4447rtFYm+I+dzMrufPOO48f/ehH2xLin/70p7z16g/p2717d6qrq9m6dSuvvPIK8+Y1Polb3dR706ZN2zbd3uDBg7d1dwDbvnjqhgEGeOqpp3j99dd32t7HP/5xKisrGT9+/LbYly1bxmOPPcagQYP49a9/zbvvvss777zDo48+yhlnnEGXLl1Yt24dGzZsYMuWLdu6mBpT/3W//PLLHH/88dxwww1UVlby0ksvNbmNprjlbpYlu8lolzfddBPXXXcd/fr1IyJ2GEc9V79+/WjdujUnnHACo0eP5rrrrqNHjx4cf/zx9O3blxNPPLHR/WzZsoWTTz6ZrVu38tBDDwFw1113MWbMGPr160dtbS2DBg3innvuYfz48YwcOZITTzyRM888kyOOOCLvNu+9916++c1vcvTRR9O+ffttp0KeeOKJjB49moEDBwLJWTX9+/cH2Hagt0ePHgW1uOsPZfzcc8/x29/+llatWtG7d2/OP//8JrfRlCaH/JV0LJA7M+1RwM3A/Wl5d2Al8E8R8Xq6zjjgKuAD4F8i4jeN7cND/lpjPORvwzzk70dHyYf8jYilEVERERXAScC7wKPAWGB2RPQEZqePkdQbGAH0AYYAP5G086FnMzMrm2L73M8BXo6IvwHDgClp+RTg4nR5GDA1nWd1BbAcGFiCWM3MrEDF9rmPAB5Kl7tExBqAiFgj6ZC0/DDgDznr1KRlO5B0DXAN0GDfl+1GCr2sPSPdHXuS5kwubXuW5syYV3DLXVIb4CLgl01VzVO2U2QRMSkiKiOisnPnzoWGYWY52rZty4YNG5r1z297hohgw4YNRV/YVEzL/XzgjxGxNn28VlLXtNXeFViXltcAh+es1w1YXVRUZlaQbt26UVNTw/r16z/sUKyM2rZtW/SFTcUk95Fs75IBmAGMAm5L7x/LKX9Q0h3AoUBPoPGTVc2sWfbee2969OjxYYdhu6GCkruk9sCngC/nFN8GTJd0FbAKGA4QEYslTQdeBGqBMRFRviHcrNmKO8WwjIGYWckVlNwj4l3g4HplG0jOnslXfyIwscXRmZlZs3j4ATOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczyyAndzOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczyyAndzOzDCp2mj0zKwVPW2hl5pa7mVkGueVuViKe/MR2J265m5llUEHJXdKBkh6W9JKkJZJOldRR0kxJy9L7g3Lqj5O0XNJSSeeVL3wzM8un0Jb7D4H/iYjjgBOAJcBYYHZE9ARmp4+R1BsYAfQBhgA/kdSq1IGbmVnDmkzukjoAg4CfAUTEexHxBjAMmJJWmwJcnC4PA6ZGxJaIWAEsBwaWNmwzM2tMIS33o4D1wM8l/UnSvZL2BbpExBqA9P6QtP5hwCs569ekZTuQdI2kKklV69evb9GLMDOzHRWS3FsDJwL/JyL6A++QdsE0QHnKYqeCiEkRURkRlZ07dy4oWDMzK0whyb0GqImIuenjh0mS/VpJXQHS+3U59Q/PWb8bsLo04ZqZWSGaTO4R8SrwiqRj06JzgBeBGcCotGwU8Fi6PAMYIWkfST2AnsC8kkZtZmaNKvQipq8CD0hqA/wV+CLJF8N0SVcBq4DhABGxWNJ0ki+AWmBMRHxQ8sjNzKxBBSX3iKgGKvM8dU4D9ScCE5sflpmVS1FX0t42tIyRWDl5+AEza5gHONtjefgBM7MMcnI3M8sgJ3czswxycjczyyAndzOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczyyAndzOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczy6CCkruklZL+LKlaUlVa1lHSTEnL0vuDcuqPk7Rc0lJJ55UreDMzy6+YlvsnI6IiIuqm2xsLzI6InsDs9DGSegMjgD7AEOAnklqVMGYzM2tCS7plhgFT0uUpwMU55VMjYktErACWAwNbsB8zMytSock9gKclzZd0TVrWJSLWAKT3h6TlhwGv5Kxbk5btQNI1kqokVa1fv7550ZuZWV6FTpB9WkSslnQIMFPSS43UVZ6y2KkgYhIwCaCysnKn583MrPkKarlHxOr0fh3wKEk3y1pJXQHS+3Vp9Rrg8JzVuwGrSxWwmZk1rcnkLmlfSfvXLQODgUXADGBUWm0U8Fi6PAMYIWkfST2AnsC8UgduZmYNK6RbpgvwqKS6+g9GxP9IegGYLukqYBUwHCAiFkuaDrwI1AJjIuKDskRvZmZ5NZncI+KvwAl5yjcA5zSwzkRgYoujMzOzZvEVqmZmGeTkbmaWQU7uZmYZ5ORuZpZBTu5mZhnk5G5mlkFO7mZmGeTkbmaWQU7uZmYZ5ORuZpZBTu5mZhnk5G5mlkFO7mZmGeTkbmaWQU7uZmYZ5ORuZpZBTu5mZhlUcHKX1ErSnyQ9nj7uKGmmpGXp/UE5dcdJWi5pqaTzyhG4mZk1rJiW+9eAJTmPxwKzI6InMDt9jKTewAigDzAE+ImkVqUJ18zMClFQcpfUDRgK3JtTPAyYki5PAS7OKZ8aEVsiYgWwHBhYkmjNzKwghbbcfwD8K7A1p6xLRKwBSO8PScsPA17JqVeTlu1A0jWSqiRVrV+/vti4zcysEU0md0kXAusiYn6B21SestipIGJSRFRGRGXnzp0L3LSZmRWidQF1TgMuknQB0BboIOkXwFpJXSNijaSuwLq0fg1weM763YDVpQzazMwa12Ryj4hxwDgASWcB10fE5yR9HxgF3JbeP5auMgN4UNIdwKFAT2BeySPPigkHFFH3zfLFYWaZUkjLvSG3AdMlXQWsAoYDRMRiSdOBF4FaYExEfNDiSPcw3cc+UVC9lW3LHIiZfSQVldwjYg4wJ13eAJzTQL2JwMQWxmZmZs3kK1TNzDLIyd3MLIOc3M3MMsjJ3cwsg5zczcwyyMndzCyDnNzNzDKoJRcxmZl9+HyVd15uuZuZZZBb7ma2W/IQHi3jlruZWQY5uZuZZZCTu5lZBjm5m5llkJO7mVkGObmbmWWQk7uZWQY1mdwltZU0T9ICSYsl3ZKWd5Q0U9Ky9P6gnHXGSVouaamk88r5AszMbGeFtNy3AGdHxAlABTBE0inAWGB2RPQEZqePkdQbGAH0AYYAP5HUqgyxm5lZA5pM7pHYmD7cO70FMAyYkpZPAS5Ol4cBUyNiS0SsAJYDA0sZtJmZNa6gPndJrSRVA+uAmRExF+gSEWsA0vtD0uqHAa/krF6TltXf5jWSqiRVrV+/vgUvwczM6isouUfEBxFRAXQDBkrq20h15dtEnm1OiojKiKjs3LlzQcGamVlhijpbJiLeAOaQ9KWvldQVIL1fl1arAQ7PWa0bsLqlgZqZWeEKOVums6QD0+V2wLnAS8AMYFRabRTwWLo8AxghaR9JPYCewLwSx21mZo0oZMjfrsCU9IyXvYDpEfG4pOeB6ZKuAlYBwwEiYrGk6cCLQC0wJiI+KE/4ZmaWT5PJPSIWAv3zlG8AzmlgnYnAxBZHZ2aWFbt4xihfoWpmlkFO7mZmGeTkbmaWQU7uZmYZ5AmyzcxaYHedyNstdzOzDHJyNzPLICd3M7MMcnI3M8ug7B5Q3cVXg5mZ7U72uOS+ux6ZNjPbnbhbxswsg5zczcwyyMndzCyDnNzNzDLIyd3MLIOc3M3MMqiQOVQPl/RbSUskLZb0tbS8o6SZkpal9wflrDNO0nJJSyWdV84XYGZmOyuk5V4LfDMiegGnAGMk9QbGArMjoicwO31M+twIoA8wBPhJOv+qmZntIk0m94hYExF/TJffBpYAhwHDgClptSnAxenyMGBqRGyJiBXAcmBgieM2M7NGFNXnLqk7yWTZc4EuEbEGki8A4JC02mHAKzmr1aRl9bd1jaQqSVXr169vRuhmZtaQgpO7pP2AR4DrIuKtxqrmKYudCiImRURlRFR27ty50DDMzKwABSV3SXuTJPYHIuJXafFaSV3T57sC69LyGuDwnNW7AatLE66ZmRWikLNlBPwMWBIRd+Q8NQMYlS6PAh7LKR8haR9JPYCewLzShWxmZk0pZFTI04DPA3+WVJ2W/RtwGzBd0lXAKmA4QEQsljQdeJHkTJsxEfFBqQM3M7OGNZncI+I58vejA5zTwDoTgYktiMvMzFrAV6iamWWQk7uZWQY5uZuZZZCTu5lZBjm5m5llkJO7mVkGObmbmWWQk7uZWQY5uZuZZZCTu5lZBjm5m5llkJO7mVkGObmbmWWQk7uZWQY5uZuZZZCTu5lZBjm5m5llUCFzqN4naZ2kRTllHSXNlLQsvT8o57lxkpZLWirpvHIFbmZmDSuk5T4ZGFKvbCwwOyJ6ArPTx0jqDYwA+qTr/ERSq5JFa2ZmBWkyuUfE74DX6hUPA6aky1OAi3PKp0bElohYASwHBpYmVDMzK1Rz+9y7RMQagPT+kLT8MOCVnHo1adlOJF0jqUpS1fr165sZhpmZ5VPqA6rKUxb5KkbEpIiojIjKzp07lzgMM7OPtuYm97WSugKk9+vS8hrg8Jx63YDVzQ/PzMyao7nJfQYwKl0eBTyWUz5C0j6SegA9gXktC9HMzIrVuqkKkh4CzgI6SaoBxgO3AdMlXQWsAoYDRMRiSdOBF4FaYExEfFCm2M3MrAFNJveIGNnAU+c0UH8iMLElQZmZWcv4ClUzswxycjczyyAndzOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczyyAndzOzDHJyNzPLICd3M7MMcnI3M8sgJ3czswxycjczyyAndzOzDHJyNzPLICd3M7MMKltylzRE0lJJyyWNLdd+zMxsZ2VJ7pJaAT8Gzgd6AyMl9S7HvszMbGflarkPBJZHxF8j4j1gKjCsTPsyM7N6FBGl36h0GTAkIq5OH38eODkirs2pcw1wTfrwWGBpicPoBPyjxNssB8dZWo6ztPaEOPeEGKE8cR4ZEZ3zPdG6xDuqozxlO3yLRMQkYFKZ9o+kqoioLNf2S8VxlpbjLK09Ic49IUbY9XGWq1umBjg853E3YHWZ9mVmZvWUK7m/APSU1ENSG2AEMKNM+zIzs3rK0i0TEbWSrgV+A7QC7ouIxeXYVyPK1uVTYo6ztBxnae0Jce4JMcIujrMsB1TNzOzD5StUzcwyyMndzCyD9vjkXsgwB5K+JmmRpMWSritjLPdJWidpUU5ZR0kzJS1L7w9qYN3haXxbJVXmlLeR9HNJf5a0QNJZLYzxcEm/lbQk3d/Xiozz+5JekrRQ0qOSDixTnG0lzUu3tVjSLUXG+e00xmpJT0s6tBxx5uyvlaQ/SXq8mDhz1r9eUkjqVK44Ja1Mt1ctqaqYOCVNkPT3dN1qSReUMc4DJT2c/p0tkXRqMe+npK+mOWGxpP8oV5w5+zs2532plvSWpOuK/RsouYjYY28kB2tfBo4C2gALgN716vQFFgHtSQ4gzwJ6limeQcCJwKKcsv8AxqbLY4HvNbBuL5KLueYAlTnlY4Cfp8uHAPOBvVoQY1fgxHR5f+AvJENEFBrnYKB1uvy9unpliFPAfuny3sBc4JQi4uyQs/wvwD3liDNnH98AHgQeL+ZzT58/nOTkg78BncoVJ7CybvvN+PucAFyfp7wccU4Brk6X2wAHFhHnJ0n+x/epi6mcn3ue/bcCXgWOLCTm9H0dXeo4ImKPb7kXMsxBL+APEfFuRNQCzwCfKUcwEfE74LV6xcNI/lhJ7y9uYN0lEZHvKt3ewOy0zjrgDaDZF0JExJqI+GO6/DawBDisiDifTt9HgD+QXMNQjjgjIjamD/dOb1FEnG/lPNyX7RfRlTROAEndgKHAvTnFBcWZuhP4V3a80K/kcTagmDjzKWmckjqQNJJ+lm7zvYh4o4g4/xm4LSK25MRU8jgbcQ7wckT8rYiYy2JPT+6HAa/kPK5Jy3ItAgZJOlhSe+ACdrzAqty6RMQaSBIrSauhGAuAYZJaS+oBnESJ4pfUHehP0ipuTpxXAk+VK860q6MaWAfMjIii4pQ0UdIrwBXAzeWKE/gBSXLemlNWUJySLgL+HhEL6j1VjjgDeFrSfCXDfxQcZ+ratKvrvpwuhlLHeRSwHvh52s11r6R9i4jzGOAMSXMlPSNpQJnibMgI4KF0uaX/+y1SruEHdpVChjlYIul7wExgI8mHXJtnvd3VfSS/PqpIfrb/nhLEL2k/4BHguoh4S8r3Vja6/o1pHA+UK86I+ACoUNKv/6ikvkWufyNwo6RxwLXA+FLHKelCYF1EzC+2HzdtbNxI0tVVXzk+99MiYrWkQ4CZkl4qYt3/A3yb5P/r28B/kny5lzrO1iRdm1+NiLmSfkjSpVHM+geRdOENAKZLOqoMce5EyQWbFwHjmqh3PPBf6cOPAe9p+7HAcyJiQ0kCKkdfz666AacCv8l5PA64CahOb1/Js853gf+vjDF1Z8c+96VA13S5K7A0Xf55GuOT9dafQ06fe57t/556xxWaEePeJH2832hOnMAo4HmgfTnjrLe98cD1xb6f6XNH5n4mpYwT+HeSX4wrSfpa3wV+UUicwPEkv0pWprdaYBXwsV3wfk5owfu5w994id/PjwErcx6fATxRaJzA/wBn5az/MtC53O9nus1hwNM5j/PGnOdzGF3KOOpue3q3TL5hDn4VERXp7R6AtKWCpCOAS9j+s2lXmEGSDEnvHwOIiC+mMV7Q2MqS2qc/S5H0KaA2Il5sbjBKmug/A5ZExB3FxilpCHADcFFEvFvGODtr+5k47YBzgZeKiLNnzuYuStcteZwRMS4iukVEd5K/v/8bEZ8rJM6I+HNEHBIR3dP1a0gOdr9ahvdzX0n71y2T/FpYVEic6Tpdczb3mXTdcryfrwKvSDo2LToHeLHQOIFfA2en8RxDckD2H6WOswEj2TG35I15lynHN8auvJH0of+F5Bv6xgbqPEvyB7KA5GdPuWJ5CFgDvE/yj3oVcDDJgZxl6X3HBtb9TLrOFmAt6S8SklbSUpIDn7NIhvhsSYynk/y0Xsj2XzgXFBHncpLjHHXr3lOmOPsBf0rjXATcnJYXGucj6XoLgf8GDitHnPX2eRbbz5YpKM56669k+9kypX4/j0r//hcAi+v+V4p4P/8L+HP6fs5ge4u05O8nUEHSfbKQJFkfVEScbUh+OS0C/gicXe7PPd1+e2ADcEBOWZMxU8aWu4cfMDPLoD29W8bMzPJwcjczyyAndzOzDHJyNzPLICd3M7MMcnK3PZqkzygZTfG4Em/3c+ml9ovTUQTvrTvv3mxP4ORue7qRwHMkFxCVRHqh1teB8yOiD8nl8L8HuuSp26pU+zUrJZ/nbnusdHycpSTDvM6IiOPS8r2Au4EzgRUkjZj7IuJhSScBdwD7Af8guYBkTb3tPkty0dRvG9jvSpKxSgan+xHwb+n9ExFxQ1pvY0Tsly5fBlwYEaMlTQY2A31IvjC+ERGPl+RNMUu55W57souB/4mIvwCvSToxLb+E5IrE44GrScYgQtLewI+AyyLiJJIEPTHPdvuQXN3YmM0RcTrwO5Jx7c8mubJygKSLC4i9O8mXz1DgHkltC1jHrGBO7rYnG0kyhj/p/ch0+XTglxGxNZKxSupa4MeSTN4yMx1K+FtsH48+L0nHp7PrvCzp8pynpqX3A4A5EbE+knHuHyAZj7wp09P4lgF/BUp6zMBsTx/y1z6iJB1M0lruKylIZsAJSf9K/qGgScsXR8SpTWx+MUk/+28j4s8kww7fDbTLqfNOzjYbktvnWb9lXr8/1P2jVlJuudue6jLg/og4MpJRFQ8n6V8/neQA66WS9pLUhWRAL0j65ztL2tZNI6lPnm3/O3B7OsNSnXZ56kEy0cmZkjqlB1dHksz2BbBWUq/0GED92b+Gp/F9nGRQr3yzcJk1m1vutqcaCdxWr+wR4LMk82WeQzIy4F9IEvCbEfFeemDzLkkHkPz9/4Ckpb5NRDwpqTPwVJqw30i39Zv6QUTEmnQykN+StOKfjIi6oV3HAo+TjKK5iOQgbp2lJF8CXUjmHdjcjPfArEE+W8YySdJ+EbEx7b6ZRzIL0asfdlwA6dkyj0fEwx92LJZdbrlbVj2eXnTUBvj27pLYzXYVt9zNzDLIB1TNzDLIyd3MLIOc3M3MMsjJ3cwsg5zczcwy6P8BpFZ/E7zC33wAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] @@ -247,59 +247,59 @@ "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923823200-9238236
110-19386386110-19386372
220-29688688220-29688699
330-39779785330-39779777
440-49621599440-49621633
550-59582592550-59582596
660-69344361660-69344342
770+261256770+261299
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -307,7 +307,7 @@ }, { "data": { - "image/png": "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w4dzxhln8OUvf5l//ud/5tlnn2XLli1cfPHFjB07FoBnn32Wa6+9ls2bN7Pffvsxc+ZMbrrpJrZs2cLTTz/N6NGj+dznPrdjGz/60Y8YMWIEJ598MpD0S1988cUAvP7661x++eX85S9/oW3btkycOJE+ffowZswY2rVrx/XXXw9A7969efTRRwE455xzGDBgAM888wxdu3Zl+vTpPPbYY1RXV3PppZfSpk0b5s6dy9ixY5kxYwYtW7Zk0KBBTJgwYXfu2oLtEWPLmNnea8uWLVRWVu54XZeE77jjDkaOHMm1117LG2+8wZe//GUAxo0bR4cOHXj33Xc588wzeeGFFzj22GP53Oc+x9SpU+nXrx8bNmygbdu2fPvb36a6upo77rhjp+0uWrSIESNG7FQOcPPNN9O3b18eeeQRfvOb3/DFL36xyV8Xy5Yt44EHHuAnP/kJn/3sZ3nooYe47LLLuOOOO5gwYQJVVVW8/vrrPPzww7z44otI4s0332zubis7J3cz2yUNdct86lOf4he/+AVXX301zz///I7yadOmMXHiRGpra1m9ejVLlixBEl26dKFfv34AtG/ffpdievrpp3nooYcAOOOMM1i/fj1vvdV4V1z37t13fEmdeOKJrFy5cqc67du3p3Xr1lx55ZUMGTKE8847b5fiLCePLWNmZbF9+3aWLl1KmzZteP311wFYsWIFEyZMYPbs2bzwwgsMGTKErVu3EhFFn+7Xq1cvFixYkHdevpsQSaJly5Zs3/7ezbNyzx3fb7/9dky3aNGC2trandbRsmVL5s+fz0UXXcQjjzzC4MGDi4p5d3JyN7OyuPXWWznuuON44IEHuPzyy3nnnXfYsGED+++/PwceeCBr1qzhiSeeAODYY49l1apVPPvsswBs3LiR2tpaDjjgADZu3Jh3/ddccw2TJ09m3rx5O8ruvfdeXnvtNQYOHMh9990HwJw5c+jYsSPt27enoqKC5557DoDnnnuOFStWNPk+cmPYtGkTb731Fueeey633XZb2Q4kl4K7ZcwypJBTF0utfp/74MGDufzyy7nrrruYP38+BxxwAAMHDuS73/0uY8eOpW/fvvTq1YujjjqKU045BYBWrVoxdepUvva1r7FlyxbatGnDrFmz+OQnP8n48eOprKzc6YBq586dmTJlCtdffz1r165ln332YeDAgVx44YWMGTOGL33pS/Tp04e2bdsyefJkAC666CLuueceKisr6devH0cffXST72/kyJF89atfpU2bNjzxxBMMHTp0x6+NW2+9tbQ7s4T2iHuoVlVVhW/WYQ0p7myZzxdWMSOnQi5dupTjjjvugw7DdoN8n7WkBRFRla++u2XMzDLIyd3MLIOc3M3MMsjJ3cwsg5zczcwyyMndzCyDfJ67WZYUOipmwetr+pTRuiF/a2trOe6445g8eXLBozKuXLmSZ555hs9/vsBTWHNUVFRQXV1Nx44di162seU3bdrEN7/5TWbNmkXr1q055JBD+P73v89JJ53UrO3k09RQxqXglruZ7ZK6sWUWLVpEq1atuPPOOwtarra2lpUrV3L//fcXvc133y3fKOJXXnklHTp0YNmyZSxevJhJkybx97//vaTbWLhwIY8//nhJ11mfk7uZlcypp57K8uXL2bx5M5dffjn9+vWjb9++TJ+e3Mtn0qRJXHLJJXz6059m0KBBjBo1iqeeeorKykpuvfVWJk2axDXXXLNjfeeddx5z5swBoF27dtx0002cdNJJzJ07F4Dvf//79O/fn/79+7N8+XIA1q1bx0UXXUS/fv3o168f//u//wvA+vXrGTRoEH379uUrX/lK3vFnXn75ZebNm8d3v/td9tknSY9HHXUUQ4YkV/7ecsst9O7dm969e3PbbbcBya+P3r1771jHhAkTGDNmDACnn346N9xwA/379+foo4/mqaee4h//+Ac33XQTU6dOpbKykqlTp/K73/2OyspKKisr6du3b4NDLhTD3TJmVhK1tbU88cQTDB48mHHjxnHGGWdw99138+abb9K/f3/OOussAObOncsLL7xAhw4dmDNnDhMmTNgxpvqkSZMaXP/mzZvp3bs33/72t3eUtW/fnvnz53PPPfdw3XXX8eijj3Lttdfy9a9/nQEDBvDKK69w9tlns3TpUsaOHcuAAQO46aabeOyxx5g4ceJO21i8eDGVlZW0aNFip3kLFizgZz/7GfPmzSMiOOmkkzjttNM4+OCDm9wv8+fP5/HHH2fs2LHMmjVrp6GMP/3pT/OjH/2IU045hU2bNtG69a7fmMDJ3cx2Se7YMqeeeipXXHEF//RP/8SMGTN23Mhi69atvPLKK0AyFHCHDh2K3k6LFi246KKL3lc2fPjwHc9f//rXAZg1axZLlizZUWfD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\n", + "image/png": "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VVVV9OnTh5tv3t4h8PLLL/PJT36S448/noEDB/Lee+9x0003MWXKFCorK5kyZccbcd19992MHj2ak08+GUj6pS+++GK6du3K22+/zQUXXEC/fv046aSTmD9/PgDjxo1jwoQJ29bRt29fli9fzvLly+nVqxdf+cpX6NOnD0OGDGHTpk08+uijzJkzh0suuYTKyko2bdrE2LFj6d27N/369eO6664r635sDrfczaxZNm3aRGVl5bbXN9xwA5///Oe56667GDNmDNdccw3vvPMOX/nKVwAYP348HTt25MMPP2Tw4MHMnz+fY489ls9//vNMmTKFAQMGsH79etq3b893vvMd5syZw1133bXTdhcsWMDo0aN3Kge4+eab6d+/P0888QS/+tWv+NKXvtTor4slS5bwyCOP8JOf/ITPfe5zPPbYY1x66aXcddddTJgwgaqqKt5++20ef/xxXn/9dSTx7rvvNnW3lZ2Tu5k1S33dMp/+9Kf5+c9/zlVXXcWrr766rXzq1KlMnDiRmpoaVq1axWuvvYYkunXrxoABAwDo0KFDs2J68cUXeeyxxwA488wzWbduHe+913BXXI8ePbZ9SX3iE59g+fLlO9Xp0KEDbdu25YorrmDYsGGcd955zYqznNwtY2ZlsXXrVhYtWkS7du14++23AVi2bBkTJkxgxowZzJ8/n2HDhrF582YioujT/fr06cPcuXPzzst3EyJJtG7dmq1bt988K/fc8X322WfbdKtWraipqdlpHa1bt2b27NlcdNFFPPHEEwwdOrSomHclJ3czK4vbb7+dXr168cgjj3DZZZfxwQcfsH79evbdd18OOOAAVq9ezbPPPgvAsccey8qVK3n55ZcB2LBhAzU1Ney///5s2LAh7/qvvvpqJk2axKxZs7aVPfjgg7z11lsMGjSIhx56CICZM2fSuXNnOnToQEVFBa+88goAr7zyCsuWLWv0feTGsHHjRt577z3OPfdc7rjjjrIdSC4Fd8uYZUghpy6WWt0+96FDh3LZZZdx7733Mnv2bPbff38GDRrE9773PW655Rb69+9Pnz59OPLIIznllFMAaNOmDVOmTOHrX/86mzZtol27dkyfPp1PfepT3HrrrVRWVm7ry6/VtWtXJk+ezHXXXceaNWvYa6+9GDRoEBdeeCHjxo3jy1/+Mv369aN9+/ZMmpSMcXjRRRfxwAMPUFlZyYABAzj66KMbfX9jxozha1/7Gu3atePZZ59l+PDh235t3H777aXdmSW0R9xDtaqqKnyzDquPT4Ws36JFi+jVq9fuDsN2gXyftaS5EVGVr767ZczMMsjJ3cwsg5zczcwyyMndzCyDnNzNzDLIyd3MLIN8nrtZlow7oMTra/yU0dohf2tqaujVqxeTJk0qeFTG5cuX87vf/Y4vfKHAU1hzVFRUMGfOHDp37lz0sg0tv3HjRr71rW8xffp02rZtS6dOnfjBD37AiSee2KTt5NPYUMal4Ja7mTVL7dgyCxYsoE2bNtxzzz0FLVdTU8Py5ct5+OGHi97mhx+W7/4/V1xxBR07dmTJkiUsXLiQ+++/n7/97W8l3ca8efN45plnSrrOupzczaxkTjvtNJYuXcr777/PZZddxoABA+jfvz9PPpnchfP+++9nxIgRfOYzn2HIkCGMHTuWF154gcrKSm6//Xbuv/9+rr766m3rO++885g5cyYA++23HzfddBMnnngiL730EgA/+MEPGDhwIAMHDmTp0qUArF27losuuogBAwYwYMAA/vd//xeAdevWMWTIEPr3789Xv/rVvOPPvPHGG8yaNYvvfe977LVXkh6PPPJIhg1Lrvy97bbb6Nu3L3379uWOO+4Akl8fffv23baOCRMmMG7cOADOOOMMrr/+egYOHMjRRx/NCy+8wD/+8Y+dhjL+zW9+Q2VlJZWVlfTv37/eIReK4W4ZMyuJmpoann32WYYOHcr48eM588wzue+++3j33XcZOHAgZ511FgAvvfQS8+fPp2PHjsycOZMJEybw1FNPAUnyr8/7779P3759+c53vrOtrEOHDsyePZsHHniAa6+9lqeeeoprrrmGb3zjG5x66qmsWLGCs88+m0WLFnHLLbdw6qmnctNNN/H0008zceLEnbaxcOFCKisradWq1U7z5s6dy89+9jNmzZpFRHDiiSdy+umnc9BBBzW6X2bPns0zzzzDLbfcwvTp03cayvgzn/kMd999N6eccgobN26kbdu2je7vxjSa3CUdA+SOkn8kcBPwQFpeASwHPhcR76TL3ABcDnwI/HNE/LLZkZrZHil3bJnTTjuNyy+/nE9+8pNMmzZt240xNm/ezIoVK4BkKOCOHTsWvZ1WrVpx0UUX7VA2atSobc/f+MY3AJg+fTqvvfbatjrr169n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\n", "text/plain": [ "
" ] @@ -385,59 +385,59 @@ "data": { "text/html": [ "\n", + "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
\n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
Test Counts by Age Group
Age Group Exact Counts Perturbed Counts
00-923822000-9238208
110-19386380110-19386384
220-29688664220-29688671
330-39779813330-39779738
440-49621629440-49621567
550-59582598550-59582521
660-69344406660-69344296
770+261253770+261282
" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -445,7 +445,7 @@ }, { "data": { - "image/png": "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mDx5MlVVVSxatIinnnqKRYsW8e6773LppZfywx/+kIULFzJ79mz23XdfbrrpJi699FKqq6u59NJLd9ju4sWLOeGEE/LGNHHiRAYMGMCiRYv43ve+xxe/+MW89XItX76csWPHsmTJEg488EAefPBBLrnkEiorK7n33nuprq5m8+bNPPTQQyxZsoRFixbxrW/tuTegarJbJiL+LulmYDXJzQSeiIgnJHVJb+BLRKyVdEi6yGEk9+CsU5OW7UDSVcBVAIcffnjz3oWZfWga6pb59Kc/za9+9SvGjh3LwoULt5fPnDmTqVOnUltby9q1a3nhhReQRNeuXRk4cCAAHTp0aFZMzzzzDA8++CAAZ555Jhs3buSNNxrviuvZsycVFRUAnHDCCaxatWqnOh06dKBt27ZceeWVDBs2jPPPP79ZcZZTId0yB5G0xnsChwL7Svp8Y4vkKdvpjiARMTUiKiOisnPnvCNWmlkLtm3bNpYuXUq7du149dVXAVi5ciU333wzc+bMYdGiRQwbNowtW7YQEUWf7te3b18WLFiQd16+mxBJonXr1mzb9sHNs3LPHd9nn322T7dq1Yra2tqd1tG6dWvmz5/PxRdfzG9+8xuGDh1aVMy7UyHdMmcDKyNiQ0S8B/wa+CSwTlJXgPR5fVq/Buies3w3km4cM/sIufXWW+nduzf3338/l19+Oe+99x5vvvkm++67LwcccADr1q3j8ccfB+CYY45hzZo1PPfccwC89dZb1NbWsv/++/PWW2/lXf/VV1/NtGnTmDdv3vayX/7yl7zyyisMHjyYe++9F4C5c+fSqVMnOnToQI8ePXj++ecBeP7551m5cmWT7yM3hk2bNvHGG29w3nnncdttt5XtQHIpFHK2zGrgJEntSbplzgKqgLeB0cCU9PnhtP4s4D5Jt5C09HsB80sct5nlUcipi6VW1+deZ+jQoVx++eXcddddzJ8/n/3335/Bgwfz3e9+lxtvvJEBAwbQt29fjjzySE455RQA2rRpw4wZM/ja177G5s2badeuHbNnz+ZTn/oUU6ZMoaKiggkTJuzQ796lSxemT5/Otddey/r169lrr70YPHgwF110EZMmTeJLX/oS/fv3p3379kyblhwevPjii/nFL35BRUUFAwcO5Kijjmry/Y0ZM4avfvWrtGvXjscff5zhw4dv/7Vx6623lnZnllBB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\n", + "image/png": "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vUPg5Zdf5hOf+AQnnXQSffv2Zd26ddx6661MnDiRyspKJk7c8UZc9957L8OHD+e0004Dkn7pyy67jI4dO/L2229z8cUX06tXL0499VTmzZsHwOjRoxk7duy2dfTs2ZNly5axbNkyunXrxpe//GV69OjBgAED2LRpE48//jizZ8/m8ssvp7Kykk2bNjFy5Ei6d+9Or169uPHGG8u6H5vCLXcza5JNmzZRWVm57fXNN9/M5z73Oe655x5GjBjB9ddfzzvvvMOXv/xlAMaMGUPbtm354IMP6N+/P/PmzeOEE07gc5/7HBMnTqRPnz6sX7+e1q1b8+1vf5vZs2dzzz337LTd+fPnM3z48J3KAUaNGkXv3r158skn+dWvfsUXv/jFRn9dLF68mMcee4wf//jHfPazn+WJJ57giiuu4J577mHs2LFUVVXx9ttvM3nyZF5//XUk8e677+7qbis7J3cza5L6umU+9alP8fOf/5xrr72WV199dVv5pEmTGDduHDU1NaxcuZLXXnsNSXTq1Ik+ffoA0KZNmybF9OKLL/LEE08AcM4557B27VrWrVvX4DJdunTZ9iX18Y9/nGXLlu1Up02bNrRs2ZKrr76aQYMGceGFFzYpznJyt4yZlcXWrVtZuHAhrVq14u233wZg6dKljB07lunTpzNv3jwGDRrE5s2biYiiT/fr0aMHc+bMyTsv302IJNG8eXO2bt1+86zcc8cPOOCAbdPNmjWjpqZmp3U0b96cWbNmcemll/Lkk08ycODAomLenZzczaws7rzzTrp168Zjjz3GlVdeyfvvv8/69es58MADOeSQQ1i1ahXPPfccACeccAIrVqzg5ZdfBmDDhg3U1NRw8MEHs2HDhrzrv+666xg/fjwzZ87cVvbwww/z1ltv0a9fPx555BEAZsyYQfv27WnTpg0VFRW88sorALzyyissXbq00feRG8PGjRtZt24dF1xwAXfddVfZDiSXgrtlzDJkT5wtVLfPfeDAgVx55ZXcf//9zJo1i4MPPph+/frx3e9+l9tuu43evXvTo0cPjj32WE4//XQAWrRowcSJE/na177Gpk2baNWqFdOmTeOTn/wkt99+O5WVldv68mt17NiRCRMmcOONN7J69Wr2228/+vXrxyWXXMLo0aP50pe+RK9evWjdujXjxydjHF566aU89NBDVFZW0qdPH447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\n", "text/plain": [ "
" ] @@ -584,7 +584,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 12, @@ -593,7 +593,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -685,115 +685,115 @@ " \n", " \n", " Trial 0\n", + " 102\n", " 105\n", + " 106\n", " 107\n", - " 108\n", - " 109\n", " \n", " \n", " Trial 1\n", - " 106\n", - " 107\n", - " 108\n", - " 109\n", + " 101\n", + " 102\n", + " 103\n", + " 105\n", " \n", " \n", " Trial 2\n", - " 99\n", - " 102\n", " 105\n", " 106\n", + " 107\n", + " 108\n", " \n", " \n", " Trial 3\n", " 101\n", + " 105\n", " 106\n", " 107\n", - " 108\n", " \n", " \n", " Trial 4\n", - " 99\n", - " 101\n", + " 102\n", " 105\n", + " 106\n", " 107\n", " \n", " \n", " Trial 5\n", - " 102\n", - " 105\n", " 106\n", " 107\n", + " 108\n", + " 109\n", " \n", " \n", " Trial 6\n", - " 99\n", - " 101\n", " 105\n", " 106\n", + " 108\n", + " 110\n", " \n", " \n", " Trial 7\n", - " 98\n", + " 99\n", + " 101\n", " 105\n", - " 108\n", - " 109\n", + " 106\n", " \n", " \n", " Trial 8\n", " 105\n", - " 106\n", - " 107\n", " 108\n", + " 109\n", + " 110\n", " \n", " \n", " Trial 9\n", - " 97\n", - " 101\n", " 106\n", " 108\n", + " 109\n", + " 110\n", " \n", " \n", " Trial 10\n", " 99\n", + " 101\n", " 105\n", " 107\n", - " 108\n", " \n", " \n", " Trial 11\n", - " 101\n", - " 102\n", - " 105\n", - " 106\n", + " 108\n", + " 113\n", + " 114\n", + " 116\n", " \n", " \n", " Trial 12\n", - " 102\n", - " 103\n", + " 97\n", " 105\n", + " 106\n", " 108\n", " \n", " \n", " Trial 13\n", + " 93\n", " 105\n", - " 107\n", + " 106\n", " 108\n", - " 109\n", " \n", " \n", " Trial 14\n", " 99\n", - " 101\n", - " 105\n", - " 106\n", + " 108\n", + " 109\n", + " 111\n", " \n", " \n", " Trial 15\n", " 105\n", " 106\n", + " 107\n", " 108\n", - " 109\n", " \n", " \n", "\n", @@ -801,22 +801,22 @@ ], "text/plain": [ " Hit 1 Hit 2 Hit 3 Hit 4\n", - "Trial 0 105 107 108 109\n", - "Trial 1 106 107 108 109\n", - "Trial 2 99 102 105 106\n", - "Trial 3 101 106 107 108\n", - "Trial 4 99 101 105 107\n", - "Trial 5 102 105 106 107\n", - "Trial 6 99 101 105 106\n", - "Trial 7 98 105 108 109\n", - "Trial 8 105 106 107 108\n", - "Trial 9 97 101 106 108\n", - "Trial 10 99 105 107 108\n", - "Trial 11 101 102 105 106\n", - "Trial 12 102 103 105 108\n", - "Trial 13 105 107 108 109\n", - "Trial 14 99 101 105 106\n", - "Trial 15 105 106 108 109" + "Trial 0 102 105 106 107\n", + "Trial 1 101 102 103 105\n", + "Trial 2 105 106 107 108\n", + "Trial 3 101 105 106 107\n", + "Trial 4 102 105 106 107\n", + "Trial 5 106 107 108 109\n", + "Trial 6 105 106 108 110\n", + "Trial 7 99 101 105 106\n", + "Trial 8 105 108 109 110\n", + "Trial 9 106 108 109 110\n", + "Trial 10 99 101 105 107\n", + "Trial 11 108 113 114 116\n", + "Trial 12 97 105 106 108\n", + "Trial 13 93 105 106 108\n", + "Trial 14 99 108 109 111\n", + "Trial 15 105 106 107 108" ] }, "metadata": {}, @@ -909,147 +909,147 @@ " \n", " \n", " Trial 0\n", + " 101\n", + " 94.333003\n", " 105\n", - " 117.262669\n", - " 108\n", - " 123.009376\n", - " 109\n", - " 125.388963\n", + " 116.540378\n", + " 107\n", + " 99.852210\n", " \n", " \n", " Trial 1\n", " 105\n", - " 118.547658\n", + " 118.958331\n", " 106\n", - " 104.064030\n", + " 104.637454\n", " 107\n", - " 100.469278\n", + " 100.473764\n", " \n", " \n", " Trial 2\n", - " 101\n", - " 95.011741\n", " 105\n", - " 117.134398\n", + " 115.939499\n", " 106\n", - " 103.448672\n", + " 102.196752\n", + " 108\n", + " 119.126903\n", " \n", " \n", " Trial 3\n", " 105\n", - " 118.249159\n", + " 116.514845\n", + " 107\n", + " 101.950855\n", " 108\n", - " 111.530956\n", - " 109\n", - " 129.435022\n", + " 117.428437\n", " \n", " \n", " Trial 4\n", + " 99\n", + " 92.383778\n", " 105\n", - " 113.119498\n", + " 117.476105\n", " 106\n", - " 104.066018\n", - " 107\n", - " 99.563147\n", + " 106.978617\n", " \n", " \n", " Trial 5\n", - " 105\n", - " 116.876166\n", - " 106\n", - " 94.882927\n", - " 108\n", - " 117.329407\n", + " 99\n", + " 91.879389\n", + " 101\n", + " 96.645880\n", + " 102\n", + " 93.470753\n", " \n", " \n", " Trial 6\n", - " 102\n", - " 91.500096\n", " 105\n", - " 112.960520\n", + " 115.857213\n", " 106\n", - " 103.647990\n", + " 107.590704\n", + " 107\n", + " 101.139298\n", " \n", " \n", " Trial 7\n", " 102\n", - " 93.430881\n", + " 93.386792\n", " 105\n", - " 118.074966\n", - " 107\n", - " 101.492441\n", + " 116.203142\n", + " 106\n", + " 104.854834\n", " \n", " \n", " Trial 8\n", " 105\n", - " 115.851676\n", + " 114.667007\n", + " 106\n", + " 103.076985\n", " 107\n", - " 99.761099\n", - " 108\n", - " 115.686010\n", + " 101.595228\n", " \n", " \n", " Trial 9\n", - " 101\n", - " 95.691499\n", " 105\n", - " 115.727988\n", + " 116.973464\n", " 106\n", - " 104.892038\n", + " 107.466697\n", + " 108\n", + " 119.001433\n", " \n", " \n", " Trial 10\n", " 105\n", - " 117.357528\n", + " 117.391082\n", + " 106\n", + " 104.116967\n", " 108\n", - " 116.546237\n", - " 109\n", - " 124.174052\n", + " 116.461131\n", " \n", " \n", " Trial 11\n", " 105\n", - " 118.910976\n", - " 106\n", - " 102.760103\n", + " 116.793715\n", + " 107\n", + " 96.474912\n", " 108\n", - " 114.417216\n", + " 116.155640\n", " \n", " \n", " Trial 12\n", " 105\n", - " 115.031693\n", - " 106\n", - " 105.684317\n", - " 107\n", - " 95.866796\n", + " 116.751918\n", + " 108\n", + " 119.904706\n", + " 109\n", + " 125.606483\n", " \n", " \n", " Trial 13\n", " 105\n", - " 119.085506\n", + " 115.220385\n", " 106\n", - " 102.302534\n", + " 102.536221\n", " 107\n", - " 102.615531\n", + " 100.761623\n", " \n", " \n", " Trial 14\n", + " 101\n", + " 94.443700\n", " 105\n", - " 119.965197\n", - " 106\n", - " 104.397808\n", + " 117.569118\n", " 107\n", - " 102.721971\n", + " 93.666513\n", " \n", " \n", " Trial 15\n", " 105\n", - " 120.065230\n", + " 117.730619\n", " 106\n", - " 103.577300\n", + " 107.189240\n", " 107\n", - " 99.419053\n", + " 100.889507\n", " \n", " \n", "\n", @@ -1057,22 +1057,22 @@ ], "text/plain": [ " Hit 1 Value 1 Hit 2 Value 2 Hit 3 Value 3\n", - "Trial 0 105 117.262669 108 123.009376 109 125.388963\n", - "Trial 1 105 118.547658 106 104.064030 107 100.469278\n", - "Trial 2 101 95.011741 105 117.134398 106 103.448672\n", - "Trial 3 105 118.249159 108 111.530956 109 129.435022\n", - "Trial 4 105 113.119498 106 104.066018 107 99.563147\n", - "Trial 5 105 116.876166 106 94.882927 108 117.329407\n", - "Trial 6 102 91.500096 105 112.960520 106 103.647990\n", - "Trial 7 102 93.430881 105 118.074966 107 101.492441\n", - "Trial 8 105 115.851676 107 99.761099 108 115.686010\n", - "Trial 9 101 95.691499 105 115.727988 106 104.892038\n", - "Trial 10 105 117.357528 108 116.546237 109 124.174052\n", - "Trial 11 105 118.910976 106 102.760103 108 114.417216\n", - "Trial 12 105 115.031693 106 105.684317 107 95.866796\n", - "Trial 13 105 119.085506 106 102.302534 107 102.615531\n", - "Trial 14 105 119.965197 106 104.397808 107 102.721971\n", - "Trial 15 105 120.065230 106 103.577300 107 99.419053" + "Trial 0 101 94.333003 105 116.540378 107 99.852210\n", + "Trial 1 105 118.958331 106 104.637454 107 100.473764\n", + "Trial 2 105 115.939499 106 102.196752 108 119.126903\n", + "Trial 3 105 116.514845 107 101.950855 108 117.428437\n", + "Trial 4 99 92.383778 105 117.476105 106 106.978617\n", + "Trial 5 99 91.879389 101 96.645880 102 93.470753\n", + "Trial 6 105 115.857213 106 107.590704 107 101.139298\n", + "Trial 7 102 93.386792 105 116.203142 106 104.854834\n", + "Trial 8 105 114.667007 106 103.076985 107 101.595228\n", + "Trial 9 105 116.973464 106 107.466697 108 119.001433\n", + "Trial 10 105 117.391082 106 104.116967 108 116.461131\n", + "Trial 11 105 116.793715 107 96.474912 108 116.155640\n", + "Trial 12 105 116.751918 108 119.904706 109 125.606483\n", + "Trial 13 105 115.220385 106 102.536221 107 100.761623\n", + "Trial 14 101 94.443700 105 117.569118 107 93.666513\n", + "Trial 15 105 117.730619 106 107.189240 107 100.889507" ] }, "metadata": {}, @@ -1178,7 +1178,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 19, @@ -1187,7 +1187,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1234,7 +1234,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 20, @@ -1243,7 +1243,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1290,7 +1290,7 @@ "source": [ "# Generate some synthetic data\n", "data = pd.DataFrame()\n", - "test_results = np.random.choice([\"Negative\", \"Positive\", \"N/A\"], size=4000, p=[0.55,0.35,0.1]) \n", + "test_results = np.random.choice([\"Negative\", \"Positive\", \"N/A\"], size=100000, p=[0.55,0.35,0.1]) \n", "data[\"Test Result\"] = test_results\n", "\n", "# Compute a histogram representation of the data\n", @@ -1377,105 +1377,105 @@ " \n", " \n", " Exact Responses\n", - " 0.894250\n", - " 0.451250\n", - " 0.654500\n", + " 0.900890\n", + " 0.448370\n", + " 0.650740\n", " \n", " \n", " TRIAL 0\n", - " 0.903333\n", - " 0.470000\n", - " 0.626667\n", + " 0.900000\n", + " 0.450000\n", + " 0.650000\n", " \n", " \n", " TRIAL 1\n", - " 0.953333\n", - " 0.466667\n", - " 0.580000\n", + " 0.900000\n", + " 0.450000\n", + " 0.650000\n", " \n", " \n", " TRIAL 2\n", - " 0.890000\n", - " 0.556667\n", - " 0.553333\n", + " 0.900000\n", + " 0.450000\n", + " 0.650000\n", " \n", " \n", " TRIAL 3\n", - " 0.976667\n", - " 0.300000\n", - " 0.723333\n", + " 0.906667\n", + " 0.443333\n", + " 0.650000\n", " \n", " \n", " TRIAL 4\n", - " 0.906667\n", - " 0.466667\n", - " 0.626667\n", + " 0.900000\n", + " 0.450000\n", + " 0.650000\n", " \n", " \n", " TRIAL 5\n", - " 0.880000\n", - " 0.460000\n", - " 0.660000\n", + " 0.896667\n", + " 0.450000\n", + " 0.653333\n", " \n", " \n", " TRIAL 6\n", - " 0.903333\n", - " 0.450000\n", - " 0.646667\n", + " 0.900000\n", + " 0.446667\n", + " 0.653333\n", " \n", " \n", " TRIAL 7\n", - " 0.843333\n", + " 0.900000\n", " 0.446667\n", - " 0.710000\n", + " 0.653333\n", " \n", " \n", " TRIAL 8\n", - " 0.963333\n", - " 0.463333\n", - " 0.573333\n", + " 0.900000\n", + " 0.446667\n", + " 0.653333\n", " \n", " \n", " TRIAL 9\n", - " 0.890000\n", - " 0.433333\n", - " 0.676667\n", + " 0.900000\n", + " 0.450000\n", + " 0.650000\n", " \n", " \n", " TRIAL 10\n", - " 0.820000\n", - " 0.516667\n", - " 0.663333\n", + " 0.900000\n", + " 0.450000\n", + " 0.650000\n", " \n", " \n", " TRIAL 11\n", - " 0.876667\n", - " 0.473333\n", - " 0.650000\n", + " 0.903333\n", + " 0.450000\n", + " 0.646667\n", " \n", " \n", " TRIAL 12\n", - " 0.883333\n", - " 0.453333\n", - " 0.663333\n", + " 0.906667\n", + " 0.443333\n", + " 0.650000\n", " \n", " \n", " TRIAL 13\n", - " 0.870000\n", - " 0.520000\n", - " 0.610000\n", + " 0.900000\n", + " 0.450000\n", + " 0.650000\n", " \n", " \n", " TRIAL 14\n", - " 0.840000\n", - " 0.460000\n", - " 0.700000\n", + " 0.900000\n", + " 0.450000\n", + " 0.650000\n", " \n", " \n", " TRIAL 15\n", - " 0.856667\n", - " 0.323333\n", - " 0.820000\n", + " 0.900000\n", + " 0.450000\n", + " 0.650000\n", " \n", " \n", "\n", @@ -1483,23 +1483,23 @@ ], "text/plain": [ " Query 0 Query 1 Query 2\n", - "Exact Responses 0.894250 0.451250 0.654500\n", - "TRIAL 0 0.903333 0.470000 0.626667\n", - "TRIAL 1 0.953333 0.466667 0.580000\n", - "TRIAL 2 0.890000 0.556667 0.553333\n", - "TRIAL 3 0.976667 0.300000 0.723333\n", - "TRIAL 4 0.906667 0.466667 0.626667\n", - "TRIAL 5 0.880000 0.460000 0.660000\n", - "TRIAL 6 0.903333 0.450000 0.646667\n", - "TRIAL 7 0.843333 0.446667 0.710000\n", - "TRIAL 8 0.963333 0.463333 0.573333\n", - "TRIAL 9 0.890000 0.433333 0.676667\n", - "TRIAL 10 0.820000 0.516667 0.663333\n", - "TRIAL 11 0.876667 0.473333 0.650000\n", - "TRIAL 12 0.883333 0.453333 0.663333\n", - "TRIAL 13 0.870000 0.520000 0.610000\n", - "TRIAL 14 0.840000 0.460000 0.700000\n", - "TRIAL 15 0.856667 0.323333 0.820000" + "Exact Responses 0.900890 0.448370 0.650740\n", + "TRIAL 0 0.900000 0.450000 0.650000\n", + "TRIAL 1 0.900000 0.450000 0.650000\n", + "TRIAL 2 0.900000 0.450000 0.650000\n", + "TRIAL 3 0.906667 0.443333 0.650000\n", + "TRIAL 4 0.900000 0.450000 0.650000\n", + "TRIAL 5 0.896667 0.450000 0.653333\n", + "TRIAL 6 0.900000 0.446667 0.653333\n", + "TRIAL 7 0.900000 0.446667 0.653333\n", + "TRIAL 8 0.900000 0.446667 0.653333\n", + "TRIAL 9 0.900000 0.450000 0.650000\n", + "TRIAL 10 0.900000 0.450000 0.650000\n", + "TRIAL 11 0.903333 0.450000 0.646667\n", + "TRIAL 12 0.906667 0.443333 0.650000\n", + "TRIAL 13 0.900000 0.450000 0.650000\n", + "TRIAL 14 0.900000 0.450000 0.650000\n", + "TRIAL 15 0.900000 0.450000 0.650000" ] }, "metadata": {}, @@ -1528,6 +1528,50 @@ "### Online Multiplicative Weights Mechanism" ] }, + { + "cell_type": "code", + "execution_count": 198, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.08825778 0.17608707 0.21079394 0.14344684 0.00048991 0.09105764\n", + " 0.10965887 0.18020795]\n" + ] + } + ], + "source": [ + "from scipy.special import comb\n", + "\n", + "# Generate some synthetic data\n", + "data = pd.DataFrame()\n", + "db_size = 8\n", + "probs = np.random.random(db_size)\n", + "probs /= probs.sum()\n", + "print(probs)\n", + "test_results = np.random.choice(np.arange(db_size), size=2**22, p=probs) \n", + "data[\"Test Result\"] = test_results\n", + "\n", + "# Compute a histogram representation of the data\n", + "from relm.histogram import Histogram\n", + "hist = Histogram(data)\n", + "real_database = hist.get_db()\n", + "db_size = real_database.size\n", + "db_l1_norm = real_database.sum()\n", + "\n", + "# Specify the queries to be answered\n", + "num_ones = 5\n", + "q_size = comb(db_size, num_ones, exact=True)\n", + "queries = [{\"Test Result\": k for k in np.random.choice(np.arange(db_size), size=num_ones, replace=False)} for i in range(1024)]\n", + "num_queries = len(queries)\n", + "queries = sps.vstack([hist.get_query_vector(q) for q in queries])\n", + "\n", + "# Compute the exact query responses\n", + "values = (queries @ real_database)/real_database.sum()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1537,26 +1581,26 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 226, "metadata": {}, "outputs": [], "source": [ "from relm.mechanisms import PrivateMultiplicativeWeights\n", - "mechanism = PrivateMultiplicativeWeights(epsilon=100.0, alpha=0.1, num_queries=10000, db_size=db_size, db_l1_norm=db_l1_norm)\n", + "mechanism = PrivateMultiplicativeWeights(epsilon=1.0, alpha=0.15, beta=0.01, q_size=q_size, db_size=db_size, db_l1_norm=db_l1_norm)\n", "dp_responses = mechanism.release(values, queries)" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 227, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[0.89425 0.45125 0.6545 ]\n", - "[0.89488512 0.4513771 0.66694427]\n" + "[0.10969305 0.17630434 0.21027708 ... 0.10969305 0.21027708 0.10969305]\n", + "[0.125 0.17588722 0.21024806 ... 0.12245969 0.19205502 0.12245969]\n" ] } ], @@ -1567,27 +1611,88 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 228, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4194304\n", + "369\n", + "56\n", + "0.01\n", + "[0.10540203 0.15335905 0.19205502 0.12245969 0.02535008 0.11361118\n", + " 0.12245969 0.16530328]\n", + "0.026371550732795644\n" + ] + } + ], + "source": [ + "print(mechanism.db_l1_norm)\n", + "print(mechanism.cutoff)\n", + "print(mechanism.q_size)\n", + "print(mechanism.beta)\n", + "print(mechanism.est_data)\n", + "print(mechanism.threshold)" + ] + }, + { + "cell_type": "code", + "execution_count": 229, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[0.71523707 0.61561025 0.66915268]\n", - "[0.71523707 0.61561025 0.66915268]\n", - "[0.71523707 0.61561025 0.66915268]\n", - "[0.71523707 0.61561025 0.66915268]\n", - "[0.71523707 0.61561025 0.66915268]\n" + "0.15\n", + "0.014254546456572419\n" ] } ], "source": [ - "for i in range(5):\n", - " test_responses = mechanism.release(values, queries)\n", - " print(test_responses)" + "print(mechanism.alpha)\n", + "temp = 36*np.log(mechanism.db_size)\n", + "temp *= np.log(mechanism.q_size) + np.log(32*mechanism.db_size/(mechanism.alpha**2 * mechanism.beta))\n", + "temp /= mechanism.epsilon * mechanism.db_l1_norm * mechanism.alpha**2\n", + "print(temp)" ] }, + { + "cell_type": "code", + "execution_count": 230, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.02607616666102236" + ] + }, + "execution_count": 230, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.max(np.abs(values - dp_responses))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index b68f983..56932fa 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -74,10 +74,10 @@ class PrivateMultiplicativeWeights(ReleaseMechanism): epsilon: the privacy parameter to use data: a 1D numpy array of the underlying database alpha: the relative error of the mechanism - num_queries: the number of queries answered by the mechanism + q_size: the number of queries answered by the mechanism """ - def __init__(self, epsilon, alpha, num_queries, db_size, db_l1_norm): + def __init__(self, epsilon, alpha, beta, q_size, db_size, db_l1_norm): super(PrivateMultiplicativeWeights, self).__init__(epsilon) if not type(alpha) in (float, np.float64): @@ -86,27 +86,14 @@ def __init__(self, epsilon, alpha, num_queries, db_size, db_l1_norm): if (alpha < 0) or (alpha > 1): raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") - # if not (data >= 0).all(): - # raise ValueError( - # f"data: data must only non-negative values. Found {np.unique(data[data < 0])}" - # ) - # - # if data.dtype == np.int64: - # data = data.astype(np.uint64) - # - # if data.dtype != np.uint64: - # raise TypeError( - # f"data: data must have either the numpy.uint64 or numpy.int64 dtype. Found {data.dtype}" - # ) - - if type(num_queries) is not int: + if type(q_size) is not int: raise TypeError( - f"num_queries: num_queries must be an int. Found {type(num_queries)}" + f"q_size: q_size must be an int. Found {type(q_size)}" ) - if num_queries <= 0: + if q_size <= 0: raise ValueError( - f"num_queries: num_queries must be positive. Found {num_queries}" + f"q_size: q_size must be positive. Found {q_size}" ) self.db_l1_norm = db_l1_norm @@ -116,17 +103,21 @@ def __init__(self, epsilon, alpha, num_queries, db_size, db_l1_norm): self.alpha = alpha self.learning_rate = self.alpha / 2 - # solve inequality of Theorem 4.14 (Dwork and Roth) for beta - self.beta = epsilon * self.db_l1_norm * self.alpha ** 3 - self.beta /= 36 * np.log(self.db_size) - self.beta -= np.log(num_queries) - self.beta = np.exp(-self.beta) * 32 * np.log(self.db_size) / (self.alpha ** 2) + self.beta = beta + # # solve inequality of Theorem 4.14 (Dwork and Roth) for beta + # self.beta = epsilon * self.db_l1_norm * self.alpha ** 3 + # self.beta /= 36 * np.log(self.db_size) + # self.beta -= np.log(q_size) + # self.beta = np.exp(-self.beta) * 32 * np.log(self.db_size) / (self.alpha ** 2) - cutoff = 4 * np.log(self.db_size) / (self.alpha ** 2) + self.q_size = q_size + cutoff = 4 * np.log(self.db_size) / (self.alpha ** 2) self.cutoff = int(cutoff) + self.threshold = 18 * cutoff / (epsilon * self.db_l1_norm) - self.threshold *= np.log(2 * num_queries) + np.log(4 * cutoff / self.beta) + #self.threshold = 18 * cutoff / epsilon + self.threshold *= np.log(2 * self.q_size) + np.log(4 * cutoff / self.beta) self.sparse_numeric = SparseNumeric( epsilon, diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index cfea57a..e1dd3cf 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -308,10 +308,11 @@ def test_PrivateMultiplicativeWeights(): epsilon = 10000 num_queries = len(queries) alpha = 100 / data.sum() + beta = 0.0001 values = queries.dot(data) / data.sum() - mechanism = PrivateMultiplicativeWeights(epsilon, alpha, num_queries, len(data), data.sum()) + mechanism = PrivateMultiplicativeWeights(epsilon, alpha, beta, num_queries, len(data), data.sum()) results = mechanism.release(values, queries) assert len(results) == len(queries) @@ -322,26 +323,26 @@ def test_PrivateMultiplicativeWeights(): with pytest.raises(TypeError): _ = PrivateMultiplicativeWeights( - epsilon, data.astype(np.int32), alpha, num_queries, len(data), data.sum() + epsilon, data.astype(np.int32), alpha, beta, num_queries, len(data), data.sum() ) with pytest.raises(TypeError): - _ = PrivateMultiplicativeWeights(epsilon, 1, num_queries, len(data), data.sum()) + _ = PrivateMultiplicativeWeights(epsilon, 1, beta, num_queries, len(data), data.sum()) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, -0.1, num_queries, len(data), data.sum()) + _ = PrivateMultiplicativeWeights(epsilon, -0.1, beta, num_queries, len(data), data.sum()) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, 1.1, num_queries, len(data), data.sum()) + _ = PrivateMultiplicativeWeights(epsilon, 1.1, beta, num_queries, len(data), data.sum()) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, alpha, 0, len(data), data.sum()) + _ = PrivateMultiplicativeWeights(epsilon, alpha, beta, 0, len(data), data.sum()) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, alpha, -1, len(data), data.sum()) + _ = PrivateMultiplicativeWeights(epsilon, alpha, beta, -1, len(data), data.sum()) with pytest.raises(TypeError): - _ = PrivateMultiplicativeWeights(epsilon, alpha, float(num_queries), len(data), data.sum()) + _ = PrivateMultiplicativeWeights(epsilon, alpha, beta, float(num_queries), len(data), data.sum()) def test_PrivateMultiplicativeWeights_sparse(): @@ -355,8 +356,9 @@ def test_PrivateMultiplicativeWeights_sparse(): epsilon = 10000 num_queries = queries.shape[0] alpha = 100 / data.sum() + beta = 0.0001 values = queries.dot(data) / data.sum() - mechanism = PrivateMultiplicativeWeights(epsilon, alpha, num_queries, len(data), data.sum()) + mechanism = PrivateMultiplicativeWeights(epsilon, alpha, beta, num_queries, len(data), data.sum()) _ = mechanism.release(values, queries) From c13beda5c36dee30492c692fa98eb1c2e84ab354 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 2 Feb 2021 13:09:09 +1100 Subject: [PATCH 146/185] Moved db args from SmallDB.release() to SmallDB.__init__() --- relm/mechanisms/data_perturbation.py | 19 ++++++++++++++----- tests/test_mechanisms.py | 18 +++++++++--------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index c5b1e07..462ebf7 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -16,12 +16,17 @@ class SmallDB(ReleaseMechanism): epsilon: the privacy parameter data: a 1D array of the database in histogram format alpha: the relative error of the mechanism in range [0, 1] + db_size: the number of bins in the histogram representation of the database + db_l1_norm: the number of records in the database + """ - def __init__(self, epsilon, alpha): + def __init__(self, epsilon, alpha, db_size, db_l1_norm): super(SmallDB, self).__init__(epsilon) self.alpha = alpha + self.db_size = db_size + self.db_l1_norm = db_l1_norm if not type(alpha) is float: raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") @@ -36,15 +41,13 @@ def privacy_consumed(self): else: return self.epsilon - def release(self, values, queries, db_size, db_l1_norm): + def release(self, values, queries): """ Releases differential private responses to queries. Args: values: a numpy array of the exact query responses queries: a 2D numpy array of queries in indicator format with shape (number of queries, db size) - db_size: the number of bins in the histogram representation of the database - db_l1_norm: the number of records in the database Returns: A numpy array of perturbed values. @@ -76,7 +79,13 @@ def release(self, values, queries, db_size, db_l1_norm): breaks = np.cumsum(queries.sum(axis=1).astype(np.uint64)) db = backend.small_db( - self.epsilon, l1_norm, db_size, db_l1_norm, sparse_queries, values, breaks + self.epsilon, + l1_norm, + self.db_size, + self.db_l1_norm, + sparse_queries, + values, + breaks, ) self._is_valid = False diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index ff69133..ea11065 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -238,8 +238,8 @@ def test_SmallDB(): errors = [] for _ in range(10): - mechanism = SmallDB(epsilon, alpha) - db = mechanism.release(values, queries, db_size, db_l1_norm) + mechanism = SmallDB(epsilon, alpha, db_size, db_l1_norm) + db = mechanism.release(values, queries) errors.append(abs(values - queries.dot(db) / db.sum()).max()) errors = np.array(errors) @@ -253,19 +253,19 @@ def test_SmallDB(): # input validation with pytest.raises(TypeError): - _ = SmallDB(epsilon, 1) + _ = SmallDB(epsilon, 1, db_size, db_l1_norm) with pytest.raises(ValueError): - _ = SmallDB(epsilon, -0.1) + _ = SmallDB(epsilon, -0.1, db_size, db_l1_norm) with pytest.raises(ValueError): - _ = SmallDB(epsilon, 1.1) + _ = SmallDB(epsilon, 1.1, db_size, db_l1_norm) with pytest.raises(ValueError): - mechanism = SmallDB(epsilon, 0.001) + mechanism = SmallDB(epsilon, 0.001, db_size, db_l1_norm) qs = np.ones((1, db_size)) qs[0, 2] = -1 - _ = mechanism.release(values, qs, db_size, db_l1_norm) + _ = mechanism.release(values, qs) def test_SmallDB_sparse(): @@ -283,8 +283,8 @@ def test_SmallDB_sparse(): errors = [] for _ in range(10): - mechanism = SmallDB(epsilon, alpha) - db = mechanism.release(values, queries, db_size, db_l1_norm) + mechanism = SmallDB(epsilon, alpha, db_size, db_l1_norm) + db = mechanism.release(values, queries) errors.append(abs(values - queries.dot(db) / db.sum()).max()) errors = np.array(errors) From 8b67df28bf3e02aec3a0d35ce7245562ae46c169 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 2 Feb 2021 14:16:52 +1100 Subject: [PATCH 147/185] Refactoring for consistency and readability --- relm/mechanisms/data_perturbation.py | 40 ++++------ tests/test_mechanisms.py | 115 ++++++++++++++++----------- 2 files changed, 82 insertions(+), 73 deletions(-) diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index 5644016..cf654fd 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -23,18 +23,18 @@ class SmallDB(ReleaseMechanism): """ def __init__(self, epsilon, alpha, db_size, db_l1_norm): - - super(SmallDB, self).__init__(epsilon) - self.alpha = alpha - self.db_size = db_size - self.db_l1_norm = db_l1_norm - if not type(alpha) is float: raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") if (alpha < 0) or (alpha > 1): raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") + super(SmallDB, self).__init__(epsilon) + + self.alpha = alpha + self.db_size = db_size + self.db_l1_norm = db_l1_norm + @property def privacy_consumed(self): if self._is_valid: @@ -87,8 +87,6 @@ class PrivateMultiplicativeWeights(ReleaseMechanism): """ def __init__(self, epsilon, alpha, beta, q_size, db_size, db_l1_norm): - super(PrivateMultiplicativeWeights, self).__init__(epsilon) - if not type(alpha) in (float, np.float64): raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") @@ -96,36 +94,26 @@ def __init__(self, epsilon, alpha, beta, q_size, db_size, db_l1_norm): raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") if type(q_size) is not int: - raise TypeError( - f"q_size: q_size must be an int. Found {type(q_size)}" - ) + raise TypeError(f"q_size: q_size must be an int. Found {type(q_size)}") if q_size <= 0: - raise ValueError( - f"q_size: q_size must be positive. Found {q_size}" - ) + raise ValueError(f"q_size: q_size must be positive. Found {q_size}") - self.db_l1_norm = db_l1_norm - self.db_size = db_size - self.est_data = np.ones(self.db_size) / self.db_size + super(PrivateMultiplicativeWeights, self).__init__(epsilon) self.alpha = alpha - self.learning_rate = self.alpha / 2 - self.beta = beta - # # solve inequality of Theorem 4.14 (Dwork and Roth) for beta - # self.beta = epsilon * self.db_l1_norm * self.alpha ** 3 - # self.beta /= 36 * np.log(self.db_size) - # self.beta -= np.log(q_size) - # self.beta = np.exp(-self.beta) * 32 * np.log(self.db_size) / (self.alpha ** 2) - self.q_size = q_size + self.db_size = db_size + self.db_l1_norm = db_l1_norm + + self.est_data = np.ones(self.db_size) / self.db_size + self.learning_rate = self.alpha / 2 cutoff = 4 * np.log(self.db_size) / (self.alpha ** 2) self.cutoff = int(cutoff) self.threshold = 18 * cutoff / (epsilon * self.db_l1_norm) - #self.threshold = 18 * cutoff / epsilon self.threshold *= np.log(2 * self.q_size) + np.log(4 * cutoff / self.beta) self.sparse_numeric = SparseNumeric( diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 00a25f2..12cfc06 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -229,28 +229,34 @@ def test_SmallDB(): db_size = 3 data = np.random.randint(0, 1000, size=db_size) db_l1_norm = data.sum() + num_queries = 3 queries = np.vstack([np.random.randint(0, 2, db_size) for _ in range(num_queries)]) + values = queries.dot(data) / data.sum() epsilon = 1.0 alpha = 0.1 beta = 0.0001 - errors = [] - for _ in range(10): + mechanism = SmallDB(epsilon, alpha, db_size, db_l1_norm) + db = mechanism.release(values, queries) + + assert len(db) == db_size + assert db.sum() == int(queries.shape[0] / (alpha ** 2)) + 1 + + # Test utility guarantee + TRIALS = 10 + errors = np.empty(TRIALS) + for i in range(TRIALS): mechanism = SmallDB(epsilon, alpha, db_size, db_l1_norm) db = mechanism.release(values, queries) - errors.append(abs(values - queries.dot(db) / db.sum()).max()) - - errors = np.array(errors) + errors[i] = abs(values - queries.dot(db) / db.sum()).max() x = (np.log(db_size) * np.log(num_queries) / (alpha ** 2)) + np.log(1 / beta) error_bound = alpha + 2 * x / (epsilon * db_l1_norm) assert (errors < error_bound).all() - assert len(db) == db_size - assert db.sum() == int(queries.shape[0] / (alpha ** 2)) + 1 # input validation with pytest.raises(TypeError): @@ -273,92 +279,107 @@ def test_SmallDB_sparse(): db_size = 3 data = np.random.randint(0, 1000, size=db_size) db_l1_norm = data.sum() + num_queries = 3 queries = np.vstack([np.random.randint(0, 2, db_size) for _ in range(num_queries)]) queries = scipy.sparse.csr_matrix(queries) - values = queries.dot(data) / data.sum() + + values = queries.dot(data) / db_l1_norm epsilon = 1.0 alpha = 0.1 beta = 0.0001 - errors = [] - for _ in range(10): + mechanism = SmallDB(epsilon, alpha, db_size, db_l1_norm) + db = mechanism.release(values, queries) + + assert len(db) == db_size + assert db.sum() == int(queries.shape[0] / (alpha ** 2)) + 1 + + # Test utility guarantee + TRIALS = 10 + errors = np.empty(TRIALS) + for i in range(TRIALS): mechanism = SmallDB(epsilon, alpha, db_size, db_l1_norm) db = mechanism.release(values, queries) - errors.append(abs(values - queries.dot(db) / db.sum()).max()) - - errors = np.array(errors) + errors[i] = abs(values - queries.dot(db) / db.sum()).max() x = (np.log(db_size) * np.log(num_queries) / (alpha ** 2)) + np.log(1 / beta) error_bound = alpha + 2 * x / (epsilon * db_l1_norm) assert (errors < error_bound).all() - assert len(db) == db_size - assert db.sum() == int(queries.shape[0] / (alpha ** 2)) + 1 def test_PrivateMultiplicativeWeights(): + db_size = 32 + data = np.random.randint(0, 1000, size=db_size) + db_l1_norm = data.sum() - data = np.random.randint(0, 10, 1000) - query = np.random.randint(0, 2, 1000) - queries = [query] * 20000 - queries = np.vstack(queries) + q_size = 2 ** db_size + num_queries = 1024 + queries = np.random.randint(0, 2, size=(num_queries, db_size)) - epsilon = 10000 - num_queries = len(queries) - alpha = 100 / data.sum() - beta = 0.0001 + values = queries.dot(data) / db_l1_norm - values = queries.dot(data) / data.sum() + epsilon = 1 + alpha = 0.1 + beta = 0.0001 - mechanism = PrivateMultiplicativeWeights(epsilon, alpha, beta, num_queries, len(data), data.sum()) + mechanism = PrivateMultiplicativeWeights( + epsilon, alpha, beta, q_size, db_size, db_l1_norm + ) results = mechanism.release(values, queries) assert len(results) == len(queries) - assert ( - abs((mechanism.est_data * query).sum() * data.sum() - (data * query).sum()) - < 100 - ) + # input validation with pytest.raises(TypeError): _ = PrivateMultiplicativeWeights( - epsilon, data.astype(np.int32), alpha, beta, num_queries, len(data), data.sum() + epsilon, data.astype(np.int32), alpha, beta, q_size, db_size, db_l1_norm ) with pytest.raises(TypeError): - _ = PrivateMultiplicativeWeights(epsilon, 1, beta, num_queries, len(data), data.sum()) + _ = PrivateMultiplicativeWeights(epsilon, 1, beta, q_size, db_size, db_l1_norm) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, -0.1, beta, num_queries, len(data), data.sum()) + _ = PrivateMultiplicativeWeights( + epsilon, -0.1, beta, q_size, db_size, db_l1_norm + ) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, 1.1, beta, num_queries, len(data), data.sum()) + _ = PrivateMultiplicativeWeights( + epsilon, 1.1, beta, q_size, db_size, db_l1_norm + ) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, alpha, beta, 0, len(data), data.sum()) + _ = PrivateMultiplicativeWeights(epsilon, alpha, beta, 0, db_size, db_l1_norm) with pytest.raises(ValueError): - _ = PrivateMultiplicativeWeights(epsilon, alpha, beta, -1, len(data), data.sum()) + _ = PrivateMultiplicativeWeights(epsilon, alpha, beta, -1, db_size, db_l1_norm) with pytest.raises(TypeError): - _ = PrivateMultiplicativeWeights(epsilon, alpha, beta, float(num_queries), len(data), data.sum()) + _ = PrivateMultiplicativeWeights( + epsilon, alpha, beta, float(q_size), db_size, db_l1_norm + ) def test_PrivateMultiplicativeWeights_sparse(): + db_size = 32 + data = np.random.randint(0, 1000, size=db_size) + db_l1_norm = data.sum() - data = np.random.randint(0, 10, 1000) - query = np.random.randint(0, 2, 1000) - queries = [query] * 200 - queries = np.vstack(queries) + q_size = 2 ** db_size + num_queries = 1024 + queries = np.random.randint(0, 2, size=(num_queries, db_size)) queries = scipy.sparse.csr_matrix(queries) - epsilon = 10000 - num_queries = queries.shape[0] - alpha = 100 / data.sum() - beta = 0.0001 - values = queries.dot(data) / data.sum() - mechanism = PrivateMultiplicativeWeights(epsilon, alpha, beta, num_queries, len(data), data.sum()) - _ = mechanism.release(values, queries) + epsilon = 1.0 + alpha = 0.1 + beta = 0.0001 + + mechanism = PrivateMultiplicativeWeights( + epsilon, alpha, beta, q_size, db_size, db_l1_norm + ) + results = mechanism.release(values, queries) From 3e55c41b46ddcdedc669c7907d21d954e2dd2bec Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 2 Feb 2021 15:00:10 +1100 Subject: [PATCH 148/185] Cleaned up input validation and testing --- relm/mechanisms/data_perturbation.py | 51 +++++++++++++++++----------- tests/test_mechanisms.py | 11 ------ 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/relm/mechanisms/data_perturbation.py b/relm/mechanisms/data_perturbation.py index cf654fd..9d9c8c0 100644 --- a/relm/mechanisms/data_perturbation.py +++ b/relm/mechanisms/data_perturbation.py @@ -19,16 +19,9 @@ class SmallDB(ReleaseMechanism): alpha: the relative error of the mechanism in range [0, 1] db_size: the number of bins in the histogram representation of the database db_l1_norm: the number of records in the database - """ def __init__(self, epsilon, alpha, db_size, db_l1_norm): - if not type(alpha) is float: - raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") - - if (alpha < 0) or (alpha > 1): - raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") - super(SmallDB, self).__init__(epsilon) self.alpha = alpha @@ -42,6 +35,16 @@ def privacy_consumed(self): else: return self.epsilon + @property + def alpha(self): + return self._alpha + + @alpha.setter + def alpha(self, new_alpha): + if (new_alpha < 0) or (new_alpha > 1): + raise ValueError(f"alpha: alpha must in [0, 1], found{new_alpha}") + self._alpha = float(new_alpha) + def release(self, values, queries): """ Releases differential private responses to queries. @@ -84,21 +87,11 @@ class PrivateMultiplicativeWeights(ReleaseMechanism): data: a 1D numpy array of the underlying database alpha: the relative error of the mechanism q_size: the number of queries answered by the mechanism + db_size: the number of bins in the histogram representation of the database + db_l1_norm: the number of records in the database """ def __init__(self, epsilon, alpha, beta, q_size, db_size, db_l1_norm): - if not type(alpha) in (float, np.float64): - raise TypeError(f"alpha: alpha must be a float, found{type(alpha)}") - - if (alpha < 0) or (alpha > 1): - raise ValueError(f"alpha: alpha must in [0, 1], found{alpha}") - - if type(q_size) is not int: - raise TypeError(f"q_size: q_size must be an int. Found {type(q_size)}") - - if q_size <= 0: - raise ValueError(f"q_size: q_size must be positive. Found {q_size}") - super(PrivateMultiplicativeWeights, self).__init__(epsilon) self.alpha = alpha @@ -129,6 +122,26 @@ def __init__(self, epsilon, alpha, beta, q_size, db_size, db_l1_norm): def privacy_consumed(self): return self.sparse_numeric.privacy_consumed + @property + def alpha(self): + return self._alpha + + @alpha.setter + def alpha(self, new_alpha): + if (new_alpha < 0) or (new_alpha > 1): + raise ValueError(f"alpha: alpha must in [0, 1], found{new_alpha}") + self._alpha = float(new_alpha) + + @property + def q_size(self): + return self._q_size + + @q_size.setter + def q_size(self, new_q_size): + if new_q_size <= 0: + raise ValueError(f"q_size: q_size must be positive. Found {new_q_size}") + self._q_size = new_q_size + def update_weights(self, est_answer, noisy_answer, query): if noisy_answer < est_answer: r = query diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 12cfc06..7c1cad6 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -259,9 +259,6 @@ def test_SmallDB(): assert (errors < error_bound).all() # input validation - with pytest.raises(TypeError): - _ = SmallDB(epsilon, 1, db_size, db_l1_norm) - with pytest.raises(ValueError): _ = SmallDB(epsilon, -0.1, db_size, db_l1_norm) @@ -338,9 +335,6 @@ def test_PrivateMultiplicativeWeights(): epsilon, data.astype(np.int32), alpha, beta, q_size, db_size, db_l1_norm ) - with pytest.raises(TypeError): - _ = PrivateMultiplicativeWeights(epsilon, 1, beta, q_size, db_size, db_l1_norm) - with pytest.raises(ValueError): _ = PrivateMultiplicativeWeights( epsilon, -0.1, beta, q_size, db_size, db_l1_norm @@ -357,11 +351,6 @@ def test_PrivateMultiplicativeWeights(): with pytest.raises(ValueError): _ = PrivateMultiplicativeWeights(epsilon, alpha, beta, -1, db_size, db_l1_norm) - with pytest.raises(TypeError): - _ = PrivateMultiplicativeWeights( - epsilon, alpha, beta, float(q_size), db_size, db_l1_norm - ) - def test_PrivateMultiplicativeWeights_sparse(): db_size = 32 From 60758d24b4011d34fa30f7c8609c720b217d34d0 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Thu, 11 Feb 2021 12:21:27 +1100 Subject: [PATCH 149/185] Initial implementation of the CauchyMechanism. --- Cargo.toml | 3 +- relm/mechanisms/output_perturbation.py | 47 ++++++++++++++++++++++++++ src/lib.rs | 9 +++++ src/mechanisms.rs | 11 ++++-- src/samplers.rs | 16 ++++++--- tests/test_mechanisms.py | 44 +++++++++++++++++------- 6 files changed, 110 insertions(+), 20 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e977544..d035d8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,8 @@ crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.11.1", features = ["extension-module"] } -rand = "0.7.3" +rand = "0.8.0" +rand_distr = "0.4.0" rayon = "1.4.1" numpy = "0.11.0" rug = "1.11.0" diff --git a/relm/mechanisms/output_perturbation.py b/relm/mechanisms/output_perturbation.py index db77882..566a8fe 100644 --- a/relm/mechanisms/output_perturbation.py +++ b/relm/mechanisms/output_perturbation.py @@ -145,6 +145,53 @@ def privacy_consumed(self): return self.epsilon +class CauchyMechanism(ReleaseMechanism): + """ + ***Insecure*** implementation of the Cauchy mechanism. This mechanism can be used + once after which its privacy budget will be exhausted and it can no longer be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + beta: the smoothness parameter for the beta-smooth upper bound on the local + sensitivity of the query to which this mechanism will be applied. + """ + + def __init__(self, epsilon, beta): + super(CauchyMechanism, self).__init__(epsilon) + self.beta = beta + if self.beta > self.epsilon / 6.0: + raise ValueError("beta must not be greater than epsilon/6.0.") + + def release(self, values, smooth_sensitivity): + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + smooth_senstivity: A beta-smooth upper bound on the local sensitivity of + a query. + + Returns: + A numpy array of perturbed values. + """ + + self._check_valid() + self._is_valid = False + self._update_accountant() + effective_epsilon = self.epsilon / (6.0 * smooth_sensitivity) + return backend.cauchy_mechanism(values, effective_epsilon) + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon + + class ReportNoisyMax(ReleaseMechanism): """ Secure implementation of the ReportNoisyMax mechanism. This mechanism can be used diff --git a/src/lib.rs b/src/lib.rs index c740685..648e55b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -63,6 +63,15 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { mechanisms::geometric_mechanism(data, epsilon).to_pyarray(py) } + #[pyfn(m, "cauchy_mechanism")] + fn py_cauchy_mechanism<'a>( + py: Python<'a>, + data: &'a PyArray1, + epsilon: f64, + ) -> &'a PyArray1 { + let data = data.to_vec().unwrap(); + mechanisms::cauchy_mechanism(data, epsilon).to_pyarray(py) + } #[pyfn(m, "exponential_mechanism_weighted_index")] fn py_exponential_mechanism_weighted_index<'a>( diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 221150c..48e4263 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -51,6 +51,13 @@ pub fn geometric_mechanism(data: Vec, epsilon: f64) -> Vec { .collect() } +pub fn cauchy_mechanism(data: Vec, epsilon: f64) -> Vec { + let scale = 1.0 / epsilon; + data.par_iter() + .map(|&x| x + samplers::cauchy(scale)) + .collect() +} + pub fn exponential_mechanism_weighted_index( utilities: Vec, @@ -124,7 +131,7 @@ pub fn permute_and_flip_mechanism( let mut idx: usize = 0; let mut current: usize = 0; while !flag { - let temp = rng.gen_range(idx, n); + let temp = rng.gen_range(idx..n); indices.swap(idx, temp); current = indices[idx]; flag = samplers::bernoulli_log_p(normalized_log_weights[current]); @@ -152,7 +159,7 @@ pub fn small_db( let mut min_rounding_error: f64 = 0.5; let n = answers.len(); for i in 0..n { - let temp = (answers[i] * (l1_norm as f64)); + let temp = answers[i] * (l1_norm as f64); let rounding_error = (temp - temp.round()).abs() / (l1_norm as f64); if rounding_error < min_rounding_error{ min_rounding_error = rounding_error; diff --git a/src/samplers.rs b/src/samplers.rs index 67be5ac..162b64e 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -1,5 +1,6 @@ use rand::prelude::*; -use rand::distributions::{WeightedIndex, Bernoulli}; +// use rand::distributions::{WeightedIndex, Bernoulli}; +use rand_distr::{WeightedIndex, Bernoulli, Cauchy, Distribution}; use std::convert::TryInto; use rug::Integer; @@ -12,17 +13,24 @@ pub fn discrete(dist: &WeightedIndex) -> u64 { } - pub fn uniform_integer(n: u64) -> u64 { let mut rng = rand::thread_rng(); - let result: u64 = rng.gen_range(0, n); + let result: u64 = rng.gen_range(0..n); result } + pub fn bernoulli(p: f64) -> bool { let mut rng = rand::thread_rng(); let dist = Bernoulli::new(p).unwrap(); - dist.sample(&mut rand::thread_rng()) + dist.sample(&mut rng) +} + + +pub fn cauchy(scale: f64) -> f64 { + let mut rng = rand::thread_rng(); + let dist = Cauchy::new(0.0, scale).unwrap(); + dist.sample(&mut rng) } diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 7c1cad6..f96d810 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -5,6 +5,7 @@ from relm.mechanisms import ( LaplaceMechanism, GeometricMechanism, + CauchyMechanism, ExponentialMechanism, PermuteAndFlipMechanism, SnappingMechanism, @@ -17,16 +18,16 @@ ) -def _test_mechanism(benchmark, mechanism, dtype=np.float64): +def _test_mechanism(benchmark, mechanism, dtype, **args): data = np.random.random(100000).astype(dtype) - benchmark.pedantic(lambda: mechanism.release(data), iterations=1, rounds=1) + benchmark.pedantic(lambda: mechanism.release(data, **args), iterations=1, rounds=1) with pytest.raises(RuntimeError): - mechanism.release(data) + mechanism.release(data, **args) def test_LaplaceMechanism(benchmark): mechanism = LaplaceMechanism(epsilon=1, sensitivity=1, precision=35) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) # Goodness of fit test mechanism = LaplaceMechanism(epsilon=1, sensitivity=1, precision=35) data = np.random.random(10000000) * 100 @@ -53,6 +54,23 @@ def test_GeometricMechanism(benchmark): assert pval > 0.001 +def test_CauchyMechanism(benchmark): + mechanism = CauchyMechanism(epsilon=1.0, beta=0.1) + _test_mechanism(benchmark, mechanism, np.float64, smooth_sensitivity=1.0) + # Goodness of fit test + epsilon = 1.0 + beta = 0.1 + smooth_sensitivity = 1.0 + mechanism = CauchyMechanism(epsilon, beta) + data = 1000 * np.random.random(size=2 ** 16) + values = mechanism.release(data, smooth_sensitivity) + control = scipy.stats.cauchy.rvs( + scale=6.0 * smooth_sensitivity / epsilon, size=data.size + ) + score, pval = scipy.stats.ks_2samp(values - data, control) + assert pval > 0.001 + + def test_ExponentialMechanismWeightedIndex(benchmark): n = 8 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) @@ -64,7 +82,7 @@ def test_ExponentialMechanismWeightedIndex(benchmark): output_range=output_range, method="weighted_index", ) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) # Goodness of fit test n = 6 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) @@ -98,7 +116,7 @@ def test_ExponentialMechanismGumbelTrick(benchmark): output_range=output_range, method="gumbel_trick", ) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) # Goodness of fit test n = 6 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) @@ -132,7 +150,7 @@ def test_ExponentialMechanismSampleAndFlip(benchmark): output_range=output_range, method="sample_and_flip", ) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) # Goodness of fit test n = 6 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) @@ -165,7 +183,7 @@ def test_PermuteAndFlipMechanism(benchmark): sensitivity=1.0, output_range=output_range, ) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) # Goodness of fit test n = 6 output_range = np.arange(-(2 ** (n - 1)), 2 ** (n - 1) - 1, 2 ** -10) @@ -189,7 +207,7 @@ def test_PermuteAndFlipMechanism(benchmark): def test_above_threshold(benchmark): mechanism = AboveThreshold(epsilon=1, sensitivity=1.0, threshold=0.1) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) mechanism = AboveThreshold(epsilon=1, sensitivity=1.0, threshold=0.01) data = np.random.random(1000) index = mechanism.release(data) @@ -198,7 +216,7 @@ def test_above_threshold(benchmark): def test_sparse_indicator(benchmark): mechanism = SparseIndicator(epsilon=1, sensitivity=1.0, threshold=0.1, cutoff=100) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) mechanism = SparseIndicator(epsilon=1, sensitivity=1.0, threshold=0.01, cutoff=100) data = np.random.random(1000) indices = mechanism.release(data) @@ -207,7 +225,7 @@ def test_sparse_indicator(benchmark): def test_sparse_numeric(benchmark): mechanism = SparseNumeric(epsilon=1, sensitivity=1.0, threshold=0.1, cutoff=100) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) mechanism = SparseNumeric(epsilon=1, sensitivity=1.0, threshold=0.01, cutoff=100) data = np.random.random(1000) indices, values = mechanism.release(data) @@ -217,12 +235,12 @@ def test_sparse_numeric(benchmark): def test_SnappingMechanism(benchmark): mechanism = SnappingMechanism(epsilon=1.0, B=10) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) def test_ReportNoisyMax(benchmark): mechanism = ReportNoisyMax(epsilon=0.1, precision=35) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) def test_SmallDB(): From baecc061f18204b29bf67b233eb7bc0a395a2389 Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Tue, 23 Feb 2021 14:15:57 +1100 Subject: [PATCH 150/185] Exact uniform sampler --- src/samplers.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/src/samplers.rs b/src/samplers.rs index 67be5ac..f3787d5 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -47,11 +47,59 @@ pub fn bernoulli_log_p(log_p: f64) -> bool { pub fn uniform(scale: f64) -> f64 { - /// Returns a sample from the [0, scale) uniform distribution + /// Samples a real from [0, scale] and rounds towards zero to a floating-point number. /// - + if scale.is_nan() { + return scale; + } + if scale.is_infinite() { + // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. + return scale; + } + if scale == 0.0 { + // Knowing that scale > 0 makes the rest simpler. + return scale; // NB: can't just return zero (scale can be negative zero). + } + let mut rng = rand::thread_rng(); - scale * rng.gen::() + + let scale_bits = scale.to_bits(); + let scale_exponent = (scale_bits & ((1 << 63) - 1)) >> 52; + debug_assert!(scale_exponent < 0x800u64); + let scale_mantissa = scale_bits & ((1 << 52) - 1); + debug_assert!(scale_exponent < 0x800u64); + + if scale_exponent == 0 { + // Scale is subnormal; rejection sampling below will be very slow + debug_assert!(scale_mantissa > 0); // We know that scale != 0 + let abs_res = f64::from_bits(rng.gen_range(0, scale_mantissa)); + debug_assert!(abs_res < scale.abs()); + return abs_res.copysign(scale); + } + + loop { + let mut exponent = scale_exponent - ((scale_mantissa == 0) as u64); + // Sample exponent from geometric distribution with p = .5 + while exponent > 0 { + let partial_geometric_sample = rng.gen::().leading_zeros() as u64; + debug_assert!(partial_geometric_sample <= 64); + exponent = exponent.saturating_sub(partial_geometric_sample); + if partial_geometric_sample < 64 { + break; + } + } + + debug_assert!(exponent <= scale_exponent); + let mantissa = rng.gen::() & ((1 << 52) - 1); + if exponent < scale_exponent || mantissa < scale_mantissa { + let abs_res = f64::from_bits((exponent << 52) | mantissa); + debug_assert!(abs_res < scale.abs()); + return abs_res.copysign(scale); + } + + // result > scale; rejecting. + // The rejection ratio is < 50% always and = 0 when scale is a power of 2. + } } From 0f7932c62735e6dc242154e5d2985f12f0c4cf6c Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Wed, 24 Feb 2021 10:05:25 +1100 Subject: [PATCH 151/185] Reorganise and avoid additional sample --- src/samplers.rs | 95 +++++++++++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 34 deletions(-) diff --git a/src/samplers.rs b/src/samplers.rs index f3787d5..7efebff 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -46,59 +46,86 @@ pub fn bernoulli_log_p(log_p: f64) -> bool { } +#[inline(never)] pub fn uniform(scale: f64) -> f64 { /// Samples a real from [0, scale] and rounds towards zero to a floating-point number. /// - if scale.is_nan() { - return scale; - } - if scale.is_infinite() { + const exponent_length: u64 = 11; + const mantissa_length: u64 = 52; + debug_assert!(mantissa_length + exponent_length + 1 == 64); + const exponent_mantissa_mask: u64 = (1 << (exponent_length + mantissa_length)) - 1; + const mantissa_mask: u64 = (1 << mantissa_length) - 1; + const max_exponent: u64 = (1 << exponent_length) - 1; + const max_mantissa: u64 = (1 << mantissa_length) - 1; + + let scale_bits: u64 = scale.to_bits(); + let scale_exponent: u64 = (scale_bits & exponent_mantissa_mask) >> mantissa_length; + let scale_mantissa: u64 = scale_bits & mantissa_mask; + debug_assert!(scale_exponent <= max_exponent); + debug_assert!(scale_mantissa <= max_mantissa); + + if scale_exponent == max_exponent { + debug_assert!(scale.is_nan() || scale.is_infinite()); // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. return scale; } - if scale == 0.0 { - // Knowing that scale > 0 makes the rest simpler. - return scale; // NB: can't just return zero (scale can be negative zero). + + if scale_exponent == 0 && scale_mantissa == 0 { + debug_assert!(scale == 0.0); + // Can't just return zero (scale can be negative zero). + return scale; } + debug_assert!(scale.abs() > 0.0); let mut rng = rand::thread_rng(); - let scale_bits = scale.to_bits(); - let scale_exponent = (scale_bits & ((1 << 63) - 1)) >> 52; - debug_assert!(scale_exponent < 0x800u64); - let scale_mantissa = scale_bits & ((1 << 52) - 1); - debug_assert!(scale_exponent < 0x800u64); - if scale_exponent == 0 { - // Scale is subnormal; rejection sampling below will be very slow - debug_assert!(scale_mantissa > 0); // We know that scale != 0 - let abs_res = f64::from_bits(rng.gen_range(0, scale_mantissa)); - debug_assert!(abs_res < scale.abs()); - return abs_res.copysign(scale); + // scale is subnormal. No need to deal with exponents since [0, scale] has + // even intervals. Generate random mantissa in [0, scale_mantissa). Also + // generate an extra bit for rounding direction. + let mantissa_and_rounding: u64 = rng.gen_range(0, scale_mantissa << 1); + let mantissa: u64 = (mantissa_and_rounding >> 1) + (mantissa_and_rounding & 1); + let res: f64 = f64::from_bits(mantissa).copysign(scale); + debug_assert!(res.abs() <= scale.abs()); + return res; } - - loop { - let mut exponent = scale_exponent - ((scale_mantissa == 0) as u64); - // Sample exponent from geometric distribution with p = .5 - while exponent > 0 { - let partial_geometric_sample = rng.gen::().leading_zeros() as u64; - debug_assert!(partial_geometric_sample <= 64); - exponent = exponent.saturating_sub(partial_geometric_sample); - if partial_geometric_sample < 64 { - break; + + // Scale is a normal float. + loop { // Rejection sampling. + // Sample from [0, 2^n) where n is the smallest integer such that scale <= 2^n. + let rng_sample: u64 = rng.gen::(); + + let rounding: u64 = rng_sample & 1; + let mantissa: u64 = (rng_sample >> 1) & mantissa_mask; + let mut exponent: u64 = scale_exponent - ((scale_mantissa == 0) as u64); + + // Subtract from exponent a sample from geometric distribution with p = .5 + // We still have not used the leading 11 bits of rng_sample. Re-use them to + // avoid generating another rng sample. + let rng_sample_geo: u64 = rng_sample & !((1 << 53) - 1); // Zero out trailing bits + if rng_sample == 0 { + exponent = exponent.saturating_sub(11); + while exponent > 0 { + let rng_sample_inner: u64 = rng.gen::(); + if rng_sample_inner != 0 { + exponent = exponent.saturating_sub(rng_sample_inner.leading_zeros() as u64); + break; + } + exponent = exponent.saturating_sub(64); } + } else { + exponent = exponent.saturating_sub(rng_sample_geo.leading_zeros() as u64); } debug_assert!(exponent <= scale_exponent); - let mantissa = rng.gen::() & ((1 << 52) - 1); if exponent < scale_exponent || mantissa < scale_mantissa { - let abs_res = f64::from_bits((exponent << 52) | mantissa); - debug_assert!(abs_res < scale.abs()); - return abs_res.copysign(scale); + let res: f64 = f64::from_bits((exponent << mantissa_length) + + mantissa + + rounding).copysign(scale); + debug_assert!(res.abs() <= scale.abs()); + return res; } - // result > scale; rejecting. - // The rejection ratio is < 50% always and = 0 when scale is a power of 2. } } From 00aa61d24caac48847246d3d102b658f0b911111 Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Wed, 24 Feb 2021 10:07:21 +1100 Subject: [PATCH 152/185] Minor docs and remove debugging change --- src/samplers.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/samplers.rs b/src/samplers.rs index 7efebff..c49689c 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -46,9 +46,8 @@ pub fn bernoulli_log_p(log_p: f64) -> bool { } -#[inline(never)] pub fn uniform(scale: f64) -> f64 { - /// Samples a real from [0, scale] and rounds towards zero to a floating-point number. + /// Samples a real from [0, scale] and rounds towards the nearest floating-point number. /// const exponent_length: u64 = 11; const mantissa_length: u64 = 52; From 367b6bd639579b7d05e78fdfc442861ba84106ed Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Wed, 24 Feb 2021 16:21:23 +1100 Subject: [PATCH 153/185] Minor bugfixes --- src/samplers.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/samplers.rs b/src/samplers.rs index c49689c..d78f9bd 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -66,7 +66,7 @@ pub fn uniform(scale: f64) -> f64 { if scale_exponent == max_exponent { debug_assert!(scale.is_nan() || scale.is_infinite()); // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. - return scale; + return scale + 0.0; // Pedantic: add 0 to handle signalling NaNs. } if scale_exponent == 0 && scale_mantissa == 0 { @@ -101,9 +101,9 @@ pub fn uniform(scale: f64) -> f64 { // Subtract from exponent a sample from geometric distribution with p = .5 // We still have not used the leading 11 bits of rng_sample. Re-use them to // avoid generating another rng sample. - let rng_sample_geo: u64 = rng_sample & !((1 << 53) - 1); // Zero out trailing bits - if rng_sample == 0 { - exponent = exponent.saturating_sub(11); + let rng_sample_geo: u64 = rng_sample & !((1 << (mantissa_length + 1)) - 1); + if rng_sample_geo == 0 { + exponent = exponent.saturating_sub(64 - mantissa_length - 1); while exponent > 0 { let rng_sample_inner: u64 = rng.gen::(); if rng_sample_inner != 0 { From af593c276103c5eba55285640ea35de449ebf2ff Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 2 Mar 2021 10:29:24 +1100 Subject: [PATCH 154/185] Changed names in privacy accountant to read more naturally --- relm/accountant.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/relm/accountant.py b/relm/accountant.py index a085b0a..2bd1400 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -9,7 +9,7 @@ class PrivacyAccountant: def __init__(self, privacy_budget): self.privacy_budget = privacy_budget self._privacy_losses = dict() - self._max_privacy_loss = 0 + self.privacy_allocated = 0 @property def privacy_consumed(self): @@ -32,11 +32,11 @@ def add_mechanism(self, mechanism): "mechanism: attempted to add a mechanism to two accountants." ) - if self._max_privacy_loss + mechanism.epsilon > self.privacy_budget: + if self.privacy_allocated + mechanism.epsilon > self.privacy_budget: raise ValueError( f"mechanism: using this mechanism could exceed the privacy budget of {self.privacy_budget}" - f" with a total privacy loss of {self._max_privacy_loss + mechanism.epsilon}" + f" with a total privacy loss of {self.privacy_allocated + mechanism.epsilon}" ) mechanism.accountant = self self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed - self._max_privacy_loss += mechanism.epsilon + self.privacy_allocated += mechanism.epsilon From 0a381b37252288df02c2ed85ef965ddfcf4f9e77 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 2 Mar 2021 10:35:23 +1100 Subject: [PATCH 155/185] More simple name changes --- relm/accountant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relm/accountant.py b/relm/accountant.py index 2bd1400..656a087 100644 --- a/relm/accountant.py +++ b/relm/accountant.py @@ -35,7 +35,7 @@ def add_mechanism(self, mechanism): if self.privacy_allocated + mechanism.epsilon > self.privacy_budget: raise ValueError( f"mechanism: using this mechanism could exceed the privacy budget of {self.privacy_budget}" - f" with a total privacy loss of {self.privacy_allocated + mechanism.epsilon}" + f" with a total privacy alocated of {self.privacy_allocated + mechanism.epsilon}" ) mechanism.accountant = self self._privacy_losses[hash(mechanism)] = mechanism.privacy_consumed From bb1be70a7b0efb18e40bad263152290c955a6176 Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Thu, 4 Mar 2021 16:02:42 +1100 Subject: [PATCH 156/185] test uniform sampler --- src/lib.rs | 12 ++++++++++++ src/mechanisms.rs | 2 +- src/samplers.rs | 32 +++++++++++--------------------- tests/test_samplers.py | 10 ++++++++++ 4 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 tests/test_samplers.py diff --git a/src/lib.rs b/src/lib.rs index c740685..60771a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -142,5 +142,17 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { mechanisms::small_db(epsilon, l1_norm, size, db_l1_norm, queries, answers, breaks).to_pyarray(py) } + // For testing + #[pyfn(m, "sample_uniform")] + fn py_sample_uniform<'a>( + py: Python<'a>, + scale: f64, + size: u64, + ) -> &'a PyArray1 { + (0..size).map(|_| samplers::uniform(scale)) + .collect::>() + .to_pyarray(py) + } + Ok(()) } diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 221150c..11133f9 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -25,7 +25,7 @@ pub fn all_above_threshold(data: Vec, epsilon: f64, threshold: f64, precisi pub fn snapping(data: Vec, bound: f64, lambda: f64, quanta: f64) -> Vec { data.par_iter() .map(|&p| utils::clamp(p, bound)) - .map(|p| p + lambda * utils::ln_rn(samplers::uniform_double(1.0)) * (samplers::uniform(1.0) - 0.5).signum()) + .map(|p| p + lambda * utils::ln_rn(samplers::uniform(1.0)) * (samplers::uniform(1.0) - 0.5).signum()) .map(|p| quanta * (p / quanta).round()) .map(|p| utils::clamp(p, bound)) .collect() diff --git a/src/samplers.rs b/src/samplers.rs index d78f9bd..22180c0 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -63,22 +63,19 @@ pub fn uniform(scale: f64) -> f64 { debug_assert!(scale_exponent <= max_exponent); debug_assert!(scale_mantissa <= max_mantissa); - if scale_exponent == max_exponent { - debug_assert!(scale.is_nan() || scale.is_infinite()); + if scale_exponent == max_exponent || (scale_exponent == 0 && scale_mantissa == 0) { + debug_assert!(scale.is_nan() || scale.is_infinite() || scale == 0.0); // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. - return scale + 0.0; // Pedantic: add 0 to handle signalling NaNs. - } - - if scale_exponent == 0 && scale_mantissa == 0 { - debug_assert!(scale == 0.0); - // Can't just return zero (scale can be negative zero). - return scale; + // Sub 0 to handle signalling NaNs while keeping sign. + return scale - 0.0; } - debug_assert!(scale.abs() > 0.0); + debug_assert!(scale != 0.0); + debug_assert!(scale.is_finite()); let mut rng = rand::thread_rng(); if scale_exponent == 0 { + debug_assert!(!scale.is_normal()); // scale is subnormal. No need to deal with exponents since [0, scale] has // even intervals. Generate random mantissa in [0, scale_mantissa). Also // generate an extra bit for rounding direction. @@ -89,6 +86,7 @@ pub fn uniform(scale: f64) -> f64 { return res; } + debug_assert!(scale.is_normal()); // Scale is a normal float. loop { // Rejection sampling. // Sample from [0, 2^n) where n is the smallest integer such that scale <= 2^n. @@ -124,6 +122,9 @@ pub fn uniform(scale: f64) -> f64 { debug_assert!(res.abs() <= scale.abs()); return res; } + + debug_assert!(f64::from_bits((exponent << mantissa_length) + mantissa + rounding) + > scale.abs()); // result > scale; rejecting. } } @@ -151,17 +152,6 @@ pub fn gumbel(scale: f64) -> f64 { } -pub fn uniform_double(scale: f64) -> f64 { - /// Returns a sample from the [0, scale) uniform distribution - /// - - let mut rng = rand::thread_rng(); - let exponent: f64 = geometric(0.5) + 53.0; - let significand = (rng.gen::() >> 11) | (1 << 52); - scale * (significand as f64) * 2.0_f64.powf(-exponent) -} - - pub fn fixed_point_exponential(biases: &Vec, scale: f64, precision: i32) -> i64 { /// this function computes the fixed point exponential distribution /// diff --git a/tests/test_samplers.py b/tests/test_samplers.py new file mode 100644 index 0000000..ca9ec33 --- /dev/null +++ b/tests/test_samplers.py @@ -0,0 +1,10 @@ +import numpy as np +import scipy.stats + +import relm.backend + + +def test_uniform_sampler(): + samples = relm.backend.sample_uniform(1.0, 10_000_000) + score, pval = scipy.stats.kstest(samples, 'uniform') + assert pval > 0.001 From c1378a42edbf1e7f077e71186d4900d41de93051 Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Thu, 4 Mar 2021 22:29:42 +1100 Subject: [PATCH 157/185] Cleanup --- src/samplers.rs | 76 +++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/src/samplers.rs b/src/samplers.rs index 22180c0..724ca65 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -46,24 +46,50 @@ pub fn bernoulli_log_p(log_p: f64) -> bool { } +fn capped_geometric2(cap: u64, rng: &mut rand::rngs::ThreadRng) -> u64 { + /// Samples an integer from the geometric distribution with success + /// probability = .5. Results greater than `cap` saturate to `cap`. + /// + let mut res = 0; + while res < cap { + let sample = rng.next_u64(); + if sample != 0 { + res += sample.trailing_zeros() as u64; + break; + } + res = res.saturating_add(64); + } + if res >= cap { + cap + } else { + res + } +} + + +fn extract_bits(x: u64, i: u64, len: u64) -> u64 { + // Returns len bits from x, beginning at index i. + // The least-significant bit has index 0. + (x >> i) & ((1 << len) - 1) +} + + pub fn uniform(scale: f64) -> f64 { /// Samples a real from [0, scale] and rounds towards the nearest floating-point number. /// - const exponent_length: u64 = 11; - const mantissa_length: u64 = 52; - debug_assert!(mantissa_length + exponent_length + 1 == 64); - const exponent_mantissa_mask: u64 = (1 << (exponent_length + mantissa_length)) - 1; - const mantissa_mask: u64 = (1 << mantissa_length) - 1; - const max_exponent: u64 = (1 << exponent_length) - 1; - const max_mantissa: u64 = (1 << mantissa_length) - 1; + const EXPONENT_LEN: u64 = 11; + const MANTISSA_LEN: u64 = 52; + debug_assert!(MANTISSA_LEN + EXPONENT_LEN + 1 == 64); + const MAX_EXPONENT: u64 = (1 << EXPONENT_LEN) - 1; + const MAX_MANTISSA: u64 = (1 << MANTISSA_LEN) - 1; let scale_bits: u64 = scale.to_bits(); - let scale_exponent: u64 = (scale_bits & exponent_mantissa_mask) >> mantissa_length; - let scale_mantissa: u64 = scale_bits & mantissa_mask; - debug_assert!(scale_exponent <= max_exponent); - debug_assert!(scale_mantissa <= max_mantissa); + let scale_exponent: u64 = extract_bits(scale_bits, MANTISSA_LEN, EXPONENT_LEN); + let scale_mantissa: u64 = extract_bits(scale_bits, 0, MANTISSA_LEN); + debug_assert!(scale_exponent <= MAX_EXPONENT); + debug_assert!(scale_mantissa <= MAX_MANTISSA); - if scale_exponent == max_exponent || (scale_exponent == 0 && scale_mantissa == 0) { + if scale_exponent == MAX_EXPONENT || (scale_exponent == 0 && scale_mantissa == 0) { debug_assert!(scale.is_nan() || scale.is_infinite() || scale == 0.0); // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. // Sub 0 to handle signalling NaNs while keeping sign. @@ -90,40 +116,34 @@ pub fn uniform(scale: f64) -> f64 { // Scale is a normal float. loop { // Rejection sampling. // Sample from [0, 2^n) where n is the smallest integer such that scale <= 2^n. - let rng_sample: u64 = rng.gen::(); + let rng_sample: u64 = rng.next_u64(); - let rounding: u64 = rng_sample & 1; - let mantissa: u64 = (rng_sample >> 1) & mantissa_mask; + let rounding: u64 = extract_bits(rng_sample, EXPONENT_LEN, 1); + let mantissa: u64 = extract_bits(rng_sample, 1 + EXPONENT_LEN, MANTISSA_LEN); let mut exponent: u64 = scale_exponent - ((scale_mantissa == 0) as u64); // Subtract from exponent a sample from geometric distribution with p = .5 // We still have not used the leading 11 bits of rng_sample. Re-use them to // avoid generating another rng sample. - let rng_sample_geo: u64 = rng_sample & !((1 << (mantissa_length + 1)) - 1); + let rng_sample_geo: u64 = extract_bits(rng_sample, 0, EXPONENT_LEN); if rng_sample_geo == 0 { - exponent = exponent.saturating_sub(64 - mantissa_length - 1); - while exponent > 0 { - let rng_sample_inner: u64 = rng.gen::(); - if rng_sample_inner != 0 { - exponent = exponent.saturating_sub(rng_sample_inner.leading_zeros() as u64); - break; - } - exponent = exponent.saturating_sub(64); - } + exponent = exponent.saturating_sub(EXPONENT_LEN); + exponent -= capped_geometric2(exponent, &mut rng); } else { - exponent = exponent.saturating_sub(rng_sample_geo.leading_zeros() as u64); + exponent = exponent.saturating_sub(rng_sample_geo.trailing_zeros() as u64); } debug_assert!(exponent <= scale_exponent); if exponent < scale_exponent || mantissa < scale_mantissa { - let res: f64 = f64::from_bits((exponent << mantissa_length) + // result < scale; accept + let res: f64 = f64::from_bits((exponent << MANTISSA_LEN) + mantissa + rounding).copysign(scale); debug_assert!(res.abs() <= scale.abs()); return res; } - debug_assert!(f64::from_bits((exponent << mantissa_length) + mantissa + rounding) + debug_assert!(f64::from_bits((exponent << MANTISSA_LEN) + mantissa + rounding) > scale.abs()); // result > scale; rejecting. } From 7390834e52ea110580bfe4cd76b34b0b865117b6 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 13:18:02 +1100 Subject: [PATCH 158/185] Change parameters to probe build process error --- tests/test_samplers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_samplers.py b/tests/test_samplers.py index ca9ec33..c05a4a8 100644 --- a/tests/test_samplers.py +++ b/tests/test_samplers.py @@ -5,6 +5,6 @@ def test_uniform_sampler(): - samples = relm.backend.sample_uniform(1.0, 10_000_000) + samples = relm.backend.sample_uniform(1.0, 1_000_000) score, pval = scipy.stats.kstest(samples, 'uniform') assert pval > 0.001 From b137447f8b815e9fe614d47eb2e78c7243d0b339 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 13:32:29 +1100 Subject: [PATCH 159/185] Comment out new uniform sampler to probe build error --- src/samplers.rs | 150 ++++++++++++++++++++++++------------------------ 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/src/samplers.rs b/src/samplers.rs index 724ca65..fc97112 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -74,81 +74,81 @@ fn extract_bits(x: u64, i: u64, len: u64) -> u64 { } -pub fn uniform(scale: f64) -> f64 { - /// Samples a real from [0, scale] and rounds towards the nearest floating-point number. - /// - const EXPONENT_LEN: u64 = 11; - const MANTISSA_LEN: u64 = 52; - debug_assert!(MANTISSA_LEN + EXPONENT_LEN + 1 == 64); - const MAX_EXPONENT: u64 = (1 << EXPONENT_LEN) - 1; - const MAX_MANTISSA: u64 = (1 << MANTISSA_LEN) - 1; - - let scale_bits: u64 = scale.to_bits(); - let scale_exponent: u64 = extract_bits(scale_bits, MANTISSA_LEN, EXPONENT_LEN); - let scale_mantissa: u64 = extract_bits(scale_bits, 0, MANTISSA_LEN); - debug_assert!(scale_exponent <= MAX_EXPONENT); - debug_assert!(scale_mantissa <= MAX_MANTISSA); - - if scale_exponent == MAX_EXPONENT || (scale_exponent == 0 && scale_mantissa == 0) { - debug_assert!(scale.is_nan() || scale.is_infinite() || scale == 0.0); - // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. - // Sub 0 to handle signalling NaNs while keeping sign. - return scale - 0.0; - } - - debug_assert!(scale != 0.0); - debug_assert!(scale.is_finite()); - let mut rng = rand::thread_rng(); - - if scale_exponent == 0 { - debug_assert!(!scale.is_normal()); - // scale is subnormal. No need to deal with exponents since [0, scale] has - // even intervals. Generate random mantissa in [0, scale_mantissa). Also - // generate an extra bit for rounding direction. - let mantissa_and_rounding: u64 = rng.gen_range(0, scale_mantissa << 1); - let mantissa: u64 = (mantissa_and_rounding >> 1) + (mantissa_and_rounding & 1); - let res: f64 = f64::from_bits(mantissa).copysign(scale); - debug_assert!(res.abs() <= scale.abs()); - return res; - } - - debug_assert!(scale.is_normal()); - // Scale is a normal float. - loop { // Rejection sampling. - // Sample from [0, 2^n) where n is the smallest integer such that scale <= 2^n. - let rng_sample: u64 = rng.next_u64(); - - let rounding: u64 = extract_bits(rng_sample, EXPONENT_LEN, 1); - let mantissa: u64 = extract_bits(rng_sample, 1 + EXPONENT_LEN, MANTISSA_LEN); - let mut exponent: u64 = scale_exponent - ((scale_mantissa == 0) as u64); - - // Subtract from exponent a sample from geometric distribution with p = .5 - // We still have not used the leading 11 bits of rng_sample. Re-use them to - // avoid generating another rng sample. - let rng_sample_geo: u64 = extract_bits(rng_sample, 0, EXPONENT_LEN); - if rng_sample_geo == 0 { - exponent = exponent.saturating_sub(EXPONENT_LEN); - exponent -= capped_geometric2(exponent, &mut rng); - } else { - exponent = exponent.saturating_sub(rng_sample_geo.trailing_zeros() as u64); - } - - debug_assert!(exponent <= scale_exponent); - if exponent < scale_exponent || mantissa < scale_mantissa { - // result < scale; accept - let res: f64 = f64::from_bits((exponent << MANTISSA_LEN) - + mantissa - + rounding).copysign(scale); - debug_assert!(res.abs() <= scale.abs()); - return res; - } - - debug_assert!(f64::from_bits((exponent << MANTISSA_LEN) + mantissa + rounding) - > scale.abs()); - // result > scale; rejecting. - } -} - +// pub fn uniform(scale: f64) -> f64 { +// /// Samples a real from [0, scale] and rounds towards the nearest floating-point number. +// /// +// const EXPONENT_LEN: u64 = 11; +// const MANTISSA_LEN: u64 = 52; +// debug_assert!(MANTISSA_LEN + EXPONENT_LEN + 1 == 64); +// const MAX_EXPONENT: u64 = (1 << EXPONENT_LEN) - 1; +// const MAX_MANTISSA: u64 = (1 << MANTISSA_LEN) - 1; +// +// let scale_bits: u64 = scale.to_bits(); +// let scale_exponent: u64 = extract_bits(scale_bits, MANTISSA_LEN, EXPONENT_LEN); +// let scale_mantissa: u64 = extract_bits(scale_bits, 0, MANTISSA_LEN); +// debug_assert!(scale_exponent <= MAX_EXPONENT); +// debug_assert!(scale_mantissa <= MAX_MANTISSA); +// +// if scale_exponent == MAX_EXPONENT || (scale_exponent == 0 && scale_mantissa == 0) { +// debug_assert!(scale.is_nan() || scale.is_infinite() || scale == 0.0); +// // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. +// // Sub 0 to handle signalling NaNs while keeping sign. +// return scale - 0.0; +// } +// +// debug_assert!(scale != 0.0); +// debug_assert!(scale.is_finite()); +// let mut rng = rand::thread_rng(); +// +// if scale_exponent == 0 { +// debug_assert!(!scale.is_normal()); +// // scale is subnormal. No need to deal with exponents since [0, scale] has +// // even intervals. Generate random mantissa in [0, scale_mantissa). Also +// // generate an extra bit for rounding direction. +// let mantissa_and_rounding: u64 = rng.gen_range(0, scale_mantissa << 1); +// let mantissa: u64 = (mantissa_and_rounding >> 1) + (mantissa_and_rounding & 1); +// let res: f64 = f64::from_bits(mantissa).copysign(scale); +// debug_assert!(res.abs() <= scale.abs()); +// return res; +// } +// +// debug_assert!(scale.is_normal()); +// // Scale is a normal float. +// loop { // Rejection sampling. +// // Sample from [0, 2^n) where n is the smallest integer such that scale <= 2^n. +// let rng_sample: u64 = rng.next_u64(); +// +// let rounding: u64 = extract_bits(rng_sample, EXPONENT_LEN, 1); +// let mantissa: u64 = extract_bits(rng_sample, 1 + EXPONENT_LEN, MANTISSA_LEN); +// let mut exponent: u64 = scale_exponent - ((scale_mantissa == 0) as u64); +// +// // Subtract from exponent a sample from geometric distribution with p = .5 +// // We still have not used the leading 11 bits of rng_sample. Re-use them to +// // avoid generating another rng sample. +// let rng_sample_geo: u64 = extract_bits(rng_sample, 0, EXPONENT_LEN); +// if rng_sample_geo == 0 { +// exponent = exponent.saturating_sub(EXPONENT_LEN); +// exponent -= capped_geometric2(exponent, &mut rng); +// } else { +// exponent = exponent.saturating_sub(rng_sample_geo.trailing_zeros() as u64); +// } +// +// debug_assert!(exponent <= scale_exponent); +// if exponent < scale_exponent || mantissa < scale_mantissa { +// // result < scale; accept +// let res: f64 = f64::from_bits((exponent << MANTISSA_LEN) +// + mantissa +// + rounding).copysign(scale); +// debug_assert!(res.abs() <= scale.abs()); +// return res; +// } +// +// debug_assert!(f64::from_bits((exponent << MANTISSA_LEN) + mantissa + rounding) +// > scale.abs()); +// // result > scale; rejecting. +// } +// } +// pub fn geometric(scale: f64) -> f64 { /// Returns a sample from the geometric distribution From 16192601b5dc45715626f65f4006012e5926c709 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 13:46:34 +1100 Subject: [PATCH 160/185] More probing --- src/lib.rs | 24 ++++++++++++------------ src/mechanisms.rs | 16 ++++++++-------- tests/test_samplers.py | 8 ++++---- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 60771a1..66c8e9a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -142,17 +142,17 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { mechanisms::small_db(epsilon, l1_norm, size, db_l1_norm, queries, answers, breaks).to_pyarray(py) } - // For testing - #[pyfn(m, "sample_uniform")] - fn py_sample_uniform<'a>( - py: Python<'a>, - scale: f64, - size: u64, - ) -> &'a PyArray1 { - (0..size).map(|_| samplers::uniform(scale)) - .collect::>() - .to_pyarray(py) - } - + // // For testing + // #[pyfn(m, "sample_uniform")] + // fn py_sample_uniform<'a>( + // py: Python<'a>, + // scale: f64, + // size: u64, + // ) -> &'a PyArray1 { + // (0..size).map(|_| samplers::uniform(scale)) + // .collect::>() + // .to_pyarray(py) + // } + // Ok(()) } diff --git a/src/mechanisms.rs b/src/mechanisms.rs index 11133f9..4163507 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -22,14 +22,14 @@ pub fn all_above_threshold(data: Vec, epsilon: f64, threshold: f64, precisi } -pub fn snapping(data: Vec, bound: f64, lambda: f64, quanta: f64) -> Vec { - data.par_iter() - .map(|&p| utils::clamp(p, bound)) - .map(|p| p + lambda * utils::ln_rn(samplers::uniform(1.0)) * (samplers::uniform(1.0) - 0.5).signum()) - .map(|p| quanta * (p / quanta).round()) - .map(|p| utils::clamp(p, bound)) - .collect() -} +// pub fn snapping(data: Vec, bound: f64, lambda: f64, quanta: f64) -> Vec { +// data.par_iter() +// .map(|&p| utils::clamp(p, bound)) +// .map(|p| p + lambda * utils::ln_rn(samplers::uniform(1.0)) * (samplers::uniform(1.0) - 0.5).signum()) +// .map(|p| quanta * (p / quanta).round()) +// .map(|p| utils::clamp(p, bound)) +// .collect() +// } pub fn laplace_mechanism(data: Vec, epsilon: f64, precision: i32) -> Vec { diff --git a/tests/test_samplers.py b/tests/test_samplers.py index c05a4a8..97fe994 100644 --- a/tests/test_samplers.py +++ b/tests/test_samplers.py @@ -4,7 +4,7 @@ import relm.backend -def test_uniform_sampler(): - samples = relm.backend.sample_uniform(1.0, 1_000_000) - score, pval = scipy.stats.kstest(samples, 'uniform') - assert pval > 0.001 +# def test_uniform_sampler(): +# samples = relm.backend.sample_uniform(1.0, 1_000_000) +# score, pval = scipy.stats.kstest(samples, 'uniform') +# assert pval > 0.001 From b61a86731388118b505726b962d3e41c419f36c6 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 13:54:57 +1100 Subject: [PATCH 161/185] More surgery to diagnose build errors --- src/lib.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 66c8e9a..bbcbeba 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,19 +28,19 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { mechanisms::all_above_threshold(data, epsilon, threshold, precision).to_pyarray(py) } - #[pyfn(m, "snapping")] - fn py_snapping<'a>( - py: Python<'a>, - data: &'a PyArray1, - bound: f64, - lambda: f64, - quanta: f64, - ) -> &'a PyArray1 { - /// Simple python wrapper of the exponential function. Converts - /// the rust vector into a numpy array - let data = data.to_vec().unwrap(); - mechanisms::snapping(data, bound, lambda, quanta).to_pyarray(py) - } + // #[pyfn(m, "snapping")] + // fn py_snapping<'a>( + // py: Python<'a>, + // data: &'a PyArray1, + // bound: f64, + // lambda: f64, + // quanta: f64, + // ) -> &'a PyArray1 { + // /// Simple python wrapper of the exponential function. Converts + // /// the rust vector into a numpy array + // let data = data.to_vec().unwrap(); + // mechanisms::snapping(data, bound, lambda, quanta).to_pyarray(py) + // } #[pyfn(m, "laplace_mechanism")] fn py_laplace_mechanism<'a>( From 5cb029afeda7b7bc4386edf33b00c65d694b1b77 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 14:05:36 +1100 Subject: [PATCH 162/185] Removing tests for suppressed release mechanisms --- tests/test_mechanisms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 7c1cad6..91cfb8a 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -215,9 +215,9 @@ def test_sparse_numeric(benchmark): assert len(values) == 100 -def test_SnappingMechanism(benchmark): - mechanism = SnappingMechanism(epsilon=1.0, B=10) - _test_mechanism(benchmark, mechanism) +# def test_SnappingMechanism(benchmark): +# mechanism = SnappingMechanism(epsilon=1.0, B=10) +# _test_mechanism(benchmark, mechanism) def test_ReportNoisyMax(benchmark): From d5cc1a74025de21f469f859f77b223ba400a97c2 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 14:11:20 +1100 Subject: [PATCH 163/185] Added comments to trigger build --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.rs b/src/lib.rs index bbcbeba..26fccc5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -142,6 +142,7 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { mechanisms::small_db(epsilon, l1_norm, size, db_l1_norm, queries, answers, breaks).to_pyarray(py) } + // Need some comments to trigger build process // // For testing // #[pyfn(m, "sample_uniform")] // fn py_sample_uniform<'a>( From 11915cf4d935c81e6344eb3596b296a71bfebb30 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 14:14:31 +1100 Subject: [PATCH 164/185] iCommenting out more code to isolate problem --- src/samplers.rs | 52 ++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/samplers.rs b/src/samplers.rs index fc97112..47d37cd 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -46,32 +46,32 @@ pub fn bernoulli_log_p(log_p: f64) -> bool { } -fn capped_geometric2(cap: u64, rng: &mut rand::rngs::ThreadRng) -> u64 { - /// Samples an integer from the geometric distribution with success - /// probability = .5. Results greater than `cap` saturate to `cap`. - /// - let mut res = 0; - while res < cap { - let sample = rng.next_u64(); - if sample != 0 { - res += sample.trailing_zeros() as u64; - break; - } - res = res.saturating_add(64); - } - if res >= cap { - cap - } else { - res - } -} - - -fn extract_bits(x: u64, i: u64, len: u64) -> u64 { - // Returns len bits from x, beginning at index i. - // The least-significant bit has index 0. - (x >> i) & ((1 << len) - 1) -} +// fn capped_geometric2(cap: u64, rng: &mut rand::rngs::ThreadRng) -> u64 { +// /// Samples an integer from the geometric distribution with success +// /// probability = .5. Results greater than `cap` saturate to `cap`. +// /// +// let mut res = 0; +// while res < cap { +// let sample = rng.next_u64(); +// if sample != 0 { +// res += sample.trailing_zeros() as u64; +// break; +// } +// res = res.saturating_add(64); +// } +// if res >= cap { +// cap +// } else { +// res +// } +// } +// +// +// fn extract_bits(x: u64, i: u64, len: u64) -> u64 { +// // Returns len bits from x, beginning at index i. +// // The least-significant bit has index 0. +// (x >> i) & ((1 << len) - 1) +// } // pub fn uniform(scale: f64) -> f64 { From 565f5c2998769fdff64eb7db0b20c1dc93a4487f Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 14:42:53 +1100 Subject: [PATCH 165/185] Comment out snapping mechanism --- relm/mechanisms/output_perturbation.py | 94 +++++++++++++------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/relm/mechanisms/output_perturbation.py b/relm/mechanisms/output_perturbation.py index db77882..54e03b7 100644 --- a/relm/mechanisms/output_perturbation.py +++ b/relm/mechanisms/output_perturbation.py @@ -96,53 +96,53 @@ def privacy_consumed(self): return self.epsilon -class SnappingMechanism(ReleaseMechanism): - """ - Secure implementation of the Snapping mechanism. This mechanism can be used once - after which its privacy budget will be exhausted and it can no longer be used. - - Args: - epsilon: the maximum privacy loss of the mechanism. - B: the bound of the range to use for the snapping mechanism. - B should ideally be larger than the range of outputs expected but the larger B is - the less accurate the results. - """ - - def __init__(self, epsilon, B): - lam = (1 + 2 ** (-49) * B) / epsilon - if (B <= lam) or (B >= (2 ** 46 * lam)): - raise ValueError() - self.lam = lam - self.quanta = 2 ** math.ceil(math.log2(self.lam)) - self.B = B - super(SnappingMechanism, self).__init__(epsilon) - - def release(self, values): - """ - Releases a differential private query response. - - Args: - values: numpy array of the output of a query. - - Returns: - A numpy array of perturbed values. - """ - self._check_valid() - args = (values, self.B, self.lam, self.quanta) - release_values = backend.snapping(*args) - self._is_valid = False - self._update_accountant() - return release_values - - @property - def privacy_consumed(self): - """ - Computes the privacy budget consumed by the mechanism so far. - """ - if self._is_valid: - return 0 - else: - return self.epsilon +# class SnappingMechanism(ReleaseMechanism): +# """ +# Secure implementation of the Snapping mechanism. This mechanism can be used once +# after which its privacy budget will be exhausted and it can no longer be used. +# +# Args: +# epsilon: the maximum privacy loss of the mechanism. +# B: the bound of the range to use for the snapping mechanism. +# B should ideally be larger than the range of outputs expected but the larger B is +# the less accurate the results. +# """ +# +# def __init__(self, epsilon, B): +# lam = (1 + 2 ** (-49) * B) / epsilon +# if (B <= lam) or (B >= (2 ** 46 * lam)): +# raise ValueError() +# self.lam = lam +# self.quanta = 2 ** math.ceil(math.log2(self.lam)) +# self.B = B +# super(SnappingMechanism, self).__init__(epsilon) +# +# def release(self, values): +# """ +# Releases a differential private query response. +# +# Args: +# values: numpy array of the output of a query. +# +# Returns: +# A numpy array of perturbed values. +# """ +# self._check_valid() +# args = (values, self.B, self.lam, self.quanta) +# release_values = backend.snapping(*args) +# self._is_valid = False +# self._update_accountant() +# return release_values +# +# @property +# def privacy_consumed(self): +# """ +# Computes the privacy budget consumed by the mechanism so far. +# """ +# if self._is_valid: +# return 0 +# else: +# return self.epsilon class ReportNoisyMax(ReleaseMechanism): From 200767754c23881339d9413c450252ab1a42f0a4 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 15:02:39 +1100 Subject: [PATCH 166/185] Added manual dispatch for workflow --- .github/workflows/python-package.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index b5622e5..bb0cd69 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -8,6 +8,7 @@ on: branches: [ develop ] pull_request: branches: [ develop ] + workflow_dispatch jobs: build: @@ -34,4 +35,4 @@ jobs: - name: Check formatting with black run: | pip install black - black --check relm tests \ No newline at end of file + black --check relm tests From 639bd4397c98a8c80182b0e45e50b35b8eebd8de Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 15:05:39 +1100 Subject: [PATCH 167/185] Playing with workflow_dispatch syntax --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index bb0cd69..0c02f6e 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -8,7 +8,7 @@ on: branches: [ develop ] pull_request: branches: [ develop ] - workflow_dispatch + workflow_dispatch: jobs: build: From 191da641c65605ff2a83e11445856ea3573977c1 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 15:11:32 +1100 Subject: [PATCH 168/185] Removed manual_dispatch option --- .github/workflows/python-package.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 0c02f6e..7267bf6 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -8,7 +8,6 @@ on: branches: [ develop ] pull_request: branches: [ develop ] - workflow_dispatch: jobs: build: From a08ec6ba4c205945803eac23bcf53dfa780d6f5d Mon Sep 17 00:00:00 2001 From: michaelpatrickpurcell <70675482+michaelpatrickpurcell@users.noreply.github.com> Date: Fri, 5 Mar 2021 15:17:29 +1100 Subject: [PATCH 169/185] Update python-package.yml --- .github/workflows/python-package.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index b5622e5..0c02f6e 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -8,6 +8,7 @@ on: branches: [ develop ] pull_request: branches: [ develop ] + workflow_dispatch: jobs: build: @@ -34,4 +35,4 @@ jobs: - name: Check formatting with black run: | pip install black - black --check relm tests \ No newline at end of file + black --check relm tests From 52ec8504c06b9e106a60f14c7634b5a5838174c0 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Fri, 5 Mar 2021 15:26:55 +1100 Subject: [PATCH 170/185] Removed reference to snapping mechanism --- tests/test_mechanisms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index f96d810..76c6c45 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -8,7 +8,7 @@ CauchyMechanism, ExponentialMechanism, PermuteAndFlipMechanism, - SnappingMechanism, + # SnappingMechanism, AboveThreshold, SparseIndicator, SparseNumeric, From bec04d1cce265b0284cf33c36f1f582ac9ceaee7 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 9 Mar 2021 09:15:25 +1100 Subject: [PATCH 171/185] Commented out calls to sparse mechanism in tests --- tests/test_mechanisms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 76c6c45..e798359 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -233,9 +233,9 @@ def test_sparse_numeric(benchmark): assert len(values) == 100 -def test_SnappingMechanism(benchmark): - mechanism = SnappingMechanism(epsilon=1.0, B=10) - _test_mechanism(benchmark, mechanism, np.float64) +# def test_SnappingMechanism(benchmark): +# mechanism = SnappingMechanism(epsilon=1.0, B=10) +# _test_mechanism(benchmark, mechanism, np.float64) def test_ReportNoisyMax(benchmark): From 9cb359cf7da9505a020e3ed3d50a74dbafdc3f2f Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 9 Mar 2021 09:16:42 +1100 Subject: [PATCH 172/185] Replaced SparseMechnaism test. Wrong branch --- tests/test_mechanisms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index e798359..76c6c45 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -233,9 +233,9 @@ def test_sparse_numeric(benchmark): assert len(values) == 100 -# def test_SnappingMechanism(benchmark): -# mechanism = SnappingMechanism(epsilon=1.0, B=10) -# _test_mechanism(benchmark, mechanism, np.float64) +def test_SnappingMechanism(benchmark): + mechanism = SnappingMechanism(epsilon=1.0, B=10) + _test_mechanism(benchmark, mechanism, np.float64) def test_ReportNoisyMax(benchmark): From 446b0e2b7bb7e28bd429b337a6c74e9f69f27525 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 9 Mar 2021 09:20:58 +1100 Subject: [PATCH 173/185] Temporarily remove import of SparseMechanism --- tests/test_mechanisms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 91cfb8a..e95fa56 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -7,7 +7,7 @@ GeometricMechanism, ExponentialMechanism, PermuteAndFlipMechanism, - SnappingMechanism, + # SnappingMechanism, AboveThreshold, SparseIndicator, SparseNumeric, From 4f6f9b84f3ac368549567071cf67c3ed87e6b371 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 9 Mar 2021 09:40:15 +1100 Subject: [PATCH 174/185] _max_privacy_loss -> privacy_allocated --- tests/test_composition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_composition.py b/tests/test_composition.py index 1b9249a..40f787f 100644 --- a/tests/test_composition.py +++ b/tests/test_composition.py @@ -23,7 +23,7 @@ def test_parallel_release(): _ = [mechanism.release(values) for mechanism in mechanisms] assert accountant.privacy_consumed == 4 - assert accountant._max_privacy_loss == 124 + assert accountant.privacy_allocated == 124 assert para_mechs.privacy_consumed == 4 assert para_mechs.epsilon == 4 From 9af48cb8914f26105fc5d34b96bb559fdc64d9d0 Mon Sep 17 00:00:00 2001 From: michaelpatrickpurcell <70675482+michaelpatrickpurcell@users.noreply.github.com> Date: Tue, 9 Mar 2021 09:49:54 +1100 Subject: [PATCH 175/185] Update python-package.yml --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 0c02f6e..0564553 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7] + python-version: [3.6, 3.7, 3.8, 3.9] steps: - uses: actions/checkout@v2 From 8646930158870f59a63dbad96119bd7d88ea06dc Mon Sep 17 00:00:00 2001 From: michaelpatrickpurcell <70675482+michaelpatrickpurcell@users.noreply.github.com> Date: Tue, 9 Mar 2021 10:01:01 +1100 Subject: [PATCH 176/185] Update python-package.yml --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 0c02f6e..0564553 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7] + python-version: [3.6, 3.7, 3.8, 3.9] steps: - uses: actions/checkout@v2 From 297223e849ce2a1c50ae5f15b50d30df6311c7c2 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 9 Mar 2021 10:34:04 +1100 Subject: [PATCH 177/185] Reenable uniform_sampler code for testing --- src/lib.rs | 22 ++--- src/samplers.rs | 206 ++++++++++++++++++++--------------------- tests/test_samplers.py | 8 +- 3 files changed, 118 insertions(+), 118 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a7ec1f3..b887af0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -153,16 +153,16 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { // Need some comments to trigger build process // // For testing - // #[pyfn(m, "sample_uniform")] - // fn py_sample_uniform<'a>( - // py: Python<'a>, - // scale: f64, - // size: u64, - // ) -> &'a PyArray1 { - // (0..size).map(|_| samplers::uniform(scale)) - // .collect::>() - // .to_pyarray(py) - // } - // + #[pyfn(m, "sample_uniform")] + fn py_sample_uniform<'a>( + py: Python<'a>, + scale: f64, + size: u64, + ) -> &'a PyArray1 { + (0..size).map(|_| samplers::uniform(scale)) + .collect::>() + .to_pyarray(py) + } + Ok(()) } diff --git a/src/samplers.rs b/src/samplers.rs index 50f4b43..56644ae 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -54,109 +54,109 @@ pub fn bernoulli_log_p(log_p: f64) -> bool { } -// fn capped_geometric2(cap: u64, rng: &mut rand::rngs::ThreadRng) -> u64 { -// /// Samples an integer from the geometric distribution with success -// /// probability = .5. Results greater than `cap` saturate to `cap`. -// /// -// let mut res = 0; -// while res < cap { -// let sample = rng.next_u64(); -// if sample != 0 { -// res += sample.trailing_zeros() as u64; -// break; -// } -// res = res.saturating_add(64); -// } -// if res >= cap { -// cap -// } else { -// res -// } -// } -// -// -// fn extract_bits(x: u64, i: u64, len: u64) -> u64 { -// // Returns len bits from x, beginning at index i. -// // The least-significant bit has index 0. -// (x >> i) & ((1 << len) - 1) -// } - - -// pub fn uniform(scale: f64) -> f64 { -// /// Samples a real from [0, scale] and rounds towards the nearest floating-point number. -// /// -// const EXPONENT_LEN: u64 = 11; -// const MANTISSA_LEN: u64 = 52; -// debug_assert!(MANTISSA_LEN + EXPONENT_LEN + 1 == 64); -// const MAX_EXPONENT: u64 = (1 << EXPONENT_LEN) - 1; -// const MAX_MANTISSA: u64 = (1 << MANTISSA_LEN) - 1; -// -// let scale_bits: u64 = scale.to_bits(); -// let scale_exponent: u64 = extract_bits(scale_bits, MANTISSA_LEN, EXPONENT_LEN); -// let scale_mantissa: u64 = extract_bits(scale_bits, 0, MANTISSA_LEN); -// debug_assert!(scale_exponent <= MAX_EXPONENT); -// debug_assert!(scale_mantissa <= MAX_MANTISSA); -// -// if scale_exponent == MAX_EXPONENT || (scale_exponent == 0 && scale_mantissa == 0) { -// debug_assert!(scale.is_nan() || scale.is_infinite() || scale == 0.0); -// // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. -// // Sub 0 to handle signalling NaNs while keeping sign. -// return scale - 0.0; -// } -// -// debug_assert!(scale != 0.0); -// debug_assert!(scale.is_finite()); -// let mut rng = rand::thread_rng(); -// -// if scale_exponent == 0 { -// debug_assert!(!scale.is_normal()); -// // scale is subnormal. No need to deal with exponents since [0, scale] has -// // even intervals. Generate random mantissa in [0, scale_mantissa). Also -// // generate an extra bit for rounding direction. -// let mantissa_and_rounding: u64 = rng.gen_range(0, scale_mantissa << 1); -// let mantissa: u64 = (mantissa_and_rounding >> 1) + (mantissa_and_rounding & 1); -// let res: f64 = f64::from_bits(mantissa).copysign(scale); -// debug_assert!(res.abs() <= scale.abs()); -// return res; -// } -// -// debug_assert!(scale.is_normal()); -// // Scale is a normal float. -// loop { // Rejection sampling. -// // Sample from [0, 2^n) where n is the smallest integer such that scale <= 2^n. -// let rng_sample: u64 = rng.next_u64(); -// -// let rounding: u64 = extract_bits(rng_sample, EXPONENT_LEN, 1); -// let mantissa: u64 = extract_bits(rng_sample, 1 + EXPONENT_LEN, MANTISSA_LEN); -// let mut exponent: u64 = scale_exponent - ((scale_mantissa == 0) as u64); -// -// // Subtract from exponent a sample from geometric distribution with p = .5 -// // We still have not used the leading 11 bits of rng_sample. Re-use them to -// // avoid generating another rng sample. -// let rng_sample_geo: u64 = extract_bits(rng_sample, 0, EXPONENT_LEN); -// if rng_sample_geo == 0 { -// exponent = exponent.saturating_sub(EXPONENT_LEN); -// exponent -= capped_geometric2(exponent, &mut rng); -// } else { -// exponent = exponent.saturating_sub(rng_sample_geo.trailing_zeros() as u64); -// } -// -// debug_assert!(exponent <= scale_exponent); -// if exponent < scale_exponent || mantissa < scale_mantissa { -// // result < scale; accept -// let res: f64 = f64::from_bits((exponent << MANTISSA_LEN) -// + mantissa -// + rounding).copysign(scale); -// debug_assert!(res.abs() <= scale.abs()); -// return res; -// } -// -// debug_assert!(f64::from_bits((exponent << MANTISSA_LEN) + mantissa + rounding) -// > scale.abs()); -// // result > scale; rejecting. -// } -// } -// +fn capped_geometric2(cap: u64, rng: &mut rand::rngs::ThreadRng) -> u64 { + /// Samples an integer from the geometric distribution with success + /// probability = .5. Results greater than `cap` saturate to `cap`. + /// + let mut res = 0; + while res < cap { + let sample = rng.next_u64(); + if sample != 0 { + res += sample.trailing_zeros() as u64; + break; + } + res = res.saturating_add(64); + } + if res >= cap { + cap + } else { + res + } +} + + +fn extract_bits(x: u64, i: u64, len: u64) -> u64 { + // Returns len bits from x, beginning at index i. + // The least-significant bit has index 0. + (x >> i) & ((1 << len) - 1) +} + + +pub fn uniform(scale: f64) -> f64 { + /// Samples a real from [0, scale] and rounds towards the nearest floating-point number. + /// + const EXPONENT_LEN: u64 = 11; + const MANTISSA_LEN: u64 = 52; + debug_assert!(MANTISSA_LEN + EXPONENT_LEN + 1 == 64); + const MAX_EXPONENT: u64 = (1 << EXPONENT_LEN) - 1; + const MAX_MANTISSA: u64 = (1 << MANTISSA_LEN) - 1; + + let scale_bits: u64 = scale.to_bits(); + let scale_exponent: u64 = extract_bits(scale_bits, MANTISSA_LEN, EXPONENT_LEN); + let scale_mantissa: u64 = extract_bits(scale_bits, 0, MANTISSA_LEN); + debug_assert!(scale_exponent <= MAX_EXPONENT); + debug_assert!(scale_mantissa <= MAX_MANTISSA); + + if scale_exponent == MAX_EXPONENT || (scale_exponent == 0 && scale_mantissa == 0) { + debug_assert!(scale.is_nan() || scale.is_infinite() || scale == 0.0); + // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. + // Sub 0 to handle signalling NaNs while keeping sign. + return scale - 0.0; + } + + debug_assert!(scale != 0.0); + debug_assert!(scale.is_finite()); + let mut rng = rand::thread_rng(); + + if scale_exponent == 0 { + debug_assert!(!scale.is_normal()); + // scale is subnormal. No need to deal with exponents since [0, scale] has + // even intervals. Generate random mantissa in [0, scale_mantissa). Also + // generate an extra bit for rounding direction. + let mantissa_and_rounding: u64 = rng.gen_range(0, scale_mantissa << 1); + let mantissa: u64 = (mantissa_and_rounding >> 1) + (mantissa_and_rounding & 1); + let res: f64 = f64::from_bits(mantissa).copysign(scale); + debug_assert!(res.abs() <= scale.abs()); + return res; + } + + debug_assert!(scale.is_normal()); + // Scale is a normal float. + loop { // Rejection sampling. + // Sample from [0, 2^n) where n is the smallest integer such that scale <= 2^n. + let rng_sample: u64 = rng.next_u64(); + + let rounding: u64 = extract_bits(rng_sample, EXPONENT_LEN, 1); + let mantissa: u64 = extract_bits(rng_sample, 1 + EXPONENT_LEN, MANTISSA_LEN); + let mut exponent: u64 = scale_exponent - ((scale_mantissa == 0) as u64); + + // Subtract from exponent a sample from geometric distribution with p = .5 + // We still have not used the leading 11 bits of rng_sample. Re-use them to + // avoid generating another rng sample. + let rng_sample_geo: u64 = extract_bits(rng_sample, 0, EXPONENT_LEN); + if rng_sample_geo == 0 { + exponent = exponent.saturating_sub(EXPONENT_LEN); + exponent -= capped_geometric2(exponent, &mut rng); + } else { + exponent = exponent.saturating_sub(rng_sample_geo.trailing_zeros() as u64); + } + + debug_assert!(exponent <= scale_exponent); + if exponent < scale_exponent || mantissa < scale_mantissa { + // result < scale; accept + let res: f64 = f64::from_bits((exponent << MANTISSA_LEN) + + mantissa + + rounding).copysign(scale); + debug_assert!(res.abs() <= scale.abs()); + return res; + } + + debug_assert!(f64::from_bits((exponent << MANTISSA_LEN) + mantissa + rounding) + > scale.abs()); + // result > scale; rejecting. + } +} + pub fn geometric(scale: f64) -> f64 { /// Returns a sample from the geometric distribution diff --git a/tests/test_samplers.py b/tests/test_samplers.py index 97fe994..c05a4a8 100644 --- a/tests/test_samplers.py +++ b/tests/test_samplers.py @@ -4,7 +4,7 @@ import relm.backend -# def test_uniform_sampler(): -# samples = relm.backend.sample_uniform(1.0, 1_000_000) -# score, pval = scipy.stats.kstest(samples, 'uniform') -# assert pval > 0.001 +def test_uniform_sampler(): + samples = relm.backend.sample_uniform(1.0, 1_000_000) + score, pval = scipy.stats.kstest(samples, 'uniform') + assert pval > 0.001 From 96f64ef3bc46c9b767f4d2e6cc21ebfd1b3c51f5 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 9 Mar 2021 11:09:56 +1100 Subject: [PATCH 178/185] Changed argument format for gen_range() function call --- src/samplers.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/samplers.rs b/src/samplers.rs index 56644ae..6faf2a5 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -113,7 +113,8 @@ pub fn uniform(scale: f64) -> f64 { // scale is subnormal. No need to deal with exponents since [0, scale] has // even intervals. Generate random mantissa in [0, scale_mantissa). Also // generate an extra bit for rounding direction. - let mantissa_and_rounding: u64 = rng.gen_range(0, scale_mantissa << 1); + let scale_mantissa_x2 = scale_mantissa << 1; + let mantissa_and_rounding: u64 = rng.gen_range(0..scale_mantissa_x2); let mantissa: u64 = (mantissa_and_rounding >> 1) + (mantissa_and_rounding & 1); let res: f64 = f64::from_bits(mantissa).copysign(scale); debug_assert!(res.abs() <= scale.abs()); From d94aa96588dc19c1eed8985854c46a0ea8bd296b Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 9 Mar 2021 11:26:18 +1100 Subject: [PATCH 179/185] black formatting --- tests/test_samplers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_samplers.py b/tests/test_samplers.py index c05a4a8..ca17fbb 100644 --- a/tests/test_samplers.py +++ b/tests/test_samplers.py @@ -6,5 +6,5 @@ def test_uniform_sampler(): samples = relm.backend.sample_uniform(1.0, 1_000_000) - score, pval = scipy.stats.kstest(samples, 'uniform') + score, pval = scipy.stats.kstest(samples, "uniform") assert pval > 0.001 From f6038216650c9518e41fad879e6ee2d82ecbc34c Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 9 Mar 2021 11:43:33 +1100 Subject: [PATCH 180/185] Restoring snapping mechanism --- relm/mechanisms/output_perturbation.py | 94 +++++++++++++------------- src/lib.rs | 26 +++---- src/mechanisms.rs | 16 ++--- tests/test_mechanisms.py | 8 +-- 4 files changed, 72 insertions(+), 72 deletions(-) diff --git a/relm/mechanisms/output_perturbation.py b/relm/mechanisms/output_perturbation.py index 9fac303..566a8fe 100644 --- a/relm/mechanisms/output_perturbation.py +++ b/relm/mechanisms/output_perturbation.py @@ -96,53 +96,53 @@ def privacy_consumed(self): return self.epsilon -# class SnappingMechanism(ReleaseMechanism): -# """ -# Secure implementation of the Snapping mechanism. This mechanism can be used once -# after which its privacy budget will be exhausted and it can no longer be used. -# -# Args: -# epsilon: the maximum privacy loss of the mechanism. -# B: the bound of the range to use for the snapping mechanism. -# B should ideally be larger than the range of outputs expected but the larger B is -# the less accurate the results. -# """ -# -# def __init__(self, epsilon, B): -# lam = (1 + 2 ** (-49) * B) / epsilon -# if (B <= lam) or (B >= (2 ** 46 * lam)): -# raise ValueError() -# self.lam = lam -# self.quanta = 2 ** math.ceil(math.log2(self.lam)) -# self.B = B -# super(SnappingMechanism, self).__init__(epsilon) -# -# def release(self, values): -# """ -# Releases a differential private query response. -# -# Args: -# values: numpy array of the output of a query. -# -# Returns: -# A numpy array of perturbed values. -# """ -# self._check_valid() -# args = (values, self.B, self.lam, self.quanta) -# release_values = backend.snapping(*args) -# self._is_valid = False -# self._update_accountant() -# return release_values -# -# @property -# def privacy_consumed(self): -# """ -# Computes the privacy budget consumed by the mechanism so far. -# """ -# if self._is_valid: -# return 0 -# else: -# return self.epsilon +class SnappingMechanism(ReleaseMechanism): + """ + Secure implementation of the Snapping mechanism. This mechanism can be used once + after which its privacy budget will be exhausted and it can no longer be used. + + Args: + epsilon: the maximum privacy loss of the mechanism. + B: the bound of the range to use for the snapping mechanism. + B should ideally be larger than the range of outputs expected but the larger B is + the less accurate the results. + """ + + def __init__(self, epsilon, B): + lam = (1 + 2 ** (-49) * B) / epsilon + if (B <= lam) or (B >= (2 ** 46 * lam)): + raise ValueError() + self.lam = lam + self.quanta = 2 ** math.ceil(math.log2(self.lam)) + self.B = B + super(SnappingMechanism, self).__init__(epsilon) + + def release(self, values): + """ + Releases a differential private query response. + + Args: + values: numpy array of the output of a query. + + Returns: + A numpy array of perturbed values. + """ + self._check_valid() + args = (values, self.B, self.lam, self.quanta) + release_values = backend.snapping(*args) + self._is_valid = False + self._update_accountant() + return release_values + + @property + def privacy_consumed(self): + """ + Computes the privacy budget consumed by the mechanism so far. + """ + if self._is_valid: + return 0 + else: + return self.epsilon class CauchyMechanism(ReleaseMechanism): diff --git a/src/lib.rs b/src/lib.rs index b887af0..c45e85f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,19 +28,19 @@ fn backend(_py: Python, m: &PyModule) -> PyResult<()> { mechanisms::all_above_threshold(data, epsilon, threshold, precision).to_pyarray(py) } - // #[pyfn(m, "snapping")] - // fn py_snapping<'a>( - // py: Python<'a>, - // data: &'a PyArray1, - // bound: f64, - // lambda: f64, - // quanta: f64, - // ) -> &'a PyArray1 { - // /// Simple python wrapper of the exponential function. Converts - // /// the rust vector into a numpy array - // let data = data.to_vec().unwrap(); - // mechanisms::snapping(data, bound, lambda, quanta).to_pyarray(py) - // } + #[pyfn(m, "snapping")] + fn py_snapping<'a>( + py: Python<'a>, + data: &'a PyArray1, + bound: f64, + lambda: f64, + quanta: f64, + ) -> &'a PyArray1 { + /// Simple python wrapper of the exponential function. Converts + /// the rust vector into a numpy array + let data = data.to_vec().unwrap(); + mechanisms::snapping(data, bound, lambda, quanta).to_pyarray(py) + } #[pyfn(m, "laplace_mechanism")] fn py_laplace_mechanism<'a>( diff --git a/src/mechanisms.rs b/src/mechanisms.rs index e6d505e..0b973d7 100644 --- a/src/mechanisms.rs +++ b/src/mechanisms.rs @@ -22,14 +22,14 @@ pub fn all_above_threshold(data: Vec, epsilon: f64, threshold: f64, precisi } -// pub fn snapping(data: Vec, bound: f64, lambda: f64, quanta: f64) -> Vec { -// data.par_iter() -// .map(|&p| utils::clamp(p, bound)) -// .map(|p| p + lambda * utils::ln_rn(samplers::uniform(1.0)) * (samplers::uniform(1.0) - 0.5).signum()) -// .map(|p| quanta * (p / quanta).round()) -// .map(|p| utils::clamp(p, bound)) -// .collect() -// } +pub fn snapping(data: Vec, bound: f64, lambda: f64, quanta: f64) -> Vec { + data.par_iter() + .map(|&p| utils::clamp(p, bound)) + .map(|p| p + lambda * utils::ln_rn(samplers::uniform(1.0)) * (samplers::uniform(1.0) - 0.5).signum()) + .map(|p| quanta * (p / quanta).round()) + .map(|p| utils::clamp(p, bound)) + .collect() +} pub fn laplace_mechanism(data: Vec, epsilon: f64, precision: i32) -> Vec { diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 15fdd52..1f97731 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -8,7 +8,7 @@ CauchyMechanism, ExponentialMechanism, PermuteAndFlipMechanism, - # SnappingMechanism, + SnappingMechanism, AboveThreshold, SparseIndicator, SparseNumeric, @@ -233,9 +233,9 @@ def test_sparse_numeric(benchmark): assert len(values) == 100 -# def test_SnappingMechanism(benchmark): -# mechanism = SnappingMechanism(epsilon=1.0, B=10) -# _test_mechanism(benchmark, mechanism) +def test_SnappingMechanism(benchmark): + mechanism = SnappingMechanism(epsilon=1.0, B=10) + _test_mechanism(benchmark, mechanism) def test_ReportNoisyMax(benchmark): From d682815b2249633709a20efae5053bd9901989f8 Mon Sep 17 00:00:00 2001 From: Michael Purcell Date: Tue, 9 Mar 2021 11:59:33 +1100 Subject: [PATCH 181/185] Added missing argument to _test_benchmark function call --- tests/test_mechanisms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_mechanisms.py b/tests/test_mechanisms.py index 1f97731..f96d810 100644 --- a/tests/test_mechanisms.py +++ b/tests/test_mechanisms.py @@ -235,7 +235,7 @@ def test_sparse_numeric(benchmark): def test_SnappingMechanism(benchmark): mechanism = SnappingMechanism(epsilon=1.0, B=10) - _test_mechanism(benchmark, mechanism) + _test_mechanism(benchmark, mechanism, np.float64) def test_ReportNoisyMax(benchmark): From 835ff484ebb04a599cdcced5605123ccf1a6116d Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Thu, 11 Mar 2021 14:09:00 +1100 Subject: [PATCH 182/185] Correctness argument and minor cleanup --- src/samplers.rs | 114 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 84 insertions(+), 30 deletions(-) diff --git a/src/samplers.rs b/src/samplers.rs index 6faf2a5..a23d0d5 100644 --- a/src/samplers.rs +++ b/src/samplers.rs @@ -75,44 +75,63 @@ fn capped_geometric2(cap: u64, rng: &mut rand::rngs::ThreadRng) -> u64 { } + +const F64_EXPONENT_LEN: u64 = 11; +const F64_MANTISSA_LEN: u64 = 52; +const F64_MAX_EXPONENT: u64 = (1 << F64_EXPONENT_LEN) - 1; +const F64_MAX_MANTISSA: u64 = (1 << F64_MANTISSA_LEN) - 1; + + fn extract_bits(x: u64, i: u64, len: u64) -> u64 { // Returns len bits from x, beginning at index i. // The least-significant bit has index 0. (x >> i) & ((1 << len) - 1) } +fn decompose_float(x: u64) -> (u64, u64, u64) { + let sign = x >> F64_EXPONENT_LEN + F64_MANTISSA_LEN; + let exponent = x >> F64_MANTISSA_LEN & F64_MAX_EXPONENT; + let mantissa = x & F64_MAX_MANTISSA; + (sign, exponent, mantissa) +} + pub fn uniform(scale: f64) -> f64 { /// Samples a real from [0, scale] and rounds towards the nearest floating-point number. /// - const EXPONENT_LEN: u64 = 11; - const MANTISSA_LEN: u64 = 52; - debug_assert!(MANTISSA_LEN + EXPONENT_LEN + 1 == 64); - const MAX_EXPONENT: u64 = (1 << EXPONENT_LEN) - 1; - const MAX_MANTISSA: u64 = (1 << MANTISSA_LEN) - 1; - - let scale_bits: u64 = scale.to_bits(); - let scale_exponent: u64 = extract_bits(scale_bits, MANTISSA_LEN, EXPONENT_LEN); - let scale_mantissa: u64 = extract_bits(scale_bits, 0, MANTISSA_LEN); - debug_assert!(scale_exponent <= MAX_EXPONENT); - debug_assert!(scale_mantissa <= MAX_MANTISSA); - - if scale_exponent == MAX_EXPONENT || (scale_exponent == 0 && scale_mantissa == 0) { - debug_assert!(scale.is_nan() || scale.is_infinite() || scale == 0.0); - // As you limit x->inf, prob(sample from [0, x) > greatest float) -> 1. - // Sub 0 to handle signalling NaNs while keeping sign. - return scale - 0.0; + if scale == 0.0 { + return scale; // Return zero of the same sign (: + } + if scale.is_infinite() { + return scale; // As scale->inf, p(sample > greatest float)->1. + } + if scale.is_nan() { + return scale + 0.0; // +0 to silence signalling NaN. } - debug_assert!(scale != 0.0); - debug_assert!(scale.is_finite()); + let (_, scale_exponent, scale_mantissa) = decompose_float(scale.to_bits()); let mut rng = rand::thread_rng(); if scale_exponent == 0 { + // Scale is subnormal. + // Let s be the smallest nonzero subnormal. + // The floats between 0 and scale lie at 0, s, 2 * s, ..., n * s = scale for some n. + // We wish to sample a real in (0, scale) and round to the nearest float. + // A sample in (0, s/2) gets rounded to 0, and a sample in (n * s - s/2, n * s) rounds to + // scale. Finally, for all i = 1, ..., n - 1, (i * s - s/2, i * s + s/2) rounds to i * s. + // Note that we don't need to worry about the case of a real sample being exactly between + // two floats, because that event has probability 0. + // We do this in two steps: + // 1. Choose an interval between two floating point numbers. The choices are: + // (0, s), (s, 2 * s), ..., ((n - 1) * s, n * s). Each of these intervals has equal size + // so we can sample uniformly in {0, ..., n - 1}. This interval is represented by the + // `mantissa` below. + // 2. We now have some integer i (`mantissa`) such that we need to sample from + // (i * s, (i + 1) * s) and round to the nearest float. This interval is exactly the + // space between two floating point numbers. Since we're rounding to nearest, we'll + // round to i * s and to (i + 1) * s with equal probability. We can sample uniformly + // j in {0, 1} (`rounding` below) and return (i + j) * s. debug_assert!(!scale.is_normal()); - // scale is subnormal. No need to deal with exponents since [0, scale] has - // even intervals. Generate random mantissa in [0, scale_mantissa). Also - // generate an extra bit for rounding direction. let scale_mantissa_x2 = scale_mantissa << 1; let mantissa_and_rounding: u64 = rng.gen_range(0..scale_mantissa_x2); let mantissa: u64 = (mantissa_and_rounding >> 1) + (mantissa_and_rounding & 1); @@ -123,20 +142,54 @@ pub fn uniform(scale: f64) -> f64 { debug_assert!(scale.is_normal()); // Scale is a normal float. + // Let b be the smallest power of 2 such that scale <= b. We wish to sample a real from + // (0, scale) and round to the nearest float. We achieve this by sampling from (0, b), rejecting + // if the sample > scale, and rounding an accepted sample (in (0, scale)) to the nearest float. + // Observe that b is no smaller than the smallest normal float (but it can be greater than the + // greatest normal float). + // + // Let c be a power of 2. To sample from (0, c), we work by cases. + // + // If c is the smallest normal float, then we follow similar logic to the subnormal case above. + // The possible results are 0, s, 2 * s, ..., n * s = c. We first select an interval between two + // floating-point numbers by sampling uniformly i from {0, ..., n - 1}. We've thus narrowed down + // the problem to sampling from (i * s, (i + 1) * s) and rounding to the nearest float. Since + // the bottom half of that interval rounds down and the top half rounds up, we sample uniformly + // j in {0, 1} and return (i + j) * s. + // + // Otherwise, c is a power of 2 that is not the smallest normal float. We want to sample from + // (0, c). We do this by first drawing a Bernoulli sample. On success we recurse and sample from + // (0, c/2). Observe that c/2 is also a power of 2 no smaller than the smallest normal float. + // This is equivalent to decreasing the exponent of c by 1. On failure, we sample from (c/2, c) + // and round to the nearest float. + // + // Observe that the floating-point numbers in are evently distributed with a step of s. They + // are c/2, c/2 + s, c/2 + 2 * s, ..., c/2 + 2^n = c. (As an exception, sometimes c may not be + // representable as a floating point number. This has no impact on the argument.) Each of these + // floats has the same exponent, except c which has exponent 1 bigger. We first choose an + // interval between two floats by sampling i uniformly in {0, ..., 2^n - 1}. We now know that + // our real sample is in some interval (c/2 + i * s, c/2 + (i + 1) * s). If + // c/2 + i * s >= scale, then our real sample > scale, and we reject. Otherwise we round to + // either c/2 + i * s or c/2 + (i + 1) * s with equal probability. + loop { // Rejection sampling. // Sample from [0, 2^n) where n is the smallest integer such that scale <= 2^n. let rng_sample: u64 = rng.next_u64(); - - let rounding: u64 = extract_bits(rng_sample, EXPONENT_LEN, 1); - let mantissa: u64 = extract_bits(rng_sample, 1 + EXPONENT_LEN, MANTISSA_LEN); + let (rounding, rng_sample_geo, mantissa) = decompose_float(rng_sample); + // scale_mantissa == 0 means scale is a power of 2. In that case the exponent of the sample + // < scale_exponent unless sample == scale (this only happens if mantissa is all ones and we + // round up; it is handled by addition with carry). let mut exponent: u64 = scale_exponent - ((scale_mantissa == 0) as u64); // Subtract from exponent a sample from geometric distribution with p = .5 // We still have not used the leading 11 bits of rng_sample. Re-use them to // avoid generating another rng sample. - let rng_sample_geo: u64 = extract_bits(rng_sample, 0, EXPONENT_LEN); if rng_sample_geo == 0 { - exponent = exponent.saturating_sub(EXPONENT_LEN); + // Saturating at exponent = 0 is equivalent to no longer splitting intervals when we + // reach subnormal numbers. + exponent = exponent.saturating_sub(F64_EXPONENT_LEN); + // All our samples so far have been successes. Keep drawing until failure or until the + // exponent reaches 0. exponent -= capped_geometric2(exponent, &mut rng); } else { exponent = exponent.saturating_sub(rng_sample_geo.trailing_zeros() as u64); @@ -145,15 +198,16 @@ pub fn uniform(scale: f64) -> f64 { debug_assert!(exponent <= scale_exponent); if exponent < scale_exponent || mantissa < scale_mantissa { // result < scale; accept - let res: f64 = f64::from_bits((exponent << MANTISSA_LEN) + // Important to carry overflow from the mantissa to the exponent. + let res: f64 = f64::from_bits((exponent << F64_MANTISSA_LEN) + mantissa + rounding).copysign(scale); debug_assert!(res.abs() <= scale.abs()); return res; } - debug_assert!(f64::from_bits((exponent << MANTISSA_LEN) + mantissa + rounding) - > scale.abs()); + debug_assert!(f64::from_bits((exponent << F64_MANTISSA_LEN) + mantissa + rounding) + >= scale.abs()); // result > scale; rejecting. } } From 8b25a998465f44b3a725f138d02453819284d773 Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Fri, 12 Mar 2021 10:16:14 +1100 Subject: [PATCH 183/185] Extra tests --- tests/test_samplers.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/tests/test_samplers.py b/tests/test_samplers.py index ca17fbb..1daf565 100644 --- a/tests/test_samplers.py +++ b/tests/test_samplers.py @@ -1,3 +1,5 @@ +import math + import numpy as np import scipy.stats @@ -5,6 +7,25 @@ def test_uniform_sampler(): - samples = relm.backend.sample_uniform(1.0, 1_000_000) - score, pval = scipy.stats.kstest(samples, "uniform") - assert pval > 0.001 + SCALES = [1.0, -1.0, 2.0, -.5, -math.tau, 1/math.e, + 1.2250738585072009e-308] + for scale in SCALES: + samples = relm.backend.sample_uniform(scale, 1_000_000) + + # Make sure samples have the correct sign/ + assert (np.copysign(1., samples) == math.copysign(1., scale)).all() + + # Take abs of scale and samples and verify it against + # scipy.stats.uniform. + scale = abs(scale) + samples = np.abs(samples) + score, pval = scipy.stats.kstest(samples, "uniform", args=(0, scale)) + assert pval > 0.001 + + +def test_uniform_sampler_special_cases(): + for scale in [0., -0., float('inf'), -float('inf'), float('NaN')]: + sample = relm.backend.sample_uniform(scale, 1)[0] + assert sample == scale or (math.isnan(scale) and np.isnan(sample)) + # Preserves sign of negative zero: + assert math.copysign(1., sample) == np.copysign(1., scale) From 2649ed8f3bd503c1f1bcbc4b96e66b471d3ca4cd Mon Sep 17 00:00:00 2001 From: Jakub Nabaglo Date: Fri, 12 Mar 2021 12:02:06 +1100 Subject: [PATCH 184/185] Black linting makes me actively angry. I feel strongly about this. --- tests/test_samplers.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/test_samplers.py b/tests/test_samplers.py index 1daf565..98bfb97 100644 --- a/tests/test_samplers.py +++ b/tests/test_samplers.py @@ -7,13 +7,12 @@ def test_uniform_sampler(): - SCALES = [1.0, -1.0, 2.0, -.5, -math.tau, 1/math.e, - 1.2250738585072009e-308] + SCALES = [1.0, -1.0, 2.0, -0.5, -math.tau, 1 / math.e, 1.2250738585072009e-308] for scale in SCALES: samples = relm.backend.sample_uniform(scale, 1_000_000) # Make sure samples have the correct sign/ - assert (np.copysign(1., samples) == math.copysign(1., scale)).all() + assert (np.copysign(1.0, samples) == math.copysign(1.0, scale)).all() # Take abs of scale and samples and verify it against # scipy.stats.uniform. @@ -24,8 +23,8 @@ def test_uniform_sampler(): def test_uniform_sampler_special_cases(): - for scale in [0., -0., float('inf'), -float('inf'), float('NaN')]: + for scale in [0.0, -0.0, float("inf"), -float("inf"), float("NaN")]: sample = relm.backend.sample_uniform(scale, 1)[0] assert sample == scale or (math.isnan(scale) and np.isnan(sample)) # Preserves sign of negative zero: - assert math.copysign(1., sample) == np.copysign(1., scale) + assert math.copysign(1.0, sample) == np.copysign(1.0, scale) From b156c2fd6f398639c4fb8718bfd854e9866edc90 Mon Sep 17 00:00:00 2001 From: michaelpatrickpurcell <70675482+michaelpatrickpurcell@users.noreply.github.com> Date: Mon, 22 Mar 2021 09:20:11 +1100 Subject: [PATCH 185/185] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..aeb9a2f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 anusii + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.