Skip to content

Commit 61e57a6

Browse files
committed
code formatting
1 parent 1378f7f commit 61e57a6

3 files changed

Lines changed: 44 additions & 42 deletions

File tree

syndiffix/microdata.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def __init__(self, values: Iterable[Value]) -> None:
8787
super().__init__()
8888
# Fit up to 0.9999 so that the max bucket range is [0-1)
8989
self.scaler = MinMaxScaler(feature_range=(0.0, 0.9999)) # type: ignore
90-
# This value-neutral fitting is only for passing unit tests, gets overridden
90+
# This value-neutral fitting is only for passing unit tests, gets overridden
9191
# later by fit_transform().
9292
self.scaler.fit(np.array([[0.0], [0.9999]]))
9393
self.final_round_precision = _get_round_precision(cast(Iterable[float], values))
@@ -119,7 +119,7 @@ def __init__(self) -> None:
119119
super().__init__()
120120
# Fit up to 0.9999 so that the max bucket range is [0-1)
121121
self.scaler = MinMaxScaler(feature_range=(0.0, 0.9999)) # type: ignore
122-
# This value-neutral fitting is only for passing unit tests, gets overridden
122+
# This value-neutral fitting is only for passing unit tests, gets overridden
123123
# later by fit_transform().
124124
self.scaler.fit(np.array([[0.0], [0.9999]]))
125125

@@ -149,7 +149,7 @@ def __init__(self) -> None:
149149
super().__init__()
150150
# Fit up to 0.9999 so that the max bucket range is [0-1)
151151
self.scaler = MinMaxScaler(feature_range=(0.0, 0.9999)) # type: ignore
152-
# This value-neutral fitting is only for passing unit tests, gets overridden
152+
# This value-neutral fitting is only for passing unit tests, gets overridden
153153
# later by fit_transform().
154154
self.scaler.fit(np.array([[0.0], [0.9999]]))
155155

@@ -188,7 +188,7 @@ def __init__(self, values: Iterable[Value]) -> None:
188188
self.safe_values: Set[float] = set()
189189
# Fit up to 0.9999 so that the max bucket range is [0-1)
190190
self.scaler = MinMaxScaler(feature_range=(0.0, 0.9999)) # type: ignore
191-
# This value-neutral fitting is only for passing unit tests, gets overridden
191+
# This value-neutral fitting is only for passing unit tests, gets overridden
192192
# later by fit_transform().
193193
self.scaler.fit(np.array([[0.0], [0.9999]]))
194194

@@ -244,8 +244,8 @@ def analyze_tree_walk(node: Node) -> None:
244244
analyze_tree_walk(child_node)
245245

246246
analyze_tree_walk(root)
247-
#from .tree import _dump_tree
248-
#_dump_tree(root) # Debugging line to see the tree structure
247+
# from .tree import _dump_tree
248+
# _dump_tree(root) # Debugging line to see the tree structure
249249

250250
def denormalize_safe_values(self) -> None:
251251
assert self.scaler is not None
@@ -360,16 +360,16 @@ def _find_encapsulated_integer_interval(interval: Interval, scaler: MinMaxScaler
360360
"""
361361
Find the largest interval within the given interval where the inverse-transformed
362362
bounds correspond to integers (within machine precision).
363-
363+
364364
Args:
365365
interval: The input interval in normalized space
366366
scaler: The MinMaxScaler used for inverse transformation
367-
367+
368368
Returns:
369369
A new interval with bounds that are integer values (cast as floats)
370370
"""
371371
interval_new = interval.copy()
372-
372+
373373
# Handle singularity case - bounds are already at the same point
374374
if interval.is_singularity():
375375
# Convert the single value to its corresponding integer
@@ -378,23 +378,23 @@ def _find_encapsulated_integer_interval(interval: Interval, scaler: MinMaxScaler
378378
interval_new.min = integer_value
379379
interval_new.max = integer_value
380380
return interval_new
381-
381+
382382
# Find the smallest integer >= the inverse-transformed interval.min
383383
min_inverse = _inverse_normalize_value(interval.min, scaler)
384384
min_integer = int(round(min_inverse))
385-
385+
386386
# If the current min already transforms to an integer (within precision), use it
387387
if abs(min_inverse - min_integer) < 1e-10:
388388
interval_new.min = float(min_integer)
389389
else:
390390
# Find the next integer
391391
next_integer = min_integer + 1 if min_inverse > min_integer else min_integer
392392
interval_new.min = float(next_integer)
393-
393+
394394
# Find the largest integer <= the inverse-transformed interval.max
395395
max_inverse = _inverse_normalize_value(interval.max, scaler)
396396
max_integer = int(round(max_inverse))
397-
397+
398398
# Note that the max value of an Interval is exclusive, so we need to take care
399399
if abs(max_inverse - max_integer) < 1e-10:
400400
# If this is exact, then it will be included in the next higher min_integer
@@ -404,13 +404,15 @@ def _find_encapsulated_integer_interval(interval: Interval, scaler: MinMaxScaler
404404
prev_integer = max_integer - 1 if max_inverse < max_integer else max_integer
405405
# We add 1.0 because the max value is exclusive
406406
interval_new.max = float(prev_integer + 1.0)
407-
407+
408408
# Ensure the new interval is valid (min <= max)
409409
if interval_new.min > interval_new.max:
410410
# If no valid integer interval exists within bounds, throw an exception
411-
raise ValueError(f"No valid integer interval exists within bounds. "
412-
f"Min integer: {interval_new.min}, Max integer: {interval_new.max}")
413-
411+
raise ValueError(
412+
f"No valid integer interval exists within bounds. "
413+
f"Min integer: {interval_new.min}, Max integer: {interval_new.max}"
414+
)
415+
414416
return interval_new
415417

416418

@@ -458,7 +460,7 @@ def apply_convertors(convertors: list[DataConvertor], raw_data: pd.DataFrame) ->
458460
def generate_microdata(
459461
buckets: Buckets, convertors: list[DataConvertor], null_mappings: list[float], rng: Random
460462
) -> list[MicrodataRow]:
461-
#print(buckets) # Debugging line to see the buckets
463+
# print(buckets) # Debugging line to see the buckets
462464
[convertor.denormalize_safe_values() for convertor in convertors]
463465
microdata_rows: list[MicrodataRow] = []
464466
for bucket in buckets:

syndiffix/tree.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -280,19 +280,19 @@ def print(self) -> None:
280280
def _dump_tree(node: Node, indent: int = 0) -> None:
281281
"""Display the tree structure with directory-like indentation."""
282282
indent_str = " " * indent
283-
283+
284284
# Format snapped_interval as [(min, max), (min, max), ...]
285285
intervals_str = ", ".join(f"({interval.min}, {interval.max})" for interval in node.snapped_intervals)
286-
286+
287287
# Get row count
288288
if isinstance(node, Leaf):
289289
row_count = len(node.rows)
290290
else: # Branch
291291
row_count = len(list(node._matching_rows()))
292-
292+
293293
# Print this node's info
294294
print(f"{indent_str}[{intervals_str}] rows: {row_count}")
295-
295+
296296
# Recursively print children if this is a Branch
297297
if isinstance(node, Branch):
298298
for child_index in sorted(node.children.keys()):

tests/test_synthesizer.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -177,12 +177,12 @@ def test_normalize_strings() -> None:
177177

178178
def test_string_consistency() -> None:
179179
# Create a dataframe with identical values in both columns
180-
c1_values = ['a'] * 10 + ['b'] * 10 + ['c'] * 10
180+
c1_values = ["a"] * 10 + ["b"] * 10 + ["c"] * 10
181181
c2_values = c1_values.copy() # c2 is identical to c1
182182
df = pd.DataFrame({"c1": c1_values, "c2": c2_values})
183-
183+
184184
syn_data = Synthesizer(df).sample()
185-
185+
186186
# Ensure all values for c1 and c2 match in the synthetic dataframe
187187
for i in range(len(syn_data)):
188188
c1_val = syn_data.iloc[i, 0] # First column (c1)
@@ -267,42 +267,42 @@ def test_value_safe_columns_strings() -> None:
267267

268268
def test_pid() -> None:
269269
np.random.seed(42) # For reproducible tests
270-
270+
271271
# Create 20 distinct strings: 10 starting with 'a', 10 starting with 'b'
272272
strings_c1 = []
273273
for i in range(10):
274274
# Generate 4 random characters for the suffix
275-
suffix = ''.join(np.random.choice(list('abcdefghijklmnopqrstuvwxyz'), 4))
276-
strings_c1.append(f'a{suffix}')
277-
275+
suffix = "".join(np.random.choice(list("abcdefghijklmnopqrstuvwxyz"), 4))
276+
strings_c1.append(f"a{suffix}")
277+
278278
for i in range(10):
279279
# Generate 4 random characters for the suffix
280-
suffix = ''.join(np.random.choice(list('abcdefghijklmnopqrstuvwxyz'), 4))
281-
strings_c1.append(f'b{suffix}')
282-
280+
suffix = "".join(np.random.choice(list("abcdefghijklmnopqrstuvwxyz"), 4))
281+
strings_c1.append(f"b{suffix}")
282+
283283
# Create 20 distinct PIDs (integers)
284284
pids = list(range(20))
285-
285+
286286
# Create mapping from string to PID
287287
string_to_pid = dict(zip(strings_c1, pids))
288-
288+
289289
# Generate 1000 rows with random string selections and corresponding PIDs
290290
selected_strings = np.random.choice(strings_c1, 1000)
291291
selected_pids = [string_to_pid[s] for s in selected_strings]
292-
292+
293293
# Create the dataframe
294294
df = pd.DataFrame({"pid": selected_pids, "c1": selected_strings})
295-
295+
296296
# Build synthetic dataframe using PID functionality
297297
df_pid = df[["pid"]]
298298
df_without_pid = df.drop(columns=["pid"])
299299
syn_data = Synthesizer(df_without_pid, pids=df_pid).sample()
300-
300+
301301
# Check that none of the values in syn_data['c1'] match any of the values in df_without_pid['c1']
302-
original_c1_values = set(df_without_pid['c1'])
303-
synthetic_c1_values = set(syn_data['c1'])
302+
original_c1_values = set(df_without_pid["c1"])
303+
synthetic_c1_values = set(syn_data["c1"])
304304
assert synthetic_c1_values.isdisjoint(original_c1_values), "Synthetic values should not match original values"
305-
305+
306306
# Check that every value in syn_data['c1'] begins with either 'a' or 'b'
307-
for value in syn_data['c1']:
308-
assert value.startswith('a') or value.startswith('b'), f"Value '{value}' does not start with 'a' or 'b'"
307+
for value in syn_data["c1"]:
308+
assert value.startswith("a") or value.startswith("b"), f"Value '{value}' does not start with 'a' or 'b'"

0 commit comments

Comments
 (0)