return False
                if np.sum(state == 3) == 0:  # make sure has at least one muscle voxel for movement
                    return False

        return True


if not os.path.isfile("./" + RUN_DIR + "/pickledPops/Gen_0.pickle"):

    random.seed(SEED)
    np.random.seed(SEED)

    my_sim = Sim(dt_frac=DT_FRAC, simulation_time=SIM_TIME, fitness_eval_init_time=INIT_TIME)

    my_env = Env(temp_amp=TEMP_AMP, fluid_environment=FLUID_ENV, aggregate_drag_coefficient=AGGREGATE_DRAG_COEF,
                 lattice_dimension=VOXEL_SIZE, grav_acc=GRAV_ACC, frequency=FREQ, muscle_stiffness=STIFFNESS,
                 block_position=BLOCK_POS, block_material=BLOCK_MAT, external_block=True)

    my_objective_dict = ObjectiveDict()
    my_objective_dict.add_objective(name="fitness", maximize=True, tag=FITNESS_TAG,
                                    # meta_func=min_energy
                                    )
    my_objective_dict.add_objective(name="age", maximize=False, tag=None)

    my_objective_dict.add_objective(name="n_muscle", maximize=False, tag=None,
                                    node_func=partial(count_occurrences, keys=[3]),
                                    output_node_name="material")

    # logging only:
    my_objective_dict.add_objective(name="n_vox", maximize=False, tag=None, logging_only=True,
                                    node_func=partial(count_occurrences, keys=[1, 3]),
if not os.path.isfile("./" + RUN_DIR + "/pickledPops/Gen_0.pickle"):

    random.seed(SEED)
    np.random.seed(SEED)

    my_sim = Sim(dt_frac=DT_FRAC,
                 simulation_time=SIM_TIME,
                 fitness_eval_init_time=INIT_TIME)

    my_env = Env(
        temp_amp=TEMP_AMP,
        fluid_environment=FLUID_ENV,
        aggregate_drag_coefficient=AGGREGATE_DRAG_COEF,
        lattice_dimension=VOXEL_SIZE,
        grav_acc=GRAV_ACC,
        frequency=FREQ,
        muscle_stiffness=STIFFNESS,
        fat_stiffness=STIFFNESS,
        # block_position=2, block_material=8, external_block=False,
        # falling_prohibited=STOP_IF_BLOCK_TOUCHES_GROUND
    )

    my_objective_dict = ObjectiveDict()
    my_objective_dict.add_objective(name="fitness",
                                    maximize=True,
                                    tag=FITNESS_TAG)
    my_objective_dict.add_objective(name="age", maximize=False, tag=None)

    my_objective_dict.add_objective(name="n_muscle",
                                    maximize=False,
                                    tag=None,
        return True


if not os.path.isfile("./" + RUN_DIR + "/pickledPops/Gen_0.pickle"):

    random.seed(SEED)
    np.random.seed(SEED)

    my_sim = Sim(dt_frac=DT_FRAC,
                 simulation_time=SIM_TIME,
                 fitness_eval_init_time=INIT_TIME)

    my_env = Env(temp_amp=TEMP_AMP,
                 fluid_environment=FLUID_ENV,
                 aggregate_drag_coefficient=AGGREGATE_DRAG_COEF,
                 lattice_dimension=VOXEL_SIZE,
                 grav_acc=GRAV_ACC,
                 frequency=FREQ,
                 muscle_stiffness=STIFFNESS)

    my_objective_dict = ObjectiveDict()
    my_objective_dict.add_objective(name="fitness",
                                    maximize=True,
                                    tag=FITNESS_TAG,
                                    meta_func=favor_appendages)
    my_objective_dict.add_objective(name="age", maximize=False, tag=None)

    my_pop = Population(my_objective_dict,
                        MyGenotype,
                        MyPhenotype,
                        pop_size=POP_SIZE)
Ejemplo n.º 4
0
def regeneration(params, details=False, save_name=""):

    #Caliculation initial cell states
    individual_id = params[0][0]
    w = params[0][1]
    generations = params[1]
    settings = params[2]
    run_directory = settings["run_directory"]
    im_size = settings["im_size"]
    num_classes = settings["voxel_types"]
    input_dim = settings["number_neighbors"]

    if settings['growth_facter']:
        input_dim = 3 * 9 * 2
        num_classes = settings['voxel_types'] + 1

    # Setting up the simulation object
    sim = Sim(dt_frac=settings['fraction'],
              simulation_time=settings['simtime'],
              fitness_eval_init_time=settings['initime'])
    # Setting up the environment object
    env = Env(sticky_floor=0, time_between_traces=0)

    p = MorphNet(input_dim=input_dim,
                 number_state=num_classes,
                 recurrent=settings['recurrent'])

    vector_to_parameters(torch.tensor(w, dtype=torch.float32), p.parameters())

    if settings['growth_facter']:
        morphogens = np.zeros(shape=(2, im_size, im_size, im_size))
        original_morphogens = np.zeros(shape=(2, im_size, im_size, im_size))
        cutedgemorphogens = np.zeros(shape=(2, im_size - 2, im_size - 2,
                                            im_size - 2))
        originalcutedgemorphogens = np.zeros(shape=(2, im_size - 2,
                                                    im_size - 2, im_size - 2))
    else:
        cutedgemorphogens = np.zeros(shape=(2, im_size - 2, im_size - 2,
                                            im_size - 2))
        morphogens = np.zeros(shape=(1, im_size, im_size, im_size))
    out = torch.zeros(1, im_size * im_size * im_size, num_classes)
    dev_states = []
    alphalist = []

    sleep_id = []

    iterations = 10

    hidden_dim = 64

    if settings['data_read']:
        hidden_states = torch.ones(
            size=(im_size, im_size, 2, 1, im_size * im_size * im_size,
                  hidden_dim))  #batch_size = im_size*im_size
        hidden_states_batched_A = torch.ones(
            size=(1, im_size * im_size * im_size,
                  hidden_dim))  #Hidden layers, batch_size, number units
        hidden_states_batched_B = torch.ones(size=(1,
                                                   im_size * im_size * im_size,
                                                   hidden_dim))
        max_fitness = params[6]
    else:
        hidden_states = torch.ones(
            size=(im_size, im_size, 2, 1, im_size * im_size * im_size,
                  hidden_dim))  #batch_size = im_size*im_size
        hidden_states_batched_A = torch.ones(
            size=(1, im_size * im_size * im_size,
                  hidden_dim))  #Hidden layers, batch_size, number units
        hidden_states_batched_B = torch.ones(size=(1,
                                                   im_size * im_size * im_size,
                                                   hidden_dim))
        max_fitness = 0

    # Import original morphology
    original_morphogens = np.load('multiped_morphology.npy')

    # Cutting
    morphogens = copy.deepcopy(original_morphogens)
    morphogens[:, :, :, 0:(im_size - 1) / 2] = 0
    if settings['recurrent']:
        hidden_states_batched_A = hidden_states_batched_A.reshape(
            1, im_size, im_size, im_size, hidden_dim)
        hidden_states_batched_B = hidden_states_batched_B.reshape(
            1, im_size, im_size, im_size, hidden_dim)
        hidden_states_batched_A[0, :, :, 0:(im_size - 1) / 2, :] = 1
        hidden_states_batched_B[0, :, :, 0:(im_size - 1) / 2, :] = 1
        hidden_states_batched_A = hidden_states_batched_A.reshape(
            1, im_size**3, hidden_dim)
        hidden_states_batched_B = hidden_states_batched_B.reshape(
            1, im_size**3, hidden_dim)
    morph_tmp = copy.deepcopy(morphogens)

    #Insialize a fitness
    #Start main loop
    for it in range(iterations):
        fitness = 0

        batch_inputs = torch.zeros(im_size * im_size * im_size, input_dim)
        counter = 0
        sleep_id = []
        for i in range(1, im_size - 1):
            for j in range(1, im_size - 1):
                for k in range(1, im_size - 1):
                    if settings['growth_facter']:
                        cell_input = torch.flatten(
                            torch.tensor(morphogens[:, i - 1:i + 2,
                                                    j - 1:j + 2, k - 1:k + 2]))
                    else:
                        cell_input = torch.tensor([
                            morphogens[0, i - 1, j, k], morphogens[0, i + 1, j,
                                                                   k],
                            morphogens[0, i, j + 1,
                                       k], morphogens[0, i, j - 1,
                                                      k], morphogens[0, i, j,
                                                                     k - 1],
                            morphogens[0, i, j, k + 1], morphogens[0, i, j, k]
                        ])
                    batch_inputs[counter] = cell_input
                    counter += 1

        output, hs = p(batch_inputs,
                       (hidden_states_batched_A, hidden_states_batched_B))
        past_hidden_states_batched_A = hidden_states_batched_A
        past_hidden_states_batched_B = hidden_states_batched_B

        if not settings['recurrent']:  #ALPHA
            output = output.unsqueeze(0)  #
        # Map out to cell state(0,1,2,3,4)
        counter = 0
        for i in range(1, im_size - 1):
            for j in range(1, im_size - 1):
                for k in range(1, im_size - 1):

                    cell_alive = (np.amax(
                        morphogens[1, i - 1:i + 2, j - 1:j + 2,
                                   k - 1:k + 2])) > 0.1  #ALPHA

                    if cell_alive:  #ALPHA

                        _, idx = output[0, counter].data[:5].max(0)  #ALPHA

                        alpha = output[0, counter].data[5]  #ALPHA

                        morph_tmp[0, i, j, k] = int(idx.data.numpy())
                        morph_tmp[1, i, j, k] = F.sigmoid(
                            alpha
                        )  #ALPHA   TODO apply function earlier, should be faster

                        if settings['recurrent']:
                            hidden_states_batched_A[0,
                                                    counter] = hs[0][0,
                                                                     counter]
                            hidden_states_batched_B[0,
                                                    counter] = hs[1][0,
                                                                     counter]
                            out = output
                        out[0] = output

                    else:  #ALPHA
                        morph_tmp[:, i, j,
                                  k] = 0  #If cell is not alive, set state to 0

                        if settings['recurrent']:
                            hidden_states_batched_A[
                                0, counter] = hs[0][0, counter] * 0.0
                            hidden_states_batched_B[
                                0, counter] = hs[1][0, counter] * 0.0
                    counter += 1
        #Caliculation each iterartion cell state
        morpho = morphogens[0][np.newaxis, :, :]
        alpha = morphogens[1][np.newaxis, :, :]
        dev_states.append(morpho)
        alphalist.append(alpha)
        morphogens = copy.deepcopy(morph_tmp)

    #Check connection
    counter = -1
    while counter < 0:
        counter = 0
        for i in range(1, im_size - 1):
            for j in range(1, im_size - 1):
                for k in range(1, im_size - 1):
                    if morphogens[0, i, j, k] != 0:
                        neighbors = np.array([
                            morphogens[0, i - 1, j, k], morphogens[0, i + 1, j,
                                                                   k],
                            morphogens[0, i, j - 1, k], morphogens[0, i, j + 1,
                                                                   k],
                            morphogens[0, i, j, k - 1], morphogens[0, i, j,
                                                                   k + 1]
                        ])
                        diagonal = np.array([morphogens[0, i-1, j+1, k-1], morphogens[0, i-1, j+1, k+1],morphogens[0, i-1, j+1, k], morphogens[0, i-1, j, k-1], morphogens[0, i-1, j, k+1], morphogens[0, i-1, j-1, k-1],morphogens[0, i-1, j-1, k+1],morphogens[0, i-1, j-1, k],\
                        morphogens[0, i, j+1, k-1], morphogens[0, i, j+1, k+1], morphogens[0, i, j-1, k-1],morphogens[0, i, j-1, k+1],\
                        morphogens[0, i+1, j+1, k-1], morphogens[0, i+1, j+1, k+1],morphogens[0, i+1, j+1, k], morphogens[0, i+1, j, k-1], morphogens[0, i+1, j, k+1], morphogens[0, i+1, j-1, k-1],morphogens[0, i+1, j-1, k+1],morphogens[0, i+1, j-1, k]])
                        if np.count_nonzero(
                                neighbors
                        ) == 0 and np.count_nonzero(diagonal) != 0:
                            morphogens[0, i, j, k] = 0
                            morphogens[1, i, j, k] = 0
                            counter -= 1

        for i in range(1, im_size - 1):
            for j in range(1, im_size - 1):
                for k in range(1, im_size - 1):
                    if morphogens[0, i, j, k] != 0:
                        neighbors = np.array([
                            morphogens[0, i - 1, j, k], morphogens[0, i + 1, j,
                                                                   k],
                            morphogens[0, i, j - 1, k], morphogens[0, i, j + 1,
                                                                   k],
                            morphogens[0, i, j, k - 1], morphogens[0, i, j,
                                                                   k + 1]
                        ])
                        diagonal = np.array([morphogens[0, i-1, j+1, k-1], morphogens[0, i-1, j+1, k+1],morphogens[0, i-1, j+1, k], morphogens[0, i-1, j, k-1], morphogens[0, i-1, j, k+1], morphogens[0, i-1, j-1, k-1],morphogens[0, i-1, j-1, k+1],morphogens[0, i-1, j-1, k],\
                        morphogens[0, i, j+1, k-1], morphogens[0, i, j+1, k+1], morphogens[0, i, j-1, k-1],morphogens[0, i, j-1, k+1],\
                        morphogens[0, i+1, j+1, k-1], morphogens[0, i+1, j+1, k+1],morphogens[0, i+1, j+1, k], morphogens[0, i+1, j, k-1], morphogens[0, i+1, j, k+1], morphogens[0, i+1, j-1, k-1],morphogens[0, i+1, j-1, k+1],morphogens[0, i+1, j-1, k]])
                        all_neighbors = np.count_nonzero(
                            neighbors) + np.count_nonzero(diagonal)
                        if all_neighbors == 0:
                            morphogens[0, i, j, k] = 0
                            morphogens[1, i, j, k] = 0

    cutedgemorphogens[0] = morphogens[0][1:im_size - 1, 1:im_size - 1,
                                         1:im_size - 1]
    cutedgemorphogens[1] = morphogens[1][1:im_size - 1, 1:im_size - 1,
                                         1:im_size - 1]

    # Culiculate fitness
    # reshape

    original_morphogens_list = np.reshape(original_morphogens, (2, im_size**3))
    morphogens_list = np.reshape(morphogens, (2, im_size**3))

    for i in range(im_size**3):
        if original_morphogens_list[0, i] == morphogens_list[0, i]:
            fitness += 1
        print(original_morphogens_list[0, i], morphogens_list[0, i])
        print(i, fitness)
    #Return fitness
    return fitness, sim, env, generations, individual_id, morphogens, hidden_states_batched_A, hidden_states_batched_B, dev_states, alphalist, cutedgemorphogens, out, past_hidden_states_batched_A, past_hidden_states_batched_B
Ejemplo n.º 5
0
def run_robot_simulation(params, details=False, save_name=""):

    #Caliculation initial cell states
    individual_id = params[0][0]
    w = params[0][1]
    generations = params[1]  #4
    settings = params[2]  #5
    run_directory = settings["run_directory"]
    im_size = settings["im_size"]
    num_classes = settings["voxel_types"]
    input_dim = settings["number_neighbors"]

    if settings['growth_facter']:
        input_dim = 3 * 9 * 2
        num_classes = settings['voxel_types'] + 1

    #Make .vxa file for voxelyze
    # Setting up the simulation object
    sim = Sim(dt_frac=settings['fraction'],
              simulation_time=settings['simtime'],
              fitness_eval_init_time=settings['initime'])
    # Setting up the environment object
    env = Env(sticky_floor=0, time_between_traces=0)

    p = MorphNet(input_dim=input_dim,
                 number_state=num_classes,
                 recurrent=settings['recurrent'])

    vector_to_parameters(torch.tensor(w, dtype=torch.float32), p.parameters())

    if settings['growth_facter']:
        morphogens = np.zeros(shape=(2, im_size, im_size, im_size))
        morphogens[:, (im_size - 1) / 2, (im_size - 1) / 2,
                   (im_size - 1) / 2] = 1
        cutedgemorphogens = np.zeros(shape=(2, im_size - 2, im_size - 2,
                                            im_size - 2))
    else:
        cutedgemorphogens = np.zeros(shape=(2, im_size - 2, im_size - 2,
                                            im_size - 2))
        morphogens = np.zeros(shape=(1, im_size, im_size, im_size))
    out = torch.zeros(1, im_size * im_size * im_size, num_classes)

    dev_states = []
    alphalist = []

    sleep_id = []
    iterations = 10
    hidden_dim = 64

    #Store seperate LSTM hidden states for each cell
    if settings['data_read']:
        #morphogens = params[3]
        #hidden_states_batched_A = params[4]
        #hidden_states_batched_B = params[5]
        hidden_states = torch.ones(
            size=(im_size, im_size, 2, 1, im_size * im_size * im_size,
                  hidden_dim))  #batch_size = im_size*im_size
        hidden_states_batched_A = torch.ones(
            size=(1, im_size * im_size * im_size,
                  hidden_dim))  #Hidden layers, batch_size, number units
        hidden_states_batched_B = torch.ones(size=(1,
                                                   im_size * im_size * im_size,
                                                   hidden_dim))
        max_fitness = params[6]

    else:
        hidden_states = torch.ones(
            size=(im_size, im_size, 2, 1, im_size * im_size * im_size,
                  hidden_dim))  #batch_size = im_size*im_size
        hidden_states_batched_A = torch.ones(
            size=(1, im_size * im_size * im_size,
                  hidden_dim))  #Hidden layers, batch_size, number units
        hidden_states_batched_B = torch.ones(size=(1,
                                                   im_size * im_size * im_size,
                                                   hidden_dim))
        max_fitness = 0

    #hidden_states = torch.ones(size=(im_size, im_size, 2, 1, 1, hidden_dim)) #batch_size = im_size*im_size
    morph_tmp = copy.deepcopy(morphogens)

    #Insialize a fitness
    #Start main loop
    for it in range(iterations):
        fitness = 0

        batch_inputs = torch.zeros(im_size * im_size * im_size, input_dim)

        counter = 0
        sleep_id = []

        for i in range(1, im_size - 1):
            for j in range(1, im_size - 1):
                for k in range(1, im_size - 1):
                    if settings['growth_facter']:
                        cell_input = torch.flatten(
                            torch.tensor(morphogens[:, i - 1:i + 2,
                                                    j - 1:j + 2, k - 1:k + 2]))
                    else:
                        cell_input = torch.tensor([
                            morphogens[0, i - 1, j, k], morphogens[0, i + 1, j,
                                                                   k],
                            morphogens[0, i, j + 1,
                                       k], morphogens[0, i, j - 1,
                                                      k], morphogens[0, i, j,
                                                                     k - 1],
                            morphogens[0, i, j, k + 1], morphogens[0, i, j, k]
                        ])
                    batch_inputs[counter] = cell_input
                    counter += 1

        output, hs = p(batch_inputs,
                       (hidden_states_batched_A, hidden_states_batched_B))
        past_hidden_states_batched_A = hidden_states_batched_A
        past_hidden_states_batched_B = hidden_states_batched_B

        if not settings['recurrent']:  #ALPHA
            output = output.unsqueeze(0)  #
        # Map out to cell state(0,1,2,3,4)

        counter = 0
        for i in range(1, im_size - 1):
            for j in range(1, im_size - 1):
                for k in range(1, im_size - 1):

                    cell_alive = (np.amax(
                        morphogens[1, i - 1:i + 2, j - 1:j + 2,
                                   k - 1:k + 2])) > 0.1  #ALPHA

                    if cell_alive:  #ALPHA

                        _, idx = output[0, counter].data[:5].max(0)  #ALPHA

                        alpha = output[0, counter].data[5]  #ALPHA

                        morph_tmp[0, i, j, k] = int(idx.data.numpy())
                        morph_tmp[1, i, j, k] = F.sigmoid(
                            alpha
                        )  #ALPHA   TODO apply function earlier, should be faster
                        if settings['recurrent']:
                            hidden_states_batched_A[0,
                                                    counter] = hs[0][0,
                                                                     counter]
                            hidden_states_batched_B[0,
                                                    counter] = hs[1][0,
                                                                     counter]
                            out = output
                        out[0] = output

                    else:  #ALPHA
                        morph_tmp[:, i, j,
                                  k] = 0  #If cell is not alive, set state to 0

                        if settings['recurrent']:
                            hidden_states_batched_A[
                                0, counter] = hs[0][0, counter] * 0.0
                            hidden_states_batched_B[
                                0, counter] = hs[1][0, counter] * 0.0

                    counter += 1

        #Caliculation each iterartion cell state
        morpho = morphogens[0][np.newaxis, :, :]
        alpha = morphogens[1][np.newaxis, :, :]
        dev_states.append(morpho)
        alphalist.append(alpha)
        morphogens = copy.deepcopy(morph_tmp)

    #Check connection
    counter = -1
    while counter < 0:
        counter = 0
        for i in range(1, im_size - 1):
            for j in range(1, im_size - 1):
                for k in range(1, im_size - 1):
                    if morphogens[0, i, j, k] != 0:
                        neighbors = np.array([
                            morphogens[0, i - 1, j, k], morphogens[0, i + 1, j,
                                                                   k],
                            morphogens[0, i, j - 1, k], morphogens[0, i, j + 1,
                                                                   k],
                            morphogens[0, i, j, k - 1], morphogens[0, i, j,
                                                                   k + 1]
                        ])
                        diagonal = np.array([morphogens[0, i-1, j+1, k-1], morphogens[0, i-1, j+1, k+1],morphogens[0, i-1, j+1, k], morphogens[0, i-1, j, k-1], morphogens[0, i-1, j, k+1], morphogens[0, i-1, j-1, k-1],morphogens[0, i-1, j-1, k+1],morphogens[0, i-1, j-1, k],\
                        morphogens[0, i, j+1, k-1], morphogens[0, i, j+1, k+1], morphogens[0, i, j-1, k-1],morphogens[0, i, j-1, k+1],\
                        morphogens[0, i+1, j+1, k-1], morphogens[0, i+1, j+1, k+1],morphogens[0, i+1, j+1, k], morphogens[0, i+1, j, k-1], morphogens[0, i+1, j, k+1], morphogens[0, i+1, j-1, k-1],morphogens[0, i+1, j-1, k+1],morphogens[0, i+1, j-1, k]])
                        if np.count_nonzero(
                                neighbors
                        ) == 0 and np.count_nonzero(diagonal) != 0:
                            morphogens[0, i, j, k] = 0
                            morphogens[1, i, j, k] = 0
                            counter -= 1

        for i in range(1, im_size - 1):
            for j in range(1, im_size - 1):
                for k in range(1, im_size - 1):
                    if morphogens[0, i, j, k] != 0:
                        neighbors = np.array([
                            morphogens[0, i - 1, j, k], morphogens[0, i + 1, j,
                                                                   k],
                            morphogens[0, i, j - 1, k], morphogens[0, i, j + 1,
                                                                   k],
                            morphogens[0, i, j, k - 1], morphogens[0, i, j,
                                                                   k + 1]
                        ])
                        diagonal = np.array([morphogens[0, i-1, j+1, k-1], morphogens[0, i-1, j+1, k+1],morphogens[0, i-1, j+1, k], morphogens[0, i-1, j, k-1], morphogens[0, i-1, j, k+1], morphogens[0, i-1, j-1, k-1],morphogens[0, i-1, j-1, k+1],morphogens[0, i-1, j-1, k],\
                        morphogens[0, i, j+1, k-1], morphogens[0, i, j+1, k+1], morphogens[0, i, j-1, k-1],morphogens[0, i, j-1, k+1],\
                        morphogens[0, i+1, j+1, k-1], morphogens[0, i+1, j+1, k+1],morphogens[0, i+1, j+1, k], morphogens[0, i+1, j, k-1], morphogens[0, i+1, j, k+1], morphogens[0, i+1, j-1, k-1],morphogens[0, i+1, j-1, k+1],morphogens[0, i+1, j-1, k]])
                        all_neighbors = np.count_nonzero(
                            neighbors) + np.count_nonzero(diagonal)
                        if all_neighbors == 0:
                            morphogens[0, i, j, k] = 0
                            morphogens[1, i, j, k] = 0

    cutedgemorphogens[0] = morphogens[0][1:im_size - 1, 1:im_size - 1,
                                         1:im_size - 1]
    cutedgemorphogens[1] = morphogens[1][1:im_size - 1, 1:im_size - 1,
                                         1:im_size - 1]

    #Save vxa file and caliculate distance
    write_voxelyze_file(sim, env, generations, individual_id,
                        cutedgemorphogens, fitness, settings['im_size'],
                        settings['run_directory'], settings['run_name'])

    #Evaluate with voxelyze
    #start_time = time.time()
    filepath = settings[
        'run_directory'] + "/tempFiles/softbotsOutput--gene_{0}_id_{1}.xml".format(
            generations, individual_id)
    if np.any(morphogens[0] != 0):
        proc = sub.Popen("./voxelyze  -f " + settings['run_directory'] +
                         "/voxelyzeFiles/" + settings['run_name'] +
                         "--gene_{0}_id_{1}_fitness_0.vxa".format(
                             generations, individual_id),
                         stdout=sub.PIPE,
                         shell=True)
        proc.wait()
        while os.path.exists(filepath) == False:
            sleep(0.00000000001)
    else:
        print("gene_{0}_id_{1} is dead".format(generations, individual_id))

    #Read results
    #All subprocess done
    if os.path.exists(filepath):
        # voxels cost
        voxels_cost = np.count_nonzero(cutedgemorphogens[0]) * 0.0583
        fitness = read_voxlyze_results(generations, individual_id,
                                       filepath) - voxels_cost

        sub.Popen("rm " + settings['run_directory'] +
                  "/tempFiles/softbotsOutput--gene_{0}_id_{1}.xml".format(
                      generations, individual_id),
                  stdout=sub.PIPE,
                  shell=True)
    else:
        fitness = -20
    sub.Popen(
        "rm " + settings['run_directory'] + "/voxelyzeFiles/" +
        settings['run_name'] +
        "--gene_{0}_id_{1}_fitness_0.vxa".format(generations, individual_id),
        stdout=sub.PIPE,
        shell=True)

    #Return fitness
    return fitness, sim, env, generations, individual_id, morphogens, hidden_states_batched_A, hidden_states_batched_B, dev_states, alphalist, cutedgemorphogens, out, past_hidden_states_batched_A, past_hidden_states_batched_B
def run_robot_simulation(params, details=False, save_name=""):

    #Caliculation initial cell states
    individual_id = params[0][0]
    w = params[0][1]
    generations = params[1]
    settings = params[2]
    run_directory = settings["run_directory"]
    im_size = settings["im_size"]
    num_classes = settings["voxel_types"]
    input_dim = settings["number_neighbors"]

    if settings['growth_facter']:
        input_dim = 9 * 2
        voxel_types = settings['voxel_types'] + 1

    if settings['cell_sleep']:
        input_dim = input_dim + 1
        num_classes = num_classes + 1
    #print(input_dim, num_classes)
    #Make .vxa file for voxelyze

    # Setting up the simulation object
    sim = Sim(dt_frac=settings['fraction'],
              simulation_time=settings['simtime'],
              fitness_eval_init_time=settings['initime'])
    # Setting up the environment object
    env = Env(sticky_floor=0, time_between_traces=0)

    p = MorphNet(input_dim=input_dim,
                 number_state=num_classes,
                 recurrent=settings['recurrent'])

    vector_to_parameters(torch.tensor(w, dtype=torch.float32), p.parameters())

    morphogens = np.zeros(shape=(1, im_size, im_size))
    morphogens[0, (im_size - 1) / 2, (im_size - 1) / 2] = 1

    if settings['growth_facter']:
        morphogens = np.zeros(shape=(2, im_size, im_size))
        morphogens[:, (im_size - 1) / 2, (im_size - 1) / 2] = 1
    #print(morphogens.shape)

    morphogens_sleep = np.zeros(shape=(1, im_size, im_size))
    out_sleep = torch.zeros(1, im_size * im_size, num_classes - 1)
    out = torch.zeros(1, im_size * im_size, num_classes)
    #print(out.shape, out[0].shape, out[0][0], out[0][counter][input_dim-1])

    dev_states = []

    sleep_id = []

    iterations = 10

    hidden_dim = 64

    #Store seperate LSTM hidden states for each cell
    hidden_states = torch.ones(
        size=(im_size, im_size, 2, 1, im_size * im_size,
              hidden_dim))  #batch_size = im_size*im_size
    hidden_states_batched_A = torch.ones(
        size=(1, im_size * im_size,
              hidden_dim))  #Hidden layers, batch_size, number units
    hidden_states_batched_B = torch.ones(
        size=(1, im_size * im_size,
              hidden_dim))  #Hidden layers, batch_size, number units

    #hidden_states = torch.ones(size=(im_size, im_size, 2, 1, 1, hidden_dim)) #batch_size = im_size*im_size
    morph_tmp = copy.deepcopy(morphogens)

    #Insialize a fitness
    max_fitness = 0
    #Start main loop
    for it in range(iterations):
        fitness = 0
        batch_inputs = torch.zeros(im_size * im_size, input_dim)
        counter = 0
        sleep_id = []

        if settings['cell_sleep']:
            for i in range(1, im_size - 1):
                for e in range(1, im_size - 1):

                    if out[0][counter][num_classes -
                                       1] <= 0 and counter not in sleep_id:
                        morphogens_sleep[0, i, e] = morphogens[0, i, e]
                    else:
                        #print(out[0][counter][input_dim-1])
                        morphogens_sleep[0, i, e] = 0

        #print(batch_inputs[counter].shape,batch_inputs[counter][4],input_dim-1)
        for i in range(1, im_size - 1):
            for e in range(1, im_size - 1):
                #batch_inputs[counter] = torch.tensor( [morphogens[0, i-1, e],morphogens[0, i+1, e],morphogens[0, i, e+1],morphogens[0, i, e-1],morphogens[0,i,e] ] )

                if settings['cell_sleep']:
                    if out[0][counter][num_classes -
                                       1] <= 0 and counter not in sleep_id:
                        cell_input = torch.tensor([
                            morphogens_sleep[0, i - 1,
                                             e], morphogens_sleep[0, i + 1, e],
                            morphogens_sleep[0, i, e + 1],
                            morphogens_sleep[0, i,
                                             e - 1], morphogens_sleep[0, i, e],
                            out[0][counter][num_classes - 1]
                        ])
                    else:
                        cell_input = torch.zeros(input_dim)
                elif settings['growth_facter']:
                    cell_input = torch.flatten(
                        torch.tensor(morphogens[:, i - 1:i + 2, e - 1:e + 2]))

                else:
                    cell_input = torch.tensor([
                        morphogens[0, i - 1, e], morphogens[0, i + 1, e],
                        morphogens[0, i, e + 1], morphogens[0, i, e - 1],
                        morphogens[0, i, e]
                    ])

                batch_inputs[counter] = cell_input
                #print(input_dim)
                #print(out[0][counter])
                #print(counter)
                counter += 1

        output, hs = p(batch_inputs,
                       (hidden_states_batched_A, hidden_states_batched_B))
        #print(output.shape)
        if not settings['recurrent']:  #ALPHA
            output = output.unsqueeze(
                0)  #So we have recurrent one and non-recurrent in same format
            #print(output.shape)
        #print(output[0, counter].shape, output[0, counter])
        #print(out.shape, out[0].shape, output.shape, out_sleep.shape)
        #print(morphogens[0])

        # Map out to cell state(0,1,2,3,4)
        counter = 0
        for i in range(1, im_size - 1):
            for e in range(1, im_size - 1):
                #print(i,e)
                #print(i, e, counter, int(counter/(im_size-2))+1, counter%(im_size-2)+1)
                #print (counter, i,e,  morphogens[0, i, e])
                if settings['growth_facter']:
                    cell_alive = (np.amax(
                        morphogens[1, i - 1:i + 2, e - 1:e + 2])) > 0.1  #ALPHA

                    if cell_alive:  #ALPHA

                        _, idx = output[0, counter].data[:4].max(0)  #ALPHA

                        #print(out[0].shape, out[0, counter].shape,out[0, counter].data.shape)
                        #print(out[0, counter].data[:4])
                        alpha = output[0, counter].data[4]  #ALPHA

                        morph_tmp[0, i, e] = int(idx.data.numpy())
                        morph_tmp[1, i, e] = F.relu(
                            alpha
                        )  #ALPHA   TODO apply function earlier, should be faster

                        if settings['recurrent']:
                            hidden_states_batched_A[0,
                                                    counter] = hs[0][0,
                                                                     counter]
                            hidden_states_batched_B[0,
                                                    counter] = hs[1][0,
                                                                     counter]
                            out = output
                        out[0] = output

                    else:  #ALPHA
                        morph_tmp[:, i,
                                  e] = 0  #If cell is not alive, set state to 0

                        if settings['recurrent']:
                            hidden_states_batched_A[
                                0, counter] = hs[0][0, counter] * 0.0
                            hidden_states_batched_B[
                                0, counter] = hs[1][0, counter] * 0.0
                    #print(counter)
                    counter += 1

                else:
                    if settings['cell_sleep']:
                        #Make cell sleep version morphogen
                        if out[0][counter][num_classes -
                                           1] <= 0 and counter not in sleep_id:
                            sum_cells = morphogens_sleep[
                                0, i - 1, e] + morphogens_sleep[
                                    0, i + 1, e] + morphogens_sleep[
                                        0, i, e + 1] + morphogens_sleep[
                                            0, i,
                                            e - 1] + morphogens_sleep[0, i, e]
                        else:
                            sum_cells = 0
                            sleep_id.append(counter)
                            sleep_id = list(set(sleep_id))
                            #print(sleep_id)
                    else:
                        sum_cells = morphogens[0, i - 1, e] + morphogens[
                            0, i + 1,
                            e] + morphogens[0, i, e + 1] + morphogens[
                                0, i, e - 1] + morphogens[0, i, e]
                    #print(counter, output[counter], out_sleep[0,counter])
                    #print(out.shape,out[0,7],output[0, counter][0:1])
                    if sum_cells > 0:  #If any of the surrounded cells or the cell itself is activate, modify the that position
                        #print(out[0, counter].data)
                        #print(out_sleep[0,1].shape, output[0,1].shape)
                        #print(counter, out_sleep[counter])
                        # Chose the highest value state
                        if settings['cell_sleep']:
                            #print(counter, out_sleep[0, counter] )
                            if settings['recurrent']:
                                out_sleep[0, counter] = output[
                                    0, counter][0:num_classes - 1]
                                #print(out_sleep[0, counter])
                                _, idx = out_sleep[0, counter].data.max(0)

                            else:
                                #print(out_sleep.shape, output.shape)
                                out_sleep[
                                    0,
                                    counter] = output[counter][0:num_classes -
                                                               1]
                                _, idx = out_sleep[0, counter].data.max(0)
                        else:
                            if settings['recurrent']:
                                _, idx = output[0, counter].data.max(0)
                                #print(_, idx)
                            else:
                                _, idx = output[counter].data.max(0)

                        # Next cell states
                        morph_tmp[0, i, e] = int(idx.data.numpy())
                        #print(out.shape, out_sleep.shape, output.shape)

                        #TODO if it's mot recurrent, "expression" would also not work right now?
                        #A is hidden state, B is cell state
                        # Update cell state and hideen states
                        if settings['recurrent']:
                            hidden_states_batched_A[0,
                                                    counter] = hs[0][0,
                                                                     counter]
                            hidden_states_batched_B[0,
                                                    counter] = hs[1][0,
                                                                     counter]
                            out = output
                        out[0] = output
                    #print(out[0].shape, output.shape)
                    #print(counter)
                    counter += 1
            #Caliculation each iterartion cell state
        morpho = morphogens[0][np.newaxis, :, :]
        alpha = morphogens[1][np.newaxis, :, :]

        dev_states.append(morpho)
        #print(type(dev_states),len(dev_states))
        morphogens = copy.deepcopy(morph_tmp)
        #print(morphogens.shape)

        #print(morpho.shape)

        #print(type(morphogens),morphogens.shape)# morphogen[batchsize,ind_id,im_size]
    #print(individual_id, morphogens,morphogens[0][4], morphogens[0][4][5])

    #Save vxa file and caliculate distance
    #print(fitness)
    write_voxelyze_file(sim, env, generations, individual_id, morpho, fitness,
                        settings['im_size'], settings['run_directory'],
                        settings['run_name'])

    #Evaluate with voxelyze
    #start_time = time.time()
    filepath = settings[
        'run_directory'] + "/tempFiles/softbotsOutput--gene_{0}_id_{1}.xml".format(
            generations, individual_id)
    #print(filepath)

    if np.any(morpho != 0):
        proc = sub.Popen("./voxelyze  -f " + settings['run_directory'] +
                         "/voxelyzeFiles/" + settings['run_name'] +
                         "--gene_{0}_id_{1}_fitness_0.vxa".format(
                             generations, individual_id),
                         stdout=sub.PIPE,
                         shell=True)
        proc.wait()
        while os.path.exists(filepath) == False:
            sleep(0.0000000001)

    else:
        print("gene_{0}_id_{1} is dead".format(generations, individual_id))

    #Read results
    #All subprocess done

    #print(filepath)
    if os.path.exists(filepath):
        fitness = read_voxlyze_results(generations, individual_id, filepath)
        #print(fitness)
        sub.Popen("rm " + settings['run_directory'] +
                  "/tempFiles/softbotsOutput--gene_{0}_id_{1}.xml".format(
                      generations, individual_id),
                  stdout=sub.PIPE,
                  shell=True)
    else:
        fitness = 0
    sub.Popen(
        "rm " + settings['run_directory'] + "/voxelyzeFiles/" +
        settings['run_name'] +
        "--gene_{0}_id_{1}_fitness_0.vxa".format(generations, individual_id),
        stdout=sub.PIPE,
        shell=True)
    print("gene_{0}_id_{1}_fitness{2}".format(generations, individual_id,
                                              fitness))
    '''
  total_log = [generations, individual_id,fitness]
  str_ = str(total_log)
  with open("{0}/fitnessFiles/gene_{1}_id_{2}_fitness{3}.txt".format(settings['run_directory'],generations, individual_id,fitness), 'wt') as f:
    f.write(str_)
  '''
    #Return fitness
    return fitness, sim, env, generations, individual_id, morpho, hidden_states_batched_A, hidden_states_batched_B, dev_states