Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.

Commit 49393b9

Browse files
authored
Allow operations in arguments for GetNonQubitArgumentsAsString (#314)
* Handle operations as arguments in GetNonQubitArgumentsAsString * Handle null values for IApplyData types
1 parent 08ae4a4 commit 49393b9

File tree

4 files changed

+62
-4
lines changed

4 files changed

+62
-4
lines changed

src/Simulation/Core/TypeExtensions.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,16 @@ public static Type[] GetTupleFieldTypes(this Type arg)
159159
// If object is a Qubit, QVoid, or array of Qubits, ignore it (i.e. return null)
160160
if (o is Qubit || o is QVoid || o is IEnumerable<Qubit>) return null;
161161

162+
// If object is an ICallable, return its name
163+
if (o is ICallable op)
164+
{
165+
return op.Name;
166+
}
167+
162168
// If object is an IApplyData, recursively extract arguments
163169
if (o is IApplyData data)
164170
{
165-
return data.Value.GetNonQubitArgumentsAsString();
171+
return data.Value?.GetNonQubitArgumentsAsString();
166172
}
167173

168174
// If object is a string, enclose it in quotations

src/Simulation/Simulators.Tests/Circuits/RuntimeMetadataTest.qs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ namespace Microsoft.Quantum.Simulation.Simulators.Tests.Circuits {
1111

1212
operation Empty () : Unit is Ctl + Adj { }
1313

14+
operation WrapperOp (op: (Qubit => Unit), q : Qubit) : Unit {
15+
op(q);
16+
Reset(q);
17+
}
18+
1419
operation HOp (q : Qubit) : Unit {
1520
H(q);
1621
Reset(q);

src/Simulation/Simulators.Tests/RuntimeMetadataTests.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,10 +410,32 @@ public void EmptyOperation()
410410
Assert.Equal(op.GetRuntimeMetadata(args), expected);
411411
}
412412

413+
[Fact]
414+
public void OperationAsArgument()
415+
{
416+
var q = new FreeQubit(0);
417+
var opArg = new QuantumSimulator().Get<Circuits.HOp>();
418+
var op = new QuantumSimulator().Get<Circuits.WrapperOp>();
419+
var args = op.__dataIn((opArg, q));
420+
var expected = new RuntimeMetadata()
421+
{
422+
Label = "WrapperOp",
423+
FormattedNonQubitArgs = "(HOp)",
424+
IsAdjoint = false,
425+
IsControlled = false,
426+
IsMeasurement = false,
427+
IsComposite = false,
428+
Children = null,
429+
Controls = new List<Qubit>() { },
430+
Targets = new List<Qubit>() { q },
431+
};
432+
433+
Assert.Equal(op.GetRuntimeMetadata(args), expected);
434+
}
435+
413436
[Fact]
414437
public void NestedOperation()
415438
{
416-
var measureQubit = new FreeQubit(0);
417439
var op = new QuantumSimulator().Get<Circuits.NestedOp>();
418440
var args = op.__dataIn(QVoid.Instance);
419441
var expected = new RuntimeMetadata()

src/Simulation/Simulators.Tests/TypeExtensionsTest.cs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ public void BasicTypes()
3333
Assert.Equal("\"\"", "".GetNonQubitArgumentsAsString());
3434
}
3535

36+
[Fact]
37+
public void OperationTypes()
38+
{
39+
var op = new QuantumSimulator().Get<Intrinsic.H>();
40+
Assert.Equal("H", op.GetNonQubitArgumentsAsString());
41+
42+
var op2 = new QuantumSimulator().Get<Intrinsic.CNOT>();
43+
Assert.Equal("CNOT", op2.GetNonQubitArgumentsAsString());
44+
}
45+
3646
[Fact]
3747
public void QubitTypes()
3848
{
@@ -58,6 +68,10 @@ public void TupleTypes()
5868
Assert.Equal("(\"foo\", (\"bar\", \"car\"))", ("foo", ("bar", "car")).GetNonQubitArgumentsAsString());
5969
Assert.Equal("((\"foo\"), (\"bar\", \"car\"))", (("foo", new FreeQubit(0)), ("bar", "car")).GetNonQubitArgumentsAsString());
6070

71+
var op = new QuantumSimulator().Get<Intrinsic.H>();
72+
var opTuple = new QTuple<(ICallable, string)>((op, "foo"));
73+
Assert.Equal("(H, \"foo\")", opTuple.GetNonQubitArgumentsAsString());
74+
6175
var qtuple = new QTuple<(Qubit, string)>((new FreeQubit(0), "foo"));
6276
Assert.Equal("(\"foo\")", qtuple.GetNonQubitArgumentsAsString());
6377
}
@@ -68,11 +82,18 @@ public void ArrayTypes()
6882
Assert.Equal("[1, 2, 3]", new[] { 1, 2, 3 }.GetNonQubitArgumentsAsString());
6983
Assert.Equal("[\"foo\", \"bar\"]", new[] { "foo", "bar" }.GetNonQubitArgumentsAsString());
7084

71-
var arr = new[] {
85+
var opArr = new ICallable[] {
86+
new QuantumSimulator().Get<Intrinsic.H>(),
87+
new QuantumSimulator().Get<Intrinsic.CNOT>(),
88+
new QuantumSimulator().Get<Intrinsic.Ry>(),
89+
};
90+
Assert.Equal("[H, CNOT, Ry]", opArr.GetNonQubitArgumentsAsString());
91+
92+
var qTupleArr = new[] {
7293
(new FreeQubit(0), "foo"),
7394
(new FreeQubit(1), "bar"),
7495
};
75-
Assert.Equal("[(\"foo\"), (\"bar\")]", arr.GetNonQubitArgumentsAsString());
96+
Assert.Equal("[(\"foo\"), (\"bar\")]", qTupleArr.GetNonQubitArgumentsAsString());
7697
}
7798

7899
[Fact]
@@ -88,6 +109,10 @@ public void IApplyDataTypes()
88109
data = new ApplyData<string>("Foo");
89110
Assert.Equal("\"Foo\"", data.GetNonQubitArgumentsAsString());
90111

112+
var op = new QuantumSimulator().Get<Intrinsic.H>();
113+
data = new ApplyData<ICallable>(op);
114+
Assert.Equal("H", data.GetNonQubitArgumentsAsString());
115+
91116
data = new ApplyData<ValueTuple<int, string>>((1, "foo"));
92117
Assert.Equal("(1, \"foo\")", data.GetNonQubitArgumentsAsString());
93118

0 commit comments

Comments
 (0)