Source code for qudas.annealing.input
from __future__ import annotations
from qudas.core.base import QdInputBase
from qudas.annealing.block import QdAnnealingBlock
from qudas.annealing.ir import QdAnnealingIR
from typing import List, Dict, Union, Optional
[docs]class QdAnnealingInput(QdInputBase):
"""量子アニーリング (QUBO) 用の入力クラス。
旧 API では単一 QUBO (``QdAnnealingIR``) のみを扱っていたが、
本クラスでは *複数ブロック* を ``QdAnnealingBlock`` のリストとして
扱えるように拡張した。
Parameters
----------
blocks : list[QdAnnealingBlock] | QdAnnealingIR | None, optional
・``list`` を渡した場合 … 複数ブロック入力としてそのまま保持。
・``QdAnnealingIR`` を渡した場合 … 旧 API 互換。単一ブロックとしてラップ。
・省略 / None … 空ブロックリストで初期化。
"""
def __init__(
self, blocks: Union[List[QdAnnealingBlock], QdAnnealingIR, None] = None
):
if blocks is None:
self.blocks: List[QdAnnealingBlock] = []
# 新 API: list[QdAnnealingBlock]
elif isinstance(blocks, list):
if not all(isinstance(b, QdAnnealingBlock) for b in blocks):
raise TypeError(
"blocks には QdAnnealingBlock のリストを渡してください。"
)
self.blocks = blocks
# 旧 API: 単一 QdAnnealingIR
elif isinstance(blocks, QdAnnealingIR):
self.blocks = [QdAnnealingBlock(blocks.to_dict(), label="block0")]
else:
raise TypeError(
"blocks には QdAnnealingBlock のリスト、QdAnnealingIR、または None を渡してください。"
)
@property
def block(self) -> QdAnnealingBlock:
return self.blocks[0]
# ------------------------------------------------------------------
# 旧 API 互換: `.ir` プロパティ (最初のブロックを参照)
# ------------------------------------------------------------------
@property
def ir(self) -> Optional[QdAnnealingIR]: # noqa: D401 – simple property
"""互換用プロパティ: **最初のブロック** を ``QdAnnealingIR`` として返す。"""
if not self.blocks:
return None
return QdAnnealingIR(self.blocks[0].qubo)
# ------------------------------------------------------------------
# 汎用ユーティリティ
# ------------------------------------------------------------------
[docs] def to_dict(self) -> Dict[str, Dict]: # noqa: D401 – 単純メソッド
"""``{block_label: qubo_dict}`` 形式へ変換。"""
return {block.label: block.qubo for block in self.blocks}
[docs] @classmethod
def from_dict(cls, data: Dict[str, Dict]) -> "QdAnnealingInput":
return cls(
blocks=[QdAnnealingBlock(qubo, label=label) for label, qubo in data.items()]
)
# エイリアス (旧クラス名)
QdAnnIn = QdAnnealingInput