def run_mnist(n_train: int = 4000,
              n_test: int = 100,
              visualize: bool = True,
              n_epochs: int = 5,
              l_rate: float = 0.7,
              profile: bool = False):
    Utilities.delete_previous_output("mnist_images")
    mnist_features, mnist_labels, mnist_test_features, mnist_test_labels = DataReader.load_mnist(
        train_limit=n_train, test_limit=n_test)
    som = SOM(mnist=True,
              features=mnist_features,
              labels=mnist_labels,
              test_features=mnist_test_features,
              test_labels=mnist_test_labels,
              n_epochs=n_epochs,
              initial_radius=5,
              initial_l_rate=l_rate,
              radius_decay_func="pow",
              l_rate_decay_func="pow",
              n_output_cols=20,
              n_output_rows=20,
              display_interval=1 if visualize else -1)

    pr = cProfile.Profile()
    if profile:
        pr.enable()

    som.run()

    if profile:
        pr.disable()
        pr.print_stats(sort='time')
    if visualize:
        Utilities.make_gif(mnist=True)
def run_tsm(city: int,
            visualize: bool = True,
            profile: bool = False,
            n_epochs: int = 400,
            l_rate: float = 0.39):
    Utilities.delete_previous_output("tsm_images")
    cities = DataReader.read_tsm_file(city)

    norm_cities = cities
    features = norm_cities[:, 1:]

    # TSM Hyper Params
    node_factor = 3
    radius_divisor = 1
    l_decay = "cur"
    r_decay = "pow"

    out_size = len(features) * node_factor
    init_rad = int(out_size / radius_divisor)

    som = SOM(mnist=False,
              features=features,
              n_epochs=n_epochs,
              n_output_rows=1,
              n_output_cols=out_size,
              initial_radius=init_rad,
              initial_l_rate=l_rate,
              radius_decay_func=r_decay,
              l_rate_decay_func=l_decay,
              originals=cities[:, 1:],
              display_interval=10 if visualize else -1)

    pr = cProfile.Profile()
    if profile:
        pr.enable()

    result = som.run()

    if profile:
        pr.disable()
        pr.print_stats(sort='time')

    Utilities.store_tsm_result(case=city,
                               epochs=n_epochs,
                               nodes=node_factor,
                               l_rate=l_rate,
                               radius=radius_divisor,
                               l_decay=l_decay,
                               r_decay=r_decay,
                               result=result)
    Utilities.make_gif(mnist=False) if visualize else NoOp
    return result