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
Show all changes
32 commits
Select commit Hold shift + click to select a range
9ea4108
QuantumExecutor interface.
avasch01 Oct 29, 2019
a981506
Classical control
avasch01 Nov 1, 2019
d464610
Cleanup
avasch01 Nov 1, 2019
4fecac7
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Nov 4, 2019
cc02fa7
Merge branch 'master' into alexva/QuantumExecutor
vadym-kl Nov 11, 2019
80cb835
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Nov 12, 2019
634910b
Fixed event regustration
avasch01 Nov 14, 2019
84344fd
Merge branch 'alexva/QuantumExecutor' of https://github.com/microsoft…
avasch01 Nov 14, 2019
26e17eb
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Nov 19, 2019
5c35385
Merge branch 'master' into alexva/QuantumExecutor
anpaz Nov 20, 2019
30ddacd
Merge branch 'master' into alexva/QuantumExecutor
anpaz Nov 20, 2019
9d2c99b
Addressed code reviews.
avasch01 Nov 23, 2019
ebeba91
Merge branch 'alexva/QuantumExecutor' of https://github.com/microsoft…
avasch01 Nov 23, 2019
7f6d97b
Fix
avasch01 Nov 23, 2019
a2e03d6
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Nov 23, 2019
87f3589
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Nov 24, 2019
e6e104f
CLassical control default for simulators
avasch01 Nov 25, 2019
e8b190c
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Nov 25, 2019
de61b8d
More documentation
avasch01 Nov 25, 2019
dfbf163
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Nov 26, 2019
93ad971
Merge branch 'master' into alexva/QuantumExecutor
anpaz Nov 27, 2019
64ac6a3
Merge branch 'master' into alexva/QuantumExecutor
anpaz Nov 27, 2019
b74314b
Documentation fixes
avasch01 Dec 6, 2019
81125b5
Merge branch 'alexva/QuantumExecutor' of https://github.com/microsoft…
avasch01 Dec 6, 2019
8caf3b1
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Dec 6, 2019
bb76bfe
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Dec 10, 2019
58f4c51
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Dec 12, 2019
bbe70c9
Clasical Control interface changed to avoid passing in pointers to fu…
avasch01 Dec 13, 2019
8fe7037
Merge branch 'alexva/QuantumExecutor' of https://github.com/microsoft…
avasch01 Dec 13, 2019
c91bad1
Cleanup
avasch01 Dec 13, 2019
8fa0d64
Small improvements
avasch01 Dec 13, 2019
d5d3adb
Merge branch 'master' into alexva/QuantumExecutor
avasch01 Dec 13, 2019
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
640 changes: 640 additions & 0 deletions src/Simulation/Common/IQuantumProcessor.cs

Large diffs are not rendered by default.

285 changes: 285 additions & 0 deletions src/Simulation/Common/QuantumProcessorBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,285 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using Microsoft.Quantum.Simulation.Core;
using System.Diagnostics;

namespace Microsoft.Quantum.Simulation.Common
{
/// <summary>
/// A class that implements IQuantumProcessor that does not do any logic, but is convenient to inherit from.
/// It throws <see cref="NotImplementedException"/> for most APIs.
/// </summary>
public class QuantumProcessorBase : IQuantumProcessor
{
public virtual void X(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledX(IQArray<Qubit> controls, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void Y(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledY(IQArray<Qubit> controls, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void Z(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledZ(IQArray<Qubit> controls, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void SWAP(Qubit qubit1, Qubit qubit2)
{
throw new NotImplementedException();
}

public virtual void ControlledSWAP(IQArray<Qubit> controls, Qubit qubit1, Qubit qubit2)
{
throw new NotImplementedException();
}

public virtual void H(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledH(IQArray<Qubit> controls, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void S(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledS(IQArray<Qubit> controls, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void SAdjoint(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledSAdjoint(IQArray<Qubit> controls, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void T(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledT(IQArray<Qubit> controls, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void TAdjoint(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledTAdjoint(IQArray<Qubit> controls, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void R(Pauli axis, double theta, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledR(IQArray<Qubit> controls, Pauli axis, double theta, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void RFrac(Pauli axis, long numerator, long power, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledRFrac(IQArray<Qubit> controls, Pauli axis, long numerator, long power, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void R1(double theta, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledR1(IQArray<Qubit> controls, double theta, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void R1Frac(long numerator, long power, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void ControlledR1Frac(IQArray<Qubit> controls, long numerator, long power, Qubit qubit)
{
throw new NotImplementedException();
}

public virtual void Exp(IQArray<Pauli> paulis, double theta, IQArray<Qubit> qubits)
{
throw new NotImplementedException();
}

public virtual void ControlledExp(IQArray<Qubit> controls, IQArray<Pauli> paulis, double theta, IQArray<Qubit> qubits)
{
throw new NotImplementedException();
}

public virtual void ExpFrac(IQArray<Pauli> paulis, long numerator, long power, IQArray<Qubit> qubits)
{
throw new NotImplementedException();
}

public virtual void ControlledExpFrac(IQArray<Qubit> controls, IQArray<Pauli> paulis, long numerator, long power, IQArray<Qubit> qubits)
{
throw new NotImplementedException();
}

public virtual Result M(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual Result Measure(IQArray<Pauli> bases, IQArray<Qubit> qubits)
{
throw new NotImplementedException();
}

public virtual void Reset(Qubit qubit)
{
throw new NotImplementedException();
}

public virtual long StartConditionalStatement(IQArray<Result> measurementResults, IQArray<Result> resultsValues)
{
Debug.Assert(measurementResults.Count == resultsValues.Count);

int equal = 1;

for (int i = 0; i < measurementResults.Count; i++)
{
if (measurementResults[i] != resultsValues[i])
{
equal = 0;
}
}

return equal;
}

public virtual long StartConditionalStatement(Result measurementResult, Result resultValue)
{

if (measurementResult == resultValue)
{
return 1;
}
else
{
return 0;
}
}

public virtual bool RunThenClause(long statement)
{
return (statement != 0);
}

public virtual bool RepeatThenClause(long statement)
{
return false;
}

public virtual bool RunElseClause(long statement)
{
return (statement == 0);
}

public virtual bool RepeatElseClause(long statement)
{
return false;
}

public virtual void EndConditionalStatement(long id)
{

}

public virtual void Assert(IQArray<Pauli> bases, IQArray<Qubit> qubits, Result result, string msg)
{
}

public virtual void AssertProb(IQArray<Pauli> bases, IQArray<Qubit> qubits, double probabilityOfZero, string msg, double tol)
{
}

public virtual void OnOperationStart(ICallable operation, IApplyData arguments)
{
}

public virtual void OnOperationEnd(ICallable operation, IApplyData arguments)
{
}

public virtual void OnFail(System.Runtime.ExceptionServices.ExceptionDispatchInfo exceptionDispatchInfo)
{
}

public virtual void OnAllocateQubits(IQArray<Qubit> qubits)
{
}

public virtual void OnReleaseQubits(IQArray<Qubit> qubits)
{
}

public virtual void OnBorrowQubits(IQArray<Qubit> qubits)
{
}

public virtual void OnReturnQubits(IQArray<Qubit> qubits)
{
}

public virtual void OnDumpMachine<T>(T location)
{
}

public virtual void OnDumpRegister<T>(T location, IQArray<Qubit> qubits)
{
}

public virtual void OnMessage(string msg)
{
}

}
}
67 changes: 67 additions & 0 deletions src/Simulation/Common/Utils.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using Microsoft.Quantum.Simulation.Core;
using System.Collections.Generic;
using System.Diagnostics;

namespace Microsoft.Quantum.Simulation.Common
{
public class CommonUtils
{
/// <summary>
/// Removes PauliI terms from observable and corresponding qubits from qubits.
/// Returns the observable description that is equivalent to the original one, but has no PauliI terms
/// </summary>
public static void PruneObservable(IQArray<Pauli> observable, IQArray<Qubit> qubits, out QArray<Pauli> prunedObservable, out QArray<Qubit> prunedQubits)
{
Debug.Assert(observable != null);
Debug.Assert(qubits != null);
Debug.Assert(observable.Length == qubits.Length);
prunedObservable = new QArray<Pauli>(PrunedSequence(observable, Pauli.PauliI, observable));
prunedQubits = new QArray<Qubit>(PrunedSequence(observable, Pauli.PauliI, qubits));
}

/// <summary>
/// Returns IEnumerable&lt;T&gt; that contains sub-sequence of <paramref name="sequenceToPrune"/>[i], such that <paramref name="sequence"/>[i] is not equal to <paramref name="value"/>.
/// </summary>
public static IEnumerable<T> PrunedSequence<U,T>(IQArray<U> sequence, U value, IQArray<T> sequenceToPrune )
{
for (uint i = 0; i < sequence.Length; ++i)
{
if (!sequence[i].Equals(value))
{
yield return sequenceToPrune[i];
}
}
}

/// <summary>
/// Converts numbers of the form <paramref name="numerator"/>/2^<paramref name="denominatorPower"/> into canonical form where <paramref name="numerator"/> is odd or zero.
/// If <paramref name="numerator"/> is zero, <paramref name="denominatorPower"/> must also be zero in the canonical form.
/// </summary>
public static (long, long) Reduce(long numerator, long denominatorPower)
{
if (numerator == 0)
{
return (0, 0);
}

if (numerator % 2 != 0)
{
return (numerator, denominatorPower);
}

long numNew = numerator;
long denomPowerNew = denominatorPower;

while (numNew % 2 == 0)
{
numNew /= 2;
denomPowerNew -= 1;
}

return (numNew, denomPowerNew);
}
}
}
6 changes: 4 additions & 2 deletions src/Simulation/Core/QArray.cs
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ IEnumerable<Qubit> IApplyData.Qubits
/// and ArgumentOutOfRangeException.
/// </summary>
/// <param name="index">The long index of the element to access</param>
/// <param name="value">New value of the element</param>
/// <returns>The element</returns>
public QArray<T> Modify(long index, T value)
{
Expand All @@ -351,7 +352,8 @@ public QArray<T> Modify(long index, T value)
/// or if an index is outside the array bounds, it throws
/// and ArgumentOutOfRangeException.
/// </summary>
/// <param name="index">The long index of the element to access</param>
/// <param name="indices">The range of indices of the elements to access</param>
/// <param name="values">New values of the elements</param>
/// <returns>The element</returns>
public QArray<T> Modify(QRange indices, IQArray<T> values)
{
Expand Down Expand Up @@ -566,7 +568,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
}

/// <summary>
/// Reads the QArray<>
/// Reads the <see cref="QArray{T}"/>
/// </summary>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Expand Down
Loading