diff --git a/ex4.py b/ex4.py new file mode 100644 index 0000000..d04bf79 --- /dev/null +++ b/ex4.py @@ -0,0 +1,15 @@ +import numpy as np + + +def ex4(image_array: np.array, offset: (int, int), spacing: (int, int)): + mask = np.zeros(shape=image_array.shape, dtype=image_array.dtype) + test = list(range(offset[0], mask.shape[1] - 1, spacing[0])) + print(test) + pass + + +if __name__ == '__main__': + ex4(np.array([[(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)], + [(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)], + [(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)] + ]), offset=(1, 1), spacing=(2, 2)) diff --git a/ex4_unittest.py b/ex4_unittest.py new file mode 100644 index 0000000..ec1215e --- /dev/null +++ b/ex4_unittest.py @@ -0,0 +1,143 @@ +""" +Author -- Michael Widrich +Contact -- widrich@ml.jku.at +Date -- 01.10.2019 + +############################################################################### + +The following copyright statement applies to all code within this file. + +Copyright statement: +This material, no matter whether in printed or electronic form, +may be used for personal and non-commercial educational use only. +Any reproduction of this manuscript, no matter whether as a whole or in parts, +no matter whether in printed or in electronic form, requires explicit prior +acceptance of the authors. + +############################################################################### + +""" + +import os +import sys +import traceback + +import dill as pkl +import numpy as np + + +def print_outs(outs, line_token="-"): + print(line_token * 40) + print(outs, end="" if isinstance(outs, str) and outs.endswith("\n") else "\n") + print(line_token * 40) + + +ex_file = 'ex4.py' +full_points = 20 +points = full_points +python = sys.executable + +with open(os.path.join("unittest", "unittest_inputs_outputs.pkl"), "rb") as ufh: + all_inputs_outputs = pkl.load(ufh) + all_inputs = all_inputs_outputs['inputs'] + all_outputs = all_inputs_outputs['outputs'] + +feedback = '' + +for test_i, (inputs, outputs) in enumerate(zip(all_inputs, all_outputs)): + + comment = '' + fcall = '' + with open(os.devnull, 'w') as null: + # sys.stdout = null + try: + from ex4 import ex4 + proper_import = True + except Exception: + outs = '' + errs = traceback.format_exc() + points -= full_points / len(all_inputs_outputs) + proper_import = False + finally: + sys.stdout.flush() + sys.stdout = sys.__stdout__ + + if proper_import: + with open(os.devnull, 'w') as null: + # sys.stdout = null + try: + errs = '' + fcall = f"ex4(image_array={inputs[0]}, offset={inputs[1]}, spacing={inputs[2]}))" + returns = ex4(image_array=inputs[0], offset=inputs[1], + spacing=inputs[2]) + + # Check if returns and outputs are of same type + if type(returns) != type(outputs): + comment = f"Output should be: {type(outputs).__name__} ('{outputs}'). \n" \ + f" but is: {returns}" + points -= full_points / len(all_inputs) + else: + # Check input_array output + if (len(returns) != 3 + or not isinstance(returns[0], np.ndarray) + or returns[0].dtype != outputs[0].dtype + or returns[0].shape != outputs[0].shape + or np.any(returns[0] != outputs[0])): + points -= (full_points / len(all_inputs)) / 3 + comment = f"Incorrect 'input_array'. Output should be: " \ + f"{outputs} \n" \ + f"but is {returns}" + + # Check known_array output + if (len(returns) != 3 + or not isinstance(returns[1], np.ndarray) + or returns[1].dtype != outputs[1].dtype + or returns[1].shape != outputs[1].shape + or np.any(returns[1] != outputs[1])): + points -= (full_points / len(all_inputs)) / 3 + comment = f"Incorrect 'known_array'. Output should be: " \ + f"{outputs} \n" \ + f"but is {returns}" + + # Check target_array output + if (len(returns) != 3 + or not isinstance(returns[2], np.ndarray) + or returns[2].dtype != outputs[2].dtype + or returns[2].shape != outputs[2].shape + or np.any(returns[2] != outputs[2])): + points -= (full_points / len(all_inputs)) / 3 + comment = f"Incorrect 'target_array'. Output should be: " \ + f"{outputs} \n" \ + f"but is {returns}" + + except Exception as e: + outs = '' + if not type(e) == type(outputs): + comment = f"Output should be: {type(outputs).__name__} ('{outputs}'). \n" \ + f" but is:\n{traceback.format_exc()}" + points -= full_points / len(all_inputs) + finally: + sys.stdout.flush() + sys.stdout = sys.__stdout__ + + print() + print_outs(f"Test {test_i}", line_token="#") + print("Function call:") + print_outs(fcall) + + if errs: + print(f"Some unexpected errors occurred:") + print_outs(errs) + else: + print("Notes:") + print_outs("No issues found" if comment == "" else comment) + + # due to floating point calculations it could happen that we get -0 here + if points < 0: + assert abs(points) < 1e-7, f"points were {points} < 0: error when subtracting points?" + points = 0 + print(f"Current points: {points:.2f}") + +print(f"\nEstimated points upon submission: {points:.2f} (out of {full_points:.2f})") +print(f"This is only an estimate, see 'Instructions for submitting homework' in Moodle " + f"for common mistakes that can still lead to 0 points.")