You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MLAgentsEditModeTest.cs 33KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. using UnityEngine;
  2. using NUnit.Framework;
  3. using System.Reflection;
  4. namespace MLAgents.Tests
  5. {
  6. public class TestAcademy : Academy
  7. {
  8. public int initializeAcademyCalls;
  9. public int academyResetCalls;
  10. public int AcademyStepCalls;
  11. public override void InitializeAcademy()
  12. {
  13. initializeAcademyCalls += 1;
  14. }
  15. public override void AcademyReset()
  16. {
  17. academyResetCalls += 1;
  18. }
  19. public override void AcademyStep()
  20. {
  21. AcademyStepCalls += 1;
  22. }
  23. }
  24. public class TestAgent : Agent
  25. {
  26. public int initializeAgentCalls;
  27. public int collectObservationsCalls;
  28. public int agentActionCalls;
  29. public int agentResetCalls;
  30. public int agentOnDoneCalls;
  31. public override void InitializeAgent()
  32. {
  33. initializeAgentCalls += 1;
  34. }
  35. public override void CollectObservations()
  36. {
  37. collectObservationsCalls += 1;
  38. }
  39. public override void AgentAction(float[] vectorAction, string textAction)
  40. {
  41. agentActionCalls += 1;
  42. AddReward(0.1f);
  43. }
  44. public override void AgentReset()
  45. {
  46. agentResetCalls += 1;
  47. }
  48. public override void AgentOnDone()
  49. {
  50. agentOnDoneCalls += 1;
  51. }
  52. }
  53. // This is an empty class for testing the behavior of agents and academy
  54. // It is left empty because we are not testing any brain behavior
  55. public class TestBrain : Brain
  56. {
  57. public int numberOfCallsToInitialize = 0;
  58. public int numberOfCallsToDecideAction = 0;
  59. public static TestBrain Instantiate()
  60. {
  61. return CreateInstance<TestBrain>();
  62. }
  63. protected override void Initialize()
  64. {
  65. numberOfCallsToInitialize++;
  66. }
  67. protected override void DecideAction()
  68. {
  69. numberOfCallsToDecideAction++;
  70. agentInfos.Clear();
  71. }
  72. }
  73. public class EditModeTestGeneration
  74. {
  75. [Test]
  76. public void TestAcademy()
  77. {
  78. // Use the Assert class to test conditions.
  79. GameObject acaGO = new GameObject("TestAcademy");
  80. acaGO.AddComponent<TestAcademy>();
  81. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  82. Assert.AreNotEqual(null, aca);
  83. Assert.AreEqual(0, aca.initializeAcademyCalls);
  84. Assert.AreEqual(0, aca.GetEpisodeCount());
  85. Assert.AreEqual(0, aca.GetStepCount());
  86. }
  87. [Test]
  88. public void TestAgent()
  89. {
  90. GameObject agentGO = new GameObject("TestAgent");
  91. agentGO.AddComponent<TestAgent>();
  92. TestAgent agent = agentGO.GetComponent<TestAgent>();
  93. Assert.AreNotEqual(null, agent);
  94. Assert.AreEqual(0, agent.initializeAgentCalls);
  95. }
  96. }
  97. public class EditModeTestInitialization
  98. {
  99. private Brain GenerateTestBrain()
  100. {
  101. return ScriptableObject.CreateInstance<TestBrain>();
  102. }
  103. [Test]
  104. public void TestAcademy()
  105. {
  106. GameObject acaGO = new GameObject("TestAcademy");
  107. acaGO.AddComponent<TestAcademy>();
  108. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  109. Assert.AreEqual(0, aca.initializeAcademyCalls);
  110. Assert.AreEqual(0, aca.GetStepCount());
  111. Assert.AreEqual(0, aca.GetEpisodeCount());
  112. Assert.AreEqual(false, aca.IsDone());
  113. //This will call the method even though it is private
  114. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod("InitializeEnvironment",
  115. BindingFlags.Instance | BindingFlags.NonPublic);
  116. AcademyInitializeMethod.Invoke(aca, new object[] { });
  117. Assert.AreEqual(1, aca.initializeAcademyCalls);
  118. Assert.AreEqual(0, aca.GetEpisodeCount());
  119. Assert.AreEqual(0, aca.GetStepCount());
  120. Assert.AreEqual(false, aca.IsDone());
  121. Assert.AreEqual(0, aca.academyResetCalls);
  122. Assert.AreEqual(0, aca.AcademyStepCalls);
  123. }
  124. [Test]
  125. public void TestAgent()
  126. {
  127. GameObject agentGO1 = new GameObject("TestAgent");
  128. agentGO1.AddComponent<TestAgent>();
  129. TestAgent agent1 = agentGO1.GetComponent<TestAgent>();
  130. GameObject agentGO2 = new GameObject("TestAgent");
  131. agentGO2.AddComponent<TestAgent>();
  132. TestAgent agent2 = agentGO2.GetComponent<TestAgent>();
  133. GameObject acaGO = new GameObject("TestAcademy");
  134. acaGO.AddComponent<TestAcademy>();
  135. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  136. TestBrain brain = TestBrain.Instantiate();
  137. brain.brainParameters = new BrainParameters();
  138. brain.brainParameters.vectorObservationSize = 0;
  139. agent1.GiveBrain(brain);
  140. agent2.GiveBrain(brain);
  141. Assert.AreEqual(false, agent1.IsDone());
  142. Assert.AreEqual(false, agent2.IsDone());
  143. Assert.AreEqual(0, agent1.agentResetCalls);
  144. Assert.AreEqual(0, agent2.agentResetCalls);
  145. Assert.AreEqual(0, agent1.initializeAgentCalls);
  146. Assert.AreEqual(0, agent2.initializeAgentCalls);
  147. Assert.AreEqual(0, agent1.agentActionCalls);
  148. Assert.AreEqual(0, agent2.agentActionCalls);
  149. MethodInfo AgentEnableMethod = typeof(Agent).GetMethod("OnEnableHelper",
  150. BindingFlags.Instance | BindingFlags.NonPublic);
  151. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod("InitializeEnvironment",
  152. BindingFlags.Instance | BindingFlags.NonPublic);
  153. AgentEnableMethod.Invoke(agent2, new object[] { aca });
  154. AcademyInitializeMethod.Invoke(aca, new object[] { });
  155. AgentEnableMethod.Invoke(agent1, new object[] { aca });
  156. Assert.AreEqual(false, agent1.IsDone());
  157. Assert.AreEqual(false, agent2.IsDone());
  158. // agent1 was not enabled when the academy started
  159. // The agents have been initialized
  160. Assert.AreEqual(0, agent1.agentResetCalls);
  161. Assert.AreEqual(0, agent2.agentResetCalls);
  162. Assert.AreEqual(1, agent1.initializeAgentCalls);
  163. Assert.AreEqual(1, agent2.initializeAgentCalls);
  164. Assert.AreEqual(0, agent1.agentActionCalls);
  165. Assert.AreEqual(0, agent2.agentActionCalls);
  166. }
  167. }
  168. public class EditModeTestStep
  169. {
  170. [Test]
  171. public void TestAcademy()
  172. {
  173. GameObject acaGO = new GameObject("TestAcademy");
  174. acaGO.AddComponent<TestAcademy>();
  175. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  176. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod("InitializeEnvironment",
  177. BindingFlags.Instance | BindingFlags.NonPublic);
  178. AcademyInitializeMethod.Invoke(aca, new object[] { });
  179. MethodInfo AcademyStepMethod = typeof(Academy).GetMethod("EnvironmentStep",
  180. BindingFlags.Instance | BindingFlags.NonPublic);
  181. int numberReset = 0;
  182. for (int i = 0; i < 10; i++)
  183. {
  184. Assert.AreEqual(1, aca.initializeAcademyCalls);
  185. Assert.AreEqual(numberReset, aca.GetEpisodeCount());
  186. Assert.AreEqual(i, aca.GetStepCount());
  187. Assert.AreEqual(false, aca.IsDone());
  188. Assert.AreEqual(numberReset, aca.academyResetCalls);
  189. Assert.AreEqual(i, aca.AcademyStepCalls);
  190. // The reset happens at the begining of the first step
  191. if (i == 0)
  192. {
  193. numberReset += 1;
  194. }
  195. AcademyStepMethod.Invoke((object)aca, new object[] { });
  196. }
  197. }
  198. [Test]
  199. public void TestAgent()
  200. {
  201. GameObject agentGO1 = new GameObject("TestAgent");
  202. agentGO1.AddComponent<TestAgent>();
  203. TestAgent agent1 = agentGO1.GetComponent<TestAgent>();
  204. GameObject agentGO2 = new GameObject("TestAgent");
  205. agentGO2.AddComponent<TestAgent>();
  206. TestAgent agent2 = agentGO2.GetComponent<TestAgent>();
  207. GameObject acaGO = new GameObject("TestAcademy");
  208. acaGO.AddComponent<TestAcademy>();
  209. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  210. TestBrain brain = TestBrain.Instantiate();
  211. MethodInfo AgentEnableMethod = typeof(Agent).GetMethod(
  212. "OnEnableHelper", BindingFlags.Instance | BindingFlags.NonPublic);
  213. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod(
  214. "InitializeEnvironment", BindingFlags.Instance | BindingFlags.NonPublic);
  215. agent1.agentParameters = new AgentParameters();
  216. agent2.agentParameters = new AgentParameters();
  217. brain.brainParameters = new BrainParameters();
  218. // We use event based so the agent will now try to send anything to the brain
  219. agent1.agentParameters.onDemandDecision = false;
  220. agent1.agentParameters.numberOfActionsBetweenDecisions = 2;
  221. // agent1 will take an action at every step and request a decision every 2 steps
  222. agent2.agentParameters.onDemandDecision = true;
  223. // agent2 will request decisions only when RequestDecision is called
  224. brain.brainParameters.vectorObservationSize = 0;
  225. brain.brainParameters.cameraResolutions = new Resolution[0];
  226. agent1.GiveBrain(brain);
  227. agent2.GiveBrain(brain);
  228. AgentEnableMethod.Invoke(agent1, new object[] { aca });
  229. AcademyInitializeMethod.Invoke(aca, new object[] { });
  230. MethodInfo AcademyStepMethod = typeof(Academy).GetMethod(
  231. "EnvironmentStep", BindingFlags.Instance | BindingFlags.NonPublic);
  232. int numberAgent1Reset = 0;
  233. int numberAgent2Initialization = 0;
  234. int requestDecision = 0;
  235. int requestAction = 0;
  236. for (int i = 0; i < 50; i++)
  237. {
  238. Assert.AreEqual(numberAgent1Reset, agent1.agentResetCalls);
  239. // Agent2 is never reset since intialized after academy
  240. Assert.AreEqual(0, agent2.agentResetCalls);
  241. Assert.AreEqual(1, agent1.initializeAgentCalls);
  242. Assert.AreEqual(numberAgent2Initialization, agent2.initializeAgentCalls);
  243. Assert.AreEqual(i, agent1.agentActionCalls);
  244. Assert.AreEqual(requestAction, agent2.agentActionCalls);
  245. Assert.AreEqual((i + 1) / 2, agent1.collectObservationsCalls);
  246. Assert.AreEqual(requestDecision, agent2.collectObservationsCalls);
  247. // Agent 1 resets at the first step
  248. if (i == 0)
  249. {
  250. numberAgent1Reset += 1;
  251. }
  252. //Agent 2 is only initialized at step 2
  253. if (i == 2)
  254. {
  255. AgentEnableMethod.Invoke(agent2, new object[] { aca });
  256. numberAgent2Initialization += 1;
  257. }
  258. // We are testing request decision and request actions when called
  259. // at different intervals
  260. if ((i % 3 == 0) && (i > 2))
  261. {
  262. //Every 3 steps after agent 2 is initialized, request decision
  263. requestDecision += 1;
  264. requestAction += 1;
  265. agent2.RequestDecision();
  266. }
  267. else if ((i % 5 == 0) && (i > 2))
  268. {
  269. // Every 5 steps after agent 2 is initialized, request action
  270. requestAction += 1;
  271. agent2.RequestAction();
  272. }
  273. AcademyStepMethod.Invoke(aca, new object[] { });
  274. }
  275. }
  276. }
  277. public class EditModeTestReset
  278. {
  279. [Test]
  280. public void TestAcademy()
  281. {
  282. GameObject acaGO = new GameObject("TestAcademy");
  283. acaGO.AddComponent<TestAcademy>();
  284. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  285. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod(
  286. "InitializeEnvironment", BindingFlags.Instance | BindingFlags.NonPublic);
  287. AcademyInitializeMethod.Invoke(aca, new object[] { });
  288. MethodInfo AcademyStepMethod = typeof(Academy).GetMethod(
  289. "EnvironmentStep", BindingFlags.Instance | BindingFlags.NonPublic);
  290. int numberReset = 0;
  291. int stepsSinceReset = 0;
  292. for (int i = 0; i < 50; i++)
  293. {
  294. Assert.AreEqual(stepsSinceReset, aca.GetStepCount());
  295. Assert.AreEqual(1, aca.initializeAcademyCalls);
  296. Assert.AreEqual(numberReset, aca.GetEpisodeCount());
  297. Assert.AreEqual(false, aca.IsDone());
  298. Assert.AreEqual(numberReset, aca.academyResetCalls);
  299. Assert.AreEqual(i, aca.AcademyStepCalls);
  300. // Academy resets at the first step
  301. if (i == 0)
  302. {
  303. numberReset += 1;
  304. }
  305. stepsSinceReset += 1;
  306. // Regularly set the academy to done to check behavior
  307. if (i % 5 == 3)
  308. {
  309. aca.Done();
  310. numberReset += 1;
  311. stepsSinceReset = 1;
  312. Assert.AreEqual(true, aca.IsDone());
  313. }
  314. AcademyStepMethod.Invoke((object)aca, new object[] { });
  315. }
  316. }
  317. [Test]
  318. public void TestAgent()
  319. {
  320. GameObject agentGO1 = new GameObject("TestAgent");
  321. agentGO1.AddComponent<TestAgent>();
  322. TestAgent agent1 = agentGO1.GetComponent<TestAgent>();
  323. GameObject agentGO2 = new GameObject("TestAgent");
  324. agentGO2.AddComponent<TestAgent>();
  325. TestAgent agent2 = agentGO2.GetComponent<TestAgent>();
  326. GameObject acaGO = new GameObject("TestAcademy");
  327. acaGO.AddComponent<TestAcademy>();
  328. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  329. TestBrain brain = TestBrain.Instantiate();
  330. MethodInfo AgentEnableMethod = typeof(Agent).GetMethod(
  331. "OnEnableHelper", BindingFlags.Instance | BindingFlags.NonPublic);
  332. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod(
  333. "InitializeEnvironment", BindingFlags.Instance | BindingFlags.NonPublic);
  334. MethodInfo AcademyStepMethod = typeof(Academy).GetMethod(
  335. "EnvironmentStep", BindingFlags.Instance | BindingFlags.NonPublic);
  336. agent1.agentParameters = new AgentParameters();
  337. agent2.agentParameters = new AgentParameters();
  338. brain.brainParameters = new BrainParameters();
  339. // We use event based so the agent will now try to send anything to the brain
  340. agent1.agentParameters.onDemandDecision = false;
  341. agent1.agentParameters.numberOfActionsBetweenDecisions = 2;
  342. // agent1 will take an action at every step and request a decision every 2 steps
  343. agent2.agentParameters.onDemandDecision = true;
  344. // agent2 will request decisions only when RequestDecision is called
  345. brain.brainParameters.vectorObservationSize = 0;
  346. brain.brainParameters.cameraResolutions = new Resolution[0];
  347. agent1.GiveBrain(brain);
  348. agent2.GiveBrain(brain);
  349. AgentEnableMethod.Invoke(agent2, new object[] { aca });
  350. AcademyInitializeMethod.Invoke(aca, new object[] { });
  351. int numberAgent1Reset = 0;
  352. int numberAgent2Reset = 0;
  353. int numberAcaReset = 0;
  354. int acaStepsSinceReset = 0;
  355. int agent1StepSinceReset = 0;
  356. int agent2StepSinceReset = 0;
  357. int requestDecision = 0;
  358. int requestAction = 0;
  359. for (int i = 0; i < 5000; i++)
  360. {
  361. Assert.AreEqual(acaStepsSinceReset, aca.GetStepCount());
  362. Assert.AreEqual(1, aca.initializeAcademyCalls);
  363. Assert.AreEqual(numberAcaReset, aca.GetEpisodeCount());
  364. Assert.AreEqual(false, aca.IsDone());
  365. Assert.AreEqual(numberAcaReset, aca.academyResetCalls);
  366. Assert.AreEqual(i, aca.AcademyStepCalls);
  367. Assert.AreEqual(agent2StepSinceReset, agent2.GetStepCount());
  368. Assert.AreEqual(numberAgent1Reset, agent1.agentResetCalls);
  369. Assert.AreEqual(numberAgent2Reset, agent2.agentResetCalls);
  370. // Agent 2 and academy reset at the first step
  371. if (i == 0)
  372. {
  373. numberAcaReset += 1;
  374. numberAgent2Reset += 1;
  375. }
  376. //Agent 1 is only initialized at step 2
  377. if (i == 2)
  378. {
  379. AgentEnableMethod.Invoke(agent1, new object[] { aca });
  380. }
  381. // Reset Academy every 100 steps
  382. if (i % 100 == 3)
  383. {
  384. aca.Done();
  385. numberAcaReset += 1;
  386. acaStepsSinceReset = 0;
  387. }
  388. // Set agent 1 to done every 11 steps to test behavior
  389. if (i % 11 == 5)
  390. {
  391. agent1.Done();
  392. }
  393. // Reseting agent 2 regularly
  394. if (i % 13 == 3)
  395. {
  396. if (!(agent2.IsDone() || aca.IsDone()))
  397. {
  398. // If the agent was already reset before the request decision
  399. // We should not reset again
  400. agent2.Done();
  401. numberAgent2Reset += 1;
  402. agent2StepSinceReset = 0;
  403. }
  404. }
  405. // Request a decision for agent 2 regularly
  406. if (i % 3 == 2)
  407. {
  408. requestDecision += 1;
  409. requestAction += 1;
  410. agent2.RequestDecision();
  411. }
  412. else if (i % 5 == 1)
  413. {
  414. // Request an action without decision regularly
  415. requestAction += 1;
  416. agent2.RequestAction();
  417. }
  418. if (agent1.IsDone() && (((acaStepsSinceReset) % agent1.agentParameters.numberOfActionsBetweenDecisions == 0)) || aca.IsDone())
  419. {
  420. numberAgent1Reset += 1;
  421. agent1StepSinceReset = 0;
  422. }
  423. if (aca.IsDone())
  424. {
  425. numberAgent2Reset += 1;
  426. agent2StepSinceReset = 0;
  427. }
  428. acaStepsSinceReset += 1;
  429. agent1StepSinceReset += 1;
  430. agent2StepSinceReset += 1;
  431. //Agent 1 is only initialized at step 2
  432. if (i < 2)
  433. {
  434. agent1StepSinceReset = 0;
  435. }
  436. AcademyStepMethod.Invoke((object)aca, new object[] { });
  437. }
  438. }
  439. }
  440. public class EditModeTestMaxStep
  441. {
  442. [Test]
  443. public void TestAcademy()
  444. {
  445. GameObject acaGO = new GameObject("TestAcademy");
  446. acaGO.AddComponent<TestAcademy>();
  447. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  448. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod(
  449. "InitializeEnvironment", BindingFlags.Instance | BindingFlags.NonPublic);
  450. AcademyInitializeMethod.Invoke(aca, new object[] { });
  451. MethodInfo AcademyStepMethod = typeof(Academy).GetMethod(
  452. "EnvironmentStep", BindingFlags.Instance | BindingFlags.NonPublic);
  453. FieldInfo maxStep = typeof(Academy).GetField(
  454. "maxSteps", BindingFlags.Instance | BindingFlags.NonPublic);
  455. maxStep.SetValue((object)aca, 20);
  456. int numberReset = 0;
  457. int stepsSinceReset = 0;
  458. for (int i = 0; i < 50; i++)
  459. {
  460. Assert.AreEqual(stepsSinceReset, aca.GetStepCount());
  461. Assert.AreEqual(1, aca.initializeAcademyCalls);
  462. Assert.AreEqual(false, aca.IsDone());
  463. Assert.AreEqual(i, aca.AcademyStepCalls);
  464. Assert.AreEqual(numberReset, aca.GetEpisodeCount());
  465. Assert.AreEqual(numberReset, aca.academyResetCalls);
  466. stepsSinceReset += 1;
  467. // Make sure max step is reached every 20 steps
  468. if (i % 20 == 0)
  469. {
  470. numberReset += 1;
  471. stepsSinceReset = 1;
  472. }
  473. AcademyStepMethod.Invoke((object)aca, new object[] { });
  474. }
  475. }
  476. [Test]
  477. public void TestAgent()
  478. {
  479. GameObject agentGO1 = new GameObject("TestAgent");
  480. agentGO1.AddComponent<TestAgent>();
  481. TestAgent agent1 = agentGO1.GetComponent<TestAgent>();
  482. GameObject agentGO2 = new GameObject("TestAgent");
  483. agentGO2.AddComponent<TestAgent>();
  484. TestAgent agent2 = agentGO2.GetComponent<TestAgent>();
  485. GameObject acaGO = new GameObject("TestAcademy");
  486. acaGO.AddComponent<TestAcademy>();
  487. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  488. TestBrain brain = TestBrain.Instantiate();
  489. MethodInfo AgentEnableMethod = typeof(Agent).GetMethod(
  490. "OnEnableHelper", BindingFlags.Instance | BindingFlags.NonPublic);
  491. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod(
  492. "InitializeEnvironment", BindingFlags.Instance | BindingFlags.NonPublic);
  493. MethodInfo AcademyStepMethod = typeof(Academy).GetMethod(
  494. "EnvironmentStep", BindingFlags.Instance | BindingFlags.NonPublic);
  495. FieldInfo maxStep = typeof(Academy).GetField(
  496. "maxSteps", BindingFlags.Instance | BindingFlags.NonPublic);
  497. maxStep.SetValue((object)aca, 100);
  498. agent1.agentParameters = new AgentParameters();
  499. agent2.agentParameters = new AgentParameters();
  500. brain.brainParameters = new BrainParameters();
  501. // We use event based so the agent will now try to send anything to the brain
  502. agent1.agentParameters.onDemandDecision = false;
  503. agent1.agentParameters.numberOfActionsBetweenDecisions = 1;
  504. // agent1 will take an action at every step and request a decision every 2 steps
  505. agent2.agentParameters.onDemandDecision = true;
  506. // agent2 will request decisions only when RequestDecision is called
  507. agent1.agentParameters.maxStep = 20;
  508. agent2.agentParameters.maxStep = 30;
  509. brain.brainParameters.vectorObservationSize = 0;
  510. brain.brainParameters.cameraResolutions = new Resolution[0];
  511. agent1.GiveBrain(brain);
  512. agent2.GiveBrain(brain);
  513. AgentEnableMethod.Invoke(agent2, new object[] { aca });
  514. AcademyInitializeMethod.Invoke(aca, new object[] { });
  515. int numberAgent1Reset = 0;
  516. int numberAgent2Reset = 0;
  517. int numberAcaReset = 0;
  518. int acaStepsSinceReset = 0;
  519. int agent1StepSinceReset = 0;
  520. int agent2StepSinceReset = 0;
  521. for (int i = 0; i < 500; i++)
  522. {
  523. Assert.AreEqual(acaStepsSinceReset, aca.GetStepCount());
  524. Assert.AreEqual(1, aca.initializeAcademyCalls);
  525. Assert.AreEqual(i, aca.AcademyStepCalls);
  526. Assert.AreEqual(agent1StepSinceReset, agent1.GetStepCount());
  527. Assert.AreEqual(agent2StepSinceReset, agent2.GetStepCount());
  528. Assert.AreEqual(numberAcaReset, aca.GetEpisodeCount());
  529. Assert.AreEqual(numberAcaReset, aca.academyResetCalls);
  530. Assert.AreEqual(numberAgent1Reset, agent1.agentResetCalls);
  531. Assert.AreEqual(numberAgent2Reset, agent2.agentResetCalls);
  532. //At the first step, Academy and agent 2 reset
  533. if (i == 0)
  534. {
  535. numberAcaReset += 1;
  536. numberAgent2Reset += 1;
  537. }
  538. //Agent 1 is only initialized at step 2
  539. if (i == 2)
  540. {
  541. AgentEnableMethod.Invoke(agent1, new object[] { aca });
  542. }
  543. // we request a decision at each step
  544. agent2.RequestDecision();
  545. if (i > 3)
  546. {
  547. // Make sure the academy max steps at 100
  548. if (i % 100 == 0)
  549. {
  550. acaStepsSinceReset = 0;
  551. agent1StepSinceReset = 0;
  552. agent2StepSinceReset = 0;
  553. numberAcaReset += 1;
  554. numberAgent1Reset += 1;
  555. numberAgent2Reset += 1;
  556. }
  557. else
  558. {
  559. //Make sure the agents reset when their max steps is reached
  560. if (agent1StepSinceReset % 21 == 0)
  561. {
  562. agent1StepSinceReset = 0;
  563. numberAgent1Reset += 1;
  564. }
  565. if (agent2StepSinceReset % 31 == 0)
  566. {
  567. agent2StepSinceReset = 0;
  568. numberAgent2Reset += 1;
  569. }
  570. }
  571. }
  572. acaStepsSinceReset += 1;
  573. agent1StepSinceReset += 1;
  574. agent2StepSinceReset += 1;
  575. //Agent 1 is only initialized at step 2
  576. if (i < 2)
  577. {
  578. agent1StepSinceReset = 0;
  579. }
  580. AcademyStepMethod.Invoke((object)aca, new object[] { });
  581. }
  582. }
  583. }
  584. public class EditModeTestMiscellaneous
  585. {
  586. [Test]
  587. public void TestResetOnDone()
  588. {
  589. GameObject agentGO1 = new GameObject("TestAgent");
  590. agentGO1.AddComponent<TestAgent>();
  591. TestAgent agent1 = agentGO1.GetComponent<TestAgent>();
  592. GameObject agentGO2 = new GameObject("TestAgent");
  593. agentGO2.AddComponent<TestAgent>();
  594. TestAgent agent2 = agentGO2.GetComponent<TestAgent>();
  595. GameObject acaGO = new GameObject("TestAcademy");
  596. acaGO.AddComponent<TestAcademy>();
  597. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  598. TestBrain brain = TestBrain.Instantiate();
  599. MethodInfo AgentEnableMethod = typeof(Agent).GetMethod(
  600. "OnEnableHelper", BindingFlags.Instance | BindingFlags.NonPublic);
  601. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod(
  602. "InitializeEnvironment", BindingFlags.Instance | BindingFlags.NonPublic);
  603. MethodInfo AcademyStepMethod = typeof(Academy).GetMethod(
  604. "EnvironmentStep", BindingFlags.Instance | BindingFlags.NonPublic);
  605. agent1.agentParameters = new AgentParameters();
  606. agent2.agentParameters = new AgentParameters();
  607. brain.brainParameters = new BrainParameters();
  608. // We use event based so the agent will now try to send anything to the brain
  609. agent1.agentParameters.onDemandDecision = false;
  610. // agent1 will take an action at every step and request a decision every steps
  611. agent1.agentParameters.numberOfActionsBetweenDecisions = 1;
  612. // agent2 will request decisions only when RequestDecision is called
  613. agent2.agentParameters.onDemandDecision = true;
  614. agent1.agentParameters.maxStep = 20;
  615. //Here we specify that the agent does not reset when done
  616. agent1.agentParameters.resetOnDone = false;
  617. agent2.agentParameters.resetOnDone = false;
  618. brain.brainParameters.vectorObservationSize = 0;
  619. brain.brainParameters.cameraResolutions = new Resolution[0];
  620. agent1.GiveBrain(brain);
  621. agent2.GiveBrain(brain);
  622. AgentEnableMethod.Invoke(agent2, new object[] { aca });
  623. AcademyInitializeMethod.Invoke(aca, new object[] { });
  624. AgentEnableMethod.Invoke(agent1, new object[] { aca });
  625. int agent1ResetOnDone = 0;
  626. int agent2ResetOnDone = 0;
  627. int acaStepsSinceReset = 0;
  628. int agent1StepSinceReset = 0;
  629. int agent2StepSinceReset = 0;
  630. for (int i = 0; i < 50; i++)
  631. {
  632. Assert.AreEqual(i, aca.AcademyStepCalls);
  633. Assert.AreEqual(agent1StepSinceReset, agent1.GetStepCount());
  634. Assert.AreEqual(agent2StepSinceReset, agent2.GetStepCount());
  635. Assert.AreEqual(agent1ResetOnDone, agent1.agentOnDoneCalls);
  636. Assert.AreEqual(agent2ResetOnDone, agent2.agentOnDoneCalls);
  637. // we request a decision at each step
  638. agent2.RequestDecision();
  639. acaStepsSinceReset += 1;
  640. if (agent1ResetOnDone == 0)
  641. agent1StepSinceReset += 1;
  642. if (agent2ResetOnDone == 0)
  643. agent2StepSinceReset += 1;
  644. if ((i > 2) && (i % 21 == 0))
  645. {
  646. agent1ResetOnDone = 1;
  647. }
  648. if (i == 31)
  649. {
  650. agent2ResetOnDone = 1;
  651. agent2.Done();
  652. }
  653. AcademyStepMethod.Invoke((object)aca, new object[] { });
  654. }
  655. }
  656. [Test]
  657. public void TestCumulativeReward()
  658. {
  659. GameObject agentGO1 = new GameObject("TestAgent");
  660. agentGO1.AddComponent<TestAgent>();
  661. TestAgent agent1 = agentGO1.GetComponent<TestAgent>();
  662. GameObject agentGO2 = new GameObject("TestAgent");
  663. agentGO2.AddComponent<TestAgent>();
  664. TestAgent agent2 = agentGO2.GetComponent<TestAgent>();
  665. GameObject acaGO = new GameObject("TestAcademy");
  666. acaGO.AddComponent<TestAcademy>();
  667. TestAcademy aca = acaGO.GetComponent<TestAcademy>();
  668. TestBrain brain = TestBrain.Instantiate();
  669. MethodInfo AgentEnableMethod = typeof(Agent).GetMethod(
  670. "OnEnableHelper", BindingFlags.Instance | BindingFlags.NonPublic);
  671. MethodInfo AcademyInitializeMethod = typeof(Academy).GetMethod(
  672. "InitializeEnvironment", BindingFlags.Instance | BindingFlags.NonPublic);
  673. MethodInfo AcademyStepMethod = typeof(Academy).GetMethod(
  674. "EnvironmentStep", BindingFlags.Instance | BindingFlags.NonPublic);
  675. agent1.agentParameters = new AgentParameters();
  676. agent2.agentParameters = new AgentParameters();
  677. brain.brainParameters = new BrainParameters();
  678. // We use event based so the agent will now try to send anything to the brain
  679. agent1.agentParameters.onDemandDecision = false;
  680. agent1.agentParameters.numberOfActionsBetweenDecisions = 3;
  681. // agent1 will take an action at every step and request a decision every 2 steps
  682. agent2.agentParameters.onDemandDecision = true;
  683. // agent2 will request decisions only when RequestDecision is called
  684. agent1.agentParameters.maxStep = 20;
  685. brain.brainParameters.vectorObservationSize = 0;
  686. brain.brainParameters.cameraResolutions = new Resolution[0];
  687. agent1.GiveBrain(brain);
  688. agent2.GiveBrain(brain);
  689. AgentEnableMethod.Invoke(agent2, new object[] { aca });
  690. AcademyInitializeMethod.Invoke(aca, new object[] { });
  691. AgentEnableMethod.Invoke(agent1, new object[] { aca });
  692. int j = 0;
  693. for (int i = 0; i < 500; i++)
  694. {
  695. agent2.RequestAction();
  696. Assert.LessOrEqual(Mathf.Abs(j * 0.1f + j * 10f - agent1.GetCumulativeReward()), 0.05f);
  697. Assert.LessOrEqual(Mathf.Abs(i * 0.1f - agent2.GetCumulativeReward()), 0.05f);
  698. AcademyStepMethod.Invoke((object)aca, new object[] { });
  699. agent1.AddReward(10f);
  700. if ((i % 21 == 0) && (i > 0))
  701. {
  702. j = 0;
  703. }
  704. j++;
  705. }
  706. }
  707. }
  708. }