Skip to content

Commit 37f90e6

Browse files
Fixed bug with identifying dimensionless groups and added tests corresponding to example module examples
1 parent 4222694 commit 37f90e6

File tree

2 files changed

+133
-6
lines changed

2 files changed

+133
-6
lines changed

app/evaluation.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,19 +110,16 @@ def determine_validity(reference_set, reference_symbols, reference_original_numb
110110
valid = False
111111
feedback.append(buckingham_pi_feedback_responses["TOO_FEW_INDEPENDENT_GROUPS"]("Response", C.rank(), D.rank()))
112112
else:
113-
dimensionless_groups = set()
114113
valid = False
115114
if len(candidate_set) == 1:
116115
dimensionless_groups = candidate_set
117116
else:
117+
dimensionless_groups = set()
118118
for i in range(len(candidate_set)):
119-
Ci = C.copy()
120-
exponents = Ci.row(i)
121-
Ci.row_del(i)
122-
Di = R.col_join(Ci)
119+
exponents = C.row(i)
120+
Di = R.col_join(exponents)
123121
if R.rank() != Di.rank():
124122
dimensionless_groups.add(create_power_product(exponents, symbols))
125-
#if len(dimensionless_groups) > 0:
126123
feedback.append(buckingham_pi_feedback_responses["NOT_DIMENSIONLESS"](dimensionless_groups))
127124
else:
128125
feedback.append(buckingham_pi_feedback_responses["UNKNOWN_SYMBOL"](candidate_symbols.difference(reference_symbols)))

app/evaluation_tests.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,136 @@ def test_sums_buckingham_pi(self):
878878
self.assertEqual(result["is_correct"], False)
879879
self.assertEqual(buckingham_pi_feedback_responses["SUM_WITH_INDEPENDENT_TERMS"]("response") in result["feedback"], True)
880880

881+
def test_buckingham_pi_example_in_examples_module(self):
882+
with self.subTest(tag="Part a)"):
883+
params = {
884+
"comparison": "buckinghamPi",
885+
"strict_syntax": False,
886+
"quantities": "('U', '(length/time)') ('L', '(length)') ('nu', '(length**2/time)')",
887+
"symbols": {
888+
'U': {"latex": r"$U$", "aliases": []},
889+
'L': {"latex": r"$L$", "aliases": []},
890+
'nu': {"latex": r"$\nu$", "aliases": []},
891+
}
892+
}
893+
answer = "U*L/nu"
894+
# Valid groups
895+
response = "U*L/nu"
896+
result = evaluation_function(response, answer, params)
897+
self.assertEqual(result["is_correct"], True)
898+
response = "U*L/nu+1"
899+
result = evaluation_function(response, answer, params)
900+
self.assertEqual(result["is_correct"], True)
901+
response = "8*U*L/nu"
902+
result = evaluation_function(response, answer, params)
903+
self.assertEqual(result["is_correct"], True)
904+
# A group with an unknown symbol
905+
response = "q*U*L/nu"
906+
result = evaluation_function(response, answer, params)
907+
self.assertEqual(result["is_correct"], False)
908+
self.assertEqual(buckingham_pi_feedback_responses["UNKNOWN_SYMBOL"]({"q"}) in result["feedback"], True)
909+
# two dimensionless groups that are not independent
910+
response = "U*L/nu, nu/U/L"
911+
result = evaluation_function(response, answer, params)
912+
self.assertEqual(result["is_correct"], False)
913+
self.assertEqual(buckingham_pi_feedback_responses["CANDIDATE_GROUPS_NOT_INDEPENDENT"](1,2) in result["feedback"], True)
914+
self.assertEqual(buckingham_pi_feedback_responses["MORE_GROUPS_THAN_REFERENCE_SET"] in result["feedback"], True)
915+
# group that is not dimensionless
916+
response = "U*L"
917+
result = evaluation_function(response, answer, params)
918+
self.assertEqual(result["is_correct"], False)
919+
self.assertEqual(buckingham_pi_feedback_responses["NOT_DIMENSIONLESS"]({"L*U", }) in result["feedback"], True)
920+
with self.subTest(tag="Part b)"):
921+
params = {
922+
"comparison": "buckinghamPi",
923+
"strict_syntax": False,
924+
"quantities": "('U', '(length/time)') ('L', '(length)') ('nu', '(length**2/time)') ('f', '(1/time)')",
925+
"symbols": {
926+
'U': {"latex": r"$U$", "aliases": []},
927+
'L': {"latex": r"$L$", "aliases": []},
928+
'nu': {"latex": r"$\nu$", "aliases": []},
929+
'f': {"latex": r"$f$", "aliases": []},
930+
}
931+
}
932+
answer = "-"
933+
# Valid groups
934+
response = "U*L/nu, f*L/U"
935+
result = evaluation_function(response, answer, params)
936+
self.assertEqual(result["is_correct"], True)
937+
response = "8*U*L/nu, f*L/U+1"
938+
result = evaluation_function(response, answer, params)
939+
self.assertEqual(result["is_correct"], True)
940+
# sum that contains two valid groups does not count as valid
941+
response = "U*L/nu+f*L/U"
942+
result = evaluation_function(response, answer, params)
943+
self.assertEqual(result["is_correct"], False)
944+
self.assertEqual(buckingham_pi_feedback_responses["SUM_WITH_INDEPENDENT_TERMS"]("response") in result["feedback"], True)
945+
# sum that contains two valid groups does count as valid if the total number of groups is sufficient
946+
response = "U*L/nu+f*L/U, f*L/U"
947+
result = evaluation_function(response, answer, params)
948+
self.assertEqual(result["is_correct"], True)
949+
# at least one group is not dimensionless
950+
response = "U*L/nu, f/U"
951+
result = evaluation_function(response, answer, params)
952+
self.assertEqual(result["is_correct"], False)
953+
self.assertEqual(buckingham_pi_feedback_responses["NOT_DIMENSIONLESS"]({"f/U"}) in result["feedback"], True)
954+
response = "L/nu, f/U"
955+
result = evaluation_function(response, answer, params)
956+
self.assertEqual(result["is_correct"], False)
957+
self.assertEqual(
958+
buckingham_pi_feedback_responses["NOT_DIMENSIONLESS"](["L/nu", "f/U"]) in result["feedback"]
959+
or
960+
buckingham_pi_feedback_responses["NOT_DIMENSIONLESS"](["f/U", "L/nu"]) in result["feedback"],
961+
True
962+
)
963+
with self.subTest(tag="Part c)"):
964+
params = {
965+
"comparison": "buckinghamPi",
966+
"strict_syntax": False,
967+
"input_symbols": [['g', []], ['v', []], ['h', []], ['l', []]],
968+
"custom_feedback": {
969+
"VALID_CANDIDATE_SET": "Your list of power products satisfies the Buckingham Pi theorem.",
970+
"NOT_DIMENSIONLESS": "At least one power product is not dimensionless.",
971+
"MORE_GROUPS_THAN_REFERENCE_SET": "Response has more power products than necessary.",
972+
"CANDIDATE_GROUPS_NOT_INDEPENDENT": "Power products in response are not independent.",
973+
"TOO_FEW_INDEPENDENT_GROUPS": "Candidate set contains too few independent groups.",
974+
"UNKNOWN_SYMBOL": "One of the prower products contains an unkown symbol.",
975+
"SUM_WITH_INDEPENDENT_TERMS": "The candidate set contains an expression which contains more independent terms that there are groups in total. The candidate set should ideally only contain expressions written as power products."
976+
}
977+
}
978+
answer = "g**(-2)*v**4*h*l**3, g**(-2)*v**4*h**2*l**4"
979+
# Valid response
980+
response = "g*v**(-2)*h**3*l**2, g**2*v**(-4)*h**3*l"
981+
self.assertEqual_input_variations(response, answer, params, True)
982+
result = evaluation_function(response, answer, params)
983+
self.assertEqual(params["custom_feedback"]["VALID_CANDIDATE_SET"] in result["feedback"], True)
984+
# Too few independent groups
985+
response = "h*l, h**2*l**2"
986+
self.assertEqual_input_variations(response, answer, params, False)
987+
result = evaluation_function(response, answer, params)
988+
self.assertEqual(params["custom_feedback"]["CANDIDATE_GROUPS_NOT_INDEPENDENT"] in result["feedback"], True)
989+
self.assertEqual(params["custom_feedback"]["TOO_FEW_INDEPENDENT_GROUPS"] in result["feedback"], True)
990+
# Not dimensionless
991+
response = "g**1*v**2*h**3*l**4, g**4*v**3*h**2*l**1"
992+
result = evaluation_function(response, answer, params)
993+
self.assertEqual(params["custom_feedback"]["NOT_DIMENSIONLESS"] in result["feedback"], True)
994+
self.assertEqual_input_variations(response, answer, params, False)
995+
# Extra dimensionless group
996+
response = "g**(-2)*v**4*h*l**3, g**(-2)*v**4*h**2*l**4, g**(-1)*v**2*h"
997+
self.assertEqual_input_variations(response, answer, params, False)
998+
result = evaluation_function(response, answer, params)
999+
self.assertEqual(params["custom_feedback"]["MORE_GROUPS_THAN_REFERENCE_SET"] in result["feedback"], True)
1000+
# Undefined symbol
1001+
response = "q*g**(-2)*v**4*h*l**3, g**(-2)*v**4*h**2*l**4"
1002+
self.assertEqual_input_variations(response, answer, params, False)
1003+
result = evaluation_function(response, answer, params)
1004+
self.assertEqual(params["custom_feedback"]["UNKNOWN_SYMBOL"] in result["feedback"], True)
1005+
# Sum with independent terms instead of set of groups
1006+
response = "g**(-2)*v**4*h*l**3+g**(-2)*v**4*h**2*l**4"
1007+
self.assertEqual_input_variations(response, answer, params, False)
1008+
result = evaluation_function(response, answer, params)
1009+
self.assertEqual(params["custom_feedback"]["SUM_WITH_INDEPENDENT_TERMS"] in result["feedback"], True)
1010+
8811011
def test_MECH50010_set_5(self):
8821012
# Dimensional homogeneity a)
8831013
params = {"strict_syntax": False,

0 commit comments

Comments
 (0)