@@ -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