diff --git a/Programming/EARIN/.gitignore b/Programming/EARIN/.gitignore new file mode 100644 index 00000000..8593cf5d --- /dev/null +++ b/Programming/EARIN/.gitignore @@ -0,0 +1,317 @@ +<<<<<<< HEAD +*.swp +.DS_Store +bin/configlet +bin/configlet.exe +temp.pl +======= +database +test_results +anime_with_synopsis.csv +anime.csv +animelist.csv +rating_complete.csv +watching_status.csv + +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs +*.slg +*.slo +*.sls + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplot +*.gnuplot +*.table + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.glog +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# newpax +*.newpax + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# svg +svg-inkscape/ + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# titletoc +*.ptc + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib +>>>>>>> project/main diff --git a/Programming/EARIN/.replit b/Programming/EARIN/.replit new file mode 100644 index 00000000..187d8ba1 --- /dev/null +++ b/Programming/EARIN/.replit @@ -0,0 +1,108 @@ +# The command that runs the program. If the interpreter field is set, it will have priority and this run command will do nothing +run = "python3 main.py" + +# The primary language of the repl. There can be others, though! +language = "python3" +entrypoint = "main.py" +# A list of globs that specify which files and directories should +# be hidden in the workspace. +hidden = ["venv", ".config", "**/__pycache__", "**/.mypy_cache", "**/*.pyc"] + +# Specifies which nix channel to use when building the environment. +[nix] +channel = "stable-22_11" + +# The command to start the interpreter. +[interpreter] + [interpreter.command] + args = [ + "stderred", + "--", + "prybar-python310", + "-q", + "--ps1", + "\u0001\u001b[33m\u0002\u0001\u001b[00m\u0002 ", + "-i", + ] + env = { LD_LIBRARY_PATH = "$PYTHON_LD_LIBRARY_PATH" } + +[env] +VIRTUAL_ENV = "/home/runner/${REPL_SLUG}/venv" +PATH = "${VIRTUAL_ENV}/bin" +PYTHONPATH = "$PYTHONHOME/lib/python3.10:${VIRTUAL_ENV}/lib/python3.10/site-packages" +REPLIT_POETRY_PYPI_REPOSITORY = "https://package-proxy.replit.com/pypi/" +MPLBACKEND = "TkAgg" +POETRY_CACHE_DIR = "${HOME}/${REPL_SLUG}/.cache/pypoetry" + +# Enable unit tests. This is only supported for a few languages. +[unitTest] +language = "python3" + +# Add a debugger! +[debugger] +support = true + + # How to start the debugger. + [debugger.interactive] + transport = "localhost:0" + startCommand = ["dap-python", "main.py"] + + # How to communicate with the debugger. + [debugger.interactive.integratedAdapter] + dapTcpAddress = "localhost:0" + + # How to tell the debugger to start a debugging session. + [debugger.interactive.initializeMessage] + command = "initialize" + type = "request" + + [debugger.interactive.initializeMessage.arguments] + adapterID = "debugpy" + clientID = "replit" + clientName = "replit.com" + columnsStartAt1 = true + linesStartAt1 = true + locale = "en-us" + pathFormat = "path" + supportsInvalidatedEvent = true + supportsProgressReporting = true + supportsRunInTerminalRequest = true + supportsVariablePaging = true + supportsVariableType = true + + # How to tell the debugger to start the debuggee application. + [debugger.interactive.launchMessage] + command = "attach" + type = "request" + + [debugger.interactive.launchMessage.arguments] + logging = {} + +# Configures the packager. +[packager] +language = "python3" +ignoredPackages = ["unit_tests"] + + [packager.features] + enabledForHosting = false + # Enable searching packages from the sidebar. + packageSearch = true + # Enable guessing what packages are needed from the code. + guessImports = true + +# These are the files that need to be preserved when this +# language template is used as the base language template +# for Python repos imported from GitHub +[gitHubImport] +requiredFiles = [".replit", "replit.nix", ".config", "venv"] + +[languages] + +[languages.python3] +pattern = "**/*.py" + +[languages.python3.languageServer] +start = "pylsp" + +[deployment] +run = ["sh", "-c", "python3 main.py"] \ No newline at end of file diff --git a/Programming/EARIN/.vscode/extensions.json b/Programming/EARIN/.vscode/extensions.json new file mode 100644 index 00000000..271359ec --- /dev/null +++ b/Programming/EARIN/.vscode/extensions.json @@ -0,0 +1,20 @@ +{ +<<<<<<< HEAD + "recommendations": [ +<<<<<<< HEAD + "ms-python.python", + "ms-python.pylint", + "mikoz.black-py", + "james-yu.latex-workshop", + "kisstkondoros.vscode-gutter-preview", + "streetsidesoftware.code-spell-checker", + "wesbos.theme-cobalt2" +======= + "rebornix.prolog" +>>>>>>> lab7/main + ] +} +======= + "recommendations": ["james-yu.latex-workshop"] +} +>>>>>>> project/main diff --git a/Programming/EARIN/.vscode/settings.json b/Programming/EARIN/.vscode/settings.json new file mode 100644 index 00000000..577d9e4c --- /dev/null +++ b/Programming/EARIN/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "python.linting.pylintArgs": [ + "--generate-members" + ], + "cSpell.words": [ + "dtype", + "loadtxt", + "MNIST", + "optim", + "Xbatch", + "ybatch" + ], + "python.linting.pylintEnabled": true, + "python.linting.enabled": true +} \ No newline at end of file diff --git a/Programming/EARIN/lab1/EARIN_LAB_Instruction.pdf b/Programming/EARIN/lab1/EARIN_LAB_Instruction.pdf new file mode 100644 index 00000000..f0ecbb37 Binary files /dev/null and b/Programming/EARIN/lab1/EARIN_LAB_Instruction.pdf differ diff --git a/Programming/EARIN/lab1/EARIN_Lab1.pdf b/Programming/EARIN/lab1/EARIN_Lab1.pdf new file mode 100644 index 00000000..5440a431 Binary files /dev/null and b/Programming/EARIN/lab1/EARIN_Lab1.pdf differ diff --git a/Programming/EARIN/lab1/IMPORTANT.txt b/Programming/EARIN/lab1/IMPORTANT.txt new file mode 100644 index 00000000..b80a31ca --- /dev/null +++ b/Programming/EARIN/lab1/IMPORTANT.txt @@ -0,0 +1,8 @@ +Manhattan: +For: 1000 files, sum of path lengths = 122194, average path length = 122.194, sum_of_time = 0.8560767570011194, average time to solve: 0.0008560767570011194, heuristic_total_total_time: 0.10561735888813928, all_heuristic_called: 282721, average_heuristic_time: 3.735745094568118e-07 + +Euclidean: +For: 1000 files, sum of path lengths = 120936, average path length = 120.936, sum_of_time = 1.268625628994414, average time to solve: 0.001268625628994414, heuristic_total_total_time: 0.34228658579650073, all_heuristic_called: 276120, average_heuristic_time: 1.2396298196309602e-06 + +Random: +For: 1000 files, sum of path lengths = 131126, average path length = 131.126, sum_of_time = 1.2832818229990153, average time to solve: 0.0012832818229990153, heuristic_total_total_time: 0.07322999603366043, all_heuristic_called: 417262, average_heuristic_time: 1.7550123431719262e-07 \ No newline at end of file diff --git a/Programming/EARIN/lab1/README.txt b/Programming/EARIN/lab1/README.txt new file mode 100644 index 00000000..92816df8 --- /dev/null +++ b/Programming/EARIN/lab1/README.txt @@ -0,0 +1,20 @@ +To run the program install python, go to project repository and just run python main.py: +python main.py + +you can specify the name of the file which stores maze by typing: +python main.py mazeFile.txt + +python main.py -h --help print help prompt + +python main.py -t --test non interactive (does not print steps) for testing +different heuristics, goes through entire generatedMazes folder and +compares heuristic speed and path length, saves solved mazes to solvedMazes folder + +python main.py -t --test [FOLDER] non interactive (does not print steps) for testing +different heuristics, goes through entire [FOLDER] folder and +compares heuristic speed and path length, saves solved mazes to solvedMazes folder + +python main.py -g --generate [NUMBER] - generates as many mazes as entered in +Number parameter and puts it in the generatedMazes folder + + diff --git a/Programming/EARIN/lab1/main.py b/Programming/EARIN/lab1/main.py new file mode 100644 index 00000000..ce1d4b8d --- /dev/null +++ b/Programming/EARIN/lab1/main.py @@ -0,0 +1,377 @@ +""" +Write horizontal_line program that solves horizontal_line maze +using greedy best-first search algorithm. +The maze is horizontal_line 2D grid +with empty space, walls, horizontal_line start, and an end position. +The objective is to find horizontal_line path from start to end position. +The maze should be loaded from file. horizontal_line step-by-step visualization of the +algorithm is required. It can be done in the console and an interface may be +as simple as possible (but of course it does not have to). Example solution: +https://angeluriot.com/maze_solver/. +Test multiple heuristics (at least two) h(n) and discuss the differences be- +tween the obtained results. + +Technical requirements: +- implemented in Python. +- adheres to basic standards of lean coding in accordance to PEP8 +- comments in the crucial parts to help with readability and understanding. +- The clear instruction how to run and test the code should be included. + +Thinks that do not work: +Does not work if no Start (Should print out NO START FOUND) +Does not work if no End (Should print out NO END FOUND) +Does not work if no path (Should print out NO PATH FOUND) +""" + +import heapq +import sys +import time +import os +from random import shuffle, randrange, random + + +class MazeSolver: + """Maze Solver""" + + # self corresponds to "this" in js, it refers to object of MazeSolver class + + def __init__(self, maze, mode): + # assign read maze 2D array to parameter from class MazeSolver + self.test = mode + self.maze = maze + self.start, self.end = self.find_start_and_end() + + # go through each character in 2D array and find one that corresponds to + # Start/End character + + def find_start_and_end(self): + """Finds start and end points in the maze""" + start = end = None + + for row_i, row in enumerate(self.maze): + for col_i, cell in enumerate(row): + if cell == "S": + start = (row_i, col_i) + elif cell == "E": + end = (row_i, col_i) + if start is not None and end is not None: + return start, end + print(f"DID NOT FOUND START OR END, Start: {start}, End: {end}") + return start, end + + # Go through each neighbor + # N + # N * N + # N + # If it is not horizontal_line "wall" (#) add its position to list of neighbors + + def get_neighbors(self, position): + """Finds point'maze_data neighbors""" + row, col = position + neighbors = [] + if row > 0 and self.maze[row - 1][col] != "#": + neighbors.append((row - 1, col)) + if col > 0 and self.maze[row][col - 1] != "#": + neighbors.append((row, col - 1)) + if row < len(self.maze) - 1 and self.maze[row + 1][col] != "#": + neighbors.append((row + 1, col)) + if col < len(self.maze[row]) - 1 and self.maze[row][col + 1] != "#": + neighbors.append((row, col + 1)) + return neighbors + + # find path through maze + + def solve_loop(self, queue, visited): + """ Goes through maze and finds the path """ + heuristic_total_time = 0 + heuristics_called = 0 + while queue: + # pop first element of heap + # first value is skipped and we only save current position and path + # on heap + _, current, path = heapq.heappop(queue) + # if we already visited current skip code and go to next iteration + if current in visited: + continue + # if we found the end return path + if current == self.end: + break + visited.add(current) + for neighbor in self.get_neighbors(current): + if neighbor not in visited: + new_path = path + [neighbor] + heuristic, heuristic_time = self.heuristic_euclidean( + neighbor) + heuristic_total_time += heuristic_time + heuristics_called += 1 + heapq.heappush( + queue, (heuristic, neighbor, new_path) + ) + if not self.test: + print_maze(self.maze, path, visited) + print() + return path, visited, heuristic_total_time, heuristics_called + + def solve(self): + """Solves the maze""" + queue = [] + # set means that values inside can not repeat + visited = set() + # https://docs.python.org/3/library/heapq.html + # push onto the queue (which becomes heapq), element containing values + # we use heapq so the element with lowest heuristic value will always + # be at the top of heap + heuristic = self.heuristic_euclidean(self.start) + heapq.heappush( + queue, (heuristic, self.start, [self.start]) + ) + + # Go through queue until it'maze_data empty + # Find neighbor (which is not wall) closest to the + # END point (based on heuristic) + # Go there and repeat + # if cannot find path it starts over but skips the path that lead it to + # dead end + return self.solve_loop(queue, visited) + + # This heuristic returns the Manhattan distance between the given position + # and the maze'maze_data end + def heuristic_manhattan(self, position): + """Heuristic function that uses Manhattan distance""" + start_time = time.perf_counter() + heuristic = abs(position[0] - self.end[0]) + \ + abs(position[1] - self.end[1]) + end_time = time.perf_counter() + heuristic_time = end_time - start_time + return heuristic, heuristic_time + + # This heuristic returns the Euclidean distance between the given position + # and the maze'maze_data end + def heuristic_euclidean(self, position): + """Heuristic function that uses Euclidean distance""" + start_time = time.perf_counter() + heuristic = ( + abs(position[0] - self.end[0]) ** 2 + + abs(position[1] - self.end[1]) ** 2 + ) ** 0.5 + end_time = time.perf_counter() + heuristic_time = end_time - start_time + return heuristic, heuristic_time + + def heuristic_random(self, position): + """Heuristic function that just returns random value between 0 and 1""" + start_time = time.perf_counter() + heuristic = random() + end_time = time.perf_counter() + heuristic_time = end_time - start_time + return heuristic, heuristic_time + + +# Open and load text file to array +def load_maze(maze_file_name): + """Loads horizontal_line maze from the specified file""" + # Open for reading only and save to fileContents + with open(maze_file_name, "r", encoding="utf8") as file_contents: + # strip() removes extra white spaces from the beginning and the end of + # horizontal_line string + # list() changes string to array of chars + # Inside of square brackets we will have an array of characters for + # each line of file + # After going through every line in horizontal_line file we will have 2D array of arrays + # of characters of every line + maze = [list(line.strip()) for line in file_contents] + return maze + + +def print_maze(maze, path=None, visited=None): + """Prints the maze""" + if path is None: + path = [] + if visited is None: + visited = [] + for row_i, row in enumerate(maze): + for col_i, cell in enumerate(row): + if (row_i, col_i) in path and cell == " ": + print("*", end="") + elif (row_i, col_i) in visited and cell == " ": + print("·", end="") + else: + print(cell, end="") + print() + + +def create_maze_folder(solved): + """ Creates folder for generated or solved mazes""" + if solved: + folder_name = "solvedMazes" + else: + folder_name = "generatedMazes" + if not os.path.exists(folder_name): + os.mkdir(folder_name) + return folder_name + + +def save_maze(maze, solved=True, path=None, visited=None, saved_file="Maze", iteration=0): + """Saves maze from array to txt file""" + folder_name = create_maze_folder(solved) + if path is None: + path = [] + if visited is None: + visited = [] + with open(f"{folder_name}/{iteration}{os.path.basename(saved_file)}", "w", encoding="utf8") as maze_file: + for row_i, row in enumerate(maze): + for col_i, cell in enumerate(row): + if (row_i, col_i) in path and cell == " ": + maze_file.write("*") + elif (row_i, col_i) in visited and cell == " ": + maze_file.write("·") + else: + maze_file.write(cell) + if solved: + maze_file.write("\n") + if not solved: + maze_file.write("\n") + + +def fill_generated_maze(hor, ver, width): + """ Fills generated maze array from horizontal and vertical lines """ + maze_data = "" + for horizontal_line, vertical_line in zip(hor, ver): + maze_data += "".join(horizontal_line + ["\n"] + vertical_line + ["\n"]) + maze_data_list = list(maze_data) + maze_data_list[3 * width + 3] = "S" + maze_data_list[len(maze_data_list) - (3 * width + 6)] = "E" + maze_data = "".join(maze_data_list) + return maze_data + + +def make_maze(width=16, height=8): + """ generate maze with given width and height """ + vis = [[0] * width + [1] for _ in range(height)] + [[1] * (width + 1)] + ver = [["# "] * width + ["#"] for _ in range(height)] + [[]] + hor = [["###"] * width + ["#"] for _ in range(height + 1)] + + def walk(x_coordinate, y_coordinate): + vis[y_coordinate][x_coordinate] = 1 + + neighbors = [(x_coordinate - 1, y_coordinate), + (x_coordinate, y_coordinate + 1), + (x_coordinate + 1, y_coordinate), + (x_coordinate, y_coordinate - 1)] + shuffle(neighbors) + for x_coordinate_neighbor, y_coordinate_neighbor in neighbors: + if vis[y_coordinate_neighbor][x_coordinate_neighbor]: + continue + if x_coordinate_neighbor == x_coordinate: + hor[max(y_coordinate, y_coordinate_neighbor) + ][x_coordinate] = "# " + if y_coordinate_neighbor == y_coordinate: + ver[y_coordinate][max( + x_coordinate, x_coordinate_neighbor)] = " " + walk(x_coordinate_neighbor, y_coordinate_neighbor) + + walk(randrange(width), randrange(height)) + + return fill_generated_maze(hor, ver, width) + + +def print_help(): + """prints help""" + print( + """python main.py - run the script against default maze file +(any file named maze.txt in the code directory) + +python main.py filename.txt - run the script against filename.txt file +python main.py -h --help print this prompt +python main.py -t --test non interactive (does not print steps) for testing +different heuristics, goes through entire generatedMazes folder and +compares heuristic speed and path length +python main.py -t --test [FOLDER] non interactive (does not print steps) for testing +different heuristics, goes through entire [FOLDER] folder and +compares heuristic speed and path length + +python main.py -g --generate [NUMBER] - generates as many mazes as entered in +Number parameter and puts it in the generatedMazes folder""" + ) + + +def test_mode(): + """ Loads and solves multiple mazes in order to compare heuristics """ + create_maze_folder(False) + sum_of_paths = 0 + files_amount = 0 + sum_of_time = 0 + heuristic_total_total_time = 0 + all_heuristic_called = 0 + for filename in os.listdir(FOLDER_NAME): + filename_directory = os.path.join(FOLDER_NAME, filename) + # Open and load text file to array + loaded_maze = load_maze(filename_directory) + # Initialize MazeSolver object with maze as parameter + solver_test = MazeSolver(loaded_maze, TEST_MODE) + # Find path using MazeSolver solve method + start_time = time.perf_counter() + solved_path, visited, heuristic_total_time, heuristics_called = solver_test.solve() + heuristic_total_total_time += heuristic_total_time + all_heuristic_called += heuristics_called + end_time = time.perf_counter() + sum_of_time += end_time - start_time + sum_of_paths += len(solved_path) + save_maze(loaded_maze, True, solved_path, visited, filename, 0) + files_amount += 1 + if files_amount == 0: + print("no mazes found! Generate some using python main.py -g [NUMBER]") + sys.exit() + average_path = sum_of_paths / files_amount + average_time = sum_of_time / files_amount + print(f"""For: {files_amount} files, + sum of path lengths = {sum_of_paths}, + average path length = {average_path}, + sum_of_time = {sum_of_time}, + average time to solve: {average_time}, + heuristic_total_total_time: {heuristic_total_total_time}, + all_heuristic_called: {all_heuristic_called}, + average_heuristic_time: {heuristic_total_total_time / all_heuristic_called}""") + + +def default(): + """ Runs default operation - reads, solves and prints single maze from file """ + # Open and load text file to array + loaded_maze = load_maze(FILE_NAME) + # Initialize MazeSolver object with maze as parameter + solver = MazeSolver(loaded_maze, TEST_MODE) + # Find path using MazeSolver solve method + solved_path, visited, _, _ = solver.solve() + print_maze(loaded_maze, solved_path, visited) + save_maze(loaded_maze, True, solved_path, visited, FILE_NAME, 0) + + +# Ran first in the code +if __name__ == "__main__": + # print(sys.argv) + FILE_NAME = "maze.txt" + TEST_MODE = False + FOLDER_NAME = "" + GENERATE_AMOUNT = 0 + if len(sys.argv) > 1: + if sys.argv[1] == "-h" or sys.argv[1] == "--help": + print_help() + sys.exit() + if sys.argv[1] == "-t" or sys.argv[1] == "--test": + TEST_MODE = True + FILE_NAME = "maze.txt" + FOLDER_NAME = "generatedMazes" + if len(sys.argv) > 2: + FOLDER_NAME = sys.argv[2] + test_mode() + sys.exit() + if sys.argv[1] == '-g' or sys.argv[1] == '--generate': + if len(sys.argv) > 2: + GENERATE_AMOUNT = int(sys.argv[2]) + for n in range(GENERATE_AMOUNT): + GENERATED_MAZE = make_maze() + save_maze(GENERATED_MAZE, False, None, + None, f'generated{n}.txt') + sys.exit() + FILE_NAME = sys.argv[1] + default() diff --git a/Programming/EARIN/lab1/maze.txt b/Programming/EARIN/lab1/maze.txt new file mode 100644 index 00000000..4ca4b64b --- /dev/null +++ b/Programming/EARIN/lab1/maze.txt @@ -0,0 +1,10 @@ +########## +#S # +# #### # +# # # +# # ## # +# # # +##### ## +# # # +# #E # +########## diff --git a/Programming/EARIN/lab1/solvedMazes/0maze.txt b/Programming/EARIN/lab1/solvedMazes/0maze.txt new file mode 100644 index 00000000..648d7368 --- /dev/null +++ b/Programming/EARIN/lab1/solvedMazes/0maze.txt @@ -0,0 +1,10 @@ +########## +#******* # +# ####* # +# # **# +# # ##*# +# #**# +##### *## +# # * # +# #* # +########## diff --git a/Programming/EARIN/lab1/workingLinks.txt b/Programming/EARIN/lab1/workingLinks.txt new file mode 100644 index 00000000..8214a4ac --- /dev/null +++ b/Programming/EARIN/lab1/workingLinks.txt @@ -0,0 +1,2 @@ +Overleaf: +https://www.overleaf.com/7651537119ycszfgvxqznm \ No newline at end of file diff --git a/Programming/EARIN/lab2/EARIN_LAB_Instruction.pdf b/Programming/EARIN/lab2/EARIN_LAB_Instruction.pdf new file mode 100644 index 00000000..f0ecbb37 Binary files /dev/null and b/Programming/EARIN/lab2/EARIN_LAB_Instruction.pdf differ diff --git a/Programming/EARIN/lab2/Exercise_02_variant2-Draughts.pdf b/Programming/EARIN/lab2/Exercise_02_variant2-Draughts.pdf new file mode 100644 index 00000000..27fd41ac Binary files /dev/null and b/Programming/EARIN/lab2/Exercise_02_variant2-Draughts.pdf differ diff --git a/Programming/EARIN/lab2/main.py b/Programming/EARIN/lab2/main.py new file mode 100644 index 00000000..ef384b0f --- /dev/null +++ b/Programming/EARIN/lab2/main.py @@ -0,0 +1,581 @@ +""" +Program that plays draughts (checkers) with user on 8x8 board using min-max with alpha-beta pruning +""" +import re +import copy +import math +import sys + + +class Game: + """Game""" + + def __init__(self, size): + self.board_size = size + self.white_positions = self.initialize_white() + self.black_positions = self.initialize_black() + + def initialize_white(self): + """Initialize white pieces""" + white_positions = [] + for y_coordinate in range(math.floor((self.board_size - 2) / 2)): + for x_coordinate in range(self.board_size): + if y_coordinate % 2 == 0: + if x_coordinate % 2 == 1: + white_positions.append((x_coordinate, y_coordinate, False)) + else: + if x_coordinate % 2 == 0: + white_positions.append((x_coordinate, y_coordinate, False)) + return white_positions + + def initialize_black(self): + """Initialize black pieces""" + black_positions = [] + for y_coordinate in range( + self.board_size - math.floor((self.board_size - 2) / 2), self.board_size + ): + for x_coordinate in range(self.board_size): + if y_coordinate % 2 == 0: + if x_coordinate % 2 == 1: + black_positions.append((x_coordinate, y_coordinate, False)) + else: + if x_coordinate % 2 == 0: + black_positions.append((x_coordinate, y_coordinate, False)) + return black_positions + + def check_move_out_of_bounds(self, to_): + """Check if the move destination is out of the bounds of the board""" + if to_[0] < 0 or to_[0] > self.board_size - 1: + # print(f"Illegal move! Final x coordinate must be between 0 and {self.board_size-1}!") + return True + if to_[1] < 0 or to_[1] > self.board_size - 1: + # print(f"Illegal move! Final y coordinate must be between 0 and {self.board_size-1}!") + return True + return False + + def check_piece_exists(self, coords, color): + """Check if a piece of given color exists at a given spot""" + if color == "white": + if any( + piece in self.white_positions + for piece in ((*coords, False), (*coords, True)) + ): + return True + else: + if any( + piece in self.black_positions + for piece in ((*coords, False), (*coords, True)) + ): + return True + return False + + def check_piece_king(self, coords, color): + """Check if a piece of in a given spot and of a given color is a king. + Return false if no piece is found""" + if color == "white": + return (*coords, True) in self.white_positions + if color == "black": + return (*coords, True) in self.black_positions + return False + + # https://stackoverflow.com/a/2191707 + def check_move_piece_capable(self, from_, to_, color): + """Check if the move is exactly one square diagonally""" + if abs(to_[0] - from_[0]) == 1: + if self.check_piece_king(from_, color): + return True + if color == "white": + return to_[1] == from_[1] + 1 + if color == "black": + return to_[1] == from_[1] - 1 + return False + + def check_capture(self, from_, to_, color): + """Check if a piece was captured for a given move. + Return captured piece coordinates or None""" + # captures can only happen if the player moved twice-diagonally + + if abs(to_[0] - from_[0]) != 2 or abs(to_[1] - from_[1]) != 2: + return None + + middle = (abs(to_[0] + from_[0]) // 2, abs(to_[1] + from_[1]) // 2) + + if color == "white" and self.check_piece_exists(middle, "black"): + return middle + if color == "black" and self.check_piece_exists(middle, "white"): + return middle + return None + + def check_move_legal(self, from_, to_, color, give_feedback=False): + """Check if a move is legal. Return a boolean or coordinates of captured piece""" + if self.check_move_out_of_bounds(to_): + if give_feedback: + print("Illegal move! Final position is out of the bounds of the board") + return False + if not self.check_piece_exists(from_, color): + if give_feedback: + print( + "Illegal move! There is no piece on the " + "starting position that belongs to the player" + ) + return False + if self.check_piece_exists(to_, "white") or self.check_piece_exists( + to_, "black" + ): + if give_feedback: + print("Illegal move! Cannot move to position taken by another piece") + return False + capture = self.check_capture(from_, to_, color) + if capture is None: + if self.check_move_piece_capable(from_, to_, color): + return True + if give_feedback: + print("Illegal move! You can only move diagonally") + return False + return capture + + def make_move(self, from_, to_, color): + """Move a piece on the board and remove any captured pieces""" + move_legal = self.check_move_legal(from_, to_, color) + if move_legal is False: + return False + capture = move_legal if isinstance(move_legal, tuple) else None + king = self.check_piece_king(from_, color) + + if color == "white": + self.white_positions.remove((*from_, king)) + if capture: + captured_king = self.check_piece_king(capture, "black") + self.black_positions.remove((*move_legal, captured_king)) + if to_[1] == self.board_size - 1: + self.white_positions.append((*to_, True)) + else: + self.white_positions.append((*to_, king)) + + else: + self.black_positions.remove((*from_, king)) + if capture: + captured_king = self.check_piece_king(capture, "white") + self.white_positions.remove((*move_legal, captured_king)) + if to_[1] == 0: + self.black_positions.append((*to_, True)) + else: + self.black_positions.append((*to_, king)) + + return True + + def print_board(self, rotate=False): + """Print the board in the console""" + + def print_letters(): + """Print the letters above or under the board""" + print(" ", end="") + for col in range(self.board_size): + if rotate: + print(f" {chr(ord('a')+self.board_size-1-col)}", end=" ") + else: + print(f" {chr(ord('a')+col)}", end=" ") + + def get_square_code(pos, background): + """Return the code of a given square on the board""" + if (*pos, False) in self.white_positions: + return "w" + if (*pos, True) in self.white_positions: + return "W" + if (*pos, False) in self.black_positions: + return "b" + if (*pos, True) in self.black_positions: + return "B" + return background + + print_letters() + print(" ") + + row_range = ( + range(self.board_size * 4) + if not rotate + else reversed(range(self.board_size * 4)) + ) + line = 0 + for row in row_range: + for col in range(self.board_size): + background = "#" if (col % 2 == (row // 4) % 2) != rotate else " " + checker = ( + get_square_code((col, row // 4), background) + if not rotate + else get_square_code( + (self.board_size - 1 - col, row // 4), background + ) + ) + + if col == 0: + if line % 4 == 2: + print(f"{row//4:3d}", end="") + else: + print(" ", end="") + + match line % 4: + case 0: + print("+---", end="") + case 1 | 3: + print(f"|{3*background}", end="") + case 2: + print(f"|{background}{checker}{background}", end="") + if line % 4 == 0: + print("+") + else: + print(f"|{row//4}" if line % 4 == 2 else "|") + line += 1 + print(" ", end="") + for col in range(self.board_size): + print("+---", end="") + print("+") + print_letters() + print() + + # Ran first in the code + def get_possible_moves_capture(self, from_, color): + """Return all possible captures for a piece""" + # all capturing moves: + legal_moves = [] + move_down_left_two = (from_[0] + 2, from_[1] - 2) + move_down_right_two = (from_[0] + 2, from_[1] + 2) + move_up_left_two = (from_[0] - 2, from_[1] - 2) + move_up_right_two = (from_[0] - 2, from_[1] + 2) + if self.check_move_legal(from_, move_down_left_two, color) is not False: + legal_moves.append((from_, move_down_left_two)) + if self.check_move_legal(from_, move_down_right_two, color) is not False: + legal_moves.append((from_, move_down_right_two)) + if self.check_move_legal(from_, move_up_left_two, color) is not False: + legal_moves.append((from_, move_up_left_two)) + if self.check_move_legal(from_, move_up_right_two, color) is not False: + legal_moves.append((from_, move_up_right_two)) + return legal_moves + + def get_possible_moves_non_capture(self, from_, color): + """Return all possible moves that are not captures for a piece""" + # all non-capturing moves + legal_moves = [] + move_down_left_one = (from_[0] + 1, from_[1] - 1) + move_down_right_one = (from_[0] + 1, from_[1] + 1) + move_up_left_one = (from_[0] - 1, from_[1] - 1) + move_up_right_one = (from_[0] - 1, from_[1] + 1) + if self.check_move_legal(from_, move_down_left_one, color) is not False: + legal_moves.append((from_, move_down_left_one)) + if self.check_move_legal(from_, move_down_right_one, color) is not False: + legal_moves.append((from_, move_down_right_one)) + if self.check_move_legal(from_, move_up_left_one, color) is not False: + legal_moves.append((from_, move_up_left_one)) + if self.check_move_legal(from_, move_up_right_one, color) is not False: + legal_moves.append((from_, move_up_right_one)) + return legal_moves + + def get_possible_moves(self, color): + """Return all possible moves for a given piece color""" + legal_moves = [] + captures = [] + if color == "white": + for white_position in self.white_positions: + # print((white_position[0], white_position[1])) + legal_moves += self.get_possible_moves_non_capture( + (white_position[0], white_position[1]), color + ) + captures += self.get_possible_moves_capture( + (white_position[0], white_position[1]), color + ) + elif color == "black": + for black_position in self.black_positions: + legal_moves += self.get_possible_moves_non_capture( + (black_position[0], black_position[1]), color + ) + captures += self.get_possible_moves_capture( + (black_position[0], black_position[1]), color + ) + + if len(captures) > 0: + return (captures, True) + return (legal_moves + captures, False) + + def alpha_beta(self, depth, alpha_beta, color, current_color=None): + """Do alpha beta pruning for given parameters + and return the best move and its evaluated points""" + if current_color is None: + current_color = color + + if depth == 0: + return self.evaluate(color), None + + alpha, beta = alpha_beta + opposite_color = "white" if current_color == "black" else "black" + if current_color == color: + max_eval = float("-inf") + best_move = None + + for move in self.get_possible_moves(current_color)[0]: + new_state = copy.deepcopy(self) + new_state.make_move(*move, current_color) + eval_, _ = new_state.alpha_beta( + depth - 1, alpha_beta, color, opposite_color + ) + + if eval_ > max_eval: + max_eval = eval_ + best_move = move + + alpha = max(alpha, eval_) + + if alpha >= beta: + break + + return max_eval, best_move + + if opposite_color == color: + min_eval = float("inf") + best_move = None + + for move in self.get_possible_moves(current_color)[0]: + new_state = copy.deepcopy(self) + new_state.make_move(*move, current_color) + eval_, _ = new_state.alpha_beta( + depth - 1, alpha_beta, color, opposite_color + ) + + if eval_ < min_eval: + min_eval = eval_ + best_move = move + + beta = min(beta, eval_) + + if beta <= alpha: + break + + return min_eval, best_move + return None + + def evaluate(self, color): + """Evaluates the state of the board for a given color""" + white_score = 0 + black_score = 0 + + for white_position in self.white_positions: + if white_position[2]: + white_score += 10 + else: + white_score += 5 + + for black_position in self.black_positions: + if black_position[2]: + black_score += 10 + else: + black_score += 5 + + return ( + white_score - black_score if color == "white" else black_score - white_score + ) + + def input_to_coordinates(self, user_input): + """Change input from a1 form to tuple form""" + pos_x = ord(user_input[0]) - ord("a") + pos_y = int(user_input[1::]) + return pos_x, pos_y + + def handle_player_move(self, color): + """Prompt player to move, validate their input and make move""" + has_moved = False + possible_moves = self.get_possible_moves(color)[0] + while not has_moved: + user_input = input( + f"You are {color}. How do you want to move? (format: d6 e5)\n" + ) + regex = r"^[a-z]\d+\s[a-z]\d+$" + match = re.search(regex, user_input) + if not match: + print("Invalid input, try again") + continue + [move_from, move_to] = user_input.split(" ") + from_coordinates = self.input_to_coordinates(move_from) + to_coordinates = self.input_to_coordinates(move_to) + + if not (from_coordinates, to_coordinates) in possible_moves: + legal_no_captures = self.check_move_legal( + from_coordinates, to_coordinates, color, True + ) + if legal_no_captures: + print("Invalid move! You can capture a piece") + continue + + has_moved = self.make_move(from_coordinates, to_coordinates, color) + self.print_board(color == "white") + + def start_game(self, player_color="black", algorithm_depth=5): + """Start the main loop of the game""" + if player_color not in ("black", "white"): + print("Invalid color! Color can be black or white") + return + ai_color = "black" if player_color == "white" else "white" + + game.print_board(player_color == "white") + if player_color == "white": + game.handle_player_move("white") + while True: + ai_turn = True + while ai_turn: + possible_moves_ai = game.get_possible_moves(ai_color) + if len(possible_moves_ai[0]) == 0: + print(f"Game over, {player_color} wins") + return + _, ai_move = game.alpha_beta(algorithm_depth, (5, 10), ai_color) + game.make_move(*ai_move, ai_color) + print( + "AI's move: " + f"{chr(ord('a')+ai_move[0][0])}{ai_move[0][1]} " + f"{chr(ord('a')+ai_move[1][0])}{ai_move[1][1]}" + ) + game.print_board(player_color == "white") + ai_turn = game.get_possible_moves(ai_color)[1] and possible_moves_ai[1] + player_turn = True + while player_turn: + possible_moves_player = game.get_possible_moves(player_color) + if len(possible_moves_player[0]) == 0: + print(f"Game over, {ai_color} wins") + return + game.handle_player_move(player_color) + player_turn = ( + game.get_possible_moves(player_color)[1] + and possible_moves_player[1] + ) + + def ai_turn(self, ai_color, algorithm_depth, possible_moves_ai, print_info): + """ Calculates ai move and makes it """ + if len(possible_moves_ai) == 0: + if print_info: + print(f"Game over, {ai_color} loses") + return True + _, ai_move = game.alpha_beta(algorithm_depth, (5, 10), ai_color) + if ai_move is None: + ai_move = possible_moves_ai[0] + game.make_move(*ai_move, ai_color) + if print_info: + print( + "AI's move: " + f"{chr(ord('a')+ai_move[0][0])}{ai_move[0][1]} " + f"{chr(ord('a')+ai_move[1][0])}{ai_move[1][1]}" + ) + game.print_board(True) + return False + + def auto_game(self, white_depth, black_depth): + """Auto game mode between two bots""" + game_turn = 0 + max_turns = 250 + while game_turn < max_turns: + bot_white_turn = True + while bot_white_turn: + possible_moves_ai = game.get_possible_moves("white") + if self.ai_turn("white", white_depth, possible_moves_ai[0], False): + return "white" + bot_white_turn = ( + game.get_possible_moves("white")[1] and possible_moves_ai[1] + ) + bot_black_turn = True + while bot_black_turn: + possible_moves_ai = game.get_possible_moves("black") + if self.ai_turn("black", black_depth, possible_moves_ai[0], False): + return "black" + bot_black_turn = ( + game.get_possible_moves("black")[1] and possible_moves_ai[1] + ) + game_turn += 1 + if game_turn >= max_turns: + print(f"Game ended after {max_turns} turns!") + return "" + return "" + +def auto_simulation(white_depth, black_depth, iterations): + """Runs iterations amount of simulations""" + print( + f"""Running {iterations} simulations with + white depth = {white_depth},black depth = {black_depth}""" + ) + white_wins = 0 + black_wins = 0 + white_pieces_captured = 0 + black_pieces_captured = 0 + current_iteration = 0 + while current_iteration < iterations: + result = game.auto_game(white_depth, black_depth) + if result == "white": + black_wins += 1 + if result == "black": + white_wins += 1 + if result == "": + break + white_pieces_captured += 16 - len(game.white_positions) + black_pieces_captured += 16 - len(game.black_positions) + current_iteration += 1 + print( + f"""White wins = {white_wins}, Black wins = {black_wins}, + white pieces captured in total = {white_pieces_captured}, + black pieces captured in total = {black_pieces_captured}""" + ) + print() + + +def print_help(): + """prints help""" + print( + """python main.py [algorithm_depth] - play the game against the bot as black, + if no algorithm depth is specified the default (5) will be set + +python main.py -h --help print this prompt +python main.py -t --test [max_white_depth] [max_black_depth] non interactive +(does not print moves) for testing how different bot depth play against eachother, +if depths are not provided default value of 5 is set +compares heuristic speed and path length +python main.py -w --white [algorithm_depth] play as white pieces, +if no algorithm depth is specified the default (5) will be set +python main.py -b --black [algorithm_depth] play as black pieces, +if no algorithm depth is specified the default (5) will be set +""" + ) + + +def default(color="black", algorithm_depth=5): + """default program function -> allows to play a game against bot (by default as black)""" + game.start_game(color, algorithm_depth) + + +# Ran first in the code +if __name__ == "__main__": + game = Game(8) + if len(sys.argv) > 1: + if sys.argv[1] == "-h" or sys.argv[1] == "--help": + print_help() + sys.exit() + if sys.argv[1] == "-t" or sys.argv[1] == "--test": + MAX_WHITE_DEPTH = 4 + MAX_BLACK_DEPTH = 4 + if len(sys.argv) > 2: + MAX_WHITE_DEPTH = int(sys.argv[2]) + if len(sys.argv) > 3: + MAX_BLACK_DEPTH = int(sys.argv[3]) + for i in range(MAX_WHITE_DEPTH + 1): + for j in range(MAX_BLACK_DEPTH + 1): + game = Game(8) + auto_simulation(i, j, 10) + sys.exit() + if sys.argv[1] == "-w" or sys.argv[1] == "--white": + ALGORITHM_DEPTH = 5 + if len(sys.argv) > 2: + ALGORITHM_DEPTH = int(sys.argv[2]) + default("white", ALGORITHM_DEPTH) + sys.exit() + if sys.argv[1] == "-b" or sys.argv[1] == "--black": + ALGORITHM_DEPTH = 5 + if len(sys.argv) > 2: + ALGORITHM_DEPTH = int(sys.argv[2]) + default("black", ALGORITHM_DEPTH) + sys.exit() + if len(sys.argv) > 1: + default("black", int(sys.argv[1])) + default() diff --git a/Programming/EARIN/lab2/reportLink.txt b/Programming/EARIN/lab2/reportLink.txt new file mode 100644 index 00000000..ec785e50 --- /dev/null +++ b/Programming/EARIN/lab2/reportLink.txt @@ -0,0 +1 @@ +https://www.overleaf.com/8592159577skmysmsphtkr \ No newline at end of file diff --git a/Programming/EARIN/lab3/.vscode/settings.json b/Programming/EARIN/lab3/.vscode/settings.json new file mode 100644 index 00000000..6c0ed1d7 --- /dev/null +++ b/Programming/EARIN/lab3/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "cSpell.words": ["rastrigin"], + "python.linting.pylintArgs": ["--generated-members=cv2.*"], +} diff --git a/Programming/EARIN/lab3/example.py b/Programming/EARIN/lab3/example.py new file mode 100644 index 00000000..5e79a028 --- /dev/null +++ b/Programming/EARIN/lab3/example.py @@ -0,0 +1,53 @@ +import tempfile +import os + +import cv2 +import numpy as np +import matplotlib.pyplot as plt + + +def main(): + # define number of data points + N = 10 + + # define the visualization params + colors = np.random.rand(N) + + with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as f: + # iterate over the optimization steps + for i in range(10): + # generate random 2D data - replace it with the results from your algorithm + x = np.random.rand(N) + y = np.random.rand(N) + + # plot the data + plt.cla() + plt.figure() + plt.scatter(x, y, c=colors, alpha=0.5) + plt.xlim([0, 1]) + plt.ylim([0, 1]) + plt.savefig(f.name) + + # read image + image = cv2.imread(f.name) + + # show the image, provide window name first + cv2.imshow('visualization', image) + + # add wait key. window waits until user presses a key and quits if the key is 'q' + if cv2.waitKey(0) == 113: + # and finally destroy/close all open windows + cv2.destroyAllWindows() + exit() + + try: + f.close() + os.unlink(f.name) + except: + pass + + cv2.destroyAllWindows() + + +if __name__ == '__main__': + main() diff --git a/Programming/EARIN/lab3/main.py b/Programming/EARIN/lab3/main.py new file mode 100644 index 00000000..7dc5fc85 --- /dev/null +++ b/Programming/EARIN/lab3/main.py @@ -0,0 +1,359 @@ +""" +Program that optimizes Rastrigin function: file_ (x_point_value, y_point_value) = +20 + (x_point_value^2 - 10cos(2πx)) + (y_point_value^2 - 10 cos(2πy)). +Using Evolutionary Strategy (μ, λ). +""" +import sys +import os +import time +import tempfile +import cv2 +import matplotlib.pyplot as plt +import numpy as np + + +def rastrigin(x_argument, y_argument): + """Define the Rastrigin function""" + return ( + 20 + + x_argument**2 + - 10 * np.cos(2 * np.pi * x_argument) + + y_argument**2 + - 10 * np.cos(2 * np.pi * y_argument) + ) + + +def generate( + population, + arguments +): + """Run single generation""" + # Evaluate the fitness of each individual + fitness = np.array( + [ + rastrigin(x_point_value, y_point_value) + for x_point_value, y_point_value in population + ] + ) + + # Select the top arguments["number_of_parents"] individuals + parents = population[np.argsort(fitness)[:arguments["number_of_parents"]]] + + # Generate the next generation of lambda individuals by recombination + children = np.concatenate( + [ + np.random.permutation(parents) + for i in range((arguments["size_of_population"] // arguments["number_of_parents"]) + 1) + ] + ) + children = children[:arguments["size_of_population"]] + + # Add mutation to the children + mutation = np.random.normal( + loc=0, scale=arguments["mutation_strength"], size=(arguments["size_of_population"], 2) + ) + population = children + mutation + return fitness, population + + +def evolution_strategy( + arguments, + no_display=False, +): + """Define the Evolutionary Strategy (μ, λ) algorithm""" + # Initialize the population + print_info = [] + population = np.random.uniform( + low=arguments["min"], high=arguments["max"], size=(arguments["size_of_population"], 2) + ) + + summary = [] + if not no_display: + print_info.append( + (population, + 0, + f"""0:nop-{arguments["number_of_parents"]}:sop-{arguments["size_of_population"]}: + ms-{arguments["mutation_strength"]}:nog-{arguments["number_of_generations"]}: + min-max-{arguments["min"], arguments["max"]}:noo-{arguments["number_of_outputs"]}""", + )) + arguments["number_of_outputs"] = min( + [arguments["number_of_outputs"] - 1, arguments["number_of_generations"]]) + + # Iterate until we reach max number of generate and terminate + for generation_number in range(1, arguments["number_of_generations"] + 1): + fitness, population = generate( + population, arguments) + step = ( + arguments["number_of_generations"] // arguments["number_of_outputs"] + if arguments["number_of_generations"] % arguments["number_of_outputs"] == 0 + else arguments["number_of_generations"] // (arguments["number_of_outputs"] - 1) + ) + offset = arguments["number_of_generations"] % step + if (generation_number - offset) % step == 0 and not no_display: + print_info.append( + (population, + generation_number, + f"""{generation_number}:nop_{arguments["number_of_parents"]}: + sop_{arguments["size_of_population"]}:ms_{arguments["mutation_strength"]}: + nog_{arguments["number_of_generations"]}: + min_max_{arguments["min"], arguments["max"]}: + noo_{arguments["number_of_outputs"]}""", + )) + summary.append(population) + + # Evaluate the fitness of the final population + fitness = np.array( + [ + rastrigin(x_point_value, y_point_value) + for x_point_value, y_point_value in population + ] + ) + + # Return the best individual found + best_idx = np.argmin(fitness) + return ( + population[best_idx], + fitness[best_idx], + population, + print_info, + summary, + ) + + +def print_help(): + """Print program functionality and how to access it""" + print( + """ + python main.py - Default functionality optimizing + Rastrigin function file_ (x_point_value, y_point_value) = + 20 + (x_point_value^2 - 10cos(2πx)) + (y_point_value^2 - 10 cos(2πy)) + using Evolutionary Strategy (μ, λ), using only default values + Default values: + arguments["number_of_parents"]=5, + arguments["size_of_population"]=20, + arguments["mutation_strength"]=0.1, + arguments["number_of_generations"]=100, + min_value=-5.12, + max_value=5.12 + arguments["number_of_outputs"] = 100 + + python main.py -h --help print this prompt + Any of the default values an be changed using arguments: + -nop --arguments["number_of_parents"] [number] + -sop --arguments["size_of_population"] [number] + -ms --arguments["mutation_strength"] [number] + -nog --arguments["number_of_generations"] [number] + -min --min_value [number] + -max --max_value [number] + -noo, --arguments["number_of_outputs"] [number] + Those arguments can be given in any order and any argument + which was not entered will be replaced with default value, + Additional flags: + -nd, --no-display (does not show the plots) + -s, --save (if issued WILL save the files) + exemplary use: + python main.py -nop 5 -sop 20 -ms 0.1 -nog 100 -min -5.12 -max 5.12 -noo 100 + """ + ) + + +def get_output_bounds(x_data, y_data): + """Get x and y output limits for pyplot""" + # min_size = 0.2 + min_output_size = ARGUMENTS["mutation_strength"] * 10 + + xmin = min(x_data) + xmax = max(x_data) + ymin = min(y_data) + ymax = max(y_data) + x_diff = xmax - xmin + y_diff = ymax - ymin + + if min_output_size is None: + min_output_size = max(x_diff, y_diff) + + margin = max(x_diff, y_diff) / 5 + + if x_diff < min_output_size: + xmax += (min_output_size - x_diff) / 2 + xmin -= (min_output_size - x_diff) / 2 + if y_diff < min_output_size: + ymax += (min_output_size - y_diff) / 2 + ymin -= (min_output_size - y_diff) / 2 + x_bounds = [xmin - margin, xmax + margin] + y_bounds = [ymin - margin, ymax + margin] + return x_bounds, y_bounds + + +def output( + population_output, + generation_number, + file_name="temp", + save_results=False): + """Draw result of our function""" + + # define the visualization params + colors = np.random.rand(len(population_output)) + + with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as file_: + # iterate over the optimization steps + x_data = [] + y_data = [] + for x_point_value, y_point_value in population_output: + x_data.append(x_point_value) + y_data.append(y_point_value) + + x_lim, y_lim = get_output_bounds(x_data, y_data) + + # plot the data + plt.cla() + plt.figure() + plt.scatter(x_data, y_data, c=colors, alpha=0.5) + plt.xlim(x_lim) + plt.ylim(y_lim) + plt.savefig(file_.name) + + # read image + image = cv2.imread(file_.name) + + # show the image, provide window name first + cv2.imshow(f"Generation {generation_number}", image) + if save_results: + cv2.imwrite(file_name + ".jpg", image) + # add wait key. window waits until user presses a key and quits if + # the key is 'q' + if cv2.waitKey(0) == 113: + # and finally destroy/close all open windows + sys.exit() + + cv2.destroyAllWindows() + + file_.close() + os.unlink(file_.name) + + +def print_summary(populations, file_name="temp_summary", save_results=False): + """Draw result of our function for chosen generations""" + + with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as file_: + # iterate over the optimization steps + # generate random 2D data - replace it with the results from your + # algorithm + plt.cla() + plt.figure() + bounds = None + for ind, pop in enumerate(populations): + x_data = [] + y_data = [] + for x_point_value, y_point_value in pop: + x_data.append(x_point_value) + y_data.append(y_point_value) + + if ind == 0: + bounds = get_output_bounds(x_data, y_data) + # plot the data + transparency = ind / (len(populations) - 1) + color = [[transparency, 0, 0]] * len(pop) + plt.scatter( + x_data, + y_data, + c=color, + alpha=transparency, + label=f"{ind}") + plt.xlim(bounds[0]) + plt.ylim(bounds[1]) + plt.savefig(file_.name) + + # read image + image = cv2.imread(file_.name) + if save_results: + cv2.imwrite("SUMMARY:" + file_name + ".jpg", image) + + # show the image, provide window name first + cv2.imshow("Summary", image) + + # add wait key. window waits until user presses a key and quits if + # the key is 'q' + if cv2.waitKey(0) == 113: + # and finally destroy/close all open windows + sys.exit() + + cv2.destroyAllWindows() + + file_.close() + os.unlink(file_.name) + + +def user_input(): + """Handle user terminal arguments""" + arguments = { + "number_of_parents": 5, + "size_of_population": 20, + "mutation_strength": 0.1, + "number_of_generations": 100, + "min": -5.12, + "max": 5.12, + "number_of_outputs": 10, + "no_display": False, + "save": False, + } + for index, argument in enumerate(sys.argv): + if argument in ("-h", "--help"): + print_help() + sys.exit() + if argument in ("-nop", "--number_of_parents"): + arguments["number_of_parents"] = int(sys.argv[index + 1]) + if argument in ("-sop", "--size_of_population"): + arguments["size_of_population"] = int(sys.argv[index + 1]) + if argument in ("-ms", "--mutation_strength"): + arguments["mutation_strength"] = float(sys.argv[index + 1]) + if argument in ("-nog", "--number_of_generations"): + arguments["number_of_generations"] = int(sys.argv[index + 1]) + if argument in ("-min", "--min_value"): + arguments["min"] = float(sys.argv[index + 1]) + if argument in ("-max", "--max_value"): + arguments["max"] = float(sys.argv[index + 1]) + if argument in ("-noo", "--number_of_outputs"): + arguments["number_of_outputs"] = int(sys.argv[index + 1]) + if argument in ("-nd", "--no_display"): + arguments["no_display"] = True + if argument in ("-s", "--save"): + arguments["save"] = True + + return arguments + + +def print_output(print_info, save_results, summary): + """ Prints out population and summary plots """ + for population, generation_number, file_name in print_info: + output(population, generation_number, file_name, save_results) + summary_file_name = file_name + print_summary(summary, summary_file_name, save_results) + + +# Ran first in the code +if __name__ == "__main__": + # Run the Evolutionary Strategy algorithm + ARGUMENTS = user_input() + TOTAL_TIME = 0 + start_time = time.perf_counter() + ( + best_individual, + best_fitness, + output_population, + PRINT_INFO, + SUMMARY, + ) = evolution_strategy( + ARGUMENTS, + ARGUMENTS["no_display"], + ) + end_time = time.perf_counter() + if not ARGUMENTS["no_display"]: + print_output(PRINT_INFO, ARGUMENTS["save"], SUMMARY) + TOTAL_TIME = end_time - start_time + time_per_generation = TOTAL_TIME / ARGUMENTS["number_of_generations"] + + print("Best individual found:", best_individual) + print("Best fitness found:", best_fitness) + print("total_generation_time: ", TOTAL_TIME) + print("time_per_generation: ", time_per_generation) diff --git a/Programming/EARIN/lab3/report/0.jpg b/Programming/EARIN/lab3/report/0.jpg new file mode 100644 index 00000000..f98aabd3 Binary files /dev/null and b/Programming/EARIN/lab3/report/0.jpg differ diff --git a/Programming/EARIN/lab3/report/10.jpg b/Programming/EARIN/lab3/report/10.jpg new file mode 100644 index 00000000..2ef2d3d8 Binary files /dev/null and b/Programming/EARIN/lab3/report/10.jpg differ diff --git a/Programming/EARIN/lab3/report/12.jpg b/Programming/EARIN/lab3/report/12.jpg new file mode 100644 index 00000000..39b3482e Binary files /dev/null and b/Programming/EARIN/lab3/report/12.jpg differ diff --git a/Programming/EARIN/lab3/report/14.jpg b/Programming/EARIN/lab3/report/14.jpg new file mode 100644 index 00000000..0ee83135 Binary files /dev/null and b/Programming/EARIN/lab3/report/14.jpg differ diff --git a/Programming/EARIN/lab3/report/16.jpg b/Programming/EARIN/lab3/report/16.jpg new file mode 100644 index 00000000..0940b720 Binary files /dev/null and b/Programming/EARIN/lab3/report/16.jpg differ diff --git a/Programming/EARIN/lab3/report/18.jpg b/Programming/EARIN/lab3/report/18.jpg new file mode 100644 index 00000000..7e0454e2 Binary files /dev/null and b/Programming/EARIN/lab3/report/18.jpg differ diff --git a/Programming/EARIN/lab3/report/2.jpg b/Programming/EARIN/lab3/report/2.jpg new file mode 100644 index 00000000..08922f1e Binary files /dev/null and b/Programming/EARIN/lab3/report/2.jpg differ diff --git a/Programming/EARIN/lab3/report/20.jpg b/Programming/EARIN/lab3/report/20.jpg new file mode 100644 index 00000000..641c5b78 Binary files /dev/null and b/Programming/EARIN/lab3/report/20.jpg differ diff --git a/Programming/EARIN/lab3/report/4.jpg b/Programming/EARIN/lab3/report/4.jpg new file mode 100644 index 00000000..42f68d80 Binary files /dev/null and b/Programming/EARIN/lab3/report/4.jpg differ diff --git a/Programming/EARIN/lab3/report/6.jpg b/Programming/EARIN/lab3/report/6.jpg new file mode 100644 index 00000000..010c0eac Binary files /dev/null and b/Programming/EARIN/lab3/report/6.jpg differ diff --git a/Programming/EARIN/lab3/report/8.jpg b/Programming/EARIN/lab3/report/8.jpg new file mode 100644 index 00000000..40a2e8c3 Binary files /dev/null and b/Programming/EARIN/lab3/report/8.jpg differ diff --git a/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.aux b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.aux new file mode 100644 index 00000000..e99b720f --- /dev/null +++ b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.aux @@ -0,0 +1,38 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand*\HyPL@Entry[1]{} +\HyPL@Entry{0<>} +\@writefile{toc}{\contentsline {section}{\numberline {1}Exercise Variant 2 - "Rastrigin function"}{1}{section.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {2}Implementation}{1}{section.2}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Exemplary plot halfway through generation with parameters nop 250 sop 1000 ms 0.1 nog 500 min max (-5.12, 5.12) noo 10 \relax }}{3}{figure.caption.1}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Exemplary summary plot with parameters nop 250 sop 1000 ms 0.1 nog 500 min max (-5.12, 5.12) noo 10 \relax }}{4}{figure.caption.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3}Results}{4}{section.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Exemplary generation plots}{4}{subsection.3.1}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces First 10 Generation plots with parameters nop-250:sop-1000:ms-0.1:nog-20:min-max-(-5.12, 5.12):noo-10 \relax }}{6}{figure.caption.3}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(a)}{\ignorespaces {0 generation}}}{6}{subfigure.3.1}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(b)}{\ignorespaces {2 generation}}}{6}{subfigure.3.2}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(c)}{\ignorespaces {4 generation}}}{6}{subfigure.3.3}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(d)}{\ignorespaces {6 generation}}}{6}{subfigure.3.4}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(e)}{\ignorespaces {8 generation}}}{6}{subfigure.3.5}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(f)}{\ignorespaces {10 generation}}}{6}{subfigure.3.6}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces Last 10 Generation plots and summary plot with parameters nop-250:sop-1000:ms-0.1:nog-20:min-max-(-5.12, 5.12):noo-10 \relax }}{7}{figure.caption.4}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(a)}{\ignorespaces {12 generation}}}{7}{subfigure.4.1}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(b)}{\ignorespaces {14 generation}}}{7}{subfigure.4.2}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(c)}{\ignorespaces {16 generation}}}{7}{subfigure.4.3}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(d)}{\ignorespaces {18 generation}}}{7}{subfigure.4.4}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(e)}{\ignorespaces {20 generation}}}{7}{subfigure.4.5}\protected@file@percent } +\@writefile{lof}{\contentsline {subfigure}{\numberline{(f)}{\ignorespaces {Summary}}}{7}{subfigure.4.6}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Generation time}{8}{subsection.3.2}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces From left: Parameter changed, New value in place of old parameter value, Best individual found, Best fitness, Total generation time and Time Per Generation [TPG]\relax }}{8}{figure.caption.5}\protected@file@percent } +\gdef \@abspage@last{8} diff --git a/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.fdb_latexmk b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.fdb_latexmk new file mode 100644 index 00000000..4c08b099 --- /dev/null +++ b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.fdb_latexmk @@ -0,0 +1,94 @@ +# Fdb version 4 +["xdvipdfmx"] 1684267303 "EARIN_LAB_3_RUDNICKI_KLISZKO.xdv" "EARIN_LAB_3_RUDNICKI_KLISZKO.pdf" "EARIN_LAB_3_RUDNICKI_KLISZKO" 1684267303 0 + "EARIN_LAB_3_RUDNICKI_KLISZKO.xdv" 1684267303 67176 23d8825ed244b168acd4ad24fd87aee1 "xelatex" + (generated) + "EARIN_LAB_3_RUDNICKI_KLISZKO.pdf" + (rewritten before read) +["xelatex"] 1684267302 "/home/kuchy/earin/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.tex" "EARIN_LAB_3_RUDNICKI_KLISZKO.xdv" "EARIN_LAB_3_RUDNICKI_KLISZKO" 1684267303 0 + "/home/kuchy/earin/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.tex" 1684267301 8250 17a5f5827aa63a0cacff2b97d7aab966 "" + "/usr/share/texmf-dist/fonts/map/fontname/texfonts.map" 1680514707 3524 cb3e574dea2d1052e39280babc910dc8 "" + "/usr/share/texmf-dist/fonts/tfm/adobe/zapfding/pzdr.tfm" 1680514707 1528 f853c4d1b4e0550255e02831fdc8496f "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1680514707 1524 4414a8315f39513458b80dfc63bff03a "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm" 1680514707 1512 f21f83efb36853c0b70002322c1ab3ad "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm" 1680514707 1520 eccf95517727cb11801f4f1aee3a21b4 "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1680514707 1288 655e228510b4c2a1abe905c368440826 "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmr6.tfm" 1680514707 1300 b62933e007d01cfd073f79b963c01526 "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmr8.tfm" 1680514707 1292 21c1c5bfeaebccffdb478fd231a0997d "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1680514707 1124 6c73e740cf17375f03eec0ee63599741 "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm" 1680514707 1116 933a60c408fc0a863a92debe84b2d294 "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm" 1680514707 1120 8b7d695260f3cff42e636090a8002094 "" + "/usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty" 1680514707 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 "" + "/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1680514707 40635 c40361e206be584d448876bba8a64a3b "" + "/usr/share/texmf-dist/tex/generic/bitset/bitset.sty" 1680514707 33961 6b5c75130e435b2bfdb9f480a09a39f9 "" + "/usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty" 1680514707 7734 b98cbb34c81f667027c1e3ebdbfce34b "" + "/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1680514707 8371 9d55b8bd010bc717624922fb3477d92e "" + "/usr/share/texmf-dist/tex/generic/iftex/iftex.sty" 1680514707 7237 bdd120a32c8fdb4b433cf9ca2e7cd98a "" + "/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1680514707 8356 7bbb2c2373aa810be568c29e333da8ed "" + "/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty" 1680514707 31769 002a487f55041f8e805cfbf6385ffd97 "" + "/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1680514707 5412 d5a2436094cd7be85769db90f29250a6 "" + "/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1680514707 17859 4409f8f50cd365c68e684407e5350b1b "" + "/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1680514707 19007 15924f7228aca6c6d184b115f4baa231 "" + "/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1680514707 20089 80423eac55aa175305d35b49e04fe23b "" + "/usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty" 1680514707 21514 b7557edcee22835ef6b03ede1802dad4 "" + "/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1680514707 7008 f92eaa0a3872ed622bbf538217cd2ab7 "" + "/usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty" 1680514707 19336 ce7ae9438967282886b3b036cfad1e4d "" + "/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty" 1680514707 3935 57aa3c3e203a5c2effb4d2bd2efbc323 "" + "/usr/share/texmf-dist/tex/latex/base/article.cls" 1680514707 20144 d5ecf0a5140c8d8d8b72cbe86e320eff "" + "/usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty" 1680514707 3052 30236f0cc243a8651b82240dfd2e8b9d "" + "/usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty" 1680514707 2462 8ce5f9a9c63002f2c1af03c262cf29af "" + "/usr/share/texmf-dist/tex/latex/base/size10.clo" 1680514707 8448 c33a4e1cb35cee9b33c2b21033b73e39 "" + "/usr/share/texmf-dist/tex/latex/base/ts1cmr.fd" 1680514707 2430 8418b3f1835e588625becbcac4dbce56 "" + "/usr/share/texmf-dist/tex/latex/caption/caption.sty" 1680514707 55778 14d5c99aa26410e440820bb9ea5b8b3a "" + "/usr/share/texmf-dist/tex/latex/caption/caption3.sty" 1680514707 71836 1a735454ad10692452eb2f2fc37f3865 "" + "/usr/share/texmf-dist/tex/latex/float/float.sty" 1680514707 6749 16d2656a1984957e674b149555f1ea1d "" + "/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1680514707 1224 978390e9c2234eab29404bc21b268d1e "" + "/usr/share/texmf-dist/tex/latex/graphics-def/xetex.def" 1680514707 14788 1dde73f396dd97d88c838bee2a352abe "" + "/usr/share/texmf-dist/tex/latex/graphics/graphics.sty" 1680514707 18387 8f900a490197ebaf93c02ae9476d4b09 "" + "/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty" 1680514707 8010 a8d949cbdbc5c983593827c9eec252e1 "" + "/usr/share/texmf-dist/tex/latex/graphics/keyval.sty" 1680514707 2671 7e67d78d9b88c845599a85b2d41f2e39 "" + "/usr/share/texmf-dist/tex/latex/graphics/trig.sty" 1680514707 4023 293ea1c16429fc0c4cf605f4da1791a9 "" + "/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty" 1680514707 17914 4c28a13fc3d975e6e81c9bea1d697276 "" + "/usr/share/texmf-dist/tex/latex/hyperref/hxetex.def" 1680514707 44472 a079d09fb6a7034a730c6d56a4fe1267 "" + "/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty" 1680514707 223129 4edf043af471f3251c66e432cfa22987 "" + "/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty" 1680514707 12947 1ce831528e963a8568de1f4d67cfb982 "" + "/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def" 1680514707 14249 d947c5c09f3af04ae2f37fc11c7ac2f6 "" + "/usr/share/texmf-dist/tex/latex/hyperref/puenc.def" 1680514707 117125 aa115cac3914abcf3769f370e6325117 "" + "/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1680514707 22555 6d8e155cfef6d82c3d5c742fea7c992e "" + "/usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty" 1680514707 13815 760b0c02f691ea230f5359c4e1de23a7 "" + "/usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def" 1680514707 32346 879686206fa618f4f5073ad4bd48feda "" + "/usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty" 1680514707 5766 13a9e8766c47f30327caf893ece86ac8 "" + "/usr/share/texmf-dist/tex/latex/listings/listings.cfg" 1680514707 1829 d8258b7d94f5f955e70c623e525f9f45 "" + "/usr/share/texmf-dist/tex/latex/listings/listings.sty" 1680514707 80947 75a96bb4c9f40ae31d54a01d924df2ff "" + "/usr/share/texmf-dist/tex/latex/listings/lstlang1.sty" 1680514707 205154 31132370016e8c97e49bc3862419679b "" + "/usr/share/texmf-dist/tex/latex/listings/lstmisc.sty" 1680514707 77021 d05e9115c67855816136d82929db8892 "" + "/usr/share/texmf-dist/tex/latex/refcount/refcount.sty" 1680514707 9878 9e94e8fa600d95f9c7731bb21dfb67a4 "" + "/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1680514707 9714 ba3194bd52c8499b3f1e3eb91d409670 "" + "/usr/share/texmf-dist/tex/latex/subfig/subfig.sty" 1680514707 21369 9ef165ca6df8815c92e693146a376c92 "" + "/usr/share/texmf-dist/tex/latex/tools/array.sty" 1680514707 12691 5b542990fe866f3d772f71346cf85b95 "" + "/usr/share/texmf-dist/tex/latex/tools/tabularx.sty" 1680514707 7147 be6981d9f5d866a5634048c4a11814a9 "" + "/usr/share/texmf-dist/tex/latex/url/url.sty" 1680514707 12796 8edb7d69a20b857904dd0ea757c14ec9 "" + "/usr/share/texmf-dist/web2c/texmf.cnf" 1680514707 39911 2da6c67557ec033436fe5418a70a8a61 "" + "/var/lib/texmf/web2c/xetex/xelatex.fmt" 1681763698 11046108 24dffefc9850ac1939834d68c95379b0 "" + "0.jpg" 1684253438 87686 fdcc70f185e7fed1e054614ef7fd1d99 "" + "10.jpg" 1684253438 35289 05feeebd2669a1eaadd76cf24fefdaf5 "" + "12.jpg" 1684253438 31816 a9ed363592906d46ee5b6515a4c92003 "" + "14.jpg" 1684253438 42591 e56cb908db6f8c390fa15bd606b8e7e8 "" + "16.jpg" 1684253438 43391 433aaa137393f985e8e0ad5934b67c0f "" + "18.jpg" 1684253438 44235 8b8f1cd83e131e04baf0ec8f709477d7 "" + "2.jpg" 1684253438 51403 23f3872e85e47a182ec5801160a0bad7 "" + "20.jpg" 1684253438 43506 5da10c8bdf661be5d929ed99ca44dd22 "" + "4.jpg" 1684253438 39503 aa9b71e017c328011badbe7e6738a6d5 "" + "6.jpg" 1684253438 45028 5dc52477f526227db313fc589bb9c108 "" + "8.jpg" 1684253438 40633 34cc6363dd361341ebb04deff63f6dd2 "" + "EARIN_LAB_3_RUDNICKI_KLISZKO.aux" 1684267303 3970 d4ecd53a0c4324bd85e9464a9bb1ff0b "xelatex" + "EARIN_LAB_3_RUDNICKI_KLISZKO.out" 1684267303 782 eff6be67cb51513b5721bb14fb2103ca "xelatex" + "EARIN_LAB_3_RUDNICKI_KLISZKO.tex" 1684267301 8250 17a5f5827aa63a0cacff2b97d7aab966 "" + "example_halfway.jpg" 1684253438 43787 f0809821c60091352d61146053f795f2 "" + "example_summary.jpg" 1684253438 17901 286cc778e6a6b564c8027d51b98a968f "" + "summary.jpg" 1684253438 25294 025e44a37ad32dc1d16a583d04349a03 "" + (generated) + "EARIN_LAB_3_RUDNICKI_KLISZKO.aux" + "EARIN_LAB_3_RUDNICKI_KLISZKO.log" + "EARIN_LAB_3_RUDNICKI_KLISZKO.out" + "EARIN_LAB_3_RUDNICKI_KLISZKO.xdv" + (rewritten before read) diff --git a/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.fls b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.fls new file mode 100644 index 00000000..16423761 --- /dev/null +++ b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.fls @@ -0,0 +1,577 @@ +PWD /home/kuchy/earin/EARIN/lab3/report +INPUT /usr/share/texmf-dist/web2c/texmf.cnf +INPUT /var/lib/texmf/web2c/xetex/xelatex.fmt +INPUT /home/kuchy/earin/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.tex +OUTPUT EARIN_LAB_3_RUDNICKI_KLISZKO.log +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texmf-dist/tex/latex/graphics-def/xetex.def +INPUT /usr/share/texmf-dist/tex/latex/graphics-def/xetex.def +INPUT /usr/share/texmf-dist/tex/latex/graphics-def/xetex.def +INPUT /usr/share/texmf-dist/tex/latex/graphics-def/xetex.def +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/fonts/map/fontname/texfonts.map +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/zapfding/pzdr.tfm +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hxetex.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hxetex.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hxetex.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hxetex.def +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/tabularx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/subfig/subfig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/caption/caption3.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +INPUT ./EARIN_LAB_3_RUDNICKI_KLISZKO.aux +INPUT EARIN_LAB_3_RUDNICKI_KLISZKO.aux +INPUT EARIN_LAB_3_RUDNICKI_KLISZKO.aux +OUTPUT EARIN_LAB_3_RUDNICKI_KLISZKO.aux +INPUT /usr/share/texmf-dist/tex/latex/base/ts1cmr.fd +INPUT /usr/share/texmf-dist/tex/latex/base/ts1cmr.fd +INPUT /usr/share/texmf-dist/tex/latex/base/ts1cmr.fd +INPUT /usr/share/texmf-dist/tex/latex/base/ts1cmr.fd +INPUT ./EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT ./EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT ./EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT ./EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT ./EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT ./EARIN_LAB_3_RUDNICKI_KLISZKO.out +OUTPUT EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmr12.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmr8.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmr6.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +OUTPUT EARIN_LAB_3_RUDNICKI_KLISZKO.xdv +INPUT ./example_halfway.jpg +INPUT ./example_halfway.jpg +INPUT example_halfway.jpg +INPUT ./example_summary.jpg +INPUT ./example_summary.jpg +INPUT example_summary.jpg +INPUT ./0.jpg +INPUT ./0.jpg +INPUT 0.jpg +INPUT ./2.jpg +INPUT ./2.jpg +INPUT 2.jpg +INPUT ./4.jpg +INPUT ./4.jpg +INPUT 4.jpg +INPUT ./6.jpg +INPUT ./6.jpg +INPUT 6.jpg +INPUT ./8.jpg +INPUT ./8.jpg +INPUT 8.jpg +INPUT ./10.jpg +INPUT ./10.jpg +INPUT 10.jpg +INPUT ./12.jpg +INPUT ./12.jpg +INPUT 12.jpg +INPUT ./14.jpg +INPUT ./14.jpg +INPUT 14.jpg +INPUT ./16.jpg +INPUT ./16.jpg +INPUT 16.jpg +INPUT ./18.jpg +INPUT ./18.jpg +INPUT 18.jpg +INPUT ./20.jpg +INPUT ./20.jpg +INPUT 20.jpg +INPUT ./summary.jpg +INPUT ./summary.jpg +INPUT summary.jpg +INPUT EARIN_LAB_3_RUDNICKI_KLISZKO.aux +INPUT ./EARIN_LAB_3_RUDNICKI_KLISZKO.out +INPUT ./EARIN_LAB_3_RUDNICKI_KLISZKO.out diff --git a/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.out b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.out new file mode 100644 index 00000000..849a582d --- /dev/null +++ b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.out @@ -0,0 +1,5 @@ +\BOOKMARK [1][-]{section.1}{\376\377\000E\000x\000e\000r\000c\000i\000s\000e\000\040\000V\000a\000r\000i\000a\000n\000t\000\040\0002\000\040\000-\000\040\000"\000R\000a\000s\000t\000r\000i\000g\000i\000n\000\040\000f\000u\000n\000c\000t\000i\000o\000n\000"}{}% 1 +\BOOKMARK [1][-]{section.2}{\376\377\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{}% 2 +\BOOKMARK [1][-]{section.3}{\376\377\000R\000e\000s\000u\000l\000t\000s}{}% 3 +\BOOKMARK [2][-]{subsection.3.1}{\376\377\000E\000x\000e\000m\000p\000l\000a\000r\000y\000\040\000g\000e\000n\000e\000r\000a\000t\000i\000o\000n\000\040\000p\000l\000o\000t\000s}{section.3}% 4 +\BOOKMARK [2][-]{subsection.3.2}{\376\377\000G\000e\000n\000e\000r\000a\000t\000i\000o\000n\000\040\000t\000i\000m\000e}{section.3}% 5 diff --git a/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.pdf b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.pdf new file mode 100644 index 00000000..34ba4161 Binary files /dev/null and b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.pdf differ diff --git a/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.synctex.gz b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.synctex.gz new file mode 100644 index 00000000..389cd0da Binary files /dev/null and b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.synctex.gz differ diff --git a/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.tex b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.tex new file mode 100644 index 00000000..a1194cb7 --- /dev/null +++ b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.tex @@ -0,0 +1,173 @@ +\documentclass{article}[12pt] +\usepackage{graphicx} % Required for inserting images +\usepackage{listings} +\usepackage{hyperref} +\usepackage{tabularx} +\usepackage{float} +\usepackage{subfig} + +\title{EARIN Lab 3 Report} +\author{Krzysztof Rudnicki, 307585 \\ Jakub Kliszko, 303866 } +\date{\today} + +\begin{document} + +\maketitle + +\section{Exercise Variant 2 - "Rastrigin function"} +Our task was to write a program that optimizes Rastrigin function: \\ +\[ f (x, y) = +20 + (x^2 - 10 \, cos(2πx)) + (y^2 - 10 \, cos(2πy)) \] +Using Evolutionary Strategy ($\mu$, $\lambda$) (later refered as ES($\mu$, $\lambda$)) \\ + +\section{Implementation} +Program can be ran by installing python, moving to project directory and issuing command: +\begin{lstlisting}[language=bash] +python main.py +\end{lstlisting} +There are 7 parameters we can (but do not have to) change: +\begin{enumerate} +\item Number of parents (default equal to 5) +\item Size of population (default equal to 20) +\item Mutation Strength (default equal to 0.1) +\item Number of generations (default equal to 100) +\item Minimal Value (default equal to -5.12) +\item Maximal Value (default equal to 5.12) +\item Number of outputs (default equal to 10) +\end{enumerate} +Number of outputs are strictly for displaying results and does not influence the result itself \\ +To set parameters values user can add those flags to program run: +\begin{lstlisting}[language=bash] + -nop --number_of_parents [number] + -sop --size_of_population [number] + -ms --mutation_strength [number] + -nog --number_of_generations [number] + -min --min_value [number] + -max --max_value [number] + -noo --number_of_outputs [number] +\end{lstlisting} +Order of those parameters does not matter, user can provide none, one, or any number of arguments \\ +Exemplary use (settings all values to default values): +\begin{lstlisting}[language=bash] + python main.py -nop 5 -sop 20 -s 0.1 + -i 100 -min -5.12 -max 5.12 -noo 10 +\end{lstlisting} +There are additional flags for quality of life with the program +\begin{lstlisting} + -nd --no_display (If used will NOT print out the plots) + -s --save (If used WILL save plot files to code folder) +\end{lstlisting} +To print help info about program user can issue help flag: +\begin{lstlisting}[language=bash] + python main.py -h +\end{lstlisting} +Results will be displayed on 2D scatter plot. There will be as many outputs as user wanted with incrementation of generation so that the final plot will be on final generation \\ +\begin{figure}[H] + \caption{Exemplary plot halfway through generation with parameters \\ nop 250 sop 1000 ms 0.1 nog 500 min max (-5.12, 5.12) noo 10 } + \includegraphics[width=\textwidth]{example_halfway.jpg} + \centering + \end{figure} +At the end summary of results on plot will display with red gradient showing results from the earliest (white) to latest (bright red) \\ +\begin{figure}[H] + \caption{Exemplary summary plot with parameters\\ nop 250 sop 1000 ms 0.1 nog 500 min max (-5.12, 5.12) noo 10 } + \includegraphics[width=\textwidth]{example_summary.jpg} + \centering + \end{figure} +Results will be displayed and if user requested saved in the same folder as code directory for further inspection, with file name containing information about input parameters \\ +4 more information will also be displayed: +\begin{itemize} + \item Best individual found - x, y coordinates closest to 0 + \item Best fitness found + \item Total Generation Time - including ONLY generation (not plot display) + \item Time per generation - Total generation time divided by number of generations +\end{itemize} +\section{Results} +\subsection{Exemplary generation plots} +We have successfully implemented ES($\mu$, $\lambda$) to optimize Rastrigin function \\ +Rastrigin function is used to test optimization algorithms as it contains a lot of local minima, our plots should therefore tend to contain values closer and closer to zeros \\ +Exemplary run of the program with parameters: +\begin{itemize} + \item Number of parents - 250 + \item Size of population - 1000 + \item Mutation Strength - 0.1 + \item Number of generations - 20 + \item Min value - -5.12 + \item Max value - 5.12 + \item Number of outputs - 10 +\end{itemize} + +\begin{figure}[H] + \advance\leftskip-3cm + \begin{tabular}{cc} + \subfloat[0 generation]{ + \includegraphics[width = 0.7\textwidth]{0.jpg}} & + \subfloat[2 generation]{ + \includegraphics[width = 0.7\textwidth]{2.jpg}} \\ + \subfloat[4 generation]{ + \includegraphics[width = 0.7\textwidth]{4.jpg}} & + \subfloat[6 generation]{ + \includegraphics[width = 0.7\textwidth]{6.jpg}} \\ + \subfloat[8 generation]{ + \includegraphics[width = 0.7\textwidth]{8.jpg}} & + \subfloat[10 generation]{ + \includegraphics[width = 0.7\textwidth]{10.jpg}} \\ + \end{tabular} +\caption{First 10 Generation plots with parameters nop-250:sop-1000:ms-0.1:nog-20:min-max-(-5.12, 5.12):noo-10 } + \end{figure} + + \begin{figure}[H] + \advance\leftskip-3cm + \begin{tabular}{cc} + + \subfloat[12 generation]{ + \includegraphics[width = 0.7\textwidth]{12.jpg}} & + \subfloat[14 generation]{ + \includegraphics[width = 0.7\textwidth]{14.jpg}} \\ + \subfloat[16 generation]{ + \includegraphics[width = 0.7\textwidth]{16.jpg}} & + \subfloat[18 generation]{ + \includegraphics[width = 0.7\textwidth]{18.jpg}} \\ + \subfloat[20 generation]{ + \includegraphics[width = 0.7\textwidth]{20.jpg}} & + \subfloat[Summary]{ + \includegraphics[width = 0.7\textwidth]{summary.jpg}} \\ + \end{tabular} + \caption{Last 10 Generation plots and summary plot with parameters nop-250:sop-1000:ms-0.1:nog-20:min-max-(-5.12, 5.12):noo-10 } + \end{figure} + +As we can see with every generation the result comes closer and closer to the center of the plot (point (0, 0)) \\ At the begining (0 generation) we have random points with coordinates between -5.12 and 5.12 \\ Which later form groups of points with center group becoming bigger and bigger (generations between 2 and 12) \\ To finallly reach one big group centered around (0, 0) (generations between 14 and 20) \\ Summary plot clearly shows that the final groups (once that most red) are close to point (0, 0) \\ +Additonal info from execution of the program with those parameters: +\begin{itemize} + \item Best individual found: [-0.00512557 -0.00185114] + \item Best fitness found: 0.005891436754870583 + \item Total generation time: 0.0532705290006561 + \item Time per generation: 0.0026635264500328047 +\end{itemize} + +\subsection{Generation time} +We have also decided to change parameters of generations and see how they affect generation time \\ +First we ran program with default parameters and then changed each of it separately, results can be found in the table below \\ +\begin{figure}[H] + \caption{From left: Parameter changed, New value in place of old parameter value, Best individual found, Best fitness, Total generation time and Time Per Generation [TPG]} +\begin{tabular}{| c | c | c | c | c | c |} + \hline +Parameter & New Value & Individual (x, y) & Fitness & Total Time [ms] & TPG [ms] \\ +\hline +None & x & $\approx$ [-1.98e0, 1.03e0] & $\approx$ 5.32e0 & $\approx$ 7.123e-3 & $\approx$ 7.123e-05 \\ +\hline +Parents Number & 1000 & $\approx$ [-4.51e-4 -5.88e-3] & $\approx$ 6.91e-3 & $\approx$ 2.689e-1 & $\approx$ 2.689e-3 \\ +\hline +Population Size & 4000 & $\approx$ [7.16e-4, 2.77e-3] & $\approx$ 1.63e-3 & $\approx$ 1.0526e0 & $\approx$ 1.052e-2 \\ +\hline +Mutation Strength & 20 & $\approx$ [5.73e0, 5.76e0] & $\approx$ 8.58e1 & $\approx$ 6.890e-3 & $\approx$ 6.890e-5 \\ +\hline +MinMax value & [-1024, 1024] & $\approx$ [-2.84e2, 2.00e2] & $\approx$ 1.21e5 & $\approx$ 7.412e-3 & $\approx$ 7.412e-5 \\ +\hline +Generations Number & 20000 & $\approx$ [-1.01e0, 9.48e-1] & $\approx$ 2.46e0 & $\approx$ 1.409e0 & $\approx$ 7.048e-5 \\ +\hline + +\end{tabular} +\end{figure} +As we can see the most calculation intensive parameters are number of generations and population size, then parents number. \\ Changing Mutation Strength and MinMax value does not influence generation time much + +\end{document} diff --git a/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.xdv b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.xdv new file mode 100644 index 00000000..fe42f1fa Binary files /dev/null and b/Programming/EARIN/lab3/report/EARIN_LAB_3_RUDNICKI_KLISZKO.xdv differ diff --git a/Programming/EARIN/lab3/report/EARIN_Lab_3.pdf b/Programming/EARIN/lab3/report/EARIN_Lab_3.pdf new file mode 100644 index 00000000..8e5c98a2 Binary files /dev/null and b/Programming/EARIN/lab3/report/EARIN_Lab_3.pdf differ diff --git a/Programming/EARIN/lab3/report/example_halfway.jpg b/Programming/EARIN/lab3/report/example_halfway.jpg new file mode 100644 index 00000000..c11ab145 Binary files /dev/null and b/Programming/EARIN/lab3/report/example_halfway.jpg differ diff --git a/Programming/EARIN/lab3/report/example_summary.jpg b/Programming/EARIN/lab3/report/example_summary.jpg new file mode 100644 index 00000000..28c66ed8 Binary files /dev/null and b/Programming/EARIN/lab3/report/example_summary.jpg differ diff --git a/Programming/EARIN/lab3/report/summary.jpg b/Programming/EARIN/lab3/report/summary.jpg new file mode 100644 index 00000000..95ddf4e3 Binary files /dev/null and b/Programming/EARIN/lab3/report/summary.jpg differ diff --git a/Programming/EARIN/lab4/main.py b/Programming/EARIN/lab4/main.py new file mode 100644 index 00000000..5dd6ff14 --- /dev/null +++ b/Programming/EARIN/lab4/main.py @@ -0,0 +1,112 @@ +""" +Program that predicts wine quality based on variant2.csv data +""" +import pandas as pd +import seaborn as sns +import numpy as np +import matplotlib.pyplot as plt +from sklearn.preprocessing import StandardScaler +from sklearn.model_selection import train_test_split +from sklearn.metrics import mean_squared_error, accuracy_score, f1_score +from sklearn.linear_model import LogisticRegression + + +class LinearRegression: + """Implements Linear regression method""" + + def __init__(self): + self.theta = None + + def fit(self, x_values, y_values): + """ + Fit linear regression model to our training data + """ + # Add a column of ones to X for the intercept term + x_values = np.concatenate((np.ones((x_values.shape[0], 1)), y_values), axis=1) + + # Compute the least squares solution using the normal equation + self.theta = ( + np.linalg.inv(x_values.T.dot(x_values)).dot(x_values.T).dot(y_values) + ) + + def predict(self, x_values): + """ + Predict target values for our input data using the trained linear regression model. + """ + # Add a column of ones to X for the intercept term + x_values = np.concatenate((np.ones((x_values.shape[0], 1)), x_values), axis=1) + + # Make predictions using the learned weights + y_predicted = x_values.dot(self.theta) + + return y_predicted + + def score(self, x_values, y_values): + """ + Compute the R-squared score of the linear regression model on our test data. + """ + y_predicted = self.predict(x_values) + ss_res = np.sum((y_values - y_predicted) ** 2) + ss_tot = np.sum((y_values - np.mean(y_values)) ** 2) + r2_score = 1 - (ss_res / ss_tot) + + return r2_score + + +wine_df = pd.read_csv("variant2.csv") +wine_df.head() +wine_df.describe() +wine_df.info() + + +X = wine_df.iloc[:, :-1].values +y = wine_df.iloc[:, -1].values + +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + +scaler = StandardScaler() +X_train = scaler.fit_transform(X_train) +X_test = scaler.transform(X_test) +regressor = LinearRegression() +regressor.fit(X_train, y_train) + +y_pred = regressor.predict(X_test) + +mse = mean_squared_error(y_test, y_pred) +print("MSE:", mse) +classifier = LogisticRegression() +classifier.fit(X_train, y_train) + +y_pred = classifier.predict(X_test) + +accuracy = accuracy_score(y_test, y_pred) +print("Accuracy:", accuracy) +y_pred_train = regressor.predict(X_train) + +train_mse = mean_squared_error(y_train, y_pred_train) +print("Training MSE:", train_mse) + +train_r_squared = regressor.score(X_train, y_train) +print("Training R^2:", train_r_squared) + +test_r_squared = regressor.score(X_test, y_test) +print("Testing R^2:", test_r_squared) +y_pred_train = classifier.predict(X_train) + +train_accuracy = accuracy_score(y_train, y_pred_train) +print("Training Accuracy:", train_accuracy) + +train_f1_score = f1_score(y_train, y_pred_train, average="weighted") +print("Training F1 Score:", train_f1_score) + +test_f1_score = f1_score(y_test, y_pred, average="weighted") +print("Testing F1 Score:", test_f1_score) + +Data1 = sns.countplot(x="quality", data=wine_df) +plt.draw() +plt.waitforbuttonpress(0) +plt.close() +Data2 = sns.heatmap(wine_df.corr(), annot=True) +plt.draw() +plt.waitforbuttonpress(0) +plt.close() diff --git a/Programming/EARIN/lab4/report/EARIN_RUDNICKI_KLISZKO_LAB_4.pdf b/Programming/EARIN/lab4/report/EARIN_RUDNICKI_KLISZKO_LAB_4.pdf new file mode 100644 index 00000000..2da71187 Binary files /dev/null and b/Programming/EARIN/lab4/report/EARIN_RUDNICKI_KLISZKO_LAB_4.pdf differ diff --git a/Programming/EARIN/lab4/report/EARIN_RUDNICKI_KLISZKO_LAB_4.tex b/Programming/EARIN/lab4/report/EARIN_RUDNICKI_KLISZKO_LAB_4.tex new file mode 100644 index 00000000..2f7f1103 --- /dev/null +++ b/Programming/EARIN/lab4/report/EARIN_RUDNICKI_KLISZKO_LAB_4.tex @@ -0,0 +1,87 @@ +\documentclass{article}[12pt] +\usepackage{graphicx} % Required for inserting images +\usepackage{listings} +\usepackage{hyperref} +\usepackage{tabularx} +\usepackage{float} +\usepackage{subfig} +\usepackage[a4paper, total={6in, 8in}]{geometry} + +\title{EARIN Lab 3 Report} +\author{Krzysztof Rudnicki, 307585 \\ Jakub Kliszko, 303866 } +\date{\today} + +\begin{document} + +\maketitle +\section{Exercise Variant 2 - Predicting wine quality} +Our task was to write a program that predicts wine quality based on data containing: \\ +fixed acidity,volatile acidity,citric acid,residual sugar,chlorides,free sulfur dioxide,total sulfur dioxide,density,pH,sulphates,alcohol,quality + + +\section{Implementation} +Program can be ran by installing python, moving to project directory and issuing command: +\begin{lstlisting}[language=bash] +python main.py +\end{lstlisting} +We have decided on implementing Linear and Logistical regression methods as we found them the easiest to implement \\ +There will be 3 types of output \\ +\begin{enumerate} + \item Number of wines with given quality (Graphical) + \item How a given parameter impacts quality (Graphical) + \item How well did linear and logistical regression performed (Textual) +\end{enumerate} +Upon clicking any button the next plot will be shown +\section{Results} +We have successfully implemented program to predict wine quality \\ +\subsection{Data investigation} +There are 11 features in total and 1599 instances of those features \\ +It is clear that there is an inbalance in quality of wines with majority of wines being either '5' or '6': +\begin{figure}[H] + \caption{Plot showing inbalance in quality of wine} + \includegraphics[width=\textwidth]{inbalance.png} + \centering + \end{figure} +More importantly we checked correlation of parameters: +\begin{figure}[H] + \caption{Plot showing correlation between parameters, bright squares are positve correleation, dark squares are negative correleation} + \includegraphics[width=\textwidth]{corr.png} + \centering + \end{figure} +Bright squares mean that the parameters have positive correlation to each other \\ +Darker squares mean that the parameters have negative correlation to each other \\ +\newpage +We are most intrested in correleation of certain parameters to quality value \\ +Alcohol has by far the biggest positive impact on quality with coreleation value of 0.48 (where value of 1 means that those two parameters are equal to eachother), then we have sulphates and citric acid with roughly the same values (0.25 and 0.23 respectively) \\ +The worst impact on quality is done by volatile acidity (-0.39) +\subsection{Methods comparison} +For Linear regression we checked values of: +\begin{itemize} + \item Training Mean squared error - Difference between predicted and true values, the lower the better + \item Training $R^2$ - for given data, The higher the better + \item Testing $R^2$ - for new data, The higher the better +\end{itemize} + +For Logistic regression we checked values of: +\begin{itemize} + \item Training Accuracy - how many instances we correctly classified, the higher the better + \item Training F1 Score - for given data, The higher the better + \item Testing F1 Score - for new data, The higher the better +\end{itemize} + +For Linear regression we received values: +\begin{lstlisting}[language=bash] +Training MSE: 0.4258083784387745 +Training R^2: 0.3654519616206865 +Testing R^2: 0.32838876395802263 +\end{lstlisting} + +For Logistic regression we received values: +\begin{lstlisting}[language=bash] +Training Accuracy: 0.596559812353401 +Training F1 Score: 0.5806169210603433 +Testing F1 Score: 0.6166756344362352 +\end{lstlisting} +We can see that Logistic regression outperforms linear regression, its test scores which is supposed to be as high as possible are twice as good as ones in linear regression + +\end{document} \ No newline at end of file diff --git a/Programming/EARIN/lab4/report/corr.png b/Programming/EARIN/lab4/report/corr.png new file mode 100644 index 00000000..c4a688db Binary files /dev/null and b/Programming/EARIN/lab4/report/corr.png differ diff --git a/Programming/EARIN/lab4/report/inbalance.png b/Programming/EARIN/lab4/report/inbalance.png new file mode 100644 index 00000000..0bde090d Binary files /dev/null and b/Programming/EARIN/lab4/report/inbalance.png differ diff --git a/Programming/EARIN/lab4/teamsMaterials/Exercise04_02.pdf b/Programming/EARIN/lab4/teamsMaterials/Exercise04_02.pdf new file mode 100644 index 00000000..6c3f52e4 Binary files /dev/null and b/Programming/EARIN/lab4/teamsMaterials/Exercise04_02.pdf differ diff --git a/Programming/EARIN/lab4/variant2.csv b/Programming/EARIN/lab4/variant2.csv new file mode 100644 index 00000000..62e674cf --- /dev/null +++ b/Programming/EARIN/lab4/variant2.csv @@ -0,0 +1,1600 @@ +fixed acidity,volatile acidity,citric acid,residual sugar,chlorides,free sulfur dioxide,total sulfur dioxide,density,pH,sulphates,alcohol,quality +7.4,0.7,0.0,1.9,0.076,11.0,34.0,0.9978,3.51,0.56,9.4,5 +7.8,0.88,0.0,2.6,0.098,25.0,67.0,0.9968,3.2,0.68,9.8,5 +7.8,0.76,0.04,2.3,0.092,15.0,54.0,0.997,3.26,0.65,9.8,5 +11.2,0.28,0.56,1.9,0.075,17.0,60.0,0.998,3.16,0.58,9.8,6 +7.4,0.7,0.0,1.9,0.076,11.0,34.0,0.9978,3.51,0.56,9.4,5 +7.4,0.66,0.0,1.8,0.075,13.0,40.0,0.9978,3.51,0.56,9.4,5 +7.9,0.6,0.06,1.6,0.069,15.0,59.0,0.9964,3.3,0.46,9.4,5 +7.3,0.65,0.0,1.2,0.065,15.0,21.0,0.9946,3.39,0.47,10.0,7 +7.8,0.58,0.02,2.0,0.073,9.0,18.0,0.9968,3.36,0.57,9.5,7 +7.5,0.5,0.36,6.1,0.071,17.0,102.0,0.9978,3.35,0.8,10.5,5 +6.7,0.58,0.08,1.8,0.09699999999999999,15.0,65.0,0.9959,3.28,0.54,9.2,5 +7.5,0.5,0.36,6.1,0.071,17.0,102.0,0.9978,3.35,0.8,10.5,5 +5.6,0.615,0.0,1.6,0.08900000000000001,16.0,59.0,0.9943,3.58,0.52,9.9,5 +7.8,0.61,0.29,1.6,0.114,9.0,29.0,0.9974,3.26,1.56,9.1,5 +8.9,0.62,0.18,3.8,0.17600000000000002,52.0,145.0,0.9986,3.16,0.88,9.2,5 +8.9,0.62,0.19,3.9,0.17,51.0,148.0,0.9986,3.17,0.93,9.2,5 +8.5,0.28,0.56,1.8,0.092,35.0,103.0,0.9969,3.3,0.75,10.5,7 +8.1,0.56,0.28,1.7,0.368,16.0,56.0,0.9968,3.11,1.28,9.3,5 +7.4,0.59,0.08,4.4,0.086,6.0,29.0,0.9974,3.38,0.5,9.0,4 +7.9,0.32,0.51,1.8,0.341,17.0,56.0,0.9969,3.04,1.08,9.2,6 +8.9,0.22,0.48,1.8,0.077,29.0,60.0,0.9968,3.39,0.53,9.4,6 +7.6,0.39,0.31,2.3,0.08199999999999999,23.0,71.0,0.9982,3.52,0.65,9.7,5 +7.9,0.43,0.21,1.6,0.106,10.0,37.0,0.9966,3.17,0.91,9.5,5 +8.5,0.49,0.11,2.3,0.084,9.0,67.0,0.9968,3.17,0.53,9.4,5 +6.9,0.4,0.14,2.4,0.085,21.0,40.0,0.9968,3.43,0.63,9.7,6 +6.3,0.39,0.16,1.4,0.08,11.0,23.0,0.9955,3.34,0.56,9.3,5 +7.6,0.41,0.24,1.8,0.08,4.0,11.0,0.9962,3.28,0.59,9.5,5 +7.9,0.43,0.21,1.6,0.106,10.0,37.0,0.9966,3.17,0.91,9.5,5 +7.1,0.71,0.0,1.9,0.08,14.0,35.0,0.9972,3.47,0.55,9.4,5 +7.8,0.645,0.0,2.0,0.08199999999999999,8.0,16.0,0.9964,3.38,0.59,9.8,6 +6.7,0.675,0.07,2.4,0.08900000000000001,17.0,82.0,0.9958,3.35,0.54,10.1,5 +6.9,0.685,0.0,2.5,0.105,22.0,37.0,0.9966,3.46,0.57,10.6,6 +8.3,0.655,0.12,2.3,0.083,15.0,113.0,0.9966,3.17,0.66,9.8,5 +6.9,0.605,0.12,10.7,0.073,40.0,83.0,0.9993,3.45,0.52,9.4,6 +5.2,0.32,0.25,1.8,0.10300000000000001,13.0,50.0,0.9957,3.38,0.55,9.2,5 +7.8,0.645,0.0,5.5,0.086,5.0,18.0,0.9986,3.4,0.55,9.6,6 +7.8,0.6,0.14,2.4,0.086,3.0,15.0,0.9975,3.42,0.6,10.8,6 +8.1,0.38,0.28,2.1,0.066,13.0,30.0,0.9968,3.23,0.73,9.7,7 +5.7,1.13,0.09,1.5,0.172,7.0,19.0,0.9940000000000001,3.5,0.48,9.8,4 +7.3,0.45,0.36,5.9,0.07400000000000001,12.0,87.0,0.9978,3.33,0.83,10.5,5 +7.3,0.45,0.36,5.9,0.07400000000000001,12.0,87.0,0.9978,3.33,0.83,10.5,5 +8.8,0.61,0.3,2.8,0.08800000000000001,17.0,46.0,0.9976,3.26,0.51,9.3,4 +7.5,0.49,0.2,2.6,0.332,8.0,14.0,0.9968,3.21,0.9,10.5,6 +8.1,0.66,0.22,2.2,0.069,9.0,23.0,0.9968,3.3,1.2,10.3,5 +6.8,0.67,0.02,1.8,0.05,5.0,11.0,0.9962,3.48,0.52,9.5,5 +4.6,0.52,0.15,2.1,0.054000000000000006,8.0,65.0,0.9934,3.9,0.56,13.1,4 +7.7,0.935,0.43,2.2,0.114,22.0,114.0,0.997,3.25,0.73,9.2,5 +8.7,0.29,0.52,1.6,0.113,12.0,37.0,0.9969,3.25,0.58,9.5,5 +6.4,0.4,0.23,1.6,0.066,5.0,12.0,0.9958,3.34,0.56,9.2,5 +5.6,0.31,0.37,1.4,0.07400000000000001,12.0,96.0,0.9954,3.32,0.58,9.2,5 +8.8,0.66,0.26,1.7,0.07400000000000001,4.0,23.0,0.9971,3.15,0.74,9.2,5 +6.6,0.52,0.04,2.2,0.069,8.0,15.0,0.9956,3.4,0.63,9.4,6 +6.6,0.5,0.04,2.1,0.068,6.0,14.0,0.9955,3.39,0.64,9.4,6 +8.6,0.38,0.36,3.0,0.081,30.0,119.0,0.997,3.2,0.56,9.4,5 +7.6,0.51,0.15,2.8,0.11,33.0,73.0,0.9955,3.17,0.63,10.2,6 +7.7,0.62,0.04,3.8,0.084,25.0,45.0,0.9978,3.34,0.53,9.5,5 +10.2,0.42,0.57,3.4,0.07,4.0,10.0,0.9971,3.04,0.63,9.6,5 +7.5,0.63,0.12,5.1,0.111,50.0,110.0,0.9983,3.26,0.77,9.4,5 +7.8,0.59,0.18,2.3,0.076,17.0,54.0,0.9975,3.43,0.59,10.0,5 +7.3,0.39,0.31,2.4,0.07400000000000001,9.0,46.0,0.9962,3.41,0.54,9.4,6 +8.8,0.4,0.4,2.2,0.079,19.0,52.0,0.998,3.44,0.64,9.2,5 +7.7,0.69,0.49,1.8,0.115,20.0,112.0,0.9968,3.21,0.71,9.3,5 +7.5,0.52,0.16,1.9,0.085,12.0,35.0,0.9968,3.38,0.62,9.5,7 +7.0,0.735,0.05,2.0,0.081,13.0,54.0,0.9966,3.39,0.57,9.8,5 +7.2,0.725,0.05,4.65,0.086,4.0,11.0,0.9962,3.41,0.39,10.9,5 +7.2,0.725,0.05,4.65,0.086,4.0,11.0,0.9962,3.41,0.39,10.9,5 +7.5,0.52,0.11,1.5,0.079,11.0,39.0,0.9968,3.42,0.58,9.6,5 +6.6,0.705,0.07,1.6,0.076,6.0,15.0,0.9962,3.44,0.58,10.7,5 +9.3,0.32,0.57,2.0,0.07400000000000001,27.0,65.0,0.9969,3.28,0.79,10.7,5 +8.0,0.705,0.05,1.9,0.07400000000000001,8.0,19.0,0.9962,3.34,0.95,10.5,6 +7.7,0.63,0.08,1.9,0.076,15.0,27.0,0.9967,3.32,0.54,9.5,6 +7.7,0.67,0.23,2.1,0.08800000000000001,17.0,96.0,0.9962,3.32,0.48,9.5,5 +7.7,0.69,0.22,1.9,0.084,18.0,94.0,0.9961,3.31,0.48,9.5,5 +8.3,0.675,0.26,2.1,0.084,11.0,43.0,0.9976,3.31,0.53,9.2,4 +9.7,0.32,0.54,2.5,0.094,28.0,83.0,0.9984,3.28,0.82,9.6,5 +8.8,0.41,0.64,2.2,0.09300000000000001,9.0,42.0,0.9986,3.54,0.66,10.5,5 +8.8,0.41,0.64,2.2,0.09300000000000001,9.0,42.0,0.9986,3.54,0.66,10.5,5 +6.8,0.785,0.0,2.4,0.10400000000000001,14.0,30.0,0.9966,3.52,0.55,10.7,6 +6.7,0.75,0.12,2.0,0.086,12.0,80.0,0.9958,3.38,0.52,10.1,5 +8.3,0.625,0.2,1.5,0.08,27.0,119.0,0.9972,3.16,1.12,9.1,4 +6.2,0.45,0.2,1.6,0.069,3.0,15.0,0.9958,3.41,0.56,9.2,5 +7.8,0.43,0.7,1.9,0.46399999999999997,22.0,67.0,0.9974,3.13,1.28,9.4,5 +7.4,0.5,0.47,2.0,0.086,21.0,73.0,0.997,3.36,0.57,9.1,5 +7.3,0.67,0.26,1.8,0.401,16.0,51.0,0.9969,3.16,1.14,9.4,5 +6.3,0.3,0.48,1.8,0.069,18.0,61.0,0.9959,3.44,0.78,10.3,6 +6.9,0.55,0.15,2.2,0.076,19.0,40.0,0.9961,3.41,0.59,10.1,5 +8.6,0.49,0.28,1.9,0.11,20.0,136.0,0.9972,2.93,1.95,9.9,6 +7.7,0.49,0.26,1.9,0.062,9.0,31.0,0.9966,3.39,0.64,9.6,5 +9.3,0.39,0.44,2.1,0.107,34.0,125.0,0.9978,3.14,1.22,9.5,5 +7.0,0.62,0.08,1.8,0.076,8.0,24.0,0.9978,3.48,0.53,9.0,5 +7.9,0.52,0.26,1.9,0.079,42.0,140.0,0.9964,3.23,0.54,9.5,5 +8.6,0.49,0.28,1.9,0.11,20.0,136.0,0.9972,2.93,1.95,9.9,6 +8.6,0.49,0.29,2.0,0.11,19.0,133.0,0.9972,2.93,1.98,9.8,5 +7.7,0.49,0.26,1.9,0.062,9.0,31.0,0.9966,3.39,0.64,9.6,5 +5.0,1.02,0.04,1.4,0.045,41.0,85.0,0.9938,3.75,0.48,10.5,4 +4.7,0.6,0.17,2.3,0.057999999999999996,17.0,106.0,0.9932,3.85,0.6,12.9,6 +6.8,0.775,0.0,3.0,0.102,8.0,23.0,0.9965,3.45,0.56,10.7,5 +7.0,0.5,0.25,2.0,0.07,3.0,22.0,0.9963,3.25,0.63,9.2,5 +7.6,0.9,0.06,2.5,0.079,5.0,10.0,0.9967,3.39,0.56,9.8,5 +8.1,0.545,0.18,1.9,0.08,13.0,35.0,0.9972,3.3,0.59,9.0,6 +8.3,0.61,0.3,2.1,0.084,11.0,50.0,0.9972,3.4,0.61,10.2,6 +7.8,0.5,0.3,1.9,0.075,8.0,22.0,0.9959,3.31,0.56,10.4,6 +8.1,0.545,0.18,1.9,0.08,13.0,35.0,0.9972,3.3,0.59,9.0,6 +8.1,0.575,0.22,2.1,0.077,12.0,65.0,0.9967,3.29,0.51,9.2,5 +7.2,0.49,0.24,2.2,0.07,5.0,36.0,0.996,3.33,0.48,9.4,5 +8.1,0.575,0.22,2.1,0.077,12.0,65.0,0.9967,3.29,0.51,9.2,5 +7.8,0.41,0.68,1.7,0.467,18.0,69.0,0.9973,3.08,1.31,9.3,5 +6.2,0.63,0.31,1.7,0.08800000000000001,15.0,64.0,0.9969,3.46,0.79,9.3,5 +8.0,0.33,0.53,2.5,0.091,18.0,80.0,0.9976,3.37,0.8,9.6,6 +8.1,0.785,0.52,2.0,0.122,37.0,153.0,0.9969,3.21,0.69,9.3,5 +7.8,0.56,0.19,1.8,0.10400000000000001,12.0,47.0,0.9964,3.19,0.93,9.5,5 +8.4,0.62,0.09,2.2,0.084,11.0,108.0,0.9964,3.15,0.66,9.8,5 +8.4,0.6,0.1,2.2,0.085,14.0,111.0,0.9964,3.15,0.66,9.8,5 +10.1,0.31,0.44,2.3,0.08,22.0,46.0,0.9988,3.32,0.67,9.7,6 +7.8,0.56,0.19,1.8,0.10400000000000001,12.0,47.0,0.9964,3.19,0.93,9.5,5 +9.4,0.4,0.31,2.2,0.09,13.0,62.0,0.9966,3.07,0.63,10.5,6 +8.3,0.54,0.28,1.9,0.077,11.0,40.0,0.9978,3.39,0.61,10.0,6 +7.8,0.56,0.12,2.0,0.08199999999999999,7.0,28.0,0.997,3.37,0.5,9.4,6 +8.8,0.55,0.04,2.2,0.11900000000000001,14.0,56.0,0.9962,3.21,0.6,10.9,6 +7.0,0.69,0.08,1.8,0.09699999999999999,22.0,89.0,0.9959,3.34,0.54,9.2,6 +7.3,1.07,0.09,1.7,0.17800000000000002,10.0,89.0,0.9962,3.3,0.57,9.0,5 +8.8,0.55,0.04,2.2,0.11900000000000001,14.0,56.0,0.9962,3.21,0.6,10.9,6 +7.3,0.695,0.0,2.5,0.075,3.0,13.0,0.998,3.49,0.52,9.2,5 +8.0,0.71,0.0,2.6,0.08,11.0,34.0,0.9976,3.44,0.53,9.5,5 +7.8,0.5,0.17,1.6,0.08199999999999999,21.0,102.0,0.996,3.39,0.48,9.5,5 +9.0,0.62,0.04,1.9,0.146,27.0,90.0,0.9984,3.16,0.7,9.4,5 +8.2,1.33,0.0,1.7,0.081,3.0,12.0,0.9964,3.53,0.49,10.9,5 +8.1,1.33,0.0,1.8,0.08199999999999999,3.0,12.0,0.9964,3.54,0.48,10.9,5 +8.0,0.59,0.16,1.8,0.065,3.0,16.0,0.9962,3.42,0.92,10.5,7 +6.1,0.38,0.15,1.8,0.07200000000000001,6.0,19.0,0.9955,3.42,0.57,9.4,5 +8.0,0.745,0.56,2.0,0.11800000000000001,30.0,134.0,0.9968,3.24,0.66,9.4,5 +5.6,0.5,0.09,2.3,0.049,17.0,99.0,0.9937,3.63,0.63,13.0,5 +5.6,0.5,0.09,2.3,0.049,17.0,99.0,0.9937,3.63,0.63,13.0,5 +6.6,0.5,0.01,1.5,0.06,17.0,26.0,0.9952,3.4,0.58,9.8,6 +7.9,1.04,0.05,2.2,0.084,13.0,29.0,0.9959,3.22,0.55,9.9,6 +8.4,0.745,0.11,1.9,0.09,16.0,63.0,0.9965,3.19,0.82,9.6,5 +8.3,0.715,0.15,1.8,0.08900000000000001,10.0,52.0,0.9968,3.23,0.77,9.5,5 +7.2,0.415,0.36,2.0,0.081,13.0,45.0,0.9972,3.48,0.64,9.2,5 +7.8,0.56,0.19,2.1,0.081,15.0,105.0,0.9962,3.33,0.54,9.5,5 +7.8,0.56,0.19,2.0,0.081,17.0,108.0,0.9962,3.32,0.54,9.5,5 +8.4,0.745,0.11,1.9,0.09,16.0,63.0,0.9965,3.19,0.82,9.6,5 +8.3,0.715,0.15,1.8,0.08900000000000001,10.0,52.0,0.9968,3.23,0.77,9.5,5 +5.2,0.34,0.0,1.8,0.05,27.0,63.0,0.9916,3.68,0.79,14.0,6 +6.3,0.39,0.08,1.7,0.066,3.0,20.0,0.9954,3.34,0.58,9.4,5 +5.2,0.34,0.0,1.8,0.05,27.0,63.0,0.9916,3.68,0.79,14.0,6 +8.1,0.67,0.55,1.8,0.11699999999999999,32.0,141.0,0.9968,3.17,0.62,9.4,5 +5.8,0.68,0.02,1.8,0.087,21.0,94.0,0.9944,3.54,0.52,10.0,5 +7.6,0.49,0.26,1.6,0.23600000000000002,10.0,88.0,0.9968,3.11,0.8,9.3,5 +6.9,0.49,0.1,2.3,0.07400000000000001,12.0,30.0,0.9959,3.42,0.58,10.2,6 +8.2,0.4,0.44,2.8,0.08900000000000001,11.0,43.0,0.9975,3.53,0.61,10.5,6 +7.3,0.33,0.47,2.1,0.077,5.0,11.0,0.9958,3.33,0.53,10.3,6 +9.2,0.52,1.0,3.4,0.61,32.0,69.0,0.9996,2.74,2.0,9.4,4 +7.5,0.6,0.03,1.8,0.095,25.0,99.0,0.995,3.35,0.54,10.1,5 +7.5,0.6,0.03,1.8,0.095,25.0,99.0,0.995,3.35,0.54,10.1,5 +7.1,0.43,0.42,5.5,0.07,29.0,129.0,0.9973,3.42,0.72,10.5,5 +7.1,0.43,0.42,5.5,0.071,28.0,128.0,0.9973,3.42,0.71,10.5,5 +7.1,0.43,0.42,5.5,0.07,29.0,129.0,0.9973,3.42,0.72,10.5,5 +7.1,0.43,0.42,5.5,0.071,28.0,128.0,0.9973,3.42,0.71,10.5,5 +7.1,0.68,0.0,2.2,0.073,12.0,22.0,0.9969,3.48,0.5,9.3,5 +6.8,0.6,0.18,1.9,0.079,18.0,86.0,0.9968,3.59,0.57,9.3,6 +7.6,0.95,0.03,2.0,0.09,7.0,20.0,0.9959,3.2,0.56,9.6,5 +7.6,0.68,0.02,1.3,0.07200000000000001,9.0,20.0,0.9965,3.17,1.08,9.2,4 +7.8,0.53,0.04,1.7,0.076,17.0,31.0,0.9964,3.33,0.56,10.0,6 +7.4,0.6,0.26,7.3,0.07,36.0,121.0,0.9982,3.37,0.49,9.4,5 +7.3,0.59,0.26,7.2,0.07,35.0,121.0,0.9981,3.37,0.49,9.4,5 +7.8,0.63,0.48,1.7,0.1,14.0,96.0,0.9961,3.19,0.62,9.5,5 +6.8,0.64,0.1,2.1,0.085,18.0,101.0,0.9956,3.34,0.52,10.2,5 +7.3,0.55,0.03,1.6,0.07200000000000001,17.0,42.0,0.9956,3.37,0.48,9.0,4 +6.8,0.63,0.07,2.1,0.08900000000000001,11.0,44.0,0.9953,3.47,0.55,10.4,6 +7.5,0.705,0.24,1.8,0.36,15.0,63.0,0.9964,3.0,1.59,9.5,5 +7.9,0.885,0.03,1.8,0.057999999999999996,4.0,8.0,0.9972,3.36,0.33,9.1,4 +8.0,0.42,0.17,2.0,0.073,6.0,18.0,0.9972,3.29,0.61,9.2,6 +8.0,0.42,0.17,2.0,0.073,6.0,18.0,0.9972,3.29,0.61,9.2,6 +7.4,0.62,0.05,1.9,0.068,24.0,42.0,0.9961,3.42,0.57,11.5,6 +7.3,0.38,0.21,2.0,0.08,7.0,35.0,0.9961,3.33,0.47,9.5,5 +6.9,0.5,0.04,1.5,0.085,19.0,49.0,0.9958,3.35,0.78,9.5,5 +7.3,0.38,0.21,2.0,0.08,7.0,35.0,0.9961,3.33,0.47,9.5,5 +7.5,0.52,0.42,2.3,0.087,8.0,38.0,0.9972,3.58,0.61,10.5,6 +7.0,0.805,0.0,2.5,0.068,7.0,20.0,0.9969,3.48,0.56,9.6,5 +8.8,0.61,0.14,2.4,0.067,10.0,42.0,0.9969,3.19,0.59,9.5,5 +8.8,0.61,0.14,2.4,0.067,10.0,42.0,0.9969,3.19,0.59,9.5,5 +8.9,0.61,0.49,2.0,0.27,23.0,110.0,0.9972,3.12,1.02,9.3,5 +7.2,0.73,0.02,2.5,0.076,16.0,42.0,0.9972,3.44,0.52,9.3,5 +6.8,0.61,0.2,1.8,0.077,11.0,65.0,0.9971,3.54,0.58,9.3,5 +6.7,0.62,0.21,1.9,0.079,8.0,62.0,0.997,3.52,0.58,9.3,6 +8.9,0.31,0.57,2.0,0.111,26.0,85.0,0.9971,3.26,0.53,9.7,5 +7.4,0.39,0.48,2.0,0.08199999999999999,14.0,67.0,0.9972,3.34,0.55,9.2,5 +7.7,0.705,0.1,2.6,0.084,9.0,26.0,0.9976,3.39,0.49,9.7,5 +7.9,0.5,0.33,2.0,0.084,15.0,143.0,0.9968,3.2,0.55,9.5,5 +7.9,0.49,0.32,1.9,0.08199999999999999,17.0,144.0,0.9968,3.2,0.55,9.5,5 +8.2,0.5,0.35,2.9,0.077,21.0,127.0,0.9976,3.23,0.62,9.4,5 +6.4,0.37,0.25,1.9,0.07400000000000001,21.0,49.0,0.9974,3.57,0.62,9.8,6 +6.8,0.63,0.12,3.8,0.099,16.0,126.0,0.9969,3.28,0.61,9.5,5 +7.6,0.55,0.21,2.2,0.071,7.0,28.0,0.9964,3.28,0.55,9.7,5 +7.6,0.55,0.21,2.2,0.071,7.0,28.0,0.9964,3.28,0.55,9.7,5 +7.8,0.59,0.33,2.0,0.07400000000000001,24.0,120.0,0.9968,3.25,0.54,9.4,5 +7.3,0.58,0.3,2.4,0.07400000000000001,15.0,55.0,0.9968,3.46,0.59,10.2,5 +11.5,0.3,0.6,2.0,0.067,12.0,27.0,0.9981,3.11,0.97,10.1,6 +5.4,0.835,0.08,1.2,0.046,13.0,93.0,0.9924,3.57,0.85,13.0,7 +6.9,1.09,0.06,2.1,0.061,12.0,31.0,0.9948,3.51,0.43,11.4,4 +9.6,0.32,0.47,1.4,0.055999999999999994,9.0,24.0,0.99695,3.22,0.82,10.3,7 +8.8,0.37,0.48,2.1,0.09699999999999999,39.0,145.0,0.9975,3.04,1.03,9.3,5 +6.8,0.5,0.11,1.5,0.075,16.0,49.0,0.99545,3.36,0.79,9.5,5 +7.0,0.42,0.35,1.6,0.08800000000000001,16.0,39.0,0.9961,3.34,0.55,9.2,5 +7.0,0.43,0.36,1.6,0.08900000000000001,14.0,37.0,0.99615,3.34,0.56,9.2,6 +12.8,0.3,0.74,2.6,0.095,9.0,28.0,0.9994,3.2,0.77,10.8,7 +12.8,0.3,0.74,2.6,0.095,9.0,28.0,0.9994,3.2,0.77,10.8,7 +7.8,0.57,0.31,1.8,0.069,26.0,120.0,0.99625,3.29,0.53,9.3,5 +7.8,0.44,0.28,2.7,0.1,18.0,95.0,0.9966,3.22,0.67,9.4,5 +11.0,0.3,0.58,2.1,0.054000000000000006,7.0,19.0,0.998,3.31,0.88,10.5,7 +9.7,0.53,0.6,2.0,0.039,5.0,19.0,0.99585,3.3,0.86,12.4,6 +8.0,0.725,0.24,2.8,0.083,10.0,62.0,0.99685,3.35,0.56,10.0,6 +11.6,0.44,0.64,2.1,0.059000000000000004,5.0,15.0,0.998,3.21,0.67,10.2,6 +8.2,0.57,0.26,2.2,0.06,28.0,65.0,0.9959,3.3,0.43,10.1,5 +7.8,0.735,0.08,2.4,0.092,10.0,41.0,0.9974,3.24,0.71,9.8,6 +7.0,0.49,0.49,5.6,0.06,26.0,121.0,0.9974,3.34,0.76,10.5,5 +8.7,0.625,0.16,2.0,0.10099999999999999,13.0,49.0,0.9962,3.14,0.57,11.0,5 +8.1,0.725,0.22,2.2,0.07200000000000001,11.0,41.0,0.9967,3.36,0.55,9.1,5 +7.5,0.49,0.19,1.9,0.076,10.0,44.0,0.9957,3.39,0.54,9.7,5 +7.8,0.53,0.33,2.4,0.08,24.0,144.0,0.99655,3.3,0.6,9.5,5 +7.8,0.34,0.37,2.0,0.08199999999999999,24.0,58.0,0.9964,3.34,0.59,9.4,6 +7.4,0.53,0.26,2.0,0.10099999999999999,16.0,72.0,0.9957,3.15,0.57,9.4,5 +6.8,0.61,0.04,1.5,0.057,5.0,10.0,0.99525,3.42,0.6,9.5,5 +8.6,0.645,0.25,2.0,0.083,8.0,28.0,0.99815,3.28,0.6,10.0,6 +8.4,0.635,0.36,2.0,0.08900000000000001,15.0,55.0,0.99745,3.31,0.57,10.4,4 +7.7,0.43,0.25,2.6,0.073,29.0,63.0,0.99615,3.37,0.58,10.5,6 +8.9,0.59,0.5,2.0,0.337,27.0,81.0,0.9964,3.04,1.61,9.5,6 +9.0,0.82,0.14,2.6,0.08900000000000001,9.0,23.0,0.9984,3.39,0.63,9.8,5 +7.7,0.43,0.25,2.6,0.073,29.0,63.0,0.99615,3.37,0.58,10.5,6 +6.9,0.52,0.25,2.6,0.081,10.0,37.0,0.99685,3.46,0.5,11.0,5 +5.2,0.48,0.04,1.6,0.054000000000000006,19.0,106.0,0.9927,3.54,0.62,12.2,7 +8.0,0.38,0.06,1.8,0.078,12.0,49.0,0.99625,3.37,0.52,9.9,6 +8.5,0.37,0.2,2.8,0.09,18.0,58.0,0.998,3.34,0.7,9.6,6 +6.9,0.52,0.25,2.6,0.081,10.0,37.0,0.99685,3.46,0.5,11.0,5 +8.2,1.0,0.09,2.3,0.065,7.0,37.0,0.99685,3.32,0.55,9.0,6 +7.2,0.63,0.0,1.9,0.09699999999999999,14.0,38.0,0.99675,3.37,0.58,9.0,6 +7.2,0.63,0.0,1.9,0.09699999999999999,14.0,38.0,0.99675,3.37,0.58,9.0,6 +7.2,0.645,0.0,1.9,0.09699999999999999,15.0,39.0,0.99675,3.37,0.58,9.2,6 +7.2,0.63,0.0,1.9,0.09699999999999999,14.0,38.0,0.99675,3.37,0.58,9.0,6 +8.2,1.0,0.09,2.3,0.065,7.0,37.0,0.99685,3.32,0.55,9.0,6 +8.9,0.635,0.37,1.7,0.263,5.0,62.0,0.9971,3.0,1.09,9.3,5 +12.0,0.38,0.56,2.1,0.09300000000000001,6.0,24.0,0.99925,3.14,0.71,10.9,6 +7.7,0.58,0.1,1.8,0.102,28.0,109.0,0.99565,3.08,0.49,9.8,6 +15.0,0.21,0.44,2.2,0.075,10.0,24.0,1.00005,3.07,0.84,9.2,7 +15.0,0.21,0.44,2.2,0.075,10.0,24.0,1.00005,3.07,0.84,9.2,7 +7.3,0.66,0.0,2.0,0.084,6.0,23.0,0.9983,3.61,0.96,9.9,6 +7.1,0.68,0.07,1.9,0.075,16.0,51.0,0.99685,3.38,0.52,9.5,5 +8.2,0.6,0.17,2.3,0.07200000000000001,11.0,73.0,0.9963,3.2,0.45,9.3,5 +7.7,0.53,0.06,1.7,0.07400000000000001,9.0,39.0,0.99615,3.35,0.48,9.8,6 +7.3,0.66,0.0,2.0,0.084,6.0,23.0,0.9983,3.61,0.96,9.9,6 +10.8,0.32,0.44,1.6,0.063,16.0,37.0,0.9985,3.22,0.78,10.0,6 +7.1,0.6,0.0,1.8,0.07400000000000001,16.0,34.0,0.9972,3.47,0.7,9.9,6 +11.1,0.35,0.48,3.1,0.09,5.0,21.0,0.9986,3.17,0.53,10.5,5 +7.7,0.775,0.42,1.9,0.092,8.0,86.0,0.9959,3.23,0.59,9.5,5 +7.1,0.6,0.0,1.8,0.07400000000000001,16.0,34.0,0.9972,3.47,0.7,9.9,6 +8.0,0.57,0.23,3.2,0.073,17.0,119.0,0.99675,3.26,0.57,9.3,5 +9.4,0.34,0.37,2.2,0.075,5.0,13.0,0.998,3.22,0.62,9.2,5 +6.6,0.695,0.0,2.1,0.075,12.0,56.0,0.9968,3.49,0.67,9.2,5 +7.7,0.41,0.76,1.8,0.611,8.0,45.0,0.9968,3.06,1.26,9.4,5 +10.0,0.31,0.47,2.6,0.085,14.0,33.0,0.99965,3.36,0.8,10.5,7 +7.9,0.33,0.23,1.7,0.077,18.0,45.0,0.99625,3.29,0.65,9.3,5 +7.0,0.975,0.04,2.0,0.087,12.0,67.0,0.99565,3.35,0.6,9.4,4 +8.0,0.52,0.03,1.7,0.07,10.0,35.0,0.99575,3.34,0.57,10.0,5 +7.9,0.37,0.23,1.8,0.077,23.0,49.0,0.9963,3.28,0.67,9.3,5 +12.5,0.56,0.49,2.4,0.064,5.0,27.0,0.9999,3.08,0.87,10.9,5 +11.8,0.26,0.52,1.8,0.071,6.0,10.0,0.9968,3.2,0.72,10.2,7 +8.1,0.87,0.0,3.3,0.096,26.0,61.0,1.00025,3.6,0.72,9.8,4 +7.9,0.35,0.46,3.6,0.078,15.0,37.0,0.9973,3.35,0.86,12.8,8 +6.9,0.54,0.04,3.0,0.077,7.0,27.0,0.9987,3.69,0.91,9.4,6 +11.5,0.18,0.51,4.0,0.10400000000000001,4.0,23.0,0.9996,3.28,0.97,10.1,6 +7.9,0.545,0.06,4.0,0.087,27.0,61.0,0.9965,3.36,0.67,10.7,6 +11.5,0.18,0.51,4.0,0.10400000000000001,4.0,23.0,0.9996,3.28,0.97,10.1,6 +10.9,0.37,0.58,4.0,0.071,17.0,65.0,0.99935,3.22,0.78,10.1,5 +8.4,0.715,0.2,2.4,0.076,10.0,38.0,0.99735,3.31,0.64,9.4,5 +7.5,0.65,0.18,7.0,0.08800000000000001,27.0,94.0,0.99915,3.38,0.77,9.4,5 +7.9,0.545,0.06,4.0,0.087,27.0,61.0,0.9965,3.36,0.67,10.7,6 +6.9,0.54,0.04,3.0,0.077,7.0,27.0,0.9987,3.69,0.91,9.4,6 +11.5,0.18,0.51,4.0,0.10400000000000001,4.0,23.0,0.9996,3.28,0.97,10.1,6 +10.3,0.32,0.45,6.4,0.073,5.0,13.0,0.9976,3.23,0.82,12.6,8 +8.9,0.4,0.32,5.6,0.087,10.0,47.0,0.9991,3.38,0.77,10.5,7 +11.4,0.26,0.44,3.6,0.071,6.0,19.0,0.9986,3.12,0.82,9.3,6 +7.7,0.27,0.68,3.5,0.358,5.0,10.0,0.9972,3.25,1.08,9.9,7 +7.6,0.52,0.12,3.0,0.067,12.0,53.0,0.9971,3.36,0.57,9.1,5 +8.9,0.4,0.32,5.6,0.087,10.0,47.0,0.9991,3.38,0.77,10.5,7 +9.9,0.59,0.07,3.4,0.102,32.0,71.0,1.00015,3.31,0.71,9.8,5 +9.9,0.59,0.07,3.4,0.102,32.0,71.0,1.00015,3.31,0.71,9.8,5 +12.0,0.45,0.55,2.0,0.073,25.0,49.0,0.9997,3.1,0.76,10.3,6 +7.5,0.4,0.12,3.0,0.092,29.0,53.0,0.9967,3.37,0.7,10.3,6 +8.7,0.52,0.09,2.5,0.091,20.0,49.0,0.9976,3.34,0.86,10.6,7 +11.6,0.42,0.53,3.3,0.105,33.0,98.0,1.001,3.2,0.95,9.2,5 +8.7,0.52,0.09,2.5,0.091,20.0,49.0,0.9976,3.34,0.86,10.6,7 +11.0,0.2,0.48,2.0,0.34299999999999997,6.0,18.0,0.9979,3.3,0.71,10.5,5 +10.4,0.55,0.23,2.7,0.091,18.0,48.0,0.9994,3.22,0.64,10.3,6 +6.9,0.36,0.25,2.4,0.098,5.0,16.0,0.9964,3.41,0.6,10.1,6 +13.3,0.34,0.52,3.2,0.094,17.0,53.0,1.0014,3.05,0.81,9.5,6 +10.8,0.5,0.46,2.5,0.073,5.0,27.0,1.0001,3.05,0.64,9.5,5 +10.6,0.83,0.37,2.6,0.086,26.0,70.0,0.9981,3.16,0.52,9.9,5 +7.1,0.63,0.06,2.0,0.083,8.0,29.0,0.99855,3.67,0.73,9.6,5 +7.2,0.65,0.02,2.3,0.094,5.0,31.0,0.9993,3.67,0.8,9.7,5 +6.9,0.67,0.06,2.1,0.08,8.0,33.0,0.99845,3.68,0.71,9.6,5 +7.5,0.53,0.06,2.6,0.086,20.0,44.0,0.9965,3.38,0.59,10.7,6 +11.1,0.18,0.48,1.5,0.068,7.0,15.0,0.9973,3.22,0.64,10.1,6 +8.3,0.705,0.12,2.6,0.092,12.0,28.0,0.9994,3.51,0.72,10.0,5 +7.4,0.67,0.12,1.6,0.18600000000000003,5.0,21.0,0.996,3.39,0.54,9.5,5 +8.4,0.65,0.6,2.1,0.11199999999999999,12.0,90.0,0.9973,3.2,0.52,9.2,5 +10.3,0.53,0.48,2.5,0.063,6.0,25.0,0.9998,3.12,0.59,9.3,6 +7.6,0.62,0.32,2.2,0.08199999999999999,7.0,54.0,0.9966,3.36,0.52,9.4,5 +10.3,0.41,0.42,2.4,0.213,6.0,14.0,0.9994,3.19,0.62,9.5,6 +10.3,0.43,0.44,2.4,0.214,5.0,12.0,0.9994,3.19,0.63,9.5,6 +7.4,0.29,0.38,1.7,0.062,9.0,30.0,0.9968,3.41,0.53,9.5,6 +10.3,0.53,0.48,2.5,0.063,6.0,25.0,0.9998,3.12,0.59,9.3,6 +7.9,0.53,0.24,2.0,0.07200000000000001,15.0,105.0,0.996,3.27,0.54,9.4,6 +9.0,0.46,0.31,2.8,0.09300000000000001,19.0,98.0,0.99815,3.32,0.63,9.5,6 +8.6,0.47,0.3,3.0,0.076,30.0,135.0,0.9976,3.3,0.53,9.4,5 +7.4,0.36,0.29,2.6,0.087,26.0,72.0,0.99645,3.39,0.68,11.0,5 +7.1,0.35,0.29,2.5,0.096,20.0,53.0,0.9962,3.42,0.65,11.0,6 +9.6,0.56,0.23,3.4,0.102,37.0,92.0,0.9996,3.3,0.65,10.1,5 +9.6,0.77,0.12,2.9,0.08199999999999999,30.0,74.0,0.99865,3.3,0.64,10.4,6 +9.8,0.66,0.39,3.2,0.083,21.0,59.0,0.9989,3.37,0.71,11.5,7 +9.6,0.77,0.12,2.9,0.08199999999999999,30.0,74.0,0.99865,3.3,0.64,10.4,6 +9.8,0.66,0.39,3.2,0.083,21.0,59.0,0.9989,3.37,0.71,11.5,7 +9.3,0.61,0.26,3.4,0.09,25.0,87.0,0.99975,3.24,0.62,9.7,5 +7.8,0.62,0.05,2.3,0.079,6.0,18.0,0.99735,3.29,0.63,9.3,5 +10.3,0.59,0.42,2.8,0.09,35.0,73.0,0.9990000000000001,3.28,0.7,9.5,6 +10.0,0.49,0.2,11.0,0.071,13.0,50.0,1.0015,3.16,0.69,9.2,6 +10.0,0.49,0.2,11.0,0.071,13.0,50.0,1.0015,3.16,0.69,9.2,6 +11.6,0.53,0.66,3.65,0.121,6.0,14.0,0.9978,3.05,0.74,11.5,7 +10.3,0.44,0.5,4.5,0.107,5.0,13.0,0.998,3.28,0.83,11.5,5 +13.4,0.27,0.62,2.6,0.08199999999999999,6.0,21.0,1.0002,3.16,0.67,9.7,6 +10.7,0.46,0.39,2.0,0.061,7.0,15.0,0.9981,3.18,0.62,9.5,5 +10.2,0.36,0.64,2.9,0.122,10.0,41.0,0.998,3.23,0.66,12.5,6 +10.2,0.36,0.64,2.9,0.122,10.0,41.0,0.998,3.23,0.66,12.5,6 +8.0,0.58,0.28,3.2,0.066,21.0,114.0,0.9973,3.22,0.54,9.4,6 +8.4,0.56,0.08,2.1,0.105,16.0,44.0,0.9958,3.13,0.52,11.0,5 +7.9,0.65,0.01,2.5,0.078,17.0,38.0,0.9963,3.34,0.74,11.7,7 +11.9,0.695,0.53,3.4,0.128,7.0,21.0,0.9992,3.17,0.84,12.2,7 +8.9,0.43,0.45,1.9,0.052000000000000005,6.0,16.0,0.9948,3.35,0.7,12.5,6 +7.8,0.43,0.32,2.8,0.08,29.0,58.0,0.9974,3.31,0.64,10.3,5 +12.4,0.49,0.58,3.0,0.10300000000000001,28.0,99.0,1.0008,3.16,1.0,11.5,6 +12.5,0.28,0.54,2.3,0.08199999999999999,12.0,29.0,0.9997,3.11,1.36,9.8,7 +12.2,0.34,0.5,2.4,0.066,10.0,21.0,1.0,3.12,1.18,9.2,6 +10.6,0.42,0.48,2.7,0.065,5.0,18.0,0.9972,3.21,0.87,11.3,6 +10.9,0.39,0.47,1.8,0.11800000000000001,6.0,14.0,0.9982,3.3,0.75,9.8,6 +10.9,0.39,0.47,1.8,0.11800000000000001,6.0,14.0,0.9982,3.3,0.75,9.8,6 +11.9,0.57,0.5,2.6,0.08199999999999999,6.0,32.0,1.0006,3.12,0.78,10.7,6 +7.0,0.685,0.0,1.9,0.067,40.0,63.0,0.9979,3.6,0.81,9.9,5 +6.6,0.815,0.02,2.7,0.07200000000000001,17.0,34.0,0.9955,3.58,0.89,12.3,7 +13.8,0.49,0.67,3.0,0.09300000000000001,6.0,15.0,0.9986,3.02,0.93,12.0,6 +9.6,0.56,0.31,2.8,0.08900000000000001,15.0,46.0,0.9979,3.11,0.92,10.0,6 +9.1,0.785,0.0,2.6,0.09300000000000001,11.0,28.0,0.9994,3.36,0.86,9.4,6 +10.7,0.67,0.22,2.7,0.107,17.0,34.0,1.0004,3.28,0.98,9.9,6 +9.1,0.795,0.0,2.6,0.096,11.0,26.0,0.9994,3.35,0.83,9.4,6 +7.7,0.665,0.0,2.4,0.09,8.0,19.0,0.9974,3.27,0.73,9.3,5 +13.5,0.53,0.79,4.8,0.12,23.0,77.0,1.0018,3.18,0.77,13.0,5 +6.1,0.21,0.4,1.4,0.066,40.5,165.0,0.9912,3.25,0.59,11.9,6 +6.7,0.75,0.01,2.4,0.078,17.0,32.0,0.9955,3.55,0.61,12.8,6 +11.5,0.41,0.52,3.0,0.08,29.0,55.0,1.0001,3.26,0.88,11.0,5 +10.5,0.42,0.66,2.95,0.11599999999999999,12.0,29.0,0.997,3.24,0.75,11.7,7 +11.9,0.43,0.66,3.1,0.109,10.0,23.0,1.0,3.15,0.85,10.4,7 +12.6,0.38,0.66,2.6,0.08800000000000001,10.0,41.0,1.001,3.17,0.68,9.8,6 +8.2,0.7,0.23,2.0,0.099,14.0,81.0,0.9973,3.19,0.7,9.4,5 +8.6,0.45,0.31,2.6,0.086,21.0,50.0,0.9982,3.37,0.91,9.9,6 +11.9,0.58,0.66,2.5,0.07200000000000001,6.0,37.0,0.9992,3.05,0.56,10.0,5 +12.5,0.46,0.63,2.0,0.071,6.0,15.0,0.9988,2.99,0.87,10.2,5 +12.8,0.615,0.66,5.8,0.083,7.0,42.0,1.0022,3.07,0.73,10.0,7 +10.0,0.42,0.5,3.4,0.107,7.0,21.0,0.9979,3.26,0.93,11.8,6 +12.8,0.615,0.66,5.8,0.083,7.0,42.0,1.0022,3.07,0.73,10.0,7 +10.4,0.575,0.61,2.6,0.076,11.0,24.0,1.0,3.16,0.69,9.0,5 +10.3,0.34,0.52,2.8,0.159,15.0,75.0,0.9998,3.18,0.64,9.4,5 +9.4,0.27,0.53,2.4,0.07400000000000001,6.0,18.0,0.9962,3.2,1.13,12.0,7 +6.9,0.765,0.02,2.3,0.063,35.0,63.0,0.9975,3.57,0.78,9.9,5 +7.9,0.24,0.4,1.6,0.055999999999999994,11.0,25.0,0.9967,3.32,0.87,8.7,6 +9.1,0.28,0.48,1.8,0.067,26.0,46.0,0.9967,3.32,1.04,10.6,6 +7.4,0.55,0.22,2.2,0.106,12.0,72.0,0.9959,3.05,0.63,9.2,5 +14.0,0.41,0.63,3.8,0.08900000000000001,6.0,47.0,1.0014,3.01,0.81,10.8,6 +11.5,0.54,0.71,4.4,0.124,6.0,15.0,0.9984,3.01,0.83,11.8,7 +11.5,0.45,0.5,3.0,0.078,19.0,47.0,1.0003,3.26,1.11,11.0,6 +9.4,0.27,0.53,2.4,0.07400000000000001,6.0,18.0,0.9962,3.2,1.13,12.0,7 +11.4,0.625,0.66,6.2,0.08800000000000001,6.0,24.0,0.9988,3.11,0.99,13.3,6 +8.3,0.42,0.38,2.5,0.094,24.0,60.0,0.9979,3.31,0.7,10.8,6 +8.3,0.26,0.42,2.0,0.08,11.0,27.0,0.9974,3.21,0.8,9.4,6 +13.7,0.415,0.68,2.9,0.085,17.0,43.0,1.0014,3.06,0.8,10.0,6 +8.3,0.26,0.42,2.0,0.08,11.0,27.0,0.9974,3.21,0.8,9.4,6 +8.3,0.26,0.42,2.0,0.08,11.0,27.0,0.9974,3.21,0.8,9.4,6 +7.7,0.51,0.28,2.1,0.087,23.0,54.0,0.998,3.42,0.74,9.2,5 +7.4,0.63,0.07,2.4,0.09,11.0,37.0,0.9979,3.43,0.76,9.7,6 +7.8,0.54,0.26,2.0,0.08800000000000001,23.0,48.0,0.9981,3.41,0.74,9.2,6 +8.3,0.66,0.15,1.9,0.079,17.0,42.0,0.9972,3.31,0.54,9.6,6 +7.8,0.46,0.26,1.9,0.08800000000000001,23.0,53.0,0.9981,3.43,0.74,9.2,6 +9.6,0.38,0.31,2.5,0.096,16.0,49.0,0.9982,3.19,0.7,10.0,7 +5.6,0.85,0.05,1.4,0.045,12.0,88.0,0.9924,3.56,0.82,12.9,8 +13.7,0.415,0.68,2.9,0.085,17.0,43.0,1.0014,3.06,0.8,10.0,6 +9.5,0.37,0.52,2.0,0.08199999999999999,6.0,26.0,0.998,3.18,0.51,9.5,5 +8.4,0.665,0.61,2.0,0.11199999999999999,13.0,95.0,0.997,3.16,0.54,9.1,5 +12.7,0.6,0.65,2.3,0.063,6.0,25.0,0.9997,3.03,0.57,9.9,5 +12.0,0.37,0.76,4.2,0.066,7.0,38.0,1.0004,3.22,0.6,13.0,7 +6.6,0.735,0.02,7.9,0.122,68.0,124.0,0.9994,3.47,0.53,9.9,5 +11.5,0.59,0.59,2.6,0.087,13.0,49.0,0.9988,3.18,0.65,11.0,6 +11.5,0.59,0.59,2.6,0.087,13.0,49.0,0.9988,3.18,0.65,11.0,6 +8.7,0.765,0.22,2.3,0.064,9.0,42.0,0.9963,3.1,0.55,9.4,5 +6.6,0.735,0.02,7.9,0.122,68.0,124.0,0.9994,3.47,0.53,9.9,5 +7.7,0.26,0.3,1.7,0.059000000000000004,20.0,38.0,0.9949,3.29,0.47,10.8,6 +12.2,0.48,0.54,2.6,0.085,19.0,64.0,1.0,3.1,0.61,10.5,6 +11.4,0.6,0.49,2.7,0.085,10.0,41.0,0.9994,3.15,0.63,10.5,6 +7.7,0.69,0.05,2.7,0.075,15.0,27.0,0.9974,3.26,0.61,9.1,5 +8.7,0.31,0.46,1.4,0.059000000000000004,11.0,25.0,0.9966,3.36,0.76,10.1,6 +9.8,0.44,0.47,2.5,0.063,9.0,28.0,0.9981,3.24,0.65,10.8,6 +12.0,0.39,0.66,3.0,0.09300000000000001,12.0,30.0,0.9996,3.18,0.63,10.8,7 +10.4,0.34,0.58,3.7,0.174,6.0,16.0,0.997,3.19,0.7,11.3,6 +12.5,0.46,0.49,4.5,0.07,26.0,49.0,0.9981,3.05,0.57,9.6,4 +9.0,0.43,0.34,2.5,0.08,26.0,86.0,0.9987,3.38,0.62,9.5,6 +9.1,0.45,0.35,2.4,0.08,23.0,78.0,0.9987,3.38,0.62,9.5,5 +7.1,0.735,0.16,1.9,0.1,15.0,77.0,0.9966,3.27,0.64,9.3,5 +9.9,0.4,0.53,6.7,0.09699999999999999,6.0,19.0,0.9986,3.27,0.82,11.7,7 +8.8,0.52,0.34,2.7,0.087,24.0,122.0,0.9982,3.26,0.61,9.5,5 +8.6,0.725,0.24,6.6,0.11699999999999999,31.0,134.0,1.0014,3.32,1.07,9.3,5 +10.6,0.48,0.64,2.2,0.111,6.0,20.0,0.997,3.26,0.66,11.7,6 +7.0,0.58,0.12,1.9,0.091,34.0,124.0,0.9956,3.44,0.48,10.5,5 +11.9,0.38,0.51,2.0,0.121,7.0,20.0,0.9996,3.24,0.76,10.4,6 +6.8,0.77,0.0,1.8,0.066,34.0,52.0,0.9976,3.62,0.68,9.9,5 +9.5,0.56,0.33,2.4,0.08900000000000001,35.0,67.0,0.9972,3.28,0.73,11.8,7 +6.6,0.84,0.03,2.3,0.059000000000000004,32.0,48.0,0.9952,3.52,0.56,12.3,7 +7.7,0.96,0.2,2.0,0.047,15.0,60.0,0.9955,3.36,0.44,10.9,5 +10.5,0.24,0.47,2.1,0.066,6.0,24.0,0.9978,3.15,0.9,11.0,7 +7.7,0.96,0.2,2.0,0.047,15.0,60.0,0.9955,3.36,0.44,10.9,5 +6.6,0.84,0.03,2.3,0.059000000000000004,32.0,48.0,0.9952,3.52,0.56,12.3,7 +6.4,0.67,0.08,2.1,0.045,19.0,48.0,0.9949,3.49,0.49,11.4,6 +9.5,0.78,0.22,1.9,0.077,6.0,32.0,0.9988,3.26,0.56,10.6,6 +9.1,0.52,0.33,1.3,0.07,9.0,30.0,0.9978,3.24,0.6,9.3,5 +12.8,0.84,0.63,2.4,0.08800000000000001,13.0,35.0,0.9997,3.1,0.6,10.4,6 +10.5,0.24,0.47,2.1,0.066,6.0,24.0,0.9978,3.15,0.9,11.0,7 +7.8,0.55,0.35,2.2,0.07400000000000001,21.0,66.0,0.9974,3.25,0.56,9.2,5 +11.9,0.37,0.69,2.3,0.078,12.0,24.0,0.9958,3.0,0.65,12.8,6 +12.3,0.39,0.63,2.3,0.091,6.0,18.0,1.0004,3.16,0.49,9.5,5 +10.4,0.41,0.55,3.2,0.076,22.0,54.0,0.9996,3.15,0.89,9.9,6 +12.3,0.39,0.63,2.3,0.091,6.0,18.0,1.0004,3.16,0.49,9.5,5 +8.0,0.67,0.3,2.0,0.06,38.0,62.0,0.9958,3.26,0.56,10.2,6 +11.1,0.45,0.73,3.2,0.066,6.0,22.0,0.9986,3.17,0.66,11.2,6 +10.4,0.41,0.55,3.2,0.076,22.0,54.0,0.9996,3.15,0.89,9.9,6 +7.0,0.62,0.18,1.5,0.062,7.0,50.0,0.9951,3.08,0.6,9.3,5 +12.6,0.31,0.72,2.2,0.07200000000000001,6.0,29.0,0.9987,2.88,0.82,9.8,8 +11.9,0.4,0.65,2.15,0.068,7.0,27.0,0.9988,3.06,0.68,11.3,6 +15.6,0.685,0.76,3.7,0.1,6.0,43.0,1.0032,2.95,0.68,11.2,7 +10.0,0.44,0.49,2.7,0.077,11.0,19.0,0.9963,3.23,0.63,11.6,7 +5.3,0.57,0.01,1.7,0.054000000000000006,5.0,27.0,0.9934,3.57,0.84,12.5,7 +9.5,0.735,0.1,2.1,0.079,6.0,31.0,0.9986,3.23,0.56,10.1,6 +12.5,0.38,0.6,2.6,0.081,31.0,72.0,0.9996,3.1,0.73,10.5,5 +9.3,0.48,0.29,2.1,0.127,6.0,16.0,0.9968,3.22,0.72,11.2,5 +8.6,0.53,0.22,2.0,0.1,7.0,27.0,0.9967,3.2,0.56,10.2,6 +11.9,0.39,0.69,2.8,0.095,17.0,35.0,0.9994,3.1,0.61,10.8,6 +11.9,0.39,0.69,2.8,0.095,17.0,35.0,0.9994,3.1,0.61,10.8,6 +8.4,0.37,0.53,1.8,0.413,9.0,26.0,0.9979,3.06,1.06,9.1,6 +6.8,0.56,0.03,1.7,0.084,18.0,35.0,0.9968,3.44,0.63,10.0,6 +10.4,0.33,0.63,2.8,0.084,5.0,22.0,0.9998,3.26,0.74,11.2,7 +7.0,0.23,0.4,1.6,0.063,21.0,67.0,0.9952,3.5,0.63,11.1,5 +11.3,0.62,0.67,5.2,0.086,6.0,19.0,0.9988,3.22,0.69,13.4,8 +8.9,0.59,0.39,2.3,0.095,5.0,22.0,0.9986,3.37,0.58,10.3,5 +9.2,0.63,0.21,2.7,0.09699999999999999,29.0,65.0,0.9988,3.28,0.58,9.6,5 +10.4,0.33,0.63,2.8,0.084,5.0,22.0,0.9998,3.26,0.74,11.2,7 +11.6,0.58,0.66,2.2,0.07400000000000001,10.0,47.0,1.0008,3.25,0.57,9.0,3 +9.2,0.43,0.52,2.3,0.083,14.0,23.0,0.9976,3.35,0.61,11.3,6 +8.3,0.615,0.22,2.6,0.087,6.0,19.0,0.9982,3.26,0.61,9.3,5 +11.0,0.26,0.68,2.55,0.085,10.0,25.0,0.997,3.18,0.61,11.8,5 +8.1,0.66,0.7,2.2,0.098,25.0,129.0,0.9972,3.08,0.53,9.0,5 +11.5,0.315,0.54,2.1,0.084,5.0,15.0,0.9987,2.98,0.7,9.2,6 +10.0,0.29,0.4,2.9,0.098,10.0,26.0,1.0006,3.48,0.91,9.7,5 +10.3,0.5,0.42,2.0,0.069,21.0,51.0,0.9982,3.16,0.72,11.5,6 +8.8,0.46,0.45,2.6,0.065,7.0,18.0,0.9947,3.32,0.79,14.0,6 +11.4,0.36,0.69,2.1,0.09,6.0,21.0,1.0,3.17,0.62,9.2,6 +8.7,0.82,0.02,1.2,0.07,36.0,48.0,0.9952,3.2,0.58,9.8,5 +13.0,0.32,0.65,2.6,0.09300000000000001,15.0,47.0,0.9996,3.05,0.61,10.6,5 +9.6,0.54,0.42,2.4,0.081,25.0,52.0,0.997,3.2,0.71,11.4,6 +12.5,0.37,0.55,2.6,0.083,25.0,68.0,0.9995,3.15,0.82,10.4,6 +9.9,0.35,0.55,2.1,0.062,5.0,14.0,0.9971,3.26,0.79,10.6,5 +10.5,0.28,0.51,1.7,0.08,10.0,24.0,0.9982,3.2,0.89,9.4,6 +9.6,0.68,0.24,2.2,0.087,5.0,28.0,0.9988,3.14,0.6,10.2,5 +9.3,0.27,0.41,2.0,0.091,6.0,16.0,0.998,3.28,0.7,9.7,5 +10.4,0.24,0.49,1.8,0.075,6.0,20.0,0.9977,3.18,1.06,11.0,6 +9.6,0.68,0.24,2.2,0.087,5.0,28.0,0.9988,3.14,0.6,10.2,5 +9.4,0.685,0.11,2.7,0.077,6.0,31.0,0.9984,3.19,0.7,10.1,6 +10.6,0.28,0.39,15.5,0.069,6.0,23.0,1.0026,3.12,0.66,9.2,5 +9.4,0.3,0.56,2.8,0.08,6.0,17.0,0.9964,3.15,0.92,11.7,8 +10.6,0.36,0.59,2.2,0.152,6.0,18.0,0.9986,3.04,1.05,9.4,5 +10.6,0.36,0.6,2.2,0.152,7.0,18.0,0.9986,3.04,1.06,9.4,5 +10.6,0.44,0.68,4.1,0.114,6.0,24.0,0.997,3.06,0.66,13.4,6 +10.2,0.67,0.39,1.9,0.054000000000000006,6.0,17.0,0.9976,3.17,0.47,10.0,5 +10.2,0.67,0.39,1.9,0.054000000000000006,6.0,17.0,0.9976,3.17,0.47,10.0,5 +10.2,0.645,0.36,1.8,0.053,5.0,14.0,0.9982,3.17,0.42,10.0,6 +11.6,0.32,0.55,2.8,0.081,35.0,67.0,1.0002,3.32,0.92,10.8,7 +9.3,0.39,0.4,2.6,0.073,10.0,26.0,0.9984,3.34,0.75,10.2,6 +9.3,0.775,0.27,2.8,0.078,24.0,56.0,0.9984,3.31,0.67,10.6,6 +9.2,0.41,0.5,2.5,0.055,12.0,25.0,0.9952,3.34,0.79,13.3,7 +8.9,0.4,0.51,2.6,0.052000000000000005,13.0,27.0,0.995,3.32,0.9,13.4,7 +8.7,0.69,0.31,3.0,0.086,23.0,81.0,1.0002,3.48,0.74,11.6,6 +6.5,0.39,0.23,8.3,0.051,28.0,91.0,0.9952,3.44,0.55,12.1,6 +10.7,0.35,0.53,2.6,0.07,5.0,16.0,0.9972,3.15,0.65,11.0,8 +7.8,0.52,0.25,1.9,0.081,14.0,38.0,0.9984,3.43,0.65,9.0,6 +7.2,0.34,0.32,2.5,0.09,43.0,113.0,0.9966,3.32,0.79,11.1,5 +10.7,0.35,0.53,2.6,0.07,5.0,16.0,0.9972,3.15,0.65,11.0,8 +8.7,0.69,0.31,3.0,0.086,23.0,81.0,1.0002,3.48,0.74,11.6,6 +7.8,0.52,0.25,1.9,0.081,14.0,38.0,0.9984,3.43,0.65,9.0,6 +10.4,0.44,0.73,6.55,0.07400000000000001,38.0,76.0,0.9990000000000001,3.17,0.85,12.0,7 +10.4,0.44,0.73,6.55,0.07400000000000001,38.0,76.0,0.9990000000000001,3.17,0.85,12.0,7 +10.5,0.26,0.47,1.9,0.078,6.0,24.0,0.9976,3.18,1.04,10.9,7 +10.5,0.24,0.42,1.8,0.077,6.0,22.0,0.9976,3.21,1.05,10.8,7 +10.2,0.49,0.63,2.9,0.07200000000000001,10.0,26.0,0.9968,3.16,0.78,12.5,7 +10.4,0.24,0.46,1.8,0.075,6.0,21.0,0.9976,3.25,1.02,10.8,7 +11.2,0.67,0.55,2.3,0.084,6.0,13.0,1.0,3.17,0.71,9.5,6 +10.0,0.59,0.31,2.2,0.09,26.0,62.0,0.9994,3.18,0.63,10.2,6 +13.3,0.29,0.75,2.8,0.084,23.0,43.0,0.9986,3.04,0.68,11.4,7 +12.4,0.42,0.49,4.6,0.073,19.0,43.0,0.9978,3.02,0.61,9.5,5 +10.0,0.59,0.31,2.2,0.09,26.0,62.0,0.9994,3.18,0.63,10.2,6 +10.7,0.4,0.48,2.1,0.125,15.0,49.0,0.998,3.03,0.81,9.7,6 +10.5,0.51,0.64,2.4,0.107,6.0,15.0,0.9973,3.09,0.66,11.8,7 +10.5,0.51,0.64,2.4,0.107,6.0,15.0,0.9973,3.09,0.66,11.8,7 +8.5,0.655,0.49,6.1,0.122,34.0,151.0,1.001,3.31,1.14,9.3,5 +12.5,0.6,0.49,4.3,0.1,5.0,14.0,1.001,3.25,0.74,11.9,6 +10.4,0.61,0.49,2.1,0.2,5.0,16.0,0.9994,3.16,0.63,8.4,3 +10.9,0.21,0.49,2.8,0.08800000000000001,11.0,32.0,0.9972,3.22,0.68,11.7,6 +7.3,0.365,0.49,2.5,0.08800000000000001,39.0,106.0,0.9966,3.36,0.78,11.0,5 +9.8,0.25,0.49,2.7,0.08800000000000001,15.0,33.0,0.9982,3.42,0.9,10.0,6 +7.6,0.41,0.49,2.0,0.08800000000000001,16.0,43.0,0.998,3.48,0.64,9.1,5 +8.2,0.39,0.49,2.3,0.099,47.0,133.0,0.9979,3.38,0.99,9.8,5 +9.3,0.4,0.49,2.5,0.085,38.0,142.0,0.9978,3.22,0.55,9.4,5 +9.2,0.43,0.49,2.4,0.086,23.0,116.0,0.9976,3.23,0.64,9.5,5 +10.4,0.64,0.24,2.8,0.105,29.0,53.0,0.9998,3.24,0.67,9.9,5 +7.3,0.365,0.49,2.5,0.08800000000000001,39.0,106.0,0.9966,3.36,0.78,11.0,5 +7.0,0.38,0.49,2.5,0.09699999999999999,33.0,85.0,0.9962,3.39,0.77,11.4,6 +8.2,0.42,0.49,2.6,0.084,32.0,55.0,0.9988,3.34,0.75,8.7,6 +9.9,0.63,0.24,2.4,0.077,6.0,33.0,0.9974,3.09,0.57,9.4,5 +9.1,0.22,0.24,2.1,0.078,1.0,28.0,0.9990000000000001,3.41,0.87,10.3,6 +11.9,0.38,0.49,2.7,0.098,12.0,42.0,1.0004,3.16,0.61,10.3,5 +11.9,0.38,0.49,2.7,0.098,12.0,42.0,1.0004,3.16,0.61,10.3,5 +10.3,0.27,0.24,2.1,0.07200000000000001,15.0,33.0,0.9956,3.22,0.66,12.8,6 +10.0,0.48,0.24,2.7,0.102,13.0,32.0,1.0,3.28,0.56,10.0,6 +9.1,0.22,0.24,2.1,0.078,1.0,28.0,0.9990000000000001,3.41,0.87,10.3,6 +9.9,0.63,0.24,2.4,0.077,6.0,33.0,0.9974,3.09,0.57,9.4,5 +8.1,0.825,0.24,2.1,0.084,5.0,13.0,0.9972,3.37,0.77,10.7,6 +12.9,0.35,0.49,5.8,0.066,5.0,35.0,1.0014,3.2,0.66,12.0,7 +11.2,0.5,0.74,5.15,0.1,5.0,17.0,0.9996,3.22,0.62,11.2,5 +9.2,0.59,0.24,3.3,0.10099999999999999,20.0,47.0,0.9988,3.26,0.67,9.6,5 +9.5,0.46,0.49,6.3,0.064,5.0,17.0,0.9988,3.21,0.73,11.0,6 +9.3,0.715,0.24,2.1,0.07,5.0,20.0,0.9966,3.12,0.59,9.9,5 +11.2,0.66,0.24,2.5,0.085,16.0,53.0,0.9993,3.06,0.72,11.0,6 +14.3,0.31,0.74,1.8,0.075,6.0,15.0,1.0008,2.86,0.79,8.4,6 +9.1,0.47,0.49,2.6,0.094,38.0,106.0,0.9982,3.08,0.59,9.1,5 +7.5,0.55,0.24,2.0,0.078,10.0,28.0,0.9983,3.45,0.78,9.5,6 +10.6,0.31,0.49,2.5,0.067,6.0,21.0,0.9987,3.26,0.86,10.7,6 +12.4,0.35,0.49,2.6,0.079,27.0,69.0,0.9994,3.12,0.75,10.4,6 +9.0,0.53,0.49,1.9,0.171,6.0,25.0,0.9975,3.27,0.61,9.4,6 +6.8,0.51,0.01,2.1,0.07400000000000001,9.0,25.0,0.9958,3.33,0.56,9.5,6 +9.4,0.43,0.24,2.8,0.092,14.0,45.0,0.998,3.19,0.73,10.0,6 +9.5,0.46,0.24,2.7,0.092,14.0,44.0,0.998,3.12,0.74,10.0,6 +5.0,1.04,0.24,1.6,0.05,32.0,96.0,0.9934,3.74,0.62,11.5,5 +15.5,0.645,0.49,4.2,0.095,10.0,23.0,1.00315,2.92,0.74,11.1,5 +15.5,0.645,0.49,4.2,0.095,10.0,23.0,1.00315,2.92,0.74,11.1,5 +10.9,0.53,0.49,4.6,0.11800000000000001,10.0,17.0,1.0002,3.07,0.56,11.7,6 +15.6,0.645,0.49,4.2,0.095,10.0,23.0,1.00315,2.92,0.74,11.1,5 +10.9,0.53,0.49,4.6,0.11800000000000001,10.0,17.0,1.0002,3.07,0.56,11.7,6 +13.0,0.47,0.49,4.3,0.085,6.0,47.0,1.0021,3.3,0.68,12.7,6 +12.7,0.6,0.49,2.8,0.075,5.0,19.0,0.9994,3.14,0.57,11.4,5 +9.0,0.44,0.49,2.4,0.078,26.0,121.0,0.9978,3.23,0.58,9.2,5 +9.0,0.54,0.49,2.9,0.094,41.0,110.0,0.9982,3.08,0.61,9.2,5 +7.6,0.29,0.49,2.7,0.092,25.0,60.0,0.9971,3.31,0.61,10.1,6 +13.0,0.47,0.49,4.3,0.085,6.0,47.0,1.0021,3.3,0.68,12.7,6 +12.7,0.6,0.49,2.8,0.075,5.0,19.0,0.9994,3.14,0.57,11.4,5 +8.7,0.7,0.24,2.5,0.226,5.0,15.0,0.9991,3.32,0.6,9.0,6 +8.7,0.7,0.24,2.5,0.226,5.0,15.0,0.9991,3.32,0.6,9.0,6 +9.8,0.5,0.49,2.6,0.25,5.0,20.0,0.9990000000000001,3.31,0.79,10.7,6 +6.2,0.36,0.24,2.2,0.095,19.0,42.0,0.9946,3.57,0.57,11.7,6 +11.5,0.35,0.49,3.3,0.07,10.0,37.0,1.0003,3.32,0.91,11.0,6 +6.2,0.36,0.24,2.2,0.095,19.0,42.0,0.9946,3.57,0.57,11.7,6 +10.2,0.24,0.49,2.4,0.075,10.0,28.0,0.9978,3.14,0.61,10.4,5 +10.5,0.59,0.49,2.1,0.07,14.0,47.0,0.9991,3.3,0.56,9.6,4 +10.6,0.34,0.49,3.2,0.078,20.0,78.0,0.9992,3.19,0.7,10.0,6 +12.3,0.27,0.49,3.1,0.079,28.0,46.0,0.9993,3.2,0.8,10.2,6 +9.9,0.5,0.24,2.3,0.10300000000000001,6.0,14.0,0.9978,3.34,0.52,10.0,4 +8.8,0.44,0.49,2.8,0.083,18.0,111.0,0.9982,3.3,0.6,9.5,5 +8.8,0.47,0.49,2.9,0.085,17.0,110.0,0.9982,3.29,0.6,9.8,5 +10.6,0.31,0.49,2.2,0.063,18.0,40.0,0.9976,3.14,0.51,9.8,6 +12.3,0.5,0.49,2.2,0.08900000000000001,5.0,14.0,1.0002,3.19,0.44,9.6,5 +12.3,0.5,0.49,2.2,0.08900000000000001,5.0,14.0,1.0002,3.19,0.44,9.6,5 +11.7,0.49,0.49,2.2,0.083,5.0,15.0,1.0,3.19,0.43,9.2,5 +12.0,0.28,0.49,1.9,0.07400000000000001,10.0,21.0,0.9976,2.98,0.66,9.9,7 +11.8,0.33,0.49,3.4,0.09300000000000001,54.0,80.0,1.0002,3.3,0.76,10.7,7 +7.6,0.51,0.24,2.4,0.091,8.0,38.0,0.998,3.47,0.66,9.6,6 +11.1,0.31,0.49,2.7,0.094,16.0,47.0,0.9986,3.12,1.02,10.6,7 +7.3,0.73,0.24,1.9,0.10800000000000001,18.0,102.0,0.9967,3.26,0.59,9.3,5 +5.0,0.42,0.24,2.0,0.06,19.0,50.0,0.9917,3.72,0.74,14.0,8 +10.2,0.29,0.49,2.6,0.059000000000000004,5.0,13.0,0.9976,3.05,0.74,10.5,7 +9.0,0.45,0.49,2.6,0.084,21.0,75.0,0.9987,3.35,0.57,9.7,5 +6.6,0.39,0.49,1.7,0.07,23.0,149.0,0.9922,3.12,0.5,11.5,6 +9.0,0.45,0.49,2.6,0.084,21.0,75.0,0.9987,3.35,0.57,9.7,5 +9.9,0.49,0.58,3.5,0.094,9.0,43.0,1.0004,3.29,0.58,9.0,5 +7.9,0.72,0.17,2.6,0.096,20.0,38.0,0.9978,3.4,0.53,9.5,5 +8.9,0.595,0.41,7.9,0.086,30.0,109.0,0.9998,3.27,0.57,9.3,5 +12.4,0.4,0.51,2.0,0.059000000000000004,6.0,24.0,0.9994,3.04,0.6,9.3,6 +11.9,0.58,0.58,1.9,0.071,5.0,18.0,0.998,3.09,0.63,10.0,6 +8.5,0.585,0.18,2.1,0.078,5.0,30.0,0.9967,3.2,0.48,9.8,6 +12.7,0.59,0.45,2.3,0.08199999999999999,11.0,22.0,1.0,3.0,0.7,9.3,6 +8.2,0.915,0.27,2.1,0.08800000000000001,7.0,23.0,0.9962,3.26,0.47,10.0,4 +13.2,0.46,0.52,2.2,0.071,12.0,35.0,1.0006,3.1,0.56,9.0,6 +7.7,0.835,0.0,2.6,0.081,6.0,14.0,0.9975,3.3,0.52,9.3,5 +13.2,0.46,0.52,2.2,0.071,12.0,35.0,1.0006,3.1,0.56,9.0,6 +8.3,0.58,0.13,2.9,0.096,14.0,63.0,0.9984,3.17,0.62,9.1,6 +8.3,0.6,0.13,2.6,0.085,6.0,24.0,0.9984,3.31,0.59,9.2,6 +9.4,0.41,0.48,4.6,0.07200000000000001,10.0,20.0,0.9973,3.34,0.79,12.2,7 +8.8,0.48,0.41,3.3,0.092,26.0,52.0,0.9982,3.31,0.53,10.5,6 +10.1,0.65,0.37,5.1,0.11,11.0,65.0,1.0026,3.32,0.64,10.4,6 +6.3,0.36,0.19,3.2,0.075,15.0,39.0,0.9956,3.56,0.52,12.7,6 +8.8,0.24,0.54,2.5,0.083,25.0,57.0,0.9983,3.39,0.54,9.2,5 +13.2,0.38,0.55,2.7,0.081,5.0,16.0,1.0006,2.98,0.54,9.4,5 +7.5,0.64,0.0,2.4,0.077,18.0,29.0,0.9965,3.32,0.6,10.0,6 +8.2,0.39,0.38,1.5,0.057999999999999996,10.0,29.0,0.9962,3.26,0.74,9.8,5 +9.2,0.755,0.18,2.2,0.14800000000000002,10.0,103.0,0.9969,2.87,1.36,10.2,6 +9.6,0.6,0.5,2.3,0.079,28.0,71.0,0.9997,3.5,0.57,9.7,5 +9.6,0.6,0.5,2.3,0.079,28.0,71.0,0.9997,3.5,0.57,9.7,5 +11.5,0.31,0.51,2.2,0.079,14.0,28.0,0.9982,3.03,0.93,9.8,6 +11.4,0.46,0.5,2.7,0.122,4.0,17.0,1.0006,3.13,0.7,10.2,5 +11.3,0.37,0.41,2.3,0.08800000000000001,6.0,16.0,0.9988,3.09,0.8,9.3,5 +8.3,0.54,0.24,3.4,0.076,16.0,112.0,0.9976,3.27,0.61,9.4,5 +8.2,0.56,0.23,3.4,0.078,14.0,104.0,0.9976,3.28,0.62,9.4,5 +10.0,0.58,0.22,1.9,0.08,9.0,32.0,0.9974,3.13,0.55,9.5,5 +7.9,0.51,0.25,2.9,0.077,21.0,45.0,0.9974,3.49,0.96,12.1,6 +6.8,0.69,0.0,5.6,0.124,21.0,58.0,0.9997,3.46,0.72,10.2,5 +6.8,0.69,0.0,5.6,0.124,21.0,58.0,0.9997,3.46,0.72,10.2,5 +8.8,0.6,0.29,2.2,0.098,5.0,15.0,0.9988,3.36,0.49,9.1,5 +8.8,0.6,0.29,2.2,0.098,5.0,15.0,0.9988,3.36,0.49,9.1,5 +8.7,0.54,0.26,2.5,0.09699999999999999,7.0,31.0,0.9976,3.27,0.6,9.3,6 +7.6,0.685,0.23,2.3,0.111,20.0,84.0,0.9964,3.21,0.61,9.3,5 +8.7,0.54,0.26,2.5,0.09699999999999999,7.0,31.0,0.9976,3.27,0.6,9.3,6 +10.4,0.28,0.54,2.7,0.105,5.0,19.0,0.9988,3.25,0.63,9.5,5 +7.6,0.41,0.14,3.0,0.087,21.0,43.0,0.9964,3.32,0.57,10.5,6 +10.1,0.935,0.22,3.4,0.105,11.0,86.0,1.001,3.43,0.64,11.3,4 +7.9,0.35,0.21,1.9,0.073,46.0,102.0,0.9964,3.27,0.58,9.5,5 +8.7,0.84,0.0,1.4,0.065,24.0,33.0,0.9954,3.27,0.55,9.7,5 +9.6,0.88,0.28,2.4,0.086,30.0,147.0,0.9979,3.24,0.53,9.4,5 +9.5,0.885,0.27,2.3,0.084,31.0,145.0,0.9978,3.24,0.53,9.4,5 +7.7,0.915,0.12,2.2,0.14300000000000002,7.0,23.0,0.9964,3.35,0.65,10.2,7 +8.9,0.29,0.35,1.9,0.067,25.0,57.0,0.997,3.18,1.36,10.3,6 +9.9,0.54,0.45,2.3,0.071,16.0,40.0,0.9991,3.39,0.62,9.4,5 +9.5,0.59,0.44,2.3,0.071,21.0,68.0,0.9992,3.46,0.63,9.5,5 +9.9,0.54,0.45,2.3,0.071,16.0,40.0,0.9991,3.39,0.62,9.4,5 +9.5,0.59,0.44,2.3,0.071,21.0,68.0,0.9992,3.46,0.63,9.5,5 +9.9,0.54,0.45,2.3,0.071,16.0,40.0,0.9991,3.39,0.62,9.4,5 +7.8,0.64,0.1,6.0,0.115,5.0,11.0,0.9984,3.37,0.69,10.1,7 +7.3,0.67,0.05,3.6,0.107,6.0,20.0,0.9972,3.4,0.63,10.1,5 +8.3,0.845,0.01,2.2,0.07,5.0,14.0,0.9967,3.32,0.58,11.0,4 +8.7,0.48,0.3,2.8,0.066,10.0,28.0,0.9964,3.33,0.67,11.2,7 +6.7,0.42,0.27,8.6,0.068,24.0,148.0,0.9948,3.16,0.57,11.3,6 +10.7,0.43,0.39,2.2,0.106,8.0,32.0,0.9986,2.89,0.5,9.6,5 +9.8,0.88,0.25,2.5,0.10400000000000001,35.0,155.0,1.001,3.41,0.67,11.2,5 +15.9,0.36,0.65,7.5,0.096,22.0,71.0,0.9976,2.98,0.84,14.9,5 +9.4,0.33,0.59,2.8,0.079,9.0,30.0,0.9976,3.12,0.54,12.0,6 +8.6,0.47,0.47,2.4,0.07400000000000001,7.0,29.0,0.9979,3.08,0.46,9.5,5 +9.7,0.55,0.17,2.9,0.087,20.0,53.0,1.0004,3.14,0.61,9.4,5 +10.7,0.43,0.39,2.2,0.106,8.0,32.0,0.9986,2.89,0.5,9.6,5 +12.0,0.5,0.59,1.4,0.073,23.0,42.0,0.998,2.92,0.68,10.5,7 +7.2,0.52,0.07,1.4,0.07400000000000001,5.0,20.0,0.9973,3.32,0.81,9.6,6 +7.1,0.84,0.02,4.4,0.096,5.0,13.0,0.997,3.41,0.57,11.0,4 +7.2,0.52,0.07,1.4,0.07400000000000001,5.0,20.0,0.9973,3.32,0.81,9.6,6 +7.5,0.42,0.31,1.6,0.08,15.0,42.0,0.9978,3.31,0.64,9.0,5 +7.2,0.57,0.06,1.6,0.076,9.0,27.0,0.9972,3.36,0.7,9.6,6 +10.1,0.28,0.46,1.8,0.05,5.0,13.0,0.9974,3.04,0.79,10.2,6 +12.1,0.4,0.52,2.0,0.092,15.0,54.0,1.0,3.03,0.66,10.2,5 +9.4,0.59,0.14,2.0,0.084,25.0,48.0,0.9981,3.14,0.56,9.7,5 +8.3,0.49,0.36,1.8,0.222,6.0,16.0,0.998,3.18,0.6,9.5,6 +11.3,0.34,0.45,2.0,0.08199999999999999,6.0,15.0,0.9988,2.94,0.66,9.2,6 +10.0,0.73,0.43,2.3,0.059000000000000004,15.0,31.0,0.9966,3.15,0.57,11.0,5 +11.3,0.34,0.45,2.0,0.08199999999999999,6.0,15.0,0.9988,2.94,0.66,9.2,6 +6.9,0.4,0.24,2.5,0.083,30.0,45.0,0.9959,3.26,0.58,10.0,5 +8.2,0.73,0.21,1.7,0.07400000000000001,5.0,13.0,0.9968,3.2,0.52,9.5,5 +9.8,1.24,0.34,2.0,0.079,32.0,151.0,0.998,3.15,0.53,9.5,5 +8.2,0.73,0.21,1.7,0.07400000000000001,5.0,13.0,0.9968,3.2,0.52,9.5,5 +10.8,0.4,0.41,2.2,0.084,7.0,17.0,0.9984,3.08,0.67,9.3,6 +9.3,0.41,0.39,2.2,0.064,12.0,31.0,0.9984,3.26,0.65,10.2,5 +10.8,0.4,0.41,2.2,0.084,7.0,17.0,0.9984,3.08,0.67,9.3,6 +8.6,0.8,0.11,2.3,0.084,12.0,31.0,0.9979,3.4,0.48,9.9,5 +8.3,0.78,0.1,2.6,0.081,45.0,87.0,0.9983,3.48,0.53,10.0,5 +10.8,0.26,0.45,3.3,0.06,20.0,49.0,0.9972,3.13,0.54,9.6,5 +13.3,0.43,0.58,1.9,0.07,15.0,40.0,1.0004,3.06,0.49,9.0,5 +8.0,0.45,0.23,2.2,0.094,16.0,29.0,0.9962,3.21,0.49,10.2,6 +8.5,0.46,0.31,2.25,0.078,32.0,58.0,0.998,3.33,0.54,9.8,5 +8.1,0.78,0.23,2.6,0.059000000000000004,5.0,15.0,0.997,3.37,0.56,11.3,5 +9.8,0.98,0.32,2.3,0.078,35.0,152.0,0.998,3.25,0.48,9.4,5 +8.1,0.78,0.23,2.6,0.059000000000000004,5.0,15.0,0.997,3.37,0.56,11.3,5 +7.1,0.65,0.18,1.8,0.07,13.0,40.0,0.997,3.44,0.6,9.1,5 +9.1,0.64,0.23,3.1,0.095,13.0,38.0,0.9998,3.28,0.59,9.7,5 +7.7,0.66,0.04,1.6,0.039,4.0,9.0,0.9962,3.4,0.47,9.4,5 +8.1,0.38,0.48,1.8,0.157,5.0,17.0,0.9976,3.3,1.05,9.4,5 +7.4,1.185,0.0,4.25,0.09699999999999999,5.0,14.0,0.9966,3.63,0.54,10.7,3 +9.2,0.92,0.24,2.6,0.087,12.0,93.0,0.9998,3.48,0.54,9.8,5 +8.6,0.49,0.51,2.0,0.42200000000000004,16.0,62.0,0.9979,3.03,1.17,9.0,5 +9.0,0.48,0.32,2.8,0.084,21.0,122.0,0.9984,3.32,0.62,9.4,5 +9.0,0.47,0.31,2.7,0.084,24.0,125.0,0.9984,3.31,0.61,9.4,5 +5.1,0.47,0.02,1.3,0.034,18.0,44.0,0.9921,3.9,0.62,12.8,6 +7.0,0.65,0.02,2.1,0.066,8.0,25.0,0.9972,3.47,0.67,9.5,6 +7.0,0.65,0.02,2.1,0.066,8.0,25.0,0.9972,3.47,0.67,9.5,6 +9.4,0.615,0.28,3.2,0.087,18.0,72.0,1.0001,3.31,0.53,9.7,5 +11.8,0.38,0.55,2.1,0.071,5.0,19.0,0.9986,3.11,0.62,10.8,6 +10.6,1.02,0.43,2.9,0.076,26.0,88.0,0.9984,3.08,0.57,10.1,6 +7.0,0.65,0.02,2.1,0.066,8.0,25.0,0.9972,3.47,0.67,9.5,6 +7.0,0.64,0.02,2.1,0.067,9.0,23.0,0.997,3.47,0.67,9.4,6 +7.5,0.38,0.48,2.6,0.073,22.0,84.0,0.9972,3.32,0.7,9.6,4 +9.1,0.765,0.04,1.6,0.078,4.0,14.0,0.998,3.29,0.54,9.7,4 +8.4,1.035,0.15,6.0,0.073,11.0,54.0,0.9990000000000001,3.37,0.49,9.9,5 +7.0,0.78,0.08,2.0,0.09300000000000001,10.0,19.0,0.9956,3.4,0.47,10.0,5 +7.4,0.49,0.19,3.0,0.077,16.0,37.0,0.9966,3.37,0.51,10.5,5 +7.8,0.545,0.12,2.5,0.068,11.0,35.0,0.996,3.34,0.61,11.6,6 +9.7,0.31,0.47,1.6,0.062,13.0,33.0,0.9983,3.27,0.66,10.0,6 +10.6,1.025,0.43,2.8,0.08,21.0,84.0,0.9985,3.06,0.57,10.1,5 +8.9,0.565,0.34,3.0,0.09300000000000001,16.0,112.0,0.9998,3.38,0.61,9.5,5 +8.7,0.69,0.0,3.2,0.084,13.0,33.0,0.9992,3.36,0.45,9.4,5 +8.0,0.43,0.36,2.3,0.075,10.0,48.0,0.9976,3.34,0.46,9.4,5 +9.9,0.74,0.28,2.6,0.078,21.0,77.0,0.998,3.28,0.51,9.8,5 +7.2,0.49,0.18,2.7,0.069,13.0,34.0,0.9967,3.29,0.48,9.2,6 +8.0,0.43,0.36,2.3,0.075,10.0,48.0,0.9976,3.34,0.46,9.4,5 +7.6,0.46,0.11,2.6,0.079,12.0,49.0,0.9968,3.21,0.57,10.0,5 +8.4,0.56,0.04,2.0,0.08199999999999999,10.0,22.0,0.9976,3.22,0.44,9.6,5 +7.1,0.66,0.0,3.9,0.086,17.0,45.0,0.9976,3.46,0.54,9.5,5 +8.4,0.56,0.04,2.0,0.08199999999999999,10.0,22.0,0.9976,3.22,0.44,9.6,5 +8.9,0.48,0.24,2.85,0.094,35.0,106.0,0.9982,3.1,0.53,9.2,5 +7.6,0.42,0.08,2.7,0.084,15.0,48.0,0.9968,3.21,0.59,10.0,5 +7.1,0.31,0.3,2.2,0.053,36.0,127.0,0.9965,2.94,1.62,9.5,5 +7.5,1.115,0.1,3.1,0.086,5.0,12.0,0.9958,3.54,0.6,11.2,4 +9.0,0.66,0.17,3.0,0.077,5.0,13.0,0.9976,3.29,0.55,10.4,5 +8.1,0.72,0.09,2.8,0.084,18.0,49.0,0.9994,3.43,0.72,11.1,6 +6.4,0.57,0.02,1.8,0.067,4.0,11.0,0.997,3.46,0.68,9.5,5 +6.4,0.57,0.02,1.8,0.067,4.0,11.0,0.997,3.46,0.68,9.5,5 +6.4,0.865,0.03,3.2,0.071,27.0,58.0,0.995,3.61,0.49,12.7,6 +9.5,0.55,0.66,2.3,0.387,12.0,37.0,0.9982,3.17,0.67,9.6,5 +8.9,0.875,0.13,3.45,0.08800000000000001,4.0,14.0,0.9994,3.44,0.52,11.5,5 +7.3,0.835,0.03,2.1,0.092,10.0,19.0,0.9966,3.39,0.47,9.6,5 +7.0,0.45,0.34,2.7,0.08199999999999999,16.0,72.0,0.998,3.55,0.6,9.5,5 +7.7,0.56,0.2,2.0,0.075,9.0,39.0,0.9987,3.48,0.62,9.3,5 +7.7,0.965,0.1,2.1,0.11199999999999999,11.0,22.0,0.9963,3.26,0.5,9.5,5 +7.7,0.965,0.1,2.1,0.11199999999999999,11.0,22.0,0.9963,3.26,0.5,9.5,5 +8.2,0.59,0.0,2.5,0.09300000000000001,19.0,58.0,1.0002,3.5,0.65,9.3,6 +9.0,0.46,0.23,2.8,0.092,28.0,104.0,0.9983,3.1,0.56,9.2,5 +9.0,0.69,0.0,2.4,0.08800000000000001,19.0,38.0,0.9990000000000001,3.35,0.6,9.3,5 +8.3,0.76,0.29,4.2,0.075,12.0,16.0,0.9965,3.45,0.68,11.5,6 +9.2,0.53,0.24,2.6,0.078,28.0,139.0,0.9978799999999999,3.21,0.57,9.5,5 +6.5,0.615,0.0,1.9,0.065,9.0,18.0,0.9972,3.46,0.65,9.2,5 +11.6,0.41,0.58,2.8,0.096,25.0,101.0,1.00024,3.13,0.53,10.0,5 +11.1,0.39,0.54,2.7,0.095,21.0,101.0,1.0001,3.13,0.51,9.5,5 +7.3,0.51,0.18,2.1,0.07,12.0,28.0,0.9976799999999999,3.52,0.73,9.5,6 +8.2,0.34,0.38,2.5,0.08,12.0,57.0,0.9978,3.3,0.47,9.0,6 +8.6,0.33,0.4,2.6,0.083,16.0,68.0,0.99782,3.3,0.48,9.4,5 +7.2,0.5,0.18,2.1,0.071,12.0,31.0,0.99761,3.52,0.72,9.6,6 +7.3,0.51,0.18,2.1,0.07,12.0,28.0,0.9976799999999999,3.52,0.73,9.5,6 +8.3,0.65,0.1,2.9,0.08900000000000001,17.0,40.0,0.99803,3.29,0.55,9.5,5 +8.3,0.65,0.1,2.9,0.08900000000000001,17.0,40.0,0.99803,3.29,0.55,9.5,5 +7.6,0.54,0.13,2.5,0.09699999999999999,24.0,66.0,0.99785,3.39,0.61,9.4,5 +8.3,0.65,0.1,2.9,0.08900000000000001,17.0,40.0,0.99803,3.29,0.55,9.5,5 +7.8,0.48,0.68,1.7,0.415,14.0,32.0,0.99656,3.09,1.06,9.1,6 +7.8,0.91,0.07,1.9,0.057999999999999996,22.0,47.0,0.99525,3.51,0.43,10.7,6 +6.3,0.98,0.01,2.0,0.057,15.0,33.0,0.9948799999999999,3.6,0.46,11.2,6 +8.1,0.87,0.0,2.2,0.084,10.0,31.0,0.99656,3.25,0.5,9.8,5 +8.1,0.87,0.0,2.2,0.084,10.0,31.0,0.99656,3.25,0.5,9.8,5 +8.8,0.42,0.21,2.5,0.092,33.0,88.0,0.99823,3.19,0.52,9.2,5 +9.0,0.58,0.25,2.8,0.075,9.0,104.0,0.99779,3.23,0.57,9.7,5 +9.3,0.655,0.26,2.0,0.096,5.0,35.0,0.9973799999999999,3.25,0.42,9.6,5 +8.8,0.7,0.0,1.7,0.069,8.0,19.0,0.9970100000000001,3.31,0.53,10.0,6 +9.3,0.655,0.26,2.0,0.096,5.0,35.0,0.9973799999999999,3.25,0.42,9.6,5 +9.1,0.68,0.11,2.8,0.09300000000000001,11.0,44.0,0.9988799999999999,3.31,0.55,9.5,6 +9.2,0.67,0.1,3.0,0.091,12.0,48.0,0.9988799999999999,3.31,0.54,9.5,6 +8.8,0.59,0.18,2.9,0.08900000000000001,12.0,74.0,0.9973799999999999,3.14,0.54,9.4,5 +7.5,0.6,0.32,2.7,0.10300000000000001,13.0,98.0,0.9993799999999999,3.45,0.62,9.5,5 +7.1,0.59,0.02,2.3,0.08199999999999999,24.0,94.0,0.99744,3.55,0.53,9.7,6 +7.9,0.72,0.01,1.9,0.076,7.0,32.0,0.9966799999999999,3.39,0.54,9.6,5 +7.1,0.59,0.02,2.3,0.08199999999999999,24.0,94.0,0.99744,3.55,0.53,9.7,6 +9.4,0.685,0.26,2.4,0.08199999999999999,23.0,143.0,0.9978,3.28,0.55,9.4,5 +9.5,0.57,0.27,2.3,0.08199999999999999,23.0,144.0,0.99782,3.27,0.55,9.4,5 +7.9,0.4,0.29,1.8,0.157,1.0,44.0,0.9973,3.3,0.92,9.5,6 +7.9,0.4,0.3,1.8,0.157,2.0,45.0,0.9972700000000001,3.31,0.91,9.5,6 +7.2,1.0,0.0,3.0,0.102,7.0,16.0,0.9958600000000001,3.43,0.46,10.0,5 +6.9,0.765,0.18,2.4,0.243,5.5,48.0,0.9961200000000001,3.4,0.6,10.3,6 +6.9,0.635,0.17,2.4,0.24100000000000002,6.0,18.0,0.9961,3.4,0.59,10.3,6 +8.3,0.43,0.3,3.4,0.079,7.0,34.0,0.9978799999999999,3.36,0.61,10.5,5 +7.1,0.52,0.03,2.6,0.076,21.0,92.0,0.99745,3.5,0.6,9.8,5 +7.0,0.57,0.0,2.0,0.19,12.0,45.0,0.9967600000000001,3.31,0.6,9.4,6 +6.5,0.46,0.14,2.4,0.114,9.0,37.0,0.9973200000000001,3.66,0.65,9.8,5 +9.0,0.82,0.05,2.4,0.081,26.0,96.0,0.9981399999999999,3.36,0.53,10.0,5 +6.5,0.46,0.14,2.4,0.114,9.0,37.0,0.9973200000000001,3.66,0.65,9.8,5 +7.1,0.59,0.01,2.5,0.077,20.0,85.0,0.99746,3.55,0.59,9.8,5 +9.9,0.35,0.41,2.3,0.083,11.0,61.0,0.9982,3.21,0.5,9.5,5 +9.9,0.35,0.41,2.3,0.083,11.0,61.0,0.9982,3.21,0.5,9.5,5 +10.0,0.56,0.24,2.2,0.079,19.0,58.0,0.9991,3.18,0.56,10.1,6 +10.0,0.56,0.24,2.2,0.079,19.0,58.0,0.9991,3.18,0.56,10.1,6 +8.6,0.63,0.17,2.9,0.099,21.0,119.0,0.998,3.09,0.52,9.3,5 +7.4,0.37,0.43,2.6,0.08199999999999999,18.0,82.0,0.99708,3.33,0.68,9.7,6 +8.8,0.64,0.17,2.9,0.084,25.0,130.0,0.99818,3.23,0.54,9.6,5 +7.1,0.61,0.02,2.5,0.081,17.0,87.0,0.99745,3.48,0.6,9.7,6 +7.7,0.6,0.0,2.6,0.055,7.0,13.0,0.99639,3.38,0.56,10.8,5 +10.1,0.27,0.54,2.3,0.065,7.0,26.0,0.99531,3.17,0.53,12.5,6 +10.8,0.89,0.3,2.6,0.132,7.0,60.0,0.9978600000000001,2.99,1.18,10.2,5 +8.7,0.46,0.31,2.5,0.126,24.0,64.0,0.99746,3.1,0.74,9.6,5 +9.3,0.37,0.44,1.6,0.038,21.0,42.0,0.99526,3.24,0.81,10.8,7 +9.4,0.5,0.34,3.6,0.08199999999999999,5.0,14.0,0.9987,3.29,0.52,10.7,6 +9.4,0.5,0.34,3.6,0.08199999999999999,5.0,14.0,0.9987,3.29,0.52,10.7,6 +7.2,0.61,0.08,4.0,0.08199999999999999,26.0,108.0,0.99641,3.25,0.51,9.4,5 +8.6,0.55,0.09,3.3,0.068,8.0,17.0,0.99735,3.23,0.44,10.0,5 +5.1,0.585,0.0,1.7,0.044000000000000004,14.0,86.0,0.99264,3.56,0.94,12.9,7 +7.7,0.56,0.08,2.5,0.114,14.0,46.0,0.9971,3.24,0.66,9.6,6 +8.4,0.52,0.22,2.7,0.084,4.0,18.0,0.99682,3.26,0.57,9.9,6 +8.2,0.28,0.4,2.4,0.052000000000000005,4.0,10.0,0.99356,3.33,0.7,12.8,7 +8.4,0.25,0.39,2.0,0.040999999999999995,4.0,10.0,0.9938600000000001,3.27,0.71,12.5,7 +8.2,0.28,0.4,2.4,0.052000000000000005,4.0,10.0,0.99356,3.33,0.7,12.8,7 +7.4,0.53,0.12,1.9,0.165,4.0,12.0,0.99702,3.26,0.86,9.2,5 +7.6,0.48,0.31,2.8,0.07,4.0,15.0,0.9969299999999999,3.22,0.55,10.3,6 +7.3,0.49,0.1,2.6,0.068,4.0,14.0,0.9956200000000001,3.3,0.47,10.5,5 +12.9,0.5,0.55,2.8,0.07200000000000001,7.0,24.0,1.0001200000000001,3.09,0.68,10.9,6 +10.8,0.45,0.33,2.5,0.099,20.0,38.0,0.99818,3.24,0.71,10.8,5 +6.9,0.39,0.24,2.1,0.102,4.0,7.0,0.9946200000000001,3.44,0.58,11.4,4 +12.6,0.41,0.54,2.8,0.10300000000000001,19.0,41.0,0.99939,3.21,0.76,11.3,6 +10.8,0.45,0.33,2.5,0.099,20.0,38.0,0.99818,3.24,0.71,10.8,5 +9.8,0.51,0.19,3.2,0.081,8.0,30.0,0.9984,3.23,0.58,10.5,6 +10.8,0.29,0.42,1.6,0.084,19.0,27.0,0.99545,3.28,0.73,11.9,6 +7.1,0.715,0.0,2.35,0.071,21.0,47.0,0.9963200000000001,3.29,0.45,9.4,5 +9.1,0.66,0.15,3.2,0.09699999999999999,9.0,59.0,0.99976,3.28,0.54,9.6,5 +7.0,0.685,0.0,1.9,0.099,9.0,22.0,0.9960600000000001,3.34,0.6,9.7,5 +4.9,0.42,0.0,2.1,0.048,16.0,42.0,0.99154,3.71,0.74,14.0,7 +6.7,0.54,0.13,2.0,0.076,15.0,36.0,0.9973,3.61,0.64,9.8,5 +6.7,0.54,0.13,2.0,0.076,15.0,36.0,0.9973,3.61,0.64,9.8,5 +7.1,0.48,0.28,2.8,0.068,6.0,16.0,0.99682,3.24,0.53,10.3,5 +7.1,0.46,0.14,2.8,0.076,15.0,37.0,0.99624,3.36,0.49,10.7,5 +7.5,0.27,0.34,2.3,0.05,4.0,8.0,0.9951,3.4,0.64,11.0,7 +7.1,0.46,0.14,2.8,0.076,15.0,37.0,0.99624,3.36,0.49,10.7,5 +7.8,0.57,0.09,2.3,0.065,34.0,45.0,0.9941700000000001,3.46,0.74,12.7,8 +5.9,0.61,0.08,2.1,0.071,16.0,24.0,0.9937600000000001,3.56,0.77,11.1,6 +7.5,0.685,0.07,2.5,0.057999999999999996,5.0,9.0,0.9963200000000001,3.38,0.55,10.9,4 +5.9,0.61,0.08,2.1,0.071,16.0,24.0,0.9937600000000001,3.56,0.77,11.1,6 +10.4,0.44,0.42,1.5,0.145,34.0,48.0,0.9983200000000001,3.38,0.86,9.9,3 +11.6,0.47,0.44,1.6,0.147,36.0,51.0,0.99836,3.38,0.86,9.9,4 +8.8,0.685,0.26,1.6,0.08800000000000001,16.0,23.0,0.9969399999999999,3.32,0.47,9.4,5 +7.6,0.665,0.1,1.5,0.066,27.0,55.0,0.99655,3.39,0.51,9.3,5 +6.7,0.28,0.28,2.4,0.012,36.0,100.0,0.99064,3.26,0.39,11.7,7 +6.7,0.28,0.28,2.4,0.012,36.0,100.0,0.99064,3.26,0.39,11.7,7 +10.1,0.31,0.35,1.6,0.075,9.0,28.0,0.99672,3.24,0.83,11.2,7 +6.0,0.5,0.04,2.2,0.092,13.0,26.0,0.9964700000000001,3.46,0.47,10.0,5 +11.1,0.42,0.47,2.65,0.085,9.0,34.0,0.99736,3.24,0.77,12.1,7 +6.6,0.66,0.0,3.0,0.115,21.0,31.0,0.99629,3.45,0.63,10.3,5 +10.6,0.5,0.45,2.6,0.11900000000000001,34.0,68.0,0.99708,3.23,0.72,10.9,6 +7.1,0.685,0.35,2.0,0.08800000000000001,9.0,92.0,0.9963,3.28,0.62,9.4,5 +9.9,0.25,0.46,1.7,0.062,26.0,42.0,0.9959,3.18,0.83,10.6,6 +6.4,0.64,0.21,1.8,0.081,14.0,31.0,0.9968899999999999,3.59,0.66,9.8,5 +6.4,0.64,0.21,1.8,0.081,14.0,31.0,0.9968899999999999,3.59,0.66,9.8,5 +7.4,0.68,0.16,1.8,0.078,12.0,39.0,0.9977,3.5,0.7,9.9,6 +6.4,0.64,0.21,1.8,0.081,14.0,31.0,0.9968899999999999,3.59,0.66,9.8,5 +6.4,0.63,0.21,1.6,0.08,12.0,32.0,0.9968899999999999,3.58,0.66,9.8,5 +9.3,0.43,0.44,1.9,0.085,9.0,22.0,0.99708,3.28,0.55,9.5,5 +9.3,0.43,0.44,1.9,0.085,9.0,22.0,0.99708,3.28,0.55,9.5,5 +8.0,0.42,0.32,2.5,0.08,26.0,122.0,0.9980100000000001,3.22,1.07,9.7,5 +9.3,0.36,0.39,1.5,0.08,41.0,55.0,0.9965200000000001,3.47,0.73,10.9,6 +9.3,0.36,0.39,1.5,0.08,41.0,55.0,0.9965200000000001,3.47,0.73,10.9,6 +7.6,0.735,0.02,2.5,0.071,10.0,14.0,0.9953799999999999,3.51,0.71,11.7,7 +9.3,0.36,0.39,1.5,0.08,41.0,55.0,0.9965200000000001,3.47,0.73,10.9,6 +8.2,0.26,0.34,2.5,0.073,16.0,47.0,0.9959399999999999,3.4,0.78,11.3,7 +11.7,0.28,0.47,1.7,0.054000000000000006,17.0,32.0,0.9968600000000001,3.15,0.67,10.6,7 +6.8,0.56,0.22,1.8,0.07400000000000001,15.0,24.0,0.9943799999999999,3.4,0.82,11.2,6 +7.2,0.62,0.06,2.7,0.077,15.0,85.0,0.99746,3.51,0.54,9.5,5 +5.8,1.01,0.66,2.0,0.039,15.0,88.0,0.9935700000000001,3.66,0.6,11.5,6 +7.5,0.42,0.32,2.7,0.067,7.0,25.0,0.9962799999999999,3.24,0.44,10.4,5 +7.2,0.62,0.06,2.5,0.078,17.0,84.0,0.99746,3.51,0.53,9.7,5 +7.2,0.62,0.06,2.7,0.077,15.0,85.0,0.99746,3.51,0.54,9.5,5 +7.2,0.635,0.07,2.6,0.077,16.0,86.0,0.9974799999999999,3.51,0.54,9.7,5 +6.8,0.49,0.22,2.3,0.071,13.0,24.0,0.9943799999999999,3.41,0.83,11.3,6 +6.9,0.51,0.23,2.0,0.07200000000000001,13.0,22.0,0.9943799999999999,3.4,0.84,11.2,6 +6.8,0.56,0.22,1.8,0.07400000000000001,15.0,24.0,0.9943799999999999,3.4,0.82,11.2,6 +7.6,0.63,0.03,2.0,0.08,27.0,43.0,0.9957799999999999,3.44,0.64,10.9,6 +7.7,0.715,0.01,2.1,0.064,31.0,43.0,0.99371,3.41,0.57,11.8,6 +6.9,0.56,0.03,1.5,0.086,36.0,46.0,0.9952200000000001,3.53,0.57,10.6,5 +7.3,0.35,0.24,2.0,0.067,28.0,48.0,0.9957600000000001,3.43,0.54,10.0,4 +9.1,0.21,0.37,1.6,0.067,6.0,10.0,0.9955200000000001,3.23,0.58,11.1,7 +10.4,0.38,0.46,2.1,0.10400000000000001,6.0,10.0,0.99664,3.12,0.65,11.8,7 +8.8,0.31,0.4,2.8,0.109,7.0,16.0,0.9961399999999999,3.31,0.79,11.8,7 +7.1,0.47,0.0,2.2,0.067,7.0,14.0,0.9951700000000001,3.4,0.58,10.9,4 +7.7,0.715,0.01,2.1,0.064,31.0,43.0,0.99371,3.41,0.57,11.8,6 +8.8,0.61,0.19,4.0,0.094,30.0,69.0,0.99787,3.22,0.5,10.0,6 +7.2,0.6,0.04,2.5,0.076,18.0,88.0,0.99745,3.53,0.55,9.5,5 +9.2,0.56,0.18,1.6,0.078,10.0,21.0,0.9957600000000001,3.15,0.49,9.9,5 +7.6,0.715,0.0,2.1,0.068,30.0,35.0,0.9953299999999999,3.48,0.65,11.4,6 +8.4,0.31,0.29,3.1,0.19399999999999998,14.0,26.0,0.99536,3.22,0.78,12.0,6 +7.2,0.6,0.04,2.5,0.076,18.0,88.0,0.99745,3.53,0.55,9.5,5 +8.8,0.61,0.19,4.0,0.094,30.0,69.0,0.99787,3.22,0.5,10.0,6 +8.9,0.75,0.14,2.5,0.086,9.0,30.0,0.99824,3.34,0.64,10.5,5 +9.0,0.8,0.12,2.4,0.083,8.0,28.0,0.99836,3.33,0.65,10.4,6 +10.7,0.52,0.38,2.6,0.066,29.0,56.0,0.99577,3.15,0.79,12.1,7 +6.8,0.57,0.0,2.5,0.07200000000000001,32.0,64.0,0.9949100000000001,3.43,0.56,11.2,6 +10.7,0.9,0.34,6.6,0.11199999999999999,23.0,99.0,1.00289,3.22,0.68,9.3,5 +7.2,0.34,0.24,2.0,0.071,30.0,52.0,0.9957600000000001,3.44,0.58,10.1,5 +7.2,0.66,0.03,2.3,0.078,16.0,86.0,0.9974299999999999,3.53,0.57,9.7,5 +10.1,0.45,0.23,1.9,0.08199999999999999,10.0,18.0,0.99774,3.22,0.65,9.3,6 +7.2,0.66,0.03,2.3,0.078,16.0,86.0,0.9974299999999999,3.53,0.57,9.7,5 +7.2,0.63,0.03,2.2,0.08,17.0,88.0,0.99745,3.53,0.58,9.8,6 +7.1,0.59,0.01,2.3,0.08,27.0,43.0,0.9955,3.42,0.58,10.7,6 +8.3,0.31,0.39,2.4,0.078,17.0,43.0,0.99444,3.31,0.77,12.5,7 +7.1,0.59,0.01,2.3,0.08,27.0,43.0,0.9955,3.42,0.58,10.7,6 +8.3,0.31,0.39,2.4,0.078,17.0,43.0,0.99444,3.31,0.77,12.5,7 +8.3,1.02,0.02,3.4,0.084,6.0,11.0,0.99892,3.48,0.49,11.0,3 +8.9,0.31,0.36,2.6,0.055999999999999994,10.0,39.0,0.9956200000000001,3.4,0.69,11.8,5 +7.4,0.635,0.1,2.4,0.08,16.0,33.0,0.99736,3.58,0.69,10.8,7 +7.4,0.635,0.1,2.4,0.08,16.0,33.0,0.99736,3.58,0.69,10.8,7 +6.8,0.59,0.06,6.0,0.06,11.0,18.0,0.9962,3.41,0.59,10.8,7 +6.8,0.59,0.06,6.0,0.06,11.0,18.0,0.9962,3.41,0.59,10.8,7 +9.2,0.58,0.2,3.0,0.081,15.0,115.0,0.998,3.23,0.59,9.5,5 +7.2,0.54,0.27,2.6,0.084,12.0,78.0,0.9964,3.39,0.71,11.0,5 +6.1,0.56,0.0,2.2,0.079,6.0,9.0,0.9948,3.59,0.54,11.5,6 +7.4,0.52,0.13,2.4,0.078,34.0,61.0,0.9952799999999999,3.43,0.59,10.8,6 +7.3,0.305,0.39,1.2,0.059000000000000004,7.0,11.0,0.99331,3.29,0.52,11.5,6 +9.3,0.38,0.48,3.8,0.132,3.0,11.0,0.99577,3.23,0.57,13.2,6 +9.1,0.28,0.46,9.0,0.114,3.0,9.0,0.9990100000000001,3.18,0.6,10.9,6 +10.0,0.46,0.44,2.9,0.065,4.0,8.0,0.99674,3.33,0.62,12.2,6 +9.4,0.395,0.46,4.6,0.094,3.0,10.0,0.99639,3.27,0.64,12.2,7 +7.3,0.305,0.39,1.2,0.059000000000000004,7.0,11.0,0.99331,3.29,0.52,11.5,6 +8.6,0.315,0.4,2.2,0.079,3.0,6.0,0.9951200000000001,3.27,0.67,11.9,6 +5.3,0.715,0.19,1.5,0.161,7.0,62.0,0.99395,3.62,0.61,11.0,5 +6.8,0.41,0.31,8.8,0.084,26.0,45.0,0.99824,3.38,0.64,10.1,6 +8.4,0.36,0.32,2.2,0.081,32.0,79.0,0.9964,3.3,0.72,11.0,6 +8.4,0.62,0.12,1.8,0.07200000000000001,38.0,46.0,0.9950399999999999,3.38,0.89,11.8,6 +9.6,0.41,0.37,2.3,0.091,10.0,23.0,0.9978600000000001,3.24,0.56,10.5,5 +8.4,0.36,0.32,2.2,0.081,32.0,79.0,0.9964,3.3,0.72,11.0,6 +8.4,0.62,0.12,1.8,0.07200000000000001,38.0,46.0,0.9950399999999999,3.38,0.89,11.8,6 +6.8,0.41,0.31,8.8,0.084,26.0,45.0,0.99824,3.38,0.64,10.1,6 +8.6,0.47,0.27,2.3,0.055,14.0,28.0,0.99516,3.18,0.8,11.2,5 +8.6,0.22,0.36,1.9,0.064,53.0,77.0,0.9960399999999999,3.47,0.87,11.0,7 +9.4,0.24,0.33,2.3,0.061,52.0,73.0,0.9978600000000001,3.47,0.9,10.2,6 +8.4,0.67,0.19,2.2,0.09300000000000001,11.0,75.0,0.99736,3.2,0.59,9.2,4 +8.6,0.47,0.27,2.3,0.055,14.0,28.0,0.99516,3.18,0.8,11.2,5 +8.7,0.33,0.38,3.3,0.063,10.0,19.0,0.9946799999999999,3.3,0.73,12.0,7 +6.6,0.61,0.01,1.9,0.08,8.0,25.0,0.99746,3.69,0.73,10.5,5 +7.4,0.61,0.01,2.0,0.07400000000000001,13.0,38.0,0.9974799999999999,3.48,0.65,9.8,5 +7.6,0.4,0.29,1.9,0.078,29.0,66.0,0.9971,3.45,0.59,9.5,6 +7.4,0.61,0.01,2.0,0.07400000000000001,13.0,38.0,0.9974799999999999,3.48,0.65,9.8,5 +6.6,0.61,0.01,1.9,0.08,8.0,25.0,0.99746,3.69,0.73,10.5,5 +8.8,0.3,0.38,2.3,0.06,19.0,72.0,0.9954299999999999,3.39,0.72,11.8,6 +8.8,0.3,0.38,2.3,0.06,19.0,72.0,0.9954299999999999,3.39,0.72,11.8,6 +12.0,0.63,0.5,1.4,0.071,6.0,26.0,0.9979100000000001,3.07,0.6,10.4,4 +7.2,0.38,0.38,2.8,0.068,23.0,42.0,0.99356,3.34,0.72,12.9,7 +6.2,0.46,0.17,1.6,0.073,7.0,11.0,0.99425,3.61,0.54,11.4,5 +9.6,0.33,0.52,2.2,0.07400000000000001,13.0,25.0,0.9950899999999999,3.36,0.76,12.4,7 +9.9,0.27,0.49,5.0,0.08199999999999999,9.0,17.0,0.99484,3.19,0.52,12.5,7 +10.1,0.43,0.4,2.6,0.092,13.0,52.0,0.99834,3.22,0.64,10.0,7 +9.8,0.5,0.34,2.3,0.094,10.0,45.0,0.99864,3.24,0.6,9.7,7 +8.3,0.3,0.49,3.8,0.09,11.0,24.0,0.99498,3.27,0.64,12.1,7 +10.2,0.44,0.42,2.0,0.071,7.0,20.0,0.99566,3.14,0.79,11.1,7 +10.2,0.44,0.58,4.1,0.092,11.0,24.0,0.99745,3.29,0.99,12.0,7 +8.3,0.28,0.48,2.1,0.09300000000000001,6.0,12.0,0.99408,3.26,0.62,12.4,7 +8.9,0.12,0.45,1.8,0.075,10.0,21.0,0.9955200000000001,3.41,0.76,11.9,7 +8.9,0.12,0.45,1.8,0.075,10.0,21.0,0.9955200000000001,3.41,0.76,11.9,7 +8.9,0.12,0.45,1.8,0.075,10.0,21.0,0.9955200000000001,3.41,0.76,11.9,7 +8.3,0.28,0.48,2.1,0.09300000000000001,6.0,12.0,0.99408,3.26,0.62,12.4,7 +8.2,0.31,0.4,2.2,0.057999999999999996,6.0,10.0,0.99536,3.31,0.68,11.2,7 +10.2,0.34,0.48,2.1,0.052000000000000005,5.0,9.0,0.9945799999999999,3.2,0.69,12.1,7 +7.6,0.43,0.4,2.7,0.08199999999999999,6.0,11.0,0.9953799999999999,3.44,0.54,12.2,6 +8.5,0.21,0.52,1.9,0.09,9.0,23.0,0.9964799999999999,3.36,0.67,10.4,5 +9.0,0.36,0.52,2.1,0.111,5.0,10.0,0.9956799999999999,3.31,0.62,11.3,6 +9.5,0.37,0.52,2.0,0.08800000000000001,12.0,51.0,0.99613,3.29,0.58,11.1,6 +6.4,0.57,0.12,2.3,0.12,25.0,36.0,0.99519,3.47,0.71,11.3,7 +8.0,0.59,0.05,2.0,0.08900000000000001,12.0,32.0,0.99735,3.36,0.61,10.0,5 +8.5,0.47,0.27,1.9,0.057999999999999996,18.0,38.0,0.99518,3.16,0.85,11.1,6 +7.1,0.56,0.14,1.6,0.078,7.0,18.0,0.99592,3.27,0.62,9.3,5 +6.6,0.57,0.02,2.1,0.115,6.0,16.0,0.99654,3.38,0.69,9.5,5 +8.8,0.27,0.39,2.0,0.1,20.0,27.0,0.99546,3.15,0.69,11.2,6 +8.5,0.47,0.27,1.9,0.057999999999999996,18.0,38.0,0.99518,3.16,0.85,11.1,6 +8.3,0.34,0.4,2.4,0.065,24.0,48.0,0.99554,3.34,0.86,11.0,6 +9.0,0.38,0.41,2.4,0.10300000000000001,6.0,10.0,0.9960399999999999,3.13,0.58,11.9,7 +8.5,0.66,0.2,2.1,0.09699999999999999,23.0,113.0,0.9973299999999999,3.13,0.48,9.2,5 +9.0,0.4,0.43,2.4,0.068,29.0,46.0,0.9943,3.2,0.6,12.2,6 +6.7,0.56,0.09,2.9,0.079,7.0,22.0,0.99669,3.46,0.61,10.2,5 +10.4,0.26,0.48,1.9,0.066,6.0,10.0,0.99724,3.33,0.87,10.9,6 +10.4,0.26,0.48,1.9,0.066,6.0,10.0,0.99724,3.33,0.87,10.9,6 +10.1,0.38,0.5,2.4,0.10400000000000001,6.0,13.0,0.9964299999999999,3.22,0.65,11.6,7 +8.5,0.34,0.44,1.7,0.079,6.0,12.0,0.99605,3.52,0.63,10.7,5 +8.8,0.33,0.41,5.9,0.073,7.0,13.0,0.9965799999999999,3.3,0.62,12.1,7 +7.2,0.41,0.3,2.1,0.083,35.0,72.0,0.997,3.44,0.52,9.4,5 +7.2,0.41,0.3,2.1,0.083,35.0,72.0,0.997,3.44,0.52,9.4,5 +8.4,0.59,0.29,2.6,0.109,31.0,119.0,0.9980100000000001,3.15,0.5,9.1,5 +7.0,0.4,0.32,3.6,0.061,9.0,29.0,0.99416,3.28,0.49,11.3,7 +12.2,0.45,0.49,1.4,0.075,3.0,6.0,0.9969,3.13,0.63,10.4,5 +9.1,0.5,0.3,1.9,0.065,8.0,17.0,0.99774,3.32,0.71,10.5,6 +9.5,0.86,0.26,1.9,0.079,13.0,28.0,0.9971200000000001,3.25,0.62,10.0,5 +7.3,0.52,0.32,2.1,0.07,51.0,70.0,0.99418,3.34,0.82,12.9,6 +9.1,0.5,0.3,1.9,0.065,8.0,17.0,0.99774,3.32,0.71,10.5,6 +12.2,0.45,0.49,1.4,0.075,3.0,6.0,0.9969,3.13,0.63,10.4,5 +7.4,0.58,0.0,2.0,0.064,7.0,11.0,0.9956200000000001,3.45,0.58,11.3,6 +9.8,0.34,0.39,1.4,0.066,3.0,7.0,0.9947,3.19,0.55,11.4,7 +7.1,0.36,0.3,1.6,0.08,35.0,70.0,0.9969299999999999,3.44,0.5,9.4,5 +7.7,0.39,0.12,1.7,0.09699999999999999,19.0,27.0,0.9959600000000001,3.16,0.49,9.4,5 +9.7,0.295,0.4,1.5,0.073,14.0,21.0,0.99556,3.14,0.51,10.9,6 +7.7,0.39,0.12,1.7,0.09699999999999999,19.0,27.0,0.9959600000000001,3.16,0.49,9.4,5 +7.1,0.34,0.28,2.0,0.08199999999999999,31.0,68.0,0.9969399999999999,3.45,0.48,9.4,5 +6.5,0.4,0.1,2.0,0.076,30.0,47.0,0.99554,3.36,0.48,9.4,6 +7.1,0.34,0.28,2.0,0.08199999999999999,31.0,68.0,0.9969399999999999,3.45,0.48,9.4,5 +10.0,0.35,0.45,2.5,0.092,20.0,88.0,0.99918,3.15,0.43,9.4,5 +7.7,0.6,0.06,2.0,0.079,19.0,41.0,0.99697,3.39,0.62,10.1,6 +5.6,0.66,0.0,2.2,0.087,3.0,11.0,0.9937799999999999,3.71,0.63,12.8,7 +5.6,0.66,0.0,2.2,0.087,3.0,11.0,0.9937799999999999,3.71,0.63,12.8,7 +8.9,0.84,0.34,1.4,0.05,4.0,10.0,0.99554,3.12,0.48,9.1,6 +6.4,0.69,0.0,1.65,0.055,7.0,12.0,0.9916200000000001,3.47,0.53,12.9,6 +7.5,0.43,0.3,2.2,0.062,6.0,12.0,0.99495,3.44,0.72,11.5,7 +9.9,0.35,0.38,1.5,0.057999999999999996,31.0,47.0,0.9967600000000001,3.26,0.82,10.6,7 +9.1,0.29,0.33,2.05,0.063,13.0,27.0,0.99516,3.26,0.84,11.7,7 +6.8,0.36,0.32,1.8,0.067,4.0,8.0,0.9928,3.36,0.55,12.8,7 +8.2,0.43,0.29,1.6,0.081,27.0,45.0,0.99603,3.25,0.54,10.3,5 +6.8,0.36,0.32,1.8,0.067,4.0,8.0,0.9928,3.36,0.55,12.8,7 +9.1,0.29,0.33,2.05,0.063,13.0,27.0,0.99516,3.26,0.84,11.7,7 +9.1,0.3,0.34,2.0,0.064,12.0,25.0,0.99516,3.26,0.84,11.7,7 +8.9,0.35,0.4,3.6,0.11,12.0,24.0,0.99549,3.23,0.7,12.0,7 +9.6,0.5,0.36,2.8,0.11599999999999999,26.0,55.0,0.9972200000000001,3.18,0.68,10.9,5 +8.9,0.28,0.45,1.7,0.067,7.0,12.0,0.99354,3.25,0.55,12.3,7 +8.9,0.32,0.31,2.0,0.08800000000000001,12.0,19.0,0.9957,3.17,0.55,10.4,6 +7.7,1.005,0.15,2.1,0.102,11.0,32.0,0.9960399999999999,3.23,0.48,10.0,5 +7.5,0.71,0.0,1.6,0.092,22.0,31.0,0.99635,3.38,0.58,10.0,6 +8.0,0.58,0.16,2.0,0.12,3.0,7.0,0.99454,3.22,0.58,11.2,6 +10.5,0.39,0.46,2.2,0.075,14.0,27.0,0.99598,3.06,0.84,11.4,6 +8.9,0.38,0.4,2.2,0.068,12.0,28.0,0.9948600000000001,3.27,0.75,12.6,7 +8.0,0.18,0.37,0.9,0.049,36.0,109.0,0.9900700000000001,2.89,0.44,12.7,6 +8.0,0.18,0.37,0.9,0.049,36.0,109.0,0.9900700000000001,2.89,0.44,12.7,6 +7.0,0.5,0.14,1.8,0.078,10.0,23.0,0.99636,3.53,0.61,10.4,5 +11.3,0.36,0.66,2.4,0.12300000000000001,3.0,8.0,0.9964200000000001,3.2,0.53,11.9,6 +11.3,0.36,0.66,2.4,0.12300000000000001,3.0,8.0,0.9964200000000001,3.2,0.53,11.9,6 +7.0,0.51,0.09,2.1,0.062,4.0,9.0,0.99584,3.35,0.54,10.5,5 +8.2,0.32,0.42,2.3,0.098,3.0,9.0,0.9950600000000001,3.27,0.55,12.3,6 +7.7,0.58,0.01,1.8,0.08800000000000001,12.0,18.0,0.9956799999999999,3.32,0.56,10.5,7 +8.6,0.83,0.0,2.8,0.095,17.0,43.0,0.9982200000000001,3.33,0.6,10.4,6 +7.9,0.31,0.32,1.9,0.066,14.0,36.0,0.99364,3.41,0.56,12.6,6 +6.4,0.795,0.0,2.2,0.065,28.0,52.0,0.9937799999999999,3.49,0.52,11.6,5 +7.2,0.34,0.21,2.5,0.075,41.0,68.0,0.9958600000000001,3.37,0.54,10.1,6 +7.7,0.58,0.01,1.8,0.08800000000000001,12.0,18.0,0.9956799999999999,3.32,0.56,10.5,7 +7.1,0.59,0.0,2.1,0.091,9.0,14.0,0.9948799999999999,3.42,0.55,11.5,7 +7.3,0.55,0.01,1.8,0.09300000000000001,9.0,15.0,0.9951399999999999,3.35,0.58,11.0,7 +8.1,0.82,0.0,4.1,0.095,5.0,14.0,0.99854,3.36,0.53,9.6,5 +7.5,0.57,0.08,2.6,0.08900000000000001,14.0,27.0,0.99592,3.3,0.59,10.4,6 +8.9,0.745,0.18,2.5,0.077,15.0,48.0,0.99739,3.2,0.47,9.7,6 +10.1,0.37,0.34,2.4,0.085,5.0,17.0,0.9968299999999999,3.17,0.65,10.6,7 +7.6,0.31,0.34,2.5,0.08199999999999999,26.0,35.0,0.99356,3.22,0.59,12.5,7 +7.3,0.91,0.1,1.8,0.07400000000000001,20.0,56.0,0.99672,3.35,0.56,9.2,5 +8.7,0.41,0.41,6.2,0.078,25.0,42.0,0.9953,3.24,0.77,12.6,7 +8.9,0.5,0.21,2.2,0.08800000000000001,21.0,39.0,0.99692,3.33,0.83,11.1,6 +7.4,0.965,0.0,2.2,0.08800000000000001,16.0,32.0,0.99756,3.58,0.67,10.2,5 +6.9,0.49,0.19,1.7,0.079,13.0,26.0,0.9954700000000001,3.38,0.64,9.8,6 +8.9,0.5,0.21,2.2,0.08800000000000001,21.0,39.0,0.99692,3.33,0.83,11.1,6 +9.5,0.39,0.41,8.9,0.069,18.0,39.0,0.99859,3.29,0.81,10.9,7 +6.4,0.39,0.33,3.3,0.046,12.0,53.0,0.9929399999999999,3.36,0.62,12.2,6 +6.9,0.44,0.0,1.4,0.07,32.0,38.0,0.9943799999999999,3.32,0.58,11.4,6 +7.6,0.78,0.0,1.7,0.076,33.0,45.0,0.9961200000000001,3.31,0.62,10.7,6 +7.1,0.43,0.17,1.8,0.08199999999999999,27.0,51.0,0.99634,3.49,0.64,10.4,5 +9.3,0.49,0.36,1.7,0.081,3.0,14.0,0.99702,3.27,0.78,10.9,6 +9.3,0.5,0.36,1.8,0.084,6.0,17.0,0.9970399999999999,3.27,0.77,10.8,6 +7.1,0.43,0.17,1.8,0.08199999999999999,27.0,51.0,0.99634,3.49,0.64,10.4,5 +8.5,0.46,0.59,1.4,0.414,16.0,45.0,0.99702,3.03,1.34,9.2,5 +5.6,0.605,0.05,2.4,0.073,19.0,25.0,0.9925799999999999,3.56,0.55,12.9,5 +8.3,0.33,0.42,2.3,0.07,9.0,20.0,0.99426,3.38,0.77,12.7,7 +8.2,0.64,0.27,2.0,0.095,5.0,77.0,0.9974700000000001,3.13,0.62,9.1,6 +8.2,0.64,0.27,2.0,0.095,5.0,77.0,0.9974700000000001,3.13,0.62,9.1,6 +8.9,0.48,0.53,4.0,0.10099999999999999,3.0,10.0,0.9958600000000001,3.21,0.59,12.1,7 +7.6,0.42,0.25,3.9,0.10400000000000001,28.0,90.0,0.99784,3.15,0.57,9.1,5 +9.9,0.53,0.57,2.4,0.09300000000000001,30.0,52.0,0.9971,3.19,0.76,11.6,7 +8.9,0.48,0.53,4.0,0.10099999999999999,3.0,10.0,0.9958600000000001,3.21,0.59,12.1,7 +11.6,0.23,0.57,1.8,0.07400000000000001,3.0,8.0,0.9981,3.14,0.7,9.9,6 +9.1,0.4,0.5,1.8,0.071,7.0,16.0,0.9946200000000001,3.21,0.69,12.5,8 +8.0,0.38,0.44,1.9,0.098,6.0,15.0,0.9956,3.3,0.64,11.4,6 +10.2,0.29,0.65,2.4,0.075,6.0,17.0,0.99565,3.22,0.63,11.8,6 +8.2,0.74,0.09,2.0,0.067,5.0,10.0,0.99418,3.28,0.57,11.8,6 +7.7,0.61,0.18,2.4,0.083,6.0,20.0,0.9963,3.29,0.6,10.2,6 +6.6,0.52,0.08,2.4,0.07,13.0,26.0,0.9935799999999999,3.4,0.72,12.5,7 +11.1,0.31,0.53,2.2,0.06,3.0,10.0,0.99572,3.02,0.83,10.9,7 +11.1,0.31,0.53,2.2,0.06,3.0,10.0,0.99572,3.02,0.83,10.9,7 +8.0,0.62,0.35,2.8,0.086,28.0,52.0,0.997,3.31,0.62,10.8,5 +9.3,0.33,0.45,1.5,0.057,19.0,37.0,0.99498,3.18,0.89,11.1,7 +7.5,0.77,0.2,8.1,0.098,30.0,92.0,0.99892,3.2,0.58,9.2,5 +7.2,0.35,0.26,1.8,0.083,33.0,75.0,0.9968,3.4,0.58,9.5,6 +8.0,0.62,0.33,2.7,0.08800000000000001,16.0,37.0,0.9972,3.31,0.58,10.7,6 +7.5,0.77,0.2,8.1,0.098,30.0,92.0,0.99892,3.2,0.58,9.2,5 +9.1,0.25,0.34,2.0,0.071,45.0,67.0,0.99769,3.44,0.86,10.2,7 +9.9,0.32,0.56,2.0,0.073,3.0,8.0,0.99534,3.15,0.73,11.4,6 +8.6,0.37,0.65,6.4,0.08,3.0,8.0,0.9981700000000001,3.27,0.58,11.0,5 +8.6,0.37,0.65,6.4,0.08,3.0,8.0,0.9981700000000001,3.27,0.58,11.0,5 +7.9,0.3,0.68,8.3,0.05,37.5,278.0,0.99316,3.01,0.51,12.3,7 +10.3,0.27,0.56,1.4,0.047,3.0,8.0,0.99471,3.16,0.51,11.8,6 +7.9,0.3,0.68,8.3,0.05,37.5,289.0,0.99316,3.01,0.51,12.3,7 +7.2,0.38,0.3,1.8,0.073,31.0,70.0,0.99685,3.42,0.59,9.5,6 +8.7,0.42,0.45,2.4,0.07200000000000001,32.0,59.0,0.9961700000000001,3.33,0.77,12.0,6 +7.2,0.38,0.3,1.8,0.073,31.0,70.0,0.99685,3.42,0.59,9.5,6 +6.8,0.48,0.08,1.8,0.07400000000000001,40.0,64.0,0.99529,3.12,0.49,9.6,5 +8.5,0.34,0.4,4.7,0.055,3.0,9.0,0.9973799999999999,3.38,0.66,11.6,7 +7.9,0.19,0.42,1.6,0.057,18.0,30.0,0.9940000000000001,3.29,0.69,11.2,6 +11.6,0.41,0.54,1.5,0.095,22.0,41.0,0.99735,3.02,0.76,9.9,7 +11.6,0.41,0.54,1.5,0.095,22.0,41.0,0.99735,3.02,0.76,9.9,7 +10.0,0.26,0.54,1.9,0.083,42.0,74.0,0.99451,2.98,0.63,11.8,8 +7.9,0.34,0.42,2.0,0.086,8.0,19.0,0.99546,3.35,0.6,11.4,6 +7.0,0.54,0.09,2.0,0.081,10.0,16.0,0.99479,3.43,0.59,11.5,6 +9.2,0.31,0.36,2.2,0.079,11.0,31.0,0.99615,3.33,0.86,12.0,7 +6.6,0.725,0.09,5.5,0.11699999999999999,9.0,17.0,0.99655,3.35,0.49,10.8,6 +9.4,0.4,0.47,2.5,0.087,6.0,20.0,0.99772,3.15,0.5,10.5,5 +6.6,0.725,0.09,5.5,0.11699999999999999,9.0,17.0,0.99655,3.35,0.49,10.8,6 +8.6,0.52,0.38,1.5,0.096,5.0,18.0,0.99666,3.2,0.52,9.4,5 +8.0,0.31,0.45,2.1,0.21600000000000003,5.0,16.0,0.9935799999999999,3.15,0.81,12.5,7 +8.6,0.52,0.38,1.5,0.096,5.0,18.0,0.99666,3.2,0.52,9.4,5 +8.4,0.34,0.42,2.1,0.07200000000000001,23.0,36.0,0.99392,3.11,0.78,12.4,6 +7.4,0.49,0.27,2.1,0.071,14.0,25.0,0.9938799999999999,3.35,0.63,12.0,6 +6.1,0.48,0.09,1.7,0.078,18.0,30.0,0.9940200000000001,3.45,0.54,11.2,6 +7.4,0.49,0.27,2.1,0.071,14.0,25.0,0.9938799999999999,3.35,0.63,12.0,6 +8.0,0.48,0.34,2.2,0.073,16.0,25.0,0.9936,3.28,0.66,12.4,6 +6.3,0.57,0.28,2.1,0.048,13.0,49.0,0.99374,3.41,0.6,12.8,5 +8.2,0.23,0.42,1.9,0.069,9.0,17.0,0.9937600000000001,3.21,0.54,12.3,6 +9.1,0.3,0.41,2.0,0.068,10.0,24.0,0.99523,3.27,0.85,11.7,7 +8.1,0.78,0.1,3.3,0.09,4.0,13.0,0.99855,3.36,0.49,9.5,5 +10.8,0.47,0.43,2.1,0.171,27.0,66.0,0.9982,3.17,0.76,10.8,6 +8.3,0.53,0.0,1.4,0.07,6.0,14.0,0.99593,3.25,0.64,10.0,6 +5.4,0.42,0.27,2.0,0.092,23.0,55.0,0.99471,3.78,0.64,12.3,7 +7.9,0.33,0.41,1.5,0.055999999999999994,6.0,35.0,0.9939600000000001,3.29,0.71,11.0,6 +8.9,0.24,0.39,1.6,0.07400000000000001,3.0,10.0,0.99698,3.12,0.59,9.5,6 +5.0,0.4,0.5,4.3,0.046,29.0,80.0,0.9902,3.49,0.66,13.6,6 +7.0,0.69,0.07,2.5,0.091,15.0,21.0,0.99572,3.38,0.6,11.3,6 +7.0,0.69,0.07,2.5,0.091,15.0,21.0,0.99572,3.38,0.6,11.3,6 +7.0,0.69,0.07,2.5,0.091,15.0,21.0,0.99572,3.38,0.6,11.3,6 +7.1,0.39,0.12,2.1,0.065,14.0,24.0,0.9925200000000001,3.3,0.53,13.3,6 +5.6,0.66,0.0,2.5,0.066,7.0,15.0,0.99256,3.52,0.58,12.9,5 +7.9,0.54,0.34,2.5,0.076,8.0,17.0,0.99235,3.2,0.72,13.1,8 +6.6,0.5,0.0,1.8,0.062,21.0,28.0,0.9935200000000001,3.44,0.55,12.3,6 +6.3,0.47,0.0,1.4,0.055,27.0,33.0,0.9922,3.45,0.48,12.3,6 +10.7,0.4,0.37,1.9,0.081,17.0,29.0,0.99674,3.12,0.65,11.2,6 +6.5,0.58,0.0,2.2,0.096,3.0,13.0,0.9955700000000001,3.62,0.62,11.5,4 +8.8,0.24,0.35,1.7,0.055,13.0,27.0,0.9939399999999999,3.14,0.59,11.3,7 +5.8,0.29,0.26,1.7,0.063,3.0,11.0,0.9915,3.39,0.54,13.5,6 +6.3,0.76,0.0,2.9,0.07200000000000001,26.0,52.0,0.99379,3.51,0.6,11.5,6 +10.0,0.43,0.33,2.7,0.095,28.0,89.0,0.9984,3.22,0.68,10.0,5 +10.5,0.43,0.35,3.3,0.092,24.0,70.0,0.99798,3.21,0.69,10.5,6 +9.1,0.6,0.0,1.9,0.057999999999999996,5.0,10.0,0.9977,3.18,0.63,10.4,6 +5.9,0.19,0.21,1.7,0.045,57.0,135.0,0.99341,3.32,0.44,9.5,5 +7.4,0.36,0.34,1.8,0.075,18.0,38.0,0.9933,3.38,0.88,13.6,7 +7.2,0.48,0.07,5.5,0.08900000000000001,10.0,18.0,0.99684,3.37,0.68,11.2,7 +8.5,0.28,0.35,1.7,0.061,6.0,15.0,0.99524,3.3,0.74,11.8,7 +8.0,0.25,0.43,1.7,0.067,22.0,50.0,0.9946,3.38,0.6,11.9,6 +10.4,0.52,0.45,2.0,0.08,6.0,13.0,0.99774,3.22,0.76,11.4,6 +10.4,0.52,0.45,2.0,0.08,6.0,13.0,0.99774,3.22,0.76,11.4,6 +7.5,0.41,0.15,3.7,0.10400000000000001,29.0,94.0,0.9978600000000001,3.14,0.58,9.1,5 +8.2,0.51,0.24,2.0,0.079,16.0,86.0,0.99764,3.34,0.64,9.5,6 +7.3,0.4,0.3,1.7,0.08,33.0,79.0,0.9969,3.41,0.65,9.5,6 +8.2,0.38,0.32,2.5,0.08,24.0,71.0,0.99624,3.27,0.85,11.0,6 +6.9,0.45,0.11,2.4,0.043,6.0,12.0,0.99354,3.3,0.65,11.4,6 +7.0,0.22,0.3,1.8,0.065,16.0,20.0,0.99672,3.61,0.82,10.0,6 +7.3,0.32,0.23,2.3,0.066,35.0,70.0,0.9958799999999999,3.43,0.62,10.1,5 +8.2,0.2,0.43,2.5,0.076,31.0,51.0,0.99672,3.53,0.81,10.4,6 +7.8,0.5,0.12,1.8,0.17800000000000002,6.0,21.0,0.996,3.28,0.87,9.8,6 +10.0,0.41,0.45,6.2,0.071,6.0,14.0,0.99702,3.21,0.49,11.8,7 +7.8,0.39,0.42,2.0,0.086,9.0,21.0,0.99526,3.39,0.66,11.6,6 +10.0,0.35,0.47,2.0,0.061,6.0,11.0,0.99585,3.23,0.52,12.0,6 +8.2,0.33,0.32,2.8,0.067,4.0,12.0,0.9947299999999999,3.3,0.76,12.8,7 +6.1,0.58,0.23,2.5,0.044000000000000004,16.0,70.0,0.9935200000000001,3.46,0.65,12.5,6 +8.3,0.6,0.25,2.2,0.11800000000000001,9.0,38.0,0.99616,3.15,0.53,9.8,5 +9.6,0.42,0.35,2.1,0.083,17.0,38.0,0.9962200000000001,3.23,0.66,11.1,6 +6.6,0.58,0.0,2.2,0.1,50.0,63.0,0.99544,3.59,0.68,11.4,6 +8.3,0.6,0.25,2.2,0.11800000000000001,9.0,38.0,0.99616,3.15,0.53,9.8,5 +8.5,0.18,0.51,1.75,0.071,45.0,88.0,0.99524,3.33,0.76,11.8,7 +5.1,0.51,0.18,2.1,0.042,16.0,101.0,0.9924,3.46,0.87,12.9,7 +6.7,0.41,0.43,2.8,0.076,22.0,54.0,0.99572,3.42,1.16,10.6,6 +10.2,0.41,0.43,2.2,0.11,11.0,37.0,0.9972799999999999,3.16,0.67,10.8,5 +10.6,0.36,0.57,2.3,0.087,6.0,20.0,0.9967600000000001,3.14,0.72,11.1,7 +8.8,0.45,0.43,1.4,0.076,12.0,21.0,0.99551,3.21,0.75,10.2,6 +8.5,0.32,0.42,2.3,0.075,12.0,19.0,0.99434,3.14,0.71,11.8,7 +9.0,0.785,0.24,1.7,0.078,10.0,21.0,0.99692,3.29,0.67,10.0,5 +9.0,0.785,0.24,1.7,0.078,10.0,21.0,0.99692,3.29,0.67,10.0,5 +8.5,0.44,0.5,1.9,0.369,15.0,38.0,0.99634,3.01,1.1,9.4,5 +9.9,0.54,0.26,2.0,0.111,7.0,60.0,0.9970899999999999,2.94,0.98,10.2,5 +8.2,0.33,0.39,2.5,0.07400000000000001,29.0,48.0,0.9952799999999999,3.32,0.88,12.4,7 +6.5,0.34,0.27,2.8,0.067,8.0,44.0,0.99384,3.21,0.56,12.0,6 +7.6,0.5,0.29,2.3,0.086,5.0,14.0,0.9950200000000001,3.32,0.62,11.5,6 +9.2,0.36,0.34,1.6,0.062,5.0,12.0,0.9966700000000001,3.2,0.67,10.5,6 +7.1,0.59,0.0,2.2,0.078,26.0,44.0,0.9952200000000001,3.42,0.68,10.8,6 +9.7,0.42,0.46,2.1,0.07400000000000001,5.0,16.0,0.99649,3.27,0.74,12.3,6 +7.6,0.36,0.31,1.7,0.079,26.0,65.0,0.99716,3.46,0.62,9.5,6 +7.6,0.36,0.31,1.7,0.079,26.0,65.0,0.99716,3.46,0.62,9.5,6 +6.5,0.61,0.0,2.2,0.095,48.0,59.0,0.99541,3.61,0.7,11.5,6 +6.5,0.88,0.03,5.6,0.079,23.0,47.0,0.99572,3.58,0.5,11.2,4 +7.1,0.66,0.0,2.4,0.052000000000000005,6.0,11.0,0.99318,3.35,0.66,12.7,7 +5.6,0.915,0.0,2.1,0.040999999999999995,17.0,78.0,0.99346,3.68,0.73,11.4,5 +8.2,0.35,0.33,2.4,0.076,11.0,47.0,0.9959899999999999,3.27,0.81,11.0,6 +8.2,0.35,0.33,2.4,0.076,11.0,47.0,0.9959899999999999,3.27,0.81,11.0,6 +9.8,0.39,0.43,1.65,0.068,5.0,11.0,0.9947799999999999,3.19,0.46,11.4,5 +10.2,0.4,0.4,2.5,0.068,41.0,54.0,0.99754,3.38,0.86,10.5,6 +6.8,0.66,0.07,1.6,0.07,16.0,61.0,0.99572,3.29,0.6,9.3,5 +6.7,0.64,0.23,2.1,0.08,11.0,119.0,0.9953799999999999,3.36,0.7,10.9,5 +7.0,0.43,0.3,2.0,0.085,6.0,39.0,0.99346,3.33,0.46,11.9,6 +6.6,0.8,0.03,7.8,0.079,6.0,12.0,0.9963,3.52,0.5,12.2,5 +7.0,0.43,0.3,2.0,0.085,6.0,39.0,0.99346,3.33,0.46,11.9,6 +6.7,0.64,0.23,2.1,0.08,11.0,119.0,0.9953799999999999,3.36,0.7,10.9,5 +8.8,0.955,0.05,1.8,0.075,5.0,19.0,0.99616,3.3,0.44,9.6,4 +9.1,0.4,0.57,4.6,0.08,6.0,20.0,0.9965200000000001,3.28,0.57,12.5,6 +6.5,0.885,0.0,2.3,0.166,6.0,12.0,0.99551,3.56,0.51,10.8,5 +7.2,0.25,0.37,2.5,0.063,11.0,41.0,0.99439,3.52,0.8,12.4,7 +6.4,0.885,0.0,2.3,0.166,6.0,12.0,0.99551,3.56,0.51,10.8,5 +7.0,0.745,0.12,1.8,0.114,15.0,64.0,0.9958799999999999,3.22,0.59,9.5,6 +6.2,0.43,0.22,1.8,0.078,21.0,56.0,0.9963299999999999,3.52,0.6,9.5,6 +7.9,0.58,0.23,2.3,0.076,23.0,94.0,0.9968600000000001,3.21,0.58,9.5,6 +7.7,0.57,0.21,1.5,0.069,4.0,9.0,0.9945799999999999,3.16,0.54,9.8,6 +7.7,0.26,0.26,2.0,0.052000000000000005,19.0,77.0,0.9951,3.15,0.79,10.9,6 +7.9,0.58,0.23,2.3,0.076,23.0,94.0,0.9968600000000001,3.21,0.58,9.5,6 +7.7,0.57,0.21,1.5,0.069,4.0,9.0,0.9945799999999999,3.16,0.54,9.8,6 +7.9,0.34,0.36,1.9,0.065,5.0,10.0,0.99419,3.27,0.54,11.2,7 +8.6,0.42,0.39,1.8,0.068,6.0,12.0,0.99516,3.35,0.69,11.7,8 +9.9,0.74,0.19,5.8,0.111,33.0,76.0,0.9987799999999999,3.14,0.55,9.4,5 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +9.9,0.72,0.55,1.7,0.136,24.0,52.0,0.9975200000000001,3.35,0.94,10.0,5 +7.2,0.36,0.46,2.1,0.07400000000000001,24.0,44.0,0.99534,3.4,0.85,11.0,7 +6.2,0.39,0.43,2.0,0.071,14.0,24.0,0.9942799999999999,3.45,0.87,11.2,7 +6.8,0.65,0.02,2.1,0.078,8.0,15.0,0.99498,3.35,0.62,10.4,6 +6.6,0.44,0.15,2.1,0.076,22.0,53.0,0.9957,3.32,0.62,9.3,5 +6.8,0.65,0.02,2.1,0.078,8.0,15.0,0.99498,3.35,0.62,10.4,6 +9.6,0.38,0.42,1.9,0.071,5.0,13.0,0.99659,3.15,0.75,10.5,6 +10.2,0.33,0.46,1.9,0.081,6.0,9.0,0.9962799999999999,3.1,0.48,10.4,6 +8.8,0.27,0.46,2.1,0.095,20.0,29.0,0.9948799999999999,3.26,0.56,11.3,6 +7.9,0.57,0.31,2.0,0.079,10.0,79.0,0.99677,3.29,0.69,9.5,6 +8.2,0.34,0.37,1.9,0.057,43.0,74.0,0.99408,3.23,0.81,12.0,6 +8.2,0.4,0.31,1.9,0.08199999999999999,8.0,24.0,0.996,3.24,0.69,10.6,6 +9.0,0.39,0.4,1.3,0.044000000000000004,25.0,50.0,0.9947799999999999,3.2,0.83,10.9,6 +10.9,0.32,0.52,1.8,0.132,17.0,44.0,0.99734,3.28,0.77,11.5,6 +10.9,0.32,0.52,1.8,0.132,17.0,44.0,0.99734,3.28,0.77,11.5,6 +8.1,0.53,0.22,2.2,0.078,33.0,89.0,0.9967799999999999,3.26,0.46,9.6,6 +10.5,0.36,0.47,2.2,0.07400000000000001,9.0,23.0,0.9963799999999999,3.23,0.76,12.0,6 +12.6,0.39,0.49,2.5,0.08,8.0,20.0,0.9992,3.07,0.82,10.3,6 +9.2,0.46,0.23,2.6,0.091,18.0,77.0,0.9992200000000001,3.15,0.51,9.4,5 +7.5,0.58,0.03,4.1,0.08,27.0,46.0,0.99592,3.02,0.47,9.2,5 +9.0,0.58,0.25,2.0,0.10400000000000001,8.0,21.0,0.99769,3.27,0.72,9.6,5 +5.1,0.42,0.0,1.8,0.044000000000000004,18.0,88.0,0.9915700000000001,3.68,0.73,13.6,7 +7.6,0.43,0.29,2.1,0.075,19.0,66.0,0.99718,3.4,0.64,9.5,5 +7.7,0.18,0.34,2.7,0.066,15.0,58.0,0.9947,3.37,0.78,11.8,6 +7.8,0.815,0.01,2.6,0.07400000000000001,48.0,90.0,0.99621,3.38,0.62,10.8,5 +7.6,0.43,0.29,2.1,0.075,19.0,66.0,0.99718,3.4,0.64,9.5,5 +10.2,0.23,0.37,2.2,0.057,14.0,36.0,0.9961399999999999,3.23,0.49,9.3,4 +7.1,0.75,0.01,2.2,0.059000000000000004,11.0,18.0,0.9924200000000001,3.39,0.4,12.8,6 +6.0,0.33,0.32,12.9,0.054000000000000006,6.0,113.0,0.99572,3.3,0.56,11.5,4 +7.8,0.55,0.0,1.7,0.07,7.0,17.0,0.99659,3.26,0.64,9.4,6 +7.1,0.75,0.01,2.2,0.059000000000000004,11.0,18.0,0.9924200000000001,3.39,0.4,12.8,6 +8.1,0.73,0.0,2.5,0.081,12.0,24.0,0.99798,3.38,0.46,9.6,4 +6.5,0.67,0.0,4.3,0.057,11.0,20.0,0.9948799999999999,3.45,0.56,11.8,4 +7.5,0.61,0.2,1.7,0.076,36.0,60.0,0.9949399999999999,3.1,0.4,9.3,5 +9.8,0.37,0.39,2.5,0.079,28.0,65.0,0.99729,3.16,0.59,9.8,5 +9.0,0.4,0.41,2.0,0.057999999999999996,15.0,40.0,0.9941399999999999,3.22,0.6,12.2,6 +8.3,0.56,0.22,2.4,0.08199999999999999,10.0,86.0,0.9983,3.37,0.62,9.5,5 +5.9,0.29,0.25,13.4,0.067,72.0,160.0,0.99721,3.33,0.54,10.3,6 +7.4,0.55,0.19,1.8,0.08199999999999999,15.0,34.0,0.99655,3.49,0.68,10.5,5 +7.4,0.74,0.07,1.7,0.086,15.0,48.0,0.9950200000000001,3.12,0.48,10.0,5 +7.4,0.55,0.19,1.8,0.08199999999999999,15.0,34.0,0.99655,3.49,0.68,10.5,5 +6.9,0.41,0.33,2.2,0.081,22.0,36.0,0.9949,3.41,0.75,11.1,6 +7.1,0.6,0.01,2.3,0.079,24.0,37.0,0.9951399999999999,3.4,0.61,10.9,6 +7.1,0.6,0.01,2.3,0.079,24.0,37.0,0.9951399999999999,3.4,0.61,10.9,6 +7.5,0.58,0.14,2.2,0.077,27.0,60.0,0.9963,3.28,0.59,9.8,5 +7.1,0.72,0.0,1.8,0.12300000000000001,6.0,14.0,0.9962700000000001,3.45,0.58,9.8,5 +7.9,0.66,0.0,1.4,0.096,6.0,13.0,0.99569,3.43,0.58,9.5,5 +7.8,0.7,0.06,1.9,0.079,20.0,35.0,0.9962799999999999,3.4,0.69,10.9,5 +6.1,0.64,0.02,2.4,0.069,26.0,46.0,0.9935799999999999,3.47,0.45,11.0,5 +7.5,0.59,0.22,1.8,0.08199999999999999,43.0,60.0,0.9949899999999999,3.1,0.42,9.2,5 +7.0,0.58,0.28,4.8,0.085,12.0,69.0,0.9963299999999999,3.32,0.7,11.0,6 +6.8,0.64,0.0,2.7,0.12300000000000001,15.0,33.0,0.9953799999999999,3.44,0.63,11.3,6 +6.8,0.64,0.0,2.7,0.12300000000000001,15.0,33.0,0.9953799999999999,3.44,0.63,11.3,6 +8.6,0.635,0.68,1.8,0.40299999999999997,19.0,56.0,0.9963200000000001,3.02,1.15,9.3,5 +6.3,1.02,0.0,2.0,0.083,17.0,24.0,0.9943700000000001,3.59,0.55,11.2,4 +9.8,0.45,0.38,2.5,0.081,34.0,66.0,0.99726,3.15,0.58,9.8,5 +8.2,0.78,0.0,2.2,0.08900000000000001,13.0,26.0,0.9978,3.37,0.46,9.6,4 +8.5,0.37,0.32,1.8,0.066,26.0,51.0,0.99456,3.38,0.72,11.8,6 +7.2,0.57,0.05,2.3,0.081,16.0,36.0,0.99564,3.38,0.6,10.3,6 +7.2,0.57,0.05,2.3,0.081,16.0,36.0,0.99564,3.38,0.6,10.3,6 +10.4,0.43,0.5,2.3,0.068,13.0,19.0,0.996,3.1,0.87,11.4,6 +6.9,0.41,0.31,2.0,0.079,21.0,51.0,0.9966799999999999,3.47,0.55,9.5,6 +5.5,0.49,0.03,1.8,0.044000000000000004,28.0,87.0,0.9908,3.5,0.82,14.0,8 +5.0,0.38,0.01,1.6,0.048,26.0,60.0,0.9908399999999999,3.7,0.75,14.0,6 +7.3,0.44,0.2,1.6,0.049,24.0,64.0,0.9935,3.38,0.57,11.7,6 +5.9,0.46,0.0,1.9,0.077,25.0,44.0,0.99385,3.5,0.53,11.2,5 +7.5,0.58,0.2,2.0,0.073,34.0,44.0,0.9949399999999999,3.1,0.43,9.3,5 +7.8,0.58,0.13,2.1,0.102,17.0,36.0,0.9944,3.24,0.53,11.2,6 +8.0,0.715,0.22,2.3,0.075,13.0,81.0,0.9968799999999999,3.24,0.54,9.5,6 +8.5,0.4,0.4,6.3,0.05,3.0,10.0,0.99566,3.28,0.56,12.0,4 +7.0,0.69,0.0,1.9,0.114,3.0,10.0,0.99636,3.35,0.6,9.7,6 +8.0,0.715,0.22,2.3,0.075,13.0,81.0,0.9968799999999999,3.24,0.54,9.5,6 +9.8,0.3,0.39,1.7,0.062,3.0,9.0,0.9948,3.14,0.57,11.5,7 +7.1,0.46,0.2,1.9,0.077,28.0,54.0,0.9956,3.37,0.64,10.4,6 +7.1,0.46,0.2,1.9,0.077,28.0,54.0,0.9956,3.37,0.64,10.4,6 +7.9,0.765,0.0,2.0,0.084,9.0,22.0,0.9961899999999999,3.33,0.68,10.9,6 +8.7,0.63,0.28,2.7,0.096,17.0,69.0,0.99734,3.26,0.63,10.2,6 +7.0,0.42,0.19,2.3,0.071,18.0,36.0,0.9947600000000001,3.39,0.56,10.9,5 +11.3,0.37,0.5,1.8,0.09,20.0,47.0,0.99734,3.15,0.57,10.5,5 +7.1,0.16,0.44,2.5,0.068,17.0,31.0,0.9932799999999999,3.35,0.54,12.4,6 +8.0,0.6,0.08,2.6,0.055999999999999994,3.0,7.0,0.9928600000000001,3.22,0.37,13.0,5 +7.0,0.6,0.3,4.5,0.068,20.0,110.0,0.9991399999999999,3.3,1.17,10.2,5 +7.0,0.6,0.3,4.5,0.068,20.0,110.0,0.9991399999999999,3.3,1.17,10.2,5 +7.6,0.74,0.0,1.9,0.1,6.0,12.0,0.99521,3.36,0.59,11.0,5 +8.2,0.635,0.1,2.1,0.073,25.0,60.0,0.9963799999999999,3.29,0.75,10.9,6 +5.9,0.395,0.13,2.4,0.055999999999999994,14.0,28.0,0.9936200000000001,3.62,0.67,12.4,6 +7.5,0.755,0.0,1.9,0.084,6.0,12.0,0.99672,3.34,0.49,9.7,4 +8.2,0.635,0.1,2.1,0.073,25.0,60.0,0.9963799999999999,3.29,0.75,10.9,6 +6.6,0.63,0.0,4.3,0.09300000000000001,51.0,77.5,0.9955799999999999,3.2,0.45,9.5,5 +6.6,0.63,0.0,4.3,0.09300000000000001,51.0,77.5,0.9955799999999999,3.2,0.45,9.5,5 +7.2,0.53,0.14,2.1,0.064,15.0,29.0,0.99323,3.35,0.61,12.1,6 +5.7,0.6,0.0,1.4,0.063,11.0,18.0,0.9919100000000001,3.45,0.56,12.2,6 +7.6,1.58,0.0,2.1,0.13699999999999998,5.0,9.0,0.9947600000000001,3.5,0.4,10.9,3 +5.2,0.645,0.0,2.15,0.08,15.0,28.0,0.99444,3.78,0.61,12.5,6 +6.7,0.86,0.07,2.0,0.1,20.0,57.0,0.99598,3.6,0.74,11.7,6 +9.1,0.37,0.32,2.1,0.064,4.0,15.0,0.9957600000000001,3.3,0.8,11.2,6 +8.0,0.28,0.44,1.8,0.081,28.0,68.0,0.9950100000000001,3.36,0.66,11.2,5 +7.6,0.79,0.21,2.3,0.087,21.0,68.0,0.9955,3.12,0.44,9.2,5 +7.5,0.61,0.26,1.9,0.073,24.0,88.0,0.9961200000000001,3.3,0.53,9.8,5 +9.7,0.69,0.32,2.5,0.08800000000000001,22.0,91.0,0.9979,3.29,0.62,10.1,5 +6.8,0.68,0.09,3.9,0.068,15.0,29.0,0.99524,3.41,0.52,11.1,4 +9.7,0.69,0.32,2.5,0.08800000000000001,22.0,91.0,0.9979,3.29,0.62,10.1,5 +7.0,0.62,0.1,1.4,0.071,27.0,63.0,0.996,3.28,0.61,9.2,5 +7.5,0.61,0.26,1.9,0.073,24.0,88.0,0.9961200000000001,3.3,0.53,9.8,5 +6.5,0.51,0.15,3.0,0.064,12.0,27.0,0.9929,3.33,0.59,12.8,6 +8.0,1.18,0.21,1.9,0.083,14.0,41.0,0.9953200000000001,3.34,0.47,10.5,5 +7.0,0.36,0.21,2.3,0.086,20.0,65.0,0.9955799999999999,3.4,0.54,10.1,6 +7.0,0.36,0.21,2.4,0.086,24.0,69.0,0.99556,3.4,0.53,10.1,6 +7.5,0.63,0.27,2.0,0.083,17.0,91.0,0.99616,3.26,0.58,9.8,6 +5.4,0.74,0.0,1.2,0.040999999999999995,16.0,46.0,0.9925799999999999,4.01,0.59,12.5,6 +9.9,0.44,0.46,2.2,0.091,10.0,41.0,0.9963799999999999,3.18,0.69,11.9,6 +7.5,0.63,0.27,2.0,0.083,17.0,91.0,0.99616,3.26,0.58,9.8,6 +9.1,0.76,0.68,1.7,0.414,18.0,64.0,0.9965200000000001,2.9,1.33,9.1,6 +9.7,0.66,0.34,2.6,0.094,12.0,88.0,0.9979600000000001,3.26,0.66,10.1,5 +5.0,0.74,0.0,1.2,0.040999999999999995,16.0,46.0,0.9925799999999999,4.01,0.59,12.5,6 +9.1,0.34,0.42,1.8,0.057999999999999996,9.0,18.0,0.99392,3.18,0.55,11.4,5 +9.1,0.36,0.39,1.8,0.06,21.0,55.0,0.99495,3.18,0.82,11.0,7 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.7,0.46,0.24,1.7,0.077,18.0,34.0,0.9948,3.39,0.6,10.6,6 +6.5,0.52,0.11,1.8,0.073,13.0,38.0,0.9955,3.34,0.52,9.3,5 +7.4,0.6,0.26,2.1,0.083,17.0,91.0,0.99616,3.29,0.56,9.8,6 +7.4,0.6,0.26,2.1,0.083,17.0,91.0,0.99616,3.29,0.56,9.8,6 +7.8,0.87,0.26,3.8,0.107,31.0,67.0,0.9966799999999999,3.26,0.46,9.2,5 +8.4,0.39,0.1,1.7,0.075,6.0,25.0,0.9958100000000001,3.09,0.43,9.7,6 +9.1,0.775,0.22,2.2,0.079,12.0,48.0,0.9976,3.18,0.51,9.6,5 +7.2,0.835,0.0,2.0,0.166,4.0,11.0,0.99608,3.39,0.52,10.0,5 +6.6,0.58,0.02,2.4,0.069,19.0,40.0,0.99387,3.38,0.66,12.6,6 +6.0,0.5,0.0,1.4,0.057,15.0,26.0,0.9944799999999999,3.36,0.45,9.5,5 +6.0,0.5,0.0,1.4,0.057,15.0,26.0,0.9944799999999999,3.36,0.45,9.5,5 +6.0,0.5,0.0,1.4,0.057,15.0,26.0,0.9944799999999999,3.36,0.45,9.5,5 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.9953799999999999,3.36,0.54,10.5,6 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.9953799999999999,3.36,0.54,10.5,6 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.9953799999999999,3.36,0.54,10.5,6 +7.6,0.54,0.02,1.7,0.085,17.0,31.0,0.9958899999999999,3.37,0.51,10.4,6 +7.5,0.51,0.02,1.7,0.084,13.0,31.0,0.9953799999999999,3.36,0.54,10.5,6 +11.5,0.42,0.48,2.6,0.077,8.0,20.0,0.9985200000000001,3.09,0.53,11.0,5 +8.2,0.44,0.24,2.3,0.063,10.0,28.0,0.99613,3.25,0.53,10.2,6 +6.1,0.59,0.01,2.1,0.055999999999999994,5.0,13.0,0.99472,3.52,0.56,11.4,5 +7.2,0.655,0.03,1.8,0.078,7.0,12.0,0.99587,3.34,0.39,9.5,5 +7.2,0.655,0.03,1.8,0.078,7.0,12.0,0.99587,3.34,0.39,9.5,5 +6.9,0.57,0.0,2.8,0.081,21.0,41.0,0.99518,3.41,0.52,10.8,5 +9.0,0.6,0.29,2.0,0.069,32.0,73.0,0.99654,3.34,0.57,10.0,5 +7.2,0.62,0.01,2.3,0.065,8.0,46.0,0.9933200000000001,3.32,0.51,11.8,6 +7.6,0.645,0.03,1.9,0.086,14.0,57.0,0.9969,3.37,0.46,10.3,5 +7.6,0.645,0.03,1.9,0.086,14.0,57.0,0.9969,3.37,0.46,10.3,5 +7.2,0.58,0.03,2.3,0.077,7.0,28.0,0.9956799999999999,3.35,0.52,10.0,5 +6.1,0.32,0.25,1.8,0.086,5.0,32.0,0.99464,3.36,0.44,10.1,5 +6.1,0.34,0.25,1.8,0.084,4.0,28.0,0.99464,3.36,0.44,10.1,5 +7.3,0.43,0.24,2.5,0.078,27.0,67.0,0.9964799999999999,3.6,0.59,11.1,6 +7.4,0.64,0.17,5.4,0.168,52.0,98.0,0.99736,3.28,0.5,9.5,5 +11.6,0.475,0.4,1.4,0.091,6.0,28.0,0.9970399999999999,3.07,0.65,10.0333333333333,6 +9.2,0.54,0.31,2.3,0.11199999999999999,11.0,38.0,0.9969899999999999,3.24,0.56,10.9,5 +8.3,0.85,0.14,2.5,0.09300000000000001,13.0,54.0,0.99724,3.36,0.54,10.1,5 +11.6,0.475,0.4,1.4,0.091,6.0,28.0,0.9970399999999999,3.07,0.65,10.0333333333333,6 +8.0,0.83,0.27,2.0,0.08,11.0,63.0,0.9965200000000001,3.29,0.48,9.8,4 +7.2,0.605,0.02,1.9,0.096,10.0,31.0,0.995,3.46,0.53,11.8,6 +7.8,0.5,0.09,2.2,0.115,10.0,42.0,0.9971,3.18,0.62,9.5,5 +7.3,0.74,0.08,1.7,0.094,10.0,45.0,0.9957600000000001,3.24,0.5,9.8,5 +6.9,0.54,0.3,2.2,0.08800000000000001,9.0,105.0,0.99725,3.25,1.18,10.5,6 +8.0,0.77,0.32,2.1,0.079,16.0,74.0,0.99656,3.27,0.5,9.8,6 +6.6,0.61,0.0,1.6,0.069,4.0,8.0,0.9939600000000001,3.33,0.37,10.4,4 +8.7,0.78,0.51,1.7,0.415,12.0,66.0,0.99623,3.0,1.17,9.2,5 +7.5,0.58,0.56,3.1,0.153,5.0,14.0,0.9947600000000001,3.21,1.03,11.6,6 +8.7,0.78,0.51,1.7,0.415,12.0,66.0,0.99623,3.0,1.17,9.2,5 +7.7,0.75,0.27,3.8,0.11,34.0,89.0,0.99664,3.24,0.45,9.3,5 +6.8,0.815,0.0,1.2,0.267,16.0,29.0,0.99471,3.32,0.51,9.8,3 +7.2,0.56,0.26,2.0,0.083,13.0,100.0,0.9958600000000001,3.26,0.52,9.9,5 +8.2,0.885,0.2,1.4,0.086,7.0,31.0,0.9946,3.11,0.46,10.0,5 +5.2,0.49,0.26,2.3,0.09,23.0,74.0,0.9953,3.71,0.62,12.2,6 +7.2,0.45,0.15,2.0,0.078,10.0,28.0,0.9960899999999999,3.29,0.51,9.9,6 +7.5,0.57,0.02,2.6,0.077,11.0,35.0,0.9955700000000001,3.36,0.62,10.8,6 +7.5,0.57,0.02,2.6,0.077,11.0,35.0,0.9955700000000001,3.36,0.62,10.8,6 +6.8,0.83,0.09,1.8,0.07400000000000001,4.0,25.0,0.99534,3.38,0.45,9.6,5 +8.0,0.6,0.22,2.1,0.08,25.0,105.0,0.99613,3.3,0.49,9.9,5 +8.0,0.6,0.22,2.1,0.08,25.0,105.0,0.99613,3.3,0.49,9.9,5 +7.1,0.755,0.15,1.8,0.107,20.0,84.0,0.99593,3.19,0.5,9.5,5 +8.0,0.81,0.25,3.4,0.076,34.0,85.0,0.9966799999999999,3.19,0.42,9.2,5 +7.4,0.64,0.07,1.8,0.1,8.0,23.0,0.9961,3.3,0.58,9.6,5 +7.4,0.64,0.07,1.8,0.1,8.0,23.0,0.9961,3.3,0.58,9.6,5 +6.6,0.64,0.31,6.1,0.083,7.0,49.0,0.99718,3.35,0.68,10.3,5 +6.7,0.48,0.02,2.2,0.08,36.0,111.0,0.99524,3.1,0.53,9.7,5 +6.0,0.49,0.0,2.3,0.068,15.0,33.0,0.99292,3.58,0.59,12.5,6 +8.0,0.64,0.22,2.4,0.094,5.0,33.0,0.9961200000000001,3.37,0.58,11.0,5 +7.1,0.62,0.06,1.3,0.07,5.0,12.0,0.9942,3.17,0.48,9.8,5 +8.0,0.52,0.25,2.0,0.078,19.0,59.0,0.9961200000000001,3.3,0.48,10.2,5 +6.4,0.57,0.14,3.9,0.07,27.0,73.0,0.99669,3.32,0.48,9.2,5 +8.6,0.685,0.1,1.6,0.092,3.0,12.0,0.99745,3.31,0.65,9.55,6 +8.7,0.675,0.1,1.6,0.09,4.0,11.0,0.99745,3.31,0.65,9.55,5 +7.3,0.59,0.26,2.0,0.08,17.0,104.0,0.99584,3.28,0.52,9.9,5 +7.0,0.6,0.12,2.2,0.083,13.0,28.0,0.9966,3.52,0.62,10.2,7 +7.2,0.67,0.0,2.2,0.068,10.0,24.0,0.9956,3.42,0.72,11.1,6 +7.9,0.69,0.21,2.1,0.08,33.0,141.0,0.9962,3.25,0.51,9.9,5 +7.9,0.69,0.21,2.1,0.08,33.0,141.0,0.9962,3.25,0.51,9.9,5 +7.6,0.3,0.42,2.0,0.052000000000000005,6.0,24.0,0.9963,3.44,0.82,11.9,6 +7.2,0.33,0.33,1.7,0.061,3.0,13.0,0.996,3.23,1.1,10.0,8 +8.0,0.5,0.39,2.6,0.08199999999999999,12.0,46.0,0.9985,3.43,0.62,10.7,6 +7.7,0.28,0.3,2.0,0.062,18.0,34.0,0.9952,3.28,0.9,11.3,7 +8.2,0.24,0.34,5.1,0.062,8.0,22.0,0.9974,3.22,0.94,10.9,6 +6.0,0.51,0.0,2.1,0.064,40.0,54.0,0.995,3.54,0.93,10.7,6 +8.1,0.29,0.36,2.2,0.048,35.0,53.0,0.995,3.27,1.01,12.4,7 +6.0,0.51,0.0,2.1,0.064,40.0,54.0,0.995,3.54,0.93,10.7,6 +6.6,0.96,0.0,1.8,0.08199999999999999,5.0,16.0,0.9936,3.5,0.44,11.9,6 +6.4,0.47,0.4,2.4,0.071,8.0,19.0,0.9963,3.56,0.73,10.6,6 +8.2,0.24,0.34,5.1,0.062,8.0,22.0,0.9974,3.22,0.94,10.9,6 +9.9,0.57,0.25,2.0,0.10400000000000001,12.0,89.0,0.9963,3.04,0.9,10.1,5 +10.0,0.32,0.59,2.2,0.077,3.0,15.0,0.9994,3.2,0.78,9.6,5 +6.2,0.58,0.0,1.6,0.065,8.0,18.0,0.9966,3.56,0.84,9.4,5 +10.0,0.32,0.59,2.2,0.077,3.0,15.0,0.9994,3.2,0.78,9.6,5 +7.3,0.34,0.33,2.5,0.064,21.0,37.0,0.9952,3.35,0.77,12.1,7 +7.8,0.53,0.01,1.6,0.077,3.0,19.0,0.995,3.16,0.46,9.8,5 +7.7,0.64,0.21,2.2,0.077,32.0,133.0,0.9956,3.27,0.45,9.9,5 +7.8,0.53,0.01,1.6,0.077,3.0,19.0,0.995,3.16,0.46,9.8,5 +7.5,0.4,0.18,1.6,0.079,24.0,58.0,0.9965,3.34,0.58,9.4,5 +7.0,0.54,0.0,2.1,0.079,39.0,55.0,0.9956,3.39,0.84,11.4,6 +6.4,0.53,0.09,3.9,0.12300000000000001,14.0,31.0,0.9968,3.5,0.67,11.0,4 +8.3,0.26,0.37,1.4,0.076,8.0,23.0,0.9974,3.26,0.7,9.6,6 +8.3,0.26,0.37,1.4,0.076,8.0,23.0,0.9974,3.26,0.7,9.6,6 +7.7,0.23,0.37,1.8,0.046,23.0,60.0,0.9971,3.41,0.71,12.1,6 +7.6,0.41,0.33,2.5,0.078,6.0,23.0,0.9957,3.3,0.58,11.2,5 +7.8,0.64,0.0,1.9,0.07200000000000001,27.0,55.0,0.9962,3.31,0.63,11.0,5 +7.9,0.18,0.4,2.2,0.049,38.0,67.0,0.996,3.33,0.93,11.3,5 +7.4,0.41,0.24,1.8,0.066,18.0,47.0,0.9956,3.37,0.62,10.4,5 +7.6,0.43,0.31,2.1,0.069,13.0,74.0,0.9958,3.26,0.54,9.9,6 +5.9,0.44,0.0,1.6,0.042,3.0,11.0,0.9944,3.48,0.85,11.7,6 +6.1,0.4,0.16,1.8,0.069,11.0,25.0,0.9955,3.42,0.74,10.1,7 +10.2,0.54,0.37,15.4,0.214,55.0,95.0,1.00369,3.18,0.77,9.0,6 +10.2,0.54,0.37,15.4,0.214,55.0,95.0,1.00369,3.18,0.77,9.0,6 +10.0,0.38,0.38,1.6,0.16899999999999998,27.0,90.0,0.9991399999999999,3.15,0.65,8.5,5 +6.8,0.915,0.29,4.8,0.07,15.0,39.0,0.99577,3.53,0.54,11.1,5 +7.0,0.59,0.0,1.7,0.052000000000000005,3.0,8.0,0.996,3.41,0.47,10.3,5 +7.3,0.67,0.02,2.2,0.07200000000000001,31.0,92.0,0.99566,3.32,0.68,11.066666666666698,6 +7.2,0.37,0.32,2.0,0.062,15.0,28.0,0.9947,3.23,0.73,11.3,7 +7.4,0.785,0.19,5.2,0.094,19.0,98.0,0.99713,3.16,0.52,9.56666666666667,6 +6.9,0.63,0.02,1.9,0.078,18.0,30.0,0.9971200000000001,3.4,0.75,9.8,5 +6.9,0.58,0.2,1.75,0.057999999999999996,8.0,22.0,0.9932200000000001,3.38,0.49,11.7,5 +7.3,0.67,0.02,2.2,0.07200000000000001,31.0,92.0,0.99566,3.32,0.68,11.1,6 +7.4,0.785,0.19,5.2,0.094,19.0,98.0,0.99713,3.16,0.52,9.6,6 +6.9,0.63,0.02,1.9,0.078,18.0,30.0,0.9971200000000001,3.4,0.75,9.8,5 +6.8,0.67,0.0,1.9,0.08,22.0,39.0,0.9970100000000001,3.4,0.74,9.7,5 +6.9,0.58,0.01,1.9,0.08,40.0,54.0,0.9968299999999999,3.4,0.73,9.7,5 +7.2,0.38,0.31,2.0,0.055999999999999994,15.0,29.0,0.99472,3.23,0.76,11.3,8 +7.2,0.37,0.32,2.0,0.062,15.0,28.0,0.9947,3.23,0.73,11.3,7 +7.8,0.32,0.44,2.7,0.10400000000000001,8.0,17.0,0.9973200000000001,3.33,0.78,11.0,7 +6.6,0.58,0.02,2.0,0.062,37.0,53.0,0.99374,3.35,0.76,11.6,7 +7.6,0.49,0.33,1.9,0.07400000000000001,27.0,85.0,0.9970600000000001,3.41,0.58,9.0,5 +11.7,0.45,0.63,2.2,0.073,7.0,23.0,0.99974,3.21,0.69,10.9,6 +6.5,0.9,0.0,1.6,0.052000000000000005,9.0,17.0,0.99467,3.5,0.63,10.9,6 +6.0,0.54,0.06,1.8,0.05,38.0,89.0,0.99236,3.3,0.5,10.55,6 +7.6,0.49,0.33,1.9,0.07400000000000001,27.0,85.0,0.9970600000000001,3.41,0.58,9.0,5 +8.4,0.29,0.4,1.7,0.067,8.0,20.0,0.99603,3.39,0.6,10.5,5 +7.9,0.2,0.35,1.7,0.054000000000000006,7.0,15.0,0.9945799999999999,3.32,0.8,11.9,7 +6.4,0.42,0.09,2.3,0.054000000000000006,34.0,64.0,0.99724,3.41,0.68,10.4,6 +6.2,0.785,0.0,2.1,0.06,6.0,13.0,0.99664,3.59,0.61,10.0,4 +6.8,0.64,0.03,2.3,0.075,14.0,31.0,0.99545,3.36,0.58,10.4,6 +6.9,0.63,0.01,2.4,0.076,14.0,39.0,0.9952200000000001,3.34,0.53,10.8,6 +6.8,0.59,0.1,1.7,0.063,34.0,53.0,0.9958,3.41,0.67,9.7,5 +6.8,0.59,0.1,1.7,0.063,34.0,53.0,0.9958,3.41,0.67,9.7,5 +7.3,0.48,0.32,2.1,0.062,31.0,54.0,0.9972799999999999,3.3,0.65,10.0,7 +6.7,1.04,0.08,2.3,0.067,19.0,32.0,0.9964799999999999,3.52,0.57,11.0,4 +7.3,0.48,0.32,2.1,0.062,31.0,54.0,0.9972799999999999,3.3,0.65,10.0,7 +7.3,0.98,0.05,2.1,0.061,20.0,49.0,0.99705,3.31,0.55,9.7,3 +10.0,0.69,0.11,1.4,0.084,8.0,24.0,0.9957799999999999,2.88,0.47,9.7,5 +6.7,0.7,0.08,3.75,0.067,8.0,16.0,0.99334,3.43,0.52,12.6,5 +7.6,0.35,0.6,2.6,0.073,23.0,44.0,0.99656,3.38,0.79,11.1,6 +6.1,0.6,0.08,1.8,0.071,14.0,45.0,0.99336,3.38,0.54,11.0,5 +9.9,0.5,0.5,13.8,0.205,48.0,82.0,1.00242,3.16,0.75,8.8,5 +5.3,0.47,0.11,2.2,0.048,16.0,89.0,0.99182,3.54,0.88,13.566666666666698,7 +9.9,0.5,0.5,13.8,0.205,48.0,82.0,1.00242,3.16,0.75,8.8,5 +5.3,0.47,0.11,2.2,0.048,16.0,89.0,0.99182,3.54,0.88,13.6,7 +7.1,0.875,0.05,5.7,0.08199999999999999,3.0,14.0,0.99808,3.4,0.52,10.2,3 +8.2,0.28,0.6,3.0,0.10400000000000001,10.0,22.0,0.99828,3.39,0.68,10.6,5 +5.6,0.62,0.03,1.5,0.08,6.0,13.0,0.99498,3.66,0.62,10.1,4 +8.2,0.28,0.6,3.0,0.10400000000000001,10.0,22.0,0.99828,3.39,0.68,10.6,5 +7.2,0.58,0.54,2.1,0.114,3.0,9.0,0.9971899999999999,3.33,0.57,10.3,4 +8.1,0.33,0.44,1.5,0.042,6.0,12.0,0.9954200000000001,3.35,0.61,10.7,5 +6.8,0.91,0.06,2.0,0.06,4.0,11.0,0.99592,3.53,0.64,10.9,4 +7.0,0.655,0.16,2.1,0.07400000000000001,8.0,25.0,0.9960600000000001,3.37,0.55,9.7,5 +6.8,0.68,0.21,2.1,0.07,9.0,23.0,0.99546,3.38,0.6,10.3,5 +6.0,0.64,0.05,1.9,0.066,9.0,17.0,0.9949600000000001,3.52,0.78,10.6,5 +5.6,0.54,0.04,1.7,0.049,5.0,13.0,0.9942,3.72,0.58,11.4,5 +6.2,0.57,0.1,2.1,0.048,4.0,11.0,0.9944799999999999,3.44,0.76,10.8,6 +7.1,0.22,0.49,1.8,0.039,8.0,18.0,0.99344,3.39,0.56,12.4,6 +5.6,0.54,0.04,1.7,0.049,5.0,13.0,0.9942,3.72,0.58,11.4,5 +6.2,0.65,0.06,1.6,0.05,6.0,18.0,0.9934799999999999,3.57,0.54,11.95,5 +7.7,0.54,0.26,1.9,0.08900000000000001,23.0,147.0,0.99636,3.26,0.59,9.7,5 +6.4,0.31,0.09,1.4,0.066,15.0,28.0,0.99459,3.42,0.7,10.0,7 +7.0,0.43,0.02,1.9,0.08,15.0,28.0,0.99492,3.35,0.81,10.6,6 +7.7,0.54,0.26,1.9,0.08900000000000001,23.0,147.0,0.99636,3.26,0.59,9.7,5 +6.9,0.74,0.03,2.3,0.054000000000000006,7.0,16.0,0.99508,3.45,0.63,11.5,6 +6.6,0.895,0.04,2.3,0.068,7.0,13.0,0.99582,3.53,0.58,10.8,6 +6.9,0.74,0.03,2.3,0.054000000000000006,7.0,16.0,0.99508,3.45,0.63,11.5,6 +7.5,0.725,0.04,1.5,0.076,8.0,15.0,0.99508,3.26,0.53,9.6,5 +7.8,0.82,0.29,4.3,0.083,21.0,64.0,0.9964200000000001,3.16,0.53,9.4,5 +7.3,0.585,0.18,2.4,0.078,15.0,60.0,0.9963799999999999,3.31,0.54,9.8,5 +6.2,0.44,0.39,2.5,0.077,6.0,14.0,0.99555,3.51,0.69,11.0,6 +7.5,0.38,0.57,2.3,0.106,5.0,12.0,0.99605,3.36,0.55,11.4,6 +6.7,0.76,0.02,1.8,0.078,6.0,12.0,0.996,3.55,0.63,9.95,3 +6.8,0.81,0.05,2.0,0.07,6.0,14.0,0.9956200000000001,3.51,0.66,10.8,6 +7.5,0.38,0.57,2.3,0.106,5.0,12.0,0.99605,3.36,0.55,11.4,6 +7.1,0.27,0.6,2.1,0.07400000000000001,17.0,25.0,0.9981399999999999,3.38,0.72,10.6,6 +7.9,0.18,0.4,1.8,0.062,7.0,20.0,0.9941,3.28,0.7,11.1,5 +6.4,0.36,0.21,2.2,0.047,26.0,48.0,0.99661,3.47,0.77,9.7,6 +7.1,0.69,0.04,2.1,0.068,19.0,27.0,0.9971200000000001,3.44,0.67,9.8,5 +6.4,0.79,0.04,2.2,0.061,11.0,17.0,0.9958799999999999,3.53,0.65,10.4,6 +6.4,0.56,0.15,1.8,0.078,17.0,65.0,0.9929399999999999,3.33,0.6,10.5,6 +6.9,0.84,0.21,4.1,0.07400000000000001,16.0,65.0,0.9984200000000001,3.53,0.72,9.23333333333333,6 +6.9,0.84,0.21,4.1,0.07400000000000001,16.0,65.0,0.9984200000000001,3.53,0.72,9.25,6 +6.1,0.32,0.25,2.3,0.071,23.0,58.0,0.9963299999999999,3.42,0.97,10.6,5 +6.5,0.53,0.06,2.0,0.063,29.0,44.0,0.9948899999999999,3.38,0.83,10.3,6 +7.4,0.47,0.46,2.2,0.114,7.0,20.0,0.9964700000000001,3.32,0.63,10.5,5 +6.6,0.7,0.08,2.6,0.106,14.0,27.0,0.99665,3.44,0.58,10.2,5 +6.5,0.53,0.06,2.0,0.063,29.0,44.0,0.9948899999999999,3.38,0.83,10.3,6 +6.9,0.48,0.2,1.9,0.08199999999999999,9.0,23.0,0.99585,3.39,0.43,9.05,4 +6.1,0.32,0.25,2.3,0.071,23.0,58.0,0.9963299999999999,3.42,0.97,10.6,5 +6.8,0.48,0.25,2.0,0.076,29.0,61.0,0.9953,3.34,0.6,10.4,5 +6.0,0.42,0.19,2.0,0.075,22.0,47.0,0.9952200000000001,3.39,0.78,10.0,6 +6.7,0.48,0.08,2.1,0.064,18.0,34.0,0.9955200000000001,3.33,0.64,9.7,5 +6.8,0.47,0.08,2.2,0.064,18.0,38.0,0.9955299999999999,3.3,0.65,9.6,6 +7.1,0.53,0.07,1.7,0.071,15.0,24.0,0.9951,3.29,0.66,10.8,6 +7.9,0.29,0.49,2.2,0.096,21.0,59.0,0.9971399999999999,3.31,0.67,10.1,6 +7.1,0.69,0.08,2.1,0.063,42.0,52.0,0.99608,3.42,0.6,10.2,6 +6.6,0.44,0.09,2.2,0.063,9.0,18.0,0.99444,3.42,0.69,11.3,6 +6.1,0.705,0.1,2.8,0.081,13.0,28.0,0.99631,3.6,0.66,10.2,5 +7.2,0.53,0.13,2.0,0.057999999999999996,18.0,22.0,0.9957299999999999,3.21,0.68,9.9,6 +8.0,0.39,0.3,1.9,0.07400000000000001,32.0,84.0,0.9971700000000001,3.39,0.61,9.0,5 +6.6,0.56,0.14,2.4,0.064,13.0,29.0,0.99397,3.42,0.62,11.7,7 +7.0,0.55,0.13,2.2,0.075,15.0,35.0,0.9959,3.36,0.59,9.7,6 +6.1,0.53,0.08,1.9,0.077,24.0,45.0,0.9952799999999999,3.6,0.68,10.3,6 +5.4,0.58,0.08,1.9,0.059000000000000004,20.0,31.0,0.99484,3.5,0.64,10.2,6 +6.2,0.64,0.09,2.5,0.081,15.0,26.0,0.9953799999999999,3.57,0.63,12.0,5 +7.2,0.39,0.32,1.8,0.065,34.0,60.0,0.9971399999999999,3.46,0.78,9.9,5 +6.2,0.52,0.08,4.4,0.071,11.0,32.0,0.99646,3.56,0.63,11.6,6 +7.4,0.25,0.29,2.2,0.054000000000000006,19.0,49.0,0.99666,3.4,0.76,10.9,7 +6.7,0.855,0.02,1.9,0.064,29.0,38.0,0.99472,3.3,0.56,10.75,6 +11.1,0.44,0.42,2.2,0.064,14.0,19.0,0.9975799999999999,3.25,0.57,10.4,6 +8.4,0.37,0.43,2.3,0.063,12.0,19.0,0.9955,3.17,0.81,11.2,7 +6.5,0.63,0.33,1.8,0.059000000000000004,16.0,28.0,0.99531,3.36,0.64,10.1,6 +7.0,0.57,0.02,2.0,0.07200000000000001,17.0,26.0,0.99575,3.36,0.61,10.2,5 +6.3,0.6,0.1,1.6,0.048,12.0,26.0,0.99306,3.55,0.51,12.1,5 +11.2,0.4,0.5,2.0,0.099,19.0,50.0,0.9978299999999999,3.1,0.58,10.4,5 +7.4,0.36,0.3,1.8,0.07400000000000001,17.0,24.0,0.99419,3.24,0.7,11.4,8 +7.1,0.68,0.0,2.3,0.087,17.0,26.0,0.9978299999999999,3.45,0.53,9.5,5 +7.1,0.67,0.0,2.3,0.083,18.0,27.0,0.9976799999999999,3.44,0.54,9.4,5 +6.3,0.68,0.01,3.7,0.10300000000000001,32.0,54.0,0.9958600000000001,3.51,0.66,11.3,6 +7.3,0.735,0.0,2.2,0.08,18.0,28.0,0.99765,3.41,0.6,9.4,5 +6.6,0.855,0.02,2.4,0.062,15.0,23.0,0.9962700000000001,3.54,0.6,11.0,6 +7.0,0.56,0.17,1.7,0.065,15.0,24.0,0.9951399999999999,3.44,0.68,10.55,7 +6.6,0.88,0.04,2.2,0.066,12.0,20.0,0.99636,3.53,0.56,9.9,5 +6.6,0.855,0.02,2.4,0.062,15.0,23.0,0.9962700000000001,3.54,0.6,11.0,6 +6.9,0.63,0.33,6.7,0.235,66.0,115.0,0.99787,3.22,0.56,9.5,5 +7.8,0.6,0.26,2.0,0.08,31.0,131.0,0.9962200000000001,3.21,0.52,9.9,5 +7.8,0.6,0.26,2.0,0.08,31.0,131.0,0.9962200000000001,3.21,0.52,9.9,5 +7.8,0.6,0.26,2.0,0.08,31.0,131.0,0.9962200000000001,3.21,0.52,9.9,5 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +6.7,0.67,0.02,1.9,0.061,26.0,42.0,0.9948899999999999,3.39,0.82,10.9,6 +6.7,0.16,0.64,2.1,0.059000000000000004,24.0,52.0,0.9949399999999999,3.34,0.71,11.2,6 +7.2,0.695,0.13,2.0,0.076,12.0,20.0,0.99546,3.29,0.54,10.1,5 +7.0,0.56,0.13,1.6,0.077,25.0,42.0,0.99629,3.34,0.59,9.2,5 +6.2,0.51,0.14,1.9,0.055999999999999994,15.0,34.0,0.9939600000000001,3.48,0.57,11.5,6 +6.4,0.36,0.53,2.2,0.23,19.0,35.0,0.9934,3.37,0.93,12.4,6 +6.4,0.38,0.14,2.2,0.038,15.0,25.0,0.9951399999999999,3.44,0.65,11.1,6 +7.3,0.69,0.32,2.2,0.069,35.0,104.0,0.9963200000000001,3.33,0.51,9.5,5 +6.0,0.58,0.2,2.4,0.075,15.0,50.0,0.99467,3.58,0.67,12.5,6 +5.6,0.31,0.78,13.9,0.07400000000000001,23.0,92.0,0.99677,3.39,0.48,10.5,6 +7.5,0.52,0.4,2.2,0.06,12.0,20.0,0.99474,3.26,0.64,11.8,6 +8.0,0.3,0.63,1.6,0.081,16.0,29.0,0.9958799999999999,3.3,0.78,10.8,6 +6.2,0.7,0.15,5.1,0.076,13.0,27.0,0.9962200000000001,3.54,0.6,11.9,6 +6.8,0.67,0.15,1.8,0.11800000000000001,13.0,20.0,0.9954,3.42,0.67,11.3,6 +6.2,0.56,0.09,1.7,0.053,24.0,32.0,0.9940200000000001,3.54,0.6,11.3,5 +7.4,0.35,0.33,2.4,0.068,9.0,26.0,0.9947,3.36,0.6,11.9,6 +6.2,0.56,0.09,1.7,0.053,24.0,32.0,0.9940200000000001,3.54,0.6,11.3,5 +6.1,0.715,0.1,2.6,0.053,13.0,27.0,0.9936200000000001,3.57,0.5,11.9,5 +6.2,0.46,0.29,2.1,0.07400000000000001,32.0,98.0,0.9957799999999999,3.33,0.62,9.8,5 +6.7,0.32,0.44,2.4,0.061,24.0,34.0,0.99484,3.29,0.8,11.6,7 +7.2,0.39,0.44,2.6,0.066,22.0,48.0,0.9949399999999999,3.3,0.84,11.5,6 +7.5,0.31,0.41,2.4,0.065,34.0,60.0,0.99492,3.34,0.85,11.4,6 +5.8,0.61,0.11,1.8,0.066,18.0,28.0,0.9948299999999999,3.55,0.66,10.9,6 +7.2,0.66,0.33,2.5,0.068,34.0,102.0,0.9941399999999999,3.27,0.78,12.8,6 +6.6,0.725,0.2,7.8,0.073,29.0,79.0,0.9977,3.29,0.54,9.2,5 +6.3,0.55,0.15,1.8,0.077,26.0,35.0,0.9931399999999999,3.32,0.82,11.6,6 +5.4,0.74,0.09,1.7,0.08900000000000001,16.0,26.0,0.9940200000000001,3.67,0.56,11.6,6 +6.3,0.51,0.13,2.3,0.076,29.0,40.0,0.99574,3.42,0.75,11.0,6 +6.8,0.62,0.08,1.9,0.068,28.0,38.0,0.99651,3.42,0.82,9.5,6 +6.2,0.6,0.08,2.0,0.09,32.0,44.0,0.9949,3.45,0.58,10.5,5 +5.9,0.55,0.1,2.2,0.062,39.0,51.0,0.9951200000000001,3.52,0.76,11.2,6 +6.3,0.51,0.13,2.3,0.076,29.0,40.0,0.99574,3.42,0.75,11.0,6 +5.9,0.645,0.12,2.0,0.075,32.0,44.0,0.9954700000000001,3.57,0.71,10.2,5 +6.0,0.31,0.47,3.6,0.067,18.0,42.0,0.99549,3.39,0.66,11.0,6 diff --git a/Programming/EARIN/lab5/.gitignore b/Programming/EARIN/lab5/.gitignore new file mode 100644 index 00000000..8fce6030 --- /dev/null +++ b/Programming/EARIN/lab5/.gitignore @@ -0,0 +1 @@ +data/ diff --git a/Programming/EARIN/lab5/code/.pylintrc b/Programming/EARIN/lab5/code/.pylintrc new file mode 100644 index 00000000..e0fd784e --- /dev/null +++ b/Programming/EARIN/lab5/code/.pylintrc @@ -0,0 +1,9 @@ +[TYPECHECK] + +# List of members which are set dynamically and missed by Pylint inference +# system, and so shouldn't trigger E1101 when accessed. (Module 'torch' has no 'max' member) +generated-members=numpy.*, torch.* + +[DESIGN] +# Maximum number of statements in function / method body +max-statements=16 diff --git a/Programming/EARIN/lab5/code/example.py b/Programming/EARIN/lab5/code/example.py new file mode 100644 index 00000000..299bcc73 --- /dev/null +++ b/Programming/EARIN/lab5/code/example.py @@ -0,0 +1,120 @@ +# numpy for loading dataset +import numpy as np +# pytorch for deep learning models +import torch +# nn like neural network +import torch.nn as nn +import torch.optim as optim + +# Pima indians describes patient medical data and whether they had diabetes for last 5 years +# It is binary classification (they could either have diabetes 1 or not 0) +# load the file as a matrix of numbers, +dataset = np.loadtxt('pima-indians-diabetes.csv', delimiter=',') +input_columns = 8 +# split into input (X) -> in this case everything beside info whether patient had diabetes or not is input +# We are splitting data into two subsets by using NumPy slice operator : and choose first 8 columns using 0:8 slice +X = dataset[:,0:input_columns] +# and output (y) variables -> in this case we are only interested whether patient had diabetes or not as an output +# you can simplify that y = f(X) +# We are splitting the data by using slice operator : and choosing last column +y = dataset[:,input_columns] + +# we need to convert this data to pytorch tensors +# Pytorch usually operates on 32-bit floating point and NumPy by default uses 64 bit floating point +X = torch.tensor(X, dtype=torch.float32) +# We can also correct the shape to fit what PyTorch would expect (here we are converting n vectors to n x 1 matrix) +# This simplifies handling matrix multiplication operations (which are the basis of deep learning models) +# reshape is converting the output variable y from a 1-dimensional NumPy array to a 2-dimensional PyTorch tensor with a shape of (n, 1), where n is the number of samples in the dataset. +y = torch.tensor(y, dtype=torch.float32).reshape(-1, 1) + +# define the model +# this class is a subclass of nn.Module -> base class provided by PyTorch for building neural network models. +class PimaClassifier(nn.Module): + def __init__(self): + super().__init__() + # There are 3 (fully connected) layers in class, each with their activation function + # creates Linear layer, it maps input to a hidden layer of 12 neurons + # input features have a size of 8 (same number as number of features in pima indians diabetes dataset) + first_output_neurons = 12 + self.hidden1 = nn.Linear(input_columns, first_output_neurons) + # This creates ReLU (rectified linear unit) activation function applied after first hidden layer + self.act1 = nn.ReLU() + + # This maps the output of first layer (which was 12 neurons) to new hidden layer of 8 neurons + second_output_neurons = 8 + self.hidden2 = nn.Linear(first_output_neurons, second_output_neurons) + # ReLU activation function applied after second hidden layer + self.act2 = nn.ReLU() + + # We map output of second layer to a single output neuron -> which will represent the predicted + # probability of a sample having diabetes + self.output = nn.Linear(second_output_neurons, 1) + # sigmoid function forces output to be either 0 or 1 + self.act_output = nn.Sigmoid() + + # forward pass is computation of output based on input 'x' + def forward(self, x): + # Applies first hidden layer (and then ReLU activation) to input x + x = self.act1(self.hidden1(x)) + # Applies second hidden layer (and then ReLU activation) to input x + x = self.act2(self.hidden2(x)) + # Applies output layer (and then Sigmoid activation) to input x + x = self.act_output(self.output(x)) + # returns final output (0 or 1) + return x + +# Create object from model class +model = PimaClassifier() +print(model) + +# train the model +# first we need to specify what is the goal of training +# we have input X and output y and we want the model to be as close to y as possible +# Since this is binary classification problem we will use "binary cross entropy" to measure the distance between +# our prediction and y +loss_fn = nn.BCELoss() # binary cross entropy +# Optimizer adjust model weights to produce better output +# Its described as being able to tune itself to a lot of problems +# inputs are: +# parameters which it will optimize (from the model) +# and lr (learning rate) which is step size of each iteration +optimizer = optim.Adam(model.parameters(), lr=0.001) + + +# epoch is the entire training dataset passed to a model once +n_epochs = 100 +# batch is one or more sample passed to model +# number of epochs and the size of a batch can be chosen experimentally by trial and error. +# a lot of epochs and big size of batch means more time and more memory consumption but more accurate results +batch_size = 10 + +# We split dataset into batches and pass batches one by one into a model to training loop +# after using all batches we finish one epoch and can start over again to refine the model +# we use two nested for loops for training, one is for epochs +for epoch in range(n_epochs): + # and one for batches + for i in range(0, len(X), batch_size): + # Split X data into a batch with the size from batch_size + Xbatch = X[i:i+batch_size] + # run the model on the batch and return "batched" output + y_pred = model(Xbatch) + # Split y data into a batch with the size from batch_size + ybatch = y[i:i+batch_size] + # Compare loss + loss = loss_fn(y_pred, ybatch) + # optimize model + optimizer.zero_grad() + # calculate the inaccuracy + loss.backward() + # optimizer takes next step + optimizer.step() + +# compute final accuracy +y_pred = model(X) +accuracy = (y_pred.round() == y).float().mean() +print(f"Accuracy {accuracy}") + +# make class predictions with the model +predictions = (model(X) > 0.5).int() +for i in range(5): + print('%s => %d (expected %d)' % (X[i].tolist(), predictions[i], y[i])) \ No newline at end of file diff --git a/Programming/EARIN/lab5/code/loss-lr0.001-bs1-hl2-w128-Adam.png b/Programming/EARIN/lab5/code/loss-lr0.001-bs1-hl2-w128-Adam.png new file mode 100644 index 00000000..fd8dbecd Binary files /dev/null and b/Programming/EARIN/lab5/code/loss-lr0.001-bs1-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/code/loss-lr0.001-bs64-hl0-w128-Adam.png b/Programming/EARIN/lab5/code/loss-lr0.001-bs64-hl0-w128-Adam.png new file mode 100644 index 00000000..44df845e Binary files /dev/null and b/Programming/EARIN/lab5/code/loss-lr0.001-bs64-hl0-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/code/main.py b/Programming/EARIN/lab5/code/main.py new file mode 100644 index 00000000..a612d5e0 --- /dev/null +++ b/Programming/EARIN/lab5/code/main.py @@ -0,0 +1,310 @@ +""" Implementation of a network analyzing MNIST dataset """ +import torch +from torch import nn +from torch import optim +from torchvision import datasets, transforms +import matplotlib.pyplot as plt +import time + + +def set_hyperparameters(): + """ sets hyperparameters used throughout the network """ + return { + "num_epochs": 5, + "init_input_size": 28 * 28, # MNIST images are 28x28 pixels + "num_classes": 10, + } + + +def load_datasets(): + """ Loads train and test dataset from MNIST """ + train_dataset = datasets.MNIST( + root="./data", train=True, transform=transforms.ToTensor(), download=True + ) + test_dataset = datasets.MNIST( + root="./data", train=False, transform=transforms.ToTensor(), download=True + ) + return train_dataset, test_dataset + + +def create_data_loaders(train_dataset, test_dataset): + """ Create train and test data loaders """ + train_loader = torch.utils.data.DataLoader( + dataset=train_dataset, batch_size=BATCH_SIZE, shuffle=True + ) + test_loader = torch.utils.data.DataLoader( + dataset=test_dataset, batch_size=BATCH_SIZE, shuffle=False + ) + return train_loader, test_loader + + +# Lists to store loss and accuracy values +loss_values = [] +train_acc_values = [] +val_acc_values = [] + + +def define_model(hyperparameters): + """ Define the multilayer perceptron training_parameters['model'] """ + # Define the multilayer perceptron model + model = nn.Sequential() + model.add_module('flatten', nn.Flatten()) + input_size = hyperparameters['init_input_size'] + for i in range(NUM_HIDDEN_LAYERS): + model.add_module(f'linear{i}', nn.Linear(input_size, WIDTH)) + model.add_module(f'relu{i}', nn.ReLU()) + input_size = WIDTH + model.add_module('output', nn.Linear( + input_size, hyperparameters['num_classes'])) + return model + + +def get_optimizer(model): + """ Return optimizer function """ + if OPTIMIZER_TYPE == 'SGD': + return optim.SGD(model.parameters(), lr=LEARNING_RATE) + if OPTIMIZER_TYPE == 'SGD_Momentum': + return optim.SGD(model.parameters(), lr=LEARNING_RATE, momentum=0.9) + if OPTIMIZER_TYPE == 'Adam': + return optim.Adam(model.parameters(), lr=LEARNING_RATE) + raise ValueError("Unsupported optimizer type!") + + +def initial_configuration(): + """ + Perform all operations needed for training network + """ + # Set random seed for reproducibility + torch.manual_seed(42) + hyperparameters = set_hyperparameters() + # Load MNIST dataset and apply transformations + train_dataset, test_dataset = load_datasets() + train_loader, test_loader = create_data_loaders( + train_dataset, test_dataset) + model = define_model(hyperparameters) + # Loss function + criterion = nn.CrossEntropyLoss() + # training_parameters['optimizer'] + optimizer = get_optimizer(model) + return hyperparameters, train_loader, test_loader, model, criterion, optimizer + + +def single_train_iteration( + data, training_parameters, targets, batch_idx, epoch +): + """ + Train network for single batch + """ + # Reshape the input data + data = data.view(data.size(0), -1) + # Forward pass + outputs = training_parameters['model'](data) + loss = training_parameters['criterion'](outputs, targets) + # Backward pass and optimization + training_parameters['optimizer'].zero_grad() + loss.backward() + training_parameters['optimizer'].step() + # Print loss value for every learning step + if (batch_idx + 1) % 100 == 0: + print( + f''' + Epoch [{epoch+1}/{training_parameters['hyperparameters']["num_epochs"]}], + Step [{batch_idx+1}/{len(training_parameters['loaders']['train_loader'])}], + Loss: {loss.item():.4f} + ''' + ) + # Append loss value for every learning step + loss_values.append(loss.item()) + return data, training_parameters['optimizer'] + + +def set_loaders(train_loader, test_loader): + """ + Put train and test loaders into one object + """ + return { + 'train_loader': train_loader, + 'test_loader': test_loader + } + + +def set_training_parameters(hyperparameters, loaders, model, criterion, optimizer): + """ + Put all training parameters into one object + """ + return { + 'hyperparameters': hyperparameters, + 'loaders': { + 'train_loader': loaders['train_loader'], + 'test_loader': loaders['test_loader'] + }, + 'model': model, + 'criterion': criterion, + 'optimizer': optimizer, + } + + +def training_loop(training_parameters, print_info=True): + """ + Train network for all epochs + """ + epochs_num = training_parameters["hyperparameters"]["num_epochs"] + # Training loop + for epoch in range(epochs_num): + for batch_idx, (data, targets) in enumerate(training_parameters['loaders']['train_loader']): + data, training_parameters['optimizer'] = single_train_iteration( + data, training_parameters, targets, batch_idx, epoch + ) + calculate_accuracy_epoch( + training_parameters, epoch, print_info) + calculate_validation_set_accuracy( + training_parameters, epoch, print_info) + return epoch, training_parameters['loaders']['train_loader'] + + +def calculate_accuracy_epoch(training_parameters, epoch, print_info=True): + """ Calculate accuracy on train set after each epoch """ + correct = 0 + total = 0 + for data, targets in training_parameters['loaders']['train_loader']: + data = data.view(data.size(0), -1) + outputs = training_parameters['model'](data) + _, predicted = torch.max(outputs.data, 1) + total += targets.size(0) + correct += (predicted == targets).sum().item() + train_accuracy = 100 * correct / total + if print_info: + print( + f"Accuracy on Train Set after Epoch {epoch+1}: {train_accuracy:.2f}%") + train_acc_values.append(train_accuracy) + + +def calculate_validation_set_accuracy(training_parameters, epoch, print_info=True): + """ Calculate accuracy on validation set after each epoch """ + correct = 0 + total = 0 + for data, targets in training_parameters['loaders']['test_loader']: + data = data.view(data.size(0), -1) + outputs = training_parameters['model'](data) + _, predicted = torch.max(outputs.data, 1) + total += targets.size(0) + correct += (predicted == targets).sum().item() + + validation_accuracy = 100 * correct / total + if print_info: + print( + f"Accuracy on Validation Set after Epoch {epoch+1}: {validation_accuracy:.2f}%" + ) + print("---") + val_acc_values.append(validation_accuracy) + + +def main_part(show_plot=True): + ( + HYPERPARAMETERS, + TRAIN_LOADER, + TEST_LOADER, + MODEL, + CRITERION, + OPTIMIZER, + ) = initial_configuration() + start_time = time.time() + LOADERS = set_loaders( + TRAIN_LOADER, TEST_LOADER) + TRAINING_PARAMETERS = set_training_parameters( + HYPERPARAMETERS, LOADERS, MODEL, CRITERION, OPTIMIZER) + training_loop(TRAINING_PARAMETERS, show_plot) + file = open("results.txt", "a") + file.write( + "-------------------------------------------------------------------------------------" + "\n") + file.write( + f"loss-lr{LEARNING_RATE}-bs{BATCH_SIZE}-hl{NUM_HIDDEN_LAYERS}-w{WIDTH}-{OPTIMIZER_TYPE}" + "\n") + file.write(f"Execution time: {(time.time() - start_time)}" + "\n") + file.write( + "-------------------------------------------------------------------------------------" + "\n") + + # Plot the loss value for every learning step + learning_step_title = f'loss-lr{LEARNING_RATE}-bs{BATCH_SIZE}-hl{NUM_HIDDEN_LAYERS}-w{WIDTH}-{OPTIMIZER_TYPE}.png' + plt.plot(loss_values) + plt.xlabel('Learning Step') + plt.ylabel('Loss') + plt.title(learning_step_title) + plt.savefig(learning_step_title + ) + if show_plot: + plt.show() + plt.close() + + # Plot the accuracy on train set after each epoch + train_accuracy_title = f'trainAccuracy-lr{LEARNING_RATE}-bs{BATCH_SIZE}-hl{NUM_HIDDEN_LAYERS}-w{WIDTH}-{OPTIMIZER_TYPE}.png' + plt.plot(train_acc_values) + plt.xlabel('Epoch') + plt.ylabel('Train Accuracy') + plt.title(train_accuracy_title) + plt.savefig( + train_accuracy_title) + if show_plot: + plt.show() + plt.close() + + # Plot the accuracy on validation set after each epoch + validation_accuracy_title = f'validationAccuracy-lr{LEARNING_RATE}-bs{BATCH_SIZE}-hl{NUM_HIDDEN_LAYERS}-w{WIDTH}-{OPTIMIZER_TYPE}.png' + plt.plot(val_acc_values) + plt.xlabel('Epoch') + plt.ylabel('Validation Accuracy') + plt.title(validation_accuracy_title) + plt.savefig( + validation_accuracy_title) + if show_plot: + plt.show() + plt.close() + + +if __name__ == "__main__": + LEARNING_RATE = 0.001 + BATCH_SIZE = 64 + NUM_HIDDEN_LAYERS = 2 + WIDTH = 128 + OPTIMIZER_TYPE = 'Adam' + main_part(True) + """ + learning_rate_values = [0.1, 0.01, 0.001] + i = 0 + MAX_TESTS = 17 + for lr in learning_rate_values: + LEARNING_RATE = lr + main_part(False) + i += 1 + print(f"Test {i}/{MAX_TESTS} ran") + LEARNING_RATE = 0.001 + + batch_size_values = [64, 128, 256] + for bs in batch_size_values: + BATCH_SIZE = bs + main_part(False) + i += 1 + print(f"Test {i}/{MAX_TESTS} ran") + BATCH_SIZE = 64 + + hidden_layers_values = [1, 2, 3] + for hl in hidden_layers_values: + NUM_HIDDEN_LAYERS = hl + main_part(False) + i += 1 + print(f"Test {i}/{MAX_TESTS} ran") + NUM_HIDDEN_LAYERS = 2 + + width_values = [64, 128, 256, 512, 1024] + for width in width_values: + WIDTH = width + main_part(False) + i += 1 + print(f"Test {i}/{MAX_TESTS} ran") + WIDTH = 128 + + for optimizer in ['SGD', 'SGD_Momentum', 'Adam']: + OPTIMIZER_TYPE = optimizer + main_part(False) + i += 1 + print(f"Test {i}/{MAX_TESTS} ran") + """ diff --git a/Programming/EARIN/lab5/code/pima-indians-diabetes.csv b/Programming/EARIN/lab5/code/pima-indians-diabetes.csv new file mode 100644 index 00000000..9c3e9b8c --- /dev/null +++ b/Programming/EARIN/lab5/code/pima-indians-diabetes.csv @@ -0,0 +1,768 @@ +6,148,72,35,0,33.6,0.627,50,1 +1,85,66,29,0,26.6,0.351,31,0 +8,183,64,0,0,23.3,0.672,32,1 +1,89,66,23,94,28.1,0.167,21,0 +0,137,40,35,168,43.1,2.288,33,1 +5,116,74,0,0,25.6,0.201,30,0 +3,78,50,32,88,31.0,0.248,26,1 +10,115,0,0,0,35.3,0.134,29,0 +2,197,70,45,543,30.5,0.158,53,1 +8,125,96,0,0,0.0,0.232,54,1 +4,110,92,0,0,37.6,0.191,30,0 +10,168,74,0,0,38.0,0.537,34,1 +10,139,80,0,0,27.1,1.441,57,0 +1,189,60,23,846,30.1,0.398,59,1 +5,166,72,19,175,25.8,0.587,51,1 +7,100,0,0,0,30.0,0.484,32,1 +0,118,84,47,230,45.8,0.551,31,1 +7,107,74,0,0,29.6,0.254,31,1 +1,103,30,38,83,43.3,0.183,33,0 +1,115,70,30,96,34.6,0.529,32,1 +3,126,88,41,235,39.3,0.704,27,0 +8,99,84,0,0,35.4,0.388,50,0 +7,196,90,0,0,39.8,0.451,41,1 +9,119,80,35,0,29.0,0.263,29,1 +11,143,94,33,146,36.6,0.254,51,1 +10,125,70,26,115,31.1,0.205,41,1 +7,147,76,0,0,39.4,0.257,43,1 +1,97,66,15,140,23.2,0.487,22,0 +13,145,82,19,110,22.2,0.245,57,0 +5,117,92,0,0,34.1,0.337,38,0 +5,109,75,26,0,36.0,0.546,60,0 +3,158,76,36,245,31.6,0.851,28,1 +3,88,58,11,54,24.8,0.267,22,0 +6,92,92,0,0,19.9,0.188,28,0 +10,122,78,31,0,27.6,0.512,45,0 +4,103,60,33,192,24.0,0.966,33,0 +11,138,76,0,0,33.2,0.420,35,0 +9,102,76,37,0,32.9,0.665,46,1 +2,90,68,42,0,38.2,0.503,27,1 +4,111,72,47,207,37.1,1.390,56,1 +3,180,64,25,70,34.0,0.271,26,0 +7,133,84,0,0,40.2,0.696,37,0 +7,106,92,18,0,22.7,0.235,48,0 +9,171,110,24,240,45.4,0.721,54,1 +7,159,64,0,0,27.4,0.294,40,0 +0,180,66,39,0,42.0,1.893,25,1 +1,146,56,0,0,29.7,0.564,29,0 +2,71,70,27,0,28.0,0.586,22,0 +7,103,66,32,0,39.1,0.344,31,1 +7,105,0,0,0,0.0,0.305,24,0 +1,103,80,11,82,19.4,0.491,22,0 +1,101,50,15,36,24.2,0.526,26,0 +5,88,66,21,23,24.4,0.342,30,0 +8,176,90,34,300,33.7,0.467,58,1 +7,150,66,42,342,34.7,0.718,42,0 +1,73,50,10,0,23.0,0.248,21,0 +7,187,68,39,304,37.7,0.254,41,1 +0,100,88,60,110,46.8,0.962,31,0 +0,146,82,0,0,40.5,1.781,44,0 +0,105,64,41,142,41.5,0.173,22,0 +2,84,0,0,0,0.0,0.304,21,0 +8,133,72,0,0,32.9,0.270,39,1 +5,44,62,0,0,25.0,0.587,36,0 +2,141,58,34,128,25.4,0.699,24,0 +7,114,66,0,0,32.8,0.258,42,1 +5,99,74,27,0,29.0,0.203,32,0 +0,109,88,30,0,32.5,0.855,38,1 +2,109,92,0,0,42.7,0.845,54,0 +1,95,66,13,38,19.6,0.334,25,0 +4,146,85,27,100,28.9,0.189,27,0 +2,100,66,20,90,32.9,0.867,28,1 +5,139,64,35,140,28.6,0.411,26,0 +13,126,90,0,0,43.4,0.583,42,1 +4,129,86,20,270,35.1,0.231,23,0 +1,79,75,30,0,32.0,0.396,22,0 +1,0,48,20,0,24.7,0.140,22,0 +7,62,78,0,0,32.6,0.391,41,0 +5,95,72,33,0,37.7,0.370,27,0 +0,131,0,0,0,43.2,0.270,26,1 +2,112,66,22,0,25.0,0.307,24,0 +3,113,44,13,0,22.4,0.140,22,0 +2,74,0,0,0,0.0,0.102,22,0 +7,83,78,26,71,29.3,0.767,36,0 +0,101,65,28,0,24.6,0.237,22,0 +5,137,108,0,0,48.8,0.227,37,1 +2,110,74,29,125,32.4,0.698,27,0 +13,106,72,54,0,36.6,0.178,45,0 +2,100,68,25,71,38.5,0.324,26,0 +15,136,70,32,110,37.1,0.153,43,1 +1,107,68,19,0,26.5,0.165,24,0 +1,80,55,0,0,19.1,0.258,21,0 +4,123,80,15,176,32.0,0.443,34,0 +7,81,78,40,48,46.7,0.261,42,0 +4,134,72,0,0,23.8,0.277,60,1 +2,142,82,18,64,24.7,0.761,21,0 +6,144,72,27,228,33.9,0.255,40,0 +2,92,62,28,0,31.6,0.130,24,0 +1,71,48,18,76,20.4,0.323,22,0 +6,93,50,30,64,28.7,0.356,23,0 +1,122,90,51,220,49.7,0.325,31,1 +1,163,72,0,0,39.0,1.222,33,1 +1,151,60,0,0,26.1,0.179,22,0 +0,125,96,0,0,22.5,0.262,21,0 +1,81,72,18,40,26.6,0.283,24,0 +2,85,65,0,0,39.6,0.930,27,0 +1,126,56,29,152,28.7,0.801,21,0 +1,96,122,0,0,22.4,0.207,27,0 +4,144,58,28,140,29.5,0.287,37,0 +3,83,58,31,18,34.3,0.336,25,0 +0,95,85,25,36,37.4,0.247,24,1 +3,171,72,33,135,33.3,0.199,24,1 +8,155,62,26,495,34.0,0.543,46,1 +1,89,76,34,37,31.2,0.192,23,0 +4,76,62,0,0,34.0,0.391,25,0 +7,160,54,32,175,30.5,0.588,39,1 +4,146,92,0,0,31.2,0.539,61,1 +5,124,74,0,0,34.0,0.220,38,1 +5,78,48,0,0,33.7,0.654,25,0 +4,97,60,23,0,28.2,0.443,22,0 +4,99,76,15,51,23.2,0.223,21,0 +0,162,76,56,100,53.2,0.759,25,1 +6,111,64,39,0,34.2,0.260,24,0 +2,107,74,30,100,33.6,0.404,23,0 +5,132,80,0,0,26.8,0.186,69,0 +0,113,76,0,0,33.3,0.278,23,1 +1,88,30,42,99,55.0,0.496,26,1 +3,120,70,30,135,42.9,0.452,30,0 +1,118,58,36,94,33.3,0.261,23,0 +1,117,88,24,145,34.5,0.403,40,1 +0,105,84,0,0,27.9,0.741,62,1 +4,173,70,14,168,29.7,0.361,33,1 +9,122,56,0,0,33.3,1.114,33,1 +3,170,64,37,225,34.5,0.356,30,1 +8,84,74,31,0,38.3,0.457,39,0 +2,96,68,13,49,21.1,0.647,26,0 +2,125,60,20,140,33.8,0.088,31,0 +0,100,70,26,50,30.8,0.597,21,0 +0,93,60,25,92,28.7,0.532,22,0 +0,129,80,0,0,31.2,0.703,29,0 +5,105,72,29,325,36.9,0.159,28,0 +3,128,78,0,0,21.1,0.268,55,0 +5,106,82,30,0,39.5,0.286,38,0 +2,108,52,26,63,32.5,0.318,22,0 +10,108,66,0,0,32.4,0.272,42,1 +4,154,62,31,284,32.8,0.237,23,0 +0,102,75,23,0,0.0,0.572,21,0 +9,57,80,37,0,32.8,0.096,41,0 +2,106,64,35,119,30.5,1.400,34,0 +5,147,78,0,0,33.7,0.218,65,0 +2,90,70,17,0,27.3,0.085,22,0 +1,136,74,50,204,37.4,0.399,24,0 +4,114,65,0,0,21.9,0.432,37,0 +9,156,86,28,155,34.3,1.189,42,1 +1,153,82,42,485,40.6,0.687,23,0 +8,188,78,0,0,47.9,0.137,43,1 +7,152,88,44,0,50.0,0.337,36,1 +2,99,52,15,94,24.6,0.637,21,0 +1,109,56,21,135,25.2,0.833,23,0 +2,88,74,19,53,29.0,0.229,22,0 +17,163,72,41,114,40.9,0.817,47,1 +4,151,90,38,0,29.7,0.294,36,0 +7,102,74,40,105,37.2,0.204,45,0 +0,114,80,34,285,44.2,0.167,27,0 +2,100,64,23,0,29.7,0.368,21,0 +0,131,88,0,0,31.6,0.743,32,1 +6,104,74,18,156,29.9,0.722,41,1 +3,148,66,25,0,32.5,0.256,22,0 +4,120,68,0,0,29.6,0.709,34,0 +4,110,66,0,0,31.9,0.471,29,0 +3,111,90,12,78,28.4,0.495,29,0 +6,102,82,0,0,30.8,0.180,36,1 +6,134,70,23,130,35.4,0.542,29,1 +2,87,0,23,0,28.9,0.773,25,0 +1,79,60,42,48,43.5,0.678,23,0 +2,75,64,24,55,29.7,0.370,33,0 +8,179,72,42,130,32.7,0.719,36,1 +6,85,78,0,0,31.2,0.382,42,0 +0,129,110,46,130,67.1,0.319,26,1 +5,143,78,0,0,45.0,0.190,47,0 +5,130,82,0,0,39.1,0.956,37,1 +6,87,80,0,0,23.2,0.084,32,0 +0,119,64,18,92,34.9,0.725,23,0 +1,0,74,20,23,27.7,0.299,21,0 +5,73,60,0,0,26.8,0.268,27,0 +4,141,74,0,0,27.6,0.244,40,0 +7,194,68,28,0,35.9,0.745,41,1 +8,181,68,36,495,30.1,0.615,60,1 +1,128,98,41,58,32.0,1.321,33,1 +8,109,76,39,114,27.9,0.640,31,1 +5,139,80,35,160,31.6,0.361,25,1 +3,111,62,0,0,22.6,0.142,21,0 +9,123,70,44,94,33.1,0.374,40,0 +7,159,66,0,0,30.4,0.383,36,1 +11,135,0,0,0,52.3,0.578,40,1 +8,85,55,20,0,24.4,0.136,42,0 +5,158,84,41,210,39.4,0.395,29,1 +1,105,58,0,0,24.3,0.187,21,0 +3,107,62,13,48,22.9,0.678,23,1 +4,109,64,44,99,34.8,0.905,26,1 +4,148,60,27,318,30.9,0.150,29,1 +0,113,80,16,0,31.0,0.874,21,0 +1,138,82,0,0,40.1,0.236,28,0 +0,108,68,20,0,27.3,0.787,32,0 +2,99,70,16,44,20.4,0.235,27,0 +6,103,72,32,190,37.7,0.324,55,0 +5,111,72,28,0,23.9,0.407,27,0 +8,196,76,29,280,37.5,0.605,57,1 +5,162,104,0,0,37.7,0.151,52,1 +1,96,64,27,87,33.2,0.289,21,0 +7,184,84,33,0,35.5,0.355,41,1 +2,81,60,22,0,27.7,0.290,25,0 +0,147,85,54,0,42.8,0.375,24,0 +7,179,95,31,0,34.2,0.164,60,0 +0,140,65,26,130,42.6,0.431,24,1 +9,112,82,32,175,34.2,0.260,36,1 +12,151,70,40,271,41.8,0.742,38,1 +5,109,62,41,129,35.8,0.514,25,1 +6,125,68,30,120,30.0,0.464,32,0 +5,85,74,22,0,29.0,1.224,32,1 +5,112,66,0,0,37.8,0.261,41,1 +0,177,60,29,478,34.6,1.072,21,1 +2,158,90,0,0,31.6,0.805,66,1 +7,119,0,0,0,25.2,0.209,37,0 +7,142,60,33,190,28.8,0.687,61,0 +1,100,66,15,56,23.6,0.666,26,0 +1,87,78,27,32,34.6,0.101,22,0 +0,101,76,0,0,35.7,0.198,26,0 +3,162,52,38,0,37.2,0.652,24,1 +4,197,70,39,744,36.7,2.329,31,0 +0,117,80,31,53,45.2,0.089,24,0 +4,142,86,0,0,44.0,0.645,22,1 +6,134,80,37,370,46.2,0.238,46,1 +1,79,80,25,37,25.4,0.583,22,0 +4,122,68,0,0,35.0,0.394,29,0 +3,74,68,28,45,29.7,0.293,23,0 +4,171,72,0,0,43.6,0.479,26,1 +7,181,84,21,192,35.9,0.586,51,1 +0,179,90,27,0,44.1,0.686,23,1 +9,164,84,21,0,30.8,0.831,32,1 +0,104,76,0,0,18.4,0.582,27,0 +1,91,64,24,0,29.2,0.192,21,0 +4,91,70,32,88,33.1,0.446,22,0 +3,139,54,0,0,25.6,0.402,22,1 +6,119,50,22,176,27.1,1.318,33,1 +2,146,76,35,194,38.2,0.329,29,0 +9,184,85,15,0,30.0,1.213,49,1 +10,122,68,0,0,31.2,0.258,41,0 +0,165,90,33,680,52.3,0.427,23,0 +9,124,70,33,402,35.4,0.282,34,0 +1,111,86,19,0,30.1,0.143,23,0 +9,106,52,0,0,31.2,0.380,42,0 +2,129,84,0,0,28.0,0.284,27,0 +2,90,80,14,55,24.4,0.249,24,0 +0,86,68,32,0,35.8,0.238,25,0 +12,92,62,7,258,27.6,0.926,44,1 +1,113,64,35,0,33.6,0.543,21,1 +3,111,56,39,0,30.1,0.557,30,0 +2,114,68,22,0,28.7,0.092,25,0 +1,193,50,16,375,25.9,0.655,24,0 +11,155,76,28,150,33.3,1.353,51,1 +3,191,68,15,130,30.9,0.299,34,0 +3,141,0,0,0,30.0,0.761,27,1 +4,95,70,32,0,32.1,0.612,24,0 +3,142,80,15,0,32.4,0.200,63,0 +4,123,62,0,0,32.0,0.226,35,1 +5,96,74,18,67,33.6,0.997,43,0 +0,138,0,0,0,36.3,0.933,25,1 +2,128,64,42,0,40.0,1.101,24,0 +0,102,52,0,0,25.1,0.078,21,0 +2,146,0,0,0,27.5,0.240,28,1 +10,101,86,37,0,45.6,1.136,38,1 +2,108,62,32,56,25.2,0.128,21,0 +3,122,78,0,0,23.0,0.254,40,0 +1,71,78,50,45,33.2,0.422,21,0 +13,106,70,0,0,34.2,0.251,52,0 +2,100,70,52,57,40.5,0.677,25,0 +7,106,60,24,0,26.5,0.296,29,1 +0,104,64,23,116,27.8,0.454,23,0 +5,114,74,0,0,24.9,0.744,57,0 +2,108,62,10,278,25.3,0.881,22,0 +0,146,70,0,0,37.9,0.334,28,1 +10,129,76,28,122,35.9,0.280,39,0 +7,133,88,15,155,32.4,0.262,37,0 +7,161,86,0,0,30.4,0.165,47,1 +2,108,80,0,0,27.0,0.259,52,1 +7,136,74,26,135,26.0,0.647,51,0 +5,155,84,44,545,38.7,0.619,34,0 +1,119,86,39,220,45.6,0.808,29,1 +4,96,56,17,49,20.8,0.340,26,0 +5,108,72,43,75,36.1,0.263,33,0 +0,78,88,29,40,36.9,0.434,21,0 +0,107,62,30,74,36.6,0.757,25,1 +2,128,78,37,182,43.3,1.224,31,1 +1,128,48,45,194,40.5,0.613,24,1 +0,161,50,0,0,21.9,0.254,65,0 +6,151,62,31,120,35.5,0.692,28,0 +2,146,70,38,360,28.0,0.337,29,1 +0,126,84,29,215,30.7,0.520,24,0 +14,100,78,25,184,36.6,0.412,46,1 +8,112,72,0,0,23.6,0.840,58,0 +0,167,0,0,0,32.3,0.839,30,1 +2,144,58,33,135,31.6,0.422,25,1 +5,77,82,41,42,35.8,0.156,35,0 +5,115,98,0,0,52.9,0.209,28,1 +3,150,76,0,0,21.0,0.207,37,0 +2,120,76,37,105,39.7,0.215,29,0 +10,161,68,23,132,25.5,0.326,47,1 +0,137,68,14,148,24.8,0.143,21,0 +0,128,68,19,180,30.5,1.391,25,1 +2,124,68,28,205,32.9,0.875,30,1 +6,80,66,30,0,26.2,0.313,41,0 +0,106,70,37,148,39.4,0.605,22,0 +2,155,74,17,96,26.6,0.433,27,1 +3,113,50,10,85,29.5,0.626,25,0 +7,109,80,31,0,35.9,1.127,43,1 +2,112,68,22,94,34.1,0.315,26,0 +3,99,80,11,64,19.3,0.284,30,0 +3,182,74,0,0,30.5,0.345,29,1 +3,115,66,39,140,38.1,0.150,28,0 +6,194,78,0,0,23.5,0.129,59,1 +4,129,60,12,231,27.5,0.527,31,0 +3,112,74,30,0,31.6,0.197,25,1 +0,124,70,20,0,27.4,0.254,36,1 +13,152,90,33,29,26.8,0.731,43,1 +2,112,75,32,0,35.7,0.148,21,0 +1,157,72,21,168,25.6,0.123,24,0 +1,122,64,32,156,35.1,0.692,30,1 +10,179,70,0,0,35.1,0.200,37,0 +2,102,86,36,120,45.5,0.127,23,1 +6,105,70,32,68,30.8,0.122,37,0 +8,118,72,19,0,23.1,1.476,46,0 +2,87,58,16,52,32.7,0.166,25,0 +1,180,0,0,0,43.3,0.282,41,1 +12,106,80,0,0,23.6,0.137,44,0 +1,95,60,18,58,23.9,0.260,22,0 +0,165,76,43,255,47.9,0.259,26,0 +0,117,0,0,0,33.8,0.932,44,0 +5,115,76,0,0,31.2,0.343,44,1 +9,152,78,34,171,34.2,0.893,33,1 +7,178,84,0,0,39.9,0.331,41,1 +1,130,70,13,105,25.9,0.472,22,0 +1,95,74,21,73,25.9,0.673,36,0 +1,0,68,35,0,32.0,0.389,22,0 +5,122,86,0,0,34.7,0.290,33,0 +8,95,72,0,0,36.8,0.485,57,0 +8,126,88,36,108,38.5,0.349,49,0 +1,139,46,19,83,28.7,0.654,22,0 +3,116,0,0,0,23.5,0.187,23,0 +3,99,62,19,74,21.8,0.279,26,0 +5,0,80,32,0,41.0,0.346,37,1 +4,92,80,0,0,42.2,0.237,29,0 +4,137,84,0,0,31.2,0.252,30,0 +3,61,82,28,0,34.4,0.243,46,0 +1,90,62,12,43,27.2,0.580,24,0 +3,90,78,0,0,42.7,0.559,21,0 +9,165,88,0,0,30.4,0.302,49,1 +1,125,50,40,167,33.3,0.962,28,1 +13,129,0,30,0,39.9,0.569,44,1 +12,88,74,40,54,35.3,0.378,48,0 +1,196,76,36,249,36.5,0.875,29,1 +5,189,64,33,325,31.2,0.583,29,1 +5,158,70,0,0,29.8,0.207,63,0 +5,103,108,37,0,39.2,0.305,65,0 +4,146,78,0,0,38.5,0.520,67,1 +4,147,74,25,293,34.9,0.385,30,0 +5,99,54,28,83,34.0,0.499,30,0 +6,124,72,0,0,27.6,0.368,29,1 +0,101,64,17,0,21.0,0.252,21,0 +3,81,86,16,66,27.5,0.306,22,0 +1,133,102,28,140,32.8,0.234,45,1 +3,173,82,48,465,38.4,2.137,25,1 +0,118,64,23,89,0.0,1.731,21,0 +0,84,64,22,66,35.8,0.545,21,0 +2,105,58,40,94,34.9,0.225,25,0 +2,122,52,43,158,36.2,0.816,28,0 +12,140,82,43,325,39.2,0.528,58,1 +0,98,82,15,84,25.2,0.299,22,0 +1,87,60,37,75,37.2,0.509,22,0 +4,156,75,0,0,48.3,0.238,32,1 +0,93,100,39,72,43.4,1.021,35,0 +1,107,72,30,82,30.8,0.821,24,0 +0,105,68,22,0,20.0,0.236,22,0 +1,109,60,8,182,25.4,0.947,21,0 +1,90,62,18,59,25.1,1.268,25,0 +1,125,70,24,110,24.3,0.221,25,0 +1,119,54,13,50,22.3,0.205,24,0 +5,116,74,29,0,32.3,0.660,35,1 +8,105,100,36,0,43.3,0.239,45,1 +5,144,82,26,285,32.0,0.452,58,1 +3,100,68,23,81,31.6,0.949,28,0 +1,100,66,29,196,32.0,0.444,42,0 +5,166,76,0,0,45.7,0.340,27,1 +1,131,64,14,415,23.7,0.389,21,0 +4,116,72,12,87,22.1,0.463,37,0 +4,158,78,0,0,32.9,0.803,31,1 +2,127,58,24,275,27.7,1.600,25,0 +3,96,56,34,115,24.7,0.944,39,0 +0,131,66,40,0,34.3,0.196,22,1 +3,82,70,0,0,21.1,0.389,25,0 +3,193,70,31,0,34.9,0.241,25,1 +4,95,64,0,0,32.0,0.161,31,1 +6,137,61,0,0,24.2,0.151,55,0 +5,136,84,41,88,35.0,0.286,35,1 +9,72,78,25,0,31.6,0.280,38,0 +5,168,64,0,0,32.9,0.135,41,1 +2,123,48,32,165,42.1,0.520,26,0 +4,115,72,0,0,28.9,0.376,46,1 +0,101,62,0,0,21.9,0.336,25,0 +8,197,74,0,0,25.9,1.191,39,1 +1,172,68,49,579,42.4,0.702,28,1 +6,102,90,39,0,35.7,0.674,28,0 +1,112,72,30,176,34.4,0.528,25,0 +1,143,84,23,310,42.4,1.076,22,0 +1,143,74,22,61,26.2,0.256,21,0 +0,138,60,35,167,34.6,0.534,21,1 +3,173,84,33,474,35.7,0.258,22,1 +1,97,68,21,0,27.2,1.095,22,0 +4,144,82,32,0,38.5,0.554,37,1 +1,83,68,0,0,18.2,0.624,27,0 +3,129,64,29,115,26.4,0.219,28,1 +1,119,88,41,170,45.3,0.507,26,0 +2,94,68,18,76,26.0,0.561,21,0 +0,102,64,46,78,40.6,0.496,21,0 +2,115,64,22,0,30.8,0.421,21,0 +8,151,78,32,210,42.9,0.516,36,1 +4,184,78,39,277,37.0,0.264,31,1 +0,94,0,0,0,0.0,0.256,25,0 +1,181,64,30,180,34.1,0.328,38,1 +0,135,94,46,145,40.6,0.284,26,0 +1,95,82,25,180,35.0,0.233,43,1 +2,99,0,0,0,22.2,0.108,23,0 +3,89,74,16,85,30.4,0.551,38,0 +1,80,74,11,60,30.0,0.527,22,0 +2,139,75,0,0,25.6,0.167,29,0 +1,90,68,8,0,24.5,1.138,36,0 +0,141,0,0,0,42.4,0.205,29,1 +12,140,85,33,0,37.4,0.244,41,0 +5,147,75,0,0,29.9,0.434,28,0 +1,97,70,15,0,18.2,0.147,21,0 +6,107,88,0,0,36.8,0.727,31,0 +0,189,104,25,0,34.3,0.435,41,1 +2,83,66,23,50,32.2,0.497,22,0 +4,117,64,27,120,33.2,0.230,24,0 +8,108,70,0,0,30.5,0.955,33,1 +4,117,62,12,0,29.7,0.380,30,1 +0,180,78,63,14,59.4,2.420,25,1 +1,100,72,12,70,25.3,0.658,28,0 +0,95,80,45,92,36.5,0.330,26,0 +0,104,64,37,64,33.6,0.510,22,1 +0,120,74,18,63,30.5,0.285,26,0 +1,82,64,13,95,21.2,0.415,23,0 +2,134,70,0,0,28.9,0.542,23,1 +0,91,68,32,210,39.9,0.381,25,0 +2,119,0,0,0,19.6,0.832,72,0 +2,100,54,28,105,37.8,0.498,24,0 +14,175,62,30,0,33.6,0.212,38,1 +1,135,54,0,0,26.7,0.687,62,0 +5,86,68,28,71,30.2,0.364,24,0 +10,148,84,48,237,37.6,1.001,51,1 +9,134,74,33,60,25.9,0.460,81,0 +9,120,72,22,56,20.8,0.733,48,0 +1,71,62,0,0,21.8,0.416,26,0 +8,74,70,40,49,35.3,0.705,39,0 +5,88,78,30,0,27.6,0.258,37,0 +10,115,98,0,0,24.0,1.022,34,0 +0,124,56,13,105,21.8,0.452,21,0 +0,74,52,10,36,27.8,0.269,22,0 +0,97,64,36,100,36.8,0.600,25,0 +8,120,0,0,0,30.0,0.183,38,1 +6,154,78,41,140,46.1,0.571,27,0 +1,144,82,40,0,41.3,0.607,28,0 +0,137,70,38,0,33.2,0.170,22,0 +0,119,66,27,0,38.8,0.259,22,0 +7,136,90,0,0,29.9,0.210,50,0 +4,114,64,0,0,28.9,0.126,24,0 +0,137,84,27,0,27.3,0.231,59,0 +2,105,80,45,191,33.7,0.711,29,1 +7,114,76,17,110,23.8,0.466,31,0 +8,126,74,38,75,25.9,0.162,39,0 +4,132,86,31,0,28.0,0.419,63,0 +3,158,70,30,328,35.5,0.344,35,1 +0,123,88,37,0,35.2,0.197,29,0 +4,85,58,22,49,27.8,0.306,28,0 +0,84,82,31,125,38.2,0.233,23,0 +0,145,0,0,0,44.2,0.630,31,1 +0,135,68,42,250,42.3,0.365,24,1 +1,139,62,41,480,40.7,0.536,21,0 +0,173,78,32,265,46.5,1.159,58,0 +4,99,72,17,0,25.6,0.294,28,0 +8,194,80,0,0,26.1,0.551,67,0 +2,83,65,28,66,36.8,0.629,24,0 +2,89,90,30,0,33.5,0.292,42,0 +4,99,68,38,0,32.8,0.145,33,0 +4,125,70,18,122,28.9,1.144,45,1 +3,80,0,0,0,0.0,0.174,22,0 +6,166,74,0,0,26.6,0.304,66,0 +5,110,68,0,0,26.0,0.292,30,0 +2,81,72,15,76,30.1,0.547,25,0 +7,195,70,33,145,25.1,0.163,55,1 +6,154,74,32,193,29.3,0.839,39,0 +2,117,90,19,71,25.2,0.313,21,0 +3,84,72,32,0,37.2,0.267,28,0 +6,0,68,41,0,39.0,0.727,41,1 +7,94,64,25,79,33.3,0.738,41,0 +3,96,78,39,0,37.3,0.238,40,0 +10,75,82,0,0,33.3,0.263,38,0 +0,180,90,26,90,36.5,0.314,35,1 +1,130,60,23,170,28.6,0.692,21,0 +2,84,50,23,76,30.4,0.968,21,0 +8,120,78,0,0,25.0,0.409,64,0 +12,84,72,31,0,29.7,0.297,46,1 +0,139,62,17,210,22.1,0.207,21,0 +9,91,68,0,0,24.2,0.200,58,0 +2,91,62,0,0,27.3,0.525,22,0 +3,99,54,19,86,25.6,0.154,24,0 +3,163,70,18,105,31.6,0.268,28,1 +9,145,88,34,165,30.3,0.771,53,1 +7,125,86,0,0,37.6,0.304,51,0 +13,76,60,0,0,32.8,0.180,41,0 +6,129,90,7,326,19.6,0.582,60,0 +2,68,70,32,66,25.0,0.187,25,0 +3,124,80,33,130,33.2,0.305,26,0 +6,114,0,0,0,0.0,0.189,26,0 +9,130,70,0,0,34.2,0.652,45,1 +3,125,58,0,0,31.6,0.151,24,0 +3,87,60,18,0,21.8,0.444,21,0 +1,97,64,19,82,18.2,0.299,21,0 +3,116,74,15,105,26.3,0.107,24,0 +0,117,66,31,188,30.8,0.493,22,0 +0,111,65,0,0,24.6,0.660,31,0 +2,122,60,18,106,29.8,0.717,22,0 +0,107,76,0,0,45.3,0.686,24,0 +1,86,66,52,65,41.3,0.917,29,0 +6,91,0,0,0,29.8,0.501,31,0 +1,77,56,30,56,33.3,1.251,24,0 +4,132,0,0,0,32.9,0.302,23,1 +0,105,90,0,0,29.6,0.197,46,0 +0,57,60,0,0,21.7,0.735,67,0 +0,127,80,37,210,36.3,0.804,23,0 +3,129,92,49,155,36.4,0.968,32,1 +8,100,74,40,215,39.4,0.661,43,1 +3,128,72,25,190,32.4,0.549,27,1 +10,90,85,32,0,34.9,0.825,56,1 +4,84,90,23,56,39.5,0.159,25,0 +1,88,78,29,76,32.0,0.365,29,0 +8,186,90,35,225,34.5,0.423,37,1 +5,187,76,27,207,43.6,1.034,53,1 +4,131,68,21,166,33.1,0.160,28,0 +1,164,82,43,67,32.8,0.341,50,0 +4,189,110,31,0,28.5,0.680,37,0 +1,116,70,28,0,27.4,0.204,21,0 +3,84,68,30,106,31.9,0.591,25,0 +6,114,88,0,0,27.8,0.247,66,0 +1,88,62,24,44,29.9,0.422,23,0 +1,84,64,23,115,36.9,0.471,28,0 +7,124,70,33,215,25.5,0.161,37,0 +1,97,70,40,0,38.1,0.218,30,0 +8,110,76,0,0,27.8,0.237,58,0 +11,103,68,40,0,46.2,0.126,42,0 +11,85,74,0,0,30.1,0.300,35,0 +6,125,76,0,0,33.8,0.121,54,1 +0,198,66,32,274,41.3,0.502,28,1 +1,87,68,34,77,37.6,0.401,24,0 +6,99,60,19,54,26.9,0.497,32,0 +0,91,80,0,0,32.4,0.601,27,0 +2,95,54,14,88,26.1,0.748,22,0 +1,99,72,30,18,38.6,0.412,21,0 +6,92,62,32,126,32.0,0.085,46,0 +4,154,72,29,126,31.3,0.338,37,0 +0,121,66,30,165,34.3,0.203,33,1 +3,78,70,0,0,32.5,0.270,39,0 +2,130,96,0,0,22.6,0.268,21,0 +3,111,58,31,44,29.5,0.430,22,0 +2,98,60,17,120,34.7,0.198,22,0 +1,143,86,30,330,30.1,0.892,23,0 +1,119,44,47,63,35.5,0.280,25,0 +6,108,44,20,130,24.0,0.813,35,0 +2,118,80,0,0,42.9,0.693,21,1 +10,133,68,0,0,27.0,0.245,36,0 +2,197,70,99,0,34.7,0.575,62,1 +0,151,90,46,0,42.1,0.371,21,1 +6,109,60,27,0,25.0,0.206,27,0 +12,121,78,17,0,26.5,0.259,62,0 +8,100,76,0,0,38.7,0.190,42,0 +8,124,76,24,600,28.7,0.687,52,1 +1,93,56,11,0,22.5,0.417,22,0 +8,143,66,0,0,34.9,0.129,41,1 +6,103,66,0,0,24.3,0.249,29,0 +3,176,86,27,156,33.3,1.154,52,1 +0,73,0,0,0,21.1,0.342,25,0 +11,111,84,40,0,46.8,0.925,45,1 +2,112,78,50,140,39.4,0.175,24,0 +3,132,80,0,0,34.4,0.402,44,1 +2,82,52,22,115,28.5,1.699,25,0 +6,123,72,45,230,33.6,0.733,34,0 +0,188,82,14,185,32.0,0.682,22,1 +0,67,76,0,0,45.3,0.194,46,0 +1,89,24,19,25,27.8,0.559,21,0 +1,173,74,0,0,36.8,0.088,38,1 +1,109,38,18,120,23.1,0.407,26,0 +1,108,88,19,0,27.1,0.400,24,0 +6,96,0,0,0,23.7,0.190,28,0 +1,124,74,36,0,27.8,0.100,30,0 +7,150,78,29,126,35.2,0.692,54,1 +4,183,0,0,0,28.4,0.212,36,1 +1,124,60,32,0,35.8,0.514,21,0 +1,181,78,42,293,40.0,1.258,22,1 +1,92,62,25,41,19.5,0.482,25,0 +0,152,82,39,272,41.5,0.270,27,0 +1,111,62,13,182,24.0,0.138,23,0 +3,106,54,21,158,30.9,0.292,24,0 +3,174,58,22,194,32.9,0.593,36,1 +7,168,88,42,321,38.2,0.787,40,1 +6,105,80,28,0,32.5,0.878,26,0 +11,138,74,26,144,36.1,0.557,50,1 +3,106,72,0,0,25.8,0.207,27,0 +6,117,96,0,0,28.7,0.157,30,0 +2,68,62,13,15,20.1,0.257,23,0 +9,112,82,24,0,28.2,1.282,50,1 +0,119,0,0,0,32.4,0.141,24,1 +2,112,86,42,160,38.4,0.246,28,0 +2,92,76,20,0,24.2,1.698,28,0 +6,183,94,0,0,40.8,1.461,45,0 +0,94,70,27,115,43.5,0.347,21,0 +2,108,64,0,0,30.8,0.158,21,0 +4,90,88,47,54,37.7,0.362,29,0 +0,125,68,0,0,24.7,0.206,21,0 +0,132,78,0,0,32.4,0.393,21,0 +5,128,80,0,0,34.6,0.144,45,0 +4,94,65,22,0,24.7,0.148,21,0 +7,114,64,0,0,27.4,0.732,34,1 +0,102,78,40,90,34.5,0.238,24,0 +2,111,60,0,0,26.2,0.343,23,0 +1,128,82,17,183,27.5,0.115,22,0 +10,92,62,0,0,25.9,0.167,31,0 +13,104,72,0,0,31.2,0.465,38,1 +5,104,74,0,0,28.8,0.153,48,0 +2,94,76,18,66,31.6,0.649,23,0 +7,97,76,32,91,40.9,0.871,32,1 +1,100,74,12,46,19.5,0.149,28,0 +0,102,86,17,105,29.3,0.695,27,0 +4,128,70,0,0,34.3,0.303,24,0 +6,147,80,0,0,29.5,0.178,50,1 +4,90,0,0,0,28.0,0.610,31,0 +3,103,72,30,152,27.6,0.730,27,0 +2,157,74,35,440,39.4,0.134,30,0 +1,167,74,17,144,23.4,0.447,33,1 +0,179,50,36,159,37.8,0.455,22,1 +11,136,84,35,130,28.3,0.260,42,1 +0,107,60,25,0,26.4,0.133,23,0 +1,91,54,25,100,25.2,0.234,23,0 +1,117,60,23,106,33.8,0.466,27,0 +5,123,74,40,77,34.1,0.269,28,0 +2,120,54,0,0,26.8,0.455,27,0 +1,106,70,28,135,34.2,0.142,22,0 +2,155,52,27,540,38.7,0.240,25,1 +2,101,58,35,90,21.8,0.155,22,0 +1,120,80,48,200,38.9,1.162,41,0 +11,127,106,0,0,39.0,0.190,51,0 +3,80,82,31,70,34.2,1.292,27,1 +10,162,84,0,0,27.7,0.182,54,0 +1,199,76,43,0,42.9,1.394,22,1 +8,167,106,46,231,37.6,0.165,43,1 +9,145,80,46,130,37.9,0.637,40,1 +6,115,60,39,0,33.7,0.245,40,1 +1,112,80,45,132,34.8,0.217,24,0 +4,145,82,18,0,32.5,0.235,70,1 +10,111,70,27,0,27.5,0.141,40,1 +6,98,58,33,190,34.0,0.430,43,0 +9,154,78,30,100,30.9,0.164,45,0 +6,165,68,26,168,33.6,0.631,49,0 +1,99,58,10,0,25.4,0.551,21,0 +10,68,106,23,49,35.5,0.285,47,0 +3,123,100,35,240,57.3,0.880,22,0 +8,91,82,0,0,35.6,0.587,68,0 +6,195,70,0,0,30.9,0.328,31,1 +9,156,86,0,0,24.8,0.230,53,1 +0,93,60,0,0,35.3,0.263,25,0 +3,121,52,0,0,36.0,0.127,25,1 +2,101,58,17,265,24.2,0.614,23,0 +2,56,56,28,45,24.2,0.332,22,0 +0,162,76,36,0,49.6,0.364,26,1 +0,95,64,39,105,44.6,0.366,22,0 +4,125,80,0,0,32.3,0.536,27,1 +5,136,82,0,0,0.0,0.640,69,0 +2,129,74,26,205,33.2,0.591,25,0 +3,130,64,0,0,23.1,0.314,22,0 +1,107,50,19,0,28.3,0.181,29,0 +1,140,74,26,180,24.1,0.828,23,0 +1,144,82,46,180,46.1,0.335,46,1 +8,107,80,0,0,24.6,0.856,34,0 +13,158,114,0,0,42.3,0.257,44,1 +2,121,70,32,95,39.1,0.886,23,0 +7,129,68,49,125,38.5,0.439,43,1 +2,90,60,0,0,23.5,0.191,25,0 +7,142,90,24,480,30.4,0.128,43,1 +3,169,74,19,125,29.9,0.268,31,1 +0,99,0,0,0,25.0,0.253,22,0 +4,127,88,11,155,34.5,0.598,28,0 +4,118,70,0,0,44.5,0.904,26,0 +2,122,76,27,200,35.9,0.483,26,0 +6,125,78,31,0,27.6,0.565,49,1 +1,168,88,29,0,35.0,0.905,52,1 +2,129,0,0,0,38.5,0.304,41,0 +4,110,76,20,100,28.4,0.118,27,0 +6,80,80,36,0,39.8,0.177,28,0 +10,115,0,0,0,0.0,0.261,30,1 +2,127,46,21,335,34.4,0.176,22,0 +9,164,78,0,0,32.8,0.148,45,1 +2,93,64,32,160,38.0,0.674,23,1 +3,158,64,13,387,31.2,0.295,24,0 +5,126,78,27,22,29.6,0.439,40,0 +10,129,62,36,0,41.2,0.441,38,1 +0,134,58,20,291,26.4,0.352,21,0 +3,102,74,0,0,29.5,0.121,32,0 +7,187,50,33,392,33.9,0.826,34,1 +3,173,78,39,185,33.8,0.970,31,1 +10,94,72,18,0,23.1,0.595,56,0 +1,108,60,46,178,35.5,0.415,24,0 +5,97,76,27,0,35.6,0.378,52,1 +4,83,86,19,0,29.3,0.317,34,0 +1,114,66,36,200,38.1,0.289,21,0 +1,149,68,29,127,29.3,0.349,42,1 +5,117,86,30,105,39.1,0.251,42,0 +1,111,94,0,0,32.8,0.265,45,0 +4,112,78,40,0,39.4,0.236,38,0 +1,116,78,29,180,36.1,0.496,25,0 +0,141,84,26,0,32.4,0.433,22,0 +2,175,88,0,0,22.9,0.326,22,0 +2,92,52,0,0,30.1,0.141,22,0 +3,130,78,23,79,28.4,0.323,34,1 +8,120,86,0,0,28.4,0.259,22,1 +2,174,88,37,120,44.5,0.646,24,1 +2,106,56,27,165,29.0,0.426,22,0 +2,105,75,0,0,23.3,0.560,53,0 +4,95,60,32,0,35.4,0.284,28,0 +0,126,86,27,120,27.4,0.515,21,0 +8,65,72,23,0,32.0,0.600,42,0 +2,99,60,17,160,36.6,0.453,21,0 +1,102,74,0,0,39.5,0.293,42,1 +11,120,80,37,150,42.3,0.785,48,1 +3,102,44,20,94,30.8,0.400,26,0 +1,109,58,18,116,28.5,0.219,22,0 +9,140,94,0,0,32.7,0.734,45,1 +13,153,88,37,140,40.6,1.174,39,0 +12,100,84,33,105,30.0,0.488,46,0 +1,147,94,41,0,49.3,0.358,27,1 +1,81,74,41,57,46.3,1.096,32,0 +3,187,70,22,200,36.4,0.408,36,1 +6,162,62,0,0,24.3,0.178,50,1 +4,136,70,0,0,31.2,1.182,22,1 +1,121,78,39,74,39.0,0.261,28,0 +3,108,62,24,0,26.0,0.223,25,0 +0,181,88,44,510,43.3,0.222,26,1 +8,154,78,32,0,32.4,0.443,45,1 +1,128,88,39,110,36.5,1.057,37,1 +7,137,90,41,0,32.0,0.391,39,0 +0,123,72,0,0,36.3,0.258,52,1 +1,106,76,0,0,37.5,0.197,26,0 +6,190,92,0,0,35.5,0.278,66,1 +2,88,58,26,16,28.4,0.766,22,0 +9,170,74,31,0,44.0,0.403,43,1 +9,89,62,0,0,22.5,0.142,33,0 +10,101,76,48,180,32.9,0.171,63,0 +2,122,70,27,0,36.8,0.340,27,0 +5,121,72,23,112,26.2,0.245,30,0 +1,126,60,0,0,30.1,0.349,47,1 +1,93,70,31,0,30.4,0.315,23,0 \ No newline at end of file diff --git a/Programming/EARIN/lab5/code/results.txt b/Programming/EARIN/lab5/code/results.txt new file mode 100644 index 00000000..c286d695 --- /dev/null +++ b/Programming/EARIN/lab5/code/results.txt @@ -0,0 +1,8 @@ +------------------------------------------------------------------------------------- +loss-lr0.001-bs1-hl2-w128-Adam +Execution time: 567.2734835147858 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl0-w128-Adam +Execution time: 44.529624700546265 +------------------------------------------------------------------------------------- diff --git a/Programming/EARIN/lab5/code/trainAccuracy-lr0.001-bs1-hl2-w128-Adam.png b/Programming/EARIN/lab5/code/trainAccuracy-lr0.001-bs1-hl2-w128-Adam.png new file mode 100644 index 00000000..a65eccb3 Binary files /dev/null and b/Programming/EARIN/lab5/code/trainAccuracy-lr0.001-bs1-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/code/trainAccuracy-lr0.001-bs64-hl0-w128-Adam.png b/Programming/EARIN/lab5/code/trainAccuracy-lr0.001-bs64-hl0-w128-Adam.png new file mode 100644 index 00000000..aa51ee44 Binary files /dev/null and b/Programming/EARIN/lab5/code/trainAccuracy-lr0.001-bs64-hl0-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/code/validationAccuracy-lr0.001-bs1-hl2-w128-Adam.png b/Programming/EARIN/lab5/code/validationAccuracy-lr0.001-bs1-hl2-w128-Adam.png new file mode 100644 index 00000000..0406dec7 Binary files /dev/null and b/Programming/EARIN/lab5/code/validationAccuracy-lr0.001-bs1-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/code/validationAccuracy-lr0.001-bs64-hl0-w128-Adam.png b/Programming/EARIN/lab5/code/validationAccuracy-lr0.001-bs64-hl0-w128-Adam.png new file mode 100644 index 00000000..cd26b34c Binary files /dev/null and b/Programming/EARIN/lab5/code/validationAccuracy-lr0.001-bs64-hl0-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/EARIN_LAB_5_RUDNICKI_KLISZKO.pdf b/Programming/EARIN/lab5/report/EARIN_LAB_5_RUDNICKI_KLISZKO.pdf new file mode 100644 index 00000000..23780da4 Binary files /dev/null and b/Programming/EARIN/lab5/report/EARIN_LAB_5_RUDNICKI_KLISZKO.pdf differ diff --git a/Programming/EARIN/lab5/report/EARIN_LAB_5_RUDNICKI_KLISZKO.tex b/Programming/EARIN/lab5/report/EARIN_LAB_5_RUDNICKI_KLISZKO.tex new file mode 100644 index 00000000..9c00139b --- /dev/null +++ b/Programming/EARIN/lab5/report/EARIN_LAB_5_RUDNICKI_KLISZKO.tex @@ -0,0 +1,537 @@ +\documentclass{article}[12pt] +\usepackage{graphicx} % Required for inserting images +\usepackage{listings} +\usepackage{hyperref} +\usepackage{tabularx} +\usepackage{float} +\usepackage{subfig} +\usepackage[a4paper, left=1cm, right=1cm]{geometry} + +\title{EARIN Lab 5 Report} +\author{Krzysztof Rudnicki, 307585 \\ Jakub Kliszko, 303866 } +\date{\today} + +\begin{document} + +\maketitle + +\section{Exercise Variant 2} +Use \href{https://pytorch.org/vision/stable/generated/torchvision.datasets.MNIST.html#torchvision.datasets.MNIST}{MIST} dataset. Evaluate at least 3 different numbers/values/types of: +\begin{itemize} + \item learning rate + \item mini-batch size (including batch containing only 1 example) + \item number of hidden layers (including 0 hidden layers - linear model) + \item width (number of neurons in hidden layers) + \item optimizer type (e.g., SGD, SGD with momentum, Adam) +\end{itemize} + +\section{Implementation} +Program can be ran by installing python, moving to project directory and issuing command: +\begin{lstlisting}[language=bash] +python main.py +\end{lstlisting} +Results will be displayed on three 2d scatter plots. \\ +Plots Title is filled with parameters used abbreviated for space sake \\ +Abbreviatons meaning: +\begin{itemize} + \item lr - Learning Rate + \item bs - Batch Size + \item hl - Number of Hidden Layers + \item w - Width + \item Adam or SGD or SGD\_Momentum - Optimizer type +\end{itemize} +Plot types: +\begin{itemize} + \item Loss value for learning step + \item Train Accuracy for epoch + \item Validation Accuracy for epoch +\end{itemize} + +\begin{figure}[H] + \caption{Exemplary plot of loss for learning Step \\ lr0.001-bs64-hl1-w128-Adam } + \includegraphics[width=\textwidth]{testsResults/loss/def.png} + \centering + \end{figure} +\begin{figure}[H] + \caption{Exemplary plot of Validation Accuracy for epoch \\ lr0.001-bs64-hl1-w128-Adam } + \includegraphics[width=\textwidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w64-Adam.png} + \centering + \end{figure} +\begin{figure}[H] +\caption{Exemplary plot of Train Accuracy for epoch \\ lr0.001-bs64-hl1-w128-Adam } +\includegraphics[width=\textwidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w64-Adam.png} +\centering +\end{figure} +Results will be displayed and saved in the same folder as code directory for further inspection, with file name containing information about input parameters \\ +Additionaly speed it took for neural network to run will be saved to results.txt along with what parameters were used \\ +We decided to run 19 tests in total: +\begin{enumerate} + \item learning rate [0.1, 0.01, 0.001] (3 tests) + \item mini-batch size [1, 64, 128, 256] (4 tests) + \item number of hidden layers [0, 1, 2, 3] (4 tests) + \item width [64, 128, 256, 512, 1024] (5 tests) + \item optimizer type [SGD, SGD\_Momentum, Adam] (3 tests) +\end{enumerate} +\section{Results} +We have successfully implemented network analyzing MNIST dataset \\ +\subsection{Loss Graphs} + +\subsubsection{Learning Rate} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/lr/def.png} + \caption{Default settings + learning rate = 0.001} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/lr/loss-lr0.01-bs64-hl2-w128-Adam.png} + \caption{Default settings + learning rate = 0.01} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/loss/lr/loss-lr0.1-bs64-hl2-w128-Adam.png} + \caption{Default settings + learning rate = 0.1} + \endminipage + \end{figure} + + \paragraph{Analysis} Smaller learning rate causes losses to drop near zero level faster (notice how there is a vertical drop for lower learning step for leaerning rate 0.001, later for learning rate 0.01 and never for learnig rate 0.1) + +\subsubsection{Mini-Batch size} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/bs/def.png} + \caption{Default settings + batching size = 64} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/bs/loss-1batch.png} + \caption{Default settings + batching size = 1} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/loss/bs/loss-lr0.001-bs128-hl2-w128-Adam.png} + \caption{Default settings + batching size = 128} + \endminipage + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/loss/bs/loss-lr0.001-bs256-hl2-w128-Adam.png} + \caption{Default settings + batching size = 256} + \endminipage + \end{figure} + + \paragraph{Analysis} Batching size equal to 1 makes losses seem pretty much random, increasing batch sizes increases 'flat' (smaller) loss periods between local peaks + +\subsubsection{Number of Hidden Layers} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/hl/hl0loss.png} + \caption{Default settings + hidden layers = 0} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/hl/loss-lr0.001-bs64-hl1-w128-Adam.png} + \caption{Default settings + hidden layers = 1} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/loss/hl/def.png} + \caption{Default settings + hidden layers = 2} + \endminipage + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/loss/hl/loss-lr0.001-bs64-hl3-w128-Adam.png} + \caption{Default settings + hidden layers = 3} + \endminipage + \end{figure} + + \paragraph{Analysis} Setting hidden layers to 0 again makes losses value seem random, hidden layer set to 1 provides us with later drop but longer flat periods, number of hidden layers set to 2 offeres the opposite and number of layers set to 3 seems to be a compromise between those two +\subsubsection{Width} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/w/def.png} + \caption{Default settings + width = 128} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/w/loss-lr0.001-bs64-hl2-w64-Adam.png} + \caption{Default settings + width = 64} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/loss/w/loss-lr0.001-bs64-hl2-w256-Adam.png} + \caption{Default settings + width = 256} + \endminipage + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/loss/w/loss-lr0.001-bs64-hl2-w512-Adam.png} + \caption{Default settings + width = 512} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/loss/w/loss-lr0.001-bs64-hl2-w1024-Adam.png} + \caption{Default settings + width = 1024} + \endminipage + \end{figure} + + \paragraph{Analysis} Changing width does not seem to affect loss greatly + + +\subsubsection{Optimizer Type} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/optimizer/def.png} + \caption{Default settings + Adam optimizer} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/loss/optimizer/loss-lr0.001-bs64-hl2-w128-SGD.png} + \caption{Default settings + learning rate = 0.01} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/loss/optimizer/loss-lr0.001-bs64-hl2-w128-SGD_Momentum.png} + \caption{Default settings + SGD\_Momentum optimizer} + \endminipage + \end{figure} + + \paragraph{Analysis} Changing optimizers does not seem to affect loss greatly + + +\subsection{Train Accuracy Graphs} + +\subsubsection{Learning Rate} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/def.png} + \caption{Default settings + learning rate = 0.001} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.01-bs64-hl2-w128-Adam.png} + \caption{Default settings + learning rate = 0.01} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.1-bs64-hl2-w128-Adam.png} + \caption{Default settings + learning rate = 0.1} + \endminipage + \end{figure} + + \paragraph{Analysis} Making training accuracy smaller than 0.01 seems to be unnecessary for this dataset as it offers little to no improve in accuracy. Setting it to 0.1 on the other hand provides very low accuracy of neural network + +\subsubsection{Mini-Batch size} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/def.png} + \caption{Default settings + batching size = 64} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy1batch.png} + \caption{Default settings + batching size = 1} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs128-hl2-w128-Adam.png} + \caption{Default settings + batching size = 128} + \endminipage + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs256-hl2-w128-Adam.png} + \caption{Default settings + batching size = 256} + \endminipage + \end{figure} + + \paragraph{Analysis} Increasing batching size does not seem to make drastic change for train accuracy, even setting batching size to 1 offers very good (over 95 \%) accuracy + + + + +\subsubsection{Number of Hidden Layers} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl0-w128-Adam.png} + \caption{Default settings + hidden layers = 0} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl1-w128-Adam.png} + \caption{Default settings + hidden layers = 1} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/def.png} + \caption{Default settings + hidden layers = 2} + \endminipage + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl3-w128-Adam.png} + \caption{Default settings + hidden layers = 3} + \endminipage + \end{figure} + + \paragraph{Analysis} Increasing hidden layers number reduces variety of train accuracy results, with hidden layers set to 0 having accuracy vary between 91 and 98 and with hidden layers equal to 3 showing much smoother graph +\subsubsection{Width} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/def.png} + \caption{Default settings + width = 128} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w64-Adam.png} + \caption{Default settings + width = 64} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w256-Adam.png} + \caption{Default settings + width = 256} + \endminipage + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w512-Adam.png} + \caption{Default settings + width = 512} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w1024-Adam.png} + \caption{Default settings + width = 1024} + \endminipage + \end{figure} + + \paragraph{Analysis} Changing width does not seem to influence accuracy much + +\subsubsection{Optimizer Type} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/def.png} + \caption{Default settings + Adam optimizer} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w128-SGD.png} + \caption{Default settings + learning rate = 0.01} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w128-SGD_Momentum.png} + \caption{Default settings + SGD\_Momentum optimizer} + \endminipage + \end{figure} + + \paragraph{Analysis} Changing optimizer type does not seem to influence accuracy much + +\subsection{Validation Accuracy Graphs} +Validation Accuracy Graphs look similar to Train accuracy so in order not to repeat ourselves we ommited analysis of them + + +\subsubsection{Learning Rate} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/def.png} + \caption{Default settings + learning rate = 0.001} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.01-bs64-hl2-w128-Adam.png} + \caption{Default settings + learning rate = 0.01} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/def.png} + \caption{Default settings + learning rate = 0.1} + \endminipage + \end{figure} + +\subsubsection{Mini-Batch size} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/def.png} + \caption{Default settings + batching size = 64} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy1batch.png} + \caption{Default settings + batching size = 1} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs128-hl2-w128-Adam.png} + \caption{Default settings + batching size = 128} + \endminipage + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs256-hl2-w128-Adam.png} + \caption{Default settings + batching size = 256} + \endminipage + \end{figure} + +\subsubsection{Number of Hidden Layers} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracyhl0.png} + \caption{Default settings + hidden layers = 0} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl1-w128-Adam.png} + \caption{Default settings + hidden layers = 1} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/def.png} + \caption{Default settings + hidden layers = 2} + \endminipage + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl3-w128-Adam.png} + \caption{Default settings + hidden layers = 3} + \endminipage + \end{figure} + \newpage +\subsubsection{Width} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/def.png} + \caption{Default settings + width = 128} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w64-Adam.png} + \caption{Default settings + width = 64} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w256-Adam.png} + \caption{Default settings + width = 256} + \endminipage + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w512-Adam.png} + \caption{Default settings + width = 512} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w1024-Adam.png} + \caption{Default settings + width = 1024} + \endminipage + \end{figure} + +\subsubsection{Optimizer Type} + + \begin{figure}[H] + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/def.png} + \caption{Default settings + Adam optimizer} + \endminipage\hfill + \minipage{0.5\textwidth} + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w128-SGD.png} + \caption{Default settings + learning rate = 0.01} + \endminipage + \end{figure} + \begin{figure}[H] + \minipage{0.5\textwidth}% + \includegraphics[width=\linewidth]{testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w128-SGD_Momentum.png} + \caption{Default settings + SGD\_Momentum optimizer} + \endminipage + \end{figure} + + \subsection{Speed} + We also checked how different parameters impact speed of the neural network learning + + \paragraph{Changing learning rate} + \begin{center} + \begin{tabular}{ | c | c | } + \hline + Learning rate & Execution Time [s] \\ + \hline + 0.001 (default) & 49.3 \\ + \hline + 0.01 & 53.9 \\ + \hline + 0.1 & 50.1 \\ + \hline + \end{tabular} + \end{center} + + \paragraph{Changing batch size} + \begin{center} + \begin{tabular}{ | c | c | } + \hline + Batch Size & Execution Time [s] \\ + \hline + 1 & 567.2 (!) \\ + \hline + 64 (default) & 49.3 \\ + \hline + 128 & 48.1 \\ + \hline + 256 & 42.8 \\ + \hline + + \end{tabular} + \end{center} + + \paragraph{Changing number of hidden layers} + \begin{center} + \begin{tabular}{ | c | c | } + \hline + Hidden layers & Execution Time [s] \\ + \hline + 0 & 44.5 \\ + \hline + 1 & 48.8 \\ + \hline + 2 (default) & 49.3 \\ + \hline + 3 & 48.7 \\ + \hline + \end{tabular} + \end{center} + + \paragraph{Changing width} + \begin{center} + \begin{tabular}{ | c | c | } + \hline + Width & Execution Time [s] \\ + \hline + 64 & 46.7 \\ + \hline + 128 (default) & 49.3 \\ + \hline + 256 & 49.0 \\ + \hline + 512 & 52.1 \\ + \hline + 1024 & 73.9 \\ + \hline + \end{tabular} + \end{center} + + \paragraph{Changing optimizer type} + \begin{center} + \begin{tabular}{ | c | c | } + \hline + Learning rate & Execution Time [s] \\ + \hline + Adam (default) & 49.3 \\ + \hline + SGD & 45.1 \\ + \hline + SGD Momentum & 45.5 \\ + \hline + \end{tabular} + \end{center} + + \paragraph{Analysis} + Two parameters that had the biggest impact on execution time was setting batch size to extremely low value (1) and increasing width (jump between 512 width and 1024 is equal to 20 seconds more execution time) + +\end{document} diff --git a/Programming/EARIN/lab5/report/overleaf.txt b/Programming/EARIN/lab5/report/overleaf.txt new file mode 100644 index 00000000..cfe17955 --- /dev/null +++ b/Programming/EARIN/lab5/report/overleaf.txt @@ -0,0 +1 @@ +https://www.overleaf.com/4686517816nnvdwtftrjjx \ No newline at end of file diff --git a/Programming/EARIN/lab5/report/testsResults/loss/bs/def.png b/Programming/EARIN/lab5/report/testsResults/loss/bs/def.png new file mode 100644 index 00000000..d0e7555f Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/bs/def.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/bs/loss-1batch.png b/Programming/EARIN/lab5/report/testsResults/loss/bs/loss-1batch.png new file mode 100644 index 00000000..8c0521fb Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/bs/loss-1batch.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/bs/loss-lr0.001-bs128-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/bs/loss-lr0.001-bs128-hl2-w128-Adam.png new file mode 100644 index 00000000..3e017c61 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/bs/loss-lr0.001-bs128-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/bs/loss-lr0.001-bs256-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/bs/loss-lr0.001-bs256-hl2-w128-Adam.png new file mode 100644 index 00000000..d8aa31a8 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/bs/loss-lr0.001-bs256-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/def.png b/Programming/EARIN/lab5/report/testsResults/loss/def.png new file mode 100644 index 00000000..d0e7555f Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/def.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/hl/def.png b/Programming/EARIN/lab5/report/testsResults/loss/hl/def.png new file mode 100644 index 00000000..d0e7555f Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/hl/def.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/hl/hl0loss.png b/Programming/EARIN/lab5/report/testsResults/loss/hl/hl0loss.png new file mode 100644 index 00000000..5f00385f Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/hl/hl0loss.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/hl/loss-lr0.001-bs64-hl1-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/hl/loss-lr0.001-bs64-hl1-w128-Adam.png new file mode 100644 index 00000000..8ba3ddc4 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/hl/loss-lr0.001-bs64-hl1-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/hl/loss-lr0.001-bs64-hl3-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/hl/loss-lr0.001-bs64-hl3-w128-Adam.png new file mode 100644 index 00000000..fe2d22de Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/hl/loss-lr0.001-bs64-hl3-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/lr/def.png b/Programming/EARIN/lab5/report/testsResults/loss/lr/def.png new file mode 100644 index 00000000..d0e7555f Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/lr/def.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/lr/loss-lr0.01-bs64-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/lr/loss-lr0.01-bs64-hl2-w128-Adam.png new file mode 100644 index 00000000..a3c70d12 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/lr/loss-lr0.01-bs64-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/lr/loss-lr0.1-bs64-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/lr/loss-lr0.1-bs64-hl2-w128-Adam.png new file mode 100644 index 00000000..a20ee69c Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/lr/loss-lr0.1-bs64-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/optimizer/def.png b/Programming/EARIN/lab5/report/testsResults/loss/optimizer/def.png new file mode 100644 index 00000000..d0e7555f Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/optimizer/def.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/optimizer/loss-lr0.001-bs64-hl2-w128-SGD.png b/Programming/EARIN/lab5/report/testsResults/loss/optimizer/loss-lr0.001-bs64-hl2-w128-SGD.png new file mode 100644 index 00000000..71f99c4e Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/optimizer/loss-lr0.001-bs64-hl2-w128-SGD.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/optimizer/loss-lr0.001-bs64-hl2-w128-SGD_Momentum.png b/Programming/EARIN/lab5/report/testsResults/loss/optimizer/loss-lr0.001-bs64-hl2-w128-SGD_Momentum.png new file mode 100644 index 00000000..23ecd49e Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/optimizer/loss-lr0.001-bs64-hl2-w128-SGD_Momentum.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/w/def.png b/Programming/EARIN/lab5/report/testsResults/loss/w/def.png new file mode 100644 index 00000000..d0e7555f Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/w/def.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w1024-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w1024-Adam.png new file mode 100644 index 00000000..fd1a936b Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w1024-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w256-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w256-Adam.png new file mode 100644 index 00000000..3d27debf Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w256-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w512-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w512-Adam.png new file mode 100644 index 00000000..9123df4f Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w512-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w64-Adam.png b/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w64-Adam.png new file mode 100644 index 00000000..e26fbba8 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/loss/w/loss-lr0.001-bs64-hl2-w64-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/results.txt b/Programming/EARIN/lab5/report/testsResults/results.txt new file mode 100644 index 00000000..236d968f --- /dev/null +++ b/Programming/EARIN/lab5/report/testsResults/results.txt @@ -0,0 +1,72 @@ +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w64-Adam +Execution time: 49.23725199699402 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.1-bs64-hl2-w128-Adam +Execution time: 53.9505660533905 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.01-bs64-hl2-w128-Adam +Execution time: 50.100146532058716 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w128-Adam +Execution time: 48.90807557106018 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w128-Adam +Execution time: 49.567627906799316 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs128-hl2-w128-Adam +Execution time: 48.1188108921051 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs256-hl2-w128-Adam +Execution time: 42.80657482147217 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl1-w128-Adam +Execution time: 48.84401178359985 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w128-Adam +Execution time: 48.64533519744873 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl3-w128-Adam +Execution time: 48.79310631752014 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w64-Adam +Execution time: 46.702873945236206 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w128-Adam +Execution time: 47.38503313064575 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w256-Adam +Execution time: 49.08178782463074 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w512-Adam +Execution time: 52.18209147453308 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w1024-Adam +Execution time: 73.91722798347473 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w128-SGD +Execution time: 45.19260334968567 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w128-SGD_Momentum +Execution time: 45.510289907455444 +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- +loss-lr0.001-bs64-hl2-w128-Adam +Execution time: 46.77299380302429 +------------------------------------------------------------------------------------- diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/def.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/def.png new file mode 100644 index 00000000..6e85f884 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/def.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs128-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs128-hl2-w128-Adam.png new file mode 100644 index 00000000..38415847 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs128-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs256-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs256-hl2-w128-Adam.png new file mode 100644 index 00000000..ffd080fb Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs256-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl0-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl0-w128-Adam.png new file mode 100644 index 00000000..aa51ee44 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl0-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl1-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl1-w128-Adam.png new file mode 100644 index 00000000..53e86f87 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl1-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w1024-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w1024-Adam.png new file mode 100644 index 00000000..2111d229 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w1024-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w128-SGD.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w128-SGD.png new file mode 100644 index 00000000..f6129d37 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w128-SGD.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w128-SGD_Momentum.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w128-SGD_Momentum.png new file mode 100644 index 00000000..6641f108 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w128-SGD_Momentum.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w256-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w256-Adam.png new file mode 100644 index 00000000..422e3761 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w256-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w512-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w512-Adam.png new file mode 100644 index 00000000..cd59087c Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w512-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w64-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w64-Adam.png new file mode 100644 index 00000000..27c217b9 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl2-w64-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl3-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl3-w128-Adam.png new file mode 100644 index 00000000..f9c881d9 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.001-bs64-hl3-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.01-bs64-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.01-bs64-hl2-w128-Adam.png new file mode 100644 index 00000000..bbd948f9 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.01-bs64-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.1-bs64-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.1-bs64-hl2-w128-Adam.png new file mode 100644 index 00000000..a76d625f Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy-lr0.1-bs64-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy1batch.png b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy1batch.png new file mode 100644 index 00000000..2df288f1 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/trainAccuracy/trainAccuracy1batch.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/def.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/def.png new file mode 100644 index 00000000..210906cb Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/def.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs128-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs128-hl2-w128-Adam.png new file mode 100644 index 00000000..3b757e23 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs128-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs256-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs256-hl2-w128-Adam.png new file mode 100644 index 00000000..170f286a Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs256-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl1-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl1-w128-Adam.png new file mode 100644 index 00000000..111ad86b Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl1-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w1024-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w1024-Adam.png new file mode 100644 index 00000000..3ba46053 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w1024-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w128-SGD.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w128-SGD.png new file mode 100644 index 00000000..fe80e822 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w128-SGD.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w128-SGD_Momentum.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w128-SGD_Momentum.png new file mode 100644 index 00000000..e26791d5 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w128-SGD_Momentum.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w256-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w256-Adam.png new file mode 100644 index 00000000..f9aa076d Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w256-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w512-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w512-Adam.png new file mode 100644 index 00000000..249004cc Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w512-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w64-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w64-Adam.png new file mode 100644 index 00000000..55f465a0 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl2-w64-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl3-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl3-w128-Adam.png new file mode 100644 index 00000000..6354fd9e Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.001-bs64-hl3-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.01-bs64-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.01-bs64-hl2-w128-Adam.png new file mode 100644 index 00000000..6929e814 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.01-bs64-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.1-bs64-hl2-w128-Adam.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.1-bs64-hl2-w128-Adam.png new file mode 100644 index 00000000..6b85db42 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy-lr0.1-bs64-hl2-w128-Adam.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy1batch.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy1batch.png new file mode 100644 index 00000000..10d61175 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracy1batch.png differ diff --git a/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracyhl0.png b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracyhl0.png new file mode 100644 index 00000000..5acea448 Binary files /dev/null and b/Programming/EARIN/lab5/report/testsResults/validationAccuracy/validationAccuracyhl0.png differ diff --git a/Programming/EARIN/lab5/teamsMaterials/EARIN-Lab5.pdf b/Programming/EARIN/lab5/teamsMaterials/EARIN-Lab5.pdf new file mode 100644 index 00000000..16dfcf61 Binary files /dev/null and b/Programming/EARIN/lab5/teamsMaterials/EARIN-Lab5.pdf differ diff --git a/Programming/EARIN/lab6/EARIN_Lab_6.pdf b/Programming/EARIN/lab6/EARIN_Lab_6.pdf new file mode 100644 index 00000000..c082e1f5 Binary files /dev/null and b/Programming/EARIN/lab6/EARIN_Lab_6.pdf differ diff --git a/Programming/EARIN/lab6/README.md b/Programming/EARIN/lab6/README.md new file mode 100644 index 00000000..48cd9c7c --- /dev/null +++ b/Programming/EARIN/lab6/README.md @@ -0,0 +1,92 @@ +# group_17_EARIN_lab_6 + + + +## Getting started + +To make it easy for you to get started with GitLab, here's a list of recommended next steps. + +Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! + +## Add your files + +- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files +- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: + +``` +cd existing_repo +git remote add origin https://gitlab-stud.elka.pw.edu.pl/krudnic3/group_17_earin_lab_6.git +git branch -M main +git push -uf origin main +``` + +## Integrate with your tools + +- [ ] [Set up project integrations](https://gitlab-stud.elka.pw.edu.pl/krudnic3/group_17_earin_lab_6/-/settings/integrations) + +## Collaborate with your team + +- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) +- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) +- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) +- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) +- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) + +## Test and Deploy + +Use the built-in continuous integration in GitLab. + +- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) +- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) +- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) +- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) +- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) + +*** + +# Editing this README + +When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. + +## Suggestions for a good README +Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. + +## Name +Choose a self-explaining name for your project. + +## Description +Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. + +## Badges +On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. + +## Visuals +Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. + +## Installation +Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. + +## Usage +Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. + +## Support +Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. + +## Roadmap +If you have ideas for releases in the future, it is a good idea to list them in the README. + +## Contributing +State if you are open to contributions and what your requirements are for accepting them. + +For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. + +You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + +## Authors and acknowledgment +Show your appreciation to those who have contributed to the project. + +## License +For open source projects, say how it is licensed. + +## Project status +If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/Programming/EARIN/lab6/main.py b/Programming/EARIN/lab6/main.py new file mode 100644 index 00000000..3dde8d0a --- /dev/null +++ b/Programming/EARIN/lab6/main.py @@ -0,0 +1,179 @@ +""" +Code used to solve MountainCar-v0 gymnasium problem using Q-Learning algorithm +""" +from datetime import datetime +import gymnasium as gym +import numpy as np + +# Helper function to discretize the state + + +def discretize_state(state, env, first_time): + # print( + # f"state: {state}, state[0]: {state[0]}, env.observation_space.low: {env.observation_space.low}") + # print(f"state[0] - env {state[0] - env.observation_space.low}") + # print(f"state - env {state - env.observation_space.low}") + if first_time: + substract_from_state = state[0] - env.observation_space.low + else: + substract_from_state = state - env.observation_space.low + discretized_state = ( + substract_from_state) * np.array([10, 100]) + discretized_state = np.round(discretized_state, 0).astype(int) + return discretized_state + + +def initialize_environment(hyperparameters): + """ + Initialize environment and video recording + """ + # Initialize environment + env = gym.make('MountainCar-v0', render_mode='rgb_array') + # Save video + now = datetime.now() + time_string = now.strftime("%H:%M:%S") + env = gym.wrappers.RecordVideo( + env, + video_folder='vid', + disable_logger=True, + name_prefix=time_string, episode_trigger=lambda x: x > 600 and x % 2 == 0) + return env + + +def initialize_q_table(env): + """ + Initialize "empty" Q-table + """ + # Initialize Q-table + # n_actions = env.action_space.n # Number of possible actions, should be 3 + # 0 accelerate left + # 1 dont accelerate + # 2 accelerate to the right + # q_table = np.zeros((n_actions,)) + num_states = (env.observation_space.high - + env.observation_space.low) * np.array([10, 100]) + num_states = np.round(num_states, 0).astype(int) + 1 + q_table = np.zeros((num_states[0], num_states[1], env.action_space.n)) + return q_table + + +def initialize_hyperparameters(): + """ + Initialize hyperparameters used by algorithm + """ + hyperparameters = { + "learning_rate": 0.1, + "discount_factor": 0.99, + "epsilon": 0.2, + "max_episodes": 1000, + "max_steps": 500, + "min_max_car_position": [-1.2, 0.6], + "min_max_car_velocity": [-0.07, 0.07], + "goal_x": 0.5, + "truncation": 200 + } + return hyperparameters + + +def choose_action(hyperparameters, env, q_table, discretized_state): + """ + Choose one of 3 actions possible for the algorithm + """ + # hyperparameters["epsilon"]-greedy exploration-exploitation tradeoff + if np.random.uniform(0, 1) < hyperparameters["epsilon"]: + action = env.action_space.sample() # Choose a random action + else: + # Choose the action with the highest Q-value + action = np.argmax(q_table[discretized_state[0], discretized_state[1]]) + return action + + +def update_q_table(q_table, action, hyperparameters, reward): + """ + Update q_table with newest reward + """ + # Q-table update + q_value = q_table[action] + max_q_value = np.max(q_table) + new_q_value = (1 - hyperparameters["learning_rate"]) * q_value + \ + hyperparameters["learning_rate"] * \ + (reward + hyperparameters["discount_factor"] * max_q_value) + q_table[action] = new_q_value + return q_table + + +def movement(hyperparameters, env, q_table, discretized_state, total_reward=0, episode_number=0): + """ + Choose action and observe consequences + """ + action = choose_action(hyperparameters, env, q_table, discretized_state) + # Take the action and observe the next state + next_state, reward, terminated, truncated, _ = env.step(action) + discretized_next_state = discretize_state(next_state, env, False) + # print(discretized_next_state[0], discretized_next_state[1]) + q_table[discretized_state[0], discretized_state[1], action] += hyperparameters["learning_rate"] * (reward + hyperparameters["discount_factor"] * np.max( + q_table[discretized_next_state[0], discretized_next_state[1]]) - q_table[discretized_state[0], discretized_state[1], action]) + + total_reward += reward + discretized_state = discretized_next_state + done = terminated or truncated + if terminated: + print("Destination reached on episode: ", episode_number) + return hyperparameters, env, q_table, done, discretized_state, total_reward + + +def episode_step(env, hyperparameters, q_table, episode_rewards, episode_number): + """ + Actions done with every episode + """ + state = env.reset() # Reset the environment to an initial state + discretized_state = discretize_state(state, env, True) + done = False # Boolean to indicate episode completion + total_reward = 0 # Accumulate rewards for the episode + + for step in range(hyperparameters["max_steps"]): + hyperparameters, env, q_table, done, discretized_state, total_reward = movement( + hyperparameters, env, q_table, discretized_state, total_reward, episode_number) + if done: + break + + episode_rewards.append(total_reward) + return env, hyperparameters, q_table, episode_rewards + + +def training_loop(hyperparameters, env, q_table): + """ + Actual training for MountainCar + """ + episode_rewards = [] # List to store episode rewards + + for episode_number in range(hyperparameters["max_episodes"]): + env, hyperparameters, q_table, episode_rewards = episode_step( + env, hyperparameters, q_table, episode_rewards, episode_number) + + return env, q_table + + +def inference(env, q_table): + """ + Inference using the updated Q-table + """ + env.reset() + done = False + + while not done: + # Choose the action with the highest Q-value + action = np.argmax(q_table) + # Take the action and observe the next state + _, _, terminated, truncated, _ = env.step(action) + done = terminated or truncated + + +if __name__ == '__main__': + HYPERPARAMETERS = initialize_hyperparameters() + ENV = initialize_environment(HYPERPARAMETERS) + Q_TABLE = initialize_q_table(ENV) + ENV, Q_TABLE = training_loop(HYPERPARAMETERS, ENV, Q_TABLE) + inference(ENV, Q_TABLE) + + ENV.close() diff --git a/Programming/EARIN/lab6/poetry.lock b/Programming/EARIN/lab6/poetry.lock new file mode 100644 index 00000000..3ac84c24 --- /dev/null +++ b/Programming/EARIN/lab6/poetry.lock @@ -0,0 +1,664 @@ +[[package]] +name = "aiohttp" +version = "3.8.3" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotli", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "argon2-cffi" +version = "21.3.0" +description = "The secure Argon2 password hashing algorithm." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] +docs = ["sphinx", "sphinx-notfound-page", "furo"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["pytest", "cogapp", "pre-commit", "wheel"] +tests = ["pytest"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +cov = ["attrs", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs"] +docs = ["furo", "sphinx", "myst-parser", "zope.interface", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] +tests = ["attrs", "zope.interface"] +tests-no-zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] +tests_no_zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] + +[[package]] +name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "2.1.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "cryptography" +version = "38.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools-rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "debugpy" +version = "1.6.5" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "flask" +version = "2.2.2" +description = "A simple framework for building complex web applications." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +click = ">=8.0" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.0" +Jinja2 = ">=3.0" +Werkzeug = ">=2.2.2" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "importlib-metadata" +version = "6.0.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8", "importlib-resources (>=1.3)"] + +[[package]] +name = "iso8601" +version = "1.1.0" +description = "Simple module to parse ISO 8601 dates" +category = "main" +optional = false +python-versions = ">=3.6.2,<4.0" + +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "jedi" +version = "0.18.2" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx-rtd-theme (==0.4.3)", "sphinx (==1.8.5)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markupsafe" +version = "2.1.2" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "numpy" +version = "1.24.1" +description = "Fundamental package for array computing in Python" +category = "main" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "packaging" +version = "23.0" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "passlib" +version = "1.7.4" +description = "comprehensive password hashing framework supporting over 30 schemes" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +argon2-cffi = {version = ">=18.2.0", optional = true, markers = "extra == \"argon2\""} + +[package.extras] +argon2 = ["argon2-cffi (>=18.2.0)"] +bcrypt = ["bcrypt (>=3.1.0)"] +build_docs = ["sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)", "cloud-sptheme (>=1.10.1)"] +totp = ["cryptography"] + +[[package]] +name = "platformdirs" +version = "2.6.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.19.5)", "sphinx (>=5.3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +testing = ["pytest-benchmark", "pytest"] +dev = ["tox", "pre-commit"] + +[[package]] +name = "protobuf" +version = "4.21.12" +description = "" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pycryptodomex" +version = "3.16.0" +description = "Cryptographic library for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyseto" +version = "1.7.0" +description = "A Python implementation of PASETO/PASERK." +category = "main" +optional = false +python-versions = ">=3.7,<4.0" + +[package.dependencies] +cryptography = ">=36,<39" +iso8601 = ">=1.0.2,<2.0.0" +passlib = {version = ">=1.7.4,<2.0.0", extras = ["argon2"]} +pycryptodomex = ">=3.12.0,<4.0.0" + +[package.extras] +docs = ["Sphinx[docs] (>=4.3.2,<6.0.0)", "sphinx-autodoc-typehints[docs] (==1.12.0)", "sphinx-rtd-theme[docs] (>=1.0.0,<2.0.0)"] + +[[package]] +name = "python-lsp-jsonrpc" +version = "1.0.0" +description = "JSON RPC 2.0 server library" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ujson = ">=3.0.0" + +[package.extras] +test = ["coverage", "pytest-cov", "pytest", "pyflakes", "pycodestyle", "pylint"] + +[[package]] +name = "pytoolconfig" +version = "1.2.4" +description = "Python tool configuration" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +packaging = ">=22.0" +platformdirs = {version = ">=1.4.4", optional = true, markers = "extra == \"global\""} +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["tabulate (>=0.8.9)", "sphinx (>=4.5.0)"] +gen_docs = ["sphinx (>=4.5.0)", "sphinx-autodoc-typehints (>=1.18.1)", "sphinx-rtd-theme (>=1.0.0)", "pytoolconfig"] +global = ["platformdirs (>=1.4.4)"] +validation = ["pydantic (>=1.7.4)"] + +[[package]] +name = "replit" +version = "3.2.5" +description = "A library for interacting with features of repl.it" +category = "main" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +aiohttp = ">=3.6.2,<4.0.0" +Flask = ">=2.0.0,<3.0.0" +protobuf = ">=4.21.8,<5.0.0" +pyseto = ">=1.6.11,<2.0.0" +requests = ">=2.25.1,<3.0.0" +typing_extensions = ">=3.7.4,<4.0.0" +Werkzeug = ">=2.0.0,<3.0.0" + +[[package]] +name = "replit-python-lsp-server" +version = "1.15.9" +description = "Python Language Server for the Language Server Protocol" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +jedi = ">=0.17.2,<0.19.0" +pluggy = ">=1.0.0" +pyflakes = {version = ">=2.5.0,<2.6.0", optional = true, markers = "extra == \"pyflakes\""} +python-lsp-jsonrpc = ">=1.0.0" +rope = {version = ">0.10.5", optional = true, markers = "extra == \"rope\""} +toml = ">=0.10.2" +ujson = ">=3.0.0" +whatthepatch = {version = ">=1.0.2,<2.0.0", optional = true, markers = "extra == \"yapf\""} +yapf = {version = "*", optional = true, markers = "extra == \"yapf\""} + +[package.extras] +all = ["autopep8 (>=1.6.0,<1.7.0)", "flake8 (>=5.0.0,<5.1.0)", "mccabe (>=0.7.0,<0.8.0)", "pycodestyle (>=2.9.0,<2.10.0)", "pydocstyle (>=2.0.0)", "pyflakes (>=2.5.0,<2.6.0)", "pylint (>=2.5.0)", "rope (>=0.10.5)", "yapf", "whatthepatch"] +autopep8 = ["autopep8 (>=1.6.0,<1.7.0)"] +flake8 = ["flake8 (>=5.0.0,<5.1.0)"] +mccabe = ["mccabe (>=0.7.0,<0.8.0)"] +pycodestyle = ["pycodestyle (>=2.9.0,<2.10.0)"] +pydocstyle = ["pydocstyle (>=2.0.0)"] +pyflakes = ["pyflakes (>=2.5.0,<2.6.0)"] +pylint = ["pylint (>=2.5.0)"] +rope = ["rope (>0.10.5)"] +test = ["pylint (>=2.5.0)", "pytest", "pytest-cov", "coverage", "numpy (<1.23)", "pandas", "matplotlib", "pyqt5", "flaky"] +websockets = ["websockets (>=10.3)"] +yapf = ["yapf", "whatthepatch (>=1.0.2,<2.0.0)"] + +[[package]] +name = "requests" +version = "2.28.2" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rope" +version = "1.7.0" +description = "a python refactoring library..." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +pytoolconfig = {version = ">=1.2.2", extras = ["global"]} + +[package.extras] +dev = ["pytest (>=7.0.1)", "pytest-timeout (>=2.1.0)", "build (>=0.7.0)", "pre-commit (>=2.20.0)"] +doc = ["pytoolconfig", "sphinx (>=4.5.0)", "sphinx-autodoc-typehints (>=1.18.1)", "sphinx-rtd-theme (>=1.0.0)"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "typing-extensions" +version = "3.10.0.2" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "ujson" +version = "5.7.0" +description = "Ultra fast JSON encoder and decoder for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "urllib3" +version = "1.26.14" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "werkzeug" +version = "2.2.2" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog"] + +[[package]] +name = "whatthepatch" +version = "1.0.3" +description = "A patch parsing and application library." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "yapf" +version = "0.32.0" +description = "A formatter for Python code." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "yarl" +version = "1.8.2" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zipp" +version = "3.11.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "jaraco.functools", "more-itertools", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] + +[metadata] +lock-version = "1.1" +python-versions = ">=3.8.0,<3.9" +content-hash = "f328c469a46d9cb95c79b10c69318f07ccca3f40cc6eb43ef51c87ad2ff1879b" + +[metadata.files] +aiohttp = [] +aiosignal = [] +argon2-cffi = [] +argon2-cffi-bindings = [] +async-timeout = [] +attrs = [] +certifi = [] +cffi = [] +charset-normalizer = [] +click = [] +colorama = [] +cryptography = [] +debugpy = [] +flask = [] +frozenlist = [] +idna = [] +importlib-metadata = [] +iso8601 = [] +itsdangerous = [] +jedi = [] +jinja2 = [] +markupsafe = [] +multidict = [] +numpy = [] +packaging = [] +parso = [] +passlib = [] +platformdirs = [] +pluggy = [] +protobuf = [] +pycparser = [] +pycryptodomex = [] +pyflakes = [] +pyseto = [] +python-lsp-jsonrpc = [] +pytoolconfig = [] +replit = [] +replit-python-lsp-server = [] +requests = [] +rope = [] +toml = [] +tomli = [] +typing-extensions = [] +ujson = [] +urllib3 = [] +werkzeug = [] +whatthepatch = [] +yapf = [] +yarl = [] +zipp = [] diff --git a/Programming/EARIN/lab6/pyproject.toml b/Programming/EARIN/lab6/pyproject.toml new file mode 100644 index 00000000..8f677627 --- /dev/null +++ b/Programming/EARIN/lab6/pyproject.toml @@ -0,0 +1,20 @@ +[tool.poetry] +name = "python-template" +version = "0.1.0" +description = "" +authors = ["Your Name "] + +[tool.poetry.dependencies] +python = ">=3.10.0,<3.11" +numpy = "^1.22.2" +replit = "^3.2.4" +Flask = "^2.2.0" +urllib3 = "^1.26.12" + +[tool.poetry.dev-dependencies] +debugpy = "^1.6.2" +replit-python-lsp-server = {extras = ["yapf", "rope", "pyflakes"], version = "^1.5.9"} + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/Programming/EARIN/lab6/replit.nix b/Programming/EARIN/lab6/replit.nix new file mode 100644 index 00000000..53e42aa5 --- /dev/null +++ b/Programming/EARIN/lab6/replit.nix @@ -0,0 +1,23 @@ +{ pkgs }: { + deps = [ + pkgs.python310Full + pkgs.replitPackages.prybar-python310 + pkgs.replitPackages.stderred + ]; + env = { + PYTHON_LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [ + # Needed for pandas / numpy + pkgs.stdenv.cc.cc.lib + pkgs.zlib + # Needed for pygame + pkgs.glib + # Needed for matplotlib + pkgs.xorg.libX11 + ]; + PYTHONHOME = "${pkgs.python310Full}"; + PYTHONBIN = "${pkgs.python310Full}/bin/python3.10"; + LANG = "en_US.UTF-8"; + STDERREDBIN = "${pkgs.replitPackages.stderred}/bin/stderred"; + PRYBAR_PYTHON_BIN = "${pkgs.replitPackages.prybar-python310}/bin/prybar-python310"; + }; +} \ No newline at end of file diff --git a/Programming/EARIN/lab6/requirements.yml b/Programming/EARIN/lab6/requirements.yml new file mode 100644 index 00000000..3000663b --- /dev/null +++ b/Programming/EARIN/lab6/requirements.yml @@ -0,0 +1,12 @@ +name: rl-env +channels: + - conda-forge + - defaults +dependencies: + - gymnasium + - matplotlib + - moviepy + - numpy + - python=3.9 + - pygame + - opencv-python diff --git a/Programming/EARIN/lab6/run_conda.sh b/Programming/EARIN/lab6/run_conda.sh new file mode 100755 index 00000000..456b3b80 --- /dev/null +++ b/Programming/EARIN/lab6/run_conda.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +conda env create -f environment.yml \ No newline at end of file diff --git a/Programming/EARIN/lab7/code/main.pl b/Programming/EARIN/lab7/code/main.pl new file mode 100644 index 00000000..891f55d3 --- /dev/null +++ b/Programming/EARIN/lab7/code/main.pl @@ -0,0 +1,40 @@ +% month_days(Month, DaysInMonth, DaysBeforeMonth) +% returns the number of days in Month and the number of days it takes to reach that date in year 2023 +% prolog works by defining facts and rules and when queried about them returns values +% it works different from functional programming in this aspect since it +month_days('01', 31, 0). +month_days('02', 28, 31). +month_days('03', 31, 59). +month_days('04', 30, 90). +month_days('05', 31, 120). +month_days('06', 30, 151). +month_days('07', 31, 181). +month_days('08', 31, 212). +month_days('09', 30, 243). +month_days('10', 31, 273). +month_days('11', 30, 304). +month_days('12', 31, 334). + +% day_of_year(Date, DayOfYear) converts a date to day of year number later used to calculate interval +% It also checks if number of days given by user is smaller or equal to number of days in the given month and if no then it gives fail +day_of_year(Date, DayOfYear) :- + atom_chars(Date, Chars), + append(DayChars, MonthChars, Chars), + atom_chars(Day, DayChars), + atom_chars(Month, MonthChars), + month_days(Month, DaysInMonth, MonthDays), + atom_number(Day, DayNumber), + ((DayNumber =< DaysInMonth, DayNumber > 0) -> DayOfYear is MonthDays + DayNumber) ; fail. + +% interval(Date1, Date2) prints the number of days between Date1 and Date2 +% We always expect date to be in format ddmm where 'd' stands for day and 'm' stands for month +% if the month or day is just a single digit we expecte there to be zero in front +% (like 0505 for 5th of may or 1105 for 11th of may or 0511 for 5th of november) +% write(Interval) prints out result, nl writes newline to make output conform to project requirements as much as possible +interval(Date1, Date2) :- + (day_of_year(Date1, DayOfYear1), day_of_year(Date2, DayOfYear2) -> + Interval is abs(DayOfYear2 - DayOfYear1), + write(Interval), nl + ; + write('Invalid input.'), nl, fail + ). \ No newline at end of file diff --git a/Programming/EARIN/lab7/labMaterials/EARIN Lab 7.pdf b/Programming/EARIN/lab7/labMaterials/EARIN Lab 7.pdf new file mode 100644 index 00000000..bacbf32a Binary files /dev/null and b/Programming/EARIN/lab7/labMaterials/EARIN Lab 7.pdf differ diff --git a/Programming/EARIN/lab7/report/EARIN_LAB_7_KLISZKO_RUDNICKI.pdf b/Programming/EARIN/lab7/report/EARIN_LAB_7_KLISZKO_RUDNICKI.pdf new file mode 100644 index 00000000..c96eb264 Binary files /dev/null and b/Programming/EARIN/lab7/report/EARIN_LAB_7_KLISZKO_RUDNICKI.pdf differ diff --git a/Programming/EARIN/lab7/report/EARIN_LAB_7_KLISZKO_RUDNICKI.tex b/Programming/EARIN/lab7/report/EARIN_LAB_7_KLISZKO_RUDNICKI.tex new file mode 100644 index 00000000..243cbed9 --- /dev/null +++ b/Programming/EARIN/lab7/report/EARIN_LAB_7_KLISZKO_RUDNICKI.tex @@ -0,0 +1,183 @@ +\documentclass{article}[12pt] +\usepackage{listings} +\title{EARIN Lab 7 Report} +\author{Krzysztof Rudnicki, 307585 \and Jakub Kliszko, 303866} +\date{\today} + +\lstset{ + frameround=fttt, + language=Prolog, + breaklines=true, + keywordstyle=\bfseries, + basicstyle=\ttfamily + } + +\begin{document} +\maketitle +\section{Exercicse Variant 2} +Our task was to write Prolog program which returns number of days between two dates \\ +Assumptions: +\begin{itemize} + \item Year is 2023 + \item Number of days is $\leq$ 365 +\end{itemize} + +Exemplary use: +\begin{lstlisting} + ?- interval("2205", "0506") + 14 + + ?- interval ("0102", "1102") + 10 +\end{lstlisting} +Additional assumptions we made based on exemplary use is that we always receive date in "ddmm" format so first we receive 'd' (days) and then 'm' (month) \\ +If either days or month is a single digit we put '0' in front of the digit to force the string to be 4 characters wide \\ +Examples: \\ +1st of January is represented by "0101" \\ +2nd of November is represented by "0211" \\ +15th of January is represented by "1501" \\ +Another assumption we made is that interval will be always positive, order of dates does not matter so those queries: +\begin{lstlisting} + ?- interval("2205", "0506") + 14 + + ?- interval ("0506", "2205") + 14 +\end{lstlisting} +Will give the exact same results. \\ +Last assumption is that we do not count first date as whole day so: +\begin{lstlisting} + ?- interval("0101", "0101") + 0 + + ?- interval("0101", "3112") + 364 +\end{lstlisting} + +\section{Program} +Our program successfully performs its task and returns correct number of days based on our assumptions. \\ +Program fails and prints out a message "Invalid input" if: +\begin{itemize} + \item The number of days in the month is too big (for example \lstinline{interval("3205", "0506")}) + \item Month does not exist (for example \lstinline{interval("0113", "0506")}) + \item Input does not make sense (for example \lstinline{interval("xxyy", "0506")}) + \item Day of month is smaller or equal to "00" (for example \lstinline{interval("0011", "0506")}) +\end{itemize} + +Program does NOT return error and tries to return correct output (thanks to Prolog magic) for example when given incomplete input like: +\begin{lstlisting} + ?- interval("106", "0506"). + 4 +\end{lstlisting} + +\subsection{Prolog magic} +Prolog is based on the idea of logic programming. It does not have the concept of functions, it rather operates on predicates and goals. A predicate (a fact or a rule) defines a state of the world and a goal tells Prolog to make that state of the world come true, if possible (in other case it fails). + +For example, we can query our program with such command and it will return \emph{true}, because it is a valid state: +\begin{lstlisting} + ?- month_days('09', 30, 243). + true +\end{lstlisting} +The following query will fail, because the predicate is not valid for these values: +\begin{lstlisting} + ?- month_days('10', 28, 123). + false +\end{lstlisting} +We can however provide Prolog with an unbound values. It will try to find a possible solution and assign them. This is called unification: +\begin{lstlisting} + ?- month_days('09', DaysInMonth, Days). + Days = 243, + DaysInMonth = 30 +\end{lstlisting} +If there are multiple possible valid solutions, Prolog will remember them and backtrack to them in case it fails later. User can also ask for another solution if its available by pressing \emph{;}, for instance: +\begin{lstlisting} + ?- month_days(N, 30, X). + N = '04', + X = 90 ; + N = '06', + X = 151 ; + N = '09', + X = 243 ; + N = '11', + X = 304 +\end{lstlisting} + +\subsection{Modules} +The program consists of three main modules \\ +\begin{enumerate} + %\item \lstinline{month_days} which specifies what month string corresponds to what number of days and number of days it takes to reach this month + %\item \lstinline{day_of_year} which coverts date to number of days in the year used for later calculations, it also checks for erroneous input + %\item \lstinline{interval} which actually calculates the interval between two dates and returns it + \item \lstinline{month_days} which defines facts about the months -- how many days each month consists of and how many days it takes to reach this month + \item \lstinline{day_of_year} which tells how many days have passed since the beginning of the year to a given date + \item \lstinline{interval} which actually calculates the interval between two dates and writes it +\end{enumerate} + +\subsection{Tested examples} +\paragraph{Negative} +\begin{lstlisting} + % Wrong number of days in month + ?- interval("3205", "0506") + Invalid input. + false. + + % non existing month + ?- interval("0113", "0506"). + Invalid input. + false. + + % erroneous input + ?- interval("xxyy", "0506"). + Invalid input. + false. + + % Number of days equal or smaller than 00 + ?- interval("0011", "0506"). + Invalid input. + false. + + ?- interval("-1011", "0506"). + Invalid input. + false. +\end{lstlisting} + +\paragraph{Positive} +\begin{lstlisting} + % Examples from project requirements + ?- interval("2205", "0506"). + 14 + true. + + ?- interval("0102", "1102"). + 10 + true. + + % Edge cases, first day of year and last day of year + ?- interval("0101", "3112"). + 364 + true. + + % Edge case, the same date in both inputs + ?- interval("0101", "0101"). + 0 + true. + + % Edge case, input without first digit of day + ?- interval("2205", "506"). + 14 + true. +\end{lstlisting} + +\subsection{Differences} +In exemplary use there is no \emph{dot} '.' after query which was necessary for some interpreters (swipl) to actually run the query.\\ +Also in exemplary use there is no 'true' statement after number of days which Prolog by default displays after successful queries; we decided to not forcefully change it as it would contradict regular Prolog use philosophy. + +\section{Challenges} +The biggest challenge was understanding Prolog logic programming and its difference from functional programming paradigm.\\ +Then it was about finding correct directive for handling characters of date, we decided on \lstinline{atom_chars} and \lstinline{atom_numbers}.\\ +Last difficult part was writing the output exactly as in examples using \break\lstinline{write(Interval)} and \lstinline{nl}. + + + + +\end{document} \ No newline at end of file diff --git a/Programming/EARIN/project/README.md b/Programming/EARIN/project/README.md new file mode 100644 index 00000000..946507fb --- /dev/null +++ b/Programming/EARIN/project/README.md @@ -0,0 +1,92 @@ +# EARIN_project + + + +## Getting started + +To make it easy for you to get started with GitLab, here's a list of recommended next steps. + +Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! + +## Add your files + +- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files +- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: + +``` +cd existing_repo +git remote add origin https://gitlab-stud.elka.pw.edu.pl/krudnic3/earin_project.git +git branch -M main +git push -uf origin main +``` + +## Integrate with your tools + +- [ ] [Set up project integrations](https://gitlab-stud.elka.pw.edu.pl/krudnic3/earin_project/-/settings/integrations) + +## Collaborate with your team + +- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) +- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) +- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) +- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) +- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) + +## Test and Deploy + +Use the built-in continuous integration in GitLab. + +- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) +- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) +- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) +- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) +- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) + +*** + +# Editing this README + +When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. + +## Suggestions for a good README +Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. + +## Name +Choose a self-explaining name for your project. + +## Description +Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. + +## Badges +On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. + +## Visuals +Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. + +## Installation +Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. + +## Usage +Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. + +## Support +Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. + +## Roadmap +If you have ideas for releases in the future, it is a good idea to list them in the README. + +## Contributing +State if you are open to contributions and what your requirements are for accepting them. + +For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. + +You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + +## Authors and acknowledgment +Show your appreciation to those who have contributed to the project. + +## License +For open source projects, say how it is licensed. + +## Project status +If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/Programming/EARIN/project/final/code/main.py b/Programming/EARIN/project/final/code/main.py new file mode 100644 index 00000000..44ede9c4 --- /dev/null +++ b/Programming/EARIN/project/final/code/main.py @@ -0,0 +1,388 @@ +""" +Code for preprocessing data and creating model that predicts and +recomends anime based on another anime entered by user +""" +import math +import argparse +import shutil +import os +import datetime +import pandas as pd +import numpy as np +from sklearn.neighbors import NearestNeighbors +from sklearn.neighbors import VALID_METRICS_SPARSE +from scipy.sparse import csr_matrix + + +def get_data_cpu(limit_data=-1, data_folder_path="database"): + """ + Reads anime from csv database + """ + if limit_data > -1: + # User can limit number of data taken into consideration, + # model seems to work with limit_data value as low as 500,000 + rating_data = pd.read_csv( + data_folder_path + "/animelist.csv", nrows=limit_data) + else: + rating_data = pd.read_csv(data_folder_path + "/animelist.csv") + anime_data = pd.read_csv(data_folder_path + "/anime.csv") + return rating_data, anime_data + + +def get_data(limit_data=-1, data_folder_path="database", gpu=False): + rating_data, anime_data = get_data_cpu(limit_data, data_folder_path) + + # used to fetch anime_id(MAL_ID) + anime_data = anime_data.rename(columns={"MAL_ID": "anime_id"}) + anime_contact_data = anime_data[["anime_id", "Name"]] + rows_number = rating_data.shape[0] + return rating_data, anime_contact_data, rows_number + + +def merge_rating_anime_data(rating_data, anime_contact_data, debug=False): + """ + Preprocesses the data used for rating + """ + rating_data = rating_data.merge( + anime_contact_data, left_on="anime_id", right_on="anime_id", how="left" + ) + rating_data = rating_data[ + ["user_id", "Name", "anime_id", "rating", + "watching_status", "watched_episodes"] + ] + rating_head = rating_data.head() + if debug: + print(rating_head) + rating_shape_complete = rating_data.shape + if debug: + print(rating_shape_complete) + return rating_data + + +def split_data_below_thresholds(rating_data, data_name, threshold=-1, debug=False): + """ + Removes data with data_name which is below given threshold + """ + if threshold != -1: + count = rating_data[data_name].value_counts() + rating_data = rating_data[ + rating_data[data_name].isin(count[count >= threshold].index) + ].copy() + rating_shape_cut = rating_data.shape + if debug: + print(rating_shape_cut) + return rating_data + + +def combine_name_and_ratings(rating_data, debug=False): + """ + Create table which holds name of the anime and number of its reviews + then we merge this with rating_data + """ + combine_movie_rating = rating_data.dropna(axis=0, subset=["Name"]) + movie_rating_count = ( + combine_movie_rating.groupby(by=["Name"])["rating"] + .count() + .reset_index()[["Name", "rating"]] + ) + rating_head = movie_rating_count.head() + if debug: + print(rating_head) + rating_data = combine_movie_rating.merge( + movie_rating_count, left_on="Name", right_on="Name", how="left" + ) + return rating_data + + +def get_length_of_data(rating_data, data_name): + """ + We get amount of data in the database with a given column data_name + """ + # Encoding categorical data + column_ids = rating_data[data_name + "_id"].unique().tolist() + column_to_column = {x: i for i, x in enumerate(column_ids)} + rating_data[data_name] = rating_data[data_name + + "_id"].map(column_to_column) + users_number = len(column_to_column) + return users_number + + +def get_top_ranked(rating_data, data_name, join_table=None, top_data_taken=20): + """ + Get anime with highest ranking + """ + if join_table is None: + join_table = rating_data + group_data_by_rating = rating_data.groupby( + data_name + "_id")["rating"].count() + top_users = group_data_by_rating.dropna().sort_values(ascending=False)[ + :top_data_taken] + top_rated = join_table.join(top_users, rsuffix="_r", + how="inner", on=data_name + "_id") + return top_rated + + +def get_data_info(rating_data, debug=False, gpu=False): + """ + Get some informations about data + """ + users_number = get_length_of_data(rating_data, "user") + animes_number = get_length_of_data(rating_data, "anime") + + top_rated = get_top_ranked(rating_data, "user") + top_rated = get_top_ranked(rating_data, "anime", top_rated) + pivot = pd.crosstab(top_rated.user_id, top_rated.anime_id, + top_rated.rating, aggfunc=np.sum) + + pivot.fillna(0, inplace=True) + smallest_rating = min(rating_data["rating"]) + highest_rating = max(rating_data["rating"]) + if debug: + print(pivot) + if debug: + print(f"Num of users: {users_number}, Num of animes: {animes_number}") + print( + f"Min total rating: {smallest_rating}, Max total rating: {highest_rating}") + + +def preprocessing(rating_data, anime_contact_data, + debug=False, user_threshold=500, anime_threshold=200, auto=False): + """ + Preprocesses data for making model more accurate and/or faster + """ + rating_data = merge_rating_anime_data(rating_data, anime_contact_data) + rating_data = split_data_below_thresholds( + rating_data, "user_id", user_threshold) + rating_data = split_data_below_thresholds( + rating_data, "anime_id", anime_threshold) + rating_data = combine_name_and_ratings(rating_data) + + rating_data = rating_data.drop(columns="rating_y") + rating_data = rating_data.rename(columns={"rating_x": "rating"}) + if debug and not auto: + print(rating_data) + get_data_info(rating_data, True) + + pivot_table = rating_data.pivot_table( + index="Name", columns="user_id", values="rating" + ).fillna(0) + if debug and not auto: + print(pivot_table) + return pivot_table + + +def predict(prediction_model, pivot_table, seed=42, anime="RANDOM", recommendation_number=6, auto=False, debug=False): + """ + This will choose a random anime name and our prediction_model will predict similar anime. + """ + np.random.seed(seed) + if anime == "RANDOM": + chosen_anime = np.random.choice(pivot_table.shape[0]) + query = pivot_table.iloc[chosen_anime, :].values.reshape(1, -1) + chosen_anime_name = pivot_table.index[chosen_anime] + else: + query = pivot_table.loc[anime].values.reshape(1, -1) + chosen_anime_name = anime + distance, suggestions = prediction_model.kneighbors( + query) + if debug: + print("prediction model, distance: ", distance) + for i in range(0, 2): + if i == 0: + print(f"Recommendations for {chosen_anime_name}:\n") + else: + print( + f"""{i}: {pivot_table.index[suggestions.flatten()[i]]}, + with distance of {distance.flatten()[i]}:""" + ) + average_distance = np.mean(distance.flatten()) + closest_anime_name = pivot_table.index[suggestions.flatten()[1]] + closest_anime_distance = distance.flatten()[1] + average_minus_closest_distance = average_distance - closest_anime_distance + print( + f"Average distance: {average_distance}, average_minus_closest_distance: {average_minus_closest_distance}") + + return chosen_anime, suggestions.flatten()[1:recommendation_number+1], distance.flatten()[1:recommendation_number+1], f"{closest_anime_distance}_{average_distance}_{average_minus_closest_distance}" + # return f"{chosen_anime_name}_{closest_anime_name}_{closest_anime_distance}_{average_distance}_{average_minus_closest_distance}" + + +def calculate_neighbors(rows_number, neighbors=5): + neighbor_value = { + "default": 5, + "sqrt": math.floor(math.sqrt(rows_number)), + "half": math.floor(rows_number / 2), + "log": math.floor(math.log(rows_number)), + "n-1": rows_number - 1 + } + if isinstance(neighbors, str): + return neighbor_value[neighbors] + return neighbors + + +def create_model(pivot_table, rows_number, metric="cosine", algorithm="brute", neighbors=5): + """ + Creates model based on neaarest neighbor for anime prediction + """ + neighbors_number = calculate_neighbors(pivot_table.shape[0], neighbors) + pivot_table_matrix = csr_matrix(pivot_table.values) + if algorithm == "brute": + model = NearestNeighbors(n_neighbors=neighbors_number, + metric=metric, algorithm=algorithm) + else: + model = NearestNeighbors( + n_neighbors=neighbors_number, algorithm=algorithm) + try: + model.fit(pivot_table_matrix) + except: + print(f"""Error in create_model, probably wrong metric for data + Metric: {metric}, algorithm: {algorithm}""") + return "Error!" + return model + + +def handle_arguments(): + """ + Handles all arguments that can be used to change algorithm behaviour or program display + """ + parser = argparse.ArgumentParser(description='Example script with pyargs') + parser.add_argument('--data_limit', '-dl', + help="""Specify data limit, + Recommended at least 500k, set to -1 for no limit""", + required=False, type=int, default=-1) + parser.add_argument('--seed', '-s', + help='Specify seed', + type=int, required=False, default=42) + parser.add_argument('--debug', '-d', + help='Use debug (more information) prints', + type=bool, required=False, default=False) + parser.add_argument('--database', '-db', + help='Specify database path', + required=False, default="database") + + allowed_metric = ["cosine", "mahalanobis", "euclidean"] + parser.add_argument('--metric', '-m', + help='Specify metric for NearestNeighbor learner', + required=False, default="cosine", choices=allowed_metric) + allowed_algorithms = ['auto', 'brute'] + parser.add_argument('--algorithm', '-a', + help='Specify algorithm for Nearest Neighbor learner', + required=False, default="brute", choices=allowed_algorithms) + parser.add_argument('--anime', '-an', + help='Specify anime to choose', + required=False, default="RANDOM") + parser.add_argument('--neighbors', '-n', + help='Specify number of nearest neighbors', + required=False, default=5) + parser.add_argument('--user_threshold', '-ut', + help="""Specify minimal number of votes required for user to be + included in the data, set to -1 for no threshold""", + required=False, type=int, default=500) + parser.add_argument('--anime_threshold', '-at', + help="""Specify minimal number of votes required for anime + to be included in the data, set to -1 for no threshold""", + required=False, type=int, default=200) + parser.add_argument('--recommendation_amount', '-ra', + help='Specify how much anime should be recommended', + required=False, type=int, default=5) + parser.add_argument('--auto', '-au', + help="""Enable auto mode, no debug, no user parameters, + automatic testing and saving results""", + type=bool, required=False, default=False) + + # Parse the command-line arguments + args = parser.parse_args() + args.recommendation_amount = args.recommendation_amount + 1 + # Access the values of the arguments + return args.seed, args.debug, args.data_limit, args.database, args.metric, args.algorithm, args.anime, args.neighbors, args.user_threshold, args.anime_threshold, args.recommendation_amount, args.auto + + +def auto_mode(data_limit=-1, seed=42, anime="RANDOM"): + print("Started auto mode") + algorithm_spread = ['auto', 'brute'] + metric_spread = ['manhattan', 'euclidean', 'cosine'] + neighbor_spread = [5, "sqrt", "half", "log", "n-1"] + # No reason to access and waste computational power every time we run the simulation + starting_rating_data, starting_anime_contact_data, starting_rows_number = get_data( + limit_data=data_limit) + original_pivot_table = preprocessing( + starting_rating_data, starting_anime_contact_data) + if os.path.exists('test_results'): + shutil.rmtree('test_results') + for algorithm in algorithm_spread: + possibleMetrics = [] + if algorithm != 'auto': + possibleMetrics = metric_spread + print("testing for algorithm: ", algorithm, possibleMetrics) + if possibleMetrics == []: + possibleMetrics = [""] + for metric in possibleMetrics: + if metric != 'precomputed': + print("testing for algorithm, metric: ", algorithm, metric) + for neighbor_amount in neighbor_spread: + print("testing for algorithm, metric, neighbor_amount: ", + algorithm, metric, neighbor_amount) + preprocess_model_predict(starting_rating_data, starting_anime_contact_data, + starting_rows_number, original_pivot_table, seed=seed, anime=anime, neighbors=neighbor_amount, algorithm=algorithm, metric=metric) + + +def write_test_results(title, result=""): + # Create directory if it doesn't already exist + + if not os.path.exists('test_results'): + os.makedirs('test_results') + + # Generate timestamped filename + timestamp = datetime.datetime.now().strftime( + '%Y%m%d%H%M%S') # e.g., 20230611235959 + filename = f"{title}_{timestamp}.txt" + + # Create and write to the file + with open(os.path.join('test_results', filename), 'a') as file: + file.write(result) + + +def calculate_precision(predictions, threshold=8): + ratings = [anime[anime > 0].mean() for anime in predictions] + precision = [1 if r >= threshold else 0 for r in ratings] + return np.mean(precision) + + +def preprocess_model_predict(rating_data, anime_contact_data, rows_number, pivot_table, data_limit=-1, db="database", debug=False, user_threshold=500, anime_threshold=200, metric="cosine", algorithm="brute", neighbors=5, seed=42, anime="RANDOM", recommendation_amount=5): + MODEL = create_model(pivot_table, rows_number, + metric, algorithm, neighbors) + result = "" + if MODEL != "Error!": + chosen_anime, suggestions, distance, distance_data = predict(MODEL, pivot_table, seed, + anime, recommendation_amount) + + chosen_anime_name = pivot_table.index[chosen_anime] + # average_distance = np.mean(distance) + # closest_anime_name = pivot_table.index[suggestions[1]] + # closest_anime_distance = distance[1] + # average_minus_closest_distance = closest_anime_distance - average_distance + precision = calculate_precision( + [pivot_table.iloc[s] for s in suggestions]) + + result = f"{chosen_anime_name}:\n" + for i in range(len(suggestions)): + result += f"{pivot_table.index[suggestions[i]]}; Distance: {distance[i]}\n" + result += f"Precision: {precision*100}%\n" + result += "Smallest distance, average distance, Average - Smallest distance: " + distance_data + # result = f"{chosen_anime_name}_{closest_anime_name}_{closest_anime_distance}_{average_distance}_{average_minus_closest_distance}" + write_test_results( + f"dl={rows_number}&s={seed}&m={metric}&a={algorithm}&ut={user_threshold}&at={anime_threshold}&n={neighbors}", result) + + +if __name__ == "__main__": + SEED, DEBUG, DATA_LIMIT, DB, METRIC, ALGORITHM, ANIME, NEIGHBORS, USER_THRESHOLD, ANIME_THRESHOLD, RECOMMENDATION_AMOUNT, AUTO = handle_arguments() + if not AUTO: + print("Entered not auto mode") + starting_rating_data, starting_anime_contact_data, starting_rows_number = get_data( + limit_data=DATA_LIMIT, data_folder_path=DB) + pivot_table = preprocessing( + starting_rating_data, starting_anime_contact_data, USER_THRESHOLD, ANIME_THRESHOLD) + preprocess_model_predict(starting_rating_data, starting_anime_contact_data, starting_rows_number, + pivot_table, data_limit=DATA_LIMIT, db=DB, debug=DEBUG, user_threshold=USER_THRESHOLD, anime_threshold=ANIME_THRESHOLD, + metric=METRIC, algorithm=ALGORITHM, neighbors=NEIGHBORS, seed=SEED, anime=ANIME, recommendation_amount=RECOMMENDATION_AMOUNT) + if AUTO: + auto_mode(DATA_LIMIT, SEED, ANIME) diff --git a/Programming/EARIN/project/final/code/requirements.txt b/Programming/EARIN/project/final/code/requirements.txt new file mode 100644 index 00000000..b0c17db6 --- /dev/null +++ b/Programming/EARIN/project/final/code/requirements.txt @@ -0,0 +1,4 @@ +pandas +numpy +seaborn +matplotlib \ No newline at end of file diff --git a/Programming/EARIN/project/final/code/test_results_600k.zip b/Programming/EARIN/project/final/code/test_results_600k.zip new file mode 100644 index 00000000..b9a935ae Binary files /dev/null and b/Programming/EARIN/project/final/code/test_results_600k.zip differ diff --git a/Programming/EARIN/project/final/notes/automatingParametersTesting.txt b/Programming/EARIN/project/final/notes/automatingParametersTesting.txt new file mode 100644 index 00000000..bc9900d9 --- /dev/null +++ b/Programming/EARIN/project/final/notes/automatingParametersTesting.txt @@ -0,0 +1,39 @@ +Parameters: + - datalimit (usable between 500k and max) [max = 109,224,747 ] + - seed (very important make sure it stays the same through all testing [maybe just 42?]) + - metric (either cosine, mahalanobis or euclidean as in preliminary report) + - NN algorithm (either auto, ball_tree, kd_tree, brute) + - neighbors - number of nearest neigbors + - User threshold - minimal numbers of votes for user to be included in data + - Anime threshold - same for anime + + +These are 6 parameters that influence program behaviour and 1 parameter for seed +Probably would do simulations for 3 variants of each parameters (excluding seed), rest will be default + +so in total 6 * 3 = 18 simulations + +Default values: +Datalimit: all of data +Seed: 42 +Metric: cosine +NN algorithm: brute +Neighbors: 5 +User threshold: 500 +Anime threshold: 200 + +Neighbors number count: +k = 3-5: default starting points for small-medium dataset +k = sqrt(n): rule of thumb, n is number of instances in dataset (balanced between underfitting and overfitting) +l = n / 2: look at half of dataset for each prediction +k = log(n): for very large datasets +k = n - 1: Use all data except one, will probably overgenarlize the model + + +Values spread: +Datalimit: [27306186, 54612373, 109224747] (max on the right, then halved and halved) +Metric: ["cosine", "mahalanobis", "euclidean"] +NN algorithm: ['auto', 'ball_tree', 'kd_tree', 'brute'] +neighbors: [5, sqrt(n), n / 2, log(n), n - 1] +User threshold: [0, 500, 1000] +Anime threshold: [0, 200, 500] \ No newline at end of file diff --git a/Programming/EARIN/project/final/report/distance_auto.png b/Programming/EARIN/project/final/report/distance_auto.png new file mode 100644 index 00000000..3ec6ddba Binary files /dev/null and b/Programming/EARIN/project/final/report/distance_auto.png differ diff --git a/Programming/EARIN/project/final/report/distance_cosine.png b/Programming/EARIN/project/final/report/distance_cosine.png new file mode 100644 index 00000000..8b63a3ad Binary files /dev/null and b/Programming/EARIN/project/final/report/distance_cosine.png differ diff --git a/Programming/EARIN/project/final/report/distance_euclidean.png b/Programming/EARIN/project/final/report/distance_euclidean.png new file mode 100644 index 00000000..ded364dd Binary files /dev/null and b/Programming/EARIN/project/final/report/distance_euclidean.png differ diff --git a/Programming/EARIN/project/final/report/distance_manhattan.png b/Programming/EARIN/project/final/report/distance_manhattan.png new file mode 100644 index 00000000..7a37a774 Binary files /dev/null and b/Programming/EARIN/project/final/report/distance_manhattan.png differ diff --git a/Programming/EARIN/project/final/report/precision_metric.png b/Programming/EARIN/project/final/report/precision_metric.png new file mode 100644 index 00000000..7c55bc64 Binary files /dev/null and b/Programming/EARIN/project/final/report/precision_metric.png differ diff --git a/Programming/EARIN/project/final/report/precision_neighbor.png b/Programming/EARIN/project/final/report/precision_neighbor.png new file mode 100644 index 00000000..be6c3d47 Binary files /dev/null and b/Programming/EARIN/project/final/report/precision_neighbor.png differ diff --git a/Programming/EARIN/project/final/report/report.pdf b/Programming/EARIN/project/final/report/report.pdf new file mode 100644 index 00000000..f6b4389d Binary files /dev/null and b/Programming/EARIN/project/final/report/report.pdf differ diff --git a/Programming/EARIN/project/final/report/report.tex b/Programming/EARIN/project/final/report/report.tex new file mode 100644 index 00000000..bf2e2a2b --- /dev/null +++ b/Programming/EARIN/project/final/report/report.tex @@ -0,0 +1,200 @@ +\documentclass[12pt]{article} +\usepackage{listings} +\usepackage{hyperref} +\usepackage{graphicx} +\usepackage{float} +\title{EARIN project Final report} +\author{Krzysztof Rudnicki \\ Jakub Kliszko} +\begin{document} +\maketitle +\section{Introduction} +The goal of our project was to create a model for anime recommender \\ +After entering anime name from the database model should output recommended anime's +\section{Used data and algorithms} +\subsection{Data} +We used different data-set from originally specified in the project description \\ +We decided to use Anime Recommendation Database from Kaggle: \href{https://www.kaggle.com/datasets/hernan4444/anime-recommendation-database-2020}{LINK} \\ +Main reasons why we decided to use this database was that it was bigger than original one, was more recent, it was described as being 100\% usable by Kaggle and still had decent amount of code examples \\ +We are mostly interested in rating\_complete.csv file which contains information about anime ratings from users who completed the anime +\subsection{Algorithms} +We decided to use collaborative filtering to develop our model, It makes personalized recommendations based on preferences of similar users \\ +We represent anime data-set as embedding vector \\ +We use K-nearest neighbors model and decided to test it out with different metrics, neighbors and algorithms \\ +\subsubsection{Algorithms} +We decided to test our model with 2 algorithms: +\begin{enumerate} + \item Brute + \item Auto +\end{enumerate} +Ball Tree and KD Tree do not work on sparse input (as is the case with our input) so we decided to omit them + +\subsubsection{Neighbor number} +We decided to test our model with 5 different neighbor amount: +\begin{enumerate} + \item 5 - Popular starting point for small-medium data-sets + \item square root of available data - Usually helps to balance between under-fitting and over-fitting + \item half of available data - Usually useful for checking overall trend than specific nuances + \item logarithm of available data - Used for very large data-sets + \item n-1 neighbors - Usually leads to over generalization as we use all instances except one for prediction +\end{enumerate} + +\subsubsection{Metrics} +For brute algorithm we tested it will all possible metrics: +\begin{enumerate} + \item Cosine - Measures cosine of angle between vectors + \item Euclidean - Measures distance in straight line between two points + \item Manhattan - Measures sum of absolute paths between two coordinates +\end{enumerate} + +\section{Intermediate results} +\subsection{Results} +For intermediate solution we have implemented reading data from csv files, preprocessing them with optional showing of some of the information about the data and used model/learner for implementing neighbour searches \\ We implemented full manual mode for our program and added some parameters that will be later used for auto mode like choosing type of metric, algorithm, number of neighbors and seed +\subsection{Insights} +We find out that the solution we wanted to initially base on: \href{https://www.kaggle.com/code/chaitanya99/recommendation-system-cf-anime}{Kaggle code with tensorflow} was too complicated and required too much computational time, so we changed it to a simpler, faster one that was still enough to provide the solution \\ +We also found out when investigating the ratings that the rating is skewed towards higher values like 7, 8, 9 so the average rating is well above 5 +\begin{figure}[H] + \caption{User rating count} + \includegraphics[width=\textwidth]{user_rating.png} +\end{figure} + +\section{Using program} + \subsection{Arguments} + There are 13 parameters that can be modified which either influence how the program behaves or how the model behaves, too see how they can be modified user needs to run + \begin{lstlisting}[language=bash] + python main.py -h + \end{lstlisting} + Command + \begin{lstlisting}[language=bash] + options: + -h, --help show this help message and exit + --data_limit DATA_LIMIT, -dl DATA_LIMIT + Specify data limit, + Recommended at least 500k, + set to -1 for no limit + --seed SEED, -s SEED Specify seed + --debug DEBUG, -d DEBUG + Use debug (more information) prints + --database DATABASE, -db DATABASE + Specify database path + --metric {cosine,mahalanobis,euclidean}, + -m {cosine,mahalanobis,euclidean} + Specify metric for NearestNeighbor learner + --algorithm {auto, brute}, + -a {auto, brute} + Specify algorithm for + Nearest Neighbor learner + --anime ANIME, -an ANIME + Specify anime to choose + --neighbors NEIGHBORS, -n NEIGHBORS + Specify number of nearest neighbors + --user_threshold USER_THRESHOLD, -ut USER_THRESHOLD + Specify minimal number of votes required for + user to be included in the data, set to -1 for + no threshold + --anime_threshold ANIME_THRESHOLD, -at ANIME_THRESHOLD + Specify minimal number of votes required for + anime to be included in the data, set to -1 for + no threshold + --recommendation_amount RECOMMENDATION_AMOUNT, + -ra RECOMMENDATION_AMOUNT + Specify how much anime should be recommended + --auto AUTO, -au AUTO + Enable auto mode, no debug, + no user parameters, automatic testing and saving results + \end{lstlisting} + \subsubsection{Default arguments} + Default values of arguments are: + \begin{itemize} + \item Data Limit = -1 (means no limit, all data will be used) + \item Seed = 42 + \item Debug = False (means no debug information will be shown) + \item Database = database + \item Metric = cosine + \item Algorithm = brute + \item Anime = RANDOM (program will randomly choose anime for which there should be recommendation) + \item Neighbors = 5 + \item User Threshold = 500 + \item Anime Threshold = 200 + \item Recommendation Amount = 5 + \item Auto mode = False + \end{itemize} + \subsubsection{Reproducing} + In order to reproduce test results user should use: + \begin{lstlisting} + python main.py -au True -dl 600000 + \end{lstlisting} + Command which will run auto mode with 600 thousand entries + + +\section{Final experimental results} +\subsection{Experiments} +All of our experiments were done on data limited to \textbf{600 thousand entries}, rest of parameters were default \\ +We checked for 2 things in our experiments, precision of our algorithm and distances between recommended anime and input anime for different metrics and number of neighbors \\ +Precision was calculated based on the rating of anime which was recommended, if the anime recommended had rating higher or equal to 8 then the recommendation was "good", so true positive is any anime which rating is above or equal to 8 \\ +Unfortunately we did not manage to calculate recall and F1 score (since it requires recall to be calculated) +\subsection{Results} +\subsubsection{Precision} +\begin{figure}[H] + \caption{Precision from different metrics and auto algorithm} + \includegraphics[width=\textwidth]{precision_metric.png} +\end{figure} +\begin{figure}[H] + \caption{Precision from number of neighbors} + \includegraphics[width=\textwidth]{precision_neighbor.png} +\end{figure} +\subsubsection{Distance} +\begin{figure}[H] + \caption{Distance for Manhattan} + \includegraphics[width=\textwidth]{distance_manhattan.png} +\end{figure} +\begin{figure}[H] + \caption{Distance for Euclidean} + \includegraphics[width=\textwidth]{distance_euclidean.png} +\end{figure} +\begin{figure}[H] + \caption{Distance for Cosine} + \includegraphics[width=\textwidth]{distance_cosine.png} +\end{figure} +\begin{figure}[H] + \caption{Distance for Auto mode} + \includegraphics[width=\textwidth]{distance_auto.png} +\end{figure} +\subsection{Discussion} +\subsubsection{Precision} +As expected number of neighbors does not have influence on precision, metric used on different hand does, as we can see cosine metric achieves the best precision compared to cosine and euclidean metric. \\ +This means that the anime that is recommended from a model that metric usually has higher rating than anime's that use euclidean or Manhattan metric. \\ +Auto mode seems to use euclidean metric as the results between those two are exactly the same +\subsubsection{Distance} +Smallest distance was always the same within the same metric no matter the number of neighbors used \\ +The only thing that changed was average distance and consequently difference between average distance and smallest distance \\ +In general smaller number of neighbors used meant smaller average distance, notice how for neighbors equal to 5 and logarithm of number of entries average distance in all charts is roughly the same and below average distance for number of neighbours equal to square root of entries, half of entries or all entries but one \\ +We think that it means that simply by taking more data into consideration when recommending anime we increase number of outliners that are radically "far" from input anime \\ +For some reason sometimes the average distance was actually smaller than smallest distance, we did manage to understand why within time limit of this project \\ + + +\section{Challenges} +\subsection{Challenges themselves} +\paragraph{Precision} +The biggest challenge was implementing the algorithm that checks precision of our model, we had to reject recall and F1 score since defining what sort of base should they use to measure correctness of solution was not a trivial task +\paragraph{Data Size} +Another challenge was with the size of database itself which impacted speed of running new changes +\paragraph{Visualisation} +It was not easy to visualize the effects of experiments themselves, most program output is simple text and there is not much continues data that naturally aligns itself with some graphs +\subsection{Tackling challenges} +For precision we just settled on the idea of good recommendation to be any recommendation that recommends anime with rating above or equal 8 \\ +For Data size we introduced data limit argument which made it very easy and fast to introduce new changes \\ +For visualization we agreed on going through the precision of algorithm based on different thresholds and showing data for distances in the histogram chart + +\section{Conclusions} +\paragraph{Best parameters} +For our precision metrics we lean towards brute algorithm with cosine metric used, probably with logarithmic or 5 number of neighbors \\ +Cosine metric provides us with the best precision and small number of neighbors offers smaller average distance, it also behaves as expected since the average distance is smaller than the distance between input anime and recommended anime +\subsection{Solution satisfaction} +Our solution works, it manages to go through entire data-set and return some recommendation \\ +Those recommendation based on manual inspections are usually OK, model often behaves rationally for example by recommending sequel of anime when given anime's first part \\ +We also manage to make basic precision algorithm which considering how hard it is to define what a "correct" recommendation is, should be considered a success \\ +Overall we are content with the result given limited time, knowledge and resources on our disposal +\subsection{Potential improvements} +We did not manage to introduce more parameters when embedding data into vectors, like anime popularity or how controversial it is, this would probably make the model at least more interesting if not directly better + +\end{document} \ No newline at end of file diff --git a/Programming/EARIN/project/final/report/user_rating.png b/Programming/EARIN/project/final/report/user_rating.png new file mode 100644 index 00000000..da5493c4 Binary files /dev/null and b/Programming/EARIN/project/final/report/user_rating.png differ diff --git a/Programming/EARIN/project/midterm/code/main.py b/Programming/EARIN/project/midterm/code/main.py new file mode 100644 index 00000000..cc9b662a --- /dev/null +++ b/Programming/EARIN/project/midterm/code/main.py @@ -0,0 +1,244 @@ +""" +Code for preprocessing data and creating model that predicts and +recomends anime based on another anime entered by user +""" +import pandas as pd + +import numpy as np +import argparse + +import sklearn +from sklearn.neighbors import NearestNeighbors +from scipy.sparse import csr_matrix + + +def get_data(limit_data=-1, data_folder_path="database"): + """ + Reads anime from csv database + """ + if limit_data > -1: + # User can limit number of data taken into consideration, + # model seems to work with limit_data value as low as 500,000 + rating_data = pd.read_csv( + data_folder_path + "/animelist.csv", nrows=limit_data) + else: + rating_data = pd.read_csv(data_folder_path + "/animelist.csv") + anime_data = pd.read_csv(data_folder_path + "/anime.csv") + + # used to fetch anime_id(MAL_ID) + anime_data = anime_data.rename(columns={"MAL_ID": "anime_id"}) + anime_contact_data = anime_data[["anime_id", "Name"]] + return rating_data, anime_contact_data + + +def merge_rating_anime_data(rating_data, anime_contact_data, debug=False): + """ + Preprocesses the data used for rating + """ + rating_data = rating_data.merge( + anime_contact_data, left_on="anime_id", right_on="anime_id", how="left" + ) + rating_data = rating_data[ + ["user_id", "Name", "anime_id", "rating", + "watching_status", "watched_episodes"] + ] + rating_head = rating_data.head() + if debug: + print(rating_head) + rating_shape_complete = rating_data.shape + if debug: + print(rating_shape_complete) + return rating_data + + +def split_data_below_thresholds(rating_data, data_name, threshold=-1, debug=False): + """ + Removes data with data_name which is below given threshold + """ + if threshold != -1: + count = rating_data[data_name].value_counts() + rating_data = rating_data[ + rating_data[data_name].isin(count[count >= threshold].index) + ].copy() + rating_shape_cut = rating_data.shape + if debug: + print(rating_shape_cut) + return rating_data + + +def combine_name_and_ratings(rating_data, debug=False): + """ + Create table which holds name of the anime and number of its reviews + then we merge this with rating_data + """ + combine_movie_rating = rating_data.dropna(axis=0, subset=["Name"]) + movie_rating_count = ( + combine_movie_rating.groupby(by=["Name"])["rating"] + .count() + .reset_index()[["Name", "rating"]] + ) + rating_head = movie_rating_count.head() + if debug: + print(rating_head) + rating_data = combine_movie_rating.merge( + movie_rating_count, left_on="Name", right_on="Name", how="left" + ) + return rating_data + + +def get_length_of_data(rating_data, data_name): + """ + We get amount of data in the database with a given column data_name + """ + # Encoding categorical data + column_ids = rating_data[data_name + "_id"].unique().tolist() + column_to_column = {x: i for i, x in enumerate(column_ids)} + rating_data[data_name] = rating_data[data_name + + "_id"].map(column_to_column) + users_number = len(column_to_column) + return users_number + + +def get_top_ranked(rating_data, data_name, join_table=None, top_data_taken=20): + """ + Get anime with highest ranking + """ + if join_table is None: + join_table = rating_data + group_data_by_rating = rating_data.groupby( + data_name + "_id")["rating"].count() + top_users = group_data_by_rating.dropna().sort_values(ascending=False)[ + :top_data_taken] + top_rated = join_table.join(top_users, rsuffix="_r", + how="inner", on=data_name + "_id") + return top_rated + + +def get_data_info(rating_data, debug=False): + """ + Get some informations about data + """ + users_number = get_length_of_data(rating_data, "user") + animes_number = get_length_of_data(rating_data, "anime") + + top_rated = get_top_ranked(rating_data, "user") + top_rated = get_top_ranked(rating_data, "anime", top_rated) + + pivot = pd.crosstab(top_rated.user_id, top_rated.anime_id, + top_rated.rating, aggfunc=np.sum) + + pivot.fillna(0, inplace=True) + smallest_rating = min(rating_data["rating"]) + highest_rating = max(rating_data["rating"]) + if debug: + print(pivot) + if debug: + print(f"Num of users: {users_number}, Num of animes: {animes_number}") + print( + f"Min total rating: {smallest_rating}, Max total rating: {highest_rating}") + + +def preprocessing(rating_data, anime_contact_data, debug=False, user_threshold=500, anime_threshold=200): + """ + Preprocesses data for making model more accurate and/or faster + """ + rating_data = merge_rating_anime_data(rating_data, anime_contact_data) + rating_data = split_data_below_thresholds( + rating_data, "user_id", user_threshold) + rating_data = split_data_below_thresholds( + rating_data, "anime_id", anime_threshold) + rating_data = combine_name_and_ratings(rating_data) + + rating_data = rating_data.drop(columns="rating_x") + rating_data = rating_data.rename(columns={"rating_y": "rating"}) + if debug: + print(rating_data) + get_data_info(rating_data) + + pivot_table = rating_data.pivot_table( + index="Name", columns="user_id", values="rating" + ).fillna(0) + if debug: + print(pivot_table) + return pivot_table + + +def predict(prediction_model, pivot_table, seed=42, anime="RANDOM", recommendation_number=6): + """ + This will choose a random anime name and our prediction_model will predict similar anime. + """ + np.random.seed(seed) + print(pivot_table) + if anime == "RANDOM": + chosen_anime = np.random.choice(pivot_table.shape[0]) + query = pivot_table.iloc[chosen_anime, :].values.reshape(1, -1) + chosen_anime_name = pivot_table.index[chosen_anime] + else: + query = pivot_table.loc[anime].values.reshape(1, -1) + chosen_anime_name = anime + + distance, suggestions = prediction_model.kneighbors( + query, n_neighbors=recommendation_number) + for i in range(0, len(distance.flatten())): + if i == 0: + print(f"Recommendations for {chosen_anime_name}:\n") + else: + print( + f"{i}: {pivot_table.index[suggestions.flatten()[i]]}, with distance of {distance.flatten()[i]}:" + ) + + +def create_model(pivot_table, metric="cosine", algorithm="brute", neighbors=5): + """ + Creates model based on neaarest neighbor for anime prediction + """ + pivot_table_matrix = csr_matrix(pivot_table.values) + model = NearestNeighbors(n_neighbors=neighbors, + metric=metric, algorithm=algorithm) + model.fit(pivot_table_matrix) + return model + + +def handle_arguments(): + parser = argparse.ArgumentParser(description='Example script with pyargs') + parser.add_argument('--data_limit', '-dl', + help='Specify data limit, Recommended at least 500k, set to -1 for no limit', required=False, type=int, default=-1) + parser.add_argument('--seed', '-s', help='Specify seed', + type=int, required=False, default=42) + parser.add_argument('--debug', '-d', help='Use debug (more information) prints', + type=bool, required=False, default=False) + parser.add_argument('--database', '-db', help='Specify database path', + required=False, default="database") + + allowed_metric = ["cosine", "mahalanobis", "euclidean"] + parser.add_argument('--metric', '-m', help='Specify metric for NearestNeighbor learner', + required=False, default="cosine", choices=allowed_metric) + allowed_algorithms = ['auto', 'ball_tree', 'kd_tree', 'brute'] + parser.add_argument('--algorithm', '-a', help='Specify algorithm for Nearest Neighbor learner', + required=False, default="brute", choices=allowed_algorithms) + parser.add_argument('--anime', '-an', help='Specify anime to choose', + required=False, default="RANDOM") + parser.add_argument('--neighbors', '-n', help='Specify number of nearest neighbors', + required=False, default=5) + parser.add_argument('--user_threshold', '-ut', help='Specify minimal number of votes required for user to be included in the data, set to -1 for no threshold', + required=False, type=int, default=500) + parser.add_argument('--anime_threshold', '-at', help='Specify minimal number of votes required for anime to be included in the data, set to -1 for no threshold', + required=False, type=int, default=200) + parser.add_argument('--recommendation_amount', '-ra', help='Specify how much anime should be recommended', + required=False, type=int, default=5) + + # Parse the command-line arguments + args = parser.parse_args() + args.recommendation_amount = args.recommendation_amount + 1 + # Access the values of the arguments + return args.seed, args.debug, args.data_limit, args.database, args.metric, args.algorithm, args.anime, args.neighbors, args.user_threshold, args.anime_threshold, args.recommendation_amount + + +if __name__ == "__main__": + seed, debug, data_limit, db, metric, algorithm, anime, neighbors, user_threshold, anime_threshold, recommendation_amount = handle_arguments() + + RATING_DATA, ANIME_CONTACT_DATA = get_data(data_limit, db) + PIVOT_TABLE = preprocessing( + RATING_DATA, ANIME_CONTACT_DATA, debug, user_threshold, anime_threshold) + MODEL = create_model(PIVOT_TABLE, metric, algorithm, neighbors) + predict(MODEL, PIVOT_TABLE, seed, anime, recommendation_amount) diff --git a/Programming/EARIN/project/midterm/code/requirements.txt b/Programming/EARIN/project/midterm/code/requirements.txt new file mode 100644 index 00000000..b0c17db6 --- /dev/null +++ b/Programming/EARIN/project/midterm/code/requirements.txt @@ -0,0 +1,4 @@ +pandas +numpy +seaborn +matplotlib \ No newline at end of file diff --git a/Programming/EARIN/project/midterm/report/KLISZKO_RUDNICKI_MIDTERM_EARIN.pdf b/Programming/EARIN/project/midterm/report/KLISZKO_RUDNICKI_MIDTERM_EARIN.pdf new file mode 100644 index 00000000..17f7465b Binary files /dev/null and b/Programming/EARIN/project/midterm/report/KLISZKO_RUDNICKI_MIDTERM_EARIN.pdf differ diff --git a/Programming/EARIN/project/midterm/report/execution_time.png b/Programming/EARIN/project/midterm/report/execution_time.png new file mode 100644 index 00000000..9604f3c0 Binary files /dev/null and b/Programming/EARIN/project/midterm/report/execution_time.png differ diff --git a/Programming/EARIN/project/midterm/report/report.tex b/Programming/EARIN/project/midterm/report/report.tex new file mode 100644 index 00000000..237ec86f --- /dev/null +++ b/Programming/EARIN/project/midterm/report/report.tex @@ -0,0 +1,97 @@ +\documentclass[12pt]{article} +\usepackage{listings} +\usepackage{hyperref} +\usepackage{graphicx} +\title{EARIN project Midterm report} +\author{Krzysztof Rudnicki \\ Jakub Kliszko} +\begin{document} +\maketitle +\section{Progress} +We have implemented reading data from csv files, preprocessing them with optional showing of some of the information about the data and used model/learner for implementing neighbour searches \\ +Program is very flexible and allows for a lot of modification from command line arguments \\ +Full list here: +\begin{lstlisting}[language=bash] +options: +-h, --help show this help message and exit +--data_limit DATA_LIMIT, -dl DATA_LIMIT + Specify data limit, Recommended at least 500k, + set to -1 for no limit +--seed SEED, -s SEED Specify seed +--debug DEBUG, -d DEBUG + Use debug (more information) prints +--database DATABASE, -db DATABASE + Specify database path +--metric {cosine,mahalanobis,euclidean} +-m {cosine,mahalanobis,euclidean} + Specify metric for NearestNeighbor learner +--algorithm {auto,ball_tree,kd_tree,brute} +-a {auto,ball_tree,kd_tree,brute} + Specify algorithm for Nearest Neighbor learner +--anime ANIME, -an ANIME + Specify anime to choose +--neighbors NEIGHBORS, -n NEIGHBORS + Specify number of nearest neighbors +--user_threshold USER_THRESHOLD, -ut USER_THRESHOLD + Specify minimal number of votes + required for user to be included in + the data, set to -1 for no threshold +--anime_threshold ANIME_THRESHOLD, -at ANIME_THRESHOLD + Specify minimal number of votes + required for anime to be included + in the data, set to -1 for no threshold +\end{lstlisting} +\section{Results} +Currently recommendations are displayed in a following way: +\begin{lstlisting}[language=bash] +Recommendations for Kill la Kill: + +1: Shingeki no Kyojin, with distance of 0.11106648055176693: +2: Steins;Gate, with distance of 0.12104265014640536: +3: Toradora!, with distance of 0.12112848901274798: +4: Sword Art Online, with distance of 0.13046005032340824: +5: No Game No Life, with distance of 0.1306815843129835: +6: One Punch Man, with distance of 0.14848484728234945: +7: Angel Beats!, with distance of 0.15175709939974935: +8: Hataraku Maou-sama!, with distance of 0.15244674042590045: +9: Psycho-Pass, with distance of 0.15288022814590008: + \end{lstlisting} + Where we are given name of the anime for which we create recommendation and list of animes recommended with distance to original anime (lower is better) + \subsection{Data size and execution time} + \begin{figure} + \caption{Chart showing how size of data taken impacts execution time } + \includegraphics[width=\textwidth]{execution_time.png} + \end{figure} +This data was taken using default parameters execpt for increasing data size, each of three runs uses different seed + + +\paragraph{Seed} We added seed in predict function for choosing random anime, using the same seed always returns same recommendations and choosing random anime is the only random part of our code \\ +User can specify their own seed by using -s or --seed flag by entering in command line: +\begin{lstlisting} +python -s 42 +\end{lstlisting} +\section{Challenges} +\subsection{Failed attempts} +Biggest challenge was realizing how overcomplicated and unnecessary difficult to implement is the first code we based on: \href{https://www.kaggle.com/code/chaitanya99/recommendation-system-cf-anime}{Kaggle code with tensorflow} \\ +This solutions runs for almost 10 minutes on kaggle and implementing it to run on our local devices was a real chore that took us a good day and a half to implement \\ +This implementation is based around very powerful Tensor Processing Unit from google and while it is possible to change it to run on local graphics card it requires downloading both cuda and cudnn to a downgraded version supported by tensorflow (11.8) and downgrading graphics card drivers \\ +Running it with CPU results in the model training for over 3 hours +\subsection{Corrections} +Suprisingly even though we based our preliminary report around different example code we managed to not make any corrections to preliminary report \\ +All of functionality that we want to implement is available in sklearn and scipy +\subsection{Results and findings} +We can see that the rating is skewed towards higher values, users tend to give ratings of 7, 8 or 9 which inflates average rating to be well above 5 +\begin{figure} + \caption{User rating count} + \includegraphics[width=\textwidth]{user_rating.png} +\end{figure} +\section{Finishing project} +\subsection{Embedding more data in user and anime} +Currently we are only embedding pure rating values of users, we do not take into consideration, popularity, "controversy", studio which created the anime, length of anime (number of episodes and length of episodes), and when it was aired \\ +\subsection{Evaluating our model accuracy} +We need to introduce some way to evaluate accuracy of our model, we will try to introduce at least some of the measures mentioned in preliminary report: precision, recall, F1 score and MAP +\subsection{More results representation} +We still need to introduce more representation for our model results. Mainly how well it predicts similarity based on different parameter values (different modes, arguments and so on) \\ +We already can modify those values easily from the code itself and as argument, we just need to run those values and collect results + + +\end{document} \ No newline at end of file diff --git a/Programming/EARIN/project/midterm/report/user_rating.png b/Programming/EARIN/project/midterm/report/user_rating.png new file mode 100644 index 00000000..da5493c4 Binary files /dev/null and b/Programming/EARIN/project/midterm/report/user_rating.png differ diff --git a/Programming/EARIN/project/preliminary/preliminary.pdf b/Programming/EARIN/project/preliminary/preliminary.pdf new file mode 100644 index 00000000..7560a3e1 Binary files /dev/null and b/Programming/EARIN/project/preliminary/preliminary.pdf differ diff --git a/Programming/EARIN/project/preliminary/report.tex b/Programming/EARIN/project/preliminary/report.tex new file mode 100644 index 00000000..dca03d66 --- /dev/null +++ b/Programming/EARIN/project/preliminary/report.tex @@ -0,0 +1,281 @@ +\documentclass[12pt]{article} +\usepackage{graphicx} % Required for inserting images +\usepackage{hyperref} + +\title{EARIN Preliminary Project \\ +19 - Anime Recomender} +\author{Jakub Kliszko, Krzysztof Rudnicki } +\date{\today} + +\begin{document} +\maketitle + +The goal of this project is to develop a model for anime recommendation, which takes an anime name as an input and recommends a list of related anime's based on this name. \\ + + +\section{Algorithm description and examples} + +We will be using the collaborative filtering approach to develop our model. \\ +Collaborative filtering is a popular method for making personalized recommendations based on the preferences of other users with similar tastes. In this approach, the recommendation system analyzes a large data-set of user-item ratings to identify patterns and similarities between users and anime's, and uses this information to make recommendations to new users. + +We will represent users and anime's data-sets as embedding vectors. Embeddings provide a way to transform high-dimensional data into a lower-dimensional space while preserving relevant relationships. + +We have decided to use and test multiple metrics such as +\begin{itemize} + \item Cosine similarity + \item Mahalanobis Distance + \item Euclidean Distance +\end{itemize} +together with K-nearest neighbors algorithm. \\ + +\subsection{Embedding users and anime} +In order to embed users and anime we must choose which features of the user/anime are the most important for our model \\ +For the user we are restricted to what database offers, database pretty much only offers us what ratings the user gave to an anime, we will compare the performance of our algorithm when: +\begin{itemize} +\item Given ratings of the user for all anime that they gave rating to (no matter the watching status) +\item Given ratings of the user for all anime that they have \emph{completed} +\end{itemize} + +For anime we will use data: +\begin{itemize} + \item User score + \item Popularity (this includes popularity itself, number of members and favourites) + \item Controversy (Whether the anime gets a lot of 1s and 10s or just 6s) +\end{itemize} + +We have decided to use two different methods to combine data and compare the results \\ +First method is dot product which gives a single number after multiplying two vectors \\ +The second is concatenation which returns a new vector combining first and second vector \\ +As an input for all our metrics (like cosine similarity) we will use vectors of anime and users + + +\subsection{Metrics} +%\emph{Cosine similarity} is a metric used to compute the similarity between two users based on their ratings or preferences for anime. In our case, we will use cosine similarity to compute the similarity between each pair of users in our data-set based on their anime ratings. This will result in a similarity matrix, where each entry (i,j) represents the cosine similarity between users i and j. +\paragraph{Cosine similarity} is a measure used to calculate the similarity between two vectors representing items or users. It evaluates the cosine of the angle between the two vectors, indicating their directional similarity. In our use case, cosine similarity can help identify items or users with similar preferences or characteristics by comparing their embedding vectors. Higher cosine similarity values (closer to 1) indicate a stronger similarity between the vectors, suggesting that the items or users are more likely to have similar features or preferences. +\paragraph{Mahalanobis distance} is a metric that takes into account the correlations between variables when measuring the distance between two vectors. In our recommendation system, we can leverage Mahalanobis distance to quantify the dissimilarity between the embedding vectors of items or users. By considering the correlations within the embedding dimensions, Mahalanobis distance provides a more accurate measure of dissimilarity. It helps identify items or users that are dissimilar based on their characteristics or preferences, accounting for the relationships between different features. + +\paragraph{Euclidean distance} is a widely used metric to calculate the straight-line distance between two points in a multi-dimensional space. In our use case, we can apply Euclidean distance to measure the dissimilarity between the embedding vectors of items or users. By comparing the corresponding dimensions of the vectors and calculating the square root of the sum of squared differences, Euclidean distance provides a simple and intuitive measure of dissimilarity. It helps identify items or users that are relatively far apart in terms of their characteristics or preferences, based on the geometric distance in the embedding space. + +%\subsubsection{Cosine similarity input} +%TUTAJ MA BYĆ INNY TEKST A NIE KNN + +\paragraph{KNN} is a machine learning algorithm that we will use to find the K most similar users to a target user in the similarity matrix. The K most similar users will be our nearest neighbors, and we will use their ratings to generate recommendations for the target user. The number of nearest neighbors (K) that we choose will depend on the performance of our recommendation system on the validation set. We will experiment with different values of K and different weighting schemes for the ratings of the nearest neighbors to optimize the performance of our recommendation system. \\ + +%\paragraph{Euclidean distance} measures distance between two points in a straight line. It is used to measure similarity between points. Points that are closer to each other are considered to be similar. We can use it for finding nearest neighbors and clusters. + +%\paragraph{Mahalonobis distance} again measures distance between two points but this time it takes into consideration how different elements of data-set relate to each other. This should be an advantage over Euclidean distance which assumes that all inputs are independent of each other. +\subsection{Data used for recommendation} +In addition to users and their rating for anime, we will also use measures of: +\begin{itemize} +\item Controversy - Anime with lots of ’1’ and ’10 might have the exact same rating as anime with mostly ’6’ but it is much more +controversial (hit or miss) and it can be a good recommendation even though its rating might seem low +\item Combined data about popularity - Number of favorites, number of members which are in the group for fans of a given anime and overall popularity on the site +\item Ranked - How good the anime is in comparison with other anime's on the site +\end{itemize} + + + + +%Collaborative filtering is a technique that recommends items based on the preferences of similar users or items. \\ +%In our case, we will use the item-based collaborative filtering approach where we will recommend anime's based on their similarity to the input anime. \\ +%Our model will use the cosine similarity metric to measure the similarity between anime's. \\ +%We will also use a neighborhood-based approach to find the most similar anime's. \\ +%Specifically, we will use the K-nearest neighbors (KNN) algorithm to identify the most similar anime's to the input anime. + +\section{Selection and description of the data-sets} +The quality and size of the dataset may greatly affect the performance of the collaborative filtering algorithm. This is why we decided to choose a dataset that was newer and bigger than the one provided in the task. +We will be using the Anime Recommendations Database from Kaggle \href{https://www.kaggle.com/datasets/hernan4444/anime-recommendation-database-2020}{LINK}. The data-set contains information about over 17,000 anime's and over 300,000 users. \\ +\subsection{Why this data set} +There are multiple reasons to use this specific data set over different ones available on Kaggle (including the one proposed in task description) \\ +\begin{itemize} +\item It is considered to have 100 \% usability by Kaggle +\begin{itemize} +\item It is tagged, has subtitle, description and cover image +\item It has a source, is public and was updated recently (2020) +\item It has the most permissive (CC0) license, good file format, and all files and columns are described +\end{itemize} +\item It is one of the biggest anime databases on kaggle (605 MB) +\item It has over 60 code examples of use +\end{itemize} +\subsection{Data-set description} + +The data-set contains: +\begin{itemize} + \item The anime list per user (dropped, complete, plan to watch, currently watching and on hold) + \item Ratings given by users to the anime's that they has watched completely. + \item Information about anime (exactly 35 columns!), most importantly: + \begin{itemize} + \item Name + \item User score + \item Popularity + \item Members + \item Favourites + \item Number of each particular score (from 1 to 10) + \end{itemize} + \item HTML files containing reviews, synopsis, staff info etc. +\end{itemize} +There are 5 csv files in total and one HTML folder +\subsection{anime.csv} +It contains information about all anime scraped \\ +In total it contains \textbf{35} columns \\ +Information's that might be in our opinion use-full and are not contained within rest of the files are: +Information's that might be use full for our algorithm: +\begin{itemize} +\item Number of episodes - Some users might prefer shorter/longer anime's +\item When it was aired - Some users might prefer older/newer anime styled +\item When it was premiered - Same as above +\item Studios - Some users might favourite specific Studios style +\item Duration - Some users might prefer anime's with shorter single episode length +\item Ranked - Anime that might not be a hit with a certain user but is still considered to be very good can still be a good recommendation +\item Popularity - Anime that might not be a hit with a certain user but is very popular can still be a good recommendation +\item Members - Same as above +\item Favorites - Same as above +\item Number of exact amount of scores from 1 to 10 - This can tell how "controversial" the anime is, anime with lots of '1' and '10 might have the exact same rating as anime with mostly '6' but it is much more controversial (hit or miss) +\end{itemize} + +In formations that might be use-full to display: +\begin{itemize} +\item Type - Usually whether it is a series (TV or OVA) or movie +\item Number of episodes - How much time does it take to watch it +\item When it was aired - Start of anime being shown and end of it +\item When it was premiered - When the anime started +\item Studios - What studio produced it +\item Duration - How much time does it take to watch single episode +\item Ranked - How good it is in relation to all other anime's on my anime list +\end{itemize} +\subsection{anime\_with\_synopsis.csv} +CSV file containing anime info for humans \\ +It contains 5 columns: +\begin{itemize} + \item (key) mal\_id - used to identify the anime + \item name - either English or R\=omaji version of the title + \item score - average anime score + \item genres - list of genres associated with this anime + \item synopsis - description of anime +\end{itemize} +This file will be use-full for displaying the recommendation to user with additional info +\subsection{animelist.csv} +This file contains information about all users anime lists, no matter their watching status \\ +In total it contains over 105 million rows \\ +There are over 60 million ratings given by users (compared with over 55 for only completed series) +It contains 5 columns: +\begin{itemize} + \item (key) user\_id - random (but persistent through database) user id + \item (key) anime\_id - used to identify the anime + \item rating - what score this user set for this anime (zero is set if user did not set any score) + \item watching\_status - state ID for this anime in the anime list of the user (see \ref{watchingStatus} watching\_status.csv) + \item watched\_episodes - how many episodes have been watched by the user +\end{itemize} +This file can be potentially use full especially to determine what users with similar interest are planning to watch +\subsection{rating\_complete.csv} +This file contains information about all ratings given to animes by users who selected watching\_status 2 option (complete) \\ +In total it contains over 55 million ratings \\ +It contains 3 columns: +\begin{itemize} + \item (key) user\_id - random (but persistent through database) user id + \item (key) anime\_id - used to identify the anime + \item rating - what score this user set for this anime (1-10 scale) +\end{itemize} +This is probably the most important file regarding our project +\subsection{watching\_status.csv} +\label{watchingStatus} +\begin{figure}[h] +\caption{Entire contents of watching\_status.csv file} +\centering +\begin{tabular}{| c | c |} +\hline +status & description \\ +\hline +1 & Currently Watching \\ +\hline +2 & Completed \\ +\hline +3 & On Hold \\ +\hline +4 & Dropped \\ +\hline +6 & Plan to Watch \\ +\hline +\end{tabular} +\end{figure} + +Watching status file is used to relate numerical id of watching status to actual textual description of this status \\ +Status number 5 is missing, possibly referring to "re-watching" status? \\ +Meaning of particular descriptions: +\begin{itemize} + \item Currently Watching - Actively keeping up with the series + \item Completed - Watched the entire series/film + \item On Hold - Stopped watching it but possibly wanting to return to it + \item Dropped - Stopped watching it and decided not to return it + \item Plan to Watch - Not watched it yet but plan to +\end{itemize} +For most purposes we will be only interested in status 2 (completed) which tells us that the user checked the anime as already watched \\ +Plan to watch is also interesting since it can be used to recommend anime based on what similar users are interested in +\subsection{HTML folder} +HTML folder contains HTML scraped info about specific anime's, we will ignore this folder as parsing HTML is a much bigger challenge and outside of the scope of our project +\subsection{Summary} +There are two most important files, for program inner workings: rating\_complete.csv and anime\_with\_synopsis.csv for showing the recommended anime to user + +\section{General plan of tests/experiments} + +To evaluate and compare the performance of our collaborative filtering model with different parameter configurations, we will use grid search and 5-fold cross-validation. + +Grid search will allow us to systematically test different combinations of hyperparameters, such as the number of nearest neighbors in KNN and the regularization strength in the matrix factorization algorithm, to find the best combination that maximizes the model's performance. + +Cross-validation will help us to estimate the model's generalization performance and reduce the risk of overfitting to the training data. +% Notka dla nas: Hyperparameters: Parameters that are set before training a machine learning model and cannot be learned from the data. Examples of hyperparameters include the learning rate, the number of hidden layers in a neural network, and the regularization strength. +% Notka dla nas: Overfitting is a common problem in machine learning where a model is trained too well on the training data and performs poorly on the testing or validation data. In other words, the model learns the patterns and noise in the training data to such a degree that it loses the ability to generalize and predict accurately on new data. + +To measure the quality of our model's recommendations, we will use precision, recall, and F1-score metrics. Precision measures the proportion of relevant items among the recommended items, recall measures the proportion of relevant items that are recommended, and F1-score is the harmonic mean of precision and recall, providing a balanced measure of the model's performance. We will compute these metrics on the test set and report the average scores across the 5-fold cross-validation. + +%Our main goal is to evaluate the performance of the recommendation model. We will perform a 5-fold cross-validation to estimate the generalization performance of the model. We will also use precision, recall, and F1-score metrics to evaluate the model's performance. We will experiment with different values of K (number of neighbors) to find the optimal value. + +\section{Methods of result visualization} + +For the visualization, we chose three methods: +\begin{itemize} +\item Heatmaps: They are useful for visualizing the similarity between users or animes based on their ratings. They will allow us to identify clusters of similar users or animes and explore how their preferences are related to one another. + +% https://rpubs.com/jeknov/movieRec +\begin{figure} +\centering + \caption{An exemplary heatmap} + \label{fig:heatmap} +\end{figure} + +\item Histograms: They will be used to visualize the distribution of ratings and identifying any biases or patterns in the data. They can help us identify whether the ratings are normally distributed or skewed. + +\begin{figure} +\centering + \caption{An exemplary histogram} + \label{fig:precission-recall} +\end{figure} + +\item Precision-recall curves: They show the tradeoff between precision and recall at different thresholds, allowing us to identify the optimal threshold for making recommendations. By visualizing the performance of the algorithm in this way, we can identify areas for improvement and generate new hypotheses for increasing the accuracy of the recommendations. +\end{itemize} + +\begin{figure} +\centering + \caption{An exemplary precision-recall graph} + \label{fig:histogram} +\end{figure} + +\section{Definition of quality measures that will be used} +In order to evaluate the quality of our recommendation system, we will use a combination of precision, recall, F1 score, and MAP. Precision measures the proportion of relevant items among the recommended items, while recall measures the proportion of relevant items that were actually recommended. F1 score is the harmonic mean of precision and recall, providing a balanced measure of the system's performance. + +MAP is calculated by taking the average of the average precision (AP) for each user. AP is calculated as the mean of the precision values obtained at each relevant item position in the ranked list of recommended items. + +To calculate MAP, we need to define a threshold for relevance, which can be either binary (relevant or not relevant) or graded (assigning a relevance score to each anime). In our case, we will use a binary threshold, where an anime is considered relevant if has been rated 8 or higher. We will also calculate MAP for different values of K (number of recommended items), as the quality of the recommendations may vary depending on the number of items displayed to the user. + +%Quality Measures: + +%We will use the following quality measures to evaluate the performance of the model: + +% Precision: the ratio of true positive predictions to the total number of predicted positives. +% Recall: the ratio of true positive predictions to the total number of actual positives. +% F1-score: the harmonic mean of precision and recall. + +%We will also use the mean average precision (MAP) as an additional quality measure to evaluate the model's performance. + + +\end{document} diff --git a/Programming/EARIN/project/projectMaterials/EARIN - Daniel Marczak project guidelines.pdf b/Programming/EARIN/project/projectMaterials/EARIN - Daniel Marczak project guidelines.pdf new file mode 100644 index 00000000..b2befc45 Binary files /dev/null and b/Programming/EARIN/project/projectMaterials/EARIN - Daniel Marczak project guidelines.pdf differ