Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.
Merged
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
60 changes: 60 additions & 0 deletions Simulation.sln
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StandaloneInputReference",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "qir-standalone-input-reference", "src\Qir\Samples\StandaloneInputReference\qsharp\qir-standalone-input-reference.csproj", "{D7D34736-A719-4B45-A33F-2723F59EC29D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Simulation", "Simulation", "{3CD26906-C7F3-47B8-AF43-FF6BCF1CB3EF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoSubstitution", "src\Simulation\AutoSubstitution\AutoSubstitution.csproj", "{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.AutoSubstitution", "src\Simulation\AutoSubstitution.Tests\Tests.AutoSubstitution.csproj", "{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.AutoSubstitution.Integration", "src\Simulation\AutoSubstitution.Integration.Tests\Tests.AutoSubstitution.Integration.csproj", "{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -749,6 +757,54 @@ Global
{D7D34736-A719-4B45-A33F-2723F59EC29D}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
{D7D34736-A719-4B45-A33F-2723F59EC29D}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{D7D34736-A719-4B45-A33F-2723F59EC29D}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.Debug|x64.ActiveCfg = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.Debug|x64.Build.0 = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.Release|Any CPU.Build.0 = Release|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.Release|x64.ActiveCfg = Release|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.Release|x64.Build.0 = Release|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.Debug|x64.ActiveCfg = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.Debug|x64.Build.0 = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.Release|Any CPU.Build.0 = Release|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.Release|x64.ActiveCfg = Release|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.Release|x64.Build.0 = Release|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.Debug|x64.ActiveCfg = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.Debug|x64.Build.0 = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.Release|Any CPU.Build.0 = Release|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.Release|x64.ActiveCfg = Release|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.Release|x64.Build.0 = Release|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -802,6 +858,10 @@ Global
{AAFB81D3-BC87-404D-BA64-AF40B2D2E45A} = {F6C2D4C0-12DC-40E3-9C86-FA5308D9B567}
{A7DB7367-9FD6-4164-8263-A05077BE54AB} = {AAFB81D3-BC87-404D-BA64-AF40B2D2E45A}
{D7D34736-A719-4B45-A33F-2723F59EC29D} = {A7DB7367-9FD6-4164-8263-A05077BE54AB}
{3CD26906-C7F3-47B8-AF43-FF6BCF1CB3EF} = {020356B7-C3FC-4100-AE37-97E5D8288D1D}
{33D66E90-049F-4A0B-A2B1-79E7E7E0ED0F} = {3CD26906-C7F3-47B8-AF43-FF6BCF1CB3EF}
{4EBC65DF-3B5E-419B-8E26-3EEF0B5CD300} = {3CD26906-C7F3-47B8-AF43-FF6BCF1CB3EF}
{D23480EE-88FC-4DF2-86BD-1C5BDD6CD98C} = {3CD26906-C7F3-47B8-AF43-FF6BCF1CB3EF}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {929C0464-86D8-4F70-8835-0A5EAF930821}
Expand Down
2 changes: 2 additions & 0 deletions build/manifest.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ param(
$artifacts = @{
Packages = @(
"Microsoft.Azure.Quantum.Client",
"Microsoft.Quantum.AutoSubstitution",
"Microsoft.Quantum.CSharpGeneration",
"Microsoft.Quantum.Development.Kit",
"Microsoft.Quantum.EntryPointDriver",
Expand All @@ -35,6 +36,7 @@ $artifacts = @{

Assemblies = @(
".\src\Azure\Azure.Quantum.Client\bin\$Env:BUILD_CONFIGURATION\netstandard2.1\Microsoft.Azure.Quantum.Client.dll",
".\src\Simulation\AutoSubstitution\bin\$Env:BUILD_CONFIGURATION\netstandard2.1\Microsoft.Quantum.AutoSubstitution.dll",
".\src\Simulation\CSharpGeneration\bin\$Env:BUILD_CONFIGURATION\netstandard2.1\Microsoft.Quantum.CSharpGeneration.dll",
".\src\Simulation\CSharpGeneration.App\bin\$Env:BUILD_CONFIGURATION\netcoreapp3.1\Microsoft.Quantum.CSharpGeneration.App.dll",
".\src\Simulation\RoslynWrapper\bin\$Env:BUILD_CONFIGURATION\netstandard2.1\Microsoft.Quantum.RoslynWrapper.dll",
Expand Down
1 change: 1 addition & 0 deletions build/pack.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ function Pack-Dotnet() {
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-One '../src/Simulation/AutoSubstitution/AutoSubstitution.csproj' '-IncludeReferencedProjects'
Pack-Dotnet '../src/Simulation/EntryPointDriver/Microsoft.Quantum.EntryPointDriver.csproj'
Pack-Dotnet '../src/Simulation/Core/Microsoft.Quantum.Runtime.Core.csproj'
Pack-Dotnet '../src/Simulation/TargetDefinitions/Interfaces/Microsoft.Quantum.Targets.Interfaces.csproj'
Expand Down
18 changes: 18 additions & 0 deletions src/Simulation/AutoSubstitution.Integration.Tests/Integration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using Microsoft.Quantum.Simulation.Simulators;
using Xunit;

namespace Microsoft.Quantum.AutoSubstitution.Testing
{
public class CodeGenerationTests
{
[Fact]
public void CanSimulateWithAlternativeSimulator()
{
var sim = new ToffoliSimulator();
TestQuantumSwap.Run(sim).Wait();
}
}
}
32 changes: 32 additions & 0 deletions src/Simulation/AutoSubstitution.Integration.Tests/Integration.qs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

namespace Microsoft.Quantum.AutoSubstitution.Testing {
open Microsoft.Quantum.Diagnostics;
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Targeting;

@SubstitutableOnTarget("Microsoft.Quantum.Intrinsic.SWAP", "ToffoliSimulator")
operation QuantumSwap(a : Qubit, b : Qubit) : Unit {
within {
CNOT(a, b);
H(a);
H(b);
} apply {
CNOT(a, b);
}
}

operation TestQuantumSwap() : Unit {
use a = Qubit();
use b = Qubit();

X(a);

QuantumSwap(a, b);

EqualityFactR(MResetZ(a), Zero, "unexpected value for a after swap");
EqualityFactR(MResetZ(b), One, "unexpected value for b after swap");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.Quantum.Sdk">

<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.0" />
<PackageReference Include="xunit" Version="2.4.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\AutoSubstitution\AutoSubstitution.csproj" IsQscReference="true" />
</ItemGroup>
</Project>
90 changes: 90 additions & 0 deletions src/Simulation/AutoSubstitution.Tests/CodeGenerationTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using System;
using System.Collections.Immutable;
using System.IO;
using System.Linq;
using Microsoft.Quantum.QsCompiler.AutoSubstitution;
using Microsoft.Quantum.QsCompiler.CompilationBuilder;
using Microsoft.Quantum.QsCompiler.ReservedKeywords;
using Microsoft.Quantum.QsCompiler.SyntaxTree;
using Xunit;

namespace Microsoft.Quantum.AutoSubstitution.Testing
{
public class CodeGenerationTests
{
[Fact]
public void CanGenerateAutoSubstitutionCode()
{
TestOneSuccessfulFile("Success");
TestOneSuccessfulFile("SuccessA");
TestOneSuccessfulFile("SuccessC");
TestOneSuccessfulFile("SuccessCA");
}

[Fact]
public void CanFailForVariousReasons()
{
TestOneFailingFile("FailAlternativeDoesNotExist");
TestOneFailingFile("FailDifferentSignatures");
TestOneFailingFile("FailDifferentSpecializationKinds");
TestOneFailingFile("FailNoNamespace");
}

private void TestOneSuccessfulFile(string fileName)
{
var step = new RewriteStep();
var path = CreateNewTemporaryPath();
step.AssemblyConstants[AssemblyConstants.OutputPath] = path;

var compilation = CreateCompilation(Path.Combine("TestFiles", "Core.qs"), "Substitution.qs", Path.Combine("TestFiles", $"{fileName}.qs"));

Assert.True(step.Transformation(compilation, out var transformed));
var generatedFileName = Path.Combine(path, "__AutoSubstitution__.g.cs");
Assert.True(File.Exists(generatedFileName));

// uncomment this line, when creating new unit tests to
// create files with expected content
//File.Copy(generatedFileName, $"{fileName}.cs_", true);

Assert.Equal(File.ReadAllText(Path.Combine("TestFiles", $"{fileName}.cs_")).Replace("\r\n", "\n"), File.ReadAllText(generatedFileName).Replace("\r\n", "\n"));

Directory.Delete(path, true);
}

private void TestOneFailingFile(string fileName)
{
var step = new RewriteStep();
var path = CreateNewTemporaryPath();
step.AssemblyConstants[AssemblyConstants.OutputPath] = path;

var compilation = CreateCompilation(Path.Combine("TestFiles", "Core.qs"), "Substitution.qs", Path.Combine("TestFiles", $"{fileName}.qs"));

Assert.False(step.Transformation(compilation, out var transformed));
Assert.Equal(2, step.GeneratedDiagnostics.Count());
Assert.Equal(CodeAnalysis.DiagnosticSeverity.Error, step.GeneratedDiagnostics.Last().Severity);
}

private QsCompilation CreateCompilation(params string[] fileNames)
{
var mgr = new CompilationUnitManager();
var files = CreateFileManager(fileNames);
mgr.AddOrUpdateSourceFilesAsync(files).Wait();
return mgr.Build().BuiltCompilation;
}

private ImmutableHashSet<FileContentManager> CreateFileManager(params string[] fileNames) =>
CompilationUnitManager.InitializeFileManagers(
fileNames.Select(fileName => {
var fileId = new Uri(Path.GetFullPath(fileName));
return (id: fileId, content: File.ReadAllText(fileName));
}).ToDictionary(t => t.id, t => t.content)
);

private readonly System.Random random = new System.Random();
private string CreateNewTemporaryPath() =>
Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), $"substitution-test-{random.Next(Int32.MaxValue)}")).FullName;
}
}
5 changes: 5 additions & 0 deletions src/Simulation/AutoSubstitution.Tests/TestFiles/Core.qs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// This file is needed to ensure that the Microsoft.Quantum.Core namespace
// exists for the tests.

namespace Microsoft.Quantum.Core {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace AutoSubstitutionTests {
open Microsoft.Quantum.Targeting;

@SubstitutableOnTarget("Namespace.NotExisting", "ToffoliSimulator")
operation Fail() : Unit {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace AutoSubstitutionTests {
open Microsoft.Quantum.Targeting;

@SubstitutableOnTarget("AutoSubstitutionTests.FailClassical", "ToffoliSimulator")
operation Fail(a : Int) : Unit {}

operation FailClassical(a : Double) : Unit {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace AutoSubstitutionTests {
open Microsoft.Quantum.Targeting;

@SubstitutableOnTarget("FailClassical", "ToffoliSimulator")
operation Fail() : Unit is Adj {}

operation FailClassical() : Unit {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace AutoSubstitutionTests {
open Microsoft.Quantum.Targeting;

@SubstitutableOnTarget("FailClassical", "ToffoliSimulator")
operation Fail() : Unit {}

operation FailClassical() : Unit {}
}
49 changes: 49 additions & 0 deletions src/Simulation/AutoSubstitution.Tests/TestFiles/Success.cs_
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;
using Microsoft.Quantum.Simulation.Core;
using Microsoft.Quantum.Simulation.Simulators;

namespace AutoSubstitutionTests
{
public partial class Success
{
public class Native : Success
{
public Native(Microsoft.Quantum.Simulation.Core.IOperationFactory m): base(m)
{
sim0 = ((m) as ToffoliSimulator);
}

public override void __Init__()
{
base.__Init__();
if ((sim0) != (null))
{
alternative0 = (__Factory__.Get<AutoSubstitutionTests.SuccessClassical>(typeof(AutoSubstitutionTests.SuccessClassical)));
}
}

public override Func<QVoid, QVoid> __Body__
{
get
{
return args =>
{
if ((sim0) != (null))
{
return alternative0.__Body__(args);
}
else
{
return base.__Body__(args);
}
}

;
}
}

private AutoSubstitutionTests.SuccessClassical alternative0 = null;
private ToffoliSimulator sim0 = null;
}
}
}
8 changes: 8 additions & 0 deletions src/Simulation/AutoSubstitution.Tests/TestFiles/Success.qs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace AutoSubstitutionTests {
open Microsoft.Quantum.Targeting;

@SubstitutableOnTarget("AutoSubstitutionTests.SuccessClassical", "ToffoliSimulator")
operation Success() : Unit {}

operation SuccessClassical() : Unit {}
}
Loading