QuantumLibraries/Standard/tests/ArrayTests.qs

120 строки
4.3 KiB
Plaintext
Исходник Обычный вид История

Release v0.6 to master. (#98) * Begin refactoring standard libraries (#39) * Began splitting up namespaces. * Began refactoring tests. * Updated chemistry src and tests for new namespaces. * Remove unused opens. * Began renaming operations and functions. * Separated out and updated ApplyReversed*. * Updated BE ↔ LE type conversions. * Added new transformed operation fns. * Whitespace fix * Eliminated some redundant code in applyreversed * Fixed deprecation comments. * Began working on refactoring With. * Refactored With further. * More renaming for consistency with LE/BE suffix convention. * Added Zip3, Zip4 * Added shorthand for MAJ and updated some type conv. * Fixed a typo in Zip4. * Separated out and updated arithmetic measurements. * Other minor maintenance changes. * Started separating out modular arithmetic. * Began refactoring ripple-carry comparators. * Refactored integer increment operations. * Fixed some See Also blocks. * Some minor progress. * Moved new arithmetic functionality into right folders. * Renamed integer arithmetic namespaces. * Split out qecc namespace. * Added documentation file for Microsoft.Quantum.ErrorCorrection. * Progress on renaming type conversion functions. * More progress on updating type conversion names. * Split out AA namespace. * Split out oracles namespace as well. * Renamed UDTs to remove "AmpAmp" prefix. This prefix is now implied by the Microsoft.Quantum.AmplitudeAmplification namespace. * Renamed some Qecc operations/fns * Moved more conversions into Convert.qs. * Updated some deprecated syntax. * Split out M.Q.Convert. * Added missing open stmt. * Started separating out classical math. * Began separating out QCVV. * Fixing namespaces in tests. * Update to use new docgen. * Began making arrays namespace. * Updated to use new arrays and diagnostics namespaces. * Updated names for claims * Started extracting measurements from Paulis.qs. * Updated namespaces in tests as well. * Updating chemistry for most recent changes. * Added ForEach, used to simplify measurements. * Updating deprecated Q# syntax. * Minor fix for XML error. * Fixed infinite recursion in deprecation stubs. * Started trying to reduce # of warnings. * Fixed some minor build errors. * Resolved a couple TODOs. * Removed BigEndian support. * Resolved warnings due to && and ||. * Update Standard/src/Arithmetic/Shorthand.qs Co-Authored-By: cgranade <cgranade@gmail.com> * Addressing feedback. * Claim → Fact * Moved MeasureInteger back to Microsoft.Quantum.Arithmetic. * Resolved more deprecated syntax. * Removed one more LE suffix. * Addressing feedback. * Cgranade/complete 0.6 move (#57) * Revert "Begin refactoring standard libraries (#39)" (#56) As Chris pointed out, reverting these breaking changes until we have a chance to change everything... * Complete move of standard library refactoring to release branch This reverts commit 058048983c4d0509e5d522888d3d47ae49cd300e. * Explicitly qualify all names in M.Q.Ext.Math. (#74) * Explicitly qualify all names in M.Q.Ext.Math. * Fixed two missing qualified names. * Removed more occurances of M.Q.Ext.Math. * Removed Microsoft.Quantum.Extensions.Math from tests as well. * Reverted slight change to QuantumROM. * New array functions (#75) * Added new IndexRange function to eliminate `-1` in for loops. * Added some missing open statements. * New Enumerated function. * Port library and test code to new 0.6 names to reduce warning count. (#72) * Updating to use new syntax, namespace names, etc. * More primitive → intrinsic. * Updated test project to use beta version. * Updated chemistry proiects to beta. * Finding a few more calls to deprecated fns. * Cleaned up some assert and qcvv tests. * Removed uses of deprecated IntArrayFromRange * Resolved some more deprecated functions and ops. * Minor maintenance in QubitizationTests. * Bumped versions to latest beta. * Some trivial change to retrigger build. * Resolved package downgrade. * Move Microsoft.Quantum.Math.Complex UDT and resolve Microsoft.Quantum.Diagnostics deprecation stubs. (#77) * More primitive → intrinsic. * Finding a few more calls to deprecated fns. * Resolved some more deprecated functions and ops. * Minor maintenance in QubitizationTests. * Bumped versions to latest beta. * Resolved package downgrade. * Use Complex UDT at its new name. * Adapted tests. * A few more test adaptations. * Updated name of AssertQubitState to 0.6 name. * Fixes to chemistry. * Getting updates from master (#80) * Revert "Begin refactoring standard libraries (#39)" (#56) As Chris pointed out, reverting these breaking changes until we have a chance to change everything... * Missing return statement when compiling more than one Q# snippet from Python. (#60) * Fixing bug * Adding tests * Change Assembly.Version to Python.Version. (#64) * Prevent loading Q# modules when Python client is busy. (#71) * Prevent loading Q# modules when Python client is busy. * Linux build failed with some unrelated problem. Committing. * modifying contructor calls for QArray in preparation for a simulation framework change (#78) * Revert "Revert "Begin refactoring standard libraries (#39)" (#56)" This reverts commit 058048983c4d0509e5d522888d3d47ae49cd300e. * Update to 0.6.1904.1302-beta. (#81) * Update to 0.6.1904.1302-beta. * Removed deprecation warnings for Microsoft.Quantum.Math. * Resolved a few more deprecations. * Resolved a few more deprecation warnings. * A few more deprecation resolutions. * Removed some duplicate namespace opens. * Slight code cleanup. * Addressed feedback from @bettinaheim. * Standard.sln builds again, Standard.sln builds (#84) * Gulow/v0.6 chemistry deprecation (#82) * Update to 0.6.1904.1302-beta. * Removed deprecation warnings for Microsoft.Quantum.Math. * Resolved a few more deprecations. * Resolved a few more deprecation warnings. * A few more deprecation resolutions. * Removed some duplicate namespace opens. * Slight code cleanup. * Update test * . * Remove deprecated operations from chemistry and dependencies. * Fix comments * Update to use 0.65 syntax from latest beta. (#87) * Ported stateprep.qs to 0.65 syntax. * Fixed deprecation in test. * Updated to latest beta. * Fix mutable array issue in chemistry data model. (#88) * Explicitly call new QArray. (#89) * do not rely on collections.immutable (#93) * Continue migrating libraries to Q# 0.6 (#91) * Continue migrating to 0.65 syntax and applying style guidance. * A bit more progress normalizing private names. * Resolved more deprecated syntax, updated a name. * Resolved some more syntax warnings. * Ported more syntax and updated more names. * Resolved all remaining compile-time warnings in Standard. * Addressed all Q#-level compile-time warnings in chem. * Migrated a bit more syntax and updated to newest beta. * Moved to using intrinsic warnings. * Fixed endianness of exact QFT. * Fixed Microsoft.Quantum.Warnings. * Addressing @bettinaheim's feedback. * Removed some warnings in unit tests. * Adding DocsOutDir for single doc output location across projects. (#94) * Adding DocsOutDir for single doc output location across projects. * Begin adding more classical math functions for BigInt. (#96) * Begin adding more classical math functions for BigInt. * Addressing @beheim's feedback. * Minor fixes. * Bump to latest beta. * Fixed two minor bugs. * Fixed the type of signs. * Bump version to released packages.
2019-05-04 01:44:41 +03:00
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
namespace Microsoft.Quantum.Tests {
open Microsoft.Quantum.Diagnostics;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
open Microsoft.Quantum.Arrays;
function ZipTest () : Unit {
let left = [1, 2, 101];
let right = [PauliY, PauliI];
let zipped = Zip(left, right);
let (leftActual1, rightActual1) = zipped[0];
if (leftActual1 != 1 or rightActual1 != PauliY) {
fail $"Expected (1, PauliY), got ({leftActual1}, {rightActual1}).";
}
let (leftActual2, rightActual2) = zipped[1];
if (leftActual2 != 2 or rightActual2 != PauliI) {
fail $"Expected (2, PauliI), got ({leftActual2}, {rightActual2}).";
}
}
function LookupTest () : Unit {
let array = [1, 12, 71, 103];
let fn = LookupFunction(array);
EqualityFactI(fn(0), 1, $"fn(0) did not return array[0]");
// Make sure we can call in random order!
EqualityFactI(fn(3), 103, $"fn(3) did not return array[3]");
EqualityFactI(fn(2), 71, $"fn(2) did not return array[2]");
EqualityFactI(fn(1), 12, $"fn(1) did not return array[1]");
}
function ConstantArrayTestHelper (x : Int) : Int {
return x * x;
}
function ConstantArrayTest () : Unit {
let dblArray = ConstantArray(71, 2.17);
EqualityFactI(Length(dblArray), 71, $"ConstantArray(Int, Double) had the wrong length.");
let ignore = Mapped(NearEqualityFact(_, 2.17), dblArray);
// Stress test by making an array of Int -> Int.
let fnArray = ConstantArray(7, ConstantArrayTestHelper);
EqualityFactI(Length(fnArray), 7, $"ConstantArray(Int, Int -> Int) had the wrong length.");
EqualityFactI(fnArray[3](7), 49, $"ConstantArray(Int, Int -> Int) had the wrong value.");
}
function SubarrayTest () : Unit {
let array0 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let subarrayOdd = Subarray([1, 3, 5, 7, 9], array0);
let subarrayEven = Subarray([0, 2, 4, 6, 8, 10], array0);
EqualityFactB(All(IsEven, subarrayEven), true, $"the even elements of [1..10] were not correctly sliced.");
EqualityFactB(Any(IsEven, subarrayOdd), false, $"the odd elements of [1..10] were not correctly sliced.");
let array1 = [10, 11, 12, 13];
Ignore(Mapped(EqualityFactI(_, _, $"Subarray failed: subpermutation case."), Zip([12, 11], Subarray([2, 1], array1))));
}
function FilterTest () : Unit {
let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let evenArray = Filter(IsEven, array);
EqualityFactB(All(IsEven, evenArray), true, $"the even elements of [1..10] were not correctly filtered.");
}
function ReverseTest () : Unit {
let array = [1, 2, 3];
Ignore(Mapped(EqualityFactI(_, _, $"Reversed failed."), Zip([3, 2, 1], Reversed(array))));
}
function ExcludeTest () : Unit {
let array = [10, 11, 12, 13, 14, 15];
Ignore(Mapped(EqualityFactI(_, _, $"Exclude failed."), Zip([10, 11, 13, 14], Exclude([2, 5], array))));
}
function PadTest () : Unit {
mutable arrayTestCase = [(-5, 2, [10, 11, 12], [10, 11, 12, 2, 2]), (5, 2, [10, 11, 12], [2, 2, 10, 11, 12]), (-3, -2, [10, 11, 12], [10, 11, 12])];
for (idxTest in IndexRange(arrayTestCase)) {
let (nElementsTotal, defaultElement, inputArray, outputArray) = arrayTestCase[idxTest];
let paddedArray = Padded(nElementsTotal, defaultElement, inputArray);
Ignore(Mapped(EqualityFactI(_, _, $"Padded failed."), Zip(outputArray, paddedArray)));
}
}
function EnumeratedTest() : Unit {
let example = [37, 12];
let expected = [(0, 37), (1, 12)];
let actual = Enumerated(example);
for ((actualElement, expectedElement) in Zip(actual, expected)) {
EqualityFactI(Fst(actualElement), Fst(expectedElement), "Indices did not match.");
EqualityFactI(Snd(actualElement), Snd(expectedElement), "Elements did not match.");
}
}
}