/src/Simulation/Simulators.Tests/StartOperationTests.cs

https://github.com/microsoft/qsharp-runtime · C# · 190 lines · 157 code · 30 blank · 3 comment · 0 complexity · 98be1b17349453f1e4235947d45956a1 MD5 · raw file

  1. // Copyright (c) Microsoft Corporation. All rights reserved.
  2. // Licensed under the MIT License.
  3. using Microsoft.Quantum.Simulation.Core;
  4. using Microsoft.Quantum.Tests.StartOperation;
  5. using System;
  6. using Xunit;
  7. namespace Microsoft.Quantum.Simulation.Simulators.Tests
  8. {
  9. using Helper = Microsoft.Quantum.Simulation.Simulators.Tests.OperationsTestHelper;
  10. public class StartOperationTests
  11. {
  12. [Fact]
  13. public void StartOperationCalls()
  14. {
  15. Helper.RunWithMultipleSimulators((s) =>
  16. {
  17. var tracker = new StartTracker(s);
  18. StartOperationTest.Run(s).Wait();
  19. var q0 = new FreeQubit(0) as Qubit;
  20. var q1 = new FreeQubit(1) as Qubit;
  21. var q2 = new FreeQubit(2) as Qubit;
  22. var q3 = new FreeQubit(3) as Qubit;
  23. Assert.Equal(1, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.StartOperationTest"));
  24. var allVariantsBody = 3;
  25. var allVariantsAdjoint = 2;
  26. var allVariantsCtrl = 2;
  27. var allVariantsAdjointCtrl = 1;
  28. var allVariants = allVariantsBody + allVariantsAdjoint + allVariantsCtrl + allVariantsAdjointCtrl;
  29. Assert.Equal(allVariants, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants"));
  30. Assert.Equal(allVariantsBody, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants", OperationFunctor.Body));
  31. Assert.Equal(allVariantsAdjoint, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants", OperationFunctor.Adjoint));
  32. Assert.Equal(allVariantsCtrl, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants", OperationFunctor.Controlled));
  33. Assert.Equal(allVariantsAdjointCtrl, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants", OperationFunctor.ControlledAdjoint));
  34. var basicBody = 9;
  35. var basicAdjoint = 7;
  36. var basicCtrl = 9;
  37. var basicCtrlAdjoint = 7;
  38. var basic = basicBody + basicAdjoint + basicCtrl + basicCtrlAdjoint;
  39. Assert.Equal(basic, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic"));
  40. Assert.Equal(basicBody, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Body));
  41. Assert.Equal(basicAdjoint, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Adjoint));
  42. Assert.Equal(basicCtrl, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Controlled));
  43. Assert.Equal(basicCtrlAdjoint, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.ControlledAdjoint));
  44. var data1 = (0L, q1, (q2, q3), Result.One);
  45. Assert.Equal(3, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Body, data1));
  46. Assert.Equal(3, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Adjoint, data1));
  47. var data2 = (1L, q1, (q2, q3), Result.Zero);
  48. Assert.Equal(6, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Body, data2));
  49. Assert.Equal(4, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Adjoint, data2));
  50. Assert.Equal(basic * 4, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X"));
  51. Assert.Equal(basicBody * 4, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X", OperationFunctor.Body));
  52. Assert.Equal(basicAdjoint * 4, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X", OperationFunctor.Adjoint));
  53. Assert.Equal(basicCtrl * 4, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X", OperationFunctor.Controlled));
  54. Assert.Equal(basicCtrlAdjoint * 4, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X", OperationFunctor.ControlledAdjoint));
  55. });
  56. }
  57. [Fact]
  58. public void StartUDTOperationCalls()
  59. {
  60. Helper.RunWithMultipleSimulators((s) =>
  61. {
  62. var tracker = new StartTracker(s);
  63. StartOperationUDTTest.Run(s).Wait();
  64. Assert.Equal(1, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.StartOperationUDTTest"));
  65. var allVariantsBody = 3;
  66. var allVariantsAdjoint = 2;
  67. var allVariantsCtrl = 2;
  68. var allVariantsAdjointCtrl = 1;
  69. var allVariants = allVariantsBody + allVariantsAdjoint + allVariantsCtrl + allVariantsAdjointCtrl;
  70. Assert.Equal(allVariants, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants"));
  71. Assert.Equal(allVariantsBody, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants", OperationFunctor.Body));
  72. Assert.Equal(allVariantsAdjoint, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants", OperationFunctor.Adjoint));
  73. Assert.Equal(allVariantsCtrl, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants", OperationFunctor.Controlled));
  74. Assert.Equal(allVariantsAdjointCtrl, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.AllVariants", OperationFunctor.ControlledAdjoint));
  75. var basicBody = 12;
  76. var basicAdjoint = 7;
  77. var basicCtrl = 9;
  78. var basicCtrlAdjoint = 7;
  79. var basic = basicBody + basicAdjoint + basicCtrl + basicCtrlAdjoint;
  80. Assert.Equal(basic, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic"));
  81. Assert.Equal(basicBody, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Body));
  82. Assert.Equal(basicAdjoint, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Adjoint));
  83. Assert.Equal(basicCtrl, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.Controlled));
  84. Assert.Equal(basicCtrlAdjoint, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.Basic", OperationFunctor.ControlledAdjoint));
  85. // Because of unwrapping, udts are not called directly, only their base operation:
  86. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT1"));
  87. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT1", OperationFunctor.Body));
  88. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT1", OperationFunctor.Adjoint));
  89. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT1", OperationFunctor.Controlled));
  90. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT1", OperationFunctor.ControlledAdjoint));
  91. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT2"));
  92. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT2", OperationFunctor.Body));
  93. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT2", OperationFunctor.Adjoint));
  94. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT2", OperationFunctor.Controlled));
  95. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT2", OperationFunctor.ControlledAdjoint));
  96. Assert.Equal(basic * 4 + 2, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X"));
  97. Assert.Equal(basicBody * 4 + 2, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X", OperationFunctor.Body));
  98. Assert.Equal(basicAdjoint * 4, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X", OperationFunctor.Adjoint));
  99. Assert.Equal(basicCtrl * 4, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X", OperationFunctor.Controlled));
  100. Assert.Equal(basicCtrlAdjoint * 4, tracker.GetNumberOfCalls("Microsoft.Quantum.Intrinsic.X", OperationFunctor.ControlledAdjoint));
  101. var b3Body = 8;
  102. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT3"));
  103. Assert.Equal(0, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.UDT3", OperationFunctor.Body));
  104. Assert.Equal(b3Body, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.B3"));
  105. Assert.Equal(b3Body, tracker.GetNumberOfCalls("Microsoft.Quantum.Tests.StartOperation.B3", OperationFunctor.Body)); ;
  106. });
  107. }
  108. [Fact]
  109. public void StartDataIn()
  110. {
  111. Helper. RunWithMultipleSimulators((s) =>
  112. {
  113. var basic = s.Get<Basic>();
  114. var q1 = new FreeQubit(1);
  115. var q2 = new FreeQubit(2);
  116. var q3 = new FreeQubit(3);
  117. var expected = (1L, q1, (q2, q3), Result.One);
  118. var m1 = new Func<(Qubit, Qubit), (Int64, Qubit, (Qubit, Qubit), Result)>((_arg1) => (1L, q1, (_arg1.Item1, _arg1.Item2), Result.One));
  119. var m2 = new Func<Qubit, (Qubit, Qubit)>((_arg2) => (_arg2, q3));
  120. var p1 = basic.Partial(m1);
  121. var p2 = p1.Partial(m2);
  122. AssertTuple(expected, p1.__DataIn__((q2, q3)).Value);
  123. AssertTuple(expected, p2.__DataIn__((q2)).Value);
  124. Assert.Equal(new Qubit[] { q1, q2, q3 }, p1.__DataIn__((q2, q3)).Qubits);
  125. Assert.Equal(new Qubit[] { q1, q2, q3 }, p2.__DataIn__(q2).Qubits);
  126. Assert.Null(((IApplyData)basic).Qubits);
  127. Assert.Equal(new Qubit[] { q1, null, null }, ((IApplyData)p1).Qubits);
  128. Assert.Equal(new Qubit[] { q1, null, q3 }, ((IApplyData)p2).Qubits);
  129. });
  130. }
  131. [Fact]
  132. public void StartUDTDataIn()
  133. {
  134. Helper.RunWithMultipleSimulators((s) =>
  135. {
  136. var basic = new UDT1(s.Get<Basic>());
  137. var q1 = new FreeQubit(1);
  138. var q2 = new FreeQubit(2);
  139. var q3 = new FreeQubit(3);
  140. var expected = (1L, q1, (q2, q3), Result.One);
  141. var m1 = new Func<(Qubit, Qubit), (Int64, Qubit, (Qubit, Qubit), Result)>((_arg1) => (1L, q1, (_arg1.Item1, _arg1.Item2), Result.One));
  142. var m2 = new Func<Qubit, (Qubit, Qubit)>((_arg2) => (_arg2, q3));
  143. var p1 = ((Basic)basic.Data).Partial(m1);
  144. var p2 = p1.Partial(m2);
  145. AssertTuple(expected, p1.__DataIn__((q2, q3)).Value);
  146. AssertTuple(expected, p2.__DataIn__((q2)).Value);
  147. Assert.Equal(new Qubit[] { q1, q2, q3 }, p1.__DataIn__((q2, q3)).Qubits);
  148. Assert.Equal(new Qubit[] { q1, q2, q3 }, p2.__DataIn__(q2).Qubits);
  149. Assert.Null(((IApplyData)basic).Qubits);
  150. Assert.Equal(new Qubit[] { q1, null, null }, ((IApplyData)p1).Qubits);
  151. Assert.Equal(new Qubit[] { q1, null, q3 }, ((IApplyData)p2).Qubits);
  152. });
  153. }
  154. private static void AssertTuple(object expected, object actual)
  155. {
  156. var value = PartialMapper.CastTuple(expected.GetType(), actual);
  157. Assert.Equal(expected, value);
  158. }
  159. }
  160. }