diff --git a/build/repositories.bzl b/build/repositories.bzl index cebbfdc393d..50428a35bae 100644 --- a/build/repositories.bzl +++ b/build/repositories.bzl @@ -41,8 +41,8 @@ def wfa_measurement_system_repositories(): wfa_repo_archive( name = "wfa_measurement_proto", repo = "cross-media-measurement-api", - sha256 = "b6ee5ff56c8c8ec8f6f44c93fe273d4120779dcd0954e9d69929137da2b2a4a7", - version = "0.42.0", + sha256 = "2106c2fd73775f5b0ad8d02c0ac01761b497920b363e1c90f12663d5321f5873", + version = "0.43.0", ) wfa_repo_archive( diff --git a/src/main/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/ProtoConversions.kt b/src/main/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/ProtoConversions.kt index 444044e55a4..2ed16a29924 100644 --- a/src/main/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/ProtoConversions.kt +++ b/src/main/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/ProtoConversions.kt @@ -120,14 +120,6 @@ import org.wfanet.measurement.internal.kingdom.protocolConfig as internalProtoco import org.wfanet.measurement.kingdom.deploy.common.Llv2ProtocolConfig import org.wfanet.measurement.kingdom.deploy.common.RoLlv2ProtocolConfig -/** - * Default maximum frequency used in the direct distribution methodology. - * - * TODO(world-federation-of-advertisers/cross-media-measurement-api#160): this value won't be needed - * once the maximum frequency field is moved to measurement spec - */ -const val DEFAULT_MAXIMUM_FREQUENCY_DIRECT_DISTRIBUTION = 20 - /** Default options of direct noise mechanisms to data providers. */ val DEFAULT_DIRECT_NOISE_MECHANISMS: List = listOf( @@ -145,6 +137,7 @@ val DEFAULT_DIRECT_NOISE_MECHANISMS: List = */ val DEFAULT_DIRECT_REACH_PROTOCOL_CONFIG: ProtocolConfig.Direct = direct { noiseMechanisms += DEFAULT_DIRECT_NOISE_MECHANISMS + customDirectMethodology = ProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCountDistinct = ProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() liquidLegionsCountDistinct = ProtocolConfig.Direct.LiquidLegionsCountDistinct.getDefaultInstance() } @@ -157,6 +150,7 @@ val DEFAULT_DIRECT_REACH_PROTOCOL_CONFIG: ProtocolConfig.Direct = direct { */ val DEFAULT_DIRECT_REACH_AND_FREQUENCY_PROTOCOL_CONFIG: ProtocolConfig.Direct = direct { noiseMechanisms += DEFAULT_DIRECT_NOISE_MECHANISMS + customDirectMethodology = ProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCountDistinct = ProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() liquidLegionsCountDistinct = ProtocolConfig.Direct.LiquidLegionsCountDistinct.getDefaultInstance() deterministicDistribution = ProtocolConfig.Direct.DeterministicDistribution.getDefaultInstance() @@ -170,6 +164,7 @@ val DEFAULT_DIRECT_REACH_AND_FREQUENCY_PROTOCOL_CONFIG: ProtocolConfig.Direct = */ val DEFAULT_DIRECT_IMPRESSION_PROTOCOL_CONFIG = direct { noiseMechanisms += DEFAULT_DIRECT_NOISE_MECHANISMS + customDirectMethodology = ProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCount = ProtocolConfig.Direct.DeterministicCount.getDefaultInstance() } @@ -181,6 +176,7 @@ val DEFAULT_DIRECT_IMPRESSION_PROTOCOL_CONFIG = direct { */ val DEFAULT_DIRECT_WATCH_DURATION_PROTOCOL_CONFIG = direct { noiseMechanisms += DEFAULT_DIRECT_NOISE_MECHANISMS + customDirectMethodology = ProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicSum = ProtocolConfig.Direct.DeterministicSum.getDefaultInstance() } @@ -460,6 +456,9 @@ private fun InternalProtocolConfig.Direct.toDirect(): ProtocolConfig.Direct { internalNoiseMechanism.toNoiseMechanism() } + if (source.hasCustomDirectMethodology()) { + customDirectMethodology = ProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() + } if (source.hasDeterministicCountDistinct()) { deterministicCountDistinct = ProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() @@ -950,6 +949,8 @@ fun Measurement.toInternal( direct = InternalProtocolConfigKt.direct { noiseMechanisms += internalNoiseMechanisms + customDirectMethodology = + InternalProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCountDistinct = InternalProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() liquidLegionsCountDistinct = @@ -972,18 +973,16 @@ fun Measurement.toInternal( direct = InternalProtocolConfigKt.direct { noiseMechanisms += internalNoiseMechanisms + customDirectMethodology = + InternalProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCountDistinct = InternalProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() liquidLegionsCountDistinct = InternalProtocolConfig.Direct.LiquidLegionsCountDistinct.getDefaultInstance() deterministicDistribution = - InternalProtocolConfigKt.DirectKt.deterministicDistribution { - maximumFrequency = DEFAULT_MAXIMUM_FREQUENCY_DIRECT_DISTRIBUTION - } + InternalProtocolConfig.Direct.DeterministicDistribution.getDefaultInstance() liquidLegionsDistribution = - InternalProtocolConfigKt.DirectKt.liquidLegionsDistribution { - maximumFrequency = DEFAULT_MAXIMUM_FREQUENCY_DIRECT_DISTRIBUTION - } + InternalProtocolConfig.Direct.LiquidLegionsDistribution.getDefaultInstance() } } } @@ -993,6 +992,8 @@ fun Measurement.toInternal( direct = InternalProtocolConfigKt.direct { noiseMechanisms += internalNoiseMechanisms + customDirectMethodology = + InternalProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCount = InternalProtocolConfig.Direct.DeterministicCount.getDefaultInstance() } @@ -1003,6 +1004,8 @@ fun Measurement.toInternal( direct = InternalProtocolConfigKt.direct { noiseMechanisms += internalNoiseMechanisms + customDirectMethodology = + InternalProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicSum = InternalProtocolConfig.Direct.DeterministicSum.getDefaultInstance() } diff --git a/src/main/kotlin/org/wfanet/measurement/loadtest/dataprovider/EdpSimulator.kt b/src/main/kotlin/org/wfanet/measurement/loadtest/dataprovider/EdpSimulator.kt index f2b55929f04..7236fc10c0b 100644 --- a/src/main/kotlin/org/wfanet/measurement/loadtest/dataprovider/EdpSimulator.kt +++ b/src/main/kotlin/org/wfanet/measurement/loadtest/dataprovider/EdpSimulator.kt @@ -83,6 +83,7 @@ import org.wfanet.measurement.api.v2alpha.SignedData import org.wfanet.measurement.api.v2alpha.copy import org.wfanet.measurement.api.v2alpha.createEventGroupMetadataDescriptorRequest import org.wfanet.measurement.api.v2alpha.createEventGroupRequest +import org.wfanet.measurement.api.v2alpha.customDirectMethodology import org.wfanet.measurement.api.v2alpha.eventGroup import org.wfanet.measurement.api.v2alpha.eventGroupMetadataDescriptor import org.wfanet.measurement.api.v2alpha.event_templates.testing.TestEvent @@ -1316,8 +1317,7 @@ class EdpSimulator( // TODO: Calculate impression from data. value = apiIdToExternalId(DataProviderKey.fromName(edpData.name)!!.dataProviderId) noiseMechanism = protocolConfigNoiseMechanism - // TODO(@riemanli): specify impression computation methodology once the real impression - // calculation is done. + customDirectMethodology = customDirectMethodology { variance = 0.0 } } } } @@ -1332,8 +1332,7 @@ class EdpSimulator( seconds = log2(externalDataProviderId.toDouble()).toLong() } noiseMechanism = protocolConfigNoiseMechanism - // TODO(@riemanli): specify duration computation methodology once the real duration - // calculation is done. + customDirectMethodology = customDirectMethodology { variance = 0.0 } } } } diff --git a/src/main/kotlin/org/wfanet/measurement/loadtest/measurementconsumer/MeasurementConsumerSimulator.kt b/src/main/kotlin/org/wfanet/measurement/loadtest/measurementconsumer/MeasurementConsumerSimulator.kt index 78eca928979..6fc90d94b0f 100644 --- a/src/main/kotlin/org/wfanet/measurement/loadtest/measurementconsumer/MeasurementConsumerSimulator.kt +++ b/src/main/kotlin/org/wfanet/measurement/loadtest/measurementconsumer/MeasurementConsumerSimulator.kt @@ -67,6 +67,7 @@ import org.wfanet.measurement.api.v2alpha.RequisitionSpecKt.eventGroupEntry import org.wfanet.measurement.api.v2alpha.SignedData import org.wfanet.measurement.api.v2alpha.copy import org.wfanet.measurement.api.v2alpha.createMeasurementRequest +import org.wfanet.measurement.api.v2alpha.customDirectMethodology import org.wfanet.measurement.api.v2alpha.differentialPrivacyParams import org.wfanet.measurement.api.v2alpha.event_templates.testing.Person import org.wfanet.measurement.api.v2alpha.getCertificateRequest @@ -318,8 +319,8 @@ class MeasurementConsumerSimulator( // EdpSimulator sets it to this value. apiIdToExternalId(DataProviderCertificateKey.fromName(it.certificate)!!.dataProviderId) ) - // EdpSimulator hasn't had an implementation for impression. - assertThat(!result.impression.hasDeterministicCount()).isTrue() + assertThat(result.impression.customDirectMethodology) + .isEqualTo(customDirectMethodology { variance = 0.0 }) assertThat(result.impression.noiseMechanism).isEqualTo(expectedDirectNoiseMechanism) } logger.info("Impression result is equal to the expected result") @@ -347,7 +348,8 @@ class MeasurementConsumerSimulator( log2(externalDataProviderId.toDouble()).toLong() ) // EdpSimulator hasn't had an implementation for watch duration. - assertThat(!result.watchDuration.hasDeterministicSum()).isTrue() + assertThat(result.watchDuration.customDirectMethodology) + .isEqualTo(customDirectMethodology { variance = 0.0 }) assertThat(result.watchDuration.noiseMechanism).isEqualTo(expectedDirectNoiseMechanism) } logger.info("Duration result is equal to the expected result") diff --git a/src/main/proto/wfa/measurement/internal/kingdom/BUILD.bazel b/src/main/proto/wfa/measurement/internal/kingdom/BUILD.bazel index 029e657731c..d5d92d195c9 100644 --- a/src/main/proto/wfa/measurement/internal/kingdom/BUILD.bazel +++ b/src/main/proto/wfa/measurement/internal/kingdom/BUILD.bazel @@ -136,10 +136,6 @@ proto_and_java_proto_library( name = "differential_privacy", ) -proto_and_java_proto_library( - name = "direct_computation", -) - proto_and_java_proto_library( name = "duchy_protocol_config", deps = [ diff --git a/src/main/proto/wfa/measurement/internal/kingdom/direct_computation.proto b/src/main/proto/wfa/measurement/internal/kingdom/direct_computation.proto deleted file mode 100644 index c02b36cf198..00000000000 --- a/src/main/proto/wfa/measurement/internal/kingdom/direct_computation.proto +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2023 The Cross-Media Measurement Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package wfa.measurement.internal.kingdom; - -option java_package = "org.wfanet.measurement.internal.kingdom"; -option java_multiple_files = true; - -// Parameters used when applying the deterministic count distinct methodology. -message DeterministicCountDistinct {} - -// Parameters used when applying the deterministic distribution methodology. -message DeterministicDistribution {} - -// Parameters used when applying the deterministic count methodology. -message DeterministicCount {} - -// Parameters used when applying the deterministic sum methodology. -message DeterministicSum {} - -// Parameters used when applying the Liquid Legions count distinct methodology. -// -// May only be set when the measurement type is REACH. -// To obtain differentially private result, one should add a DP noise to the -// estimate number of sampled registers instead of the target estimate. -message LiquidLegionsCountDistinct { - // The decay rate of the Liquid Legions sketch. Required. - double decay_rate = 1; - - // The maximum size of the Liquid Legions sketch. Required. - int64 max_size = 2; -} - -// Parameters used when applying the Liquid Legions distribution methodology. -// -// May only be set when the measurement type is REACH_AND_FREQUENCY. -// `Requisition`s using this protocol can be fulfilled by calling -// RequisitionFulfillment/FulfillRequisition with an encrypted sketch. -message LiquidLegionsDistribution { - // The decay rate of the Liquid Legions sketch. Required. - double decay_rate = 1; - - // The maximum size of the Liquid Legions sketch. Required. - int64 max_size = 2; - - // The size of the distribution of the sampling indicator value. Required. - int64 sampling_indicator_size = 3; -} diff --git a/src/main/proto/wfa/measurement/internal/kingdom/protocol_config.proto b/src/main/proto/wfa/measurement/internal/kingdom/protocol_config.proto index 92b4e1db7c7..6aca416d901 100644 --- a/src/main/proto/wfa/measurement/internal/kingdom/protocol_config.proto +++ b/src/main/proto/wfa/measurement/internal/kingdom/protocol_config.proto @@ -44,24 +44,20 @@ message ProtocolConfig { // The `DataProvider` may choose from the specified noise mechanisms and // methodologies. message Direct { + // Configuration parameters for custom direct methodology. + message CustomDirectMethodology {} // Configuration parameters for the deterministic count distinct // methodology. message DeterministicCountDistinct {} // Configuration parameters for the deterministic distribution methodology. - message DeterministicDistribution { - // The maximum frequency to reveal in the distribution. - int32 maximum_frequency = 1; - } + message DeterministicDistribution {} // Configuration parameters for the deterministic count methodology. message DeterministicCount {} // Configuration parameters for the deterministic sum methodology. message DeterministicSum {} // Configuration parameters for the direct Liquid Legions distribution // methodology. - message LiquidLegionsDistribution { - // The maximum frequency to reveal in the distribution. - int32 maximum_frequency = 1; - } + message LiquidLegionsDistribution {} // Configuration parameters for the direct Liquid Legions count distinct // methodology. message LiquidLegionsCountDistinct {} @@ -70,35 +66,41 @@ message ProtocolConfig { // computation. repeated NoiseMechanism noise_mechanisms = 1; + // Custom direct methodology. + // + // Used when data provider wants to use a methodology that is not listed in + // protocol config to compute direct measurements. + CustomDirectMethodology custom_direct_methodology = 2; + // Deterministic count distinct methodology. // // Can be used in reach computations. - DeterministicCountDistinct deterministic_count_distinct = 2; + DeterministicCountDistinct deterministic_count_distinct = 3; // Deterministic distribution methodology. // // Can be used in frequency computations. - DeterministicDistribution deterministic_distribution = 3; + DeterministicDistribution deterministic_distribution = 4; // Deterministic count methodology. // // Can be used in impression computations. - DeterministicCount deterministic_count = 4; + DeterministicCount deterministic_count = 5; // Deterministic sum methodology. // // Can be used in watch duration computations. - DeterministicSum deterministic_sum = 5; + DeterministicSum deterministic_sum = 6; // Liquid Legions count distinct methodology. // // Can be used in reach computations. - LiquidLegionsCountDistinct liquid_legions_count_distinct = 6; + LiquidLegionsCountDistinct liquid_legions_count_distinct = 7; // Liquid Legions distribution methodology. // // Can be used in frequency computations. - LiquidLegionsDistribution liquid_legions_distribution = 7; + LiquidLegionsDistribution liquid_legions_distribution = 8; } // Configuration for Liquid Legions v2 protocols. diff --git a/src/test/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/MeasurementsServiceTest.kt b/src/test/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/MeasurementsServiceTest.kt index 0210dbd695a..385526078e3 100644 --- a/src/test/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/MeasurementsServiceTest.kt +++ b/src/test/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/MeasurementsServiceTest.kt @@ -2048,36 +2048,27 @@ class MeasurementsServiceTest { InternalNoiseMechanism.CONTINUOUS_GAUSSIAN ) - private val DEFAULT_INTERNAL_DIRECT_REACH_PROTOCOL_CONFIG: InternalProtocolConfig.Direct = - direct { - noiseMechanisms += DEFAULT_INTERNAL_DIRECT_NOISE_MECHANISMS - deterministicCountDistinct = - InternalProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() - liquidLegionsCountDistinct = - InternalProtocolConfig.Direct.LiquidLegionsCountDistinct.getDefaultInstance() - } - private val DEFAULT_INTERNAL_DIRECT_REACH_AND_FREQUENCY_PROTOCOL_CONFIG: InternalProtocolConfig.Direct = direct { noiseMechanisms += DEFAULT_INTERNAL_DIRECT_NOISE_MECHANISMS + customDirectMethodology = + InternalProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCountDistinct = InternalProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() liquidLegionsCountDistinct = InternalProtocolConfig.Direct.LiquidLegionsCountDistinct.getDefaultInstance() deterministicDistribution = - InternalProtocolConfigKt.DirectKt.deterministicDistribution { - maximumFrequency = DEFAULT_MAXIMUM_FREQUENCY_DIRECT_DISTRIBUTION - } + InternalProtocolConfig.Direct.DeterministicDistribution.getDefaultInstance() liquidLegionsDistribution = - InternalProtocolConfigKt.DirectKt.liquidLegionsDistribution { - maximumFrequency = DEFAULT_MAXIMUM_FREQUENCY_DIRECT_DISTRIBUTION - } + InternalProtocolConfig.Direct.LiquidLegionsDistribution.getDefaultInstance() } private val DEFAULT_INTERNAL_DIRECT_IMPRESSION_PROTOCOL_CONFIG: InternalProtocolConfig.Direct = direct { noiseMechanisms += DEFAULT_INTERNAL_DIRECT_NOISE_MECHANISMS + customDirectMethodology = + InternalProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCount = InternalProtocolConfig.Direct.DeterministicCount.getDefaultInstance() } @@ -2085,6 +2076,8 @@ class MeasurementsServiceTest { InternalProtocolConfig.Direct = direct { noiseMechanisms += DEFAULT_INTERNAL_DIRECT_NOISE_MECHANISMS + customDirectMethodology = + InternalProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicSum = InternalProtocolConfig.Direct.DeterministicSum.getDefaultInstance() } diff --git a/src/test/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/RequisitionsServiceTest.kt b/src/test/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/RequisitionsServiceTest.kt index 856305727a4..6fe7205001d 100644 --- a/src/test/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/RequisitionsServiceTest.kt +++ b/src/test/kotlin/org/wfanet/measurement/kingdom/service/api/v2alpha/RequisitionsServiceTest.kt @@ -851,7 +851,6 @@ class RequisitionsServiceTest { } companion object { - private const val MAXIMUM_FREQUENCY_DIRECT_DISTRIBUTION = 10 private val MEASUREMENT_SPEC = measurementSpec { measurementPublicKey = UPDATE_TIME.toByteString() reachAndFrequency = @@ -873,8 +872,11 @@ class RequisitionsServiceTest { ProtocolConfigKt.direct { noiseMechanisms += ProtocolConfig.NoiseMechanism.CONTINUOUS_LAPLACE noiseMechanisms += ProtocolConfig.NoiseMechanism.CONTINUOUS_GAUSSIAN - deterministicCountDistinct = ProtocolConfigKt.DirectKt.deterministicCountDistinct {} - liquidLegionsCountDistinct = ProtocolConfigKt.DirectKt.liquidLegionsCountDistinct {} + customDirectMethodology = ProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() + deterministicCountDistinct = + ProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() + liquidLegionsCountDistinct = + ProtocolConfig.Direct.LiquidLegionsCountDistinct.getDefaultInstance() deterministicDistribution = ProtocolConfig.Direct.DeterministicDistribution.getDefaultInstance() liquidLegionsDistribution = @@ -885,16 +887,16 @@ class RequisitionsServiceTest { InternalProtocolConfigKt.direct { noiseMechanisms += InternalProtocolConfig.NoiseMechanism.CONTINUOUS_LAPLACE noiseMechanisms += InternalProtocolConfig.NoiseMechanism.CONTINUOUS_GAUSSIAN - deterministicCountDistinct = InternalProtocolConfigKt.DirectKt.deterministicCountDistinct {} - liquidLegionsCountDistinct = InternalProtocolConfigKt.DirectKt.liquidLegionsCountDistinct {} + customDirectMethodology = + InternalProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() + deterministicCountDistinct = + InternalProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() + liquidLegionsCountDistinct = + InternalProtocolConfig.Direct.LiquidLegionsCountDistinct.getDefaultInstance() deterministicDistribution = - InternalProtocolConfigKt.DirectKt.deterministicDistribution { - maximumFrequency = MAXIMUM_FREQUENCY_DIRECT_DISTRIBUTION - } + InternalProtocolConfig.Direct.DeterministicDistribution.getDefaultInstance() liquidLegionsDistribution = - InternalProtocolConfigKt.DirectKt.liquidLegionsDistribution { - maximumFrequency = MAXIMUM_FREQUENCY_DIRECT_DISTRIBUTION - } + InternalProtocolConfig.Direct.LiquidLegionsDistribution.getDefaultInstance() } private val INTERNAL_REQUISITION: InternalRequisition = internalRequisition { diff --git a/src/test/kotlin/org/wfanet/measurement/loadtest/dataprovider/EdpSimulatorTest.kt b/src/test/kotlin/org/wfanet/measurement/loadtest/dataprovider/EdpSimulatorTest.kt index fd024b89981..b1a9396aad9 100644 --- a/src/test/kotlin/org/wfanet/measurement/loadtest/dataprovider/EdpSimulatorTest.kt +++ b/src/test/kotlin/org/wfanet/measurement/loadtest/dataprovider/EdpSimulatorTest.kt @@ -820,6 +820,8 @@ class EdpSimulatorTest { direct = ProtocolConfigKt.direct { noiseMechanisms += noiseMechanismOption + customDirectMethodology = + ProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCountDistinct = ProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() deterministicDistribution = @@ -1213,6 +1215,8 @@ class EdpSimulatorTest { direct = ProtocolConfigKt.direct { noiseMechanisms += noiseMechanismOption + customDirectMethodology = + ProtocolConfig.Direct.CustomDirectMethodology.getDefaultInstance() deterministicCountDistinct = ProtocolConfig.Direct.DeterministicCountDistinct.getDefaultInstance() deterministicDistribution =