def batch(self, filename): # The contents of the scenario file are meant as a batch list: send to server and clear stack result = stack.openfile(filename) if result: scentime, scencmd = stack.get_scendata() self.send_event(b'BATCH', (scentime, scencmd)) self.reset() return result
def batch(self, filename): # The contents of the scenario file are meant as a batch list: send to manager and clear stack result = stack.openfile(filename) scentime, scencmd = stack.get_scendata() if result is True: manager.sendEvent(BatchEvent(scentime, scencmd)) self.reset() return result
def preupdate(): # print('settings {}'.format(CONF.conf)) # First run the environment must be initialized to get the first state ready before model inference can take place. if sim.simt < CONF.update_interval*1.5: new_state = env.init() elif traf.ntraf!=0: # Construct new state state, reward, new_state, done = env.step() agent.update_cum_reward(reward) agent.update_replay_memory(state, reward, done, new_state) # if agent.replay_memory.num_experiences > agent.batch_size: # print('memory_size', agent.replay_memory.num_experiences) if agent.replay_memory.num_experiences > 1000 or agent.replay_memory.num_experiences == agent.memory_size: # agent.train_no_batch() agent.train() # agent.write_summaries(reward) # Now get observation without the deleted aircraft for acting. Otherwise an error occurs because the deleted # aircraft no longer exists in the stack. new_state = env.get_observation() collision = env.check_collision() if traf.ntraf!=0 and not collision: action = agent.act(new_state) env.action_command(action) # if collision: # agent.cum_reward = -200 # Check if all aircraft in simulation landed and there are no more scenario commands left if (env.get_done() and len(stack.get_scendata()[0])==0) or collision or env.step_num>200: print(env.get_done(), len(stack.get_scendata()[0]), collision, env.step_num>170) # Reset environment states and agent states if env.episode % CONF.test_freq==0: agent.save_models(env.episode) env.reset() agent.reset()
def step(self): ''' Perform a simulation timestep. ''' # When running at a fixed rate, or when in hold/init, # increment system time with sysdt and calculate remainder to sleep. if not self.ffmode or not self.state == bs.OP: remainder = self.syst - time.time() if remainder > MINSLEEP: time.sleep(remainder) elif self.ffstop is not None and self.simt >= self.ffstop: if self.benchdt > 0.0: bs.scr.echo('Benchmark complete: %d samples in %.3f seconds.' % \ (bs.scr.samplecount, time.time() - self.bencht)) self.benchdt = -1.0 self.pause() else: self.op() if self.state == bs.OP: # Plugins pre-update plugin.preupdate(self.simt) # Update screen logic bs.scr.update() # Simulation starts as soon as there is traffic, or pending commands if self.state == bs.INIT: if self.syst < 0.0: self.syst = time.time() if bs.traf.ntraf > 0 or len(stack.get_scendata()[0]) > 0: self.op() if self.benchdt > 0.0: self.fastforward(self.benchdt) self.bencht = time.time() if self.state == bs.OP: stack.checkfile(self.simt) # Always update stack stack.process() if self.state == bs.OP: bs.traf.update(self.simt, self.simdt) # Update plugins plugin.update(self.simt) # Update Plotter plotter.update(self.simt) # Update loggers datalog.postupdate() # Update sim and UTC time for the next timestep self.simt += self.simdt self.utc += datetime.timedelta(seconds=self.simdt) # Always update syst self.syst += self.sysdt # Inform main of our state change if not self.state == self.prevstate: self.sendState() self.prevstate = self.state
def doWork(self): self.syst = int(time.time() * 1000.0) # Send list of stack functions available in this sim to gui at start stackdict = { cmd: val[0][len(cmd) + 1:] for cmd, val in stack.cmddict.items() } manager.sendEvent(StackInitEvent(stackdict)) while self.running: if self.state == Simulation.op: # Plugins pre-update plugin.preupdate(self.simt) # Datalog pre-update (communicate current sim time to loggers) datalog.preupdate(self.simt) # Update screen logic bs.scr.update() # Simulation starts as soon as there is traffic, or pending commands if self.state == Simulation.init: if bs.traf.ntraf > 0 or len(stack.get_scendata()[0]) > 0: self.start() if self.benchdt > 0.0: self.fastforward(self.benchdt) self.bencht = time.time() if self.state == Simulation.op: stack.checkfile(self.simt) # Always update stack stack.process() if self.state == Simulation.op: bs.traf.update(self.simt, self.simdt) # Update metrics # self.metric.update() # Update plugins plugin.update(self.simt) # Update loggers datalog.postupdate() # Update time for the next timestep self.simt += self.simdt # Update clock self.simtclock = (self.deltclock + self.simt) % onedayinsec # Process Qt events manager.processEvents() # When running at a fixed rate, or when in hold/init, increment # system time with sysdt and calculate remainder to sleep if not self.ffmode or not self.state == Simulation.op: self.syst += self.sysdt remainder = self.syst - int(1000.0 * time.time()) if remainder > 0: QThread.msleep(remainder) # If running in fast-time with an end-time that has passed, go back to # real-time running. elif self.ffstop is not None and self.simt >= self.ffstop: # If this fast-time section was part of a benchmark, send # message with benchmark results if self.benchdt > 0.0: bs.scr.echo( 'Benchmark complete: %d samples in %.3f seconds.' % (bs.scr.samplecount, time.time() - self.bencht)) self.benchdt = -1.0 self.pause() else: self.start() # Inform main of our state change if not self.state == self.prevstate: self.sendState() self.prevstate = self.state