Ejemplo n.º 1
0
    def fill_cla(self):
        """
        fill the constraint layer array

        Notes
        -----

        loop on edges
            loop on wstd
                append cla with available LDP among (RSS,TOA)

        Warning
        -------

        TDOA not implemented yet

        """
        ## loop on edges
        for e in self.net.node[self.ID]['PN'].edge[self.ID].keys():
            ## loop on wstd
            for wstd in self.net.node[self.ID]['PN'].edge[self.ID][e].keys():
                try:
                    param = dict(self.config.items(wstd+'_PLM'))
                    self.cla.append(
                        RSS(id = wstd+'-Pr-'+self.ID+'-'+e,
                            value = self.net.node[self.ID]['PN'].edge[self.ID][e][wstd]['Pr'][0],
                            std = self.net.node[self.ID]['PN'].edge[self.ID][e][wstd]['Pr'][1],
                            model = PLSmodel(f = eval(param['f']),
                                             rssnp = eval(param['rssnp']),
                                             d0 = eval(param['d0']),
                                             method = param['method']),
                            p = self.net.node[self.ID]['PN'].node[e]['pe'],
                            origin={'id':self.ID,'link':[e],'wstd':wstd,'ldp':'Pr'}
                            )
                                    )
                except:
                    param = dict(self.config.items(wstd+'_PLM'))
                    self.cla.append(
                        RSS(id = wstd+'-Pr-'+self.ID+'-'+e,
                            p = self.net.node[self.ID]['PN'].node[e]['pe'],
                            origin={'id':self.ID,'link':[e],'wstd':wstd,'ldp':'Pr'}
                            )
                                    )

                try:
                    self.cla.append(
                        TOA(id = wstd+'-TOA-'+self.ID+'-'+e,
                            value = self.net.node[self.ID]['PN'].edge[self.ID][e][wstd]['TOA'][0],
                            std = self.net.node[self.ID]['PN'].edge[self.ID][e][wstd]['TOA'][1],
                            p= self.net.node[self.ID]['PN'].node[e]['pe'],
                            origin={'id':self.ID,'link':[e],'wstd':wstd,'ldp':'TOA'}
                            )
                                    )
                except:
                    self.cla.append(
                        TOA(id = wstd+'-TOA-'+self.ID+'-'+e,
                            p= self.net.node[self.ID]['PN'].node[e]['pe'],
                            origin={'id':self.ID,'link':[e],'wstd':wstd,'ldp':'TOA'}
                            )
                                    )
Ejemplo n.º 2
0
    def load_model(self,RAT):
        """ load a path loss shadowing model for a RAT

        Parameters
        ----------

        RAT  : string
            RAT name


        """

        ratopt = dict(self.config.items(RAT+'_PLM'))

        # Path Loss Shadowing model
        self.model[RAT] = PLSmodel(f = eval(ratopt['f']),
                                   rssnp = eval(ratopt['rssnp']),
                                   d0 = eval(ratopt['d0']),
                                   sigrss = eval(ratopt['sigrss']),
                                   method = ratopt['method'])
Ejemplo n.º 3
0
    def solve(self,p,e,LDP,RAT,epwr,sens):
        """ computes and returns a LDP value 


        Parameters
        ----------

        p : np.array
        e : np.array
        LDP : string
            Type of LDP ( TOA, Pr, .... any other are to be add in teh todo list)
        epwr : list
           nodes transmitted power
        sens : list
            nodes sensitivity

        Returns
        -------

        value : float
            A LDP value :     * A time in ns for LDP ='TOA'
                    * A received power in dBm for LDP ='Pr'
        std : float
            A LDP value standard deviation:     * A time in ns for LDP ='TOA'
                                * A received power in dBm for LDP ='Pr'

        LDP (Location Dependent Parameter) 

        """

        try:
            model= self.model[RAT]
        except:
            try:
                self.load_model(RAT)
                model = self.model[RAT]
            except:
                self.model[RAT] = PLSmodel()
                self.save_model(RAT,self.model[RAT])
                model = self.model[RAT]


#        if self.EMS_method == 'direct':
#            dd={} # distance dictionnary

#            if len(e) > 0:
#                lp=np.array([np.array((p[e[i][0]],p[e[i][1]])) for i in range(len(e))])
#                d=np.sqrt(np.sum((lp[:,0]-lp[:,1])**2,axis=1))
#                if LDP == 'TOA':
#                    std = self.sigmaTOA*sp.randn(len(d))
#                    return ([[max(0.0,(d[i]+std[i])*0.3),self.sigmaTOA*0.3] for i in range(len(d))],d)

#                elif LDP == 'Pr':
#                    std = self.model.sigrss*sp.randn(len(d))
#                    r=model.getPL(d,model.sigrss)
#                    return ([[- r[i]-model.PL0,model.sigrss] for i in range(len(d))],d)
#
#



#                else :
#                    raise NameError('invalid LDP name')
#            else :
#                return ([[0.],[0.]])


        if self.EMS_method == 'multiwall':

            dd = {} # distance dictionnary
            if len(e) > 0:

                lp = np.array([np.array((p[e[i][0]],p[e[i][1]])) for i in range(len(e))])
                # MW is 2D only now.
                # This explain the following licenses
                lp = lp[:,:,:2]
                dim = lp.shape[2]
                # d euclidian distance
                d = np.sqrt(np.sum((lp[:,0]-lp[:,1])**2,axis=1))
                slp = np.shape(lp)[1]

                # evaluation of all LDPs
                if LDP=='all':
                    pa = np.vstack(p.values())
                    lpa = len(pa)
                    Pr = []
                    TOA = []
                    lsens = np.array(())
                    loss = np.array(())
                    frees = np.array(())
                    lepwr = np.array(())

                    for i in range(lpa-1):
                        # excess time of flight + losses computation
                        #
                        # Losst returns 4 parameters
                        #   Lo Lp Edo Edp
                        #
                        pdb.set_trace()
                        MW = lo.Losst(self.L,model.f,pa[i+1:lpa,:dim].T,pa[i,:dim])
                        # MW = lo.Loss0_v2(self.L,pa[i+1:lpa],model.f,pa[i])
                        # loss free space

                        frees=np.hstack((frees,
                                         lo.PL(np.array([model.f]),
                                         pa[i+1:lpa,:dim].T,
                                         pa[i,:dim].reshape(2,1),
                                         model.rssnp)[0] ))

                        # Pr.extend(lepwr - MW[0] - frees)
                        # WARNING : only one polarization is taken into
                        # account here
                        # save losses computation

                        loss = np.hstack((loss,MW[0][0]))
                        # save excess tof computation
                        TOA  = np.hstack((TOA,MW[2][0]))

                    # emmited power for the first nodes of computed edges
                    lepwr1 = [epwr[i[0]][RAT] for i in e]
                    lepwr2 = [epwr[i[1]][RAT] for i in e]
                    Pr = lepwr1 - loss - frees

                    # concatenate reverse link
                    Pr = np.hstack((Pr, lepwr2 - loss - frees))
                    P = np.outer(Pr,[1,1])
                    P[:,1] = model.sigrss
                    lsens = [sens[i[0]][RAT] for i in e] + [sens[i[1]][RAT] for i in e]

                    # visibility or not
                    v = P[:,0] > lsens

                    # same toa for link and reverse link
                    T = np.hstack((TOA+d/0.3,TOA+d/0.3))
                    T=np.outer(T,[1,1])
                    T[:,1]=self.sigmaTOA*0.3
                    d=np.hstack((d,d))
                    return (P,T,d,v)




#                elif LDP == 'Pr':
#                    pa = np.vstack(p.values())
#                    pn = p.keys()
#                    lpa = len(pa)
#                    Lwo = []
#                    frees=[]
#                    lepwr=[]
#                    for i in range(lpa-1):
#                        lo.append(Loss0_v2(self.L,pa[i+1:lpa],model.f,pa[i]))
#                        Lwo.extend(Loss0_v2(self.L,pa[i+1:lpa],model.f,pa[i])[0])
#                        frees.extend(PL(pa[i+1:lpa],model.f,pa[i],model.rssnp))
#                        lepwr.extend(epwr[i+1:lpa])
#                    return ([[lepwr[i] - Lwo[i]-frees[i],model.sigrss] for i in range(len(Lwo))],d)
#           
#                elif LDP == 'TOA': #### NOT CORRECT !
#                    std = self.sigmaTOA*sp.randn(len(d))
#                    return ([[max(0.0,(d[i]+std[i])*0.3),self.sigmaTOA*0.3] for i in range(len(d))],d)


            else :
                return (np.array((0.,0.)),np.array((0.,0.)),np.array((0.,0.)),np.array((0.,0.)))


        elif self.method == 'raytracing':
            print 'Okay, I think we\'ve got something to append in the TODO list'


        else :
            raise NameError('invalid method name')