Adds NeighboringRelation to Accountant and clarifies FixedBatchSample events to be with or without replacement.
PiperOrigin-RevId: 393459878
This commit is contained in:
parent
48e4836a36
commit
07c248d868
2 changed files with 28 additions and 3 deletions
|
@ -85,8 +85,16 @@ class PoissonSampledDpEvent(DpEvent):
|
||||||
|
|
||||||
|
|
||||||
@attr.s(frozen=True, slots=True, auto_attribs=True)
|
@attr.s(frozen=True, slots=True, auto_attribs=True)
|
||||||
class EqualBatchSampledDpEvent(DpEvent):
|
class FixedBatchSampledWrDpEvent(DpEvent):
|
||||||
"""An application of sampling exactly `batch_size` records."""
|
"""Sampling exactly `batch_size` records with replacement."""
|
||||||
|
dataset_size: int
|
||||||
|
batch_size: int
|
||||||
|
event: DpEvent
|
||||||
|
|
||||||
|
|
||||||
|
@attr.s(frozen=True, slots=True, auto_attribs=True)
|
||||||
|
class FixedBatchSampledWorDpEvent(DpEvent):
|
||||||
|
"""Sampling exactly `batch_size` records without replacement."""
|
||||||
dataset_size: int
|
dataset_size: int
|
||||||
batch_size: int
|
batch_size: int
|
||||||
event: DpEvent
|
event: DpEvent
|
||||||
|
|
|
@ -14,17 +14,34 @@
|
||||||
"""PrivacyAccountant abstract base class."""
|
"""PrivacyAccountant abstract base class."""
|
||||||
|
|
||||||
import abc
|
import abc
|
||||||
|
import enum
|
||||||
|
|
||||||
from tensorflow_privacy.privacy.dp_event import dp_event
|
from tensorflow_privacy.privacy.dp_event import dp_event
|
||||||
from tensorflow_privacy.privacy.dp_event import dp_event_builder
|
from tensorflow_privacy.privacy.dp_event import dp_event_builder
|
||||||
|
|
||||||
|
|
||||||
|
class NeighboringRelation(enum.Enum):
|
||||||
|
ADD_OR_REMOVE_ONE = 1
|
||||||
|
REPLACE_ONE = 2
|
||||||
|
|
||||||
|
|
||||||
class PrivacyAccountant(metaclass=abc.ABCMeta):
|
class PrivacyAccountant(metaclass=abc.ABCMeta):
|
||||||
"""Abstract base class for privacy accountants."""
|
"""Abstract base class for privacy accountants."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, neighboring_relation: NeighboringRelation):
|
||||||
|
self._neighboring_relation = neighboring_relation
|
||||||
self._ledger = dp_event_builder.DpEventBuilder()
|
self._ledger = dp_event_builder.DpEventBuilder()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def neighboring_relation(self) -> NeighboringRelation:
|
||||||
|
"""The neighboring relation used by the accountant.
|
||||||
|
|
||||||
|
The neighboring relation is expected to remain constant after
|
||||||
|
initialization. Subclasses should not override this property or change the
|
||||||
|
value of the private attribute.
|
||||||
|
"""
|
||||||
|
return self._neighboring_relation
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def is_supported(self, event: dp_event.DpEvent) -> bool:
|
def is_supported(self, event: dp_event.DpEvent) -> bool:
|
||||||
"""Checks whether the `DpEvent` can be processed by this accountant.
|
"""Checks whether the `DpEvent` can be processed by this accountant.
|
||||||
|
|
Loading…
Reference in a new issue