Пример #1
0
def main(args):
    import numpy as np
    import CLA
    #1) Path
    path=args[0]
    #2) Load data, set seed
    headers=open(path,'r').readline().split(',')[:-1]
    data=np.genfromtxt(path,delimiter=',',skip_header=1) # load as numpy array
    mean=np.array(data[:1]).T
    lB=np.array(data[1:2]).T
    uB=np.array(data[2:3]).T
    covar=np.array(data[3:])
    #3) Invoke object
    cla=CLA.CLA(mean,covar,lB,uB)
    cla.solve()
    print cla.w # print all turning points
    #4) Plot frontier
    mu,sigma,weights=cla.efFrontier(100)
    plot2D(sigma, mu, 'Risk', 'Expected Excess Return', 'CLA-derived Efficient Frontier')
    #5) Get Maximum Sharpe ratio portfolio
    sr,w_sr = cla.getMaxSR()
    print np.dot(np.dot(w_sr.T, cla.covar), w_sr)[0, 0]**.5, sr
    print w_sr
    #6) Get Minimum Variance portfolio
    mv, w_mv = cla.getMinVar()
    print mv
    print w_mv
    return
def getCLA(cov, **kargs):
    #compute CLA's minimum variance portfolio
    mean = np.arange(cov.shape[0]).reshape(-1, 1)  # not used by c portf
    lB = np.zeros(mean.shape)
    uB = np.ones(mean.shape)
    cla = CLA.CLA(mean, cov, lB, uB)
    cla.solve()
    return cla.w[-1].flatten()
def main():
    import numpy as np
    import CLA
    # 1) Path
    path = 'CLA_Data.csv'
    # 2) Load data, set seed
    headers = open(path, 'r').readline()[:-1].split(',')
    data = np.genfromtxt(path, delimiter=',',
                         skip_header=1)  # load as numpy array
    mean = np.array(data[:1]).T
    lB = np.array(data[1:2]).T
    uB = np.array(data[2:3]).T
    covar = np.array(data[3:])
    # 3) Invoke object
    cla = CLA.CLA(mean, covar, lB, uB)
    cla.solve()
    print('===============All Turning point====================')
    for w in cla.w:
        print(w)
    # print(cla.w)  # print all turning points
    # 4) Plot frontier
    mu, sigma, weights = cla.efFrontier(500)
    # plot2D(sigma, mu, 'Risk', 'Expected Excess Return', 'CLA-derived Efficient Frontier', '../')
    # 5) Get Maximum Sharpe ratio portfolio
    print("==============Get Maximum Sharpe ratio portfolio===============")
    sr, w_sr = cla.getMaxSR()
    print(np.dot(np.dot(w_sr.T, cla.covar), w_sr)[0, 0]**.5, sr)
    print(w_sr)
    print(sum(w_sr))
    # 6) Get Minimum Variance portfolio
    print("==============Get Minimum Variance portfolio=================")
    mv, w_mv = cla.getMinVar()
    print(mv)
    print(w_mv)
    print(sum(w_mv))

    import matplotlib.pyplot as plt
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)  # one row, one column, first plot
    ax.plot(sigma, mu, color='blue', label='Efficient Frontier')
    ax.set_xlabel('Risk')
    ax.set_ylabel('Expected Excess Return', rotation=90)
    plt.xticks(rotation='vertical')
    plt.title('CLA-derived Efficient Frontier')
    sr = ax.scatter(
        np.dot(np.dot(w_sr.T, cla.covar), w_sr)[0, 0]**.5,
        np.dot(w_sr.T, cla.mean)[0, 0])
    mv = ax.scatter(
        np.dot(np.dot(w_mv.T, cla.covar), w_mv)[0, 0]**.5,
        np.dot(w_mv.T, cla.mean)[0, 0])
    plt.legend((sr, mv), ('maximum sharpe ratio', 'minimum variance'))
    plt.show()
    return
Пример #4
0
    def run(self):
        """

        run : run simulation of the scenario  

        """
        self.time_compute = {}
        self.time_compute['RGPA'] = []
        self.time_compute['algebraic'] = []

        self.CRB = []
        Nbn = len(self.bn)
        Nan = len(self.an)
        if self.parmsc['save_pe']:
            self.pe = []
            self.p_LS = []
        if self.parmsc['save_CLA']:
            self.CLA = []

        self.err1 = np.array([])
        #self.err2    = np.array([])
        self.errx = np.array([])
        self.erry = np.array([])
        self.errz = np.array([])
        self.errLS = np.array([])
        self.errxLS = np.array([])
        self.erryLS = np.array([])
        self.errzLS = np.array([])
        # list for algebraic

        atoabn = []
        astdbn = []
        P = []

        if self.parmsc['Constrain_Type'] == 'TDOA':
            lbcl = Nan - 1
        else:
            lbcl = Nan

        tdoa_idx = nonzero(np.array(l_connect) == 'TDOA')[0]

        if self.parmsc['Constrain_Type'] == 'hybrid' or self.parmsc[
                'Constrain_Type'] == 'test':
            algehyb = 1
        else:
            algehyb = 0

        if len(tdoa_idx) != 0:
            lbcl = Nan - 1
            #self.dan=[]
            #for i in range(len(tdoa_idx)-1):
            #       self.dan.append(vstack((self.an[tdoa_idx[0]],self.an[i+1])))

        self.rss_idx = nonzero(np.array(l_connect) == 'RSS')[0]
        self.toa_idx = nonzero(np.array(l_connect) == 'TOA')[0]
        self.tdoa_idx = nonzero(np.array(l_connect) == 'TDOA')[0]
        self.ERRSAVE = []
        for ibn in range(Nbn):  # for each blind node
            self.errRSS = zeros((1))
            self.errTOA = zeros((1))
            self.errTDOA = zeros((1))
            self.ibn = ibn
            errli = []
            Constraint.C_Id = 0  # reset constraint Id for each BN

            print "                    Blind Node N°", ibn + 1, "/", Nbn
            atv = []
            pbn = self.bn[ibn]
            #print "Blind Node N° ",ibn,pbn

            self.tic_ensemblist = time.time()
            cla = CLA(self.parmsh)
            cla.bn = self.bn[ibn]

            clarss = CLA(self.parmsh)
            clatoa = CLA(self.parmsh)
            clatdoa = CLA(self.parmsh)

            #cla.C_Id=0
            if parmsc['exclude_out'] != None:
                E = Exclude(nodes=parmsc['exclude_out'])
                cla.append(E)

            for ian in range(lbcl):  # for each AN or couple of AN (TDOA)
                #print "Anchor Node N° ",ian

                try:
                    self.parmsc['Constrain_Type'] = self.parmsc['l_connect'][
                        ian]
                except:
                    pass

#                   pdb.set_trace()
                rgpatimea = time.time()
                if self.parmsc['Constrain_Type'] == 'TOA':
                    pan = self.an[ian]
                    # tvalue : true value (ns)
                    tvalue = np.sqrt(np.dot(pan - pbn, pan - pbn)) / 3e8
                    # err (ns)

                    err = (self.std_v[ibn, ian] * sp.randn())
                    while err + tvalue < 0:
                        err = (self.std_v[ibn, ian] * sp.randn())

                    self.errTOA = np.vstack((self.errTOA, err))
                    # value (toa : ns )

                    value = max(0, tvalue + err)

                    C = TOA(value=value * 1e9,
                            std=self.std_v[ibn, ian] * 1e9,
                            vcw=self.parmsc['vcw'],
                            p=pan)

                    cla.append(C)
                    clatoa.append(C)
                if self.parmsc['Constrain_Type'] == 'TDOA':

                    pan = vstack((self.an[tdoa_idx[0]], self.an[ian + 1]))
                    # dan : delay between 2 AN (ns)
                    dan = np.sqrt(dot(pan[0] - pan[1], pan[0] - pan[1])) / 3e8

                    minvalue = -dan
                    maxvalue = dan
                    toa1 = np.sqrt(np.dot(pan[0] - pbn, pan[0] - pbn)) / 3e8
                    toa2 = np.sqrt(np.dot(pan[1] - pbn, pan[1] - pbn)) / 3e8
                    tvalue = toa2 - toa1

                    err = self.std_v[ibn, ian] * sp.randn()
                    while ((tvalue + err) < minvalue) or (
                        (tvalue + err) > maxvalue):
                        err = self.std_v[ibn, ian] * sp.randn()

                    self.errTDOA = np.vstack((self.errTDOA, err))
                    # tvalue : true value (ns)

                    #                       value  = max(minvalue,tvalue + err)
                    #                       value  = min(maxvalue,value)

                    # value (ns)
                    value = tvalue + err

                    C = TDOA(value=-value * 1e9,
                             std=(self.std_v[ibn, ian] * 1e9),
                             vcw=self.parmsc['vcw'],
                             p=pan)
                    cla.append(C)
                    #C    = TDOA(p=pan,value=value,std=2)
                    clatdoa.append(C)
                if self.parmsc['Constrain_Type'] == 'RSS':
                    pan = self.an[ian]
                    ######################################## MODEL RSS NICO
                    #                       dr  = max(0, (np.sqrt(np.dot(pan-pbn,pan-pbn))))
                    #                       M   = Model()
                    #                       err    = (self.std_v[ibn,ian]*1e-9*sp.randn())
                    #                       value = M.OneSlope(max(0,dr + err))
                    #                       value = min(500,value)
                    #                       value = max(-500,value)

                    ######################################## MOHAMED
                    d0 = self.parmsc['d0']
                    RSSnp = vstack((self.parmsc['pn'], self.parmsc['pn']))
                    PL0 = vstack((self.parmsc['rss0'], self.parmsc['rss0']))
                    RSSStd = vstack((self.parmsc['sigma_max_RSS'],
                                     self.parmsc['sigma_max_RSS']))

                    PP = vstack((self.bn[ibn], self.bn[ibn]))
                    PA = vstack((pan, pan))
                    rssloc = RSSLocation(PP)
                    value = (rssloc.getPLmean(PA.T, PP.T, PL0, d0, RSSnp))
                    err = (RSSStd * randn(shape(value)[0],
                                          shape(value)[1]))[0][0]

                    self.errRSS = np.vstack((self.errRSS, err))

                    value = value[0] + err

                    #                       value  = rssloc.getPL(PA.T, PP.T, PL0, d0, RSSnp, RSSStd)
                    value = value

                    #                       value = self.parmsc['rss0']-10*self.parmsc['pn']*log10(dr/self.parmsc['d0'])+self.err_v[ibn,ian]

                    self.Model = {}
                    self.Model['PL0'] = self.parmsc['rss0']
                    self.Model['d0'] = self.parmsc['d0']
                    self.Model['RSSnp'] = self.parmsc['pn']
                    self.Model['RSSStd'] = self.parmsc['sigma_max_RSS']
                    self.Model['Rest'] = 'mode'

                    C = RSS(value=value,
                            std=self.std_v[ibn, ian],
                            vcw=self.parmsc['vcw'],
                            model=self.Model,
                            p=pan)
                    cla.append(C)
                    clarss.append(C)

                if self.parmsc['algebraic']:
                    atv.append(value)

            if len(self.rss_idx) != 0:
                self.errRSS = delete(self.errRSS, 0, 0)
            if len(self.toa_idx) != 0:
                self.errTOA = delete(self.errTOA, 0, 0)
            if len(self.tdoa_idx) != 0:
                self.errTDOA = delete(self.errTDOA, 0, 0)
            # version boite recursive
            #
            ######################### CLA TOTALE
            cla.merge2()
            cla.refine(cla.Nc)
            self.cla = cla
            ### DoubleListRefine version
            cla.estpos2()
            pe1 = cla.pe
            rgpatimeb = time.time()
            self.time_compute['RGPA'].append(rgpatimeb - rgpatimea)

            self.pe.append(pe1)
            errli.append(np.sqrt(np.dot(pe1[:2] - pbn[:2], pe1[:2] - pbn[:2])))

            #print len(parmsc['l_connect'])
            if len(parmsc['l_connect']
                   ) > 4:  # pour ne pas calculer 2fois les cas non hybrides

                if len(nonzero(
                        np.array(parmsc['l_connect']) == 'RSS')[0]) != 0:
                    for i in range(4):
                        clarss.c[i].Id = i
                    clarss.merge2()
                    clarss.refine(clarss.Nc)
                    clarss.estpos2()
                    clarss.bn = bn[ibn]
                    self.clarss = clarss
                    self.perss = clarss.pe
                    errli.append(
                        np.sqrt(
                            np.dot(self.perss[:2] - pbn[:2],
                                   self.perss[:2] - pbn[:2])))

                if len(nonzero(
                        np.array(parmsc['l_connect']) == 'TOA')[0]) != 0:
                    for i in range(4):
                        clatoa.c[i].Id = i
                    clatoa.merge2()
                    clatoa.refine(clatoa.Nc)
                    clatoa.estpos2()
                    clatoa.bn = bn[ibn]
                    self.clatoa = clatoa
                    self.petoa = clatoa.pe
                    errli.append(
                        np.sqrt(
                            np.dot(self.petoa[:2] - pbn[:2],
                                   self.petoa[:2] - pbn[:2])))

                if len(nonzero(
                        np.array(parmsc['l_connect']) == 'TDOA')[0]) != 0:
                    for i in range(3):
                        clatdoa.c[i].Id = i
                    clatdoa.merge2()
                    clatdoa.refine(clatdoa.Nc)
                    clatdoa.estpos2()
                    clatdoa.bn = bn[ibn]
                    self.clatdoa = clatdoa
                    self.petdoa = clatdoa.pe
                    errli.append(
                        np.sqrt(
                            np.dot(self.petdoa[:2] - pbn[:2],
                                   self.petdoa[:2] - pbn[:2])))

            #print errli
            err1 = min(errli)
            #print err1
            self.err1 = np.hstack((self.err1, err1))

            #self.err2  = np.hstack((self.err2,err2))

            #if err >3:
            #       pdb.set_trace()

            if self.parmsc['algebraic']:

                if algehyb == 1:
                    self.parmsc['Constrain_Type'] = 'hybrid'

                algetimea = time.time()
                p_LS = self.algebraic_compute(atv)
                algetimeb = time.time()

                self.time_compute['algebraic'].append(algetimeb - algetimea)

                if self.parmsc['save_pe']:
                    self.p_LS.append(p_LS)
                if self.parmsc['Constrain_Type'] != 'hybrid':
                    errLS = np.sqrt(
                        np.dot(p_LS[:2] - pbn[:2], p_LS[:2] - pbn[:2]))

                #elif self.parmsc['Algebraic_method'] == 'CRB':
                #       errLS = np.sqrt(self.CRB)

                else:

                    errLS = np.sqrt(
                        np.dot(p_LS[:2] - pbn[:2], p_LS[:2] - pbn[:2]))
                self.errLS = np.hstack((self.errLS, errLS))

            if errli > errLS:
                print 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnn\n', errli, '\n', errLS