This is a mess...

Nick nleioatt at gmail.com
Thu Jul 16 16:15:52 CEST 2009


this is the new oop version, its pretty messy currently, and i do
understand it is a simple routine, but i'm using it as an exercise to
learn oop python...

first the (current) traceback:
 [:~/python]$  python oop_covariance.py b2ar_all_test b2ar_all_test
<Eigen.Eigen_vect instance at 0x7fa26c404ab8>
<Eigen.Eigen_vect instance at 0x7fa26c404ab8>
Traceback (most recent call last):
  File "oop_covariance.py", line 24, in <module>
    cov = set1.covariance(set2, Eigen_vect.dot)
  File "/home/nleioatts/python/Eigen.py", line 66, in covariance
    print self.vectors[i][i]
AttributeError: Eigen_vect instance has no attribute '__getitem__'

and a quick explaination:  the file structures aare a 2d list of lists
of numbers corresponding to eginvectors and a list of numbers
corresponding to eigenvalues

#########################33##Here is the main body
#!/usr/bin/env python
import sys
import Eigen
from Eigen import *

if len(sys.argv) != 3:
    print " "
    print "The corrent usage is 'python covariance.py file1 file2'"
    print "where the _U.asc and _s.asc will be appended when needed"
    print " "
    exit(1)
file1 =  sys.argv[1]
file2 =  sys.argv[2]
set1 = Eigen_set(file1+"_U.asc", file1+"_s.asc")
set2 = Eigen_set(file2+"_U.asc", file2+"_s.asc")
cov = set1.covariance(set2, Eigen_vect.dot)
print cov


###############and here are the classes:

#!/usr/bin/env python
import sys
import math
from math import sqrt

class Eigen_vect:
    def __init__(self, e_val, e_vect):
        self.e_val  = e_val
        self.e_vect = e_vect
    def length(self):
        return len(self.e_vect)

    def dot(self, other):
        d = 0.0
        if other.length() != self.length():
            raise ValueError, "Eigen Vectors not same Length"
        for k in range(self.length()):
           # print "HI NICK", self.e_vect[k], other.e_vect[k]
            d += float(self.e_vect[k]) * float(other.e_vect[k])
        return d


class Eigen_set:
    def __init__(self,  vec_filename, val_filename):
        self.vec_filename = vec_filename
        self.val_filename = val_filename
        # open two files
        # loop through them, skipping lines that begin with #
        # for each row, extract eigen vector and eigen values
        fileholder = open(self.vec_filename)
        text = fileholder.readlines()
        fields = text[2].split()
#        print "len of fields", len(fields)
        self.vectors = []
        for line in text[2: len(fields)]:
            fields = line.split()
#            print "len of fields", len(fields)
            for i in range(len(fields)):
                fields[i] = float(fields[i])
        e_vect = fields
        fileholder = open(self.val_filename)
        text = fileholder.readlines()
        e_val = [float(line) for line in text[2: self.length()]]
        self.vectors.append(Eigen_vect(e_val, e_vect))
#        print "this is self.vectors"
#        print self.vectors(e_val)

    def length(self):
        return len(self.vectors)

    def covariance(self, other, dot):
        newdot = 0.0
        # do a length check to make sure we're consistent
        if other.length() != self.length():
            raise ValueError, "Eigen Vectors not same Length"
        #double loop over all my vectors and all of other's vectors
        doublesum = 0.0
        for i in range(self.length()):
            sum = 0.0
            v1 = self.vectors[i]
            for j in range(self.length()):
                newdot += v1.dot(self.vectors[j])
               # root = self.e_val[i] * other.e_val[j]
                print self.vectors[i]
                print self.vectors[j]
                print self.vectors[i][i]
#####################<<------------------------This is line 66, I'm
trying to figure out how to call "e_val" from the Eigen_set class

                root = self.vectors[i][i] * other.vectors[i][j]
                sum  += newdot * newdot * root
            doublesum += sum
        #########
        singsum = 0.0
        for k in range(self.length()):
            singsum += self.e_val[k] * self.e_val[k] + other.e_val[k]
* other.e_val[k]
        Q = 1 - sqrt(abs((singsum - (2.0*doublesum)) / singsum))
        print "your Q:"
        print Q



and any additional help is great.  thanks in advance, like the title
says this is really a mess....



More information about the Python-list mailing list