Beispiel #1
0
 def set_patches(self, x):
     rgb = self.patch_colours[str(x)]
     rgb = tuple(common.clamp(x*255.0, 0, 255) for x in rgb)
     for p in self.probe_meta.values():
         p['patch'].setStyleSheet("QWidget { background-color: rgb(%d, %d, %d) }" % rgb)
         p['patch'].show()
         p['patch'].setAutoFillBackground(True)
Beispiel #2
0
 def tune_steering_slow(atc, iErrf, imaxAA, AM):
     atc.atPID.P = 1
     atc.atPID.I = 0
     atc.atPID.D = 0
     slowF = (1 + SlowConfig.SlowTorqueF /
              max(atc.engineF.acceleration, atc.engineF.deceleration))
     noise_scale = clamp(
         abs(50 * (abs(atc.avPID.perror) + abs(atc.error / np.pi)))**0.5,
         0.01, 1)
     if atc.MaxAA >= 1:
         atc.avPID.P = SlowConfig.avP_HighAA_Scale / slowF * noise_scale
         atc.avPID.D = clampL(
             SlowConfig.avD_HighAA_Intersect -
             SlowConfig.avD_HighAA_Inclination * atc.MaxAA,
             SlowConfig.avD_HighAA_Max) * noise_scale
     else:
         atc.avPID.P = SlowConfig.avP_LowAA_Scale / slowF * noise_scale
         atc.avPID.D = (
             SlowConfig.avD_LowAA_Intersect -
             SlowConfig.avD_LowAA_Inclination * atc.MaxAA) * noise_scale
     atc.avPID.I = SlowConfig.avI_Scale * clampH(atc.MaxAA, 1) * noise_scale
     # avFilter.ratio = clamp(abs(atc.AV)+abs(atc.error/np.pi)*500, 0.01, 1)
     # AV = avFilter.EWA(atc.AV)
     AV = atc.AV
     update_pids(atc, AV)
def eu4(coord: GeoCoord) -> MapCoord:
    lat, lon = coord.lat, coord.lon
    # the eu4 map is mostly miller, but:
    # (1) the poles are trimmed
    if not radians(-56) < lat < radians(72):
        return 1, 1
    # (2) east siberia is stretched
    if radians(50) < lat and radians(154) < lon:
        lat += (lon - radians(154)) / 3
    # (3) australia is shunken and moved northward
    if lat < radians(-11) and radians(112) < lon < radians(154):
        lat = remap(lat, radians(-39), radians(-11), radians(-35),
                    radians(-11))
        lon = remap(lon, radians(112), radians(154), radians(116),
                    radians(151))
    # (4) new zealand is moved northward
    if lat < radians(-33) and radians(165) < lon:
        lat += radians(8)
    # (5) greenland and iceland and jan mayen are moved northward
    if radians(-57) < lon < radians(-8) and radians(59) < lat:
        lat += radians(5)
    # (6) the americas are moved northward
    elif lon < radians(-34):
        lat += radians(13)
        # (7) in addition, the bottom of south america is squished
        if lat < radians(-31):
            lat = remap(lat, radians(-45), radians(-31), radians(-37),
                        radians(-31))
    y, x = miller(clamp(lat, -pi / 2, pi / 2), lon)
    y = remap(y, -28 / 90, 61 / 90, -1, 1)
    return MapCoord(x, y)
Beispiel #4
0
 def tip_over(self):
     start_roll = self.start_roll
     end_roll = self.end_roll
     completion = clamp(
         (self.mean_altitude() - start_roll) / (end_roll - start_roll))
     target_pitch = 90 * (1.0 - completion)
     if abs(target_pitch - self.ap.target_pitch) > 0.5:
         self.ap.target_pitch_and_heading(target_pitch, self.target_heading)
Beispiel #5
0
 def set_patches(self, x):
     rgb = self.patch_colours[str(x)]
     rgb = tuple(common.clamp(x * 255.0, 0, 255) for x in rgb)
     for p in self.probe_meta.values():
         p['patch'].setStyleSheet(
             "QWidget { background-color: rgb(%d, %d, %d) }" % rgb)
         p['patch'].show()
         p['patch'].setAutoFillBackground(True)
Beispiel #6
0
    def compute_targets(self, batch, *args, **kwargs):
        """Compute the targets for the given batch.

        Args:
            batch (tuple): A tuple (states, actions, rewards, next_states, next_states_idx) where
                each element is a numpy array. next_states does not contain next_states for
                states where the episode ended. For this reason, next_states_idx contains indices
                to match next_states with the appropriate elements of states. I.e. if the i-th
                element of next_states_idx is k, then the k-th element of next_states refers to
                the k-th element of states.

        Returns:
            A Numpy column vector with computed target values on the rows.
        """
        states, actions, rewards, next_states, next_states_idx = batch
        actions_ts = torch.tensor(actions, dtype=self.dtype)
        rewards_ts = torch.tensor(rewards, dtype=self.dtype)
        next_states_ts = torch.tensor(next_states, dtype=self.dtype)
        next_states_idx_ts = torch.tensor(next_states_idx, dtype=torch.long)

        with torch.no_grad():
            # Sampling and clamping noise
            noise_shape = (len(next_states_idx_ts), *actions_ts.size()[1:])
            noise = torch.randn(noise_shape) * self.target_noise
            noise = common.clamp(noise, -self.noise_clip, self.noise_clip)
            # Compute target actions and clamping if a max range is specified.
            if next_states_idx.shape[0] > 0:
                next_action = self.dqac_nets.predict_target_actions(next_states_ts) + noise
                if self.max_action is not None:
                    next_action = common.clamp(next_action, self.min_action, self.max_action)
                # Compute target values
                target_values = self.dqac_nets.predict_targets(
                    next_states_ts,
                    next_action,
                    mode='min'
                )
                rewards_ts[next_states_idx_ts] += self.df * target_values
        return rewards_ts.detach().numpy()
Beispiel #7
0
 def on_frame():
     alt_err = alt - self.dX
     if self.AS > 0 or self.DS > 0:
         if alt_err > 0:
             self.pid.kp = clamp(0.01 * abs(alt_err) / clampL(self.upV, 1), 0.0, d)
         elif alt_err < 0:
             self.pid.kp = clamp(self.twr ** 2 / clampL(-self.upV, 1), 0.0, clampH(d * self.twr / 2, d))
         else: self.pid.kp = d
     self.pid.kd = d / clampL(self.dX, 1)
     if alt_err < 0: alt_err = alt_err / clampL(self.dX, 1)
     self.maxV = self.pid.update(alt_err)
     print self.pid, alt_err, clamp(0.01 * abs(alt_err) / clampL(self.upV, 1), 0.0, d), d
     if self.N > 0:
         dV = (self.upV - self.dV) / clampL(self.dX, 1)
         if alt_err < 0:
             #                     print '% f %+f = %f' % (dV/clampL(self.dX/50, 1), clampL(alt_err*self.dX/5000*self.twr, self.pid.min*10), dV/clampL(self.dX/50, 1) + clampL(alt_err*self.dX/5000*self.twr, self.pid.min*10))
             dV = dV + clampL(alt_err * self.dX / 500 * self.twr, self.pid.min * 10)
         else:
             dV = clampL(dV, 0)
         #                 print dV
         self.dVsp.append(dV)
         self.maxV += dV
     self.Vsp.append(self.maxV)
Beispiel #8
0
    def act(self, mean, *args, **kwargs):
        """Compute the action by sampling from a standard Gaussian with zero mean and epsilon
        variance.

        Args:
            mean (torch.Tensor): The predicted action, that will be used as mean.

        Returns:
            A Tensor with the same shape of mean, containing the chosen action.
        """
        noise = torch.randn_like(mean) * np.sqrt(
            self.epsilon_updater.cur_value)
        action = mean + noise
        action = common.clamp(action, self.min_action, self.max_action)
        self.epsilon_updater.update()
        return action
Beispiel #9
0
    def tune_steering_mixed(atc, iErrf, imaxAA, AM):
        if atc.InstantRatio > 0.3:
            tune_steering_fast(MixedConfig3plus, atc, iErrf, imaxAA, AM)
        else:
            # if atc.MaxAA >= 1:
            #     atc.atPID.P = 20
            #     atc.atPID.I = 0
            #     atc.atPID.D = 0
            #     atc.avPID.P = 1/clampL(abs(AM)/atc.MaxAA**0.2/12, 1)
            #     atc.avPID.I = 0.002
            #     atc.avPID.D = 1.4/atc.MaxAA**0.3
            # else:
            #     atc.atPID.P = 40/clampL(abs(AM)/2, 1)
            #     atc.atPID.I = 0
            #     atc.atPID.D = 0
            #     atc.avPID.P = 1/clampL(abs(AM)/12, 1)
            #     atc.avPID.I = 0.001
            #     atc.avPID.D = 1.4/atc.MaxAA**0.3

            # clampH(abs(40*(abs(atc.avPID.perror)+abs(atc.error/np.pi)))**6, 1)
            noise_scale = clamp((50 * (abs(atc.AV) + atc.errorF))**0.6, 0.001,
                                1)

            atc.atPID.P = 1  #clamp(0.5*atc.MaxAA**0.5, 0.0001, 1)
            atc.atPID.I = 0
            atc.atPID.D = 0

            atc.avPID.P = (
                (MixedConfig.avP_A /
                 (atc.InstantRatio**MixedConfig.avP_D + MixedConfig.avP_B) +
                 MixedConfig.avP_C)) / clampL(abs(AM),
                                              1) / atc.MaxAA * noise_scale
            atc.avPID.D = (
                (MixedConfig.avD_A /
                 (atc.InstantRatio**MixedConfig.avD_D + MixedConfig.avD_B) +
                 MixedConfig.avD_C)) / atc.MaxAA * noise_scale
            atc.avPID.I = MixedConfig.avI_Scale * clampH(atc.MaxAA,
                                                         1) * noise_scale

            # atc.avPID.P = (1 + 8 / atc.MaxAA) * noise_scale
            # atc.avPID.D = clampH((clampL(abs(AM) / atc.MaxAA, 1) ** 0.1 - 1), 2) * noise_scale

            # avFilter.ratio = clamp((abs(atc.avPID.perror)+abs(atc.error/np.pi))/atc.InstantRatio*50, 0.1, 1)
            # AV = avFilter.EWA(atc.AV)
            # print avFilter.ratio
            AV = atc.AV
            update_pids(atc, AV)
Beispiel #10
0
def thrust_controller(vessel, deltaV):
    '''
    This function is somewhat arbitrary in it's working - there's not a 'rule'
    that I've found on how to feather out throttle towards the end of a burn
    but given that the chances of overshooting go up with TWR (since we fly
    in a world with discrete physics frames!) it makes sense to relate the
    throttle to the TWR for this purpose.
    '''
    if not vessel.available_thrust:
        vessel.control.activate_next_stage()
        if not vessel.available_thrust:
            vessel.control.activate_next_stage()
        time.sleep(0.1)
    TWR = vessel.available_thrust / vessel.mass
    min_throttle = 0.00
    throttle = min_throttle + deltaV / TWR / 2
    throttle = clamp(throttle)
    return throttle, TWR * throttle
 def tune_steering_slow(atc, iErrf, imaxAA, AM):
     atc.atPID.P = 1
     atc.atPID.I = 0
     atc.atPID.D = 0
     slowF = (1 + SlowConfig.SlowTorqueF / max(atc.engineF.acceleration, atc.engineF.deceleration))
     noise_scale = clamp(abs(50 * (abs(atc.avPID.perror) + abs(atc.error / np.pi))) ** 0.5, 0.01, 1)
     if atc.MaxAA >= 1:
         atc.avPID.P = SlowConfig.avP_HighAA_Scale/slowF * noise_scale
         atc.avPID.D = clampL(SlowConfig.avD_HighAA_Intersect - SlowConfig.avD_HighAA_Inclination * atc.MaxAA,
                              SlowConfig.avD_HighAA_Max) * noise_scale
     else:
         atc.avPID.P = SlowConfig.avP_LowAA_Scale/slowF * noise_scale
         atc.avPID.D = (SlowConfig.avD_LowAA_Intersect - SlowConfig.avD_LowAA_Inclination * atc.MaxAA) * noise_scale
     atc.avPID.I = SlowConfig.avI_Scale*clampH(atc.MaxAA, 1) * noise_scale
     # avFilter.ratio = clamp(abs(atc.AV)+abs(atc.error/np.pi)*500, 0.01, 1)
     # AV = avFilter.EWA(atc.AV)
     AV = atc.AV
     update_pids(atc, AV)
    def _render_list(self, win, list,
                     row_start, n_rows,
                     col_start, n_cols,
                     selected_i,
                     is_active,
                     centered=False):
        n_elems = len(list)
        start_entry_i = common.clamp(selected_i - n_rows/2,
                                     0, max(n_elems-n_rows, 0))
        end_entry_i = start_entry_i + n_rows
        display_list = list[start_entry_i:end_entry_i]

        for i, entry in enumerate(display_list):
            text = str(entry)
            if i == (selected_i-start_entry_i) and is_active:
                style = uc.A_BOLD | uc.A_STANDOUT
            else:
                style = uc.A_NORMAL
            self._render_text(win, row_start+i, col_start, text, n_cols, style, centered=centered)
Beispiel #13
0
    async def max(self, ctx, *, arg=''):
        uid = ctx.author.id
        if uid not in self.raids:
            return

        raid = self.raids[uid]
        if raid.channel != ctx.channel:
            return await send_message(
                ctx,
                f'You may only adjust this in your active raid channel.',
                error=True)

        if not arg:
            return await send_message(ctx,
                                      f'Please enter a number, i.e. `.max 18`',
                                      error=True)

        try:
            n = int(arg)
        except ValueError:
            return await send_message(ctx,
                                      f'Please enter a number, i.e. `.max 18`',
                                      error=True)

        n = clamp(n, 3, 30 if raid.mode == QUEUE else 50)
        size = raid.pool.size()
        if n < size:
            return await send_message(
                ctx,
                f'You cannot go lower than the current pool size ({size}).',
                error=True)

        if raid.max_joins == n:
            return await send_message(ctx,
                                      f'That\'s... already the max.',
                                      error=True)

        verb = 'increased' if raid.max_joins < n else 'decreased'
        raid.max_joins = n
        await raid.update_channel_emoji()
        await ctx.send(f'Max participants {verb} to **{n}**.')
    def tune_steering_mixed(atc, iErrf, imaxAA, AM):
        if atc.InstantRatio > 0.3:
            tune_steering_fast(MixedConfig3plus, atc, iErrf, imaxAA, AM)
        else:
            # if atc.MaxAA >= 1:
            #     atc.atPID.P = 20
            #     atc.atPID.I = 0
            #     atc.atPID.D = 0
            #     atc.avPID.P = 1/clampL(abs(AM)/atc.MaxAA**0.2/12, 1)
            #     atc.avPID.I = 0.002
            #     atc.avPID.D = 1.4/atc.MaxAA**0.3
            # else:
            #     atc.atPID.P = 40/clampL(abs(AM)/2, 1)
            #     atc.atPID.I = 0
            #     atc.atPID.D = 0
            #     atc.avPID.P = 1/clampL(abs(AM)/12, 1)
            #     atc.avPID.I = 0.001
            #     atc.avPID.D = 1.4/atc.MaxAA**0.3

            # clampH(abs(40*(abs(atc.avPID.perror)+abs(atc.error/np.pi)))**6, 1)
            noise_scale = clamp((50 * (abs(atc.AV) + atc.errorF)) ** 0.6, 0.001, 1)

            atc.atPID.P = 1#clamp(0.5*atc.MaxAA**0.5, 0.0001, 1)
            atc.atPID.I = 0
            atc.atPID.D = 0

            atc.avPID.P = ((MixedConfig.avP_A / (atc.InstantRatio ** MixedConfig.avP_D + MixedConfig.avP_B) +
                           MixedConfig.avP_C)) / clampL(abs(AM), 1) / atc.MaxAA * noise_scale
            atc.avPID.D = ((MixedConfig.avD_A / (atc.InstantRatio ** MixedConfig.avD_D + MixedConfig.avD_B) +
                            MixedConfig.avD_C)) / atc.MaxAA * noise_scale
            atc.avPID.I = MixedConfig.avI_Scale * clampH(atc.MaxAA, 1) * noise_scale

            # atc.avPID.P = (1 + 8 / atc.MaxAA) * noise_scale
            # atc.avPID.D = clampH((clampL(abs(AM) / atc.MaxAA, 1) ** 0.1 - 1), 2) * noise_scale


            # avFilter.ratio = clamp((abs(atc.avPID.perror)+abs(atc.error/np.pi))/atc.InstantRatio*50, 0.1, 1)
            # AV = avFilter.EWA(atc.AV)
            # print avFilter.ratio
            AV = atc.AV
            update_pids(atc, AV)
def victoria2(coord: GeoCoord) -> MapCoord:
    lat, lon = coord.lat, coord.lon
    # the victoria 2 map is identical to the eu4 map, except AUS and south america are left unchanged.
    # (1) the poles are trimmed
    if not radians(-56) < lat < radians(72):
        return 1, 1
    # (2) east siberia is stretched
    if radians(50) < lat and radians(154) < lon:
        lat += (lon - radians(154)) / 3
    # (3) new zealand is moved northward, but less than eu4
    if lat < radians(-33) and radians(165) < lon:
        lat += radians(4)
    # (4) greenland and iceland and jan mayen are moved northward
    if radians(-57) < lon < radians(-8) and radians(59) < lat:
        lat += radians(5)
    # (5) the americas are moved northward
    elif lon < radians(-34):
        lat += radians(13)
    y, x = miller(clamp(lat, -pi / 2, pi / 2), lon)
    y = remap(y, -32 / 90, 61 / 90, -1, 1)
    return MapCoord(x, y)
Beispiel #16
0
def ditherInertia(botId, dith, damp):
    if not S2R_DITHER:
        return

    # dither mass, inertia
    for j in range(1, 4):
        dinfo = p.getDynamicsInfo(botId, j)
        mass = cm.dither(dinfo[0], dith)
        x = cm.dither(dinfo[2][0], dith**2)
        y = cm.dither(dinfo[2][1], dith**2)
        moment = (x, y, y)
        damping = 0
        if 1 == j:
            damping = cm.clamp(cm.dither(damp, dith), 0, .001)
        if 3 == j:
            y = cm.dither(dinfo[2][2], dith)
            moment = (x, x, y)
        p.changeDynamics(botId,
                         j,
                         mass=mass,
                         localInertiaDiagonal=moment,
                         jointDamping=damping)
Beispiel #17
0
    async def send_confirm_prompt(self, ctx, options):
        async with self.lock:
            if self.confirmed or self.channel or self.wfr_message:
                return

            self.raid_name = options['raid_name']
            self.mode = options['mode']
            self.max_joins = clamp(options['max_joins'], 3, 30 if options['mode'] == QUEUE else 50)
            self.private = False
            self.locked = False
            self.desc = options.get('desc', None)
            self.emoji = options.get('emoji', None)

            # move to confirm and create
            # if self.mode == FFA and 'ffa' not in self.raid_name.lower():
            #     self.raid_name = f'''ffa {self.raid_name}'''

            msg, reactions = self.make_prompt_text()

            self.wfr_message = await ctx.send(msg)
            for reaction in reactions:
                await self.wfr_message.add_reaction(reaction.strip('<>'))

            self.bot.wfr[self.host_id] = self
Beispiel #18
0
 def NextThrottle(dV, prev):
     dt = clamp(dV / 10, 0.5, 2)
     return clamp((dV / MaxThrust * M - prev * ThrustDecelerationTime) / dt, 0, 1)
Beispiel #19
0
def randTraj(action):
    if np.random.uniform(0, 1) > 0.0:
        action += cm.sgn() * round(np.random.uniform(0, 1)**3 * 4, 0)
    action = cm.clamp(action, 0, len(action_table) - 1)

    return int(action)
 def update_pids(atc, AV):
     atc.atPID.update2(abs(atc.error), -np.sign(atc.error)*AV)
     avErr = abs(atc.atPID.action) * np.sign(atc.error) - AV
     atc.avPID.update(avErr)
     atc.avPID.action = avFilter.EWA(clamp(atc.avPID.action, -1, 1))
 def update_pids(cfg, atc, iErrf):
     # avFilter.ratio = clamp(abs(atc.AV) + abs(atc.error / np.pi), 0.1, 1)
     # AV = avFilter.EWA(atc.AV)
     atc.atPID.update2(atc.error, -atc.AV)
     atc.atPID.action = clamp(atc.atPID.action, -1, 1)
Beispiel #22
0
 def update_pids(atc, AV):
     atc.atPID.update2(abs(atc.error), -AV)
     avErr = abs(atc.atPID.action) * np.sign(atc.error) - AV
     atc.avPID.update(avErr)
     atc.avPID.action = avFilter.EWA(clamp(atc.avPID.action, -1, 1))
 def update_pids(cfg, atc, iErrf):
     # avFilter.ratio = clamp(abs(atc.AV) + abs(atc.error / np.pi), 0.1, 1)
     # AV = avFilter.EWA(atc.AV)
     atc.atPID.update2(atc.error, -atc.AV)
     atc.atPID.action = clamp(atc.atPID.action, -1, 1)