|
4 | 4 |
|
5 | 5 | from sdv.cag import FixedCombinations, ProgrammableConstraint, SingleTableProgrammableConstraint |
6 | 6 | from sdv.datasets.demo import download_demo |
| 7 | +from sdv.metadata import Metadata |
7 | 8 | from sdv.multi_table import HMASynthesizer |
8 | 9 | from sdv.single_table import GaussianCopulaSynthesizer |
9 | 10 |
|
@@ -196,3 +197,46 @@ def test_end_to_end_simple_constraint_with_no_fit(programmable_constraint): |
196 | 197 | true_values = (sampled_data['has_rewards']) & (sampled_data['amenities_fee'] == 0.0) |
197 | 198 | false_values = ~sampled_data['has_rewards'] |
198 | 199 | assert all((true_values) | (false_values)) |
| 200 | + |
| 201 | + |
| 202 | +def test_get_updated_metadata_is_passed_metadata_copy(single_table_programmable_constraint): |
| 203 | + """Test that the ``get_updated_metadata`` is not given the original metadata.""" |
| 204 | + # Setup |
| 205 | + data, metadata = download_demo('single_table', 'fake_hotel_guests') |
| 206 | + original_metadata = Metadata.load_from_dict(metadata.to_dict()) |
| 207 | + |
| 208 | + def get_updated_metadata(self, metadata): |
| 209 | + for column in self.column_names: |
| 210 | + metadata.remove_column(column) |
| 211 | + |
| 212 | + metadata.add_column(self._joint_column, sdtype='categorical') |
| 213 | + return metadata |
| 214 | + |
| 215 | + single_table_programmable_constraint.get_updated_metadata = get_updated_metadata |
| 216 | + my_constraint = single_table_programmable_constraint( |
| 217 | + column_names=['has_rewards', 'room_type'], table_name='fake_hotel_guests' |
| 218 | + ) |
| 219 | + |
| 220 | + synthesizer = GaussianCopulaSynthesizer(metadata) |
| 221 | + |
| 222 | + # Run |
| 223 | + synthesizer.add_constraints([my_constraint]) |
| 224 | + synthesizer.fit(data) |
| 225 | + updated_metadata = synthesizer.get_metadata('modified') |
| 226 | + |
| 227 | + # Assert |
| 228 | + assert metadata.to_dict() == original_metadata.to_dict() |
| 229 | + expected_modified_metadata = Metadata.load_from_dict({ |
| 230 | + 'tables': { |
| 231 | + 'fake_hotel_guests': { |
| 232 | + 'columns': { |
| 233 | + col: meta |
| 234 | + for col, meta in original_metadata.tables['fake_hotel_guests'].columns.items() |
| 235 | + if col not in ['has_rewards', 'room_type'] |
| 236 | + }, |
| 237 | + 'primary_key': 'guest_email', |
| 238 | + } |
| 239 | + } |
| 240 | + }) |
| 241 | + expected_modified_metadata.add_column('has_rewards#room_type', sdtype='categorical') |
| 242 | + assert updated_metadata.to_dict() == expected_modified_metadata.to_dict() |
0 commit comments