import js
from sty import bg
app_select = pn.widgets.Select(name="App", options=['Select', 'Single qubit', 'Multi qubit', 'Function encoding', 'Frequency encoding']).servable(target='app-select-widget')
@pn.depends(app_select, watch=True, on_init=True)
def run(v):
js.clearInputs()
js.clearInfo()
js.clearCirc()
if app_select.value == 'Multi qubit':
qubits = pn.widgets.NumberInput(name='# of qubits', start=1, end=5, value=2).servable(target='num-key-widget')
target = pn.widgets.NumberInput(name='Target', start=0, disabled=True).servable(target='num-value-widget')
gate = pn.widgets.Select(name='Gate', options=[None] + [gate.upper() for gate in gates]).servable(target='input-select-widget')
arg = pn.widgets.NumberInput(name='Angle (in degrees)', disabled=True).servable(target='poly-widget')
go = pn.widgets.Button(name='Apply', button_type='primary').servable(target='go-widget')
info = pn.pane.Str('').servable(target='info')
global qc
qc = create_multi_qubit(qubits.value)
js.draw(circuit_to_string(qc))
target.end = qubits.value - 1
target.disabled = qubits.value is None or qubits.value < 1
global output
output = f'Initial state\n-------------\n\n{get_state_multi(qc)}'
go.value = True
info.object = output
@pn.depends(qubits, watch=True, on_init=True)
def select_qubits(v):
global qc
qc = create_multi_qubit(qubits.value)
js.draw(circuit_to_string(qc))
target.end = qubits.value - 1
target.disabled = qubits.value is None or qubits.value < 1
global output
output = f'Initial state\n-------------\n\n{get_state_multi(qc)}'
go.value = True
info.object = output
@pn.depends(target, watch=True)
def select_target(v):
gate.disabled = target.value is None
@pn.depends(gate, watch=True)
def select_gate(v):
arg.disabled = gate.value is None or not (gate.value.lower() in arg_gates)
go.disabled = gate.value is None
@pn.depends(go, watch=True)
def apply(v):
global qc
global output
if go.value is True and gate.value is not None:
apply_gate_multi(qc, target.value, gate.value.lower(), arg.value)
gate.value = None
arg.value = None
arg.disabled = True
go.value = False
s = get_state_multi(qc)
qc_str = circuit_to_string(qc)
js.draw(qc_str)
output = f'Step {last_step(qc)}\n-------\n\n{s}\n\n{output}'
info.object = output
if app_select.value == 'Single qubit':
gate = pn.widgets.Select(name='Gate', options=[None] + [gate.upper() for gate in gates]).servable(target='num-key-widget')
arg = pn.widgets.NumberInput(name='Angle (in degrees)', disabled=True).servable(target='num-value-widget')
go = pn.widgets.Button(name='Apply', button_type='primary').servable(target='go-widget')
info = pn.pane.Str('').servable(target='info')
qc = create_single_qubit()
js.draw(circuit_to_string(qc))
global out
@pn.depends(gate, watch=True)
def select_gate(v):
arg.disabled = gate.value is None or not (gate.value.lower() in arg_gates)
print('gate', v)
@pn.depends(go, watch=True)
def apply(v):
global out
if go.value is True and gate.value is not None:
# add_gate(qc, [], 0, gate.value.lower(), arg.value/180*pi if gate.value.lower() in arg_gates else None)
apply_gate(qc, gate.value.lower(), arg.value)
gate.value = None
arg.value = None
arg.disabled = True
go.value = False
s = get_state(qc)
qc_str = circuit_to_string(qc) #component.get_circuit()
js.draw(qc_str)
out = f'Step {last_step(qc)}\n-------\n\n{s}\n\n{out}'
info.object = out
reset(qc)
out = f'Initial state\n-------------\n\n{get_state(qc)}'
info.object = out
if app_select.value == 'Function encoding':
n_key = pn.widgets.IntInput(name="# of input qubits", value=2).servable(target='num-key-widget')
n_value = pn.widgets.IntInput(name="# of output qubits", value=4).servable(target='num-value-widget')
input_select = pn.widgets.Select(name="Type of input", options=['Integer variable', 'Binary variables'], value='Integer variable').servable(target='input-select-widget')
poly = pn.widgets.TextInput(name="Polynomial", value='x**2').servable(target='poly-widget')
go = pn.widgets.Button(name='Apply', button_type='primary').servable(target='go-widget')
negative = pn.widgets.Select(name="Negative values for output?", options=['Select', 'Yes', 'No'], value = 'No').servable(target='negative-select-widget')
@pn.depends(input_select, watch=True)
def change_expression(v):
if input_select.value == 'Binary variables':
poly.value = 'x0'
else:
poly.value = 'x**2'
@pn.depends(go, watch=True)
def function_encoding(v):
js.clearInfo()
coeffs = terms_from_poly(poly.value, n_key.value, input_select.value == 'Integer variable')
if type(coeffs) == str:
out = pn.pane.HTML(f'{coeffs}').servable(target='info')
return out
qc = build_polynomial_circuit(n_key.value, n_value.value, coeffs)
c = circuit_to_string(qc)
state = qc.reports['qpe'][2]
# grid_state = grid_state_html(state, n_key.value, negative.value == 'Yes', True)
grid_state = grid_state_html(state, n_key.value, negative.value == 'Yes', True)
s = f'State:\n{grid_state}'
# s = f'State:\n{state_table_to_string(state)}'
js.draw(c)
out = pn.pane.HTML(f'{s}\n').servable(target='info')
return out
if app_select.value == 'Frequency encoding':
qubits = pn.widgets.IntInput(name="# of qubits", value=3, start=1, end=5).servable(target='num-key-widget')
frequency = pn.widgets.FloatInput(name="Frequency", value=4.3, start=0).servable(target='num-value-widget')
go = pn.widgets.Button(name='Apply', button_type='primary').servable(target='go-widget')
@pn.depends(go, watch=True)
def run(v):
js.clearInfo()
qc = encode_frequency(qubits.value, frequency.value)
c = circuit_to_string(qc)
state = qc.reports['iqft'][2]
s = f'State:{state_table_to_string(state)}'
js.draw(c)
n = qubits.value
v = frequency.value
f = (f'Frequency:\n{v}' + (f' mapped to {round(v%2**n, 2)}' if v >= 2**n or v < 0 else ''))
out = pn.pane.Str(f'{s}\n\n{f}').servable(target='info')
return out