Skip to content

Commit 09315da

Browse files
committed
codecov 90%, improve 18%
1 parent eec193b commit 09315da

18 files changed

+147
-17
lines changed

EduSim/Envs/MBS/Env.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@ def step(self, learning_item_id: int, *args, **kwargs):
5656
return observation, reward, done, info
5757

5858
def n_step(self, learning_path, *args, **kwargs):
59+
group = []
5960
for learning_item_id in learning_path:
60-
self.step(learning_item_id)
61+
group.append(self.step(learning_item_id))
62+
return group
6163

6264
def end_episode(self, *args, **kwargs):
6365
observation, probabilities, reward = self.exam()

EduSim/Envs/MBS/utils.py

+23-13
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,34 @@ def generalized_power_law(
204204
the probability of recalling an item
205205
206206
207+
Examples
208+
--------
209+
>>> student_ability = [0.5,0.6]
210+
>>> additional_student_ability = [0.1,0.1]
211+
>>> additional_student_ability = np.asarray(additional_student_ability)
212+
>>> item_difficulty = [0.5,0.6]
213+
>>> additional_item_difficulty = [0.1,0.1]
214+
>>> additional_item_difficulty = np.asarray(additional_item_difficulty)
215+
>>> elapsed_time = [9,9]
216+
>>> decay_rate = 1.0
217+
>>> correct_times= [10,10]
218+
>>> attempts= [20,20]
219+
>>> [x for x in generalized_power_law(student_ability, \
220+
additional_student_ability, \
221+
item_difficulty, \
222+
additional_item_difficulty, \
223+
elapsed_time, \
224+
decay_rate, \
225+
correct_times, \
226+
attempts, \
227+
None, \
228+
None)]
229+
[0.2, 0.2]
207230
"""
208231
r = decay_rate
209232
a = as_array(student_ability)
210233
d = as_array(item_difficulty)
211234
t = as_array(elapsed_time)
212-
213235
if window_correct_coefficients is None:
214236
m = 1 / (1 + np.exp(-(a - d)))
215237
else:
@@ -227,18 +249,6 @@ def generalized_power_law(
227249

228250
f = np.exp(additional_student_ability - additional_item_difficulty)
229251

230-
# if t < 0:
231-
# print("t<0")
232-
# exit()
233-
234-
# if np.isnan((m * (1 + r * t)) ** (-f)):
235-
# print((m * (1 + r * t)) ** (-f))
236-
# print("(m * (1 + r * t)):",(m * (1 + r * t)))
237-
# print("-f:",-f)
238-
# print("m:",m)
239-
# print("r:",r)
240-
# print("t:",t)
241-
242252
return (m * (1 + r * t)) ** (-f)
243253

244254

EduSim/Envs/meta/Learner.py

+19
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@ class MetaLearnerGroup(object):
4949
pass
5050

5151

52+
"""
53+
Example:
54+
>>> learners = [MetaLearner(i) for i in range(10)]
55+
>>> mflg = MetaFiniteLearnerGroup(learners)
56+
>>> mflg.__len__()
57+
10
58+
>>> isinstance(mflg.__getitem__[0],MetaLearner)
59+
True
60+
>>> isinstance(mflg.sample(),MetaLearner)
61+
True
62+
"""
63+
64+
5265
class MetaFiniteLearnerGroup(MetaLearnerGroup):
5366
def __init__(self, learners: list, seed=None, *args, **kwargs):
5467
self._learners = learners
@@ -64,6 +77,12 @@ def __len__(self):
6477
return len(self._learners)
6578

6679

80+
"""
81+
>>> MLG = MetaLearnerGroup()
82+
>>> MetaInfinityLearnerGroup(MLG)
83+
"""
84+
85+
6786
class MetaInfinityLearnerGroup(MetaLearnerGroup):
6887
def __next__(self):
6988
raise NotImplementedError

EduSim/SimOS/SimOS.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ def step(self):
2727
def tune(self, *args, **kwargs):
2828
raise NotImplementedError
2929

30-
def n_step(self, max_steps: int):
31-
return []
30+
def n_step(self):
31+
raise NotImplementedError
3232

3333

3434
class RandomAgent(MetaAgent):

examples/MBS/EFC.ipynb

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
" env,\n",
7979
" max_steps=200,\n",
8080
" max_episode_num=100,\n",
81-
" level=\"summary\",\n",
81+
" level=\"summary\"\n",
8282
")\n",
8383
"print(\"done\")\n"
8484
],
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

tests/test_MBS/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# coding: utf-8
2+
# 2021/03/12 @ zhaoguanhao

tests/test_MBS/test_EFC.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# coding: utf-8
2+
# 2021/03/12 @ guanhao,zhao
3+
4+
import pytest
5+
from EduSim import EFCEnv
6+
7+
REWARD = ["likelihood", "log_likelihood"]
8+
9+
10+
@pytest.mark.parametrize("reward", REWARD)
11+
def test_api(reward):
12+
env = EFCEnv(n_items=30, reward_func=reward, threshold=0.5, seed=None, n_steps=200)
13+
assert set(env.parameters.keys()) == {'action_space'}
14+
15+
16+
@pytest.mark.parametrize("reward", REWARD)
17+
@pytest.mark.parametrize("n_step", [True, False])
18+
@pytest.mark.parametrize("board_dir", [None, "tensorBoard"])
19+
def test_env(reward, n_step, board_dir):
20+
from EduSim.Envs.MBS import EFCEnv, MBSAgent, mbs_train_eval
21+
env = EFCEnv(n_items=30, reward_func=reward, threshold=0.5, seed=None, n_steps=200)
22+
learner = next(env.learners)
23+
learner.state
24+
agent = MBSAgent(env.action_space)
25+
mbs_train_eval(
26+
agent,
27+
env,
28+
max_steps=200,
29+
max_episode_num=3,
30+
level="summary",
31+
n_step=n_step,
32+
board_dir=board_dir
33+
)

tests/test_MBS/test_GPL.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# coding: utf-8
2+
# 2021/03/12 @ guanhao,zhao
3+
4+
import pytest
5+
from EduSim import GPLEnv, HLREnv, EFCEnv
6+
7+
REWARD = ["likelihood", "log_likelihood"]
8+
9+
10+
@pytest.mark.parametrize("reward", REWARD)
11+
def test_api(reward):
12+
env = GPLEnv(n_items=30, reward_func=reward, threshold=0.5, seed=None, n_steps=200)
13+
env.begin_episode()
14+
env.render(mode="log")
15+
assert set(env.parameters.keys()) == {'action_space'}
16+
17+
18+
@pytest.mark.parametrize("reward", REWARD)
19+
@pytest.mark.parametrize("n_step", [True, False])
20+
def test_env(reward, n_step):
21+
from EduSim.Envs.MBS import GPLEnv, MBSAgent, mbs_train_eval
22+
env = GPLEnv(n_items=30, reward_func=reward, threshold=0.5, seed=None, n_steps=200)
23+
learner = next(env.learners)
24+
learner.state
25+
agent = MBSAgent(env.action_space)
26+
mbs_train_eval(
27+
agent,
28+
env,
29+
max_steps=200,
30+
max_episode_num=1,
31+
level="summary",
32+
n_step=n_step
33+
)

tests/test_MBS/test_HLR.py

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# coding: utf-8
2+
# 2021/03/12 @ guanhao,zhao
3+
4+
import pytest
5+
from EduSim import HLREnv
6+
7+
REWARD = ["likelihood", "log_likelihood"]
8+
9+
10+
@pytest.mark.parametrize("reward", REWARD)
11+
def test_api(reward):
12+
env = HLREnv(n_items=30, reward_func=reward, threshold=0.5, seed=None, n_steps=200)
13+
assert set(env.parameters.keys()) == {'action_space'}
14+
15+
16+
@pytest.mark.parametrize("reward", REWARD)
17+
@pytest.mark.parametrize("n_step", [True, False])
18+
def test_env(reward, n_step):
19+
from EduSim.Envs.MBS import HLREnv, MBSAgent, mbs_train_eval
20+
env = HLREnv(n_items=30, reward_func=reward, threshold=0.5, seed=None, n_steps=200)
21+
learner = next(env.learners)
22+
learner.state
23+
agent = MBSAgent(env.action_space)
24+
mbs_train_eval(
25+
agent,
26+
env,
27+
max_steps=200,
28+
max_episode_num=3,
29+
level="summary",
30+
n_step=n_step
31+
)

0 commit comments

Comments
 (0)