入出力データの扱い

Qamuyで量子化学計算を行う際、2種類の方法で入出力データを扱うことができます。

  • YAML/JSONデータ: 単純な構造のテキストファイルで入出力データを記述します。qamuyコマンドを用いて計算を実行する際に使用します。

  • Pythonオブジェクト: Pythonプログラム中で、オブジェクトとして入出力データを扱うことができます。多数の入力データを生成したり、Jupyter Notebook内でQamuyを利用するのに便利です。

YAML/JSONデータ

YAMLおよびJSONは、いずれも構造的なデータを簡潔に記述できるテキスト形式です。Qamuyでは、入出力データとしてYAMLまたはJSON形式に対応しています。2つの形式は等価ですので、好みに応じて選択して使用することができます。

入力データ例 (YAML)

ansatz:
  type: SYMMETRY_PRESERVING
  depth: 5
optimizer:
  type: BFGS
target_molecule:
  geometry:
    atoms: [H, H]
    coordinates:
      - - [0.0, 0.0, -0.35]
        - [0.0, 0.0, 0.35]
  basis: sto-3g
  multiplicity: 1

入力データ例 (JSON)

{
  "ansatz": {
    "type": "SYMMETRY_PRESERVING",
    "depth": 5
  },
  "optimizer": {
    "type": "BFGS"
  },
  "target_molecule": {
    "geometry": {
      "atoms": ["H", "H"],
      "coordinates": [
        [
          [0.0, 0.0, -0.35],
          [0.0, 0.0, 0.35]
        ]
      ]
    },
    "basis": "sto-3g",
    "multiplicity": 1
  }
}

YAML/JSON形式で作成した入力データファイルを元に計算を行うには、qamuy runコマンドを使用します。次のコマンドで、入力ファイルで指定された計算がクラウド上で実行されます。

JSONファイル (input.json) の場合

$ qamuy run input.json

YAMLファイル (input.yaml) の場合

$ qamuy run input.yaml

計算結果はデフォルトで標準出力に表示されます。-oオプションを指定して計算結果をファイルに保存することができます。その際、-fオプションで保存形式を指定することができます(指定しない場合はJSONで保存されます)。

JSON形式で保存する場合

$ qamuy run input.json -o output.json

YAML形式で保存する場合

$ qamuy run input.yaml -f yaml -o output.yaml

複素数

YAML/JSON形式の入出力データ内では、複素数はreal, imagの2つの実数を持ったオブジェクト(マッピング)として表されます。

YAML形式

value:
  real: 1.0
  imag: 2.0

JSON形式

{
  "real": 1.0,
  "imag": 2.0
}

列挙型 (enum)

入出力データの中には、決まった選択肢の中から1つの値を選んで指定するものがあります(列挙型)。YAML/JSON形式の入出力データ内では、このような値は文字列として表されます。選択肢にない文字列が指定された場合はエラーになります。

以下の例では、optimizer内のtypeに、決まった選択肢(BFGS, NFT, …)から選んだ値を指定しています。

YAML形式

optimizer:
  type: BFGS

JSON形式

{
  "optimizer": {
    "type": "BFGS"
  }
}

Pythonオブジェクトとしての入出力データ

Qamuy Client SDKを利用することで、Pythonプログラム内で入力データの作成・計算の実行・出力データの解析を行うことが可能です。この場合、Python SDKの関数等を通じて、Pythonオブジェクトとして入出力データを扱うことになります。

入力データオブジェクトは、qamuy.chemistryパッケージのクラス・関数を使用して作成します。各オブジェクトは、YAML/JSON形式での記述と対応する名前の属性を持っており、値の参照・代入が可能です。

import qamuy.chemistry as qy

input = qy.QamuyChemistryInput()
input.target_molecule.basis = "sto-3g"
print(input.target_molecule.basis) # => sto-3g

入力データオブジェクトを作成後、qamuy.client.Clientクラスを使ってクラウド上で計算を行います。

from qamuy.client import Client

client = Client()
job = client.submit(input)
results = client.wait_and_get_job_results([job])
result = results[0]

出力データオブジェクトも、YAML/JSON形式での記述と対応する名前の属性を持っており、計算結果の参照・解析が可能です。

quantum_result = result.molecule_result.quantum_device_result
print(list(quantum_result.vqe_log.opt_params)) # => [-0.10486732118823552]

入出力データ内容の詳細は入力データ・出力データ、Python SDKによる入力データ作成・計算実行・出力データ解析の詳細はプログラムでQamuyを使うを参照ください。

複素数

Python SDKの入出力オブジェクト内では、複素数はPythonのcomplex型として扱われます。

print(transition_dipole_moment.value[0]) # => (-0.8089680491698781+0j)

列挙型 (enum)

入出力データの中には、決まった選択肢の中から1つの値を選んで指定するものがあります(列挙型)。Python SDKの入出力オブジェクト内では、このような値はEnumとして扱われます(より正確にはIntEnum)。入出力オブジェクトに対してこのような値を代入する場合、Enum値が使用できるのに加え、その値の名前を表す文字列を使用することも可能です。選択肢にない文字列が指定された場合はエラーになります。

以下の例では、optimizer内のtypeを指定する複数の方法を示しています。

import qamuy.chemistry as qy

optimizer = qy.Optimizer(type="BFGS")
optimizer.type # => <Type.BFGS: 1>
# Enum値を代入する
optimizer.type = qy.Optimizer.Type.NFT
optimizer.type # => <Type.NFT: 3>
# 文字列を代入する
optimizer.type = "POWELL"
optimizer.type # => <Type.POWELL: 5>
# 存在しない値の文字列を代入するとエラー
optimizer.type = "INVALID" # => ValueError: unknown enum label "INVALID"