Esempio n. 1
0
from buffer import Buffer
import configs

env = DroneEnv()
ppo = PPO()
buffer = Buffer()

while (True):
    s = env.reset()

    while (True):

        a = ppo.choose_action(s)
        s_, r, done, _ = env.step(a)

        buffer.append(s, a, r)
        s = s_

        if (env.t + 1) % configs.BATCH == 0:

            v = ppo.getValue(s_)
            buffer.discount(v)
            #print(f'{v}   {np.linalg.norm(s[0:3]-s[3:6])}   {s}   ')

            f = buffer.format()
            ppo.update(f[0], f[1], f[2])
            buffer.clear()

        if done:
            break
Esempio n. 2
0
class Car(object):
    """Objecto carro
    Args:
        x: posición en x
        y: posición en y
        inner_radius: radio interior
        radius: radio externo
        inner_color: color interno
        color: color externo
        Id: Identifcador del auto
        map_size: Dimensiones del mapa
        d2d: D2D bandera habilitar esta tecnología
    """
    max_demand = 1  # Mbps

    def __init__(self,
                 x=0.0,
                 y=0.0,
                 inner_radius=3,
                 radius=16,
                 inner_color=(2, 2, 2, 128),
                 color=(52, 235, 222, 128),
                 Id="Car",
                 indx=None,
                 map_size=None,
                 d2d=True,
                 stop=False):
        if map_size is None:
            map_size = [1024, 768]
        self.kind = "car"
        self.indx = indx
        self.dt = 1 / 30
        self.position = Vector2(x, y)
        self.lastPosition = self.position
        self.inner_radius = inner_radius
        self.radius = radius
        self.inner_color = inner_color
        self.color = color
        self.link_color = (20, 50, 100)
        self.Id = Id
        self.dir = randint(1, 4)
        self.lastDir = self.dir
        self.newDir = self.dir
        self.dic = {1: "Derecha", 2: "Izquierda", 3: "Arriba", 4: "Abajo"}
        self.stop = stop
        self.turn = False
        self.edificeNumbers = 0
        self.randomCounter = randint(10, 150)
        self.currentEdifice = 0
        self.i = 0
        self.collide = False
        self.speed = 2

        self.map_size = map_size
        pygame.font.init()
        try:
            self.font = pygame.font.Font(None, 30)
        except Exception as e:
            print(e)
        self.text_surface = self.font.render(self.Id, True,
                                             pygame.Color('dodgerblue1'))
        self.text_rect = self.text_surface.get_rect()
        self.connectionsList = Register(Id=Id)

        self.subcarriers = Subcarries()

        self.femtoID = ""
        self.femtoIndx = None
        self.d2d = d2d
        # For record
        self.distanceFC = 0
        self.isConnected = False
        self.recording = False
        self.recordLimit = 500
        self.T = 25
        self.Bw = 5

        self.buffer = Buffer(snri=0, interference=0, capacity=0, demand=0)

        self.demand = 0  # Mbps
        self.prx = -100  # dBm
        self.t = 0  # segs
        self.snri = 0  #
        self.interference = 0  #

        self.Ptx = subcarrier_power(d=5.0, dB=True)
        self.updateDemand(random=False)
        self.bw_assigned = 0
        self.rf_su = 1  # suma del datarate de los subscriptores
        self.ym = 2  # Eficiencia espectral MC
        self.yf = 6  # Eficiencia esoectral FC
        self.No = -174  # dBm/Hz
        self.fc = 2300  # MHz

        self.pm = 60  # dBm Potencia MC
        self.pf = 10  # dBm Potencia FC
        self.alpha_f = 0  # Pertenece a femtocelda
        self.alpha_mc = 0  # Pertencece a macrocelda
        self.Nsc = 256  # Número de Subportadoras
        self.bwsc = 15 / 1000  # MHz Ancho de Banda por subportadora
        self.bits_mod = 6
        self.subscribed = False
        self.subscriptorColorText = (100, 100, 100)
        self.subscriptorColor = (250, 200, 20, 100)
        self.subsCount = 1

        self.fcs = {}
        self.users = {}
        self.neighbors = {}
        self.maxTime = 60  # segs
        self.coalition = False
        self.capacity = 0.0

    def getData(self):
        self.buffer.stop(clear=False)
        return self.buffer.get_data()

    def isConnectedWith(self, user=None):
        r1 = self.radius  # radio del objecto actual
        r2 = user.inner_radius  # radio del objecto a comparar
        pos1 = self.position
        pos2 = user.position
        distance = pos2 - pos1
        rad_sum = r1 + r2
        self.distanceFC = distance.magnitude()
        if distance.magnitude() <= rad_sum:
            return True
        else:
            return False

    def connectWithNeighbors(self, surface=None):
        """El objeto actual se conectará con otros usuarios si d2d es True"""
        if self.d2d:
            for neighbor in self.neighbors.values():
                if self.isConnectedWith(user=neighbor):
                    self.drawLink(surface=surface,
                                  user=neighbor,
                                  color=(243, 122, 8))
                    #self.subcarriers.setLink(user1=self.Id, user2=neighbor.Id)
                    #self.connectionsList.add(element=neighbor)
                else:
                    #self.connectionsList.delete(element=neighbor)
                    #self.subcarriers.removeLink(self.Id, neighbor.Id)
                    pass

    def connectWithUsers(self, surface=None):
        """El objeto actual se enlazará con aquellos objetos en su área de cobertura"""
        for user in self.users.values():
            if self.isConnectedWith(user=user):
                self.drawLink(surface=surface, user=user)

    def setNeighbors(self, neighbors=None):
        """Guarda la lista de usuarios vecinos"""
        for neighbor in neighbors.values():
            if neighbor.Id != self.Id:
                self.neighbors[neighbor.Id] = neighbor

    def setFemtocells(self, fcs):
        """Guarda la lista de femtoceldas"""
        for fc in fcs.values():
            if fc.Id != self.Id:
                self.fcs[fc.Id] = fc

    def setUsers(self, users=None):
        """Guarda la lista de usuarios (Usado por femtocelda)"""
        self.users = users

    def setFemtocellUsers(self, users=None):
        self.users = users

    def setSubscription(self, femtoID=None, femtoIndx=None):
        """Subscribe el usuario a la Femtocelda indicada en ID"""
        if femtoID is not None:
            self.femtoID = femtoID
            self.subscribed = True
            self.femtoIndx = femtoIndx
            if self.femtoIndx:
                self.Id = self.femtoID + " / S" + str(self.femtoIndx)
                self.text_surface = self.font.render(self.Id, True,
                                                     self.subscriptorColorText)
                self.color = self.subscriptorColor

    def clearSubscription(self):
        """Elimina la subscripción"""
        self.femtoID = ""
        self.subscribed = False
        self.femtoIndx = None
        self.Id = "C " + self.indx

    def isSubscribed(self):
        """¿Está subscrito?"""
        return self.subscribed

    def isPublic(self):
        """¿Es usuario público?"""
        return not self.subscribed

    def getFemtoID(self):
        """Devuelve el ID de la femtocelda subscrita"""
        return self.femtoID

    def getPosition(self):
        """Devuelve la posición actual"""
        return self.position.x, self.position.y

    def getDemand(self):
        """Devuelve el tràfico"""
        return self.demand

    def draw(self, surface):
        """Dibuja el punto (carro) sobre la superficie deseada
        Args:
            surface: objeto superficie
        """
        # External radius
        rect = pygame.Rect(self.position, (0, 0)).inflate(
            (self.radius * 2, self.radius * 2))
        surf = pygame.Surface(rect.size, pygame.SRCALPHA)
        pygame.draw.circle(surf, self.color, (self.radius, self.radius),
                           self.radius)
        surface.blit(surf, rect)

        # Inner radius
        rect = pygame.Rect(self.position, (0, 0)).inflate(
            (self.inner_radius * 2, self.inner_radius * 2))
        surf = pygame.Surface(rect.size, pygame.SRCALPHA)
        pygame.draw.circle(surf, self.inner_color,
                           (self.inner_radius, self.inner_radius),
                           self.inner_radius)
        surface.blit(surf, rect)

        # Text
        surface.blit(self.text_surface, self.position)

    def edificeCollide(self, edifice=None):
        """Determina si hay colisión con alguna pared
        Args:
            edifice: objeto edifiio
        """
        r = self.inner_radius  # radio actual
        rect = edifice.rect  # rectangulo que conforma la pared
        dist_x = abs(self.position.x + r - rect.centerx)
        dist_y = abs(self.position.y + r - rect.centery)
        if dist_x > rect.w / 2 or dist_y > rect.h / 2:
            return False
        if dist_x <= rect.w / 2 or dist_y <= rect.h / 2:
            return True
        dx = dist_x - rect.w / 2
        dy = dist_y - rect.h / 2
        return (dx**2 + dy**2) <= r**2

        # circle_distance_x = abs(self.position.x - rect.centerx)
        # circle_distance_y = abs(self.position.y - rect.centery)
        # if circle_distance_x > rect.w / 2.0 or circle_distance_y > rect.h / 2.0:
        #     return False
        # if circle_distance_x <= rect.w / 2.0 or circle_distance_y <= rect.h / 2.0:
        #     return True
        # corner_x = circle_distance_x - rect.w / 2.0
        # corner_y = circle_distance_y - rect.h / 2.0
        # corner_distance_sq = corner_x ** 2.0 + corner_y ** 2.0
        # return corner_distance_sq <= r ** 2.0

    def getAroundTown(self, edifices=None):
        """Dada una lista de edificios, verificar si el auto se chocó con alguna de ellas
        Args:
            edifices: Objeto Group (grupo/lista de objetos)
        """
        # Extraer elementos del del grupo
        edifices = edifices.elements
        self.edificeNumbers = len(edifices)
        # Verificar colisión para cada pared en la lista de paredes
        # for edifice in edifices.values():
        #     self.move(edifice=edifice)
        self.move()

    def updatePosition(self):
        """Actualiza la posición del auto"""
        # Derecha
        if self.dir == 1:
            self.position.x += self.speed
        # Izquierda
        if self.dir == 2:
            self.position.x -= self.speed
        # Abajo
        if self.dir == 3:
            self.position.y -= self.speed
        # Arriba
        if self.dir == 4:
            self.position.y += self.speed

    def randomTurn(self):
        """Genera un giro aleatorio cada cierto tiempo"""
        # Contador
        self.i += 1
        if self.i >= 100:
            self.lastPosition = Vector2(self.position)
            self.lastDir = int(self.dir)
            self.newDir = randint(1, 4)  # Cambiar dirección
            self.dir = int(self.newDir)  # settear nueva dirección
            self.i = 0

    def positionLimits(self):
        """Verifica que el auto no haya salido de los límites del mapa"""
        if self.position.x >= self.map_size[0]:
            self.position.x = 1

        if self.position.x <= 0:
            self.position.x = self.map_size[0] - 4

        if self.position.y >= self.map_size[1]:
            self.position.y = 1

        if self.position.y <= 0:
            self.position.y = self.map_size[1] - 1

    def printDirs(self):
        print("actual: ", self.dic[self.dir], "|| last: ",
              self.dic[self.lastDir], "|| new: ", self.dic[self.newDir])

    def move(self, edifice=None):
        """Actualiza el estado del vehículo
        Args:
            edifice: objeto edificio
        """
        if not self.stop:
            # if self.currentEdifice <= self.edificeNumbers:
            #     # self.collide = self.edificeCollide(edifice)
            #     self.collide = False
            #     if self.collide:
            #         if self.Id == "C19":
            #             print("Colisión...")
            #     self.currentEdifice += 1
            # else:
            #     self.currentEdifice = 0
            if not self.collide:
                self.lastDir = self.dir
                #self.randomTurn()
                self.updatePosition()
            # Si existe colisión corregir movimiento
            else:
                self.fixMove()
            # Verificar si el auto está en los límites del mapa
            self.positionLimits()
            self.updateVariables()
            self.collide = False

    def fixMove(self):
        if self.Id == "C19":
            self.printDirs()
        val = self.inner_radius
        # Derecha
        if self.dir == 1:
            self.position.x -= val
        # Izquierda
        if self.dir == 2:
            self.position.x += val
        # Abajo
        if self.dir == 3:
            self.position.y += val
        # Arriba
        if self.dir == 4:
            self.position.y -= val
        self.dir = self.lastDir

    def isLinkedWith(self, user):
        """Verificar si existe enlace con"""
        return self.connectionsList.isIn(user)

    def clearVariables(self):
        """Limpiar variables"""
        self.buffer.clear()

    def updatePrx(self):
        if self.isConnected:
            self.prx = self.Ptx - propagation_losses(d=self.distanceFC,
                                                     model="FC")
        else:
            self.prx = uniform(-80, 0)

    def updateDemand(self, random=True):
        if random:
            self.demand = uniform(0, self.max_demand)
        else:
            self.demand = self.max_demand

    def updatesnri(self):
        PLvec = []
        Pscvec = []
        distance = 0
        for car in self.neighbors.values():
            if car.Id != self.Id:
                vec_dist = self.position - car.position
                distance = vec_dist.magnitude()
                if distance > 10:
                    distance = 0
                # Si el usuario está conectado
                if self.isLinkedWith(user=car):
                    pass

                PL = propagation_losses(d=distance)
                PLvec.append(PL)
                Pscvec.append(car.Ptx)

        l1 = len(PLvec)
        l2 = len(Pscvec)
        if l1 > 0 and l2 > 0:
            # self.interference = calculate_interference_cotier(Pj=Pscvec, PLsc=56)
            # self.snri = calculate_SINR(Pscvec, PLvec, I=self.interference)
            pass
        A1 = (len(self.neighbors) + uniform(-5, 5)) / (np.power(10, 17))
        A2 = (len(self.neighbors) + uniform(-5, 5)) * 0.001
        self.interference = A1 * uniform(0, 2) + uniform(
            0, 1 / np.power(10, 17))
        self.snri = A2 * uniform(0, 2) + uniform(0, 0.001)
        if not self.coalition:
            self.interference = uniform(1.1, 1.5) * self.interference
        else:
            self.snri = uniform(1.1, 1.5) * self.snri

    def updateVariables(self):
        # A1 = (len(self.neighbors) + uniform(-5, 5))/(np.power(10, 17))
        # A2 = (len(self.neighbors) + uniform(-5, 5))*0.001
        # self.interference = A1*uniform(0, 2) + uniform(0, 1/np.power(10, 17))
        # self.snri = A2*uniform(0, 2) + uniform(0, 0.001)
        """Actualiza el valor de las variables"""
        self.updatesnri()
        self.demand = uniform(0, self.max_demand)
        self.capacity = self.demand - uniform(0, 0.2 * self.demand)
        self.buffer.record(snri=self.snri,
                           interference=self.interference,
                           capacity=self.capacity,
                           demand=self.demand)
        if self.buffer.get_time_count() > 100:
            self.buffer.stop()
            if self.Id == "C19":
                # self.buffer.print_data()
                pass
            self.buffer.clear()

    def getResults(self):
        return None

    def drawLink(self, surface=None, user=None, color=(10, 10, 50)):
        """Dibujar Enlace
        Args:
            surface: objeto superficie(sobre el que se dibujar)
            user: Objeto circular, con el que se enlazará
            color: color del enlace
        """
        if surface is not None:
            pygame.draw.line(surface, color, self.position, user.position, 2)

    def addSub(self):
        self.subsCount += 1

    def deleteSub(self):
        self.subsCount -= 1
        if self.subsCount < 0:
            self.subsCount = 0
Esempio n. 3
0
        #face_locations
    )

    point = {
        'time': datetime.now(),
        #'face_locations': face_locations,
        'frame': frame,
        'current_weight': weight,
    }
    if building:
        clip.append(point)
    else:
        video_buffer.add(point)

    if not building and enough_diff:
        building = True
        clip = copy(video_buffer.q)
        video_buffer.clear()
    elif building and datetime.now() >= last_weight_event + timedelta(seconds=TIMEOUT):
        frames = list(clip)

        clip = None
        building = False

        print("creating clip of len", len(frames))
        print(archive.create_from_clip(frames))

    previous_weight = weight
    if enough_diff:
        last_weight_event = datetime.now()