# -*- coding: utf-8 -*-

import math
import random
import hashlib
import numpy as np

def MeanProcess(level,layer_number,bottom,middle):
    """自底向上的平均化处理"""
    # level 当前层
    # layer_number 四分树的高度
    # bottom level+1层数据列表，形式[float,float,float,float]
    # middle level层数据列表,形式[float,float]
    
    adjust_level=layer_number-level+1
    num1=math.pow(4,adjust_level)
    num2=math.pow(4,adjust_level-1)
    num3=float(num1-num2)/float(num1-1.0)
    num4=float(num2-1.0)/float(num1-1.0)
    
    mean_process_data=[]
    
    for i in xrange(len(middle)):
        temp1=sum(bottom[i*4:(i+1)*4])
        temp2=float(num3*middle[i]+num4*temp1)
        mean_process_data.append(temp2)
    
    return mean_process_data

def ConsistencyProcess(bottom,middle,top):
    """自顶向下均值一致性处理"""
    # bottom level+1层平均化后的数据列表，形式[float,float,float,float]
    # middle level层平均化后的数据列表,形式[float,float]
    # top level+1层平均化后的数据列表,形式[float,float]

    consistency_process_data=[]

    for i in xrange(len(middle)):
        temp1=sum(bottom[i*4:(i+1)*4]) # 计算当前结点的孩子结点的加和值
        parent_node_index=i//4 # 下取整
        temp2=float(middle[i]+(top[parent_node_index]-temp1)*0.25)
        consistency_process_data.append(temp2)

    return consistency_process_data

def PostProcess(noise_unbiase_aggregate_all_data,layer_number):
    """一致性处理"""
    # noise_unbiase_aggregate_all_data 无偏统计结果
    # layer_number 四分树的高度
    
    #""自底向上的平均化处理""
    
    mean_process_all_data=[] # 存放均值处理化后的所有数据
    mean_process_all_data.append(noise_unbiase_aggregate_all_data[layer_number-1])
    
    temp_list=list(range(layer_number))
    temp_list.reverse() # 数据反转排列
    temp_list.pop() # 去掉最后一个元素
    
    for i in temp_list:
        temp1=MeanProcess(i,layer_number,noise_unbiase_aggregate_all_data[i],noise_unbiase_aggregate_all_data[i-1])
        mean_process_all_data.insert(0,temp1)
    
    #""自顶向下的均值一致化处理""
    consistency_process_all_data=[]
    
    # 计算根结点的一致性结果
    temp_1=sum(mean_process_all_data[1]) # 计算当前结点的孩子结点的加和值
    temp_2=[float(mean_process_all_data[0][0]-0.25*temp_1)]
    consistency_process_all_data.append(temp_2)
    
    list1=list(range(layer_number))
    del(list1[0]) # 删除第一个元素
    list1.pop() # 删除最后一个元素
    
    for i in list1:
        temp_3=ConsistencyProcess(mean_process_all_data[i+1],mean_process_all_data[i],mean_process_all_data[i-1])
        consistency_process_all_data.append(temp_3)
    
    return consistency_process_all_data




