

"""

Analyze bench_fft:

  python analyze_bench.py fft_benching_again.txt

#METHOD fftw3 (Darren)

                 Fast Fourier Transform
=================================================
      |    real input     |   complex input    
-------------------------------------------------
 size |  scipy  | Numeric |  scipy  | Numeric 
-------------------------------------------------
  100 |    0.23 |    0.23 |    1.56 |    0.23  (secs for 7000 calls)
 1000 |    0.17 |    0.31 |    1.62 |    0.30  (secs for 2000 calls)
  256 |    0.40 |    0.46 |    3.21 |    0.47  (secs for 10000 calls)
  512 |    0.55 |    0.84 |    4.19 |    0.81  (secs for 10000 calls)
 1024 |    0.09 |    0.16 |    0.67 |    0.15  (secs for 1000 calls)
 2048 |    0.16 |    0.28 |    1.16 |    0.30  (secs for 1000 calls)
 4096 |    0.17 |    0.30 |    1.08 |    0.29  (secs for 500 calls)
 8192 |    0.46 |    1.04 |    2.38 |    1.01  (secs for 500 calls)


The #METHOD comment
text is added to compare different results

"""


import sys

def main(datei):
    
    all_lines=list()
    for line in open(datei):
        all_lines.append(line)


    data_sets=list()

    i=0
    current_method="which data?"
    while i<len(all_lines)-1:
        if  "#METHOD" in all_lines[i]:
            current_method=all_lines[i][8:-1] 

        #print all_lines[i]
        if "=====" in all_lines[i] and "real input" in all_lines[i+1]:
            title=all_lines[i-1].strip()
            i=i+1                      # real input |  complex   input
            i=i+1                      # ----- 
            i=i+1                      # size  |   
            i=i+1                      # -----
            i=i+1
            data=list()
            while "|" in all_lines[i]:
                data.append((all_lines[i].replace("|"," ")).split()[0:5])
                i=i+1

            data_sets.append( (current_method,title,data) )

        i=i+1

    return data_sets

def output(data_sets):

    for data in data_sets:

        print "==================="
        print "#METHOD:",data[0]
        print "#TITLE:",data[1]
        for entry in data[2]:
            print "%5s" %entry[0],
            print "%4.3f" % (float(entry[2])/float(entry[1])),
            print "%4.3f" % (float(entry[4])/float(entry[3]))

def plot(data_sets,fname,select=None):
    import pylab
    
    pylab.figure()
    pylab.subplot(111,autoscale_on=False)  # Why not just `autoscale=False`???
    pylab.ylim(0.0,2.5)
    pylab.xlim(0.5,8.5)
    for data in data_sets:
        if (not "Multi" in  data[1]) and (select in data[0]):
            print "==================="
            print "#METHOD:",data[0]
            print "#TITLE:",data[1]

            #titles.append(data[0])
            
            x=list()
            y1=list()
            y2=list()
            ctr=1
            for entry in data[2]:
                ratio1=(float(entry[2])/float(entry[1]))
                ratio2=(float(entry[4])/float(entry[3]))
                print "%5s" %entry[0],
                print "%4.3f" % ratio1,
                print "%4.3f" % ratio2
                x.append(ctr)
                y1.append(ratio1)     # real
                y2.append(ratio2)     # complex  
                ctr=ctr+1
            color="r"
            if "fftw2" in data[0]:
                color="g"
            if "fftw3" in data[0]:
                color="b"
            if "old" in data[0]:
                color="r"
            
            pylab.plot(x,y1,color+"--o",markersize=5.5,label=data[0]+" real")
            pylab.plot(x,y2,color+"-s",markersize=5.5,label=data[0]+" complex")

    pylab.plot(x,[1.0]*len(x),"b-",label="border")
    pylab.xlabel("100, 1000, 256, 512, 1024, 2048, 4096 ,8192")
    pylab.ylabel("ratio: scipy vs. Numeric     (>1: OK)")
    pylab.legend(loc='upper left')
    pylab.savefig(fname)
            
                
if __name__=="__main__":
    data_sets=main(sys.argv[1])  #datei="analyze_bench.py")
    output(data_sets)
    print "###############################"
    plot(data_sets,"test_AB.png",select="AB")
    plot(data_sets,"test_DD.png",select="Darren")

