Loading...

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