.. _quickstart:

Quick Start
===============

A quick example to use the gym is as follows. This import the hyperbolic PDE gym, sets some basic parameters
and runs an open-loop controller. Detailed tutorials are avilable for the gym `here <../guide/tutorials.html>`_.

.. code-block:: python

	import gymnasium as gym
	import pde_control_gym
	from pde_control_gym.src import TunedReward1D
	import numpy as np

	# NO NOISE
	def noiseFunc(state):
		return state


	# Set initial condition function here
	def getInitialCondition(nx):
		return np.ones(nx) * np.random.uniform(1, 10)


	# Constant beta function
	def getBetaFunction(nx):
		return np.ones(nx)


	# Timestep and spatial step for PDE Solver
	T = 5
	dt = 1e-4
	dx = 1e-2
	X = 1 

	reward_class =  TunedReward1D(int(round(T/dt)), -1e-4, 1e2)

	hyperbolicParameters = {
		"T": T, 
		"dt": dt, 
		"X": X,
		"dx": dx, 
		"reward_class": reward_class,
		"normalize":None, 
		"sensing_loc": "full", 
		"control_type": "Dirchilet", 
		"sensing_type": None,
		"sensing_noise_func": lambda state: state,
		"limit_pde_state_size": True,
		"max_state_value": 1e10,
		"max_control_value": 20,
		"reset_init_condition_func": getInitialCondition,
		"reset_recirculation_func": getBetaFunction,
		"control_sample_rate": 0.1,
	}	

	# Make the hyperbolic PDE gym
	env = gym.make("PDEControlGym-TransportPDE1D", **hyperbolicParameters)

	# Run a single environment test case for gamma=7.35
	terminate = False
	truncate = False

	# Reset Environment
	obs, __ = env.reset()
	totalReward = 0

	while not truncate and not terminate:
		# 0 action input
		obs, rewards, terminate, truncate, info = env.step(0)
		totalReward += rewards
	print(totalReward)
