Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions Simulation.sln
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Library2", "src\Simulation\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "src\Simulation\Simulators.Tests\TestProjects\UnitTests\UnitTests.csproj", "{46278108-D247-4EFC-AC34-23D4A676F62F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Quantum.QSharp.Base", "src\Simulation\QsharpBase\Microsoft.Quantum.QSharp.Base.csproj", "{E9E387C0-2881-4F0C-8433-064BB18DB742}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DecompositionsCore", "DecompositionsCore", "{4DF4699D-5A50-4B3F-8232-5B19CAE23950}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Quantum.Decompositions.Type2.Core", "src\Simulation\DecompositionsCore\Type2\Microsoft.Quantum.Decompositions.Core.Type2.csproj", "{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DecompositionsCore.Test", "DecompositionsCore.Test", "{2593CE5E-AFD0-4AF0-B816-0E263201E726}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Type2DecompositionsTests", "src\Simulation\DecompositionsCore.Test\Type2\Type2DecompositionsTests.csproj", "{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -389,6 +399,54 @@ Global
{46278108-D247-4EFC-AC34-23D4A676F62F}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{46278108-D247-4EFC-AC34-23D4A676F62F}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{46278108-D247-4EFC-AC34-23D4A676F62F}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.Debug|x64.ActiveCfg = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.Debug|x64.Build.0 = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.Release|Any CPU.Build.0 = Release|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.Release|x64.ActiveCfg = Release|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.Release|x64.Build.0 = Release|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{E9E387C0-2881-4F0C-8433-064BB18DB742}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.Debug|x64.ActiveCfg = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.Debug|x64.Build.0 = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.Release|Any CPU.Build.0 = Release|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.Release|x64.ActiveCfg = Release|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.Release|x64.Build.0 = Release|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.Debug|x64.ActiveCfg = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.Debug|x64.Build.0 = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.Release|Any CPU.Build.0 = Release|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.Release|x64.ActiveCfg = Release|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.Release|x64.Build.0 = Release|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -416,6 +474,12 @@ Global
{7256B986-6705-42FC-9F57-485D72D9DE51} = {09C842CB-930C-4C7D-AD5F-E30DE4A55820}
{A85277B3-4E07-4E15-8F0C-07CC855A3BCB} = {09C842CB-930C-4C7D-AD5F-E30DE4A55820}
{46278108-D247-4EFC-AC34-23D4A676F62F} = {09C842CB-930C-4C7D-AD5F-E30DE4A55820}
{34D419E9-CCF1-4E48-9FA4-3AD4B86BEEB4} = {99E234BC-997E-4E63-9F5C-3C3977543404}
{E9E387C0-2881-4F0C-8433-064BB18DB742} = {34D419E9-CCF1-4E48-9FA4-3AD4B86BEEB4}
{4DF4699D-5A50-4B3F-8232-5B19CAE23950} = {34D419E9-CCF1-4E48-9FA4-3AD4B86BEEB4}
{C548F9AA-DD12-4C39-BC75-8458CBCDB1D5} = {4DF4699D-5A50-4B3F-8232-5B19CAE23950}
{2593CE5E-AFD0-4AF0-B816-0E263201E726} = {34D419E9-CCF1-4E48-9FA4-3AD4B86BEEB4}
{05C78D61-BAB4-459D-8E7E-72071BFC5FBB} = {2593CE5E-AFD0-4AF0-B816-0E263201E726}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {929C0464-86D8-4F70-8835-0A5EAF930821}
Expand Down
2 changes: 2 additions & 0 deletions build/pack.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,9 @@ Write-Host "##[info]Using nuget to create packages"
Pack-Dotnet '../src/Azure/Azure.Quantum.Client/Microsoft.Azure.Quantum.Client.csproj'
Pack-One '../src/Simulation/CsharpGeneration/Microsoft.Quantum.CsharpGeneration.fsproj' '-IncludeReferencedProjects'
Pack-Dotnet '../src/Simulation/Core/Microsoft.Quantum.Runtime.Core.csproj'
Pack-Dotnet '../src/Simulation/QsharpBase/Microsoft.Quantum.QSharp.Base.csproj'
Pack-Dotnet '../src/Simulation/QsharpCore/Microsoft.Quantum.QSharp.Core.csproj'
Pack-Dotnet '../src/Simulation/DecompositionsCore/Type2/Microsoft.Quantum.Decompositions.Core.Type2.csproj'
Pack-One '../src/Simulation/Simulators/Microsoft.Quantum.Simulators.nuspec'
Pack-One '../src/Quantum.Development.Kit/Microsoft.Quantum.Development.Kit.nuspec'
Pack-One '../src/Xunit/Microsoft.Quantum.Xunit.csproj'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<Project Sdk="Microsoft.Quantum.Sdk/0.11.2006.602-beta">

<Import Project="..\..\Common\AssemblyCommon.props" />

<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
<IsPackable>false</IsPackable>
<IncludeQsharpCorePackages>false</IncludeQsharpCorePackages>
<CsharpGeneration>false</CsharpGeneration>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\DecompositionsCore\Utilities\Microsoft.Quantum.Decompositions.Utilities.csproj" />
<ProjectReference Include="..\..\CsharpGeneration\Microsoft.Quantum.CsharpGeneration.fsproj" IsQscReference="true" />
<ProjectReference Include="..\..\QsharpCore\Microsoft.Quantum.QSharp.Core.csproj" />
</ItemGroup>

<Target Name="BeforeCsharpCompile">
<ItemGroup>
<Compile Include="$(GeneratedFilesOutputPath)**/*.g.cs" Exclude="@(Compile)" AutoGen="true" />
</ItemGroup>
</Target>

</Project>
153 changes: 153 additions & 0 deletions src/Simulation/DecompositionsCore.Test/Common/IntrinsicExecute.qs
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
// Methods in this file implement executing multiple variants of a given operator
// to exercise its decompositions in all of those cases. For testing convenience
// similar operators are grouped into a few batches.
namespace IntrinsicTesting {

open Microsoft.Quantum.Decompositions.Utilities as Utils;
open Microsoft.Quantum.Diagnostics;

//=========================================================================
// Groups of operators that can be tested together
//=========================================================================
operation ExecuteBasicInstrinsics(intrinsics : UnitaryQSharpIntrinsics) : Unit {
let eq = ExecuteWithAdjointAndControlledQ;
eq(intrinsics::X);
eq(intrinsics::Y);
eq(intrinsics::Z);
eq(intrinsics::H);
eq(intrinsics::S);
eq(intrinsics::T);
}

operation ExecuteSWAPandCNOT(intrinsics : UnitaryQSharpIntrinsics) : Unit {
let eq = ExecuteWithAdjointAndControlledQQ;
eq(intrinsics::CNOT);
eq(intrinsics::SWAP);
}

operation ExecuteRotations(intrinsics : UnitaryQSharpIntrinsics) : Unit {
let eq = ExecuteWithAdjointAndControlledDQ;
eq(intrinsics::Rx);
eq(intrinsics::Ry);
eq(intrinsics::Rz);
eq(intrinsics::R1);
}

operation ExecuteCCNOT(intrinsics : UnitaryQSharpIntrinsics) : Unit {
ExecuteWithAdjointAndControlledQQQ(intrinsics::CCNOT);
}

operation ExecuteR(intrinsics : UnitaryQSharpIntrinsics) : Unit {
ExecuteWithAdjointAndControlledPDQ(intrinsics::R);
}

operation ExecuteR1Frac(intrinsics : UnitaryQSharpIntrinsics) : Unit {
ExecuteWithAdjointAndControlledIIQ(intrinsics::R1Frac);
}

operation ExecuteRFrac(intrinsics : UnitaryQSharpIntrinsics) : Unit {
ExecuteWithAdjointAndControlledPIIQ(intrinsics::RFrac);
}

operation ExecuteExp(intrinsics : UnitaryQSharpIntrinsics) : Unit {
ExecuteWithAdjointAndControlledPADQA(intrinsics::Exp);
}

operation ExecuteExpFrac(intrinsics : UnitaryQSharpIntrinsics) : Unit {
ExecuteWithAdjointAndControlledPAIIQA(intrinsics::ExpFrac);
}

//=========================================================================
// Helpers for executing adjoint and controlled variants of an operator.
//=========================================================================
operation ExecuteOnQubitArray(nQubits : Int, op : (Qubit[] => Unit is Adj)) : Unit {
using( qubits = Qubit[nQubits] ) {
op(qubits);
Adjoint op(qubits);
}
}

operation ExecuteWithAdjointAndControlled<'TupleT>(op : ('TupleT => Unit is Adj + Ctl), tupleMapper : (Qubit[] -> (Qubit[], 'TupleT)), tupleSize : Int) : Unit {
let op_composed = ApplyComposedA(Controlled op, tupleMapper, _);
Microsoft.Quantum.Intrinsic.Message($"Executing {op}");

for (numQubits in tupleSize .. MaxControls() + tupleSize) {
Microsoft.Quantum.Intrinsic.Message($"Total number of qubits: {numQubits}");
for (repetition in 1 .. NumberOfTestRepetitions()) {
ExecuteOnQubitArray(numQubits, op_composed);
}
}
}

operation ExecuteWithAdjointAndControlledQ(op : (Qubit => Unit is Adj + Ctl)) : Unit {
ExecuteWithAdjointAndControlled(op, ArrayAsTupleAO<Qubit>, 1);
}

operation ExecuteWithAdjointAndControlledAQ(numQubits : Int, op : (Qubit[] => Unit is Adj + Ctl)) : Unit {
ExecuteWithAdjointAndControlled(op, ArrayAsTupleAA<Qubit>(numQubits,_), numQubits);
}

operation _ExecuteWithAdjointAndControlledAPQ(paulis : Pauli[], op : ((Pauli[],Qubit[]) => Unit is Adj + Ctl)) : Unit {
Microsoft.Quantum.Intrinsic.Message($"Checking for Pauli: {paulis}.");
ExecuteWithAdjointAndControlledAQ(Length(paulis), op(paulis,_));
}

operation ExecuteWithAdjointAndControlledAPQ(op : ((Pauli[],Qubit[]) => Unit is Adj + Ctl)) : Unit {
for (numQubits in 1 .. MaxTargets()) {
Microsoft.Quantum.Intrinsic.Message($"Checking with {numQubits} qubits.");
IterateThroughCartesianPowerP(numQubits, PaulisToTest(), _ExecuteWithAdjointAndControlledAPQ(_, op));
}
}

operation ExecuteWithAdjointAndControlledPADQA(op : ((Pauli[],Double,Qubit[]) => Unit is Adj + Ctl)) : Unit {
for (angle in AnglesToTest()) {
Microsoft.Quantum.Intrinsic.Message($"Checking angle {angle}");
ExecuteWithAdjointAndControlledAPQ(op(_,angle,_));
}
}

operation ExecuteWithAdjointAndControlledPAIIQA(op : ((Pauli[],Int,Int,Qubit[]) => Unit is Adj + Ctl)) : Unit {
for (fraction in FractionsToTest()) {
Microsoft.Quantum.Intrinsic.Message($"Checking fraction {fraction}");
let (numerator, denominatorPower) = fraction;
ExecuteWithAdjointAndControlledAPQ(op(_,numerator,denominatorPower,_));
}
}

operation ExecuteWithAdjointAndControlledDQ(op : ((Double, Qubit) => Unit is Adj + Ctl)) : Unit {
for (angle in AnglesToTest()) {
Microsoft.Quantum.Intrinsic.Message($"Checking angle {angle}");
ExecuteWithAdjointAndControlledQ(op(angle,_));
}
}

operation ExecuteWithAdjointAndControlledPDQ(op : ((Pauli, Double, Qubit) => Unit is Adj + Ctl)) : Unit {
for (pauli in PaulisToTest()) {
Microsoft.Quantum.Intrinsic.Message($"Checking Pauli: {pauli}");
ExecuteWithAdjointAndControlledDQ(op(pauli, _,_));
}
}

operation ExecuteWithAdjointAndControlledIIQ(op : ((Int, Int, Qubit) => Unit is Adj + Ctl)) : Unit {
for (fraction in FractionsToTest()) {
Microsoft.Quantum.Intrinsic.Message($"Checking fraction {fraction}");
let (numerator, denominatorPower) = fraction;
ExecuteWithAdjointAndControlledQ(op(numerator,denominatorPower,_));
}
}

operation ExecuteWithAdjointAndControlledPIIQ(op : ((Pauli, Int, Int, Qubit) => Unit is Adj + Ctl)) : Unit {
for (pauli in PaulisToTest()) {
Microsoft.Quantum.Intrinsic.Message($"Checking Pauli: {pauli}");
ExecuteWithAdjointAndControlledIIQ(op(pauli, _,_,_));
}
}

operation ExecuteWithAdjointAndControlledQQ(op : ((Qubit,Qubit) => Unit is Adj + Ctl)) : Unit {
ExecuteWithAdjointAndControlled(op, ArrayAsTupleAIOO<Qubit>, 2);
}

operation ExecuteWithAdjointAndControlledQQQ(op : ((Qubit,Qubit,Qubit) => Unit is Adj + Ctl)) : Unit {
ExecuteWithAdjointAndControlled(op, ArrayAsTupleAIOOO<Qubit>, 3);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
namespace IntrinsicTesting {
function MaxControls() : Int {
return 3;
}

function MaxTargets() : Int {
return 3;
}

function NumberOfTestRepetitions() : Int {
return 1;
}

function AnglesToTest() : Double[] {
let pi = Microsoft.Quantum.Math.PI();
return [
0.0,
pi/8.0,
pi/4.0,
pi/2.0,
3.0 * pi/4.0,
pi,
5.0 * pi/4.0,
3.0 * pi/2.0,
2.0 * pi,
3.0 * pi,
4.0 * pi,
0.1984 ];
}

function FractionsToTest() : (Int,Int)[] {
return [
(0,-1),
(1,1),
(-1,1),
(1,2),
(3,2),
(-3,2),
(-1,2),
(1,3),
(-1,3),
(3,4),
(-1,4),
//(1, 9223372036854775807),
(1, 13)
//(1, -13)
];
}
}
Loading