package bugs
/**
* Created with IntelliJ IDEA.
* User: arya
* Date: 12/18/12
* Time: 4:17 PM
* To change this template use File | Settings | File Templates.
*/
object currenttype2 {
type Reward = Double
trait AbstractAgent[State,Action] {
type A = AbstractAgent[State,Action]
def chooseAction(s: State): Action
def startEpisode: A = this
def learn(s1: State, a: Action, s2: State, r: Reward): A
}
case class RewardFunction[State,Action](r: (State,Action,State) => Reward)
trait Rules[G<:GameDomain] {
def simulate(state: G#State, agentActions: List[(G#Agent,G#Action)]): G#State
}
trait AgentSimulation[G<:GameDomain] {
val agents: List[G#Agent]
val state: G#State
val rewards: Map[G#Agent,G#Rewards]
val rules: Rules[G]
val pastHistory: List[G#State]
lazy val currentHistory = state :: pastHistory
lazy val actions: Map[G#Agent,G#Action] = agents.map(a => a -> a.chooseAction(state)).toMap
lazy val nextState: G#State = rules.simulate(state, actions.toList)
def step: AgentSimulation[G]
}
case class LearningSimulation[G<:GameDomain](agents: List[G#Agent],
state: G#State,
rewards: Map[G#Agent,G#Rewards],
rules: Rules[G],
pastHistory: List[G#State] = Nil) extends AgentSimulation
{
lazy val step: LearningSimulation = {
val updatedAgents: List[G#Agent] = agents map { agent =>
val (s,a,s2) = (state,actions(agent),nextState)
val r = rewards(agent).r(s,a,s2)
agent.learn(s,a,s2,r): G#Agent
}
copy(agents = updatedAgents, state = nextState, pastHistory = currentHistory)
}
}
trait GameDomain {
domain =>
type State
type Action
type Agent = AbstractAgent[State, Action] // agent supertype
type Rewards = RewardFunction[State,Action]
}
}