-
Notifications
You must be signed in to change notification settings - Fork 4.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
MultiAgentGroup Interface #4923
Conversation
com.unity.ml-agents.extensions/Runtime/Teams/BaseTeamManager.cs
Outdated
Show resolved
Hide resolved
com.unity.ml-agents/Runtime/Agent.cs
Outdated
@@ -448,6 +463,8 @@ public void LazyInitialize() | |||
new int[m_ActuatorManager.NumDiscreteActions] | |||
); | |||
|
|||
m_Info.teamManagerId = m_TeamManager == null ? -1 : m_TeamManager.GetId(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So the convention is that -1 is "no team".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It actually should be 0 since it's what it would be in proto if using old version of C#.
com.unity.ml-agents/Runtime/Agent.cs
Outdated
@@ -698,6 +726,22 @@ public void AddReward(float increment) | |||
m_CumulativeReward += increment; | |||
} | |||
|
|||
public void SetTeamReward(float reward) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there anything preventing the user from adding team rewards manually? How will these be handled if there is no TeamManager for the Agent ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about making this method internal
and only calling it from BaseTeamManager
methods instead?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How will these be handled if there is no TeamManager for the Agent ?
Team reward will be processed (sum, mean, etc) across the team in python so if it has no TeamManager it will be processed across a team of itself. It's not meaningful in that case but it will run.
Making it internal.
com.unity.ml-agents/Runtime/Agent.cs
Outdated
@@ -1354,5 +1401,15 @@ void DecideAction() | |||
m_Info.CopyActions(actions); | |||
m_ActuatorManager.UpdateActions(actions); | |||
} | |||
|
|||
public void SetTeamManager(ITeamManager teamManager) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the user expected to call SetTeamManager directly or is this hidden from the user?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
User is expected to call SetTeamManager() to associate an agent with a manager.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This has changed after removing cyclic reference between agent and manager. It's now internal and called by TeamManager.RegisterAgent()
|
||
namespace Unity.MLAgents | ||
{ | ||
public interface ITeamManager |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ITeamManager holds reference to a list of Agent and Agent has a reference to iTeamManager. This is a cyclic reference I think we should avoid.
We could get away with it if we made Agent implement an interface and have ITeamManager hold a list of objects that implements that new interface.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like the Agent doesn't really need the TeamManager that much. Maybe it could avoid storing the reference to it altogether; you'd mostly need to
- add an internal method on Agent to set the teamManagerId and have BaseTeamManager call it
- make sure Agent unregisters itself with the teamManager when it gets destroyed. I think we could handle this with a delegate on Agent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed TeamManager reference in agent and unregister agent using delegate.
static int s_Counter; | ||
public static int GetTeamManagerId() | ||
{ | ||
return Interlocked.Increment(ref s_Counter); ; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we make this class more generic and have Agent also use this for their AgentId?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AgentId (or actually Episode ID) uses EpisodeIdCounter which is almost the same thing. It's a static class so I figured I'd make a separate class. Should I try to integrate them?
Co-authored-by: Vincent-Pierre BERGES <vincentpierre@unity3d.com>
/// Add team reward for all agents under this Teammanager. | ||
/// Disabled agent will not receive this reward. | ||
/// </summary> | ||
public void AddTeamReward(float reward) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know that Agent currently has both AddReward and SetReward, but that causes some confusion among users. Can we just pick one and stick with it here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Had a discussion around this and we still think it's useful to have both and also keep the parity with agent Add/SetReward.
@@ -577,6 +578,8 @@ public void EnvironmentStep() | |||
{ | |||
AgentAct?.Invoke(); | |||
} | |||
|
|||
TeamManagerStep?.Invoke(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this need to be called after AgentAct?.Invoke()
, or can it possible go on the same delegate? If it needs to go after, can we call it something more generic like PostAgentAct
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is basically replacing the MaxStepReached logic in agent. We will want all agents to finish acting first and then call MaxStepReached so I think it needs to go after. Also it should only be invoked once instead of n_agent times so not in the same delegate as AgentAct.
Will change the name.
com.unity.ml-agents/Runtime/Agent.cs
Outdated
@@ -519,6 +536,14 @@ protected virtual void OnDisable() | |||
m_Initialized = false; | |||
} | |||
|
|||
void OnDestroy() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we want to put this in OnDisable. I think the user would easily make a custom OnDestroy implementation for their Agents (overriding this)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I thought about that before but that means the user has to link the agent with the same TeamManager again every time the agent is disabled and re-enabled. So I thought putting it in destroy might be lesser evil. For existing codes that are not using TeamManager, overriding it is fine.
Also if you want to do something to each agent in OnTeamEpisodeBegin() for next episode, the unregistered agent might not be there.
But that's a good point. Is adding documentation telling user to call base.Destroy() enough or you think we should do it in OnDisable?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think it is wise to expect the user will consistently call base.Destroy(. I think we should keep all of our logic in OnDisable (which is also called when the Agent is Destroyed).
I really think we should not introduce any distinction between disabling and destroying the Agent. both should be doing the same thing (as it is the case today). We should not introduce a distinction now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
expect the user will consistently call base.Destroy
We already expect that with OnEnable() and OnDisable() don't we?
It's a bit questionable to me about whether we want to introduce the distinction. We already introduce some distinctions to the workflows and we decoupled disabling an agent and ending an episode. Theoretically you can disable and re-enable an agent in the same team episode but not with destroy.
Having to set TeamManager for disabled agent every episode (or even within episode) and getting different results from calling GetRegisteredAgents() at different time is what actually bothers me.
That said, I agree with your concern about consistency and I can change this.
This reverts commit 78e052b.
com.unity.ml-agents.extensions/Runtime/MultiAgent/BaseMultiAgentGroup.cs
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some minor doc things but looks solid
Co-authored-by: Ervin T. <ervin@unity3d.com>
…echnologies/ml-agents into develop-base-teammanager
com.unity.ml-agents/Runtime/Agent.cs
Outdated
@@ -317,6 +330,10 @@ internal struct AgentParameters | |||
/// </summary> | |||
float[] m_LegacyHeuristicCache; | |||
|
|||
int m_GroupId; | |||
|
|||
internal event Action<Agent> UnregisterFromGroup; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this event really needed? Can you add a comment to justify why and when the event is called?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the delegate for agent to trigger removing itself from the group and is added to avoid cyclic reference between agent and group. The agent needs a way to clean itself up from the group when disabled/destroyed/assigned to another group.
I'll add comments.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This might be better with a more generic name, like OnAgentDisabled.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
didn't named it OnAgentDisabled since it was also triggered in SetMultiAgentGroup. Now that is removed I changed the name.
{ | ||
agent.SetMultiAgentGroup(this); | ||
m_Agents.Add(agent); | ||
agent.UnregisterFromGroup += UnregisterAgent; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instead of relying on another callback, is there a way to simply check if the Agent is still alive and remove it from the list if it is not ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we would like the group to constantly check on agents instead of agent triggering it, it will probably needs to be a monobehaviour to do this check in every FixedUpdate (or passively check it when any method is called which sounds buggy). Also this doesn't work if the agent is still alive but assigned to another group.
/// This should be used when the episode could continue, but has gone on for | ||
/// a sufficient number of steps, such as if the environment hits some maximum number of steps. | ||
/// </remarks> | ||
public void GroupEpisodeInterrupted() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
InterruptGroupEpisode for symmetry with EndGroupEpisode ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I made this for symmetry with Agent.EpisodeInterrupted() in the hope that user can map EndEpisode/EpisodeInterrupted to EndGroupEpisode/GroupEpisodeInterrupted
/// </summary> | ||
public class BaseMultiAgentGroup : IMultiAgentGroup, IDisposable | ||
{ | ||
int m_StepCount; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
m_StepCount and m_GroupMaxStep appear to be unused now?
com.unity.ml-agents/Runtime/Agent.cs
Outdated
|
||
internal void SetMultiAgentGroup(IMultiAgentGroup multiAgentGroup) | ||
{ | ||
// Unregister from current group if this agent has been assigned one before |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think if you want the agent to unregister from all groups, you should allow passing a null multiAgentGroup here. This would be better as something like
if(multiAgentGroup == null)
{
m_GroupId == 0;
}
else
{
var newId = multiAgentGroup.GetId();
if(m_GroupId == 0 || m_GroupId == newId)
{
// Idempotent, so setting the same group has no effect
m_GroupId = newId;
}
else
{
throw new UnityAgentsException("Agent is already registered with a group. Unregister it first.");
}
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I made it internal and only being called in MultiAgentGroup.RegisterAgent so I don't see there's any cases that it can be passed in a null group. Also it shouldn't be unregistered by just overwriting m_GroupId otherwise there would be delegates left in Agent.UnregisterFromGroup.
I can do throwing an exception if a user trying to assign an agent from one group directly to another group without unregistering from the first, instead of call unregister for them.
if (m_Agents.Contains(agent)) | ||
{ | ||
m_Agents.Remove(agent); | ||
agent.OnAgentDisabled -= UnregisterAgent; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you need to do something to the Agent here to reset its group ID (and maybe zero out its team reward). You should either make Agent.SetMultiAgentGroup() take null
and set the ID to 0 in that case, or add Agent.ClearMultiAgentGroup() and do it there.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Basically, I think you should have a test like
IMultiAgentGroup coach = ...
Agent agent = ....
coach.RegisterAgent(agent);
coach.AddTeamReward(1.0);
coach.UnregisterAgent(agent);
Assert.AreEqual(0, agent.groupId);
Assert.AreEqual(0.0f, agent.groupReward); // maybe
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Update accordingly except the group reward part. I kept the group reward reset cycle the same as the individual reward to avoid it being zeroed out before sending to trainer/policy. Also added tests.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add unit tests for code coverage:
- You can make a simple test implementation of IMultiAgentGroup in com.unity.ml-agents tests and make sure it calls the Agent method and delegates.
- Add a test for BaseMultiAgentGroup in com.unity.ml-agents.extensions and test the "bookkeeping". Make sure adding and removing idempotent, etc.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overall looks really good. I like that the new interface and changes to Agent are very minimal. BaseMultiAgentGroup is probably simple enough that we can move into the main package in a release or two.
HashSet<Agent> m_Agents = new HashSet<Agent>(); | ||
|
||
|
||
public void Dispose() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
virtual
too?
/// <returns> | ||
/// List of agents registered to the MultiAgentGroup. | ||
/// </returns> | ||
public HashSet<Agent> GetRegisteredAgents() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would be nice to return this as a readonly interface so that the user doesn't mess with it. It looks like IReadOnlyCollection<Agent>
might be the best bet: https://stackoverflow.com/a/36923075/224264
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Last small bits of feedback. Looks good though!
* [MLA-1768] retrain Match3 scene (Unity-Technologies#4943) * improved settings and move to default_settings * update models * Release 13 versions. (Unity-Technologies#4946) - updated release tag validation script to automate the updating of files with release tags that need to be changed as part of the pre-commit operation. * Update readme for release_13. (Unity-Technologies#4951) * Update docs to pass doc validation. (Unity-Technologies#4953) * update defines, compile out Initialize body on non-desktop (Unity-Technologies#4957) * Masking Discrete Actions typos (Unity-Technologies#4961) (Unity-Technologies#4964) Co-authored-by: Philipp Siedler <p.d.siedler@gmail.com> * Adding references to the Extensions package to help promote it. (Unity-Technologies#4967) (Unity-Technologies#4968) Co-authored-by: Marwan Mattar <marwan@unity3d.com> Co-authored-by: Chris Elion <chris.elion@unity3d.com> * Fix release link validations. (Unity-Technologies#4970) * Adding the Variable length observation to the readme and to the overview of ML-Agents * - * forgot a dot * InputActuatorComponent to allow the generation of an action space from an InputActionAsset (Unity-Technologies#4881) (Unity-Technologies#4974) * handle no plugins found (Unity-Technologies#4969) (Unity-Technologies#4973) * Tick extension version. (Unity-Technologies#4975) * adding a comic and readding removed feaures docs * Update 2018 project version to fix burst errors. (Unity-Technologies#4977) (Unity-Technologies#4978) * Add an example project for the InputSystemActuator. (Unity-Technologies#4976) (Unity-Technologies#4980) * Update barracuda, swtich Agents in Sorter use Burst. (Unity-Technologies#4979) (Unity-Technologies#4981) * Set ignore done=False in GAIL (Unity-Technologies#4971) * MultiAgentGroup Interface (Unity-Technologies#4923) * add SimpleMultiAgentGroup * add group reward field to agent and proto * Fix InputActuatorComponent tests asmdef. (Unity-Technologies#4994) (Unity-Technologies#4995) * Fix asmdef? (Unity-Technologies#4994) (Unity-Technologies#4996) * Make TrainingAnalyticsSideChannel internal (Unity-Technologies#4999) * [MLA-1783] built-in actuator type (Unity-Technologies#4950) * Add component menues for some sensors and actuators. (Unity-Technologies#5001) * Add component menues for some sensors and actuators. (Unity-Technologies#5001) (Unity-Technologies#5002) * Fixing the number of layers in the config of PyramidsRND * Merge master -> release_13_branch-to-master * Fix RpcCommunicator merge. * Move the Critic into the Optimizer (Unity-Technologies#4939) Co-authored-by: Ervin Teng <ervin@unity3d.com> * master -> main. (Unity-Technologies#5010) * Adding links to CV/Robotics/GameSim (Unity-Technologies#5012) * Make GridSensor a non allocating object after initialization. (Unity-Technologies#5014) Co-authored-by: Chris Elion <chris.elion@unity3d.com> * Modified the model_serialization to have correct inputs and outputs * switching from CamelCase to snake_case * Fix gpu pytests (Unity-Technologies#5019) * Move tensors to cpu before converting it to numpy * Adding a name field to BufferSensorComponent * Adding a note to the CHANGELOG about var len obs * Adding a helper method for creating observation placeholder names and removed the _h and _c placeholders * Adding a custom editor for BufferSensorComponent * Changing Sorter to use the new Editor and serialization * adding inheritdoc * Update cattrs dependencies to support python3.9 (Unity-Technologies#4821) * Python Dataflow for Group Manager (Unity-Technologies#4926) * Make buffer type-agnostic * Edit types of Apped method * Change comment * Collaborative walljump * Make collab env harder * Add group ID * Add collab obs to trajectory * Fix bug; add critic_obs to buffer * Set group ids for some envs * Pretty broken * Less broken PPO * Update SAC, fix PPO batching * Fix SAC interrupted condition and typing * Fix SAC interrupted again * Remove erroneous file * Fix multiple obs * Update curiosity reward provider * Update GAIL and BC * Multi-input network * Some minor tweaks but still broken * Get next critic observations into value estimate * Temporarily disable exporting * Use Vince's ONNX export code * Cleanup * Add walljump collab YAML * Lower max height * Update prefab * Update prefab * Collaborative Hallway * Set num teammates to 2 * Add config and group ids to HallwayCollab * Fix bug with hallway collab * Edits to HallwayCollab * Update onnx file meta * Make the env easier * Remove prints * Make Collab env harder * Fix group ID * Add cc to ghost trainer * Add comment to ghost trainer * Revert "Add comment to ghost trainer" This reverts commit 292b6ce. * Actually add comment to ghosttrainer * Scale size of CC network * Scale value network based on num agents * Add 3rd symbol to hallway collab * Make comms one-hot * Fix S tag * Additional changes * Some more fixes * Self-attention Centralized Critic * separate entity encoder and RSA * clean up args in mha * more cleanups * fixed tests * entity embeddings work with no max Integrate into CC * remove group id * very rough sketch for TeamManager interface * One layer for entity embed * Use 4 heads * add defaults to linear encoder, initialize ent encoders * add team manager id to proto * team manager for hallway * add manager to hallway * send and process team manager id * remove print * small cleanup * default behavior for baseTeamManager * add back statsrecorder * update * Team manager prototype (Unity-Technologies#4850) * remove group id * very rough sketch for TeamManager interface * add team manager id to proto * team manager for hallway * add manager to hallway * send and process team manager id * remove print * small cleanup Co-authored-by: Chris Elion <chris.elion@unity3d.com> * Remove statsrecorder * Fix AgentProcessor for TeamManager Should work for variable decision frequencies (untested) * team manager * New buffer layout, TeamObsUtil, pad dead agents * Use NaNs to get masks for attention * Add team reward to buffer * Try subtract marginalized value * Add Q function with attention * Some more progress - still broken * use singular entity embedding (Unity-Technologies#4873) * I think it's running * Actions added but untested * Fix issue with team_actions * Add next action and next team obs * separate forward into q_net and baseline * might be right * forcing this to work * buffer error * COMAA runs * add lambda return and target network * no target net * remove normalize advantages * add target network back * value estimator * update coma config * add target net * no target, increase lambda * remove prints * cloud config * use v return * use target net * adding zombie to coma2 brnch * add callbacks * cloud run with coma2 of held out zombie test env * target of baseline is returns_v * remove target update * Add team dones * ntegrate teammate dones * add value clipping * try again on cloud * clipping values and updated zombie * update configs * remove value head clipping * update zombie config * Add trust region to COMA updates * Remove Q-net for perf * Weight decay, regularizaton loss * Use same network * add base team manager * Remove reg loss, still stable * Black format * add team reward field to agent and proto * set team reward * add maxstep to teammanager and hook to academy * check agent by agent.enabled * remove manager from academy when dispose * move manager * put team reward in decision steps * use 0 as default manager id * fix setTeamReward Co-authored-by: Vincent-Pierre BERGES <vincentpierre@unity3d.com> * change method name to GetRegisteredAgents * address comments * Revert C# env changes * Remove a bunch of stuff from envs * Remove a bunch of extra files * Remove changes from base-teammanager * Remove remaining files * Remove some unneeded changes * Make buffer typing neater * AgentProcessor fixes * Back out trainer changes * use delegate to avoid agent-manager cyclic reference * put team reward in decision steps * fix unregister agents * add teamreward to decision step * typo * unregister on disabled * remove OnTeamEpisodeBegin * change name TeamManager to MultiAgentGroup * more team -> group * fix tests * fix tests * Use attention tests from master * Revert "Use attention tests from master" This reverts commit 78e052b. * Use attention from master * Renaming fest * Use NamedTuples instead of attrs classes * Bug fixes * remove GroupMaxStep * add some doc * Fix mock brain * np float32 fixes * more renaming * Test for team obs in agentprocessor * Test for group and add team reward * doc improve Co-authored-by: Ervin T. <ervin@unity3d.com> * store registered agents in set * remove unused step counts * Global group ids * Fix Trajectory test * Remove duplicated files * Add team methods to AgentAction * Buffer fixes (cherry picked from commit 2c03d2b) * Add test for GroupObs * Change AgentAction back to 0 pad and add tests * Addressed some comments * Address some comments * Add more comments * Rename internal function * Move padding method to AgentBufferField * Fix slicing typing and string printing in AgentBufferField * Fix to-flat and add tests * Rename GroupmateStatus to AgentStatus * Update comments * Added GroupId, GlobalGroupId, GlobalAgentId types * Update comment * Make some agent processor properties internal * Rename add_group_status * Rename store_group_status, fix test * Rename clear_group_obs Co-authored-by: Andrew Cohen <andrew.cohen@unity3d.com> Co-authored-by: Ruo-Ping Dong <ruoping.dong@unity3d.com> Co-authored-by: Chris Elion <chris.elion@unity3d.com> Co-authored-by: andrewcoh <54679309+andrewcoh@users.noreply.github.com> Co-authored-by: Vincent-Pierre BERGES <vincentpierre@unity3d.com> * Removing some scenes (Unity-Technologies#4997) * Removing some scenes, All the Static and all the non variable speed environments. Also removed Bouncer, PushBlock, WallJump and reacher. Removed a bunch of visual environements as well. Removed 3DBallHard and FoodCollector (kept Visual and Grid FoodCollector) * readding 3DBallHard * readding pushblock and walljump * Removing tennis * removing mentions of removed environments * removing unused images * Renaming Crawler demos * renaming some demo files * removing and modifying some config files * new examples image? * removing Bouncer from build list * replacing the Bouncer environment with Match3 for llapi tests * Typo in yamato test * Fix issue with queuing input events that stomp on others. (Unity-Technologies#5034) Co-authored-by: Chris Elion <chris.elion@unity3d.com> Co-authored-by: Chris Goy <christopherg@unity3d.com> Co-authored-by: Marwan Mattar <marwan@unity3d.com> Co-authored-by: vincentpierre <vincentpierre@unity3d.com> Co-authored-by: andrewcoh <54679309+andrewcoh@users.noreply.github.com> Co-authored-by: Ruo-Ping Dong <ruoping.dong@unity3d.com> Co-authored-by: Ervin Teng <ervin@unity3d.com> Co-authored-by: Andrew Cohen <andrew.cohen@unity3d.com>
Proposed change(s)
Add MultiAgentGroup Interface that handles Agent groupId and groupReward to support multi-agent training.
Useful links (Github issues, JIRA tickets, ML-Agents forum threads etc.)
Types of change(s)
Checklist
Other comments