Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Muted COMException when creating MCX gate on WINDOWS 11 #9

Merged
merged 2 commits into from
Jun 23, 2024
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
249 changes: 128 additions & 121 deletions QuIDE/CodeHelpers/CodeGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#region


using QuIDE.QuantumModel;
using QuIDE.QuantumModel.Gates;
using QuIDE.QuantumParser;
Expand All @@ -10,8 +9,6 @@
using System.Numerics;
using System.Text;

#endregion

namespace QuIDE.CodeHelpers;

public class CodeGenerator
Expand All @@ -25,8 +22,8 @@ private string GenerateCompositeExtensions(ComputerModel model, Dictionary<strin

var builder = new StringBuilder();

builder.AppendLine("\tpublic static class CompositeExtension");
builder.AppendLine("\t{");
builder.AppendLine("public static class CompositeExtension");
builder.AppendLine("{");

if (methods != null)
foreach (var list in methods.Values)
Expand All @@ -39,12 +36,12 @@ private string GenerateCompositeExtensions(ComputerModel model, Dictionary<strin

const string regName = "regA";

builder.Append("\t\tpublic static void ").Append(pair.Key);
builder.Append("\tpublic static void ").Append(pair.Key);
builder.Append("(this QuantumComputer comp, Register ");
builder.Append(regName).AppendLine(")");
builder.AppendLine("\t\t{");
builder.AppendLine("\t{");

const string indent = "\t\t\t";
const string indent = "\t\t";

var column = 0;
foreach (var gate in pair.Value)
Expand All @@ -55,11 +52,11 @@ private string GenerateCompositeExtensions(ComputerModel model, Dictionary<strin
column++;
}

builder.AppendLine("\t\t}");
builder.AppendLine("\t}");
builder.AppendLine();
}

builder.AppendLine("\t}");
builder.AppendLine("}");
return builder.ToString();
}

Expand Down Expand Up @@ -163,6 +160,14 @@ private static string GenerateStatesDefinition(string varName, IDictionary<ulong
return builder.ToString();
}

/// <summary>
/// Executed once for every step.
/// </summary>
/// <param name="model"></param>
/// <param name="step">gates in step</param>
/// <param name="column">step idx</param>
/// <param name="indent"></param>
/// <returns></returns>
private string GenerateStepCode(ComputerModel model, StepModel step, int column, string indent)
{
var builder = new StringBuilder();
Expand All @@ -180,77 +185,9 @@ private string GenerateStepCode(ComputerModel model, StepModel step, int column,

return builder.ToString();
}

private string GenerateGateCode(ComputerModel model, Gate gate, int column, string indent,
string defaultRegName = null)
{
string AppendControlTarget(string begin, Gate g)
{
if (g.Control.HasValue)
{
var namedC = "control: ";
var namedT = "target: ";
if (g.Name != GateName.CNot)
{
namedC = "";
namedT = "";
}

if (g.Control.Value.Register == g.Target.Register)
return
$"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{namedT}{g.Target.Offset}, {namedC}{g.Control.Value.Offset});";
return
$"comp.{begin}{namedT}{GetRegName(g.Target.Register, defaultRegName)}[{g.Target.Offset}], {namedC}{GetRegName(g.Control.Value.Register, defaultRegName)}[{g.Control.Value.Offset}]);";
}

return $"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{g.Target.Offset});";
}

string AppendMoreControls(string begin, string beginComment, Gate g, RegisterRefModel[] controls)
{
if (controls.All(x => x.Register == g.Target.Register) &&
(g.Control == null || g.Control.Value.Register == g.Target.Register))
{
var format = new StringBuilder(GetRegName(g.Target.Register, defaultRegName)).Append('.')
.Append(begin);
format.Append(g.Target.Offset);

if (g.Control.HasValue) format.Append(", ").Append(g.Control.Value.Offset);

for (var i = 0; i < controls.Length; i++) format.Append(", ").Append(controls[i].Offset);

format.Append(");");
format.Append("\t\t// ").Append(beginComment).Append("<target_bit>, ... <control_bits> ...)");
return format.ToString();
}
else
{
var format = new StringBuilder("comp.").Append(begin);
format.Append(GetRegName(g.Target.Register, defaultRegName))
.Append('[')
.Append(g.Target.Offset)
.Append(']');

if (g.Control.HasValue)
format.Append(", ")
.Append(GetRegName(g.Control.Value.Register, defaultRegName))
.Append('[')
.Append(g.Control.Value.Offset)
.Append(']');

foreach (var rrm in controls)
format.Append(", ")
.Append(GetRegName(rrm.Register, defaultRegName))
.Append('[')
.Append(rrm.Offset)
.Append(']');

format.Append(");");
format.Append("\t\t// ").Append(beginComment).Append("<target_bit>, ... <control_bits> ...)");
return format.ToString();
}
}

switch (gate.Name)
{
case GateName.Hadamard:
Expand Down Expand Up @@ -341,26 +278,26 @@ string AppendMoreControls(string begin, string beginComment, Gate g, RegisterRef
}
}

{
var builder = new StringBuilder();
var i = m.Begin;
while (i <= m.End)
{
var builder = new StringBuilder();
var i = m.Begin;
while (i <= m.End)
var regRef = model.GetRefFromOffset(i);
if (i + regRef.Register.Qubits.Count < m.End + 2)
{
var regRef = model.GetRefFromOffset(i);
if (i + regRef.Register.Qubits.Count < m.End + 2)
{
builder.Append($"{regRef.Register.Name}.Measure();\n");
i += regRef.Register.Qubits.Count;
}
else
{
builder.Append($"{regRef.Register.Name}.Measure({regRef.Offset});\n");
i++;
}
builder.Append($"{regRef.Register.Name}.Measure();\n");
i += regRef.Register.Qubits.Count;
}
else
{
builder.Append($"{regRef.Register.Name}.Measure({regRef.Offset});\n");
i++;
}

return builder.ToString();
}

return builder.ToString();
}
case GateName.Unitary:
var u = gate as UnitaryGate;
var uMatrixName = "unitary_" + column + "_" + u.Target.OffsetToRoot;
Expand All @@ -375,9 +312,76 @@ string AppendMoreControls(string begin, string beginComment, Gate g, RegisterRef
default:
return string.Empty;
}

string AppendControlTarget(string begin, Gate g)
{
if (g.Control.HasValue)
{
var namedC = "control: ";
var namedT = "target: ";
if (g.Name == GateName.CNot)
return g.Control.Value.Register == g.Target.Register
? $"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{namedT}{g.Target.Offset}, {namedC}{g.Control.Value.Offset});"
: $"comp.{begin}{namedT}{GetRegName(g.Target.Register, defaultRegName)}[{g.Target.Offset}], {namedC}{GetRegName(g.Control.Value.Register, defaultRegName)}[{g.Control.Value.Offset}]);";
namedC = "";
namedT = "";

return g.Control.Value.Register == g.Target.Register
? $"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{namedT}{g.Target.Offset}, {namedC}{g.Control.Value.Offset});"
: $"comp.{begin}{namedT}{GetRegName(g.Target.Register, defaultRegName)}[{g.Target.Offset}], {namedC}{GetRegName(g.Control.Value.Register, defaultRegName)}[{g.Control.Value.Offset}]);";
}

return $"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{g.Target.Offset});";
}

string AppendMoreControls(string begin, string beginComment, Gate g, RegisterRefModel[] controls)
{
if (controls.All(x => x.Register == g.Target.Register) &&
(g.Control == null || g.Control.Value.Register == g.Target.Register))
{
var format = new StringBuilder(GetRegName(g.Target.Register, defaultRegName)).Append('.')
.Append(begin);
format.Append(g.Target.Offset);

if (g.Control.HasValue) format.Append(", ").Append(g.Control.Value.Offset);

foreach (var control in controls)
format.Append(", ").Append(control.Offset);

format.Append(");");
format.Append("\t\t// ").Append(beginComment).Append("<target_bit>, ... <control_bits> ...)");
return format.ToString();
}
else
{
var format = new StringBuilder("comp.").Append(begin);
format.Append(GetRegName(g.Target.Register, defaultRegName))
.Append('[')
.Append(g.Target.Offset)
.Append(']');

if (g.Control.HasValue)
format.Append(", ")
.Append(GetRegName(g.Control.Value.Register, defaultRegName))
.Append('[')
.Append(g.Control.Value.Offset)
.Append(']');

foreach (var rrm in controls)
format.Append(", ")
.Append(GetRegName(rrm.Register, defaultRegName))
.Append('[')
.Append(rrm.Offset)
.Append(']');

format.Append(");");
format.Append("\t\t// ").Append(beginComment).Append("<target_bit>, ... <control_bits> ...)");
return format.ToString();
}
}
}

private string GenerateMatrixDefinition(string varName, Complex[,] matrix, string indent)
private static string GenerateMatrixDefinition(string varName, Complex[,] matrix, string indent)
{
var builder = new StringBuilder();

Expand All @@ -402,31 +406,6 @@ private string GenerateMatrixDefinition(string varName, Complex[,] matrix, strin

private string GenerateParametricGateCode(ParametricGate cg, string defaultRegName = null)
{
string AppendPar(object x)
{
var builder = new StringBuilder();

if (x is RegisterPartModel rm)
{
builder.Append(GetRegName(rm.Register, defaultRegName));
if (rm.Register == null || rm.Width != rm.Register.Qubits.Count)
{
builder.Append('[').Append(rm.Offset).Append(", ");
builder.Append(rm.Width).Append(']');
}
}
else if (x is RegisterRefModel rrm)
{
builder.Append(GetRegName(rrm.Register, defaultRegName)).Append('[').Append(rrm.Offset).Append(']');
}
else
{
builder.Append(x);
}

return builder.ToString();
}

var sb = new StringBuilder("comp.").Append(cg.FunctionName).Append('(');

var infos = cg.Method.GetParameters();
Expand Down Expand Up @@ -454,6 +433,34 @@ string AppendPar(object x)
sb.Append(");");

return sb.ToString();

string AppendPar(object x)
{
var builder = new StringBuilder();

switch (x)
{
case RegisterPartModel rm:
{
builder.Append(GetRegName(rm.Register, defaultRegName));
if (rm.Register == null || rm.Width != rm.Register.Qubits.Count)
{
builder.Append('[').Append(rm.Offset).Append(", ");
builder.Append(rm.Width).Append(']');
}

break;
}
case RegisterRefModel rrm:
builder.Append(GetRegName(rrm.Register, defaultRegName)).Append('[').Append(rrm.Offset).Append(']');
break;
default:
builder.Append(x);
break;
}

return builder.ToString();
}
}

private string GenerateCompositeGateCode(CompositeGate cg, string defaultRegName = null)
Expand Down
16 changes: 8 additions & 8 deletions QuIDE/QuIDE.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,20 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Avalonia" Version="11.0.9" />
<PackageReference Include="Avalonia" Version="11.0.10" />
<PackageReference Include="Avalonia.AvaloniaEdit" Version="11.0.6" />
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.0.9" />
<PackageReference Include="Avalonia.Desktop" Version="11.0.9" />
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.0.10" />
<PackageReference Include="Avalonia.Desktop" Version="11.0.10" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.9" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.9" />
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.10" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.10" />
<PackageReference Include="AvaloniaEdit.TextMate" Version="11.0.6" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
<PackageReference Include="DotNet.Bundle" Version="0.9.13" />
<PackageReference Include="MessageBox.Avalonia" Version="3.1.5.1" />
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.8.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.8.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.10.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.10.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.10.0" />
</ItemGroup>

<ItemGroup>
Expand Down
13 changes: 12 additions & 1 deletion QuIDE/Views/Controls/CircuitGrid.axaml.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#region

using System;
using System.Runtime.InteropServices;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Shapes;
using Avalonia.Input;
using Avalonia.Media;
using QuIDE.CodeHelpers;
using QuIDE.QuantumModel;
using QuIDE.ViewModels;
using QuIDE.ViewModels.Controls;
Expand Down Expand Up @@ -93,7 +95,16 @@ private void GateButton_MouseDown(object sender, PointerPressedEventArgs e)
var dragData = new DataObject();
dragData.Set(typeof(Tuple<int, RegisterRefModel>).ToString(), data);

DragDrop.DoDragDrop(e, dragData, DragDropEffects.Link);
try
{
DragDrop.DoDragDrop(e, dragData,DragDropEffects.Link);
}
catch (COMException exception)
{
var msg = exception.Message;
Console.WriteLine(exception);
// SimpleDialogHandler.ShowSimpleMessage(msg);
}
}

private void ctrlPoint_Drop(object sender, PointerEventArgs pointerEventArgs)
Expand Down