@@ -4553,6 +4553,80 @@ def test_freeze_is_cached():
4553
4553
assert f5 is f4
4554
4554
4555
4555
4556
+ @pytest .mark .parametrize (
4557
+ "circuit, mutate" ,
4558
+ [
4559
+ (
4560
+ cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ))),
4561
+ lambda c : c .__setitem__ (0 , cirq .Moment (cirq .Y (cirq .q (0 )))),
4562
+ ),
4563
+ (cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ))), lambda c : c .__delitem__ (0 )),
4564
+ (cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ))), lambda c : c .__imul__ (2 )),
4565
+ (
4566
+ cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ))),
4567
+ lambda c : c .insert (1 , cirq .Y (cirq .q (0 ))),
4568
+ ),
4569
+ (
4570
+ cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ))),
4571
+ lambda c : c .insert_into_range ([cirq .Y (cirq .q (1 )), cirq .M (cirq .q (1 ))], 0 , 2 ),
4572
+ ),
4573
+ (
4574
+ cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ))),
4575
+ lambda c : c .insert_at_frontier ([cirq .Y (cirq .q (0 )), cirq .Y (cirq .q (1 ))], 1 ),
4576
+ ),
4577
+ (
4578
+ cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ))),
4579
+ lambda c : c .batch_replace ([(0 , cirq .X (cirq .q (0 )), cirq .Y (cirq .q (0 )))]),
4580
+ ),
4581
+ (
4582
+ cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ), cirq .q (1 ))),
4583
+ lambda c : c .batch_insert_into ([(0 , cirq .X (cirq .q (1 )))]),
4584
+ ),
4585
+ (
4586
+ cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ))),
4587
+ lambda c : c .batch_insert ([(1 , cirq .Y (cirq .q (0 )))]),
4588
+ ),
4589
+ (
4590
+ cirq .Circuit (cirq .X (cirq .q (0 )), cirq .M (cirq .q (0 ))),
4591
+ lambda c : c .clear_operations_touching ([cirq .q (0 )], [0 ]),
4592
+ ),
4593
+ ],
4594
+ )
4595
+ def test_mutation_clears_cached_attributes (circuit , mutate ):
4596
+ cached_attributes = [
4597
+ "_all_qubits" ,
4598
+ "_frozen" ,
4599
+ "_is_measurement" ,
4600
+ "_is_parameterized" ,
4601
+ "_parameter_names" ,
4602
+ ]
4603
+
4604
+ for attr in cached_attributes :
4605
+ assert getattr (circuit , attr ) is None , f"{ attr = } is not None"
4606
+
4607
+ # Check that attributes are cached after getting them.
4608
+ qubits = circuit .all_qubits ()
4609
+ frozen = circuit .freeze ()
4610
+ is_measurement = cirq .is_measurement (circuit )
4611
+ is_parameterized = cirq .is_parameterized (circuit )
4612
+ parameter_names = cirq .parameter_names (circuit )
4613
+
4614
+ for attr in cached_attributes :
4615
+ assert getattr (circuit , attr ) is not None , f"{ attr = } is None"
4616
+
4617
+ # Check that getting again returns same object.
4618
+ assert circuit .all_qubits () is qubits
4619
+ assert circuit .freeze () is frozen
4620
+ assert cirq .is_measurement (circuit ) is is_measurement
4621
+ assert cirq .is_parameterized (circuit ) is is_parameterized
4622
+ assert cirq .parameter_names (circuit ) is parameter_names
4623
+
4624
+ # Check that attributes are cleared after mutation.
4625
+ mutate (circuit )
4626
+ for attr in cached_attributes :
4627
+ assert getattr (circuit , attr ) is None , f"{ attr = } is not None"
4628
+
4629
+
4556
4630
def test_factorize_one_factor ():
4557
4631
circuit = cirq .Circuit ()
4558
4632
q0 , q1 , q2 = cirq .LineQubit .range (3 )
0 commit comments