Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
- name: Setup Java
uses: actions/setup-java@v3
with:
java-version: 21
java-version: 23
distribution: 'oracle'
cache: 'maven'
server-id: ossrh
Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.source>23</maven.compiler.source>
<maven.compiler.target>23</maven.compiler.target>
<javadoc.plugin.version>3.10.1</javadoc.plugin.version>
<gpg.plugin.version>1.6</gpg.plugin.version>
</properties>
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/redfx/strange/Gate.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,10 @@ public interface Gate {
*/
public int getMainQubitIndex();

default Qubit getQubit() {return null;}
default Qubit getSecondQubit() {return null;}
default Qubit getThirdQubit() {return null;}

/**
* <p>setAdditionalQubit.</p>
*
Expand Down
51 changes: 51 additions & 0 deletions src/main/java/org/redfx/strange/Program.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public class Program {
private Result result;
private double[] initAlpha;

private Qubit[] qubits;
private final ArrayList<Step> steps = new ArrayList<>();

// cache decomposedSteps
Expand All @@ -72,11 +73,26 @@ public class Program {
*/
public Program(int nQubits, Step... moreSteps) {
this.numberQubits = nQubits;
this.qubits = new Qubit[nQubits];
for (int i = 0; i < nQubits; i++) {
this.qubits[i] = new Qubit();
}
this.initAlpha = new double[numberQubits];
Arrays.fill(initAlpha, 1d);
addSteps(moreSteps);
}

public Program(Qubit... qubits) {
this.qubits = qubits;
this.numberQubits = qubits.length;
this.initAlpha = new double[numberQubits];
Arrays.fill(initAlpha, 1d);
}

public Qubit[] getQubits() {
return this.qubits;
}

/**
* Initialize this qubit. The qubit will be in a state
* \psi = \alpha |0 &gt; + \beta |1 &gt; .
Expand Down Expand Up @@ -118,12 +134,47 @@ public void addStep(Step step) {
if (!ensureMeasuresafe( Objects.requireNonNull(step)) ) {
throw new IllegalArgumentException ("Adding a superposition step to a measured qubit");
}
List<Gate> gates = step.getGates();
for (Gate gate : gates) {
System.err.println("gate = "+gate);
Qubit candidate = gate.getQubit();
if (candidate != null) {
int ibq = getIndexByQubit(candidate);
gate.setMainQubitIndex(ibq);
} else {
continue;
}
candidate = gate.getSecondQubit();
if (candidate != null) {
getIndexByQubit(candidate);
gate.setAdditionalQubit(getIndexByQubit(candidate), 1);
} else {
continue;
}
candidate = gate.getThirdQubit();
if (candidate != null) {
getIndexByQubit(candidate);
gate.setAdditionalQubit(getIndexByQubit(candidate), 2);
} else {
continue;
}
}
step.setIndex(steps.size());
step.setProgram(this);
steps.add(step);
this.decomposedSteps = null;
}

private int getIndexByQubit(Qubit q) {
if (this.qubits == null) return -1;
for (int i = 0; i < this.qubits.length; i++) {
if (q.equals(this.qubits[i])) {
return i;
}
}
return -1;
}

/**
* Adds multiple steps with one or more gates to the existing program.
* In case the Step contains an operation that would put a measured qubit into a potential superposition
Expand Down
18 changes: 14 additions & 4 deletions src/main/java/org/redfx/strange/gate/Cnot.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.redfx.strange.Complex;
import org.redfx.strange.ControlledGate;
import org.redfx.strange.Gate;
import org.redfx.strange.Qubit;

/**
* <p>Cnot class.</p>
Expand All @@ -44,9 +45,9 @@
*/
public class Cnot extends TwoQubitGate implements ControlledGate {

private final Gate rootGate;
private final int rootGateIndex;
private final int controlIndex;
private Gate rootGate;
private int rootGateIndex;
private int controlIndex;

Complex[][] matrix = new Complex[][]{
{Complex.ONE,Complex.ZERO,Complex.ZERO,Complex.ZERO},
Expand All @@ -68,6 +69,11 @@ public Cnot (int controlQubitIndex, int mainQubitIndex) {
this.rootGate = new X(mainQubitIndex);
}

public Cnot(Qubit controlQubit, Qubit targetQubit) {
super(controlQubit, targetQubit);
this.rootGate = new X(0);
}

@Override public int getSize() {return 1;}
/** {@inheritDoc} */
@Override
Expand All @@ -94,7 +100,11 @@ public int getRootGateIndex() {
public int getMainQubitIndex() {
return this.rootGateIndex;
}

@Override
public void setAdditionalQubit(int idx, int cnt) {
super.setAdditionalQubit(idx, cnt);
setMainQubitIndex(idx);
}
@Override
public Gate getRootGate() {
return rootGate;
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/redfx/strange/gate/Hadamard.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
package org.redfx.strange.gate;

import org.redfx.strange.Complex;
import org.redfx.strange.Qubit;

/**
* <p>Hadamard class.</p>
Expand All @@ -53,6 +54,9 @@ public Hadamard (int idx) {
super(idx);
}

public Hadamard (Qubit q) {
super(q);
}
/** {@inheritDoc} */
@Override
public Complex[][] getMatrix() {
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/org/redfx/strange/gate/SingleQubitGate.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

import java.util.Collections;
import java.util.List;
import org.redfx.strange.Qubit;

/**
*
Expand All @@ -48,13 +49,17 @@
public abstract class SingleQubitGate implements Gate {

protected int idx;
Qubit qubit;
private boolean inverse;

/**
* <p>Constructor for SingleQubitGate.</p>
*/
public SingleQubitGate() {}


public SingleQubitGate(Qubit q) {
this.qubit = q;
}
/**
* <p>Constructor for SingleQubitGate.</p>
*
Expand All @@ -64,6 +69,10 @@ public SingleQubitGate (int idx) {
this.idx = idx;
}

public Qubit getQubit() {
return qubit;
}

/** {@inheritDoc} */
@Override
public int getMainQubitIndex() {
Expand Down
32 changes: 29 additions & 3 deletions src/main/java/org/redfx/strange/gate/ThreeQubitGate.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.redfx.strange.Qubit;

/**
*
Expand All @@ -51,7 +52,11 @@ public abstract class ThreeQubitGate implements Gate {
private int first;
private int second;
private int third;


private Qubit mainQubit;
private Qubit secondQubit;
private Qubit thirdQubit;

/**
* <p>Constructor for ThreeQubitGate.</p>
*/
Expand All @@ -69,7 +74,28 @@ public ThreeQubitGate (int first, int second, int third) {
this.second = second;
this.third = third;
}
@Override
public Qubit getQubit() {
return mainQubit;
}

@Override
public Qubit getSecondQubit() {
return secondQubit;
}

@Override
public Qubit getThirdQubit() {
return thirdQubit;
}

public ThreeQubitGate (Qubit mainQubit, Qubit secondQubit, Qubit thirdQubit) {
this.mainQubit = mainQubit;
this.secondQubit = secondQubit;
this.thirdQubit = thirdQubit;
}


/** {@inheritDoc} */
@Override
public void setMainQubitIndex(int idx) {
Expand Down Expand Up @@ -106,7 +132,7 @@ public int getMainQubit() {
*
* @return a int
*/
public int getSecondQubit() {
public int getSecondQubitIndex() {
return this.second;
}

Expand All @@ -115,7 +141,7 @@ public int getSecondQubit() {
*
* @return a int
*/
public int getThirdQubit() {
public int getThirdQubitIndex() {
return this.third;
}

Expand Down
26 changes: 26 additions & 0 deletions src/main/java/org/redfx/strange/gate/TwoQubitGate.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@

import java.util.Arrays;
import java.util.List;
import org.redfx.strange.Qubit;

/**
*
Expand All @@ -51,6 +52,9 @@ public abstract class TwoQubitGate implements Gate {
private int second;
private int highest = -1;
private boolean inverse;

private Qubit mainQubit;
private Qubit secondQubit;

/**
* <p>Constructor for TwoQubitGate.</p>
Expand All @@ -69,10 +73,29 @@ public TwoQubitGate (int first, int second) {
this.highest = Math.max(first, second);
}

@Override
public Qubit getQubit() {
return mainQubit;
}

@Override
public Qubit getSecondQubit() {
return secondQubit;
}

public TwoQubitGate (Qubit mainQubit, Qubit secondQubit) {
this.mainQubit = mainQubit;
this.secondQubit = secondQubit;
}


/** {@inheritDoc} */
@Override
public void setMainQubitIndex(int idx) {
this.first = idx;
if (idx > highest) {
this.highest = idx;
}
}

/** {@inheritDoc} */
Expand All @@ -85,6 +108,9 @@ public int getMainQubitIndex() {
@Override
public void setAdditionalQubit(int idx, int cnt) {
this.second = idx;
if (idx > highest) {
this.highest = idx;
}
}


Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/redfx/strange/gate/X.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
package org.redfx.strange.gate;

import org.redfx.strange.Complex;
import org.redfx.strange.Qubit;

/**
* <p>X class.</p>
Expand All @@ -53,6 +54,10 @@ public X (int idx) {
super(idx);
}

public X(Qubit q) {
super(q);
}

/** {@inheritDoc} */
@Override
public Complex[][] getMatrix() {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/org/redfx/strange/local/Computations.java
Original file line number Diff line number Diff line change
Expand Up @@ -208,8 +208,8 @@ public static List<Step> decomposeStep(Step s, int nqubit) {
} else if (gate instanceof ThreeQubitGate) {
ThreeQubitGate tqg = (ThreeQubitGate) gate;
int first = tqg.getMainQubit();
int second = tqg.getSecondQubit();
int third = tqg.getThirdQubit();
int second = tqg.getSecondQubitIndex();
int third = tqg.getThirdQubitIndex();
int sFirst = first;
int sSecond = second;
int sThird = third;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ private Complex[] applyStep (Step step, Complex[] vector, Qubit[] qubits) {
PermutationGate pg = (PermutationGate)gates.get(0);
return Computations.permutateVector (vector, pg.getIndex1(), pg.getIndex2());
}

Complex[] result = new Complex[vector.length];
boolean vdd = true;
result = Computations.calculateNewState(gates, vector, qubits.length);
Expand Down
Loading
Loading