#!/usr/bin/python

# This script generates matrices to solve a set of equations with n variables and n unknowns.
# For each iteration, an n x n matrix and a 1 x n vector are created to describe the set of
# equations in the form:
#
#              a0x + b0y + c0z + d0w = e0
#              a1x + b1y + c1z + d1w = e1
#              a2x + b2y + c2z + d2w = e2
#              a3x + b3y + c3z + d3w = e3
#
# where in this case n=4.
#
# The files that are produced contain the dimension in line one, followed by
# the n x n coefficient matrix, the 1 x n vector, and the 1 x n solution.
# Each output file has the name matrixN.txt, where N is the value of n (e.g., matrix4.txt)
#
# The n x n matrix values and solution vector are confined to the values -0.9 to 0.9 
# (one decimal place), but the 1 x n vector can have two decimal place values.
# 
# usage:
# ./matrixGenerator a b c
#
# where a is the start value for n, b is the end value for n, and c is the step
#
# For example:
#
# ./matrixGenerator 16 256 4
#
# produces matrix16.txt, matrix20.txt, ... , matrix252.txt, matrix256.txt
#
# If there are no arguments, a is assumed to be 4 and only matrix4.txt is produced
# If only a is present, only that matrix is produced
# If a and b are present but not c, a step value of 1 is assumed

import random
import sys

a = 4
b = 4
c = 1

# parse command line
try:
    a = int(sys.argv[1])
    b = a+1
    b = int(sys.argv[2])+1
    c = int(sys.argv[3])
except IndexError:
    pass
except ValueError:
    pass

for sqSize in range(a,b,c):
	#size = 100
	#size = sqSize*sqSize
	size = sqSize;
	print (size)
	solnVec = []
	matrix = []
	bVector = []
	
	filename = "matrix"+str(size)+".txt"
	#f = open("matrix100.txt",'w')
	f = open(filename,'w')
	f.write(str(size)+"\n\n")
	for i in range(size):
		#solnVec.append(random.randint(-size,size)/float(size))
		solnVec.append(random.randint(-10,10)/float(10))
	
	for i in range(size):
		matrixRow = []
		for j in range(size):
			#matrixRow.append(random.randint(-size,size)/float(size))
			matrixRow.append(random.randint(-10,10)/float(10))
		matrix.append(matrixRow)
	
	for i in matrix:
		linResult = 0
		for j in range(size):
			f.write(str(i[j])+"\t")
			linResult+=i[j]*solnVec[j]
		bVector.append(linResult)
		f.write("\n")
	
	f.write("\n")
	for i in bVector:
		f.write(str(i)+"\t")
	
	f.write("\n\n");
	for i in solnVec:
		f.write(str(i)+"\t")
	f.write("\n\n")
	
	f.close()
