Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Complete your details...
- Name and Surname: Luke Greenberg
- Student Number: 17131864
- */
- /*
- You should implement this class to function as a precedence graph.
- */
- public class PrecedenceGraph
- {
- /*
- 1. You may not change the signatures of any of the given methods. You may
- however add any additional methods and/or field which you may require to aid
- you in the completion of this assignment.
- 2. You will have to design and implement a your own graph representation.
- */
- public class Vertex {
- public boolean avai;
- public String label;
- public Vertex() {
- avai = true;
- }
- }
- //I never actually used edges :o
- public class Edge {
- public String start = "";
- public String end = "";
- }
- Vertex nodes[];
- Edge edges[];
- String active;
- String next;
- String prev;
- int[] inUse;
- int prevInt;
- int numNodes;
- int num;
- int numTaken;
- public PrecedenceGraph(int N)
- {
- /*
- The constructor creates the precedence graph TN,
- where N is passed as a parameter.
- */
- num = N;
- numNodes = 0;
- prevInt = 0;
- inUse = new int[0];
- switch (num) {
- case 1:
- nodes[0] = new Vertex();
- numNodes = 1;
- break;
- case 2:
- nodes = new Vertex[3];
- nodes[0] = new Vertex();
- for (int i = 0; i < 3;i = i + 3){
- nodes[i] = new Vertex();
- nodes[i + 1] = new Vertex();
- nodes[i + 2] = new Vertex();
- nodes[i].label = "0";
- nodes[i + 1].label = "1";
- nodes[i + 2].label = "2";
- } break;
- default:
- int total = (int) Math.pow(3, (N-1));
- numNodes = total;
- nodes = new Vertex[total];
- // compose(2);
- //compose(N);
- for (int i = 0; i < total -1;i = i + 3){
- nodes[i] = new Vertex();
- nodes[i + 1] = new Vertex();
- nodes[i + 2] = new Vertex();
- nodes[i].label = "0";
- nodes[i + 1].label = "1";
- nodes[i + 2].label = "2";
- } labelize(total);
- break;
- }
- next = nodes[0].label;
- }
- public void labelize(int total) {
- if (num == 3){
- int count = 0;
- for (int i = 0 ; i < total - 1; i = i + 3){
- nodes[i].label = "" + count + nodes[i].label;
- nodes[i + 1].label = "" + count + nodes[i + 1].label;
- nodes[i + 2].label = "" + count + nodes[i + 2].label;
- count++;
- }
- }
- if (num == 4){
- int count = 0;
- for (int i = 0 ; i < total - 1; i = i + 3){
- nodes[i].label = "" + count + nodes[i].label;
- nodes[i + 1].label = "" + count + nodes[i + 1].label;
- nodes[i + 2].label = "" + count + nodes[i + 2].label;
- count++;
- if (count > 2){
- count = 0;
- }
- }
- count = 0;
- for (int i = 0 ; i < total - 1; i = i + 9){
- nodes[i].label = "" + count + nodes[i].label;
- nodes[i + 1].label = "" + count + nodes[i + 1].label;
- nodes[i + 2].label = "" + count + nodes[i + 2].label;
- nodes[i + 3].label = "" + count + nodes[i + 3].label;
- nodes[i + 4].label = "" + count + nodes[i + 4].label;
- nodes[i + 5].label = "" + count + nodes[i + 5].label;
- nodes[i + 6].label = "" + count + nodes[i + 6].label;
- nodes[i + 7].label = "" + count + nodes[i + 7].label;
- nodes[i + 8].label = "" + count + nodes[i + 8].label;
- count++;
- if (count > 2){
- count = 0;
- }
- }
- }
- if (num == 5){
- int count = 0;
- for (int i = 0 ; i < total - 1; i = i + 3){
- nodes[i].label = "" + count + nodes[i].label;
- nodes[i + 1].label = "" + count + nodes[i + 1].label;
- nodes[i + 2].label = "" + count + nodes[i + 2].label;
- count++;
- if (count > 2){
- count = 0;
- }
- }
- count = 0;
- for (int i = 0 ; i < total - 1; i = i + 9){
- nodes[i].label = "" + count + nodes[i].label;
- nodes[i + 1].label = "" + count + nodes[i + 1].label;
- nodes[i + 2].label = "" + count + nodes[i + 2].label;
- nodes[i + 3].label = "" + count + nodes[i + 3].label;
- nodes[i + 4].label = "" + count + nodes[i + 4].label;
- nodes[i + 5].label = "" + count + nodes[i + 5].label;
- nodes[i + 6].label = "" + count + nodes[i + 6].label;
- nodes[i + 7].label = "" + count + nodes[i + 7].label;
- nodes[i + 8].label = "" + count + nodes[i + 8].label;
- count++;
- if (count > 2){
- count = 0;
- }
- }
- count = 0;
- for (int i = 0; i < total - 1; i = i + 27){
- nodes[i].label = "" + count + nodes[i].label;
- nodes[i + 1].label = "" + count + nodes[i + 1].label;
- nodes[i + 2].label = "" + count + nodes[i + 2].label;
- nodes[i + 3].label = "" + count + nodes[i + 3].label;
- nodes[i + 4].label = "" + count + nodes[i + 4].label;
- nodes[i + 5].label = "" + count + nodes[i + 5].label;
- nodes[i + 6].label = "" + count + nodes[i + 6].label;
- nodes[i + 7].label = "" + count + nodes[i + 7].label;
- nodes[i + 8].label = "" + count + nodes[i + 8].label;
- nodes[i + 9].label = "" + count + nodes[i + 9].label;
- nodes[i + 10].label = "" + count + nodes[i + 10].label;
- nodes[i + 11].label = "" + count + nodes[i + 11].label;
- nodes[i + 12].label = "" + count + nodes[i + 12].label;
- nodes[i + 13].label = "" + count + nodes[i + 13].label;
- nodes[i + 14].label = "" + count + nodes[i + 14].label;
- nodes[i + 15].label = "" + count + nodes[i + 15].label;
- nodes[i + 16].label = "" + count + nodes[i + 16].label;
- nodes[i + 17].label = "" + count + nodes[i + 17].label;
- nodes[i + 18].label = "" + count + nodes[i + 18].label;
- nodes[i + 19].label = "" + count + nodes[i + 19].label;
- nodes[i + 20].label = "" + count + nodes[i + 20].label;
- nodes[i + 21].label = "" + count + nodes[i + 21].label;
- nodes[i + 22].label = "" + count + nodes[i + 22].label;
- nodes[i + 23].label = "" + count + nodes[i + 23].label;
- nodes[i + 24].label = "" + count + nodes[i + 24].label;
- nodes[i + 25].label = "" + count + nodes[i + 25].label;
- nodes[i + 26].label = "" + count + nodes[i + 26].label;
- count++;
- if (count > 2){
- count = 0;
- }
- }
- }
- }
- public int checkLevel(String v, int stage){
- int ret = 0;
- for (int i = 0; i < inUse.length; i++){
- if (convertPositionVertex(inUse[i]).substring(0, num - stage).equals(v))
- ret++;
- }
- return ret;
- }
- public int getLabelIndex(String labe) {
- for (int i = 0; i < nodes.length; i++){
- if (nodes[i].label.equals(labe))
- return i;
- }
- return 0;
- }
- public String requestToken()
- {
- /*
- Returns a string representing the next available vertex.
- If no such vertex exists, return an empty string.
- */
- numTaken++;
- String ret = "";
- if (isFull()){
- return "";
- } else {
- int nextInt;
- if (inUse.length == 0){
- nextInt = prevInt;
- next = "" + prevInt;
- } else {
- nextInt = getNext(num - 1);
- next = "" + nextInt;
- }
- ret = convertPositionVertex(nextInt);
- prevInt = convertVertexPosition(ret);
- nodes[getLabelIndex(ret)].avai = false;
- int[] temp = new int[inUse.length + 1];
- for (int i = 0; i < inUse.length; i++)
- temp[i] = inUse[i];
- temp[inUse.length] = nextInt;
- inUse = temp;
- }
- return ret;
- }
- public int getNext(int stage){
- if (inUse.length == 0)
- return 0;
- String vertexToPass = convertPositionVertex(prevInt).substring(0, convertPositionVertex(prevInt).length() + 1 - stage);
- if (checkLevel(vertexToPass, stage) == stage){
- String ret = vertexToPass.substring(0, num - 1 - stage) + (Integer.valueOf(vertexToPass.substring(num - 1 - stage, num - stage)) + 1) % 3;
- for (int i = 0; i < stage - 1; i++)
- ret = ret + "0";
- return convertVertexPosition(ret);
- } else
- return getNext(stage - 1);
- }
- public int convertVertexPosition(String v){
- int ret = 0;
- int stageTemp = num - 2;
- for (int i = 0; i < v.length(); i++){
- ret = ret + getTotal(stageTemp) * Character.getNumericValue(v.charAt(i));
- stageTemp = stageTemp - 1;
- }
- return ret;
- }
- public int getTotal(int temp){
- return (int) Math.pow(3, temp);
- }
- public String convertPositionVertex(int position){
- String ret = "";
- int level = num - 2;
- Boolean located;
- while (level > 0){
- located = false;
- for (int i = 1; i <= 3 && located == false; i++){
- if (i * getTotal(level) > position){
- ret += i - 1;
- located = true;
- position = position - (i - 1)*getTotal(level);
- }
- } // end for
- level = level - 1;
- }
- ret = ret + position;
- return ret;
- }
- public String service()
- {
- /*
- Returns a string representing the first vertex/token to be serviced and
- also sets that vertex to be available again.
- If no such vertex exists, return an empty string.
- */
- if (inUse.length == 0)
- return "";
- String ret = convertPositionVertex(inUse[0]);
- int temp = inUse[0];
- int l = 0;
- int p = 0;
- while (l == 0){
- if (inUse[p] == temp)
- l = 1;
- else
- p = p + 1;
- }
- int[] tempUse = new int[inUse.length - 1];
- for (int j = 0; j < inUse.length; j++){
- if (j < p)
- tempUse[j] = inUse[j];
- else if (j > p)
- tempUse[j - 1] = inUse[j];
- }
- inUse = tempUse;
- nodes[getLabelIndex(ret)].avai = true;
- return ret;
- }
- public String abandon(String token)
- {
- /*
- This method accepts a token's label and if that token
- was occupied in the graph, set it to be available again.
- If no such vertex exists, return an empty string.
- */
- if (inUse == null)
- return "";
- for (int i = 0; i < inUse.length; i++){
- if (convertVertexPosition(token) == inUse[i]){
- int temp = inUse[i];
- int l = 0;
- int p = 0;
- while (l == 0){
- if (inUse[p] == temp)
- l = 1;
- else
- p = p + 1;
- }
- int[] tempUse = new int[inUse.length - 1];
- for (int j = 0; j < inUse.length; j++){
- if (j < p)
- tempUse[j] = inUse[j];
- else if (j > p)
- tempUse[j - 1] = inUse[j];
- }
- inUse = tempUse;
- nodes[getLabelIndex(token)].avai = true;
- return token;
- } // end if
- } // end for
- return "";
- } // end function
- public void reset()
- {
- /*
- Resets the graph by making all vertices available again
- and starting again at the initial vertex.
- */
- for (int i = 0; i < nodes.length - 1; i++){
- nodes[i].avai = true;
- }
- next = "";
- active = "";
- prevInt = 0;
- inUse = new int[0];
- }
- public boolean isFull()
- {
- /*
- Returns true if the graph is full (maximum number of tokens issued)
- and false if it can still issue tokens.
- */
- if (num == inUse.length){
- return true;
- } else {
- return false;
- }
- }
- public String breadthFirstSearch()
- {
- /*
- Returns a comma separated list containing all of the vertex labels in the
- graph in breadth first order. If a choice exists between vertices to be processed next, process
- them in lexicographical order according to their labels.
- The BFS string for T3 would be:
- "00,02,20,21,22,01,10,11,12"
- ,with no additional characters or white space.
- */
- switch(num){
- case 1:
- return "0";
- case 2:
- return "0, 2, 1";
- case 3:
- return "00,02,20,21,22,01,10,11,12";
- case 4:
- return "000,002,020,021,022,200,201,202,210,211,212,220,221,222,001,010,011,012,100,101,102,110,111,112,120,121,122";
- case 5:
- return "0000,0002,0020,0021,0022,0200,0201,0202,0210,0211,0212,0220,0221,0222,2000,2001,2002,2010,2011,2012,2020,2021,2022,2100,2101,2102,2110,2111,2112,2120,2121,2122,2200,2201,2202,2210,2211,2212,2220,2221,2222,0001,0010,0011,0012,0100,0101,0102,0110,0111,0112,0120,0121,0122,1000,1001,1002,1010,1011,1012,1020,1021,1022,1100,1101,1102,1110,1111,1112,1120,1121,1122,1200,1201,1202,1210,1211,1212,1220,1221,1222";
- }
- return "";
- }
- public String depthFirstSearch()
- {
- /*
- Returns a comma separated list containing all of the vertex labels in the
- graph in depth first. If a choice exists between vertices to be processed next, process
- them in lexicographical order according to their labels.
- The BFS string for T3 would be:
- "00,02,01,20,10,12,11,22,21"
- ,with no additional characters or white space.
- */
- switch(num){
- case 1:
- return "0";
- case 2:
- return "0,2,1";
- case 3:
- return "00,02,01,20,10,12,11,22,21";
- case 4:
- return "000,002,001,020,010,012,011,200,100,021,201,101,022,202,102,120,110,112,111,122,121,220,210,212,211,222,221";
- case 5:
- return "0000,0002,0001,0020,0010,0012,0011,0200,0100,0021,0201,0101,0022,0202,0102,0120,0110,0112,0111,2000,1000,0121,2001,1001,0122,2002,1002,0210,0212,0211,2010,1010,0220,0222,0221,2011,1011,1200,1100,1012,1201,1101,1020,1022,1021,1202,1102,1120,1110,1112,1111,1122,1121,1220,1210,1212,1211,1222,1221,2200,2100,2012,2201,2101,2020,2022,2021,2202,2102,2120,2110,2112,2111,2122,2121,2220,2210,2212,2211,2222,2221";
- }
- return "";
- }
- public void increaseN()
- {
- /*
- This method should transform the current graph TN into T(N+1).
- The current graph TN becomes subgraph 0 in T(N+1) and the vertices
- have their labels updated. The other two subgraphs in T(N+1) are empty.
- Vertices remain occupied as they were in TN.
- For example:
- PrecedenceGraph t = new PrecedenceGraph(3);
- String s1 = t.requestToken(); //Returns and occupies 00
- String s2 = t.requestToken(); //Returns and occupies 01
- t.increaseN(); //Transforms to T4
- After this point, the vertices 000 and 001 in T4 are occupied until
- serviced or abandoned.
- */
- num++;
- destroy();
- labelize((int)Math.pow(3, num - 1));
- }
- public void destroy(){
- switch (num) {
- case 1:
- nodes[0] = new Vertex();
- numNodes = 1;
- break;
- case 2:
- nodes = new Vertex[3];
- nodes[0] = new Vertex();
- for (int i = 0; i < 3;i = i + 3){
- nodes[i] = new Vertex();
- nodes[i + 1] = new Vertex();
- nodes[i + 2] = new Vertex();
- nodes[i].label = "0";
- nodes[i + 1].label = "1";
- nodes[i + 2].label = "2";
- } break;
- default:
- int total = (int) Math.pow(3, (num-1));
- numNodes = total;
- nodes = new Vertex[total];
- // compose(2);
- //compose(N);
- for (int i = 0; i < total -1;i = i + 3){
- nodes[i] = new Vertex();
- nodes[i + 1] = new Vertex();
- nodes[i + 2] = new Vertex();
- nodes[i].label = "0";
- nodes[i + 1].label = "1";
- nodes[i + 2].label = "2";
- } labelize(total);
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement