From 6c5b8295ca31e2bec5ac7ef1faaf01e47a394f3c Mon Sep 17 00:00:00 2001 From: Luca Lombardo Date: Wed, 9 Mar 2022 22:39:31 +0100 Subject: [PATCH] automatic benchmarkig (finally) --- filters/actors_graph_filter.py | 9 +- scripts/actor_bench/bench_me.sh | 16 +++ scripts/actor_bench/top_actors_50_c.txt | 100 ++++++++++++++++++ scripts/actor_bench/top_actors_50_h.txt | 100 ++++++++++++++++++ scripts/actor_bench/top_actors_60_c.txt | 100 ++++++++++++++++++ scripts/actor_bench/top_actors_60_h.txt | 100 ++++++++++++++++++ ...op_actors_c_70.txt => top_actors_70_c.txt} | 0 ...op_actors_h_70.txt => top_actors_70_h.txt} | 0 scripts/actors_graph | Bin 0 -> 68992 bytes scripts/actors_graph.cpp | 14 ++- tex/main.pdf | Bin 306485 -> 306485 bytes 11 files changed, 434 insertions(+), 5 deletions(-) create mode 100755 scripts/actor_bench/bench_me.sh create mode 100644 scripts/actor_bench/top_actors_50_c.txt create mode 100644 scripts/actor_bench/top_actors_50_h.txt create mode 100644 scripts/actor_bench/top_actors_60_c.txt create mode 100644 scripts/actor_bench/top_actors_60_h.txt rename scripts/actor_bench/{top_actors_c_70.txt => top_actors_70_c.txt} (100%) rename scripts/actor_bench/{top_actors_h_70.txt => top_actors_70_h.txt} (100%) create mode 100755 scripts/actors_graph diff --git a/filters/actors_graph_filter.py b/filters/actors_graph_filter.py index 1a4f598..753e6c8 100755 --- a/filters/actors_graph_filter.py +++ b/filters/actors_graph_filter.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import argparse import gzip import requests import pandas as pd @@ -6,7 +7,11 @@ import numpy as np import os import csv -MIN_MOVIES = 70 # Only keep relations for actors that have made more than this many movies +# MIN_MOVIES = 5 # Only keep relations for actors that have made more than this many movies + +parser = argparse.ArgumentParser() +parser.add_argument("--min-movies", type=int, required=True) +args = parser.parse_args() #-----------------DOWNLOAD .GZ FILES FROM IMDB DATABASE-----------------# def colored(r, g, b, text): @@ -66,7 +71,7 @@ df_relazioni = pd.read_csv( df_relazioni.query('(category == "actor" or category == "actress") and tconst in @filtered_tconsts', inplace=True) # Returns an array of unique actor ids (nconsts) and an array of how many times they appear (counts) => the number of movies they appear in nconsts, counts = np.unique(df_relazioni["nconst"].to_numpy(), return_counts=True) -filtered_nconsts = nconsts[counts>=MIN_MOVIES] +filtered_nconsts = nconsts[counts>=args.min_movies] df_relazioni.query("nconst in @filtered_nconsts", inplace=True) # Now select only films and actors that have at lest a relation diff --git a/scripts/actor_bench/bench_me.sh b/scripts/actor_bench/bench_me.sh new file mode 100755 index 0000000..3a28876 --- /dev/null +++ b/scripts/actor_bench/bench_me.sh @@ -0,0 +1,16 @@ +#!/bin/bash +cd "$(dirname "$(realpath "$0")")" + +for minmovies in 50 60 70 +do + echo "##### STARTING FILTERING FOR MIN_MOVIES=$minmovies #####" + cd ../../filters + ./actors_graph_filter.py --min-movies $minmovies + + echo "##### STARTING TOP-K CLOSENESS COMPUTATION FOR THE ACTORS GRAPH WITH MIN_MOVIES=$minmovies #####" + cd ../scripts/ + /usr/bin/time -o actor_bench/time/top_actors_${minmovies}_time.log ./actors_graph actor_bench/top_actors_${minmovies} + cd actor_bench + + # echo "##### DONE...\n #####" +done diff --git a/scripts/actor_bench/top_actors_50_c.txt b/scripts/actor_bench/top_actors_50_c.txt new file mode 100644 index 0000000..96ec58d --- /dev/null +++ b/scripts/actor_bench/top_actors_50_c.txt @@ -0,0 +1,100 @@ +489 Christopher Lee 0.36884 +1725 Omar Sharif 0.366906 +626259 Franco Nero 0.364897 +323 Michael Caine 0.357953 +106387 Rossano Brazzi 0.353559 +1884 Max von Sydow 0.351983 +1626 Christopher Plummer 0.350356 +6573 Philippe Leroy 0.349139 +308 Ernest Borgnine 0.348303 +1036 Geraldine Chaplin 0.347625 +7042 Herbert Lom 0.347275 +302 Jacqueline Bisset 0.347166 +722636 John Rhys-Davies 0.346818 +1012 Claudia Cardinale 0.346405 +1424 Udo Kier 0.345885 +1016 David Carradine 0.345647 +172 Harvey Keitel 0.345453 +1868 Michael York 0.345388 +53 Robert Mitchum 0.345237 +728 Mario Adorf 0.344742 +2145 Trevor Howard 0.344699 +1934 Kabir Bedi 0.344035 +51 James Mason 0.343586 +125 Sean Connery 0.343564 +312575 Giuliano Gemma 0.343074 +1657 Oliver Reed 0.342883 +1698 John Savage 0.342628 +514059 Virna Lisi 0.341781 +442 Rutger Hauer 0.341338 +564 Peter O'Toole 0.340036 +24 John Gielgud 0.339744 +554 Sam Neill 0.339619 +1262 Ben Gazzara 0.339327 +140649 Mathieu Carrière 0.339202 +454 Dennis Hopper 0.338475 +367 Gérard Depardieu 0.338041 +1768 Rod Steiger 0.337958 +63 Anthony Quinn 0.337876 +1426 Ben Kingsley 0.337834 +1703 Maximilian Schell 0.337814 +603402 Jeanne Moreau 0.337814 +681566 Michel Piccoli 0.337669 +603 Vanessa Redgrave 0.337011 +18 Kirk Douglas 0.336847 +800 Armand Assante 0.336703 +919 Senta Berger 0.336498 +616 Eric Roberts 0.336416 +908919 Eli Wallach 0.336334 +1811 Peter Ustinov 0.336273 +627 Greta Scacchi 0.336171 +514 Michael Madsen 0.336089 +1638 Jürgen Prochnow 0.335987 +148041 Adolfo Celi 0.335763 +842 Martin Balsam 0.335681 +1285 Elliott Gould 0.335457 +362735 Robert Hardy 0.335173 +59 Laurence Olivier 0.335051 +601377 Fabio Testi 0.335051 +40545 Féodor Atkine 0.334949 +5078 Stacy Keach 0.334888 +366 Catherine Deneuve 0.334726 +1159 Faye Dunaway 0.334584 +1954 Claire Bloom 0.334564 +348 Tony Curtis 0.334544 +1128 Alain Delon 0.334544 +4486 Bruno Ganz 0.334463 +432007 Curd Jürgens 0.334402 +1417 Brian Keith 0.334281 +1673 Jason Robards 0.334241 +78 John Wayne 0.334059 +457 John Hurt 0.333998 +1648 Charlotte Rampling 0.333837 +661 Donald Sutherland 0.333535 +4051 Brian Cox 0.333535 +483 Christopher Lambert 0.333254 +670964 Raymond Pellegrin 0.333153 +587 Donald Pleasence 0.333093 +734 Eddie Albert 0.332893 +1428 Klaus Kinski 0.332792 +32 Charlton Heston 0.332512 +112 Pierce Brosnan 0.332472 +47 Sophia Loren 0.332432 +1421 George Kennedy 0.332352 +948772 Susannah York 0.332352 +2094 Vittorio Gassman 0.332253 +34 William Holden 0.332113 +768334 John Saxon 0.332073 +473228 Hardy Krüger 0.331794 +6762 Saeed Jaffrey 0.331635 +721073 Fernando Rey 0.331575 +1229 Glenn Ford 0.331297 +148 Harrison Ford 0.331257 +1072 Joseph Cotten 0.331218 +660327 Irene Papas 0.331178 +420 Valeria Golino 0.331079 +2072 Mel Ferrer 0.330901 +404 Jane Fonda 0.330881 +57 David Niven 0.330821 +44 Burt Lancaster 0.330821 +181305 Valentina Cortese 0.330663 diff --git a/scripts/actor_bench/top_actors_50_h.txt b/scripts/actor_bench/top_actors_50_h.txt new file mode 100644 index 0000000..bd900e0 --- /dev/null +++ b/scripts/actor_bench/top_actors_50_h.txt @@ -0,0 +1,100 @@ +489 Christopher Lee 2207.68 +626259 Franco Nero 2190.57 +1725 Omar Sharif 2184.83 +323 Michael Caine 2140.3 +106387 Rossano Brazzi 2121.77 +1884 Max von Sydow 2115.4 +1626 Christopher Plummer 2114.6 +728 Mario Adorf 2097.13 +1036 Geraldine Chaplin 2093.43 +1012 Claudia Cardinale 2089.2 +308 Ernest Borgnine 2088.98 +1934 Kabir Bedi 2086.43 +7042 Herbert Lom 2081.48 +51 James Mason 2080.62 +53 Robert Mitchum 2080.42 +302 Jacqueline Bisset 2079.78 +1424 Udo Kier 2077.98 +1868 Michael York 2076.87 +2145 Trevor Howard 2071.6 +172 Harvey Keitel 2069.92 +6573 Philippe Leroy 2062.48 +1016 David Carradine 2061.68 +367 Gérard Depardieu 2059.72 +681566 Michel Piccoli 2055.93 +312575 Giuliano Gemma 2055.85 +63 Anthony Quinn 2054.7 +722636 John Rhys-Davies 2049.67 +1703 Maximilian Schell 2049.58 +514059 Virna Lisi 2049.12 +1698 John Savage 2049.02 +1657 Oliver Reed 2046.18 +140649 Mathieu Carrière 2046.07 +454 Dennis Hopper 2046.05 +616 Eric Roberts 2044.83 +1768 Rod Steiger 2044.3 +919 Senta Berger 2042.07 +564 Peter O'Toole 2041.05 +125 Sean Connery 2039.8 +603402 Jeanne Moreau 2039.27 +1262 Ben Gazzara 2039.15 +442 Rutger Hauer 2039.02 +432007 Curd Jürgens 2035.47 +554 Sam Neill 2031.75 +24 John Gielgud 2031.38 +603 Vanessa Redgrave 2029.38 +366 Catherine Deneuve 2027.55 +18 Kirk Douglas 2026.52 +1638 Jürgen Prochnow 2024.43 +1426 Ben Kingsley 2023.53 +78 John Wayne 2022.88 +908919 Eli Wallach 2022.88 +721073 Fernando Rey 2022.72 +800 Armand Assante 2021.68 +4486 Bruno Ganz 2018.93 +601377 Fabio Testi 2016.22 +52 Marcello Mastroianni 2014.82 +1128 Alain Delon 2014.03 +2094 Vittorio Gassman 2013.97 +627 Greta Scacchi 2013.8 +587 Donald Pleasence 2013.68 +1673 Jason Robards 2013.68 +1811 Peter Ustinov 2013.18 +1159 Faye Dunaway 2012.85 +59 Laurence Olivier 2011.62 +320760 Annie Girardot 2009.32 +661 Donald Sutherland 2008.93 +734 Eddie Albert 2008.85 +1417 Brian Keith 2008.3 +47 Sophia Loren 2007.97 +1648 Charlotte Rampling 2007.92 +5078 Stacy Keach 2007.62 +32 Charlton Heston 2007.45 +704719 Francisco Rabal 2007.12 +348 Tony Curtis 2006.8 +842 Martin Balsam 2006.52 +483 Christopher Lambert 2005.17 +1229 Glenn Ford 2004.83 +670964 Raymond Pellegrin 2004.4 +514 Michael Madsen 2004.4 +1954 Claire Bloom 2003.9 +6762 Saeed Jaffrey 2003.22 +1285 Elliott Gould 2001.4 +40545 Féodor Atkine 2000.97 +44 Burt Lancaster 2000.55 +1922 Jean-Pierre Aumont 1999.3 +813961 Elke Sommer 1998.88 +457 John Hurt 1998.47 +1428 Klaus Kinski 1998.25 +473228 Hardy Krüger 1998.05 +57 David Niven 1997.4 +768334 John Saxon 1993.6 +660327 Irene Papas 1992.73 +181305 Valentina Cortese 1992.27 +532 Malcolm McDowell 1991.62 +2072 Mel Ferrer 1991.2 +164 Anthony Hopkins 1990.75 +1588 Jack Palance 1990.27 +1421 George Kennedy 1987.92 +1682 Mickey Rooney 1987.43 +316284 Giancarlo Giannini 1986.93 diff --git a/scripts/actor_bench/top_actors_60_c.txt b/scripts/actor_bench/top_actors_60_c.txt new file mode 100644 index 0000000..f019879 --- /dev/null +++ b/scripts/actor_bench/top_actors_60_c.txt @@ -0,0 +1,100 @@ +1725 Omar Sharif 0.368023 +489 Christopher Lee 0.364781 +626259 Franco Nero 0.360217 +106387 Rossano Brazzi 0.352027 +1884 Max von Sydow 0.347446 +323 Michael Caine 0.347381 +7042 Herbert Lom 0.345492 +6573 Philippe Leroy 0.344684 +1012 Claudia Cardinale 0.343431 +308 Ernest Borgnine 0.34308 +1868 Michael York 0.342315 +1934 Kabir Bedi 0.342219 +1626 Christopher Plummer 0.341807 +1657 Oliver Reed 0.340354 +1424 Udo Kier 0.33979 +2145 Trevor Howard 0.339633 +302 Jacqueline Bisset 0.338634 +722636 John Rhys-Davies 0.338634 +1698 John Savage 0.338572 +1016 David Carradine 0.338541 +1036 Geraldine Chaplin 0.338417 +125 Sean Connery 0.338106 +53 Robert Mitchum 0.337453 +514059 Virna Lisi 0.337332 +728 Mario Adorf 0.336439 +1262 Ben Gazzara 0.336378 +442 Rutger Hauer 0.336347 +172 Harvey Keitel 0.33604 +312575 Giuliano Gemma 0.335154 +51 James Mason 0.334605 +554 Sam Neill 0.33409 +1426 Ben Kingsley 0.333848 +919 Senta Berger 0.333335 +24 John Gielgud 0.333094 +842 Martin Balsam 0.332883 +908919 Eli Wallach 0.332823 +1811 Peter Ustinov 0.332733 +454 Dennis Hopper 0.332673 +514 Michael Madsen 0.332523 +601377 Fabio Testi 0.332313 +140649 Mathieu Carrière 0.331984 +148041 Adolfo Celi 0.331446 +800 Armand Assante 0.331386 +1285 Elliott Gould 0.331178 +6762 Saeed Jaffrey 0.331089 +616 Eric Roberts 0.330881 +40545 Féodor Atkine 0.330613 +564 Peter O'Toole 0.330495 +1638 Jürgen Prochnow 0.330228 +367 Gérard Depardieu 0.33014 +1954 Claire Bloom 0.33008 +1703 Maximilian Schell 0.329814 +4051 Brian Cox 0.329696 +681566 Michel Piccoli 0.329549 +348 Tony Curtis 0.329402 +1768 Rod Steiger 0.329343 +366 Catherine Deneuve 0.329255 +603402 Jeanne Moreau 0.328931 +78 John Wayne 0.328873 +483 Christopher Lambert 0.328843 +63 Anthony Quinn 0.328785 +670964 Raymond Pellegrin 0.328785 +2094 Vittorio Gassman 0.328521 +734 Eddie Albert 0.328404 +59 Laurence Olivier 0.328228 +34 William Holden 0.32814 +4486 Bruno Ganz 0.32814 +768334 John Saxon 0.32814 +1421 George Kennedy 0.328082 +18 Kirk Douglas 0.327939 +432007 Curd Jürgens 0.327849 +47 Sophia Loren 0.32779 +457 John Hurt 0.327761 +1417 Brian Keith 0.327761 +1159 Faye Dunaway 0.327295 +32 Charlton Heston 0.32715 +1648 Charlotte Rampling 0.326657 +1072 Joseph Cotten 0.32657 +2011 Lee J. Cobb 0.326397 +1428 Klaus Kinski 0.326165 +587 Donald Pleasence 0.326137 +908914 Dee Wallace 0.326137 +44 Burt Lancaster 0.325963 +1745 Stellan Skarsgård 0.325906 +1673 Jason Robards 0.325848 +320760 Annie Girardot 0.325618 +721073 Fernando Rey 0.32556 +661 Donald Sutherland 0.325417 +813961 Elke Sommer 0.325417 +704719 Francisco Rabal 0.324671 +603 Vanessa Redgrave 0.324614 +181305 Valentina Cortese 0.324557 +874 Steven Bauer 0.324471 +1128 Alain Delon 0.324357 +420 Valeria Golino 0.324157 +5078 Stacy Keach 0.324043 +164 Anthony Hopkins 0.323815 +722 Joss Ackland 0.323787 +356847 Günther Maria Halmer 0.323361 +1229 Glenn Ford 0.322681 diff --git a/scripts/actor_bench/top_actors_60_h.txt b/scripts/actor_bench/top_actors_60_h.txt new file mode 100644 index 0000000..34ae628 --- /dev/null +++ b/scripts/actor_bench/top_actors_60_h.txt @@ -0,0 +1,100 @@ +1725 Omar Sharif 1469.67 +489 Christopher Lee 1464.92 +626259 Franco Nero 1447.92 +106387 Rossano Brazzi 1411.77 +1934 Kabir Bedi 1401.9 +1884 Max von Sydow 1400.72 +323 Michael Caine 1394.52 +1012 Claudia Cardinale 1389.15 +7042 Herbert Lom 1386.82 +1626 Christopher Plummer 1384.08 +308 Ernest Borgnine 1381.25 +1868 Michael York 1377.88 +728 Mario Adorf 1372.3 +1036 Geraldine Chaplin 1367.33 +2145 Trevor Howard 1366.02 +1424 Udo Kier 1365.53 +302 Jacqueline Bisset 1364.65 +53 Robert Mitchum 1364.38 +6573 Philippe Leroy 1363.08 +1657 Oliver Reed 1360.68 +51 James Mason 1360.47 +919 Senta Berger 1356.15 +1016 David Carradine 1355.28 +1698 John Savage 1354.75 +6762 Saeed Jaffrey 1352.98 +514059 Virna Lisi 1352.28 +1262 Ben Gazzara 1350.15 +616 Eric Roberts 1349.78 +172 Harvey Keitel 1349.63 +367 Gérard Depardieu 1347.53 +454 Dennis Hopper 1346.4 +681566 Michel Piccoli 1343.65 +442 Rutger Hauer 1343.62 +312575 Giuliano Gemma 1342.67 +908919 Eli Wallach 1342.17 +140649 Mathieu Carrière 1341.77 +125 Sean Connery 1341.68 +1703 Maximilian Schell 1341.5 +24 John Gielgud 1341.02 +722636 John Rhys-Davies 1338.68 +601377 Fabio Testi 1338.1 +432007 Curd Jürgens 1336.45 +1811 Peter Ustinov 1336.25 +554 Sam Neill 1335.88 +2094 Vittorio Gassman 1335.57 +603402 Jeanne Moreau 1335.45 +78 John Wayne 1335.13 +1426 Ben Kingsley 1334.5 +366 Catherine Deneuve 1334.47 +63 Anthony Quinn 1334.43 +1768 Rod Steiger 1334.37 +1638 Jürgen Prochnow 1332.28 +514 Michael Madsen 1331.73 +800 Armand Assante 1330.53 +842 Martin Balsam 1330.18 +721073 Fernando Rey 1329.52 +734 Eddie Albert 1328.18 +320760 Annie Girardot 1327.87 +564 Peter O'Toole 1327.13 +4486 Bruno Ganz 1326.4 +756378 Parikshit Sahni 1324.88 +18 Kirk Douglas 1324.8 +32 Charlton Heston 1324.72 +1954 Claire Bloom 1324.1 +40545 Féodor Atkine 1324.03 +1285 Elliott Gould 1323.13 +670964 Raymond Pellegrin 1323.13 +483 Christopher Lambert 1322.98 +44 Burt Lancaster 1322.72 +47 Sophia Loren 1322.57 +587 Donald Pleasence 1322.32 +1159 Faye Dunaway 1321.95 +1421 George Kennedy 1319.9 +1417 Brian Keith 1319.28 +768334 John Saxon 1318.37 +704719 Francisco Rabal 1318.07 +348 Tony Curtis 1316.77 +813961 Elke Sommer 1316.28 +1673 Jason Robards 1315.48 +1648 Charlotte Rampling 1315.33 +59 Laurence Olivier 1314.58 +1128 Alain Delon 1313.47 +34 William Holden 1312.67 +457 John Hurt 1312.53 +1072 Joseph Cotten 1311 +2011 Lee J. Cobb 1310.9 +148041 Adolfo Celi 1310.9 +1229 Glenn Ford 1310.43 +4051 Brian Cox 1310.07 +181305 Valentina Cortese 1310 +661 Donald Sutherland 1307.88 +634159 Philippe Noiret 1307.28 +603 Vanessa Redgrave 1307.22 +52 Marcello Mastroianni 1305.98 +1588 Jack Palance 1305.75 +770730 Maria Schell 1305.25 +1428 Klaus Kinski 1305.25 +5078 Stacy Keach 1303.47 +57 David Niven 1302.37 +356847 Günther Maria Halmer 1301.05 diff --git a/scripts/actor_bench/top_actors_c_70.txt b/scripts/actor_bench/top_actors_70_c.txt similarity index 100% rename from scripts/actor_bench/top_actors_c_70.txt rename to scripts/actor_bench/top_actors_70_c.txt diff --git a/scripts/actor_bench/top_actors_h_70.txt b/scripts/actor_bench/top_actors_70_h.txt similarity index 100% rename from scripts/actor_bench/top_actors_h_70.txt rename to scripts/actor_bench/top_actors_70_h.txt diff --git a/scripts/actors_graph b/scripts/actors_graph new file mode 100755 index 0000000000000000000000000000000000000000..1ad2cac57a30904a9fe52b5279a6a1fea7b65c48 GIT binary patch literal 68992 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 closeness(const size_t k) { // Waiting for all threads to finish thread.join(); - ofstream output_file("actor_bench/top_actors_c_70.txt"); + ofstream output_file(outputFn + "_c.txt"); for (const auto& [actor_id, farness] : top_actors) { output_file << actor_id << "\t" << A[actor_id].name << "\t" << 1.0/farness << endl; } @@ -315,7 +317,7 @@ vector> harmonic(const size_t k) { // for (auto& thread : threads) thread.join(); - ofstream output_file("actor_bench/top_actors_h_70.txt"); + ofstream output_file(outputFn + "_h.txt"); for (const auto& [actor_id, harmonic] : top_actors) { output_file << actor_id << "\t" << A[actor_id].name << "\t" << harmonic << endl; } @@ -325,8 +327,14 @@ vector> harmonic(const size_t k) { // } -int main() +int main(int argc, char* argv[]) { + if (argc != 2) { + cout << "Usage: " << argv[0] << " OUTPUT_FILE_NAME" << endl; + exit(1); + } + outputFn = argv[1]; + srand(time(NULL)); DataRead(); diff --git a/tex/main.pdf b/tex/main.pdf index 9915ed4c49f884c6f489cb398c88393bc0005ec6..0bd40150acb940285f1f942a05ae817c1020b802 100644 GIT binary patch delta 139 zcmdmbOK9sYp@tU57N!>FEi4X8HI0l6EDa2`4Gh%{4AeEb^nLSFToOxC6*OF|j0}L1 z#s(G;CEGKXvK(i2c5*T{ax`*uG%+!AaWr#vv@kKSba8gHG`BEwbTcwFv{SGlq-1;X IN|r;+0C}Gz!TFEi4X8H4QCIjEzmS4Gh%{4AeEb^nLSFToOxC6*OF|j0}v7 z42%sdAWF7pE@e5+?Ck1d>FQ)?u?