├── criteria ├── assignment2.json ├── scipy.json ├── significant_figures.json ├── assignment1.json ├── plotting_data.json ├── numpy.json ├── general_test.json └── general.json ├── references.json └── grading_template_json.html /criteria/assignment2.json: -------------------------------------------------------------------------------- 1 | { 2 | "codeFormatting":{ 3 | "title":"Invalid Value", 4 | "additionalNotes":false, 5 | "negative":[ 6 | { 7 | "mainPoint":"", 8 | "subPoints":[ 9 | "Your value for the speed of light is incorrect!" 10 | ] 11 | } 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /criteria/scipy.json: -------------------------------------------------------------------------------- 1 | { 2 | "SciPy":{ 3 | "title":"SciPy Library", 4 | "additionalNotes":true, 5 | "positive":[ 6 | { 7 | "mainPoint":"", 8 | "subPoints":[ 9 | "Good job on using SciPy optimize function" 10 | ] 11 | } 12 | ], 13 | "negative":[ 14 | { 15 | "mainPoint":"", 16 | "subPoints":[ 17 | "You needed to use SciPy's optimize function to find the optimal value of the variable." 18 | ] 19 | } 20 | ] 21 | } 22 | } -------------------------------------------------------------------------------- /criteria/significant_figures.json: -------------------------------------------------------------------------------- 1 | { 2 | "significantFigures":{ 3 | "title":"Significant Figures", 4 | "additionalNotes":true, 5 | "positive":[ 6 | { 7 | "mainPoint":"", 8 | "subPoints":[ 9 | "Your numbers are reported with the correct significant figures." 10 | ] 11 | } 12 | ], 13 | "negative":[ 14 | { 15 | "mainPoint":"", 16 | "subPoints":[ 17 | "Your numbers have incorrect significant figures." 18 | ] 19 | } 20 | ] 21 | } 22 | } -------------------------------------------------------------------------------- /criteria/assignment1.json: -------------------------------------------------------------------------------- 1 | { 2 | "validValues":{ 3 | "title":"Valid values", 4 | "additionalNotes":true, 5 | "positive":[ 6 | { 7 | "mainPoint":"", 8 | "subPoints":[ 9 | "Good job on checking whether the distance is negative." 10 | ] 11 | } 12 | ], 13 | "negative":[ 14 | { 15 | "mainPoint":"", 16 | "subPoints":[ 17 | "You did not check for negative values for the distance." 18 | ] 19 | } 20 | ] 21 | }, 22 | "wrongNumbers":{ 23 | "title":"Wrong Numbers", 24 | "additionalNotes":false, 25 | "negative":[ 26 | { 27 | "mainPoint":"", 28 | "subPoints":[ 29 | "The mass of the sun and/or the earth is wrong!" 30 | ] 31 | } 32 | ] 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /criteria/plotting_data.json: -------------------------------------------------------------------------------- 1 | { 2 | "plotting":{ 3 | "title":"Plotting (Pandas or Matplotlib)", 4 | "additionalNotes":true, 5 | "positive":[ 6 | { 7 | "mainPoint":"The plots were good regarding", 8 | "subPoints":[ 9 | "axis labels", 10 | "units", 11 | "line style", 12 | "line thickness", 13 | "point style", 14 | "point size", 15 | "title", 16 | "legend", 17 | "font size" 18 | ] 19 | } 20 | ], 21 | "negative":[ 22 | { 23 | "mainPoint":"The following would have improved the plots", 24 | "subPoints":[ 25 | "axis labels", 26 | "units", 27 | "line style", 28 | "line thickness", 29 | "point style", 30 | "point size", 31 | "title", 32 | "legend", 33 | "font size" 34 | ] 35 | } 36 | ] 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /references.json: -------------------------------------------------------------------------------- 1 | { 2 | "generalCriteria":"https://raw.githubusercontent.com/karlkirschner/scipro_grading_testing/master/criteria/general.json", 3 | "assignmentSpecificCriteria":[ 4 | { 5 | "id": 1, 6 | "title":"Significant Figures", 7 | "enabled": true, 8 | "url":"https://raw.githubusercontent.com/karlkirschner/scipro_grading_testing/master/criteria/significant_figures.json" 9 | }, 10 | { 11 | "id": 2, 12 | "title":"Plotting Data", 13 | "enabled": true, 14 | "url":"https://raw.githubusercontent.com/karlkirschner/scipro_grading_testing/master/criteria/plotting_data.json" 15 | }, 16 | { 17 | "id": 3, 18 | "title":"NumPy", 19 | "enabled": true, 20 | "url":"https://raw.githubusercontent.com/karlkirschner/scipro_grading_testing/master/criteria/numpy.json" 21 | }, 22 | { 23 | "id": 4, 24 | "title":"SciPy", 25 | "enabled": true, 26 | "url":"https://raw.githubusercontent.com/karlkirschner/scipro_grading_testing/master/criteria/scipy.json" 27 | }, 28 | { 29 | "id": 5, 30 | "title":"GeneralTEST", 31 | "enabled": true, 32 | "url":"https://raw.githubusercontent.com/karlkirschner/scipro_grading_testing/master/criteria/general_test.json" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /criteria/numpy.json: -------------------------------------------------------------------------------- 1 | { 2 | "numpy":{ 3 | "title":"Numpy Library", 4 | "additionalNotes":true, 5 | "positive":[ 6 | { 7 | "mainPoint":"The following points were well done", 8 | "subPoints":[ 9 | "good job on using ndarrays (simulated density and experimental value) for your Numpy function", 10 | "your Numpy function is indeed faster than your function using regular Python lists" 11 | ] 12 | } 13 | ], 14 | "neutral":[ 15 | { 16 | "mainPoint":"The following points would improve the Numpy solution slightly", 17 | "subPoints":[ 18 | "the experimental value was passed as a float to your Numpy function, when converting to an ndarray object might have been better", 19 | "converting the Pandas' dataframe outside of your Numpy function might have improved its performance -- Remember to have a function that optimally does a single task", 20 | "please follow the standard practice within the community by importing Numpy as 'np'" 21 | ] 22 | } 23 | ], 24 | "negative":[ 25 | { 26 | "mainPoint":"The following points need improvements", 27 | "subPoints":[ 28 | "for your Numpy function, you did not use ndarrays. Instead you passed the following data type to the function:", 29 | "iterating over the ndarray is not needed since it is vectorized, and results in a loss of performance", 30 | "your Numpy function should not be performing slower than your function that uses regular Python lists", 31 | "your function using Python lists has a performance of:", 32 | "your Numpy function has a performance of:" 33 | ] 34 | } 35 | ] 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /criteria/general_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "GeneralTEST":{ 3 | "title":"Academic Scholarship (Citations and Writing)", 4 | "additionalNotes":true, 5 | "positive":[ 6 | { 7 | "mainPoint":"Good scholarship that includes the following", 8 | "subPoints":[ 9 | "citing source of information and knowledge", 10 | "excellent job on citations of important libraries and sources of knowledge", 11 | "consistent formatting of references" 12 | ] 13 | }, 14 | { 15 | "mainPoint":"Good writing and communication that includes the following", 16 | "subPoints":[ 17 | "complete sentences used when appropriate (e.g. within Markdown cells)", 18 | "correct English spelling", 19 | "consistent usage of the English language (i.e. not mixing in non-English words)", 20 | "clean, concise and understandable sentences" 21 | ] 22 | }, 23 | ], 24 | "neutral":[ 25 | { 26 | "mainPoint":"Generally good citing of information, but with a few issues that include", 27 | "subPoints":[ 28 | "being careful when citing websites - when possible cite peer-reviewed papers or academic books", 29 | "when citing websites, one should include the date visited", 30 | "take care to provide the references with the same formatting structure" 31 | ] 32 | }, 33 | { 34 | "mainPoint":"Generally good writing and communication, with the following small issues", 35 | "subPoints":[ 36 | "a few incomplete sentences when not appropriate (e.g. within Markdown cells)", 37 | "a few misspelled English words", 38 | "some mixing of English and German words", 39 | "a few sentences that were not concisely written or understandable" 40 | ] 41 | }, 42 | ], 43 | "negative":[ 44 | { 45 | "mainPoint":"No citation of information", 46 | "subPoints":[ 47 | "As a university student, you should be citing sources of knowledge. This is something that you will need to do for your thesis." 48 | ] 49 | }, 50 | { 51 | "mainPoint":"Poorly citing information, which includes the following", 52 | "subPoints":[ 53 | "not citing Python3 libraries that were used:", 54 | "not citing sources for information used (e.g. equations, datasets):" 55 | ] 56 | }, 57 | { 58 | "mainPoint":"No (or very little) communication of ideas or thoughts", 59 | "subPoints":[ 60 | "Communicating your thoughts and ideas is important (e.g. providing context for the code, clarification of workflow)." 61 | ] 62 | }, 63 | { 64 | "mainPoint":"Poor writing and communication that includes the following", 65 | "subPoints":[ 66 | "no context given for what problem was being solved", 67 | "no presentation of thoughts or ideas concerning the workflow (or solution)", 68 | "lots of incomplete sentences when full sentences would have been appropriate ((e.g. within Markdown cells)", 69 | "several misspelled English words", 70 | "significant mixing of English and German words", 71 | "sentences were not concisely written, or not easily understood" 72 | ] 73 | } 74 | ] 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /criteria/general.json: -------------------------------------------------------------------------------- 1 | { 2 | "academicScholarship":{ 3 | "title":"Academic Scholarship (Citations and Writing)", 4 | "additionalNotes":true, 5 | "positive":[ 6 | { 7 | "mainPoint":"Good scholarship that includes the following", 8 | "subPoints":[ 9 | "citing source of information and knowledge", 10 | "excellent job on citations of important libraries and sources of knowledge", 11 | "consistent formatting of references" 12 | ] 13 | }, 14 | { 15 | "mainPoint":"Good writing and communication that includes the following", 16 | "subPoints":[ 17 | "complete sentences used when appropriate (e.g. within Markdown cells)", 18 | "correct English spelling", 19 | "consistent usage of the English language (i.e. not mixing in non-English words)", 20 | "clean, concise and understandable sentences" 21 | ] 22 | }, 23 | ], 24 | "neutral":[ 25 | { 26 | "mainPoint":"Generally good citing of information, but with a few issues that include", 27 | "subPoints":[ 28 | "being careful when citing websites - when possible cite peer-reviewed papers or academic books", 29 | "when citing websites, one should include the date visited", 30 | "take care to provide the references with the same formatting structure" 31 | ] 32 | }, 33 | { 34 | "mainPoint":"Generally good writing and communication, with the following small issues", 35 | "subPoints":[ 36 | "a few incomplete sentences when not appropriate (e.g. within Markdown cells)", 37 | "a few misspelled English words", 38 | "some mixing of English and German words", 39 | "a few sentences that were not concisely written or understandable" 40 | ] 41 | }, 42 | ], 43 | "negative":[ 44 | { 45 | "mainPoint":"No citation of information", 46 | "subPoints":[ 47 | "As a university student, you should be citing sources of knowledge. This is something that you will need to do for your thesis.", 48 | ] 49 | }, 50 | { 51 | "mainPoint":"Poorly citing information, which includes the following", 52 | "subPoints":[ 53 | "not citing Python3 libraries that were used:", 54 | "not citing sources for information used (e.g. equations, datasets):" 55 | ] 56 | }, 57 | { 58 | "mainPoint":"No (or very little) communication of ideas or thoughts", 59 | "subPoints":[ 60 | "Communicating your thoughts and ideas is important (e.g. providing context for the code, clarification of workflow)." 61 | ] 62 | }, 63 | { 64 | "mainPoint":"Poor writing and communication that includes the following", 65 | "subPoints":[ 66 | "no context given for what problem was being solved", 67 | "no presentation of thoughts or ideas concerning the workflow (or solution)", 68 | "lots of incomplete sentences when full sentences would have been appropriate ((e.g. within Markdown cells)", 69 | "several misspelled English words", 70 | "significant mixing of English and German words", 71 | "sentences were not concisely written, or not easily understood" 72 | ] 73 | } 74 | ] 75 | }, 76 | "jupyterNotebooks":{ 77 | "title":"Jupyter Notebooks", 78 | "additionalNotes":true, 79 | "positive":[ 80 | { 81 | "mainPoint":"Overall Notebook Structure", 82 | "subPoints":[ 83 | "Good use of cells structure to separate ideas (e.g. thoughts, tasks/subtasks, user-defined functions).", 84 | "Good use of the Jupyter-notebook as a laboratory notebook.", 85 | "Logical ordering and mixture of the markdown and code cells." 86 | ] 87 | }, 88 | { 89 | "mainPoint":"Markdown Cells", 90 | "subPoints":[ 91 | "Good use of markdown cells to communicate the problem being investigated; your thoughts and ideas; or methodological workflow." 92 | ] 93 | } 94 | ], 95 | "neutral":[ 96 | { 97 | "mainPoint":"Overall Notebook Structure", 98 | "subPoints":[ 99 | "Some separation concerning the tasks, subtasks, or ideas into different cells is seen in your solution. However, more could have been done to improve the notebook's organization and understanding." 100 | ] 101 | }, 102 | { 103 | "mainPoint":"Markdown Cells", 104 | "subPoints":[ 105 | "Some markdown cells usage is demonstrated in your solution. However, including some more information would have improved the notebook's ability to convey your thoughts/ideas." 106 | ] 107 | } 108 | ], 109 | "negative":[ 110 | { 111 | "mainPoint":"Overall Notebook Structure", 112 | "subPoints":[ 113 | "Significant work is needed to better separate the tasks, subtasks, or thoughts/ideas into separate cells for improving the notebook's organization and understanding." 114 | ] 115 | }, 116 | { 117 | "mainPoint":"Markdown Cells", 118 | "subPoints":[ 119 | "Please provided more context through markdown cells that state the problem being investigated; your ideas and thoughts; or the methodological workflow." 120 | ] 121 | } 122 | ] 123 | }, 124 | "codeFormatting":{ 125 | "title":"Code Formatting", 126 | "additionalNotes":true, 127 | "positive":[ 128 | { 129 | "mainPoint":"Very good code formatting that includes", 130 | "subPoints":[ 131 | "all libraries used were alphabetized", 132 | "all libraries used were listed at the top of the Jupyter-notebook", 133 | "consistent and correct use of spacing", 134 | "consistent and good use of blank lines (e.g. for separating ideas and improving readability)", 135 | "consistent and good indentation (i.e. 4 spaces)", 136 | "proper line lengths (e.g. no scrolling is needed)", 137 | "proper f-string statements", 138 | "descriptive object names (i.e. human readable)", 139 | "appropriate amount of block commenting done (i.e. # comment on its own line)", 140 | "appropriate amount of inline commenting done (i.e. # at the end of a code line)", 141 | "appropriate amount of docstrings done (i.e. using triple quotes)", 142 | "following PEP8 guidelines" 143 | ] 144 | } 145 | ], 146 | "negative":[ 147 | { 148 | "mainPoint":"The following formatting issues were present in your code", 149 | "subPoints":[ 150 | "libraries were not alphabetized", 151 | "libraries were not listed at the top of the Jupyter-notebook", 152 | "spacing was inconsistent or incorrectly used", 153 | "blank lines were inconsistently used", 154 | "not enough blank lines were used to separate ideas within the code", 155 | "too many blank lines were used", 156 | "inconsistent or poor indentation (i.e. 4 spaces)", 157 | "coding lines were too long (i.e. requiring scrolling)", 158 | "coding lines were too short (i.e. deters from readability)", 159 | "f-string statements were not used", 160 | "object naming were not descriptive (i.e. human readable)", 161 | "block commenting (i.e. # on its own line) was not done, or there was poor usage of them", 162 | "in-line commenting (i.e. # at the end of a code line) was not done, or there was poor usage of them", 163 | "docstrings (i.e. using triple quotes) was not done, or there was poor usage of them", 164 | "excessive amounts of commenting done (e.g. for obvious points), or not relevant (i.e. singificantly distracts from the solution's main focus)", 165 | "following PEP8 guidelines" 166 | ] 167 | } 168 | ] 169 | }, 170 | "codingConcept":{ 171 | "title":"Coding Concept", 172 | "additionalNotes":true, 173 | "positive":[ 174 | { 175 | "mainPoint":"Good use of data structures that includes", 176 | "subPoints":[ 177 | "dictionaries (e.g. my_dictionary = {key_1: value_1, key_2: value_2})", 178 | "sets (e.g. my_set = {item_1, item_2, item_3})", 179 | "tuples (e.g. my_tuple = (item_1, item_2, item_3))", 180 | "lists (e.g. my_list = [item_1, item_2, item_3])" 181 | ] 182 | }, 183 | { 184 | "mainPoint":"Good use of the following coding concepts", 185 | "subPoints":[ 186 | "list comprehension", 187 | "looping over a dictionary", 188 | "looping over a set", 189 | "looping over a tuple", 190 | "looping over a list", 191 | "looping over two lists (with the same length) using the built-in function 'zip'", 192 | "the built-in function 'enumerate'", 193 | "the built-in function 'reversed'", 194 | "the built-in function 'sorted'" 195 | ] 196 | }, 197 | ], 198 | "neutral":[ 199 | { 200 | "mainPoint":"The following data structures issues could have been used, which might have made your code a bit better", 201 | "subPoints":[ 202 | "list comprehensions", 203 | "the use of a dictionary instead of a list", 204 | "the use of a tuple instead of a mutable list", 205 | "the use of 'zip' to loop over two lists of equal length" 206 | ] 207 | }, 208 | ], 209 | "negative":[ 210 | { 211 | "mainPoint":"The following data structures issues would have improved your code", 212 | "subPoints":[ 213 | "simplifying the list comprehension, or replacing with an 'if-elif-else' statements (i.e. to improve readability)", 214 | "the use of a dictionary instead of a list would have been logical", 215 | "the use of a tuple instead of a mutable list", 216 | "the use of 'zip' to loop over two lists of equal length" 217 | ] 218 | }, 219 | { 220 | "mainPoint":"The following general concepts were problematic", 221 | "subPoints":[ 222 | "it is better to use 'if-elif-else' statements, rather than 'if-if-...' for readability and speed", 223 | "copy-and-pasting code introduces confusion and increases the chances of errors", 224 | "the code could have been more concisely formulated" 225 | ] 226 | } 227 | ] 228 | }, 229 | "userDefinedFunctions":{ 230 | "title":"User-defined Functions", 231 | "additionalNotes":true, 232 | "positive":[ 233 | { 234 | "mainPoint":"Good use of the following", 235 | "subPoints":[ 236 | "including type hinting", 237 | "providing context via block comments", 238 | "stating what the function does", 239 | "stating what the input objects are (i.e. defined)", 240 | "stating what the function returns", 241 | "proving internal checks using 'if not isinstance' and a 'raise' statement", 242 | "setting an optional variable to a default value of 'None'", 243 | "isolating concepts well to user-defined functions (i.e. improving reusability, transferability and debugging)" 244 | ] 245 | } 246 | ], 247 | "neutral":[ 248 | { 249 | "mainPoint":"The use of 'assert' over 'raise' statements", 250 | "subPoints":[ 251 | "It is better to use a 'raise' statement because 'assert' statements can be bypassed. Note that for development work, the use of 'assert' is okay." 252 | ] 253 | }, 254 | { 255 | "mainPoint":"Too complex of a user-defined functions employed", 256 | "subPoints":[ 257 | "While it is good to have used a user-defined functions, the function itself does too much. It is better to isolate concepts into different functions, and to make the functions as general-purpose as possible." 258 | ] 259 | }, 260 | ], 261 | "negative":[ 262 | { 263 | "mainPoint":"No user-defined functions employed", 264 | "subPoints":[ 265 | "Your solution did not include user-defined functions. Defining your own function helps to isolate concepts, improves reusability, transferability and debugging. These are a major part of scientific programming." 266 | ] 267 | }, 268 | { 269 | "mainPoint":"Your user-defined functions had the following problems", 270 | "subPoints":[ 271 | "a lack of type hinting", 272 | "incorrect type hinting", 273 | "no context given using docstring", 274 | "no statement about what the function does", 275 | "no statement about the input variables (i.e. defined)", 276 | "no statement about what the function returns", 277 | "no internal checks (i.e. 'if not isinstance' statements)", 278 | "not setting optional objects passed to a default value of 'None'", 279 | "when using 'if-elif-else' statements, the main part of the function should be nested under the else statement" 280 | ] 281 | } 282 | ] 283 | }, 284 | "callingFunction":{ 285 | "title":"Calling a Function", 286 | "additionalNotes":true, 287 | "negative":[ 288 | { 289 | "mainPoint":"", 290 | "subPoints":[ 291 | "When calling a function, including your user-defined functions, one should reference the parameter that has an object being passed to it. For example, 'my_function(param1=a, param2=b)' and not 'my_function(a, b)'. Doing so ensure that the values are passed to the correct parameter." 292 | ] 293 | } 294 | ] 295 | }, 296 | "general":{ 297 | "title":"General Feedback", 298 | "additionalNotes":true, 299 | "positive":[ 300 | { 301 | "mainPoint":"", 302 | "subPoints":[ 303 | "Excellent job on this assignment!", 304 | "Very good job on this assignment!", 305 | "Good job on this assignment." 306 | ] 307 | } 308 | ], 309 | "negative":[ 310 | { 311 | "mainPoint":[ 312 | 313 | ], 314 | "subPoints":[ 315 | "Your code does not run because of bad stuff:", 316 | "You used the following libraries that were not allowed in the assignment:", 317 | "You imported libraries that were unused -- this is confusing and cluters the code." 318 | ] 319 | } 320 | ] 321 | } 322 | } 323 | -------------------------------------------------------------------------------- /grading_template_json.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 136 | 137 | Scientific Python - Grading template 138 | 139 | 330 | 331 | 332 | 333 |
334 |
335 |

Scientific Programming for Python

336 |

Grading Template

337 |

The goal of this form is 1) enable faster grading and 2) unifies the feedback given to the students due 338 | to multiple graders.

339 |
340 |
341 | 342 |
343 | Grading 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 |
Code quality & design
Code excution & results
Assignment requirements
Scientific programming
Creativity
370 |
371 | 372 | 909 | 910 | 911 | 912 | --------------------------------------------------------------------------------