def create_report_tensors(state, report_id):
    T = state.result.T
    vname = "" #TODO
    
    caption = '%s learned tensors, %d iterations' % \
        (vname, state.total_iterations)
    
    A = create_report_figure_tensors(T, same_scale=False, report_id='tensors',
        caption=caption)
    
    B = create_report_figure_tensors(T, same_scale=True, report_id='tensors-ss',
        caption='%s  (on the same scale)' % caption)
     
    report = Node(report_id)
    report.add_child(A)
    report.add_child(B)
    return report
def main():
    """
    Prepare data with:
    
        average_logs_results --dir . --experiment laser_bgds_boot
    
    """
    print "Loading first..."
    results = my_pickle_load('out/average_logs_results/laser_bgds_boot.pickle')

    report = Node('laser_bgds_boot')
    manual = my_figures(results)
    write_figures_for_paper(manual)
    report.add_child(manual)
    
    
    k = 1
    variants = sorted(results.keys())
    # FIXME: this was uncommented (Was I in a hurry?)
    # variants = []
    for variant in variants:
        data = results[variant] 
        G = data['G']
        B = data['B']
        
#        gy_mean = data['gy_mean']
#        y_mean = data['y_mean']
#        one_over_y_mean = data['one_over_y_mean']
        y_dot_var = data['y_dot_var']
        y_dot_svar = data['y_dot_svar']
        gy_var = data['gy_var']
        gy_svar = data['gy_svar']
        
        print 'Considering %s' % variant
        
        n = report.node(variant)
        
        #readings = range(360, G.shape[0])
        readings = range(0, G.shape[0])
        N = len(readings)
        
        G = G[readings, :]
        B = B[readings, :]
        y_dot_var = y_dot_var[readings]
        y_dot_svar = y_dot_svar[readings]
        gy_var = gy_var[readings]
        gy_svar = gy_svar[readings] 
        
        for k in [0, 2]:
            var = 'G[%s]' % k
            G_k = n.data(var, G[:, k])
            G_k_n = G[:, k] / gy_var
            with G_k.data_pylab('original') as pylab:
                pylab.plot(G[:, k])
                pylab.title(var + ' original')
                M = abs(G[:, k]).max()
                pylab.axis([0, N, -M, M])
                           
            with G_k.data_pylab('normalized') as pylab:
                pylab.plot(G_k_n)
                pylab.title(var + ' normalized')
                M = abs(G_k_n).max()
                pylab.axis([0, N, -M, M])            

        for k in [0, 2]:
            var = 'B[%s]' % k
            B_k = n.data(var, B[:, k])
            B_k_n = B[:, k] / gy_var
            
            with B_k.data_pylab('original') as pylab:
                pylab.plot(B[:, k])
                pylab.title(var + ' original')
                M = abs(B[:, k]).max()
                pylab.axis([0, N, -M, M])            

            with B_k.data_pylab('normalized') as pylab:
                pylab.plot(B_k_n)
                pylab.title(var + ' normalized')            
                M = abs(B_k_n).max()
                pylab.axis([0, N, -M, M])            


        n.figure('obtained', sub=['B[0]/normalized', 'B[2]/normalized',
        'G[0]/normalized', 'G[2]/normalized', ])


        n.figure('G', sub=['G[0]/original', 'G[0]/normalized',
        'G[2]/original', 'G[2]/normalized'])


        n.figure('B', sub=['B[0]/original', 'B[0]/normalized',
        'B[2]/original', 'B[2]/normalized']) 
        
        
        
        theta = linspace(0, 2 * math.pi, N) - math.pi / 2
        with n.data_pylab('B_v') as pylab:
            pylab.plot(-cos(theta))
            pylab.axis([0, N, -2, 2])
        with n.data_pylab('B_omega') as pylab:
            pylab.plot(0 * theta)
            pylab.axis([0, N, -2, 2])
        with n.data_pylab('G_v') as pylab:
            pylab.plot(-sin(theta))
            pylab.axis([0, N, -2, 2])
        with n.data_pylab('G_omega') as pylab:
            pylab.plot(numpy.ones((N)))
            pylab.axis([0, N, -2, 2])
            
        n.figure('expected', sub=['B_v', 'B_omega', 'G_v', 'G_omega'])
        
        norm = lambda x: x / x.max()
        #   norm = lambda x : x
        with n.data_pylab('y_dot_var') as pylab:
            pylab.plot(norm(y_dot_var), 'b', label='y_dot_var')
            pylab.plot(norm(y_dot_svar ** 2), 'g', label='y_dot_svar')
            
            pylab.axis([0, N, 0, 1])
            pylab.legend()

        with n.data_pylab('gy_var') as pylab:
            pylab.plot(norm(gy_var) , 'b', label='gy_var')
            pylab.plot(norm(gy_svar ** 2), 'g', label='gy_svar')
            
            pylab.axis([0, N, 0, 1])
            pylab.legend()
            
            
        f = n.figure('stats')
        f.sub('y_dot_var')
        f.sub('gy_var')
        
        for var in ['y_dot_mean', 'gy_mean', 'y_mean', 'y_var', 'one_over_y_mean']:
            with n.data_pylab(var) as pylab:
                pylab.plot(data[var][readings])
            f.sub(var)
            
        with n.data_pylab('y_mean+var') as pylab:
            y = data['y_mean'][readings]
            var = data['y_var'][readings]
            pylab.errorbar(range(0, N), y, yerr=3 * numpy.sqrt(var), fmt='ro')
                
        f.sub('y_mean+var')

        print variant
        
        if True: #variant == 'GS_DS':
            s = {'variant': variant,
                 'Gl':G[:, 0] / gy_var,
                 'Ga':G[:, 2] / gy_var,
                 'Bl':B[:, 0] / gy_var,
                 'Ba':B[:, 2] / gy_var }
            filename = "out/laser_bgds_boot/%s:GB.pickle" % variant.replace('/', '_')
            make_sure_dir_exists(filename)
            my_pickle_dump(s, filename)
            print 'Written on %s' % filename
        

    node_to_html_document(report, 'out/laser_bgds_boot/report.html')
def analyze_olfaction_covariance(covariance, receptors):
    ''' Covariance: n x n covariance matrix.
        Positions:  list of n  positions '''
    
    positions = [pose.get_2d_position() for pose, sens in receptors] #@UnusedVariable
    positions = array(positions).transpose().squeeze()
    
    require_shape(square_shape(), covariance)
    n = covariance.shape[0]
    require_shape((2, n), positions)
    
    distances = create_distance_matrix(positions)
    correlation = cov2corr(covariance)
    flat_distances = distances.reshape(n * n) 
    flat_correlation = correlation.reshape(n * n)
    
    # let's fit a polynomial
    deg = 4
    poly = polyfit(flat_distances, flat_correlation, deg=deg)  
    
    knots = linspace(min(flat_distances), max(flat_distances), 2000)
    poly_int = polyval(poly, knots)
    
    poly_fder = polyder(poly)
    
    fder = polyval(poly_fder, distances)
    
    Ttheta = create_olfaction_Ttheta(positions, fder)
    Tx, Ty = create_olfaction_Txy(positions, fder, distances)
    
    
    report = Node('olfaction-theory')
    report.data('flat_distances', flat_distances)
    report.data('flat_correlation', flat_correlation)
    
    
    with report.data_file('dist_vs_corr', 'image/png') as filename:
        pylab.figure()
        pylab.plot(flat_distances, flat_correlation, '.')
        pylab.plot(knots, poly_int, 'r-')
        pylab.xlabel('distance')
        pylab.ylabel('correlation')
        pylab.title('Correlation vs distance')
        pylab.legend(['data', 'interpolation deg = %s' % deg]) 
        pylab.savefig(filename)
        pylab.close()
    
    with report.data('fder', fder).data_file('fder', 'image/png') as filename:
        pylab.figure()
        pylab.plot(knots, polyval(poly_fder, knots), 'r-')
        pylab.title('f der')
        pylab.savefig(filename)
        pylab.close() 
    
    report.data('distances', distances)
    report.data('correlation', correlation)
    report.data('covariance', covariance)
    report.data('f', polyval(poly, distances))   
    
    
    
    f = report.figure(id='cor-vs-distnace', caption='Estimated kernels',
                       shape=(3, 3))
    f.sub('dist_vs_corr')
    f.sub('fder')
    f.sub('f', display='scale')
    f.sub('distances', display='scale')
    f.sub('correlation', display='posneg')
    f.sub('covariance', display='posneg')
    
    T = numpy.zeros(shape=(3, Tx.shape[0], Tx.shape[1]))
    T[0, :, :] = Tx
    T[1, :, :] = Ty
    T[2, :, :] = Ttheta
    
    T_report = create_report_figure_tensors(T, report_id='tensors',
        caption="Predicted learned tensors")
    
    report.add_child(T_report)

    return report