File size: 6,519 Bytes
48fe0f9
 
 
 
 
 
 
 
823924a
 
 
48fe0f9
 
 
823924a
48fe0f9
 
823924a
48fe0f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6d60359
 
 
48fe0f9
 
823924a
48fe0f9
 
823924a
48fe0f9
 
 
 
 
 
 
 
 
 
 
823924a
 
 
 
 
 
 
 
 
48fe0f9
 
 
 
 
 
 
 
823924a
 
 
 
 
 
 
 
 
 
 
 
 
48fe0f9
 
 
 
 
 
823924a
 
48fe0f9
 
 
 
823924a
 
 
 
 
 
 
 
 
 
 
 
 
 
bf0aad8
823924a
 
 
 
 
 
 
48fe0f9
 
 
823924a
48fe0f9
 
 
bf0aad8
48fe0f9
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
import streamlit as st
import pandas as pd
import numpy as np

from get_next_question import next_question_level
lvl = {"easy" : 0, "medium" : 1, "hard" : 2}
idx = ["easy", "medium", "hard"]

# Limit
limit = 15

# Update Ability Score
def ability(H,L,R,W):
    if R == 0:
        R  = 0.5
        W -= 0.5
    elif W == 0:
        W  = 0.5
        R -= 0.5

    score = (H/L) + np.log(R/W)
    return score

def fetch_question(fileName, level, visitedQuestions):
    # Difficulty Level
    if (level > 2 or level < 0):
        return None

    difficulty_level = ["Easy", "Medium", "Hard"][level]

    # Fetch Data from Excel
    df = pd.read_excel(fileName)

    # Filter Based On Difficulty
    df_filtered = df[df["Difficulty Level"] == difficulty_level]

    # Select a Random Question from Filtered Sample
    df_sample = None
    while (df_sample is None) or (df_sample.index[0] in visitedQuestions):
        df_sample = df_filtered.sample(n=1)

    # Assign Unique Number
    df_sample["id"] = df_sample.index[0]

    # Question
    question = df_sample.iloc[0].to_dict()

    return question

def next_level(currentLevel, response):
    st.session_state.next_class.response_to_current_question(response["correct"], currentLevel)
    return lvl[st.session_state.next_class.level()]

def start_test(fileName):
    # __init__ Values
    while 'next_class' not in st.session_state:
        st.session_state.next_class = next_question_level({'easy':50,'medium':30, 'hard':20})

    while 'probability' not in st.session_state:
        st.session_state.probability = st.session_state.next_class.get_probabilty

    while 'score' not in st.session_state:
        st.session_state.score = 0
        
    while 'level' not in st.session_state:
        st.session_state.level = lvl[st.session_state.next_class.level()]

    while 'visited_question' not in st.session_state:
        st.session_state.visited_question = []

    while 'question_no' not in st.session_state:
        st.session_state.question_no = 1

    while 'H' not in st.session_state:
        st.session_state.H = 0

    while 'L' not in st.session_state:
        st.session_state.L = 0

    while 'R' not in st.session_state:
        st.session_state.R = 0

    while 'W' not in st.session_state:
        st.session_state.W = 0 

    while 'question' not in st.session_state:
        st.session_state.question = fetch_question(fileName, st.session_state.level, st.session_state.visited_question)
        
    question = st.session_state.question

    with st.form("button_form"):
        # Difficulty Level
        st.write("Question No", st.session_state.question_no)
        st.write("Difficulty Level : ", question["Difficulty Level"], ", Difficulty Rating : ", question["Difficulty Rating"])

        # Question
        st.write(question["Question"])

        # Options
        options = st.radio("Options : ", [question["Option1"], question["Option2"],
                                          question["Option3"], question["Option4"]])

        ####
        st.write("Correct Answer : ",question["Correct Answer"])
        
        # Submit Button
        submit_button = st.form_submit_button("Next Question", disabled=(st.session_state.question_no >= limit))

        # End Button
        end_test = st.form_submit_button("End Test", disabled=(st.session_state.question_no < limit))
    
    if submit_button:
        correct = (options == question["Correct Answer"])
        question["correct"] = correct
        
        # Response -> Updated Question with Correct or Not
        response = question

        # Update Score
        st.session_state.score += int(response["correct"])

        # Update L, H, R, W
        st.session_state.L = st.session_state.question_no
        st.session_state.H = st.session_state.level + 1
        st.session_state.R += int(response["correct"])
        st.session_state.W += int(not response["correct"])

        # Update Question No
        st.session_state.question_no += 1

        # Update Next State
        st.session_state.visited_question.append(response["id"])
        st.session_state.level = next_level(idx[st.session_state.level], response)

        # Next Question 
        st.session_state.question = fetch_question(fileName, st.session_state.level, st.session_state.visited_question)
        question = st.session_state.question

        # Re-Render the Page
        st.experimental_rerun()
    
    if end_test:
        correct = (options == question["Correct Answer"])
        question["correct"] = correct
    
        # Response -> Updated Question with Correct or Not
        response = question

        # Update Score
        st.session_state.score += int(response["correct"])

        # Update L, H, R, W
        st.session_state.L = st.session_state.question_no
        st.session_state.H = st.session_state.level + 1
        st.session_state.R += int(response["correct"])
        st.session_state.W += int(not response["correct"])

        # Display Values
        st.write("No of Questions : ", st.session_state.question_no)
        st.write("Ability Score : ", ability(st.session_state.H, st.session_state.L, st.session_state.R, st.session_state.W))
        st.write("Correct Answers : ", st.session_state.R)
        st.write("Wrong Answers : ", st.session_state.W)

        # Reset Values
        st.session_state.next_class = next_question_level({'easy':50,'medium':30, 'hard':20})
        st.session_state.probability = st.session_state.next_class.get_probabilty
        st.session_state.score = 0
        st.session_state.level = lvl[st.session_state.next_class.level()]
        st.session_state.visited_question = []
        st.session_state.question_no = 1
        st.session_state.H = 0
        st.session_state.L = 0
        st.session_state.R = 0
        st.session_state.W = 0 
        st.session_state.question = fetch_question(fileName, st.session_state.level, st.session_state.visited_question)

        # Re-Test Button
        re_test = st.button("Attempt Again")

        if re_test:
            st.session_state.clicked = False

            # Re-Render the Page
            st.experimental_rerun()

    # Probability and Chart
    probabilty = st.session_state.next_class.get_probabilty()
    
    data = {"Difficulty Level" : ["1 - Easy", "2 - Medium", "3 - Hard"], "Probabilty" : probabilty.values()}
    chart_data = pd.DataFrame(data)
    st.bar_chart(chart_data, x = "Difficulty Level", y = "Probabilty")

st.title("Adaptive Quiz")

start_test("DSA90.xlsx")