Справочная информация:
Я заинтересован в изучении квантовых фазовых переходов различных материалов, написав имитацию на адиабатическом квантовом компьютере DWave. Чтобы упростить создание фазовых графиков в зависимости от параметров, я пишу утилиты для просмотра параметров, запуска моделирования с этими наборами параметров и сбора данных.
Справочная информация об условиях ввода:
В DWave есть два набора параметров, которые я могу установить: h
смещения и J
связи. Они вводятся следующим образом: h = {qubit0: hvalue0, qubit1: hvalue1,...}
и J = {(qubit0, qubit1): J01, (qubit2, qubit3): J23, ...}
. До сих пор у меня есть инструмент, который выполняет развертку параметров при заданных входных данных, таких как: {qubit: [hz1, hz2,..., hzn]}
сопоставление кубитов с h
значениями для развертки и {coupler: [J1, J2,..., Jn]}
сопоставление соединителей с J
значениями для развертки. В обоих случаях выходные данные представляют собой список в форме [{trial1}, {trial2}, ... {trialn}]
, который представляет декартово произведение входных данных h
и J
на каждом отдельном кубите и связи.
Чего я на самом деле хочу и что уже написал:
Выше я столкнулся с серьезной проблемой. Предположим, я хочу просмотреть серию параметров, в которых некоторые кубиты или ответвители имеют фиксированные отношения по отношению друг к другу в любом заданном цикле. Это важно из-за некоторых сложностей, когда логическая проблема должна быть отображена на DWave нетривиальными способами. Например, предположим, что я хочу запустить проблему, где qubit0
имеет h
в [0, 1, 2]
, qubit1
имеет h
в [1, 2, 3]
и qubit3
имеет h
в [5, 8]
, НО отношения qubit1_h = qubit0_h + 1
должно быть сохранено; то есть я хочу, чтобы произведение значений было [(0, 1, 5), (0, 1, 8), (1, 2, 5), (1, 2, 8), ...]
, а НЕ всеми комбинациями, как это дано декартовым произведением.
Следующий код сделает это для параметров h, но не работает для параметров J, поскольку ключи словаря являются кортежами. Кроме того, я должен запустить свой исходный код, чтобы сгенерировать продукт для ухода за больными, если мне не нужны эти функции, поэтому, похоже, он генерирует «3 случая».
def fixed_relationship_sweep(input_params, together):
"""
Inputs
------
input_params: {0:[x1, x2], 1:[x3, x4], 2:[y1, y2], 3:[y3, y4]]}
dictionary mapping qubits to parameter lists to iterate through
together: [[0, 1], [2, 3]]
list of qubit lists that specify which qubit parameters to sweep with a fixed relationship
Output
------
fixed_rel_sweep: [{trial1}, {trial2}, ...{trialn}] where qubits labelled as "together" are
swept with fixed 1-1 relationship, ie, above produces:
[{0:x1, 1:x3, 2:y1, 3:y3}, {0:x1, 1:x3, 2:y2, 3:y4}, {0:x2, 1:x4, 2:y1, 3:y3},
{0:x2, 1:x4, 2:y2, 3:y4}]
"""
qsorcs = []
params = []
#index representation of params, as cartesian product must respect fixed positions
#of arguments and not their values, ie [x1, x3] vary together in example
tempidxrep = []
for key, value in input_params.items():
qsorcs.append(key)
params.append(value)
tempidxrep.append([i for i in range(len(value))])
idxrep = []
#remove redundancy in index representation governed by fixed relationships in together
for fix_rel in together:
idxrep.append(tempidxrep[fix_rel[0]])
#sweep combinations via carteisan product
idxcombos = itertools.product(*idxrep)
#reconstruct actual parameter combinations
param_combos = []
for idxcombo in idxcombos:
trial = {qsorcs[j]: params[j][idxcombo[i]] for i in range(len(idxcombo)) for j in together[i]}
param_combos.append(trial)
return param_combos
Существует ли более простой и лучший способ сделать это с помощью встроенных инструментов, таких как itertools, которые могут обрабатывать ключи как целые числа или кортежи без написания отдельных сложных функций? Другими словами, я просто подхожу к этой, казалось бы, простой проблеме с неправильного направления?