Beispiel #1
0
    def eigensys(
        self,
        evals_count: int = 6,
        filename: str = None,
        return_spectrumdata: bool = False,
    ) -> Tuple[ndarray, ndarray]:
        """Calculates eigenvalues and corresponding eigenvectors using
        `scipy.linalg.eigh`. Returns two numpy arrays containing the eigenvalues and
        eigenvectors, respectively.

        Parameters
        ----------
        evals_count:
            number of desired eigenvalues/eigenstates (default value = 6)
        filename:
            path and filename without suffix, if file output desired
            (default value = None)
        return_spectrumdata:
            if set to true, the returned data is provided as a SpectrumData object
            (default value = False)

        Returns
        -------
            eigenvalues, eigenvectors as numpy arrays or in form of a SpectrumData object
        """
        evals, evecs = self._esys_calc(evals_count)
        if filename or return_spectrumdata:
            specdata = SpectrumData(energy_table=evals,
                                    system_params=self.get_initdata(),
                                    state_table=evecs)
        if filename:
            specdata.filewrite(filename)
        return specdata if return_spectrumdata else (evals,
                                                     evecs)  # type: ignore
Beispiel #2
0
    def eigenvals(
        self,
        evals_count: int = 6,
        filename: str = None,
        return_spectrumdata: bool = False,
    ) -> ndarray:
        """Calculates eigenvalues using `scipy.linalg.eigh`, returns numpy array of
        eigenvalues.

        Parameters
        ----------
        evals_count:
            number of desired eigenvalues/eigenstates (default value = 6)
        filename:
            path and filename without suffix, if file output desired
            (default value = None)
        return_spectrumdata:
            if set to true, the returned data is provided as a SpectrumData object
            (default value = False)

        Returns
        -------
            eigenvalues as ndarray or in form of a SpectrumData object
        """
        evals = self._evals_calc(evals_count)
        if filename or return_spectrumdata:
            specdata = SpectrumData(energy_table=evals,
                                    system_params=self.get_initdata())
        if filename:
            specdata.filewrite(filename)
        return specdata if return_spectrumdata else evals
Beispiel #3
0
    def eigensys(self, evals_count=6, filename=None):
        """Calculates eigenvalues and corresponding eigenvectors using `scipy.linalg.eigh`. Returns
        two numpy arrays containing the eigenvalues and eigenvectors, respectively.

        Parameters
        ----------
        evals_count: int, optional
            number of desired eigenvalues/eigenstates (default value = 6)
        filename: str, optional
            path and filename without suffix, if file output desired (default value = None)

        Returns
        -------
        ndarray, ndarray
            eigenvalues, eigenvectors
        """
        evals, evecs = self._esys_calc(evals_count)
        if filename:
            specdata = SpectrumData('const_parameters',
                                    param_vals=np.empty(0),
                                    energy_table=evals,
                                    system_params=self._get_metadata_dict(),
                                    state_table=evecs)
            specdata.filewrite(filename)
        return evals, evecs
Beispiel #4
0
    def eigenvals(self, evals_count=6, filename=None):
        """Calculates eigenvalues using `scipy.linalg.eigh`, returns numpy array of eigenvalues.

        Parameters
        ----------
        evals_count: int
            number of desired eigenvalues/eigenstates (default value = 6)
        filename: str, optional
            path and filename without suffix, if file output desired (default value = None)

        Returns
        -------
        ndarray
        """
        evals = self._evals_calc(evals_count)
        if filename:
            specdata = SpectrumData(energy_table=evals,
                                    system_params=self._get_metadata_dict())
            specdata.filewrite(filename)
        return evals
Beispiel #5
0
    def matrixelement_table(self,
                            operator,
                            evecs=None,
                            evals_count=6,
                            filename=None):
        """Returns table of matrix elements for `operator` with respect to the eigenstates of the qubit.
        The operator is given as a string matching a class method returning an operator matrix.
        E.g., for an instance `trm` of Transmon,  the matrix element table for the charge operator is given by
        `trm.op_matrixelement_table('n_operator')`.
        When `esys` is set to `None`, the eigensystem is calculated on-the-fly.

        Parameters
        ----------
        operator: str
            name of class method in string form, returning operator matrix in qubit-internal basis.
        evecs: ndarray, optional
            if not provided, then the necesssary eigenstates are calculated on the fly
        evals_count: int, optional
            number of desired matrix elements, starting with ground state (default value = 6)
        filename: str, optional
            output file name

        Returns
        -------
        ndarray
        """
        if evecs is None:
            _, evecs = self.eigensys(evals_count=evals_count)
        operator_matrix = getattr(self, operator)()
        table = get_matrixelement_table(operator_matrix, evecs)
        if filename:
            specdata = SpectrumData(energy_table=np.empty(0),
                                    system_params=self._get_metadata_dict(),
                                    param_name='const_parameters',
                                    param_vals=np.empty(0),
                                    matrixelem_table=table)
            specdata.filewrite(filename)
        return table
Beispiel #6
0
    def get_spectrum_vs_paramvals(
        self,
        param_name: str,
        param_vals: ndarray,
        evals_count: int = 6,
        subtract_ground: bool = False,
        get_eigenstates: bool = False,
        filename: str = None,
        num_cpus: int = settings.NUM_CPUS,
    ) -> SpectrumData:
        """Calculates eigenvalues/eigenstates for a varying system parameter,
        given an array of parameter values. Returns a `SpectrumData` object with
        `energy_data[n]` containing eigenvalues calculated for parameter value
        `param_vals[n]`.

        Parameters
        ----------
        param_name:
            name of parameter to be varied
        param_vals:
            parameter values to be plugged in
        evals_count:
            number of desired eigenvalues (sorted from smallest to largest)
            (default value = 6)
        subtract_ground:
            if True, eigenvalues are returned relative to the ground state eigenvalue
            (default value = False)
        get_eigenstates:
            return eigenstates along with eigenvalues (default value = False)
        filename:
            file name if direct output to disk is wanted
        num_cpus:
            number of cores to be used for computation
            (default value: settings.NUM_CPUS)
        """
        previous_paramval = getattr(self, param_name)
        tqdm_disable = num_cpus > 1 or settings.PROGRESSBAR_DISABLED

        target_map = get_map_method(num_cpus)
        if not get_eigenstates:
            func = functools.partial(self._evals_for_paramval,
                                     param_name=param_name,
                                     evals_count=evals_count)
            with InfoBar(
                    "Parallel computation of eigensystems [num_cpus={}]".
                    format(num_cpus),
                    num_cpus,
            ):
                eigenvalue_table = list(
                    target_map(
                        func,
                        tqdm(
                            param_vals,
                            desc="Spectral data",
                            leave=False,
                            disable=tqdm_disable,
                        ),
                    ))
            eigenvalue_table = np.asarray(eigenvalue_table)
            eigenstate_table = None
        else:
            func = functools.partial(self._esys_for_paramval,
                                     param_name=param_name,
                                     evals_count=evals_count)
            with InfoBar(
                    "Parallel computation of eigenvalues [num_cpus={}]".format(
                        num_cpus),
                    num_cpus,
            ):
                # Note that it is useful here that the outermost eigenstate object is
                # a list, as for certain applications the necessary hilbert space
                # dimension can vary with paramvals
                eigensystem_mapdata = list(
                    target_map(
                        func,
                        tqdm(
                            param_vals,
                            desc="Spectral data",
                            leave=False,
                            disable=tqdm_disable,
                        ),
                    ))
            eigenvalue_table, eigenstate_table = recast_esys_mapdata(
                eigensystem_mapdata)

        if subtract_ground:
            for param_index, _ in enumerate(param_vals):
                eigenvalue_table[param_index] -= eigenvalue_table[param_index][
                    0]

        setattr(self, param_name, previous_paramval)
        specdata = SpectrumData(
            eigenvalue_table,
            self.get_initdata(),
            param_name,
            param_vals,
            state_table=eigenstate_table,
        )
        if filename:
            specdata.filewrite(filename)

        return SpectrumData(
            eigenvalue_table,
            self.get_initdata(),
            param_name,
            param_vals,
            state_table=eigenstate_table,
        )
Beispiel #7
0
    def get_spectrum_vs_paramvals(self,
                                  param_name,
                                  param_vals,
                                  evals_count=6,
                                  subtract_ground=False,
                                  get_eigenstates=False,
                                  filename=None,
                                  num_cpus=settings.NUM_CPUS):
        """Calculates eigenvalues/eigenstates for a varying system parameter, given an array of parameter values.
        Returns a `SpectrumData` object with `energy_data[n]` containing eigenvalues calculated for
        parameter value `param_vals[n]`.

        Parameters
        ----------
        param_name: str
            name of parameter to be varied
        param_vals: ndarray
            parameter values to be plugged in
        evals_count: int, optional
            number of desired eigenvalues (sorted from smallest to largest) (default value = 6)
        subtract_ground: bool, optional
            if True, eigenvalues are returned relative to the ground state eigenvalue (default value = False)
        get_eigenstates: bool, optional
            return eigenstates along with eigenvalues (default value = False)
        filename: str, optional
            file name if direct output to disk is wanted
        num_cpus: int, optional
            number of cores to be used for computation (default value: settings.NUM_CPUS)

        Returns
        -------
        SpectrumData object
        """
        previous_paramval = getattr(self, param_name)

        target_map = get_map_method(num_cpus)
        if get_eigenstates:
            func = functools.partial(self._esys_for_paramval,
                                     param_name=param_name,
                                     evals_count=evals_count)
            with InfoBar(
                    "Parallel computation of eigenvalues [num_cpus={}]".format(
                        num_cpus), num_cpus):
                eigensystem_mapdata = list(
                    target_map(
                        func,
                        tqdm(param_vals,
                             desc='Spectral data',
                             leave=False,
                             disable=(num_cpus > 1))))
            eigenvalue_table, eigenstate_table = recast_esys_mapdata(
                eigensystem_mapdata)
        else:
            func = functools.partial(self._evals_for_paramval,
                                     param_name=param_name,
                                     evals_count=evals_count)
            with InfoBar(
                    "Parallel computation of eigensystems [num_cpus={}]".
                    format(num_cpus), num_cpus):
                eigenvalue_table = list(
                    target_map(
                        func,
                        tqdm(param_vals,
                             desc='Spectral data',
                             leave=False,
                             disable=(num_cpus > 1))))
            eigenvalue_table = np.asarray(eigenvalue_table)
            eigenstate_table = None

        if subtract_ground:
            for param_index, _ in enumerate(param_vals):
                eigenvalue_table[param_index] -= eigenvalue_table[param_index,
                                                                  0]

        setattr(self, param_name, previous_paramval)
        specdata = SpectrumData(eigenvalue_table,
                                self._get_metadata_dict(),
                                param_name,
                                param_vals,
                                state_table=eigenstate_table)
        if filename:
            specdata.filewrite(filename)

        return SpectrumData(eigenvalue_table,
                            self._get_metadata_dict(),
                            param_name,
                            param_vals,
                            state_table=eigenstate_table)