Esempio n. 1
0
        private void Matrix_Click(object sender, RoutedEventArgs e)
        {
            /*
             * Complex[] values = new Complex[MatrixDefinition.Rows*MatrixDefinition.Columns];
             * for(int i = 0; i < MatrixDefinition.Columns; i++ )
             *  for(int j = 0; j < MatrixDefinition.Rows; j++)
             *      values[i * MatrixDefinition.Rows + j] = ComplexParser.FromString(MatrixDefinition[j, i]);
             * Transformation transformation = Transformation.FromValuesColumnMajor(values, MatrixDefinition.Columns);
             * _circuit.DefineUnitaryGateModel((int)QubitsBox.SelectedItem, false, new StandardGateSymbol(MatrixName.Text), transformation, _circuit.CustomGates);
             */
            ErrorMessage.Visibility = Visibility.Collapsed;
            Complex[, ] values      = new Complex[MatrixDefinition.Rows, MatrixDefinition.Columns];
            for (int i = 0; i < MatrixDefinition.Columns; i++)
            {
                for (int j = 0; j < MatrixDefinition.Rows; j++)
                {
                    try { values[i, j] = ComplexParser.FromString(MatrixDefinition[i, j]); }
                    catch (FormatException)
                    {
                        ErrorMessage.Content    = string.Format($"Value at [{0}, {1}] could not be parsed", i, j);
                        ErrorMessage.Visibility = Visibility.Visible;
                        return;
                    }
                }
            }
            if (!Transformation.IsUnitary(values))
            {
                ErrorMessage.Content    = "Defined matrix is not unitary";
                ErrorMessage.Visibility = Visibility.Visible;
                return;
            }
            Transformation transformation = Transformation.FromValues(values);

            _circuit.DefineUnitaryGateModel((int)QubitsBox.SelectedItem, false, new StandardGateSymbol(MatrixName.Text), transformation, _circuit.CustomGates);
        }
Esempio n. 2
0
        private void CoefficientsCreate_Click(object sender, RoutedEventArgs e)
        {
            ErrorMessage.Visibility = Visibility.Collapsed;
            Complex[,] coefs        = new Complex[2, 1];
            double phase;

            try
            {
                coefs[0, 0] = ComplexParser.FromString(Alpha.Text);
                coefs[1, 0] = ComplexParser.FromString(Beta.Text);
                phase       = double.Parse(Phase.Text);
            } catch (FormatException)
            {
                ErrorMessage.Content    = "Inserted value(s) could not be parsed";
                ErrorMessage.Visibility = Visibility.Visible;
                return;
            }
            if (coefs[0, 0] == Complex.Zero && coefs[1, 0] == Complex.Zero)
            {
                ErrorMessage.Content    = "At least one of alpha/beta must be nonzero";
                ErrorMessage.Visibility = Visibility.Visible;
                return;
            }
            Transformation transformation = Transformation.FromCoefficients(coefs[0, 0], coefs[1, 0], phase);

            _circuit.DefineUnitaryGateModel(1, false, new StandardGateSymbol(MatrixName.Text), transformation, _circuit.CustomGates);
        }
Esempio n. 3
0
        private Complex[, ] ReadTextMatrix()
        {
            int rows = MatrixDefinition.Rows, cols = MatrixDefinition.Columns;

            Complex[, ] values = new Complex[rows, cols];
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    try { values[i, j] = ComplexParser.FromString(MatrixDefinition[i, j]); }
                    catch (FormatException)
                    {
                        ErrorMessage.Content    = string.Format($"Value at [{0}, {1}] could not be parsed", i, j);
                        ErrorMessage.Visibility = Visibility.Visible;
                        return(null);
                    }
                }
            }
            return(values);
        }