from math import sqrt, ceil
import sys
from project.countries import world_excluded_countries_list
from project.signed_networks.definitions import POSITIVE_LINK, NO_LINK
from project.signed_networks.structural_balance.metrics.vertex import positive_edge_count, negative_edge_count
from project.util import memoize, std_dev

DEFAULT_COUNTRIES_LIST = world_excluded_countries_list()


def _add_to_slope_map(slope_map, key, new_list_item):
    if key not in slope_map: slope_map[key] = []
    prev_entry = slope_map[key]
    prev_entry.append(new_list_item)


def _compute_slope(p1, p2):
    if p1[0] - p2[0] == 0: return sys.float_info.max
    return (p1[1] - p2[1]) / (p1[0] - p2[0])


def _distance_from_origin(point):
    return sqrt(point[0] * point[0] + point[1] * point[1])


def detect_factions_from_co_movements(positives_and_negatives, window_size, year):
    countries_list = positives_and_negatives[year].keys()
    movements_per_country = {}
    for current_year in range(year - window_size + 1, year + 1):
        previous_year = current_year - 1
        for C in countries_list:
def number_of_traids(dense_cube_matrix):
    total = 0
    for C in countries.world_excluded_countries_list():
        total += number_of_traids_for_a_country(dense_cube_matrix, C)
    return total / 6.0