This code is a “mix” of codes collected from a GS course in Aarhus University given by Luc Janss, additional code improvements and comments are also contribution from Dr. Marnin Wolfe Cornell University