public override void VisitMatrixTransposeElement(MatrixTranspose element) { if (element.getvariable() != null) { VisitElement(element.getvariable()); Object obj_rhs = getTopOfStack_Matrix(); //Object result = new Object(); MatrixVariableDeclaration mat = (MatrixVariableDeclaration)(obj_rhs); MatrixVariableDeclaration transpose = new MatrixVariableDeclaration(); transpose.setType(mat.getType()); int rhs_type = GetTypeOfElement((Element)obj_rhs); if (rhs_type == 3) { if (mat.getType() == "int") { int[,] mat_elem = mat.getintValue(); int row = int.Parse(((IntegerElement)(mat.getRow())).getText()); int col = int.Parse(((IntegerElement)(mat.getColumn())).getText()); int[,] trans_elem = new int[col, row]; transpose.setRow(mat.getColumn()); transpose.setColumn(mat.getRow()); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) trans_elem[j, i] = mat_elem[i, j]; } Console.Write("\n"); transpose.setIntMatrix(trans_elem); int[,] trans = transpose.getintValue(); int trans_row = int.Parse(((IntegerElement)(transpose.getRow())).getText()); int trans_col = int.Parse(((IntegerElement)(transpose.getColumn())).getText()); Console.Write("Transpose of the given matrix is : \n\n"); //result("Transpose of the matrix\n"); for (int i = 0; i < trans_row; i++) { for (int j = 0; j < trans_col; j++) { Console.Write("\t" + trans[i, j]); // result("\t" + trans[i, j].ToString()); } Console.Write("\n"); //result("\n"); } } else if (mat.getType() == "double") { double[,] mat_elem = mat.getdoubleValue(); int row = int.Parse(((IntegerElement)(mat.getRow())).getText()); int col = int.Parse(((IntegerElement)(mat.getColumn())).getText()); double[,] trans_elem = new double[col, row]; transpose.setRow(mat.getColumn()); transpose.setColumn(mat.getRow()); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) trans_elem[j, i] = mat_elem[i, j]; } Console.Write("\n"); //result("\n"); transpose.setDoubleMatrix(trans_elem); double[,] trans = transpose.getdoubleValue(); int trans_row = int.Parse(((IntegerElement)(transpose.getRow())).getText()); int trans_col = int.Parse(((IntegerElement)(transpose.getColumn())).getText()); //result( "Transpose of the given matrix\n"); Console.Write("Transpose of the given matrix is : \n\n"); for (int i = 0; i < trans_row; i++) { for (int j = 0; j < trans_col; j++) { Console.Write("\t" + trans[i, j]); // result( "\t" + trans[i, j].ToString()); } Console.Write("\n"); //result("\n"); } } Object result = (Object)(transpose); mat_stack.Push(result); } } else { Console.Write("Matrix needs to be decalred first.. try again.. "); sendres(112, "Matrix needs to be declared first.. try again..\n"); } }
public override void VisitMultiplicationElement(MultiplicationElement element) { if (element.getRhs() == null) { Element var_name = element.getLhs(); VisitElement(var_name); } else { if (inParallelFor == 1) { ParallelMul(element); return; } else { VisitElement(element.getLhs()); VisitElement(element.getRhs()); if (mat_stack.Count >= 2) { Object obj_rhs = getTopOfStack_Matrix(); Object obj_lhs = getTopOfStack_Matrix(); int rhs_type = GetTypeOfElement((Element)obj_rhs); int lhs_type = GetTypeOfElement((Element)obj_lhs); if (rhs_type == 3 && lhs_type == 3) // check whether both are matrices or not { MatrixVariableDeclaration stk_rhs = (MatrixVariableDeclaration)(obj_rhs); MatrixVariableDeclaration stk_lhs = (MatrixVariableDeclaration)(obj_lhs); MatrixVariableDeclaration final = new MatrixVariableDeclaration(); //Object output = new Object(); if (stk_lhs.getType() == stk_rhs.getType()) { IntegerElement lRow = (IntegerElement)(stk_lhs.getRow()); IntegerElement lCol = (IntegerElement)(stk_lhs.getColumn()); IntegerElement rRow = (IntegerElement)(stk_rhs.getRow()); IntegerElement rCol = (IntegerElement)(stk_rhs.getColumn()); int lhs_row = int.Parse(((IntegerElement)(stk_lhs.getRow())).getText()); int lhs_col = int.Parse(((IntegerElement)(stk_lhs.getColumn())).getText()); int rhs_row = int.Parse(((IntegerElement)(stk_rhs.getRow())).getText()); int rhs_col = int.Parse(((IntegerElement)(stk_rhs.getColumn())).getText()); if (lhs_col == rhs_row) { final.setRow(lRow); final.setColumn(rCol); final.setType(stk_lhs.getType()); Console.Write("Multiplication..\n"); string mat_type = stk_lhs.getType(); if (mat_type == "int") { int[,] lhs_elem = stk_lhs.getintValue(); int[,] rhs_elem = stk_rhs.getintValue(); int[,] result = new int[lhs_row, rhs_col]; for (int i = 0; i < lhs_row; i++) { for (int j = 0; j < rhs_col; j++) { for (int k = 0; k < lhs_col; k++) { int res = lhs_elem[i, k] * rhs_elem[k, j]; result[i, j] = result[i, j] + res; } } } bool mat_set = final.setIntMatrix(result); int[,] output = final.getintValue(); int row = int.Parse(((IntegerElement)(final.getRow())).getText()); int col = int.Parse(((IntegerElement)(final.getColumn())).getText()); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { Console.Write("\t" + output[i, j]); } Console.Write("\n"); } Object final_output = (Object)(final); mat_stack.Push(final_output); } else if (mat_type == "double") { double[,] lhs_elem = stk_lhs.getdoubleValue(); double[,] rhs_elem = stk_rhs.getdoubleValue(); double[,] result = new double[lhs_row, rhs_col]; for (int i = 0; i < lhs_row; i++) { for (int j = 0; j < rhs_col; j++) { for (int k = 0; k < lhs_col; k++) { double res = lhs_elem[i, k] * rhs_elem[k, j]; result[i, j] = result[i, j] + res; } } } bool mat_set = final.setDoubleMatrix(result); double[,] output = final.getdoubleValue(); int row = int.Parse(((IntegerElement)(final.getRow())).getText()); int col = int.Parse(((IntegerElement)(final.getColumn())).getText()); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { Console.Write("\t" + output[i, j]); } Console.Write("\n"); } Object final_output = (Object)(final); mat_stack.Push(final_output); } } else { Console.Write("Matrix dimensions does not match for multiplication.. try again.. \n"); sendres(112, "Matrix dimensions does not match for multiplication.. try again.. \n"); } } else { Console.Write("Matrix types are different.. try again.. "); sendres(112, "Matrix types are different.. try again..\n"); } } else if (lhs_type == (int)datatypes.DoubleElement && rhs_type == (int)datatypes.DoubleElement) PerformDoubleMultiplication(obj_rhs, obj_lhs); else if (lhs_type == (int)datatypes.IntElement && rhs_type == (int)datatypes.IntElement) PerformIntMultiplication(obj_rhs, obj_lhs); else { Console.Write("Scalar and Matrix cannot be multiplied.. \n"); sendres(112, "Scalar and Matrix cannot be multiplied.. ..\n"); } } } } //throw new NotImplementedException(); }
public override void VisitAdditionOperationElement(AdditiveElement element) { if (element.getRhs() == null) { VisitElement(element.getLhs()); } else { if (inParallelFor == 1) { ParallelAddition(element); return; } else { VisitElement(element.getLhs()); VisitElement(element.getRhs()); if (mat_stack.Count >= 2) { Object obj_rhs = getTopOfStack_Matrix(); Object obj_lhs = getTopOfStack_Matrix(); int rhs_type = GetTypeOfElement((Element)obj_rhs); int lhs_type = GetTypeOfElement((Element)obj_lhs); if (rhs_type == 3 && lhs_type == 3) { MatrixVariableDeclaration stk_rhs = (MatrixVariableDeclaration)(obj_rhs); MatrixVariableDeclaration stk_lhs = (MatrixVariableDeclaration)(obj_lhs); MatrixVariableDeclaration final = new MatrixVariableDeclaration(); if (stk_lhs != null && stk_rhs != null) { if (stk_lhs.getType() == stk_rhs.getType()) { IntegerElement lRow = (IntegerElement)(stk_lhs.getRow()); IntegerElement lCol = (IntegerElement)(stk_lhs.getColumn()); IntegerElement rRow = (IntegerElement)(stk_rhs.getRow()); IntegerElement rCol = (IntegerElement)(stk_rhs.getColumn()); int lhs_row = int.Parse(((IntegerElement)(stk_lhs.getRow())).getText()); int lhs_col = int.Parse(((IntegerElement)(stk_lhs.getColumn())).getText()); int rhs_row = int.Parse(((IntegerElement)(stk_rhs.getRow())).getText()); int rhs_col = int.Parse(((IntegerElement)(stk_rhs.getColumn())).getText()); if (lhs_row == rhs_row && lhs_col == rhs_col) { final.setRow(lRow); final.setColumn(lCol); final.setType(stk_lhs.getType()); Console.Write("Addition..\n"); Console.Write(element.getLhs().GetType()); string mat_type = stk_lhs.getType(); if (mat_type == "int") { int[,] rhs_elements = stk_rhs.getintValue(); int[,] lhs_elements = stk_lhs.getintValue(); int[,] output = new int[lhs_row, lhs_col]; for (int i = 0; i < lhs_row; i++) { for (int j = 0; j < lhs_col; j++) { output[i, j] = lhs_elements[i, j] + rhs_elements[i, j]; Console.Write(output[i, j]); Console.Write("\t"); } Console.Write("\n"); } bool mat_set = final.setIntMatrix(output); } else if (mat_type == "double") { double[,] rhs_elements = stk_rhs.getdoubleValue(); double[,] lhs_elements = stk_lhs.getdoubleValue(); // int[,] result = new int[lhs_row, lhs_col]; double[,] output = new double[lhs_row, lhs_col]; for (int i = 0; i < lhs_row; i++) { for (int j = 0; j < lhs_col; j++) { output[i, j] = lhs_elements[i, j] + rhs_elements[i, j]; Console.Write(output[i, j]); Console.Write("\t"); } Console.Write("\n"); } bool mat_set = final.setDoubleMatrix(output); } Object result = (Object)(final); mat_stack.Push(result); } // addition } else { Console.Write("Matrix dimensions does not match.. try again.. \n"); } } } else if (lhs_type == 2 && rhs_type == 2) { //Double PerformDoubleAddition(obj_rhs, obj_lhs); } else if (lhs_type == 1 || lhs_type==5 || rhs_type==1 || rhs_type==5 ) { //Int PerformIntAddition(obj_rhs, obj_lhs); } else { Console.Write("Scalar and matrix addition not possible\n"); sendres(112, "Scalar and matrix addition not possible\n"); } } else { Console.Write("Matrix types are different.. try again.. "); sendres(112, "Matrix types are different.. try again.. "); } } } }