Extraction Bench: Lesson 1
Using a non-polar solute to extract a solute from water
In this tutorial, I am going to walk you through how our extraction environment works and hopefully give some insight into how an RL agent might interact with the environment. In this extraction we are going to be using water to extract sodium and chlorine from oil. We are going to be using this jupyter notebook in order to interact with the environment.
import gymnasium as gym
import chemistrylab
import matplotlib,time
import numpy as np
from matplotlib import pyplot as plt
from chemistrylab.util import Visualization
from IPython.display import display,clear_output
Visualization.use_mpl_light(size=2)
So start by running the code cell below you should see a series of graphs like these appear:
env = gym.make('WaterOilExtract-v0')
env.reset()
rgb = env.render()
plt.imshow(rgb)
plt.axis("off")
plt.show()
These graphs show the contents of each of our containers and the level of separation between the materials. The graphs to the right then show the layers of materials forming in the container.
When we start the environment we will see that we have a container filled with oil, Na and Cl. Using a polar solvent we can get the sodium and chlorine to diffuse from the oil into that solvent, in this case we can use water as our polar solvent!
Step 1: Pour Water into the extraction vessel
Action 33 H2O Vessel: pour by volume ([0.4]) -> extraction_vessel
We can then see that storage vessel is now filled with the oil poured from the condensation vessel.
env.reset()
total_reward = 0
#Pour in water
obs,rew,d,*_ = env.step(33)
total_reward += rew
obs,rew,d,*_ = env.step(39)
total_reward += rew
obs,rew,d,*_ = env.step(39)
total_reward += rew
rgb = env.render()
plt.imshow(rgb)
plt.axis("off")
plt.show()
Step 2: Mix the extraction vessel
Action 9 extraction_vessel: mix ([-1.]) -> None
Now that we’ve added the water we need to mix the vessel to get the solutes to transfer into the oil, so let’s mix the vessel! As seen in the graph below we can see that based on the layer representation that we have mixed the oil and the water.
obs,rew,d,*_ = env.step(9)
total_reward += rew
rgb = env.render()
plt.imshow(rgb)
plt.axis("off")
plt.show()
Step 3: Wait for the layers to separate
Action 39 extraction_vessel: mix ([0.16]) -> None
Now that we have done some mixing we need to wait for the oil to settle to the top of the water so we can drain the water. Keep repeating the following command until the graph settles.
obs,rew,d,*_ = env.step(39)
total_reward += rew
obs,rew,d,*_ = env.step(39)
total_reward += rew
rgb = env.render()
plt.imshow(rgb)
plt.axis("off")
plt.show()
Step 4: Pouring out the Saltwater
Action 4 extraction_vessel: drain by pixel ([10]) -> Beaker 1
:
Now that the water and oil have settled we want to drain out our water into beaker 1 so that we can pour out our oil out as waste.
#Pouring
for i in range(4):
obs,rew,d,*_=env.step(4)
total_reward += rew
rgb = env.render()
plt.imshow(rgb)
plt.axis("off")
plt.show()
Step 5: Pouring the oil into the waste vessel
Action 24 extraction_vessel: pour by volume ([1.]) -> Waste Vessel
Now we just have to empty out the extraction vessel into the waste vessel to get rid of the oil and we are done
obs,rew,d,*_= env.step(24)
total_reward += rew
rgb = env.render()
plt.imshow(rgb)
plt.axis("off")
plt.show()
Ending the Experiment
obs,rew,d,*_ = env.step(40)
total_reward += rew
print(total_reward,d)
0.8213018800367559 True
I hope this tutorial helped with your understanding of how an agent might interact with the extraction environment!