-import urlparse
+import cgi
+from scipy import compress, transpose
+from scipy.linalg import svd, det
+import json
-import scipy
-import scipy.linalg
-from scipy import *
-
-def null(A, eps=1e-15):
- u, s, vh = scipy.linalg.svd(A)
+def calculate_nullspace(A, eps=1e-15):
+ u, s, vh = svd(A)
null_mask = (s <= eps)
- null_space = scipy.compress(null_mask, vh, axis=0)
- return scipy.transpose(null_space)
+ null_space = compress(null_mask, vh, axis=0)
+ return transpose(null_space)
-def eigenvalues(A, eps=1e-15):
- u, s, vh = scipy.linalg.svd(A)
+def calculate_eigenvalues(A, eps=1e-15):
+ u, s, vh = svd(A)
return s
-def application(environ, start_response):
- if environ['REQUEST_METHOD'] == 'POST':
- post_data = environ['wsgi.input'].read()
-
- output = "<pre>"
- #output += post_data
- output += "<br>"
-
- post_data = urlparse.parse_qsl(post_data, True, True)
+def fail(start_response, message):
+ start_response('400 Bad Request', [])
+ return 'error: ' + message
- data_string = str(post_data[0][1])
- data_rows = data_string.splitlines()
- for index, row in enumerate(data_rows):
- data_rows[index] = row.split()
-
- given_matrix = data_rows
- null_space = null(given_matrix)
- try:
- null_space = null_space / null_space.max()
- except:
- pass
-
-# la, v = scipy.linalg.eig(given_matrix)
-# output += "eigenvalues:<br>"
-# for l in la:
-# output += str(l)
- determinant = scipy.linalg.det(given_matrix)
-
- output += "<h1>"
- output += "nullspace:<br>"
- output += str(null_space)
- output += "<br><br>"
- output += "eigenvalues:<br>"
- output += str(eigenvalues(given_matrix))
- output += "<br><br>"
- output += "determinant:<br>"
- output += str(determinant)
-# output += "<br><br>"
-# output += "eigenvalues:<br>"
-# output += str(l1)
-# output += "<br><br>"
-# output += "eigenvectors:<br>"
-# output += str(v[:,0][0])
- output += "</h1>"
+def application(environ, start_response):
+ parameters = cgi.parse_qs(environ.get('QUERY_STRING'))
+
+ if not 'matrix' in parameters or parameters['matrix'] == '':
+ return fail(start_response, 'missing matrix')
+ query_string = str(parameters['matrix'][0])
+ matrix = query_string.splitlines()
+ for index, row in enumerate(matrix):
+ matrix[index] = row.split()
+ if len(matrix[index]) != len(matrix[0]):
+ return fail(start_response, 'ragged matrix')
+ for index, n in enumerate(matrix[index]):
+ try: float(n)
+ except ValueError:
+ return fail(start_response, 'invalid matrix element')
+
+ while len(matrix) < len(matrix[0]):
+ matrix.append([0]*len(matrix[0]))
+
+ nullspace = calculate_nullspace(matrix)
+ if nullspace.max() != 0:
+ nullspace = nullspace / nullspace.max()
+
+ eigenvalues = calculate_eigenvalues(matrix)
+ determinant = det(matrix)
+
+ output = json.dumps({
+ 'nullspace' : str(nullspace),
+ 'eigenvalues' : str(eigenvalues),
+ 'determinant' : str(determinant)
+ })
- # send results
output_len = sum(len(line) for line in output)
- start_response('200 OK', [('Content-type', 'text/html'),
+ start_response('200 OK', [('Content-type', 'application/json'),
('Content-Length', str(output_len))])
return output