銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Q# Coding ContestでのDriverクラスの書き方

昨日紹介したQ# Coding Testですが、書いたクラスをテストするのに最初ちょっと戸惑ったのでメモしておきます。

codeforces.com

実際の問題は登録した後にみられて、今は3問ほど解説も見ることができます。が、テストするためのコードが書けないとそのあとが大変です。 問題の形式はいくつかるのですが、このコメントにあるとおり、引数で渡されたQubitを操作して指定した状態にするという問題があります。

Announcement: Microsoft Q# Coding Contest — Summer 2018 - Codeforces

なんとなく、C# のDriverクラス側で所定の状態のQubitをQ#のクラス(メソッド)に渡して実行して、その結果を見ればいいように思えますが、残念ながら量子コンピューターの性質上、Qubitの初期化などはC#のDriverからはできません。コメントにあるとおり、提出するSolveメソッドのほかにQ#側にDriverとなるメソッドを用意してそこで実行する必要があります。提出用ファイルにこのDriverメソッドを含めたくなかったので、次のようなQ#ファイルを作って、Testメソッドを作成してみました。Solveメソッドが提出対象のメソッドです。

namespace Solution {
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Extensions.Diagnostics;

    operation Test() : () {
        body {
            using (register = Qubit[1]) {
                let q = register[0];
                DumpMachine("dump-initial.txt");

                Solve(q,-1);

                DumpMachine("dump.txt");
                Reset(q);
            }
        }
    }
}

Qubitの初期化はusingキーワードでQubitを生成します。これにより|0>で初期化されます。

docs.microsoft.com

またQubitの状態を測定すると、それはそれで状態に影響してしまうので、デバッグのために DumpMachineメソッドを使います。これによりQubitの状態をファイルに出力します。

docs.microsoft.com

こんな感じで出力されます。

Ids: [0;]
Wavefunction:
0: 1  0
1: 0  0

ここまでQ#側でやるとC#のDriverはこのような簡単な記述になります。

using Microsoft.Quantum.Simulation.Simulators;

namespace Solution
{
    class Driver
    {
        static void Main(string[] args)
        {
            using (var sim = new QuantumSimulator())
            {
                var received = Test.Run(sim).Result;
            }
        }
    }
}

一応、全部解けたので、Warmup Contestの期間が終わったら問題についてもちょっとまとめてみたいと思います。 f:id:tanaka733:20180701185341p:plain