銀の光と碧い空

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

Microsoft Q# Coding Contest warmupラウンドの自分の回答を公開しています

Microsoft Q# Coding Contest warmupラウンドが終了して結果として私は107位でした。自分にとってはたぶんこれが初めてのオンラインプログラミングコンテスト参加だったと思います。

f:id:tanaka733:20180704190050p:plain

また問題も公開されているようです。 codeforces.com

というわけで自分が提出した回答をGitHubに公開してみました。 github.com

問題そのものの解説はすでにあるようなので、

smijake3.hatenablog.com

最初の問題を例にどうやって実行したかを説明してみます。問題としては、状態{|0 \rangle}であるQubit型の引数qと1か-1であるInt型の引数signに与えられ、signが1であればqを{| + \rangle = \frac{1}{\sqrt{2}}(|0 \rangle + |1 \rangle)}、-1であればqを{| - \rangle = \frac{1}{\sqrt{2}}(|0 \rangle - |1 \rangle)}に変化させるoperationを記述するというものです。引数で渡された状態を変化させるため、このoperationは返り値を持ちません。

先日のエントリで書いた通り、QubitはC#のDriverクラスでは生成できないので、もうひとつQ#のoperationを作成し、その中でQubitを生成、operationを実行、実行した結果を確認、という手順を踏みます。というわけで、テスト用のQ#コードはこのようになります。

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-0.txt");
                Reset(q);

                Solve(q,1);
                DumpMachine("dump-1.txt");
                Reset(q);
            }
        }
    }
}

usingでQubitを初期化、(必要はないですが)配列のindex0のQubitを変数qとしています。DumpMachineは引数にファイルパスをとって、そのパスにQubitの状態を出力します。Solve operationを実行したあと、DumpMachineで状態を出力、Resetで再度初期化を行っています。DumpMachineの出力結果は次のようになって、期待通りのoperationを記述できたことがわかります。

dump-initial.txt

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

dump-0.txt

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

dump-1.txt

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

まじめに測定するコードを書いてもいいと思うのですが、デバッグ目的ではDumpMachineがかなり便利でした。 Microsoft Q# Coding Contestの本戦は土曜1時(金曜深夜25時)からなので、W-cup観戦の合間にいかがでしょうか。

Microsoft MVP を再受賞して、カテゴリがAzureになりました

TwitterやFacebookではすでに報告してお祝いのコメントももらっていますが、今年もMicrosoft MVPを更新できました。この場を借りてお礼させていただきます。MVPとはなんぞやというのはこちらにあります。

Microsoft MVP Award

最近になって、MVPの新規受賞は毎月(申請も毎月)なので、定期的に受賞された方が増えているのですが、すでに受賞している人の更新はまとめて7月に発表されるため、SNSで大量に言及される事態になっています。

私自身は、ここ1~2年は .NET Core/C# に加えて、コンテナ関連技術やLinuxを中心にAzureまわりの技術をテーマにしたブログや登壇もしていたので、AzureとVisual Studio and Development Technologies(VSDT)という2つのカテゴリで申請しました。審査の結果、去年まで受賞していたVSDTは申請が通らなかったため、更新した上でVSDTからAzureに移動という形になりました。カテゴリわけについてはこちら。

MVP Award Update - Oct 2015

とはいえ一番好きな言語はC#ですし、コンテナ上やLinux上での利用を中心に.NET Core/C#の技術情報も引き続き発信していければと思います。仕事上の必要にせまられてというケースがほとんどなんですが、最近は次のような技術を追いかけています。

  • .NET Core/ ASP.NET Core (コンテナ上での利用を中心に)
  • kubernetes on Azure (あるいはOpenShift on Azure)
  • Linux on Azure (仮想マシン管理を中心に)
  • SQL Server on Linux (特にRHEL、Azure上のRHELやkubernetes上でのAlwaysOn AGも)
  • Linux/kubernetes on Azure Stack (Linux/kubernetes管理者視点でどのようにAzure Stackを利用するか)
  • Windows Server Node in kubernetes
  • Q# (Microsoft Quantum/トポロジカル量子コンピューター)

(これらはさっきのカテゴリ分類みると、ばらばらなカテゴリなので来年どうなることやら)

活動内容は去年に引き続き、ブログでの情報発信やコミュニティイベントでの登壇ですので、もしこれらの技術について話してほしいという要望があればぜひお声掛けください。去年福岡に行ったので、首都圏以外も機会があればぜひ登壇したいと思っています。大きめのイベントでの登壇もやってみたいなあと思い、CFPも出していたりします。 それ以外の例えば雑誌や書籍の執筆なども機会があれば(もらえれば)ぜひやりたいですね(というのを毎年言っている気がする)

今年も一年よろしくお願いします。

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