Skip to content

Commit

Permalink
FIX(tensorflow): Array conversion (Budapest-Quantum-Computing-Group#221)
Browse files Browse the repository at this point in the history
**Problem**

For the interferometer gate when one specified a numpy array as a
parameter and the tensorflow backend is used then casting to
`tensorflow.EagerTensor` did not happen, resulting in error.

**Solution**

A `_postprocess` method has been written for the `_GaussianGate`.
  • Loading branch information
VHenrik007 authored Jan 30, 2023
1 parent 1f66ed3 commit e1cd2dc
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 0 deletions.
14 changes: 14 additions & 0 deletions piquasso/instructions/gates.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,20 @@ def __init__(
),
)

def _postprocess(self, calculator):
np = calculator.np

passive_block = self._extra_params["passive_block"]
active_block = self._extra_params["active_block"]
displacement_vector = self._extra_params["displacement_vector"]

if passive_block is not None:
self._extra_params["passive_block"] = np.array(passive_block)
if active_block is not None:
self._extra_params["active_block"] = np.array(active_block)
if displacement_vector is not None:
self._extra_params["displacement_vector"] = np.array(displacement_vector)


class _ScalableGaussianGate(
_GaussianGate,
Expand Down
35 changes: 35 additions & 0 deletions tests/backends/tensorflow/test_gates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#
# Copyright 2021-2023 Budapest Quantum Computing Group
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import piquasso as pq
import pytest
import tensorflow as tf


@pytest.mark.monkey
def test_Interferometer_numpy_array_as_parameter(generate_unitary_matrix):
alpha = tf.Variable(0.01)
d = 5
interferometer = generate_unitary_matrix(d)

simulator = pq.TensorflowPureFockSimulator(d=d, config=pq.Config(cutoff=3))

with pq.Program() as program:
pq.Q(all) | pq.Vacuum()
pq.Q(0) | pq.Displacement(alpha=alpha)

pq.Q(all) | pq.Interferometer(interferometer)

simulator.execute(program)

0 comments on commit e1cd2dc

Please sign in to comment.