diff --git a/.buildinfo b/.buildinfo index d880c06..b0c6685 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 -# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 59b6df7790291ee8a650d3c7c1c25661 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: eccf12cbfb532c8f88c604652ac49677 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 0000000..c7aeec7 --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,360 @@ + + + + + + Overview: module code — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +

All modules for which code is available

+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/byte_operators.html b/_modules/pycellga/byte_operators.html new file mode 100644 index 0000000..ba4bf1d --- /dev/null +++ b/_modules/pycellga/byte_operators.html @@ -0,0 +1,396 @@ + + + + + + pycellga.byte_operators — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pycellga.byte_operators

+import ctypes
+
+
+[docs] +def float_to_bits(float_number: float) -> list[int]: + """ + Convert a float to its bit representation. + + Parameters + ---------- + float_number : float + The float number to be converted. + + Returns + ------- + list of int + A list of 32 integers (0 or 1) representing the bit pattern of the float. + """ + c_float = ctypes.c_float(float_number) + cu = ctypes.c_uint32.from_address(ctypes.addressof(c_float)) + bit_list = [(cu.value >> i) & 1 for i in range(32)] + return bit_list
+ + +
+[docs] +def bits_to_float(bit_list: list[int]) -> float: + """ + Convert a bit representation to its float value. + + Parameters + ---------- + bit_list : list of int + A list of 32 integers (0 or 1) representing the bit pattern of the float. + + Returns + ------- + float + The float value represented by the bit pattern. + """ + u_value = 0 + for i in range(32): + u_value = u_value + bit_list[i] * (2**i) + cu = ctypes.c_uint(u_value) + c_float = ctypes.c_float.from_address(ctypes.addressof(cu)) + return c_float.value
+ + +
+[docs] +def floats_to_bits(float_list: list[float]) -> list[int]: + """ + Convert a list of floats to their combined bit representation. + + Parameters + ---------- + float_list : list of float + The list of float numbers to be converted. + + Returns + ------- + list of int + A list of integers (0 or 1) representing the combined bit patterns of the floats. + """ + bit_list = [] + + for f in float_list: + bit_list = bit_list + float_to_bits(f) + + return bit_list
+ + +
+[docs] +def bits_to_floats(bit_list: list[int]) -> list[float]: + """ + Convert a combined bit representation back to a list of floats. + + Parameters + ---------- + bit_list : list of int + A list of integers (0 or 1) representing the combined bit patterns of the floats. + + Returns + ------- + list of float + The list of float values represented by the bit pattern. + """ + bit_size = len(bit_list) + float_size = int(bit_size / 32) + float_vector = [0.0] * float_size + index = 0 + findex = 0 + + while index + 32 <= bit_size: + part = bit_list[index:(index+32)] + float_vector[findex] = round(bits_to_float(part), 3) + index = index+32 + findex += 1 + + return float_vector
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/grid.html b/_modules/pycellga/grid.html new file mode 100644 index 0000000..55d11cb --- /dev/null +++ b/_modules/pycellga/grid.html @@ -0,0 +1,345 @@ + + + + + + pycellga.grid — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pycellga.grid

+
+[docs] +class Grid: + """ + A class to represent a 2D grid. + + Attributes + ---------- + n_rows : int + Number of rows in the grid. + n_cols : int + Number of columns in the grid. + """ + +
+[docs] + def __init__(self, n_rows: int, n_cols: int): + """ + Initialize the Grid with the number of rows and columns. + + Parameters + ---------- + n_rows : int + Number of rows in the grid. + n_cols : int + Number of columns in the grid. + """ + self.n_rows = n_rows + self.n_cols = n_cols
+ + +
+[docs] + def make_2d_grid(self) -> list: + """ + Create a 2D grid where each cell is represented by a tuple (row, column). + + Returns + ------- + list + A list of tuples where each tuple represents a grid cell. + Each tuple is of the form (row, column), with rows and columns starting from 1. + """ + grid = [] + for i in range(self.n_rows): + for j in range(self.n_cols): + point = (i + 1, j + 1) + grid.append(point) + return grid
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/individual.html b/_modules/pycellga/individual.html new file mode 100644 index 0000000..90088e9 --- /dev/null +++ b/_modules/pycellga/individual.html @@ -0,0 +1,487 @@ + + + + + + pycellga.individual — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pycellga.individual

+import sys
+import os
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+
+from numpy import random
+import numpy as np
+import random as rd
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+
+[docs] +class Individual: + """ + A class to represent an individual in an evolutionary algorithm. + + Attributes + ---------- + chromosome : list + The chromosome representing the individual. + fitness_value : float + The fitness value of the individual. + position : tuple + The position of the individual, represented as a tuple (x, y). + neighbors_positions : list or None + The positions of the individual's neighbors. + neighbors : list or None + The list of neighbors for the individual. + gen_type : GeneType + The enum type of genome representation (GeneType.BINARY, GeneType.PERMUTATION, GeneType.REAL). + ch_size : int + The size of the chromosome. + """ + +
+[docs] + def __init__(self, + gen_type: GeneType = GeneType.BINARY, + ch_size: int = 0, + mins : list[float] = [], + maxs : list[float] = []): + """ + Initialize an Individual with a specific genome type and chromosome size. + + Parameters + ---------- + gen_type : str, optional + The type of genome representation. Must be one of GeneType.BINARY, GeneType.PERMUTATION, or GeneType.REAL. (default is GeneType.BINARY) + ch_size : int + The size of the chromosome. + mins: list[float] + The minimum values for each gene in the chromosome. + maxs: list[float] + The maximum values for each gene in the chromosome. + + Description: + ------------ + The Individual class represents an individual in an evolutionary algorithm. + If the genome type is BINARY, the chromosome is a list of 0s and 1s. + If the genome type is PERMUTATION, the chromosome is a list of integers representing a permutation. + In both the binary and permutation cases, ch_size is enought to represent the chromosome. + If the genome type is REAL, the chromosome is a list of real numbers. + In this case, the mins and maxs lists are used to define the range of each gene in the chromosome. + """ + self.gen_type = gen_type + self.ch_size = ch_size + self.chromosome = [] + self.fitness_value = 0 + self.position = (0, 0) + self.neighbors_positions = None + self.neighbors = None + self.mins = mins + self.maxs = maxs
+ + + +
+[docs] + def randomize(self): + """ + Randomly initialize the chromosome based on the genome type. + + Returns + ------- + list + The randomly generated chromosome. + + Raises + ------ + NotImplementedError + If the genome type is not implemented. + """ + + if self.gen_type == GeneType.BINARY: + self.chromosome = [random.randint(2) for i in range(self.ch_size)] + + elif self.gen_type == GeneType.PERMUTATION: + # Generate a random permutation of the numbers 1 to ch_size. + # by default random.permutation emits numbers from 0 to ch_size-1 + # so we add 1 to each number to get the desired range. + self.chromosome = list(np.random.permutation(self.ch_size) + 1) + + elif self.gen_type == GeneType.REAL: + if len(self.mins) > 0: + assert len(self.mins) == len(self.maxs) == self.ch_size + self.chromosome = [rd.uniform(self.mins[i], self.maxs[i]) for i in range(self.ch_size)] + else: + self.chromosome = [rd.uniform(-1.0, 0.1) for i in range(self.ch_size)] + + else: + raise NotImplementedError("This gen_type not implemented yet.") + return self.chromosome
+ + + +
+[docs] + def generate_candidate(self, probvector: list) -> list: + """ + Generate a candidate chromosome based on the given probability vector. + + Parameters + ---------- + vector : list of float + The probability vector used to generate the candidate chromosome. + + Returns + ------- + list + The generated candidate chromosome as a list of 0s and 1s. + """ + ind = [1 if random.rand() < p else 0 for p in probvector] + return ind
+ + +
+[docs] + def getneighbors_positions(self) -> list: + """ + Get the positions of the individual's neighbors. + + Returns + ------- + list or None + The positions of the individual's neighbors. + """ + return self.neighbors_positions
+ + +
+[docs] + def setneighbors_positions(self, positions: list) -> None: + """ + Set the positions of the individual's neighbors. + + Parameters + ---------- + positions : list + The positions to set for the individual's neighbors. + """ + self.neighbors_positions = positions
+ + +
+[docs] + def getneighbors(self) -> list: + """ + Get the list of neighbors for the individual. + + Returns + ------- + list or None + The list of neighbors for the individual. + """ + return self.neighbors
+ + +
+[docs] + def setneighbors(self, neighbors: list) -> None: + """ + Set the list of neighbors for the individual. + + Parameters + ---------- + neighbors : list + The list of neighbors to set for the individual. + """ + self.neighbors = list(neighbors)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/mutation/bit_flip_mutation.html b/_modules/pycellga/mutation/bit_flip_mutation.html new file mode 100644 index 0000000..d4b42f7 --- /dev/null +++ b/_modules/pycellga/mutation/bit_flip_mutation.html @@ -0,0 +1,367 @@ + + + + + + pycellga.mutation.bit_flip_mutation — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.mutation.bit_flip_mutation

+import numpy as np
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from mutation.mutation_operator import MutationOperator
+
+
+[docs] +class BitFlipMutation(MutationOperator): + """ + BitFlipMutation performs a bit flip mutation on an individual in a Genetic Algorithm. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + +
+[docs] + def __init__(self, mutation_cand: Individual = None, problem: AbstractProblem = None): + """ + Initialize the BitFlipMutation object. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + self.mutation_cand = mutation_cand + self.problem = problem
+ + +
+[docs] + def mutate(self) -> Individual: + """ + Perform a bit flip mutation on the candidate individual. + + A single bit in the candidate's chromosome is randomly selected and flipped + (i.e., a 0 is changed to a 1, or a 1 is changed to a 0). + + Returns + ------- + Individual + A new individual with the mutated chromosome. + """ + # Convert the chromosome to a list to allow mutation + m_ch = list(self.mutation_cand.chromosome) + + # Randomly select an index in the chromosome + index = np.random.randint(0, len(m_ch)) + + # Flip the bit at the selected index + if m_ch[index] == 0: + m_ch[index] = 1 + else: + m_ch[index] = 0 + + # Create a new Individual with the mutated chromosome + mutated = Individual() + mutated.chromosome = m_ch + mutated.ch_size = len(m_ch) + mutated.position = self.mutation_cand.position + mutated.neighbors_positions = self.mutation_cand.neighbors_positions + mutated.fitness_value = self.problem.f(mutated.chromosome) + + return mutated
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/mutation/byte_mutation.html b/_modules/pycellga/mutation/byte_mutation.html new file mode 100644 index 0000000..8762bea --- /dev/null +++ b/_modules/pycellga/mutation/byte_mutation.html @@ -0,0 +1,393 @@ + + + + + + pycellga.mutation.byte_mutation — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.mutation.byte_mutation

+import numpy as np
+from individual import *
+from problems.abstract_problem import AbstractProblem
+import struct
+from mutation.mutation_operator import MutationOperator
+
+
+[docs] +class ByteMutation(MutationOperator): + """ + ByteMutation operator defined in (Satman, 2013). ByteMutation performs a byte-wise mutation + on an individual's chromosome in a Genetic Algorithm. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + +
+[docs] + def __init__(self, mutation_cand: Individual = None, problem: AbstractProblem = None): + """ + Initialize the ByteMutation object. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + self.mutation_cand = mutation_cand + self.problem = problem
+ + +
+[docs] + def mutate(self) -> Individual: + """ + Perform a byte-wise mutation on the candidate individual. + + A single byte in one of the candidate's chromosome's floating-point numbers is randomly selected + and either incremented or decremented by 1, wrapping around if necessary. + + Returns + ------- + Individual + A new individual with the mutated chromosome. + """ + # Convert the chromosome to a list to allow mutation + m_ch = list(self.mutation_cand.chromosome) + + # Randomly select an index in the chromosome + index = np.random.randint(0, len(m_ch)) + + # Pack the selected float into bytes + m_byte_ch = list(struct.pack("d", m_ch[index])) + + # Randomly select an index in the byte representation + rnd_index = np.random.randint(0, len(m_byte_ch)) + + # Get the byte at the selected index + mutant = m_byte_ch[rnd_index] + + # Generate a random uniform value to decide increment or decrement + u = np.random.uniform(0, 1) + + # Increment or decrement the byte, with wrapping + if u < 0.5: + mutant += 1 + else: + mutant -= 1 + if mutant > 255: + mutant = 0 + elif mutant < 0: + mutant = 255 + + # Replace the selected byte with the mutated byte + m_byte_ch[rnd_index] = mutant + + # Convert the mutated byte sequence back to a float + mutatnt_part_byte = bytearray(m_byte_ch) + mutant_part_float = list(struct.unpack("d", mutatnt_part_byte)) + m_ch[index] = round(mutant_part_float[0], 5) + + # Create a new Individual with the mutated chromosome + mutated = Individual() + mutated.chromosome = m_ch + mutated.ch_size = len(m_ch) + mutated.position = self.mutation_cand.position + mutated.neighbors_positions = self.mutation_cand.neighbors_positions + mutated.fitness_value = self.problem.f(mutated.chromosome) + + return mutated
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/mutation/byte_mutation_random.html b/_modules/pycellga/mutation/byte_mutation_random.html new file mode 100644 index 0000000..cc3fe6d --- /dev/null +++ b/_modules/pycellga/mutation/byte_mutation_random.html @@ -0,0 +1,380 @@ + + + + + + pycellga.mutation.byte_mutation_random — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.mutation.byte_mutation_random

+import numpy as np
+from individual import *
+from problems.abstract_problem import AbstractProblem
+import struct
+from mutation.mutation_operator import MutationOperator
+
+
+[docs] +class ByteMutationRandom(MutationOperator): + """ + ByteMutationRandom operator defined in (Satman, 2013). ByteMutationRandom performs + a random byte mutation on an individual's chromosome in a Genetic Algorithm. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + +
+[docs] + def __init__(self, mutation_cand: Individual = None, problem: AbstractProblem = None): + """ + Initialize the ByteMutationRandom object. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + self.mutation_cand = mutation_cand + self.problem = problem
+ + +
+[docs] + def mutate(self) -> Individual: + """ + Perform a random byte mutation on the candidate individual. + + A single byte in one of the candidate's chromosome's floating-point numbers is randomly selected + and mutated to a random value. + + Returns + ------- + Individual + A new individual with the mutated chromosome. + """ + # Convert the chromosome to a list to allow mutation + m_ch = list(self.mutation_cand.chromosome) + + # Randomly select an index in the chromosome + index = np.random.randint(0, len(m_ch)) + + # Pack the selected float into bytes + m_byte_ch = list(struct.pack("d", m_ch[index])) + + # Randomly select an index in the byte representation + rnd_index = np.random.randint(0, len(m_byte_ch)) + + # Generate a random byte + mutant = np.random.randint(0, 256) + + # Replace the selected byte with the random byte + m_byte_ch[rnd_index] = mutant + + # Convert the mutated byte sequence back to a float + mutatnt_part_byte = bytearray(m_byte_ch) + mutant_part_float = list(struct.unpack("d", mutatnt_part_byte)) + m_ch[index] = round(mutant_part_float[0], 5) + + # Create a new Individual with the mutated chromosome + mutated = Individual() + mutated.chromosome = m_ch + mutated.ch_size = len(m_ch) + mutated.position = self.mutation_cand.position + mutated.neighbors_positions = self.mutation_cand.neighbors_positions + mutated.fitness_value = self.problem.f(mutated.chromosome) + + return mutated
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/mutation/float_uniform_mutation.html b/_modules/pycellga/mutation/float_uniform_mutation.html new file mode 100644 index 0000000..755af58 --- /dev/null +++ b/_modules/pycellga/mutation/float_uniform_mutation.html @@ -0,0 +1,367 @@ + + + + + + pycellga.mutation.float_uniform_mutation — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.mutation.float_uniform_mutation

+import random
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from mutation.mutation_operator import MutationOperator
+
+
+[docs] +class FloatUniformMutation(MutationOperator): + """ + FloatUniformMutation performs a uniform mutation on an individual's chromosome in a Genetic Algorithm. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + +
+[docs] + def __init__(self, mutation_cand: Individual = None, problem: AbstractProblem = None): + """ + Initialize the FloatUniformMutation object. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + self.mutation_cand = mutation_cand + self.problem = problem
+ + +
+[docs] + def mutate(self) -> Individual: + """ + Perform a uniform mutation on the candidate individual. + + Each gene in the candidate's chromosome is mutated by adding or subtracting a random float uniformly + sampled from [0, 1]. The mutation is rounded to 5 decimal places. + + Returns + ------- + Individual + A new individual with the mutated chromosome. + """ + # Convert the chromosome to a list to allow mutation + m_ch = list(self.mutation_cand.chromosome) + + # Mutate each gene in the chromosome + for i in range(len(m_ch)): + rnd = random.uniform(0, 1) + if rnd < 0.5: + m_ch[i] = round(m_ch[i] - rnd, 5) + else: + m_ch[i] = round(m_ch[i] + rnd, 5) + + # Create a new Individual with the mutated chromosome + mutated_ch_new = list(m_ch) + mutated = Individual() + mutated.chromosome = mutated_ch_new + mutated.ch_size = len(mutated_ch_new) + mutated.position = self.mutation_cand.position + mutated.neighbors_positions = self.mutation_cand.neighbors_positions + mutated.fitness_value = self.problem.f(mutated.chromosome) + + return mutated
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/mutation/insertion_mutation.html b/_modules/pycellga/mutation/insertion_mutation.html new file mode 100644 index 0000000..ad77507 --- /dev/null +++ b/_modules/pycellga/mutation/insertion_mutation.html @@ -0,0 +1,369 @@ + + + + + + pycellga.mutation.insertion_mutation — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.mutation.insertion_mutation

+import numpy as np
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from mutation.mutation_operator import MutationOperator
+
+
+[docs] +class InsertionMutation(MutationOperator): + """ + InsertionMutation performs an insertion mutation on an individual's chromosome in a Genetic Algorithm. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + +
+[docs] + def __init__(self, mutation_cand: Individual = None, problem: AbstractProblem = None): + """ + Initialize the InsertionMutation object. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + self.mutation_cand = mutation_cand + self.problem = problem
+ + +
+[docs] + def mutate(self) -> Individual: + """ + Perform an insertion mutation on the candidate individual. + + A gene in the candidate's chromosome is randomly selected and moved to a new position in the chromosome. + + Returns + ------- + Individual + A new individual with the mutated chromosome. + """ + # Convert the chromosome to a list to allow mutation + mutated_ch = list(self.mutation_cand.chromosome) + + # Randomly select two distinct indices in the chromosome + ran_1 = np.random.randint(0, len(mutated_ch)) + ran_2 = np.random.randint(0, len(mutated_ch)) + while ran_1 == ran_2: + ran_2 = np.random.randint(0, len(mutated_ch)) + + # Remove the gene at the first index and insert it at the second index + x = mutated_ch[ran_1] + mutated_ch_new = list(mutated_ch) + mutated_ch_new.remove(x) + mutated_ch_new.insert(ran_2, x) + + # Create a new Individual with the mutated chromosome + mutated = Individual() + mutated.chromosome = mutated_ch_new + mutated.ch_size = len(mutated_ch_new) + mutated.position = self.mutation_cand.position + mutated.neighbors_positions = self.mutation_cand.neighbors_positions + mutated.fitness_value = self.problem.f(mutated.chromosome) + + return mutated
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/mutation/shuffle_mutation.html b/_modules/pycellga/mutation/shuffle_mutation.html new file mode 100644 index 0000000..de99b2d --- /dev/null +++ b/_modules/pycellga/mutation/shuffle_mutation.html @@ -0,0 +1,382 @@ + + + + + + pycellga.mutation.shuffle_mutation — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.mutation.shuffle_mutation

+import numpy as np
+import random as rd
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from mutation.mutation_operator import MutationOperator
+
+
+[docs] +class ShuffleMutation(MutationOperator): + """ + ShuffleMutation performs a shuffle mutation on an individual's chromosome in a Genetic Algorithm. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + +
+[docs] + def __init__(self, mutation_cand: Individual = None, problem: AbstractProblem = None): + """ + Initialize the ShuffleMutation object. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + self.mutation_cand = mutation_cand + self.problem = problem
+ + +
+[docs] + def mutate(self) -> Individual: + """ + Perform a shuffle mutation on the candidate individual. + + A subsequence of genes in the candidate's chromosome is randomly selected and shuffled. + + Returns + ------- + Individual + A new individual with the mutated chromosome. + """ + # Convert the chromosome to a list to allow mutation + mutated_ch = list(self.mutation_cand.chromosome) + + # Randomly select two distinct indices in the chromosome with a minimum distance between them + ran_1 = np.random.randint(0, len(mutated_ch)) + ran_2 = np.random.randint(0, len(mutated_ch)) + + while abs(ran_1 - ran_2) < 3: + ran_2 = np.random.randint(0, len(mutated_ch)) + + # Create a new list to hold the mutated chromosome + mutated_ch_new = list(mutated_ch) + + # Shuffle the subsequence between the two selected indices + if ran_1 < ran_2: + part = mutated_ch_new[ran_1:ran_2] + part_shuffle = rd.sample(part, len(part)) + while part == part_shuffle: + part_shuffle = rd.sample(part, len(part)) + mutated_ch_new[ran_1:ran_2] = part_shuffle + else: + part = mutated_ch_new[ran_2:ran_1] + part_shuffle = rd.sample(part, len(part)) + while part == part_shuffle: + part_shuffle = rd.sample(part, len(part)) + mutated_ch_new[ran_2:ran_1] = part_shuffle + + # Create a new Individual with the mutated chromosome + mutated = Individual() + mutated.chromosome = mutated_ch_new + mutated.ch_size = len(mutated_ch_new) + mutated.position = self.mutation_cand.position + mutated.neighbors_positions = self.mutation_cand.neighbors_positions + mutated.fitness_value = self.problem.f(mutated.chromosome) + + return mutated
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/mutation/swap_mutation.html b/_modules/pycellga/mutation/swap_mutation.html new file mode 100644 index 0000000..de7ba2a --- /dev/null +++ b/_modules/pycellga/mutation/swap_mutation.html @@ -0,0 +1,370 @@ + + + + + + pycellga.mutation.swap_mutation — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.mutation.swap_mutation

+import numpy as np
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from mutation.mutation_operator import MutationOperator
+
+
+[docs] +class SwapMutation(MutationOperator): + """ + SwapMutation performs a swap mutation on an individual's chromosome in a Genetic Algorithm. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + +
+[docs] + def __init__(self, mutation_cand: Individual = None, problem: AbstractProblem = None): + """ + Initialize the SwapMutation object. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + self.mutation_cand = mutation_cand + self.problem = problem
+ + +
+[docs] + def mutate(self) -> Individual: + """ + Perform a swap mutation on the candidate individual. + + Two genes in the candidate's chromosome are randomly selected and swapped. + + Returns + ------- + Individual + A new individual with the mutated chromosome. + """ + # Convert the chromosome to a list to allow mutation + mutated_ch = list(self.mutation_cand.chromosome) + + # Randomly select two distinct indices in the chromosome + ran_1 = np.random.randint(0, len(mutated_ch)) + ran_2 = np.random.randint(0, len(mutated_ch)) + while ran_1 == ran_2: + ran_2 = np.random.randint(0, len(mutated_ch)) + + # Swap the genes at the selected indices + swap_candidate_1 = mutated_ch[ran_1] + swap_candidate_2 = mutated_ch[ran_2] + mutated_ch_new = list(mutated_ch) + mutated_ch_new[ran_1] = swap_candidate_2 + mutated_ch_new[ran_2] = swap_candidate_1 + + # Create a new Individual with the mutated chromosome + mutated = Individual() + mutated.chromosome = mutated_ch_new + mutated.ch_size = len(mutated_ch_new) + mutated.position = self.mutation_cand.position + mutated.neighbors_positions = self.mutation_cand.neighbors_positions + mutated.fitness_value = self.problem.f(mutated.chromosome) + + return mutated
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/mutation/two_opt_mutation.html b/_modules/pycellga/mutation/two_opt_mutation.html new file mode 100644 index 0000000..2d13e7a --- /dev/null +++ b/_modules/pycellga/mutation/two_opt_mutation.html @@ -0,0 +1,373 @@ + + + + + + pycellga.mutation.two_opt_mutation — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.mutation.two_opt_mutation

+import numpy as np
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from mutation.mutation_operator import MutationOperator
+
+
+[docs] +class TwoOptMutation(MutationOperator): + """ + TwoOptMutation performs a 2-opt mutation on an individual's chromosome in a Genetic Algorithm. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + +
+[docs] + def __init__(self, mutation_cand: Individual = None, problem: AbstractProblem = None): + """ + Initialize the TwoOptMutation object. + + Parameters + ---------- + mutation_cand : Individual, optional + The candidate individual to be mutated (default is None). + problem : AbstractProblem, optional + The problem instance that provides the fitness function (default is None). + """ + self.mutation_cand = mutation_cand + self.problem = problem
+ + +
+[docs] + def mutate(self) -> Individual: + """ + Perform a 2-opt mutation on the candidate individual. + + A segment of the candidate's chromosome is randomly selected and reversed. + + Returns + ------- + Individual + A new individual with the mutated chromosome. + """ + # Convert the chromosome to a list to allow mutation + mutated_ch = list(self.mutation_cand.chromosome) + + # Randomly select two distinct indices in the chromosome with a minimum distance between them + ran_1 = np.random.randint(0, len(mutated_ch)) + ran_2 = np.random.randint(0, len(mutated_ch)) + + while abs(ran_1 - ran_2) < 3: + ran_2 = np.random.randint(0, len(mutated_ch)) + + # Create a new list to hold the mutated chromosome + mutated_ch_new = list(mutated_ch) + + # Reverse the segment between the two selected indices + if ran_1 < ran_2: + mutated_ch_new[ran_1:ran_2] = reversed(mutated_ch_new[ran_1:ran_2]) + else: + mutated_ch_new[ran_2:ran_1] = reversed(mutated_ch_new[ran_2:ran_1]) + + # Create a new Individual with the mutated chromosome + mutated = Individual() + mutated.chromosome = mutated_ch_new + mutated.ch_size = len(mutated_ch_new) + mutated.position = self.mutation_cand.position + mutated.neighbors_positions = self.mutation_cand.neighbors_positions + mutated.fitness_value = self.problem.f(mutated.chromosome) + + return mutated
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/neighborhoods/compact_13.html b/_modules/pycellga/neighborhoods/compact_13.html new file mode 100644 index 0000000..c07ed4b --- /dev/null +++ b/_modules/pycellga/neighborhoods/compact_13.html @@ -0,0 +1,380 @@ + + + + + + pycellga.neighborhoods.compact_13 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.neighborhoods.compact_13

+
+[docs] +class Compact13: + """ + Compact13 calculates the positions of the 12 neighbors in a 2D grid for a given position, + considering wrapping at the grid edges. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + +
+[docs] + def __init__(self, position, n_rows, n_cols): + """ + Initialize the Compact13 object. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + self.position = position + self.n_rows = n_rows + self.n_cols = n_cols
+ + +
+[docs] + def calculate_neighbors_positions(self) -> list: + """ + Calculate the positions of the 12 neighbors for the given position in the grid. + + The neighbors are determined by considering wrapping at the grid edges. + + Returns + ------- + list + A list of tuples representing the positions of the 12 neighbors. + """ + neighbors_positions = [] + point = self.position + x = point[0] + y = point[1] + + # Change in x and y for the 12 neighbors + dx = [-2, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 2] + dy = [0, -1, 0, 1, -2, -1, 1, 2, -1, 0, 1, 0] + + if x == self.n_rows or y == self.n_rows: + for i in range(len(dx)): + npx = (x + dx[i]) % self.n_rows + npy = (y + dy[i]) % self.n_rows + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + elif x != self.n_rows or y != self.n_rows: + for i in range(len(dx)): + npx = x + dx[i] + npy = y + dy[i] + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + return neighbors_positions
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/neighborhoods/compact_21.html b/_modules/pycellga/neighborhoods/compact_21.html new file mode 100644 index 0000000..819b408 --- /dev/null +++ b/_modules/pycellga/neighborhoods/compact_21.html @@ -0,0 +1,380 @@ + + + + + + pycellga.neighborhoods.compact_21 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.neighborhoods.compact_21

+
+[docs] +class Compact21: + """ + Compact21 calculates the positions of the 20 neighbors in a 2D grid for a given position, + considering wrapping at the grid edges. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + +
+[docs] + def __init__(self, position, n_rows, n_cols): + """ + Initialize the Compact21 object. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + self.position = position + self.n_rows = n_rows + self.n_cols = n_cols
+ + +
+[docs] + def calculate_neighbors_positions(self) -> list: + """ + Calculate the positions of the 20 neighbors for the given position in the grid. + + The neighbors are determined by considering wrapping at the grid edges. + + Returns + ------- + list + A list of tuples representing the positions of the 20 neighbors. + """ + neighbors_positions = [] + point = self.position + x = point[0] + y = point[1] + + # Change in x and y for the 20 neighbors + dx = [-2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2] + dy = [-1, 0, 1, -2, -1, 0, 1, 2, -2, -1, 1, 2, -2, -1, 0, 1, 2, -1, 0, 1] + + if x == self.n_rows or y == self.n_rows: + for i in range(len(dx)): + npx = (x + dx[i]) % self.n_rows + npy = (y + dy[i]) % self.n_rows + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + elif x != self.n_rows or y != self.n_rows: + for i in range(len(dx)): + npx = x + dx[i] + npy = y + dy[i] + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + return neighbors_positions
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/neighborhoods/compact_25.html b/_modules/pycellga/neighborhoods/compact_25.html new file mode 100644 index 0000000..86b93a5 --- /dev/null +++ b/_modules/pycellga/neighborhoods/compact_25.html @@ -0,0 +1,380 @@ + + + + + + pycellga.neighborhoods.compact_25 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.neighborhoods.compact_25

+
+[docs] +class Compact25: + """ + Compact25 calculates the positions of the 24 neighbors in a 2D grid for a given position, + considering wrapping at the grid edges. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + +
+[docs] + def __init__(self, position, n_rows, n_cols): + """ + Initialize the Compact25 object. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + self.position = position + self.n_rows = n_rows + self.n_cols = n_cols
+ + +
+[docs] + def calculate_neighbors_positions(self) -> list: + """ + Calculate the positions of the 24 neighbors for the given position in the grid. + + The neighbors are determined by considering wrapping at the grid edges. + + Returns + ------- + list + A list of tuples representing the positions of the 24 neighbors. + """ + neighbors_positions = [] + point = self.position + x = point[0] + y = point[1] + + # Change in x and y for the 24 neighbors + dx = [-2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2] + dy = [-2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2] + + if x == self.n_rows or y == self.n_rows: + for i in range(len(dx)): + npx = (x + dx[i]) % self.n_rows + npy = (y + dy[i]) % self.n_rows + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + elif x != self.n_rows or y != self.n_rows: + for i in range(len(dx)): + npx = x + dx[i] + npy = y + dy[i] + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + return neighbors_positions
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/neighborhoods/compact_9.html b/_modules/pycellga/neighborhoods/compact_9.html new file mode 100644 index 0000000..cd975d6 --- /dev/null +++ b/_modules/pycellga/neighborhoods/compact_9.html @@ -0,0 +1,380 @@ + + + + + + pycellga.neighborhoods.compact_9 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.neighborhoods.compact_9

+
+[docs] +class Compact9: + """ + Compact9 calculates the positions of the 8 neighbors in a 2D grid for a given position, + considering wrapping at the grid edges. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + +
+[docs] + def __init__(self, position, n_rows, n_cols): + """ + Initialize the Compact9 object. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + self.position = position + self.n_rows = n_rows + self.n_cols = n_cols
+ + +
+[docs] + def calculate_neighbors_positions(self) -> list: + """ + Calculate the positions of the 8 neighbors for the given position in the grid. + + The neighbors are determined by considering wrapping at the grid edges. + + Returns + ------- + list + A list of tuples representing the positions of the 8 neighbors. + """ + neighbors_positions = [] + point = self.position + x = point[0] + y = point[1] + + # Change in x and y for the 8 neighbors + dx = [-1, -1, -1, 0, 1, 1, 1, 0] + dy = [-1, 0, 1, -1, -1, 0, 1, 1] + + if x == self.n_rows or y == self.n_rows: + for i in range(len(dx)): + npx = (x + dx[i]) % self.n_rows + npy = (y + dy[i]) % self.n_rows + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + elif x != self.n_rows or y != self.n_rows: + for i in range(len(dx)): + npx = x + dx[i] + npy = y + dy[i] + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + return neighbors_positions
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/neighborhoods/linear_5.html b/_modules/pycellga/neighborhoods/linear_5.html new file mode 100644 index 0000000..0c33c5f --- /dev/null +++ b/_modules/pycellga/neighborhoods/linear_5.html @@ -0,0 +1,380 @@ + + + + + + pycellga.neighborhoods.linear_5 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.neighborhoods.linear_5

+
+[docs] +class Linear5: + """ + Linear5 calculates the positions of the 4 neighbors in a 2D grid for a given position, + considering wrapping at the grid edges. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + +
+[docs] + def __init__(self, position, n_rows, n_cols): + """ + Initialize the Linear5 object. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + self.position = position + self.n_rows = n_rows + self.n_cols = n_cols
+ + +
+[docs] + def calculate_neighbors_positions(self) -> list: + """ + Calculate the positions of the 4 neighbors for the given position in the grid. + + The neighbors are determined by considering wrapping at the grid edges. + + Returns + ------- + list + A list of tuples representing the positions of the 4 neighbors. + """ + neighbors_positions = [] + point = self.position + x = point[0] + y = point[1] + + # Change in x and y for the 4 neighbors + dx = [0, 0, -1, 1] + dy = [1, -1, 0, 0] + + if x == self.n_rows or y == self.n_rows: + for i in range(len(dx)): + npx = (x + dx[i]) % self.n_rows + npy = (y + dy[i]) % self.n_rows + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + elif x != self.n_rows or y != self.n_rows: + for i in range(len(dx)): + npx = x + dx[i] + npy = y + dy[i] + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + return neighbors_positions
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/neighborhoods/linear_9.html b/_modules/pycellga/neighborhoods/linear_9.html new file mode 100644 index 0000000..e404bb5 --- /dev/null +++ b/_modules/pycellga/neighborhoods/linear_9.html @@ -0,0 +1,382 @@ + + + + + + pycellga.neighborhoods.linear_9 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.neighborhoods.linear_9

+
+[docs] +class Linear9: + """ + Linear9 calculates the positions of the 8 neighbors in a 2D grid for a given position, + considering wrapping at the grid edges. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + +
+[docs] + def __init__(self, position, n_rows, n_cols): + """ + Initialize the Linear9 object. + + Parameters + ---------- + position : tuple + The (x, y) position of the point whose neighbors are to be calculated. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + """ + self.position = position + self.n_rows = n_rows + self.n_cols = n_cols
+ + +
+[docs] + def calculate_neighbors_positions(self) -> list: + """ + Calculate the positions of the 8 neighbors for the given position in the grid. + + The neighbors are determined by considering wrapping at the grid edges. + + Returns + ------- + list + A list of tuples representing the positions of the 8 neighbors. + """ + neighbors_positions = [] + point = self.position + x = point[0] + y = point[1] + + # Change in x and y for the 8 neighbors + dx = [-2, -1, 0, 0, 1, 2, 0, 0] + dy = [0, 0, -2, -1, 0, 0, 1, 2] + + # If the position is at the edge of the grid, wrap around + if x == self.n_rows or y == self.n_rows: + for i in range(len(dx)): + npx = (x + dx[i]) % self.n_rows + npy = (y + dy[i]) % self.n_rows + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + # If the position is not at the edge, calculate normally + elif x != self.n_rows or y != self.n_rows: + for i in range(len(dx)): + npx = x + dx[i] + npy = y + dy[i] + if npx == 0: + npx = self.n_rows + if npy == 0: + npy = self.n_rows + + neighbor_position = (npx, npy) + neighbors_positions.append(neighbor_position) + + return neighbors_positions
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/optimizer.html b/_modules/pycellga/optimizer.html new file mode 100644 index 0000000..1abf817 --- /dev/null +++ b/_modules/pycellga/optimizer.html @@ -0,0 +1,1167 @@ + + + + + + pycellga.optimizer — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pycellga.optimizer

+
+import random
+import numpy as np
+import byte_operators
+from population import *
+from individual import *
+from mutation.bit_flip_mutation import *
+from selection.tournament_selection import *
+from recombination.one_point_crossover import *
+from problems.single_objective.discrete.binary.one_max import *
+
+from typing import Callable, List, Tuple
+from collections.abc import Callable
+
+
+from dataclasses import dataclass
+from typing import List, Callable
+
+
+[docs] +@dataclass +class Result: + chromosome: List[float] + fitness_value: float + generation_found: int
+ + +
+[docs] +def cga( + n_cols: int, + n_rows: int, + n_gen: int, + ch_size: int, + p_crossover: float, + p_mutation: float, + problem: AbstractProblem, + selection: SelectionOperator, + recombination: RecombinationOperator, + mutation: MutationOperator, + seed_par: int = None +) -> Result: + """ + Optimize the given problem using a genetic algorithm. + + Parameters + ---------- + n_cols : int + Number of columns in the population grid. + n_rows : int + Number of rows in the population grid. + n_gen : int + Number of generations to evolve. + ch_size : int + Size of the chromosome. + gen_type : str + Type of the genome representation (e.g., 'Binary', 'Permutation', 'Real'). + p_crossover : float + Probability of crossover (between 0 and 1). + p_mutation : float + Probability of mutation (between 0 and 1). + problem : AbstractProblem + The problem instance used for fitness evaluation. + selection : SelectionOperator + Function or class used for selecting parents. + recombination : RecombinationOperator + Function or class used for recombination (crossover). + mutation : MutationOperator + Function or class used for mutation. + mins : list[float] + List of minimum values for each gene in the chromosome (for real value optimization). + maxs : list[float] + List of maximum values for each gene in the chromosome (for real value optimization). + seed_par : int + Ensures the random number generation is repeatable. + + Returns + ------- + Result + A Result object containing the best solution found, with its chromosome, fitness value, and generation. + """ + + if seed_par is not None: + np.random.seed(seed_par) + random.seed(seed_par) + + pop_size = n_cols * n_rows + best_solutions = [] + best_objectives = [] + avg_objectives = [] + method_name = OptimizationMethod.CGA + + # Generate Initial Population + pop_list = Population( + method_name, + ch_size, + n_rows, + n_cols, + gen_type = problem.gen_type, + problem = problem, + mins = problem.xl, + maxs = problem.xu).initial_population() + + pop_list_ordered = sorted(pop_list, key=lambda x: x.fitness_value) + + best_solutions.append(pop_list_ordered[0].chromosome) + best_objectives.append(pop_list_ordered[0].fitness_value) + best_ever_solution = Result( + chromosome=pop_list_ordered[0].chromosome, + fitness_value=pop_list_ordered[0].fitness_value, + generation_found=0 + ) + + mean = sum(ind.fitness_value for ind in pop_list) / len(pop_list) + avg_objectives.append(mean) + + # Evolutionary Algorithm Loop + generation = 1 + while generation != n_gen + 1: + for c in range(pop_size): + offsprings = [] + parents = selection(pop_list, c).get_parents() + rnd = np.random.rand() + + if rnd < p_crossover: + offsprings = recombination(parents, problem).get_recombinations() + else: + offsprings = parents + + for p in range(len(offsprings)): + mutation_cand = offsprings[p] + rnd = np.random.rand() + + if rnd < p_mutation: + mutated = mutation(mutation_cand, problem).mutate() + offsprings[p] = mutated + + # Replacement: Replace if better + if offsprings[p].fitness_value < parents[p].fitness_value: + index = pop_list.index(parents[p]) + pop_list[index] = offsprings[p] + + pop_list_ordered = sorted(pop_list, key=lambda x: x.fitness_value) + best_solutions.append(pop_list_ordered[0].chromosome) + best_objectives.append(pop_list_ordered[0].fitness_value) + + if pop_list_ordered[0].fitness_value < best_ever_solution.fitness_value: + best_ever_solution = Result( + chromosome=pop_list_ordered[0].chromosome, + fitness_value=pop_list_ordered[0].fitness_value, + generation_found=generation + ) + + mean = sum(ind.fitness_value for ind in pop_list) / len(pop_list) + avg_objectives.append(mean) + generation += 1 + + return best_ever_solution
+ + +
+[docs] +def sync_cga( + n_cols: int, + n_rows: int, + n_gen: int, + ch_size: int, + p_crossover: float, + p_mutation: float, + problem: Callable[[List[float]], float], + selection: SelectionOperator, + recombination: RecombinationOperator, + mutation: MutationOperator, + seed_par: int = None +) -> Result: + """ + Optimize the given problem using a synchronous cellular genetic algorithm (Sync-CGA). + + Parameters + ---------- + n_cols : int + Number of columns in the population grid. + n_rows : int + Number of rows in the population grid. + n_gen : int + Number of generations to evolve. + ch_size : int + Size of the chromosome. + gen_type : str + Type of the genome representation (e.g., 'Binary', 'Permutation', 'Real'). + p_crossover : float + Probability of crossover between parents. + p_mutation : float + Probability of mutation in offspring. + problem : Callable[[List[float]], float] + Function to evaluate the fitness of a solution. Takes a list of floats and returns a float. + selection : SelectionOperator + Function or class used for selecting parents. + recombination : RecombinationOperator + Function or class used for recombination (crossover). + mutation : MutationOperator + Function or class used for mutation. + mins : List[float] + List of minimum values for each gene in the chromosome (for real value optimization). + maxs : List[float] + List of maximum values for each gene in the chromosome (for real value optimization). + seed_par : int + Ensures the random number generation is repeatable. + + Returns + ------- + Result + A Result object containing the best solution found, with its chromosome, fitness value, and generation. + """ + + if seed_par is not None: + np.random.seed(seed_par) + random.seed(seed_par) + + pop_size = n_cols * n_rows + best_solutions = [] + best_objectives = [] + avg_objectives = [] + method_name = OptimizationMethod.SYNCGA + + # Generate Initial Population + pop_list = Population( + method_name, + ch_size, + n_rows, + n_cols, + gen_type = problem.gen_type, + problem = problem, + mins = problem.xl, + maxs = problem.xu).initial_population() + + # Sort population by fitness value + pop_list_ordered = sorted(pop_list, key=lambda x: x.fitness_value) + + # Track the best solution in the initial population + best_solutions.append(pop_list_ordered[0].chromosome) + best_objectives.append(pop_list_ordered[0].fitness_value) + best_ever_solution = Result( + chromosome=pop_list_ordered[0].chromosome, + fitness_value=pop_list_ordered[0].fitness_value, + generation_found=0 + ) + + # Calculate the mean fitness for the initial population + mean = sum(map(lambda x: x.fitness_value, pop_list)) / len(pop_list) + avg_objectives.append(mean) + + # Evolutionary Algorithm Loop + generation = 1 + aux_poplist = [] + + while generation != n_gen + 1: + aux_poplist = pop_list.copy() # Create a copy of the population for synchronous update + + for c in range(pop_size): + offsprings = [] + # Select parents + parents = selection(pop_list, c).get_parents() + rnd = np.random.rand() + + # Apply crossover with probability p_crossover + if rnd < p_crossover: + offsprings = recombination(parents, problem).get_recombinations() + else: + offsprings = parents + + for p in range(len(offsprings)): + mutation_cand = offsprings[p] + rnd = np.random.rand() + + # Apply mutation with probability p_mutation + if rnd < p_mutation: + mutated = mutation(mutation_cand, problem).mutate() + offsprings[p] = mutated + + # Replacement: Replace if offspring is better + if offsprings[p].fitness_value < parents[p].fitness_value: + index = pop_list.index(parents[p]) + aux_poplist[index] = offsprings[p] + + # Update population synchronously + pop_list = aux_poplist + pop_list_ordered = sorted(pop_list, key=lambda x: x.fitness_value) + + # Track best solutions + best_solutions.append(pop_list_ordered[0].chromosome) + best_objectives.append(pop_list_ordered[0].fitness_value) + + # Update best ever solution if the current solution is better + if pop_list_ordered[0].fitness_value < best_ever_solution.fitness_value: + best_ever_solution = Result( + chromosome=pop_list_ordered[0].chromosome, + fitness_value=pop_list_ordered[0].fitness_value, + generation_found=generation + ) + + # Calculate the mean fitness for the current generation + mean = sum(map(lambda x: x.fitness_value, pop_list)) / len(pop_list) + avg_objectives.append(mean) + + generation += 1 + + return best_ever_solution
+ + +
+[docs] +def alpha_cga( + n_cols: int, + n_rows: int, + n_gen: int, + ch_size: int, + p_crossover: float, + p_mutation: float, + problem: AbstractProblem, + selection: SelectionOperator, + recombination: RecombinationOperator, + mutation: MutationOperator, + seed_par: int = None +) -> Result: + """ + Optimize a problem using an evolutionary algorithm with an alpha-male exchange mechanism. + + Parameters + ---------- + n_cols : int + Number of columns in the grid for the population. + n_rows : int + Number of rows in the grid for the population. + n_gen : int + Number of generations to run the optimization. + ch_size : int + Size of the chromosome. + gen_type : GeneType + Type of genome representation (GeneType.BINARY, GeneType.PERMUTATION, or GeneType.REAL). + p_crossover : float + Probability of crossover, should be between 0 and 1. + p_mutation : float + Probability of mutation, should be between 0 and 1. + problem : AbstractProblem + The problem instance used to evaluate fitness. + selection : SelectionOperator + Function used for selection in the evolutionary algorithm. + recombination : RecombinationOperator + Function used for recombination (crossover) in the evolutionary algorithm. + mutation : MutationOperator + Function used for mutation in the evolutionary algorithm. + mins : List[float] + List of minimum values for each gene in the chromosome (for real value optimization). + maxs : List[float] + List of maximum values for each gene in the chromosome (for real value optimization). + seed_par : int + Ensures the random number generation is repeatable. + + Returns + ------- + Result + A Result object containing the best solution found, with its chromosome, fitness value, and generation. + """ + + if seed_par is not None: + np.random.seed(seed_par) + random.seed(seed_par) + + pop_size = n_cols * n_rows + best_solutions = [] + best_objectives = [] + avg_objectives = [] + method_name = OptimizationMethod.ALPHA_CGA + + # Generate Initial Population + pop_list = Population( + method_name, + ch_size, + n_rows, + n_cols, + gen_type = problem.gen_type, + problem = problem, + mins = problem.xl, + maxs = problem.xu).initial_population() + + # Sort population by fitness value + pop_list_ordered = sorted(pop_list, key=lambda x: x.fitness_value) + + # Initialize tracking of best solutions + best_solutions.append(pop_list_ordered[0].chromosome) + best_objectives.append(pop_list_ordered[0].fitness_value) + best_ever_solution = Result( + chromosome=pop_list_ordered[0].chromosome, + fitness_value=pop_list_ordered[0].fitness_value, + generation_found=0 + ) + + # Calculate mean fitness for the initial population + mean = sum(map(lambda x: x.fitness_value, pop_list)) / len(pop_list) + avg_objectives.append(mean) + + # Optimization loop + generation = 1 + + while generation != n_gen + 1: + for c in range(0, pop_size, n_cols): + # Alpha-male exchange mechanism + if generation % 10 == 0: + rnd1 = rd.randrange(1, pop_size + 1, n_cols) + rnd2 = rd.randrange(1, pop_size + 1, n_cols) + while rnd1 == rnd2: + rnd2 = np.random.randint(1, n_cols + 1) + + alpha_male1 = pop_list[rnd1] + alpha_male2 = pop_list[rnd2] + + pop_list[rnd2] = alpha_male1 + pop_list[rnd1] = alpha_male2 + + for n in range(n_cols): + offsprings = [] + parents = [] + + p1 = pop_list[c] + p2 = pop_list[c + n] + parents.append(p1) + parents.append(p2) + + rnd = np.random.rand() + + # Apply crossover with probability p_crossover + if rnd < p_crossover: + offsprings = recombination(parents, problem).get_recombinations() + else: + offsprings = parents + + for p in range(len(offsprings)): + + mutation_cand = offsprings[p] + rnd = np.random.rand() + + # Apply mutation with probability p_mutation + if rnd < p_mutation: + mutated = mutation(mutation_cand, problem).mutate() + offsprings[p] = mutated + + # Replacement: Replace if offspring is better + if offsprings[p].fitness_value < parents[1].fitness_value: + try: + index = pop_list.index(parents[1]) + except ValueError: + continue + new_p = offsprings[p] + pop_list[index] = new_p + + # Sort population and update best solutions + pop_list_ordered = sorted(pop_list, key=lambda x: x.fitness_value) + + best_solutions.append(pop_list_ordered[0].chromosome) + best_objectives.append(pop_list_ordered[0].fitness_value) + + # Update best ever solution if current solution is better + if pop_list_ordered[0].fitness_value < best_ever_solution.fitness_value: + best_ever_solution = Result( + chromosome=pop_list_ordered[0].chromosome, + fitness_value=pop_list_ordered[0].fitness_value, + generation_found=generation + ) + + # Update average objectives + mean = sum(map(lambda x: x.fitness_value, pop_list)) / len(pop_list) + avg_objectives.append(mean) + + generation += 1 + + return best_ever_solution
+ + +
+[docs] +def ccga( + n_cols: int, + n_rows: int, + n_gen: int, + ch_size: int, + problem: AbstractProblem, + selection: SelectionOperator +) -> Result: + """ + Perform optimization using a Cooperative Coevolutionary Genetic Algorithm (CCGA). + + Parameters + ---------- + n_cols : int + Number of columns in the grid for the population. + n_rows : int + Number of rows in the grid for the population. + n_gen : int + Number of generations to run the optimization. + ch_size : int + Size of the chromosome. + gen_type : GeneType + Type of genome representation (GeneType.BINARY, Genetype.PERMUTATION, GeneType.REAL). + problem : AbstractProblem + The problem instance used to evaluate fitness. + selection : SelectionOperator + Function used for selection in the evolutionary algorithm. + mins : List[float] + List of minimum values for each gene in the chromosome (for real value optimization). + maxs : List[float] + List of maximum values for each gene in the chromosome (for real value optimization). + + Returns + ------- + Result + A Result object containing the best solution found during the optimization process, + including its chromosome, fitness value, and generation. + """ + + pop_size = n_cols * n_rows + best_solutions = [] + best_objectives = [] + avg_objectives = [] + vector = [0.5 for _ in range(ch_size)] + method_name = OptimizationMethod.CCGA + + # Generate Initial Population + pop_list = Population( + method_name, + ch_size, + n_rows, + n_cols, + gen_type = problem.gen_type, + problem = problem, + mins = problem.xl, + maxs = problem.xu).initial_population() + + # Sort population by fitness value + pop_list_ordered = sorted(pop_list, key=lambda x: x.fitness_value) + + # Initialize tracking of best solutions + best_solutions.append(pop_list_ordered[0].chromosome) + best_objectives.append(pop_list_ordered[0].fitness_value) + best_ever_solution = Result( + chromosome=pop_list_ordered[0].chromosome, + fitness_value=pop_list_ordered[0].fitness_value, + generation_found=0 + ) + + # Calculate mean fitness for the initial population + mean = sum(map(lambda x: x.fitness_value, pop_list)) / len(pop_list) + avg_objectives.append(mean) + best = pop_list_ordered[0] + + # Evolutionary Algorithm Loop + generation = 1 + while generation != n_gen + 1: + for c in range(pop_size): + # Select parents and determine the winner and loser + parents = selection(pop_list, c).get_parents() + p1, p2 = parents[0], parents[1] + winner, loser = compete(p1, p2) + + if winner.fitness_value > best.fitness_value: + best = winner + + # Update the vector based on the winner and loser + update_vector(vector, winner, loser, pop_size) + + # Re-generate the population based on the updated vector + pop_list = Population( + method_name, + ch_size, + n_rows, + n_cols, + gen_type = problem.gen_type, + problem = problem, + mins = problem.xl, + maxs = problem.xu).initial_population() + + # Update best ever solution if the current best solution is better + if best.fitness_value > best_ever_solution.fitness_value: + best_ever_solution = Result( + chromosome=best.chromosome, + fitness_value=best.fitness_value, + generation_found=generation + ) + + # Update average objectives + mean = sum(map(lambda x: x.fitness_value, pop_list)) / len(pop_list) + avg_objectives.append(mean) + + generation += 1 + + return best_ever_solution
+ + +
+[docs] +def mcccga( + n_cols: int, + n_rows: int, + n_gen: int, + ch_size: int, + problem: AbstractProblem, + selection: SelectionOperator +) -> Result: + """ + Optimize the given problem using a multi-population machine-coded compact genetic algorithm (MCCGA). + + Parameters + ---------- + n_cols : int + Number of columns in the population grid. + n_rows : int + Number of rows in the population grid. + n_gen : int + Number of generations to evolve. + ch_size : int + Size of the chromosome. + problem : AbstractProblem + Problem instance for fitness evaluation. + selection : SelectionOperator + Function or class used for selecting parents. + + Returns + ------- + Result + A Result instance containing the best solution found during optimization, + including its chromosome, fitness value, and generation found. + """ + + pop_size = n_cols * n_rows + best_objectives = [] + avg_objectives = [] + method_name = OptimizationMethod.MCCCGA + + mins = problem.xl + maxs = problem.xu + + # Generate initial probability vector + vector = generate_probability_vector(mins, maxs, pop_size) + + # Generate Initial Population + pop_list = Population( + method_name, + ch_size, + n_rows, + n_cols, + problem.gen_type, + problem, + vector).initial_population() + + + # Sort population by fitness value + pop_list_ordered = sorted(pop_list, key=lambda x: x.fitness_value) + + # Track the best solution in the initial population + best_objectives.append(pop_list_ordered[0].fitness_value) + best_byte_ch = byte_operators.bits_to_floats(pop_list_ordered[0].chromosome) + best_ever_solution = Result( + chromosome=best_byte_ch, + fitness_value=pop_list_ordered[0].fitness_value, + generation_found=1 + ) + + # Calculate the mean fitness for the initial population + mean = sum(map(lambda x: x.fitness_value, pop_list)) / len(pop_list) + avg_objectives.append(mean) + best = pop_list_ordered[0] + + # Evolutionary Algorithm Loop + generation = 1 + while generation != n_gen + 1: + for c in range(pop_size): + + # Select parents from the population + parents = selection(pop_list, c).get_parents() + p1, p2 = parents[0], parents[1] + + # Compete parents and identify the winner and loser + winner, loser = compete(p1, p2) + if winner.fitness_value < best.fitness_value: + best = winner + + # Update the probability vector based on the competition result + update_vector(vector, winner, loser, pop_size) + + # Re-generate the population based on the updated vector + pop_list = Population( + method_name, + ch_size, + n_rows, + n_cols, + problem.gen_type, + problem, + vector).initial_population() + + # Track the best fitness value and update the best solution if necessary + best_objectives.append(best.fitness_value) + best_byte_ch = byte_operators.bits_to_floats(pop_list_ordered[0].chromosome) + + if best.fitness_value < best_ever_solution.fitness_value: + best_ever_solution = Result( + chromosome=best_byte_ch, + fitness_value=best.fitness_value, + generation_found=generation + ) + + # Calculate the mean fitness for the current generation + mean = sum(map(lambda x: x.fitness_value, pop_list)) / len(pop_list) + avg_objectives.append(mean) + best_byte_ch = byte_operators.bits_to_floats(best.chromosome) + + generation += 1 + + # Evaluate the final solution sampled from the probability vector + best_byte_ch = byte_operators.bits_to_floats(sample(vector)) + best_byte_result = problem.f(best_byte_ch) + + # Update the best-ever solution if the sampled solution is better + if best_byte_result <= best_ever_solution.fitness_value: + best_ever_solution = Result( + chromosome=best_byte_ch, + fitness_value=best_byte_result, + generation_found=generation + ) + + return best_ever_solution
+ + +
+[docs] +def compete(p1: Individual, p2: Individual) -> Tuple[Individual, Individual]: + """ + Compete between two individuals to determine the better one. + + Parameters + ---------- + p1 : Individual + First individual. + p2 : Individual + Second individual. + + Returns + ------- + Tuple[Individual, Individual] + The better individual and the loser. + """ + if p1.fitness_value < p2.fitness_value: + return p1, p2 + else: + return p2, p1
+ + + +
+[docs] +def update_vector(vector: List[float], winner: Individual, loser: Individual, pop_size: int): + """ + Update the probability vector based on the winner and loser individuals. + + Parameters + ---------- + vector : List[float] + Probability vector to be updated. + winner : Individual + The winning individual. + loser : Individual + The losing individual. + pop_size : int + Size of the population. + """ + for i in range(len(vector)): + if winner.chromosome[i] != loser.chromosome[i]: + if winner.chromosome[i] == 1: + vector[i] += round((1.0 / float(pop_size)), 3) + else: + vector[i] -= round((1.0 / float(pop_size)), 3)
+ + + +
+[docs] +def random_vector_between(mins: List[float], maxs: List[float]) -> List[float]: + """ + Generate a random vector of floats between the given minimum and maximum values. + + Parameters + ---------- + mins : List[float] + List of minimum values. + maxs : List[float] + List of maximum values. + + Returns + ------- + List[float] + Randomly generated vector. + """ + n = len(mins) + result = [0.0] * n + + for i in range(n): + result[i] = mins[i] + random.random() * (maxs[i] - mins[i]) + + return result
+ + + +
+[docs] +def generate_probability_vector(mins: List[float], maxs: List[float], ntries: int) -> List[float]: + """ + Generate a probability vector based on the given minimum and maximum values. + + Parameters + ---------- + mins : List[float] + List of minimum values. + maxs : List[float] + List of maximum values. + ntries : int + Number of trials for generating the probability vector. + + Returns + ------- + List[float] + Probability vector. + """ + nbits = len(mins) * 32 + mutrate = 1.0 / ntries + probvector = [0.0] * nbits + + for _ in range(ntries): + floats = random_vector_between(mins, maxs) + floatbits = byte_operators.floats_to_bits(floats) + for k in range(nbits): + if floatbits[k] == 1: + probvector[k] = probvector[k] + mutrate + + return probvector
+ + +
+[docs] +def sample(probvector: List[float]) -> List[int]: + """ + Sample a vector based on the provided probability vector. + + Parameters + ---------- + probvector : List[float] + Probability vector for sampling. + + Returns + ------- + List[int] + Sampled binary vector. + """ + n = len(probvector) + newvector = [0] * n + + for i in range(n): + if random.random() < probvector[i]: + newvector[i] = 1 + + return newvector
+ + + + +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/population.html b/_modules/pycellga/population.html new file mode 100644 index 0000000..d22c707 --- /dev/null +++ b/_modules/pycellga/population.html @@ -0,0 +1,431 @@ + + + + + + pycellga.population — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for pycellga.population

+from typing import List
+from individual import *
+from grid import *
+from neighborhoods.linear_9 import Linear9
+from byte_operators import *
+from problems.abstract_problem import AbstractProblem
+from enum import Enum 
+
+
+
+[docs] +class OptimizationMethod(Enum): + """ + OptimizationMethod is an enumeration class that represents the optimization methods used in an evolutionary algorithm. + The five optimization methods are CGA, SYNCGA, ALPHA_CGA, CCGA, and MCCCGA. + "cga", "sync_cga", "alpha_cga", "ccga", "mcccga" + """ + CGA = 1 + SYNCGA = 2 + ALPHA_CGA = 3 + CCGA = 4 + MCCCGA = 5
+ + + +
+[docs] +class Population: + """ + A class to represent a population in an evolutionary algorithm. + + Attributes + ---------- + method_name : OptimizationMethod + The name of the optimization method. Must be one of OptimizationMethod.CGA, OptimizationMethod.SYNCGA, OptimizationMethod.ALPHA_CGA, OptimizationMethod.CCGA, or OptimizationMethod.MCCCGA. + ch_size : int + The size of the chromosome. + n_rows : int + The number of rows in the grid. + n_cols : int + The number of columns in the grid. + gen_type : str + The type of genome representation (GeneType.BINARY, Genetype.PERMUTATION, GeneType.REAL). + problem : AbstractProblem + The problem instance used to evaluate fitness. + vector : list + A list used to generate candidates for the population (relevant for MCCCGA). + """ +
+[docs] + def __init__(self, + method_name: OptimizationMethod = OptimizationMethod.CGA, + ch_size: int = 0, + n_rows: int = 0, + n_cols: int = 0, + gen_type: str = "", + problem: AbstractProblem = None, + vector: list = [], + mins : list[float] = [], + maxs : list[float] = []): + """ + Initialize the Population with the specified parameters. + + Parameters + ---------- + method_name : OptimizationMethod. + The name of the optimization method. Must be one of OptimizationMethod.CGA, OptimizationMethod.SYNCGA, OptimizationMethod.ALPHA_CGA, OptimizationMethod.CCGA, or OptimizationMethod.MCCCGA. + Default is OptimizationMethod.CGA. + ch_size : int, optional + The size of the chromosome (default is 0). + n_rows : int, optional + The number of rows in the grid (default is 0). + n_cols : int, optional + The number of columns in the grid (default is 0). + gen_type : str, optional + The type of genome representation (default is an empty string). + problem : AbstractProblem, optional + The problem instance used to evaluate fitness (default is None). + vector : list, optional + A list used to generate candidates (default is an empty list). + mins: list[float] + The minimum values for each gene in the chromosome (for real value optimization). + maxs: list[float] + The maximum values for each gene in the chromosome (for real value optimization). + """ + self.method_name = method_name + self.ch_size = ch_size + self.n_rows = n_rows + self.n_cols = n_cols + self.gen_type = gen_type + self.problem = problem + self.vector = vector + self.mins = mins + self.maxs = maxs
+ + +
+[docs] + def initial_population(self) -> List[Individual]: + """ + Generate the initial population of individuals. + + Returns + ------- + List[Individual] + A list of initialized `Individual` objects with their respective chromosomes, fitness values, positions, and neighbors. + """ + pop_size = self.n_rows * self.n_cols + pop_list = [] + + grid = Grid(self.n_rows, self.n_cols).make_2d_grid() + + for i in range(pop_size): + ind = Individual(gen_type = self.gen_type, ch_size = self.ch_size, + mins = self.mins, maxs = self.maxs) + + # Initialize chromosome and evaluate fitness for cga, syn_cga and alpha_cga + if self.method_name in [OptimizationMethod.CGA, OptimizationMethod.SYNCGA, OptimizationMethod.ALPHA_CGA, OptimizationMethod.CCGA]: + ind.chromosome = ind.randomize() + ind.fitness_value = self.problem.f(ind.chromosome) + + # Initialize chromosome and evaluate fitness for cga and mcccga + elif self.method_name in [OptimizationMethod.MCCCGA]: + ind.chromosome = ind.generate_candidate(self.vector) + ind_byte_ch = bits_to_floats(ind.chromosome) + ind.fitness_value = self.problem.f(ind_byte_ch) + + ind.position = grid[i] + ind.neighbors_positions = Linear9( + position=ind.position, n_rows=self.n_rows, n_cols=self.n_cols + ).calculate_neighbors_positions() + ind.neighbors = None + pop_list.append(ind) + + return pop_list
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/abstract_problem.html b/_modules/pycellga/problems/abstract_problem.html new file mode 100644 index 0000000..06195d5 --- /dev/null +++ b/_modules/pycellga/problems/abstract_problem.html @@ -0,0 +1,394 @@ + + + + + + pycellga.problems.abstract_problem — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.abstract_problem

+from abc import ABC, abstractmethod
+from typing import List, Any
+from pymoo.core.problem import Problem
+from common import GeneType
+
+
+[docs] +class AbstractProblem(Problem, ABC): + """ + Abstract base class for defining optimization problems compatible with pymoo. + + This class provides a structure for defining optimization problems, where the + user specifies the gene type, the number of variables, and their bounds. It includes + an abstract method `f` for evaluating the fitness of a solution, which must be + implemented by subclasses. + + Attributes + ---------- + gen_type : GeneType + The type of genes used in the problem (e.g., REAL, BINARY). + n_var : int + The number of design variables. + xl : List[float] or numpy.ndarray + The lower bounds for the design variables. + xu : List[float] or numpy.ndarray + The upper bounds for the design variables. + + Methods + ------- + f(x: List[Any]) -> float + Abstract method to compute the fitness value for a given solution. + Must be implemented by subclasses. + evaluate(x, out, *args, **kwargs) + Computes the objective value(s) for pymoo's optimization framework. + """ + +
+[docs] + def __init__(self, gen_type: GeneType, n_var, xl, xu): + """ + Initialize the AbstractProblem with gene type, variable count, and bounds. + + Parameters + ---------- + gen_type : Any + The type of genes used in the problem (e.g., REAL, BINARY). + n_var : int + The number of design variables. + xl : float + The lower bound for the design variables. + xu : float + The upper bound for the design variables. + """ + self.gen_type = gen_type + + super().__init__(n_var=n_var, n_obj=1, n_constr=0, xl=xl, xu=xu)
+ + +
+[docs] + @abstractmethod + def f(self, x: List[Any]) -> float: + """ + Abstract method for evaluating the fitness of a solution. + + This method must be implemented by subclasses to define the objective function + of the optimization problem. + + Parameters + ---------- + x : list + List of design variable values. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + raise NotImplementedError("Subclasses should implement this method.")
+ + +
+[docs] + def evaluate(self, x, out, *args, **kwargs): + """ + Evaluate function for compatibility with pymoo's optimizer. + + This method wraps the `f` method and allows pymoo to handle batch evaluations + by storing the computed fitness values in the output dictionary. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/ackley.html b/_modules/pycellga/problems/single_objective/continuous/ackley.html new file mode 100644 index 0000000..7dd6e08 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/ackley.html @@ -0,0 +1,381 @@ + + + + + + pycellga.problems.single_objective.continuous.ackley — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.ackley

+from numpy import pi, e, cos, sqrt, exp, power
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Ackley(AbstractProblem): + """ + Ackley function implementation for optimization problems. + + The Ackley function is widely used for testing optimization algorithms. + It is characterized by a nearly flat outer region and a large hole at the center. + The function is usually evaluated on the hypercube x_i ∈ [-32.768, 32.768], for all i = 1, 2, ..., d. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bound for each variable (fixed to -32.768). + xu : float + Upper bound for each variable (fixed to 32.768). + + Methods + ------- + __init__(n_var: int) + Initialize the Ackley problem with the specified number of variables. + + f(x: List[float]) -> float + Compute the Ackley function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + +
+[docs] + def __init__(self, n_var): + """ + Initialize the Ackley problem. + + Parameters + ---------- + n_var : int + Number of variables (dimensions) in the problem. + """ + gen_type = GeneType.REAL + xl = -32.768 + xu = 32.768 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Ackley function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + sum1 = sum(power(gene, 2) for gene in x) + sum2 = sum(cos(2 * pi * gene) for gene in x) + + fitness = -20.0 * exp(-0.2 * sqrt(sum1 / self.n_var)) - exp(sum2 / self.n_var) + 20.0 + e + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/bentcigar.html b/_modules/pycellga/problems/single_objective/continuous/bentcigar.html new file mode 100644 index 0000000..ab7927a --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/bentcigar.html @@ -0,0 +1,373 @@ + + + + + + pycellga.problems.single_objective.continuous.bentcigar — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.bentcigar

+from problems.abstract_problem import AbstractProblem
+from mpmath import power as pw
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Bentcigar(AbstractProblem): + """ + Bentcigar function implementation for optimization problems. + + The Bentcigar function is widely used for testing optimization algorithms. + The function is usually evaluated on the hypercube x_i ∈ [-100, 100], for all i = 1, 2, ..., n. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bound for each variable (fixed to -100). + xu : float + Upper bound for each variable (fixed to 100). + + Methods + ------- + f(x: List[float]) -> float + Compute the Bentcigar function value for a single solution. + + Notes + ----- + -100 ≤ xi ≤ 100 for i = 1,…,n + Global minimum at f(0,...,0) = 0 + """ + +
+[docs] + def __init__(self, n_var: int): + """ + Initialize the Bentcigar problem. + + Parameters + ---------- + n_var : int + Number of variables (dimensions) in the problem. + """ + gen_type = GeneType.REAL + xl = -100.0 + xu = 100.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Bentcigar function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + a = pw(x[0], 2) + b = pw(10, 6) + sum_val = sum(pw(xi, 2) for xi in x[1:]) + + fitness = a + (b * sum_val) + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/bohachevsky.html b/_modules/pycellga/problems/single_objective/continuous/bohachevsky.html new file mode 100644 index 0000000..6b9675a --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/bohachevsky.html @@ -0,0 +1,374 @@ + + + + + + pycellga.problems.single_objective.continuous.bohachevsky — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.bohachevsky

+from numpy import cos, pi
+from mpmath import power as pw
+from typing import List
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+[docs] +class Bohachevsky(AbstractProblem): + """ + Bohachevsky function implementation for optimization problems. + + The Bohachevsky function is widely used for testing optimization algorithms. + It is usually evaluated on the hypercube x_i ∈ [-15, 15], for all i = 1, 2, ..., n. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bound for each variable (fixed to -15). + xu : float + Upper bound for each variable (fixed to 15). + + Methods + ------- + f(x: List[float]) -> float + Compute the Bohachevsky function value for a single solution. + + Notes + ----- + -15 ≤ xi ≤ 15 for i = 1,…,n + Global minimum at f(0,...,0) = 0 + """ + +
+[docs] + def __init__(self, n_var: int): + """ + Initialize the Bohachevsky problem. + + Parameters + ---------- + n_var : int + Number of variables (dimensions) in the problem. + """ + gen_type = GeneType.REAL + xl = -15.0 + xu = 15.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Bohachevsky function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + fitness = sum([ + pw(x[i], 2) + (2 * pw(x[i + 1], 2)) + - (0.3 * cos(3 * pi * x[i])) + - (0.4 * cos(4 * pi * x[i + 1])) + 0.7 + for i in range(len(x) - 1) + ]) + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/chichinadze.html b/_modules/pycellga/problems/single_objective/continuous/chichinadze.html new file mode 100644 index 0000000..90913bd --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/chichinadze.html @@ -0,0 +1,371 @@ + + + + + + pycellga.problems.single_objective.continuous.chichinadze — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.chichinadze

+import numpy as np
+from typing import List
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+
+[docs] +class Chichinadze(AbstractProblem): + """ + Chichinadze function implementation for optimization problems. + + The Chichinadze function is widely used for testing optimization algorithms. + It is usually evaluated on the hypercube x, y ∈ [-30, 30]. + + Attributes + ---------- + n_var : int + Number of variables (fixed to 2 for x and y). + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bound for the variables (fixed to -30). + xu : float + Upper bound for the variables (fixed to 30). + + Methods + ------- + f(x: List[float]) -> float + Compute the Chichinadze function value for a single solution. + + Notes + ----- + -30 ≤ x, y ≤ 30 + Global minimum at f(5.90133, 0.5) = −43.3159 + """ + +
+[docs] + def __init__(self): + """ + Initialize the Chichinadze problem. + """ + gen_type = GeneType.REAL + n_var = 2 # Fixed to 2 for x and y + xl = -30.0 + xu = 30.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Chichinadze function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + x_val, y_val = x[0], x[1] + term1 = x_val**2 - 12 * x_val + 11 + term2 = 10 * np.cos(np.pi * x_val / 2) + term3 = 8 * np.sin(5 * np.pi * x_val) + term4 = (1.0 / np.sqrt(5)) * np.exp(-((y_val - 0.5)**2) / 2) + fitness = term1 + term2 + term3 - term4 + + return round(fitness, 4)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/dropwave.html b/_modules/pycellga/problems/single_objective/continuous/dropwave.html new file mode 100644 index 0000000..64db31a --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/dropwave.html @@ -0,0 +1,371 @@ + + + + + + pycellga.problems.single_objective.continuous.dropwave — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.dropwave

+from problems.abstract_problem import AbstractProblem
+from numpy import power, cos, sqrt
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Dropwave(AbstractProblem): + """ + Dropwave function for optimization problems. + + The Dropwave function is a multimodal function commonly used as a performance test problem for optimization algorithms. + It is defined within the bounds -5.12 ≤ xi ≤ 5.12 for i = 1, 2, and has a global minimum at f(0, 0) = -1. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem (fixed to 2). + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bound for the variables (fixed to -5.12). + xu : float + Upper bound for the variables (fixed to 5.12). + + Methods + ------- + f(x: List[float]) -> float + Compute the Dropwave function value for a single solution. + + Notes + ----- + -5.12 ≤ xi ≤ 5.12 for i = 1, 2 + Global minimum at f(0, 0) = -1 + """ + +
+[docs] + def __init__(self): + """ + Initialize the Dropwave problem. + """ + gen_type = GeneType.REAL + n_var = 2 # Fixed to 2 for x1 and x2 + xl = -5.12 + xu = 5.12 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Dropwave function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + x1, x2 = x + sqrts_sums = power(x1, 2) + power(x2, 2) + denominator = 0.5 * sqrts_sums + 2 + fitness = -(1 + cos(12 * sqrt(sqrts_sums))) / denominator + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/fms.html b/_modules/pycellga/problems/single_objective/continuous/fms.html new file mode 100644 index 0000000..7d82df1 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/fms.html @@ -0,0 +1,375 @@ + + + + + + pycellga.problems.single_objective.continuous.fms — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.fms

+from problems.abstract_problem import AbstractProblem
+from numpy import pi, sin
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Fms(AbstractProblem): + """ + Fms function implementation for optimization problems. + + The Fms function is used for testing optimization algorithms, specifically those dealing with frequency modulation sound. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem (fixed to 6). + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bound for the variables (fixed to -6.4). + xu : float + Upper bound for the variables (fixed to 6.35). + + Methods + ------- + f(x: List[float]) -> float + Compute the Fms function value for a single solution. + """ + +
+[docs] + def __init__(self): + """ + Initialize the Fms problem. + """ + gen_type = GeneType.REAL + n_var = 6 # Fixed to 6 for [a1, w1, a2, w2, a3, w3] + xl = -6.4 + xu = 6.35 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Fms function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + theta = (2.0 * pi) / 100.0 + a1, w1, a2, w2, a3, w3 = x + + def yzero(t): + return sin((5.0 * theta * t) - (1.5 * sin((4.8 * theta * t) + (2.0 * sin(4.9 * theta * t))))) + + partial_fitness = 0.0 + for k in range(101): + distance = ( + a1 * sin((w1 * theta * k) - (a2 * sin((w2 * theta * k) + (a3 * sin(w3 * theta * k))))) + - yzero(k) + ) + partial_fitness += distance ** 2 + + return round(partial_fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/griewank.html b/_modules/pycellga/problems/single_objective/continuous/griewank.html new file mode 100644 index 0000000..f578450 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/griewank.html @@ -0,0 +1,371 @@ + + + + + + pycellga.problems.single_objective.continuous.griewank — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.griewank

+from problems.abstract_problem import AbstractProblem
+import math
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Griewank(AbstractProblem): + """ + Griewank function implementation for optimization problems. + + The Griewank function is widely used for testing optimization algorithms. + It is usually evaluated on the hypercube xi ∈ [-600, 600], for all i = 1, 2, ..., n. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bound for the variables (fixed to -600). + xu : float + Upper bound for the variables (fixed to 600). + + Methods + ------- + f(x: List[float]) -> float + Compute the Griewank function value for a single solution. + + Notes + ----- + -600 ≤ xi ≤ 600 for i = 1,…,n + Global minimum at f(0,...,0) = 0 + """ + +
+[docs] + def __init__(self, n_var: int = 10): + """ + Initialize the Griewank problem. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) in the problem, by default 10. + """ + gen_type = GeneType.REAL + xl = -600.0 + xu = 600.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Griewank function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + sum_sq = sum(xi ** 2 for xi in x) + prod_cos = math.prod(math.cos(xi / math.sqrt(i + 1)) for i, xi in enumerate(x)) + fitness = 1 + sum_sq / 4000 - prod_cos + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/holzman.html b/_modules/pycellga/problems/single_objective/continuous/holzman.html new file mode 100644 index 0000000..0ae4ad2 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/holzman.html @@ -0,0 +1,369 @@ + + + + + + pycellga.problems.single_objective.continuous.holzman — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.holzman

+from problems.abstract_problem import AbstractProblem
+from mpmath import power as pw
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Holzman(AbstractProblem): + """ + Holzman function implementation for optimization problems. + + The Holzman function is widely used for testing optimization algorithms. + It is usually evaluated on the hypercube xi ∈ [-10, 10], for all i = 1, 2, ..., n. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bound for the variables (fixed to -10). + xu : float + Upper bound for the variables (fixed to 10). + + Methods + ------- + f(x: List[float]) -> float + Compute the Holzman function value for a single solution. + + Notes + ----- + -10 ≤ xi ≤ 10 for i = 1,…,n + Global minimum at f(0,...,0) = 0 + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Holzman problem. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) in the problem, by default 2. + """ + gen_type = GeneType.REAL + xl = -10.0 + xu = 10.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Holzman function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + fitness = sum((i + 1) * pw(x[i], 4) for i in range(len(x))) + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/levy.html b/_modules/pycellga/problems/single_objective/continuous/levy.html new file mode 100644 index 0000000..4af469f --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/levy.html @@ -0,0 +1,392 @@ + + + + + + pycellga.problems.single_objective.continuous.levy — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.levy

+from problems.abstract_problem import AbstractProblem
+import math
+from mpmath import power as pw
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Levy(AbstractProblem): + """ + Levy function implementation for optimization problems. + + The Levy function is widely used for testing optimization algorithms. + It evaluates inputs over the hypercube x_i ∈ [-10, 10]. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (REAL). + xl : float + Lower bounds for the variables, fixed to -10. + xu : float + Upper bounds for the variables, fixed to 10. + + Methods + ------- + f(x: List[float]) -> float + Compute the Levy function value for a given solution. + evaluate(x: List[float], out: dict, *args, **kwargs) -> None + Pymoo-compatible evaluation method for batch processing. + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Levy problem. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) for the problem, by default 2. + """ + gen_type = GeneType.REAL + xl = -10.0 + xu = 10.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Levy function value for a given solution. + + Parameters + ---------- + x : list + A list of float variables. + + Returns + ------- + float + The Levy function value. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + fitness = 0.0 + for i in range(self.n_var - 1): + term1 = pw(math.sin(3 * x[i] * math.pi), 2) + term2 = (pw((x[i] - 1), 2)) * (1 + pw(math.sin(3 * x[i + 1] * math.pi), 2)) + term3 = (pw((x[i + 1] - 1), 2)) * (1 + pw(math.sin(2 * x[i + 1] * math.pi), 2)) + fitness += term1 + term2 + term3 + + return round(fitness, 3)
+ + +
+[docs] + def evaluate(self, x: List[float], out: dict, *args, **kwargs) -> None: + """ + Evaluate method for compatibility with pymoo's framework. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/matyas.html b/_modules/pycellga/problems/single_objective/continuous/matyas.html new file mode 100644 index 0000000..0928fd6 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/matyas.html @@ -0,0 +1,368 @@ + + + + + + pycellga.problems.single_objective.continuous.matyas — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.matyas

+from problems.abstract_problem import AbstractProblem
+from mpmath import power as pw
+from common import GeneType
+
+
+[docs] +class Matyas(AbstractProblem): + """ + Matyas function implementation for optimization problems. + + The Matyas function is commonly used to evaluate the performance of optimization algorithms. + It is a simple, continuous, convex function that has a global minimum at the origin. + + Attributes + ---------- + gen_type : GeneType + The type of genes used in the problem (fixed to REAL). + n_var : int + Number of variables (dimensions) in the problem (fixed to 2). + xl : float + Lower bound for the variables (fixed to -10). + xu : float + Upper bound for the variables (fixed to 10). + + Methods + ------- + f(x: list) -> float + Computes the Matyas function value for a given solution. + """ + +
+[docs] + def __init__(self): + """ + Initialize the Matyas problem. + + This problem is defined for exactly 2 variables with bounds [-10, 10]. + + Parameters + ---------- + None + """ + gen_type = GeneType.REAL + n_var = 2 + xl = -10.0 + xu = 10.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x): + """ + Compute the Matyas function value for a given solution. + + Parameters + ---------- + x : list of float + A list of float variables representing a point in the solution space. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) != 2: + raise ValueError("Matyas function is defined for exactly 2 variables.") + + x1, x2 = x + fitness = 0.26 * (pw(x1, 2) + pw(x2, 2)) - 0.48 * x1 * x2 + return round(fitness, 2)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/pow.html b/_modules/pycellga/problems/single_objective/continuous/pow.html new file mode 100644 index 0000000..d939868 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/pow.html @@ -0,0 +1,372 @@ + + + + + + pycellga.problems.single_objective.continuous.pow — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.pow

+from problems.abstract_problem import AbstractProblem
+from mpmath import power as pw
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Pow(AbstractProblem): + """ + Pow function implementation for optimization problems. + + The Pow function is typically used for testing optimization algorithms. + It is evaluated on the hypercube x_i ∈ [-5.0, 15.0] with the goal of reaching + the global minimum at f(5, 7, 9, 3, 2) = 0. + + Attributes + ---------- + gen_type : GeneType + The type of genes used in the problem (REAL). + n_var : int + The number of design variables. + xl : float + The lower bound for the variables (-5.0). + xu : float + The upper bound for the variables (15.0). + + Methods + ------- + f(x: List[float]) -> float + Compute the Pow function value for a given solution. + """ + +
+[docs] + def __init__(self, n_var: int = 5): + """ + Initialize the Pow problem. + + Parameters + ---------- + n_var : int, optional + The number of variables (dimensions) in the problem, by default 5. + """ + gen_type = GeneType.REAL + xl = -5.0 + xu = 15.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Pow function value for a given solution. + + Parameters + ---------- + x : list of float + A list of float variables representing a point in the solution space. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + # Define the target values + target = [5, 7, 9, 3, 2] + + # Compute the fitness as the sum of squared differences + fitness = sum(pw(xi - ti, 2) for xi, ti in zip(x, target)) + return round(fitness, 2)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/powell.html b/_modules/pycellga/problems/single_objective/continuous/powell.html new file mode 100644 index 0000000..fdf1da4 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/powell.html @@ -0,0 +1,375 @@ + + + + + + pycellga.problems.single_objective.continuous.powell — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.powell

+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+from mpmath import power as pw
+from typing import List
+
+
+[docs] +class Powell(AbstractProblem): + """ + Powell function implementation for optimization problems. + + The Powell function is widely used for testing optimization algorithms. + It is typically evaluated on the hypercube x_i ∈ [-4, 5], for all i = 1, 2, ..., n. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (REAL for this implementation). + xl : float + Lower bound for the variables (fixed to -4). + xu : float + Upper bound for the variables (fixed to 5). + + Methods + ------- + f(x: List[float]) -> float + Compute the Powell function value for a given solution. + """ + +
+[docs] + def __init__(self, n_var: int = 4): + """ + Initialize the Powell problem. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) in the problem, by default 4. + """ + gen_type = GeneType.REAL + xl = -4.0 + xu = 5.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Powell function value for a given solution. + + Parameters + ---------- + x : list of float + A list of float variables representing a point in the solution space. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) % 4 != 0: + raise ValueError("Powell function requires the number of variables to be a multiple of 4.") + + fitness = 0.0 + d = len(x) // 4 + + for i in range(d): + a = pw(x[4 * i] + 10 * x[4 * i + 1], 2) + b = pw(x[4 * i + 2] - x[4 * i + 3], 2) + c = pw(x[4 * i + 1] - 2 * x[4 * i + 2], 4) + e = pw(x[4 * i] - x[4 * i + 3], 4) + fitness += a + 5 * b + c + 10 * e + + return round(fitness, 1)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/rastrigin.html b/_modules/pycellga/problems/single_objective/continuous/rastrigin.html new file mode 100644 index 0000000..064067c --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/rastrigin.html @@ -0,0 +1,367 @@ + + + + + + pycellga.problems.single_objective.continuous.rastrigin — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.rastrigin

+from numpy import cos, pi
+from typing import List
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+[docs] +class Rastrigin(AbstractProblem): + """ + Rastrigin function implementation for optimization problems. + + The Rastrigin function is widely used for testing optimization algorithms. + It is typically evaluated on the hypercube x_i ∈ [-5.12, 5.12], for all i = 1, 2, ..., n. + + Attributes + ---------- + gen_type : GeneType + The type of genes used in the problem, set to REAL. + n_var : int + The number of variables (dimensions) in the problem. + xl : float + The lower bound for each variable, set to -5.12. + xu : float + The upper bound for each variable, set to 5.12. + + Methods + ------- + f(x: List[float]) -> float + Computes the Rastrigin function value for a given solution. + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Rastrigin problem with the specified number of variables. + + Parameters + ---------- + n_var : int, optional + The number of design variables (dimensions), by default 2. + """ + gen_type = GeneType.REAL + xl = -5.12 + xu = 5.12 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Calculate the Rastrigin function value for a given list of variables. + + Parameters + ---------- + x : list + A list of float variables. + + Returns + ------- + float + The computed Rastrigin function value. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + A = 10.0 + fitness = (A * self.n_var) + sum([(xi ** 2) - (A * cos(2 * pi * xi)) for xi in x]) + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/rosenbrock.html b/_modules/pycellga/problems/single_objective/continuous/rosenbrock.html new file mode 100644 index 0000000..53948b5 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/rosenbrock.html @@ -0,0 +1,367 @@ + + + + + + pycellga.problems.single_objective.continuous.rosenbrock — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.rosenbrock

+from problems.abstract_problem import AbstractProblem
+from mpmath import power as pw
+from common import GeneType
+from typing import List
+
+
+
+[docs] +class Rosenbrock(AbstractProblem): + """ + Rosenbrock function implementation for optimization problems. + + The Rosenbrock function is widely used for testing optimization algorithms. + The function is usually evaluated on the hypercube x_i ∈ [-5, 10], for all i = 1, 2, ..., n. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bounds for the variables (fixed to -5). + xu : float + Upper bounds for the variables (fixed to 10). + + Methods + ------- + f(x: List[float]) -> float + Compute the Rosenbrock function value for a single solution. + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Rosenbrock problem. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) in the problem, by default 2. + """ + gen_type = GeneType.REAL + xl = -5.0 + xu = 10.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Rosenbrock function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + fitness = sum([(100 * pw((x[i + 1] - pw(x[i], 2)), 2)) + pw((1 - x[i]), 2) for i in range(self.n_var - 1)]) + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/rothellipsoid.html b/_modules/pycellga/problems/single_objective/continuous/rothellipsoid.html new file mode 100644 index 0000000..2f363bf --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/rothellipsoid.html @@ -0,0 +1,384 @@ + + + + + + pycellga.problems.single_objective.continuous.rothellipsoid — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.rothellipsoid

+from problems.abstract_problem import AbstractProblem
+from mpmath import power as pw
+from common import GeneType
+
+
+[docs] +class Rothellipsoid(AbstractProblem): + """ + Rotated Hyper-Ellipsoid function implementation for optimization problems. + + This function is widely used for testing optimization algorithms. + It is usually evaluated on the hypercube x_i ∈ [-100, 100], for all i = 1, 2, ..., n. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) for the problem. + gen_type : GeneType + The type of genes used in the problem, set to REAL. + xl : float + Lower bound for the variables, set to -100. + xu : float + Upper bound for the variables, set to 100. + + Methods + ------- + f(x: list) -> float + Compute the Rotated Hyper-Ellipsoid function value for a given list of variables. + evaluate(x, out, *args, **kwargs) + Computes the fitness value for pymoo compatibility. + """ + +
+[docs] + def __init__(self, n_var: int = 3): + """ + Initialize the Rothellipsoid problem. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) for the problem, by default 3. + """ + gen_type = GeneType.REAL + xl = -100.0 + xu = 100.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x): + """ + Compute the Rotated Hyper-Ellipsoid function value for a given solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + fitness = sum((i + 1) * pw(x[i], 2) for i in range(len(x))) + return round(fitness, 3)
+ + +
+[docs] + def evaluate(self, x, out, *args, **kwargs): + """ + Evaluate the function for pymoo compatibility. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the computed fitness value. + + Notes + ----- + Stores the computed fitness value in `out["F"]`. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/schaffer.html b/_modules/pycellga/problems/single_objective/continuous/schaffer.html new file mode 100644 index 0000000..0ee1703 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/schaffer.html @@ -0,0 +1,370 @@ + + + + + + pycellga.problems.single_objective.continuous.schaffer — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.schaffer

+import numpy as np
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+[docs] +class Schaffer(AbstractProblem): + """ + Modified Schaffer function #1 for optimization problems. + + This class implements the Schaffer's function, a common benchmark problem for optimization algorithms. + The function is defined over a multidimensional input and is used to test the performance of optimization methods. + + Attributes + ---------- + gen_type : GeneType + The type of gene, set to REAL. + n_var : int + The number of design variables. + xl : float + The lower bound for the design variables, set to -100. + xu : float + The upper bound for the design variables, set to 100. + + Methods + ------- + f(x: list) -> float + Computes the Schaffer's function value for a given list of variables. + evaluate(x, out, *args, **kwargs) + Wrapper for pymoo compatibility to calculate the fitness value. + """ + +
+[docs] + def __init__(self, n_var=2): + """ + Initialize the Schaffer's problem. + + Parameters + ---------- + n_var : int, optional + The number of design variables, by default 2. + """ + gen_type = GeneType.REAL + xl = -100.0 + xu = 100.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x): + """ + Compute the Schaffer's function value for a given solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The calculated fitness value. + """ + fitness = 0.0 + for i in range(len(x) - 1): + xi = x[i] + xi1 = x[i + 1] + term1 = np.sin(xi**2 + xi1**2)**2 + term2 = 1 + 0.001 * (xi**2 + xi1**2) + fitness += 0.5 + (term1 - 0.5)**2 / term2**2 + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/schaffer2.html b/_modules/pycellga/problems/single_objective/continuous/schaffer2.html new file mode 100644 index 0000000..f18eb91 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/schaffer2.html @@ -0,0 +1,369 @@ + + + + + + pycellga.problems.single_objective.continuous.schaffer2 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.schaffer2

+import numpy as np
+from numpy import power as pw
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+[docs] +class Schaffer2(AbstractProblem): + """ + Modified Schaffer function #2 implementation for optimization problems. + + The Modified Schaffer function #2 is widely used for testing optimization algorithms. + The function is evaluated on the hypercube x_i ∈ [-100, 100], for all i = 1, 2, ..., n. + + Attributes + ---------- + n_var : int + The number of variables (dimensions) for the problem. + gen_type : GeneType + Type of genes used in the problem, fixed to REAL. + xl : float + Lower bounds for the variables, fixed to -100. + xu : float + Upper bounds for the variables, fixed to 100. + + Methods + ------- + f(x: list) -> float + Compute the Modified Schaffer function #2 value for a single solution. + evaluate(x, out, *args, **kwargs) + Compute the fitness value(s) for pymoo's optimization framework. + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Modified Schaffer function #2. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) for the problem, by default 2. + """ + gen_type = GeneType.REAL + xl = -100.0 + xu = 100.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: list) -> float: + """ + Compute the Modified Schaffer function #2 value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + fitness = 0.0 + for i in range(len(x) - 1): + term1 = np.sin(pw(x[i], 2) - pw(x[i + 1], 2)) ** 2 + term2 = (1 + 0.001 * (pw(x[i], 2) + pw(x[i + 1], 2))) ** 2 + fitness += 0.5 + ((term1 - 0.5) / term2) + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/schwefel.html b/_modules/pycellga/problems/single_objective/continuous/schwefel.html new file mode 100644 index 0000000..3464b3f --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/schwefel.html @@ -0,0 +1,369 @@ + + + + + + pycellga.problems.single_objective.continuous.schwefel — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.schwefel

+from numpy import sin, sqrt, abs
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+[docs] +class Schwefel(AbstractProblem): + """ + Schwefel function implementation for optimization problems. + + The Schwefel function is commonly used for testing optimization algorithms. + It is evaluated on the range [-500, 500] for each variable and has a global minimum + at f(420.9687,...,420.9687) = 0. + + Attributes + ---------- + n_var : int + The number of variables (dimensions) for the problem. + gen_type : GeneType + The type of genes used in the problem, fixed to REAL. + xl : float + The lower bounds for the variables, fixed to -500. + xu : float + The upper bounds for the variables, fixed to 500. + + Methods + ------- + f(x: list) -> float + Compute the Schwefel function value for a single solution. + + Notes + ----- + -500 ≤ xi ≤ 500 for i = 1,…,n + Global minimum at f(420.9687,...,420.9687) = 0 + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Schwefel function with the specified number of variables. + + Parameters + ---------- + n_var : int, optional + The number of variables (dimensions) for the problem, by default 2. + """ + gen_type = GeneType.REAL + xl = -500.0 + xu = 500.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: list) -> float: + """ + Compute the Schwefel function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + d = len(x) + fitness = sum(xi * sin(sqrt(abs(xi))) for xi in x) + return round((418.9829 * d) - fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/sphere.html b/_modules/pycellga/problems/single_objective/continuous/sphere.html new file mode 100644 index 0000000..74b6581 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/sphere.html @@ -0,0 +1,369 @@ + + + + + + pycellga.problems.single_objective.continuous.sphere — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.sphere

+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+[docs] +class Sphere(AbstractProblem): + """ + Sphere function implementation for optimization problems. + + The Sphere function is a simple and commonly used benchmark for optimization algorithms. + It is defined on a hypercube where each variable typically lies within [-5.12, 5.12]. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bounds for the variables (fixed to -5.12). + xu : float + Upper bounds for the variables (fixed to 5.12). + + Methods + ------- + f(x: list) -> float + Compute the Sphere function value for a single solution. + + Notes + ----- + -5.12 ≤ xi ≤ 5.12 for i = 1,…,n + Global minimum at f(0,...,0) = 0 + """ + +
+[docs] + def __init__(self, n_var: int = 10): + """ + Initialize the Sphere function with the specified number of variables. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) in the problem, by default 10. + """ + gen_type = GeneType.REAL + xl = -5.12 + xu = 5.12 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: list) -> float: + """ + Compute the Sphere function value for a single solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + fitness = sum(xi**2 for xi in x) + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/styblinskitang.html b/_modules/pycellga/problems/single_objective/continuous/styblinskitang.html new file mode 100644 index 0000000..4e64c46 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/styblinskitang.html @@ -0,0 +1,388 @@ + + + + + + pycellga.problems.single_objective.continuous.styblinskitang — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.styblinskitang

+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+[docs] +class StyblinskiTang(AbstractProblem): + """ + Styblinski-Tang function implementation for optimization problems. + + The Styblinski-Tang function is commonly used to test optimization algorithms. + It is defined over the range [-5, 5] for each variable and has a global minimum. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bounds for the variables (fixed to -5). + xu : float + Upper bounds for the variables (fixed to 5). + + Methods + ------- + f(x: list) -> float + Compute the Styblinski-Tang function value for a given solution. + + Notes + ----- + -5 ≤ xi ≤ 5 for i = 1,…,n + Global minimum at f(-2.903534, ..., -2.903534) ≈ -39.16599 * n_var + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Styblinski-Tang function with the specified number of variables. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) in the problem, by default 2. + """ + gen_type = GeneType.REAL + xl = -5.0 + xu = 5.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: list) -> float: + """ + Compute the Styblinski-Tang function value for a given solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + fitness = sum(xi**4 - 16 * xi**2 + 5 * xi for xi in x) / self.n_var + return round(fitness, 3)
+ + +
+[docs] + def evaluate(self, x, out, *args, **kwargs): + """ + Evaluate function for compatibility with pymoo's optimizer. + + This method wraps the `f` method and allows pymoo to handle batch evaluations + by storing the computed fitness values in the output dictionary. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/sumofdifferentpowers.html b/_modules/pycellga/problems/single_objective/continuous/sumofdifferentpowers.html new file mode 100644 index 0000000..c74d868 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/sumofdifferentpowers.html @@ -0,0 +1,386 @@ + + + + + + pycellga.problems.single_objective.continuous.sumofdifferentpowers — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.sumofdifferentpowers

+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+import numpy as np
+from mpmath import power as pw
+
+[docs] +class Sumofdifferentpowers(AbstractProblem): + """ + Sum of Different Powers function implementation for optimization problems. + + The Sum of Different Powers function is commonly used to test optimization algorithms. + It is defined over the range [-1, 1] for each variable, with a global minimum of 0 at the origin. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (fixed to REAL). + xl : float + Lower bounds for the variables (fixed to -1). + xu : float + Upper bounds for the variables (fixed to 1). + + Methods + ------- + f(x: list) -> float + Compute the Sum of Different Powers function value for a given solution. + + Notes + ----- + -1 ≤ xi ≤ 1 for all i. + Global minimum at f(0,...,0) = 0. + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Sum of Different Powers problem. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) in the problem, by default 2. + """ + gen_type = GeneType.REAL + xl = -1.0 + xu = 1.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: list) -> float: + """ + Compute the Sum of Different Powers function value for a given solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + fitness = sum(pw(np.abs(xi), i + 1) for i, xi in enumerate(x)) + return round(fitness, 3)
+ + +
+[docs] + def evaluate(self, x, out, *args, **kwargs): + """ + Evaluate function for compatibility with pymoo's optimizer. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/threehumps.html b/_modules/pycellga/problems/single_objective/continuous/threehumps.html new file mode 100644 index 0000000..0c6b069 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/threehumps.html @@ -0,0 +1,379 @@ + + + + + + pycellga.problems.single_objective.continuous.threehumps — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.threehumps

+from mpmath import power as pw
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+
+[docs] +class Threehumps(AbstractProblem): + """ + Three Hump Camel function implementation for optimization problems. + + The Three Hump Camel function is commonly used for testing optimization algorithms. + It is defined for two variables within the bounds [-5, 5]. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) for the problem, fixed to 2. + gen_type : GeneType + Type of genes used in the problem (REAL). + xl : float + Lower bounds for the variables, fixed to -5. + xu : float + Upper bounds for the variables, fixed to 5. + + Methods + ------- + f(x: list) -> float + Compute the Three Hump Camel function value for a given solution. + """ + +
+[docs] + def __init__(self): + """ + Initialize the Three Hump Camel problem. + """ + gen_type = GeneType.REAL + n_var = 2 + xl = -5.0 + xu = 5.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: list) -> float: + """ + Compute the Three Hump Camel function value for a given solution. + + Parameters + ---------- + x : list or numpy.ndarray + Array of input variables. + + Returns + ------- + float + The computed fitness value for the given solution. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + x1, x2 = x + fitness = 2 * pw(x1, 2) - 1.05 * pw(x1, 4) + (pw(x1, 6) / 6) + x1 * x2 + pw(x2, 2) + return round(fitness, 6)
+ + +
+[docs] + def evaluate(self, x, out, *args, **kwargs): + """ + Evaluate method for compatibility with pymoo's framework. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/zakharov.html b/_modules/pycellga/problems/single_objective/continuous/zakharov.html new file mode 100644 index 0000000..c9947a0 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/zakharov.html @@ -0,0 +1,388 @@ + + + + + + pycellga.problems.single_objective.continuous.zakharov — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.zakharov

+from mpmath import power as pw
+from typing import List
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+
+[docs] +class Zakharov(AbstractProblem): + """ + Zakharov function implementation for optimization problems. + + The Zakharov function is widely used for testing optimization algorithms. + It is evaluated on the hypercube x_i ∈ [-5, 10] for all variables. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (REAL). + xl : float + Lower bounds for the variables, fixed to -5. + xu : float + Upper bounds for the variables, fixed to 10. + + Methods + ------- + f(x: list) -> float + Compute the Zakharov function value for a given solution. + evaluate(x: list, out: dict, *args, **kwargs) -> None + Pymoo-compatible evaluation method for batch processing. + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Zakharov problem. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) for the problem, by default 2. + """ + gen_type = GeneType.REAL + xl = -5.0 + xu = 10.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Zakharov function value for a given solution. + + Parameters + ---------- + x : list + A list of float variables. + + Returns + ------- + float + The Zakharov function value. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + fitness1 = sum(pw(xi, 2) for xi in x) + fitness2 = pw(sum(0.5 * (i + 1) * xi for i, xi in enumerate(x)), 2) + fitness3 = pw(sum(0.5 * (i + 1) * xi for i, xi in enumerate(x)), 4) + fitness = fitness1 + fitness2 + fitness3 + return round(fitness, 3)
+ + +
+[docs] + def evaluate(self, x: List[float], out: dict, *args, **kwargs) -> None: + """ + Evaluate method for compatibility with pymoo's framework. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/continuous/zettle.html b/_modules/pycellga/problems/single_objective/continuous/zettle.html new file mode 100644 index 0000000..4a3544a --- /dev/null +++ b/_modules/pycellga/problems/single_objective/continuous/zettle.html @@ -0,0 +1,388 @@ + + + + + + pycellga.problems.single_objective.continuous.zettle — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.continuous.zettle

+from mpmath import power as pw
+from typing import List
+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+
+[docs] +class Zettle(AbstractProblem): + """ + Zettle function implementation for optimization problems. + + The Zettle function is widely used for testing optimization algorithms. + It is typically evaluated on the hypercube x_i ∈ [-5, 5]. + + Attributes + ---------- + n_var : int + Number of variables (dimensions) in the problem. + gen_type : GeneType + Type of genes used in the problem (REAL). + xl : float + Lower bounds for the variables, fixed to -5. + xu : float + Upper bounds for the variables, fixed to 5. + + Methods + ------- + f(x: list) -> float + Compute the Zettle function value for a given solution. + evaluate(x: list, out: dict, *args, **kwargs) -> None + Pymoo-compatible evaluation method for batch processing. + """ + +
+[docs] + def __init__(self, n_var: int = 2): + """ + Initialize the Zettle problem. + + Parameters + ---------- + n_var : int, optional + Number of variables (dimensions) for the problem, by default 2. + """ + gen_type = GeneType.REAL + xl = -5.0 + xu = 5.0 + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[float]) -> float: + """ + Compute the Zettle function value for a given solution. + + Parameters + ---------- + x : list + A list of float variables. + + Returns + ------- + float + The Zettle function value, rounded to six decimal places. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + fitness = 0.0 + for i in range(len(x) - 1): + fitness += pw((pw(x[i], 2) + pw(x[i + 1], 2)) - 2 * x[i], 2) + 0.25 * x[i] + + return round(fitness, 6)
+ + +
+[docs] + def evaluate(self, x: List[float], out: dict, *args, **kwargs) -> None: + """ + Evaluate method for compatibility with pymoo's framework. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/binary/count_sat.html b/_modules/pycellga/problems/single_objective/discrete/binary/count_sat.html new file mode 100644 index 0000000..49d84e1 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/binary/count_sat.html @@ -0,0 +1,394 @@ + + + + + + pycellga.problems.single_objective.discrete.binary.count_sat — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.binary.count_sat

+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+from typing import List
+
+
+[docs] +class CountSat(AbstractProblem): + """ + CountSat function implementation for optimization problems. + + The CountSat function is used for testing optimization algorithms, particularly those involving satisfiability problems. + + Attributes + ---------- + n_var : int + The number of variables (chromosome length) for the problem. + gen_type : GeneType + The type of genes used in the problem, set to BINARY. + xl : int + Lower bounds for binary variables, fixed to 0. + xu : int + Upper bounds for binary variables, fixed to 1. + + Methods + ------- + f(x: List[int]) -> float + Calculates the CountSat function value for a given list of binary variables. + evaluate(x: List[int], out: dict, *args, **kwargs) -> None + Pymoo-compatible evaluation method for batch processing. + """ + +
+[docs] + def __init__(self, n_var: int = 20): + """ + Initialize the CountSat problem. + + Parameters + ---------- + n_var : int, optional + Number of binary variables (chromosome length) for the problem, by default 20. + """ + gen_type = GeneType.BINARY + xl = 0 # Lower bound for binary variables + xu = 1 # Upper bound for binary variables + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[int]) -> float: + """ + Calculate the CountSat function value for a given list of binary variables. + + Parameters + ---------- + x : list + A list of binary variables. + + Returns + ------- + float + The normalized CountSat function value. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + total_ones = sum(1 for i in x if i == 1) + variables = len(x) + + # Calculate the fitness based on the CountSat formula + fitness = ( + total_ones + + (variables * (variables - 1) * (variables - 2)) + - ((variables - 2) * total_ones * (total_ones - 1)) + + (total_ones * (total_ones - 1) * (total_ones - 2)) + ) + + # Normalize the fitness value + fitness_normalized = fitness / 6860 + return round(fitness_normalized, 3)
+ + +
+[docs] + def evaluate(self, x: List[int], out: dict, *args, **kwargs) -> None: + """ + Evaluate function for compatibility with pymoo's optimizer. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/binary/ecc.html b/_modules/pycellga/problems/single_objective/discrete/binary/ecc.html new file mode 100644 index 0000000..f6586fc --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/binary/ecc.html @@ -0,0 +1,401 @@ + + + + + + pycellga.problems.single_objective.discrete.binary.ecc — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.binary.ecc

+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+from typing import List
+
+
+[docs] +class Ecc(AbstractProblem): + """ + Error Correcting Codes Design Problem (ECC) function implementation for optimization problems. + + The ECC function is used for testing optimization algorithms, particularly those involving + error-correcting codes. + + Attributes + ---------- + n_var : int + Number of binary variables, typically 144. + gen_type : GeneType + The type of genes used in the problem, set to BINARY. + xl : int + Lower bounds for binary variables, fixed to 0. + xu : int + Upper bounds for binary variables, fixed to 1. + + Methods + ------- + f(x: List[int]) -> float + Calculates the ECC function value for a given list of binary variables. + evaluate(x: List[int], out: dict, *args, **kwargs) -> None + Pymoo-compatible evaluation method for batch processing. + """ + +
+[docs] + def __init__(self, n_var: int = 144): + """ + Initialize the ECC problem. + + Parameters + ---------- + n_var : int, optional + Number of binary variables for the problem, by default 144. + """ + gen_type = GeneType.BINARY + xl = 0 # Lower bound for binary variables + xu = 1 # Upper bound for binary variables + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[int]) -> float: + """ + Calculate the ECC function value for a given list of binary variables. + + Parameters + ---------- + x : list + A list of binary variables. + + Returns + ------- + float + The ECC function value, rounded to four decimal places. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + individual_length = 12 # Length of individual code segments + half_code = self.n_var // individual_length # Number of code segments + partial_fitness = 0.0 # Accumulated partial fitness value + + for i in range(half_code): + for j in range(i + 1, half_code): # Avoid double-counting pairs + hamming = sum( + x[i * individual_length + k] != x[j * individual_length + k] + for k in range(individual_length) + ) + + if 0 < hamming < individual_length: + partial_fitness += ( + 1.0 / (hamming * hamming) + + 1.0 / ((individual_length - hamming) * (individual_length - hamming)) + ) + + # Calculate final fitness value + fitness = 1.0 / (2 * partial_fitness) if partial_fitness != 0 else 0.0 + return round(fitness, 4)
+ + +
+[docs] + def evaluate(self, x: List[int], out: dict, *args, **kwargs) -> None: + """ + Evaluate function for compatibility with pymoo's optimizer. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/binary/fms.html b/_modules/pycellga/problems/single_objective/discrete/binary/fms.html new file mode 100644 index 0000000..101c7c0 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/binary/fms.html @@ -0,0 +1,407 @@ + + + + + + pycellga.problems.single_objective.discrete.binary.fms — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.binary.fms

+from problems.abstract_problem import AbstractProblem
+from numpy import pi, sin, random
+from common import GeneType
+from typing import List
+
+
+[docs] +class Fms(AbstractProblem): + """ + Frequency Modulation Sound (FMS) function implementation for optimization problems. + + The FMS function is used for testing optimization algorithms, particularly those involving frequency modulation sound. + + Attributes + ---------- + n_var : int + The number of binary variables for the problem, typically 192. + gen_type : GeneType + The type of genes used in the problem, set to BINARY. + xl : int + Lower bounds for binary variables, fixed to 0. + xu : int + Upper bounds for binary variables, fixed to 1. + + Methods + ------- + f(x: List[int]) -> float + Calculates the FMS function value for a given list of binary variables. + evaluate(x: List[int], out: dict, *args, **kwargs) -> None + Pymoo-compatible evaluation method for batch processing. + """ + +
+[docs] + def __init__(self, n_var: int = 192): + """ + Initialize the FMS problem. + + Parameters + ---------- + n_var : int, optional + Number of binary variables for the problem, by default 192. + """ + gen_type = GeneType.BINARY + xl = 0 # Lower bound for binary variables + xu = 1 # Upper bound for binary variables + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[int]) -> float: + """ + Calculate the FMS function value for a given list of binary variables. + + Parameters + ---------- + x : list + A list of binary variables. + + Returns + ------- + float + The FMS function value. + """ + if len(x) != self.n_var: + raise ValueError(f"Input must have exactly {self.n_var} variables.") + + theta = (2.0 * pi) / 100.0 + random.seed(100) + + # Decode binary variables into continuous parameters + def decode_segment(segment): + value = 0 + for bit in segment: + value = (value << 1) | bit + return -6.4 + (12.75 * (value / 4294967295.0)) + + a1 = decode_segment(x[:32]) + w1 = decode_segment(x[32:64]) + a2 = decode_segment(x[64:96]) + w2 = decode_segment(x[96:128]) + a3 = decode_segment(x[128:160]) + w3 = decode_segment(x[160:192]) + + # Generate target signal + target = [sin((5.0 * theta * i) - (1.5 * sin((4.8 * theta * i) + (2.0 * sin(4.9 * theta * i))))) for i in range(101)] + + # Generate predicted signal + y = [a1 * sin((w1 * theta * j) - (a2 * sin((w2 * theta * j) + (a3 * sin(w3 * theta * j))))) for j in range(101)] + + # Compute mean squared error + fitness = sum((target[k] - y[k]) ** 2 for k in range(101)) + return round(fitness, 3)
+ + +
+[docs] + def evaluate(self, x: List[int], out: dict, *args, **kwargs) -> None: + """ + Evaluate function for compatibility with pymoo's optimizer. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/binary/maxcut100.html b/_modules/pycellga/problems/single_objective/discrete/binary/maxcut100.html new file mode 100644 index 0000000..15b7949 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/binary/maxcut100.html @@ -0,0 +1,571 @@ + + + + + + pycellga.problems.single_objective.discrete.binary.maxcut100 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.binary.maxcut100

+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+
+
+
+[docs] +class Maxcut100(AbstractProblem): + """ + A class to represent the Maximum Cut (MAXCUT) problem for 100 nodes. + + Attributes + ---------- + problema : list of list of float + A matrix representing the weights between nodes in the MAXCUT problem. + """ + +
+[docs] + def __init__(self): + + self.problema = [ + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, + 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.500000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, + 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000], + [000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 10.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.500000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, + 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 10.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.500000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.500000, 0.000000, 0.000000, + 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000], + [0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 10.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000], + [0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + ] + + + n_var = 100 + xl = 0 + xu = 1 + gen_type = GeneType.BINARY + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x): + """ + Fitness function for the Maxcut problem. + Calculates the cut value of the given binary solution vector `x`. + + Parameters + ---------- + x : list of int + Binary vector representing the solution. + + Returns + ------- + float + The fitness value (cut value). + """ + fitness = 0.0 + n = len(self.problema) + + for i in range(n): + for j in range(i + 1, n): + if x[i] != x[j]: # Nodes are in different subsets + fitness += self.problema[i][j] + + return fitness
+ + +
+[docs] + def evaluate(self, x, out, *args, **kwargs): + """ + Evaluates the Maxcut problem for a given solution `x`. + + Parameters + ---------- + x : ndarray + Decision variable matrix (each row is a solution vector). + out : dict + Output dictionary where results will be stored. + """ + # Fitness değerlerini hesapla ve çıktıya ekle + out["F"] = [self.f(ind) for ind in x]
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/binary/maxcut20_01.html b/_modules/pycellga/problems/single_objective/discrete/binary/maxcut20_01.html new file mode 100644 index 0000000..7f3fe09 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/binary/maxcut20_01.html @@ -0,0 +1,421 @@ + + + + + + pycellga.problems.single_objective.discrete.binary.maxcut20_01 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.binary.maxcut20_01

+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+from typing import List
+
+
+[docs] +class Maxcut20_01(AbstractProblem): + """ + Maximum Cut (MAXCUT) function implementation for optimization problems. + + The MAXCUT function evaluates the fitness of a binary partition of nodes based on edge weights. + It is used to test optimization algorithms, particularly for maximum cut problems. + + Attributes + ---------- + problema : list of list of float + Adjacency matrix representing edge weights between nodes. + + Methods + ------- + f(x: list) -> float + Calculates the MAXCUT function value for a given list of binary variables. + evaluate(x: list, out: dict) -> None + Pymoo-compatible evaluation method for batch processing. + """ + +
+[docs] + def __init__(self): + """ + Initialize the MAXCUT problem with binary variables and adjacency matrix. + """ + n_var = 20 # Number of binary variables (nodes) + xl = 0 # Lower bound for binary variables + xu = 1 # Upper bound for binary variables + gen_type = GeneType.BINARY + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu) + + # Define adjacency matrix (20x20 matrix of edge weights) + self.problema = [ + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.359902, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.313702, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.848267, 0.000000, 0.000000, 0.000000, 0.287508, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.117489, + 0.000000, 0.000000, 0.000000, 0.000000, 0.190953, 0.000000, 0.000000, 0.000000, 0.000000, 0.916311], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.848267, 0.000000, 0.000000, 0.000000, 0.084579, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.721013, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.084579, 0.000000, 0.000000, 0.000000, 0.000000, 0.863363, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.032054], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.764415, 0.000000, 0.495863, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.287508, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.109939, 0.000000, 0.000000, 0.000000, 0.167750, 0.000000, 0.000000, 0.000000], + [0.359902, 0.000000, 0.117489, 0.000000, 0.000000, 0.863363, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.928091, 0.000000, 0.000000, 0.118362, 0.000000, 0.000000, 0.969750], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.652776, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.764415, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.424253, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.109939, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.495863, 0.000000, 0.000000, 0.928091, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.190953, 0.000000, 0.721013, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.252964, 0.936165, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.652776, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.313702, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.167750, 0.118362, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.424253, 0.000000, 0.000000, 0.252964, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 0.000000, 0.936165, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000], + [0.000000, 0.000000, 0.916311, 0.000000, 0.000000, 0.032054, 0.000000, 0.000000, 0.000000, 0.969750, + 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000] + ]
+ + +
+[docs] + def f(self, x: List[int]) -> float: + """ + Calculate the MAXCUT function value for a given list of binary variables. + + Parameters + ---------- + x : list + A list of binary variables representing node partitions. + + Returns + ------- + float + The MAXCUT function value representing the total weight of edges cut by the partition. + """ + fitness = 0.0 + cols = len(self.problema) + + for i in range(cols - 1): + for j in range(i + 1, cols): + if x[i] != x[j]: # Nodes are in different partitions + fitness += self.problema[i][j] + + return round(fitness, 6)
+ + +
+[docs] + def evaluate(self, x: List[int], out: dict, *args, **kwargs) -> None: + """ + Evaluate function for compatibility with pymoo's optimizer. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/binary/maxcut20_09.html b/_modules/pycellga/problems/single_objective/discrete/binary/maxcut20_09.html new file mode 100644 index 0000000..b8b02aa --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/binary/maxcut20_09.html @@ -0,0 +1,422 @@ + + + + + + pycellga.problems.single_objective.discrete.binary.maxcut20_09 — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.binary.maxcut20_09

+from problems.abstract_problem import AbstractProblem
+from common import GeneType
+from typing import List
+
+
+
+[docs] +class Maxcut20_09(AbstractProblem): + """ + Maximum Cut (MAXCUT) function for optimization on a 20-node graph. + + This class evaluates the cut value by summing weights of edges + between nodes in different partitions defined by binary variables. + + Attributes + ---------- + problema : list of list of float + Adjacency matrix representing edge weights between nodes. + + Methods + ------- + f(x: List[int]) -> float + Calculates the MAXCUT function value for a given list of binary variables. + evaluate(x: List[int], out: dict) -> None + Pymoo-compatible evaluation method for batch processing. + """ + +
+[docs] + def __init__(self): + """ + Initialize the MAXCUT problem with binary variables and adjacency matrix. + """ + n_var = 20 # Number of binary variables (nodes) + xl = 0 # Lower bound for binary variables + xu = 1 # Upper bound for binary variables + gen_type = GeneType.BINARY + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu) + + # Define adjacency matrix (20x20 matrix of edge weights) + self.problema = [ + [0.000000, 0.130622, 0.694577, 0.922028, 0.335786, 0.359902, 0.279580, 0.880418, 0.201529, 0.313702, + 0.322765, 0.399944, 0.000000, 0.848267, 0.933051, 0.085267, 0.957646, 0.331033, 0.389269, 0.193177], + [0.130622, 0.000000, 0.946416, 0.388165, 0.000000, 0.232571, 0.605770, 0.065642, 0.114155, 0.737786, + 0.033571, 0.843579, 0.465199, 0.043667, 0.000000, 0.382358, 0.661252, 0.931556, 0.206577, 0.262331], + [0.694577, 0.946416, 0.000000, 0.989211, 0.000000, 0.152213, 0.000000, 0.084579, 0.610150, 0.131790, + 0.950083, 0.426541, 0.721013, 0.428389, 0.308932, 0.861261, 0.479196, 0.863363, 0.000000, 0.110013], + [0.922028, 0.388165, 0.989211, 0.000000, 0.785464, 0.227321, 0.469172, 0.032054, 0.574073, 0.736906, + 0.764415, 0.000000, 0.495863, 0.602718, 0.684042, 0.492622, 0.000000, 0.918634, 0.974679, 0.134843], + [0.335786, 0.000000, 0.000000, 0.785464, 0.000000, 0.478171, 0.684823, 0.594988, 0.000000, 0.043655, + 0.266736, 0.265187, 0.167750, 0.539353, 0.120596, 0.483133, 0.928091, 0.571874, 0.118362, 0.808725], + [0.359902, 0.232571, 0.152213, 0.227321, 0.478171, 0.000000, 0.969750, 0.948758, 0.527900, 0.652776, + 0.990039, 0.945809, 0.831436, 0.355298, 0.049061, 0.103966, 0.897422, 0.732376, 0.491590, 0.526179], + [0.279580, 0.605770, 0.000000, 0.469172, 0.684823, 0.969750, 0.000000, 0.652418, 0.123045, 0.368941, + 0.000000, 0.053590, 0.035474, 0.000000, 0.360846, 0.665888, 0.757456, 0.000000, 0.912162, 0.974535], + [0.880418, 0.065642, 0.084579, 0.032054, 0.594988, 0.948758, 0.652418, 0.000000, 0.656499, 0.879623, + 0.656778, 0.572563, 0.107108, 0.550337, 0.230315, 0.568378, 0.000000, 0.915765, 0.659182, 0.688311], + [0.201529, 0.114155, 0.610150, 0.574073, 0.000000, 0.527900, 0.123045, 0.656499, 0.000000, 0.995883, + 0.172727, 0.442540, 0.974869, 0.000000, 0.997630, 0.035737, 0.835247, 0.139724, 0.859992, 0.000000], + [0.313702, 0.737786, 0.131790, 0.736906, 0.043655, 0.652776, 0.368941, 0.879623, 0.995883, 0.000000, + 0.120131, 0.483339, 0.969497, 0.300482, 0.879444, 0.000000, 0.836946, 0.084211, 0.723167, 0.195939], + [0.322765, 0.033571, 0.950083, 0.764415, 0.266736, 0.990039, 0.000000, 0.656778, 0.172727, 0.120131, + 0.000000, 0.950398, 0.236138, 0.268245, 0.701255, 0.894728, 0.303465, 0.989424, 0.228973, 0.978178], + [0.399944, 0.843579, 0.426541, 0.000000, 0.265187, 0.945809, 0.053590, 0.572563, 0.442540, 0.483339, + 0.950398, 0.000000, 0.060377, 0.854370, 0.488094, 0.581746, 0.935845, 0.723815, 0.225213, 0.424806], + [0.000000, 0.465199, 0.721013, 0.495863, 0.167750, 0.831436, 0.035474, 0.107108, 0.974869, 0.969497, + 0.236138, 0.060377, 0.000000, 0.404249, 0.867185, 0.865152, 0.330739, 0.876005, 0.978220, 0.651577], + [0.848267, 0.043667, 0.428389, 0.602718, 0.539353, 0.355298, 0.000000, 0.550337, 0.000000, 0.300482, + 0.268245, 0.854370, 0.404249, 0.000000, 0.492553, 0.088188, 0.690603, 0.287630, 0.000000, 0.690291], + [0.933051, 0.000000, 0.308932, 0.684042, 0.120596, 0.049061, 0.360846, 0.230315, 0.997630, 0.879444, + 0.701255, 0.488094, 0.867185, 0.492553, 0.000000, 0.000000, 0.593581, 0.076547, 0.297751, 0.159191], + [0.085267, 0.382358, 0.861261, 0.492622, 0.483133, 0.103966, 0.665888, 0.568378, 0.035737, 0.000000, + 0.894728, 0.581746, 0.865152, 0.088188, 0.000000, 0.000000, 0.747596, 0.562290, 0.000000, 0.955731], + [0.957646, 0.661252, 0.479196, 0.000000, 0.928091, 0.897422, 0.757456, 0.000000, 0.835247, 0.836946, + 0.303465, 0.935845, 0.330739, 0.690603, 0.593581, 0.747596, 0.000000, 0.244949, 0.994884, 0.067050], + [0.331033, 0.931556, 0.863363, 0.918634, 0.571874, 0.732376, 0.000000, 0.915765, 0.139724, 0.084211, + 0.989424, 0.723815, 0.876005, 0.287630, 0.076547, 0.562290, 0.244949, 0.000000, 0.621331, 0.752926], + [0.389269, 0.206577, 0.000000, 0.974679, 0.118362, 0.491590, 0.912162, 0.659182, 0.859992, 0.723167, + 0.228973, 0.225213, 0.978220, 0.000000, 0.297751, 0.000000, 0.994884, 0.621331, 0.000000, 0.224879], + [0.193177, 0.262331, 0.110013, 0.134843, 0.808725, 0.526179, 0.974535, 0.688311, 0.000000, 0.195939, + 0.978178, 0.424806, 0.651577, 0.690291, 0.159191, 0.955731, 0.067050, 0.752926, 0.224879, 0.000000] + ]
+ + +
+[docs] + def f(self, x: List[int]) -> float: + """ + Calculate the MAXCUT function value for a given list of binary variables. + + Parameters + ---------- + x : List[int] + A list of binary variables representing node partitions. + + Returns + ------- + float + The MAXCUT function value representing the total weight of edges cut by the partition. + """ + fitness = 0.0 + cols = len(self.problema) + + for i in range(cols - 1): + for j in range(i + 1, cols): + if x[i] != x[j]: # Nodes are in different partitions + fitness += self.problema[i][j] + + return round(fitness, 6)
+ + +
+[docs] + def evaluate(self, x: List[int], out: dict, *args, **kwargs) -> None: + """ + Evaluate function for compatibility with pymoo's optimizer. + + Parameters + ---------- + x : numpy.ndarray + Array of input variables. + out : dict + Dictionary to store the output fitness values. + """ + out["F"] = self.f(x.tolist())
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/binary/mmdp.html b/_modules/pycellga/problems/single_objective/discrete/binary/mmdp.html new file mode 100644 index 0000000..c5e7e60 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/binary/mmdp.html @@ -0,0 +1,384 @@ + + + + + + pycellga.problems.single_objective.discrete.binary.mmdp — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.binary.mmdp

+from problems.abstract_problem import AbstractProblem
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Mmdp(AbstractProblem): + """ + Represents the Massively Multimodal Deceptive Problem (MMDP). + + The MMDP is designed to deceive genetic algorithms by having multiple local + optima. The problem is characterized by a chromosome length of 240 and a + maximum fitness value of 40. + + Attributes + ---------- + gen_type : GeneType + Type of genes used in the problem (binary in this case). + n_var : int + The number of design variables (240 for MMDP). + xl : float + The lower bound for the design variables (0 for binary genes). + xu : float + The upper bound for the design variables (1 for binary genes). + + Methods + ------- + f(x: list) -> float + Evaluates the fitness of a given chromosome. + """ + +
+[docs] + def __init__(self): + """ + Initializes the MMDP problem with binary genes, 240 design variables, + and predefined bounds. + """ + n_var = 240 + xl = 0 + xu = 1 + gen_type=GeneType.BINARY + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[int]) -> float: + """ + Evaluates the fitness of a given chromosome for the MMDP. + + The fitness function is calculated based on the number of ones in each + of the 40 subproblems, each of length 6. + + Parameters + ---------- + x : List[int] + A list representing the chromosome, where each element is a binary + value (0 or 1). + + Returns + ------- + float + The normalized fitness value of the chromosome, rounded to three + decimal places. + """ + subproblems_length = 6 + subproblems_number = 40 + fitness = 0.0 + + for i in range(subproblems_number): + total_ones = sum(x[i * subproblems_length + j] for j in range(subproblems_length)) + + if total_ones == 0 or total_ones == 6: + partial_fitness = 1.0 + elif total_ones == 1 or total_ones == 5: + partial_fitness = 0.0 + elif total_ones == 2 or total_ones == 4: + partial_fitness = 0.360384 + elif total_ones == 3: + partial_fitness = 0.640576 + + fitness += partial_fitness + + fitness_normalized = fitness / subproblems_number + return round(fitness_normalized, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/binary/one_max.html b/_modules/pycellga/problems/single_objective/discrete/binary/one_max.html new file mode 100644 index 0000000..f52631f --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/binary/one_max.html @@ -0,0 +1,366 @@ + + + + + + pycellga.problems.single_objective.discrete.binary.one_max — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.binary.one_max

+from problems.abstract_problem import AbstractProblem
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class OneMax(AbstractProblem): + """ + Represents the OneMax problem. + + The OneMax problem is a simple genetic algorithm benchmark problem + where the fitness of a chromosome is the sum of its bits. + + Attributes + ---------- + gen_type : GeneType + Type of genes used in the problem (binary in this case). + n_var : int + The number of design variables (default is 100). + xl : float + The lower bound for the design variables (0 for binary genes). + xu : float + The upper bound for the design variables (1 for binary genes). + + Methods + ------- + f(x: list) -> float + Evaluates the fitness of a given chromosome. + """ + +
+[docs] + def __init__(self, n_var: int = 100): + """ + Initialize the OneMax problem with a default number of variables (100) + and binary gene bounds. + + Parameters + ---------- + n_var : int, optional + Number of design variables (default is 100). + """ + xl = 0 + xu = 1 + gen_type=GeneType.BINARY + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu)
+ + +
+[docs] + def f(self, x: List[int]) -> float: + """ + Evaluates the fitness of a given chromosome for the OneMax problem. + + The fitness function is the sum of all bits in the chromosome. + + Parameters + ---------- + x : List[int] + A list representing the chromosome, where each element is a binary + value (0 or 1). + + Returns + ------- + float + The fitness value of the chromosome, which is the sum of its bits. + """ + return float(-sum(x))
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/binary/peak.html b/_modules/pycellga/problems/single_objective/discrete/binary/peak.html new file mode 100644 index 0000000..6c1083b --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/binary/peak.html @@ -0,0 +1,383 @@ + + + + + + pycellga.problems.single_objective.discrete.binary.peak — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.binary.peak

+from problems.abstract_problem import AbstractProblem
+from numpy import random
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Peak(AbstractProblem): + """ + Represents the Peak problem. + + The Peak problem evaluates the fitness of a chromosome based on its + distance to a set of target peaks. + + Attributes + ---------- + gen_type : GeneType + Type of genes used in the problem (binary in this case). + n_var : int + The number of design variables (chromosome length, default is 100). + xl : float + The lower bounds for the design variables (0 for binary genes). + xu : float + The upper bounds for the design variables (1 for binary genes). + + Methods + ------- + f(x: list) -> float + Evaluates the fitness of a given chromosome. + """ + +
+[docs] + def __init__(self, n_var: int = 100): + """ + Initialize the Peak problem with a default number of variables (100) + and binary gene bounds. + + Parameters + ---------- + n_var : int, optional + Number of design variables (default is 100). + """ + xl = 0 + xu = 1 + gen_type=GeneType.BINARY + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu) + + # Seed the random number generator for reproducibility + random.seed(100) + self.p_target = [ + [random.randint(2) for _ in range(n_var)] for _ in range(100) + ] # 100 target peaks
+ + +
+[docs] + def f(self, x: List[int]) -> float: + """ + Evaluates the fitness of a given chromosome for the Peak problem. + + The fitness function calculates the distance between the given + chromosome and a set of randomly generated target peaks. + + Parameters + ---------- + x : list + A list representing the chromosome, where each element is a binary + value (0 or 1). + + Returns + ------- + float + The fitness value of the chromosome, normalized to a range of 0.0 to 1.0. + """ + problem_length = len(x) + min_distance = float("inf") + + for peak in self.p_target: + distance = sum(1 for xi, pi in zip(x, peak) if xi != pi) + if distance < min_distance: + min_distance = distance + + # Normalize the fitness value + fitness = 1 - (min_distance / problem_length) # 1 - normalized distance + return round(fitness, 3)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/problems/single_objective/discrete/permutation/tsp.html b/_modules/pycellga/problems/single_objective/discrete/permutation/tsp.html new file mode 100644 index 0000000..c478fa8 --- /dev/null +++ b/_modules/pycellga/problems/single_objective/discrete/permutation/tsp.html @@ -0,0 +1,412 @@ + + + + + + pycellga.problems.single_objective.discrete.permutation.tsp — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.problems.single_objective.discrete.permutation.tsp

+from problems.abstract_problem import AbstractProblem
+import tsplib95
+from math import sqrt
+from geopy.distance import geodesic
+import os
+from typing import List
+from common import GeneType
+
+
+
+[docs] +class Tsp(AbstractProblem): + """ + Represents the Traveling Salesman Problem (TSP). + + This class solves the TSP using geographical distances (GEO) for node coordinates. + + Attributes + ---------- + gen_type : GeneType + The type of genes used in the problem (permutation in this case). + n_var : int + The number of nodes in the TSP problem. + xl : int + The minimum value for each variable (1 in this case, node index starts at 1). + xu : int + The maximum value for each variable (number of nodes). + """ + +
+[docs] + def __init__(self, n_var: int = 14): + """ + Initialize the TSP problem with default attributes. + + Parameters + ---------- + n_var : int, optional + Number of nodes in the TSP problem (default is 14). + """ + xl = [1] + xu = [14] + gen_type=GeneType.PERMUTATION + + super().__init__(gen_type=gen_type, n_var=n_var, xl=xl, xu=xu) + + # Load TSP data file + file_path = os.path.join(os.path.dirname(__file__), "burma14.tsp.txt") + with open(file_path) as fl: + self.problem = tsplib95.read(fl) + self.node_coords = list(self.problem.node_coords.values()) + + # Precompute distances + self.distances = self._compute_distances()
+ + + def _compute_distances(self): + """ + Precomputes the geographical distances between all node pairs. + + Returns + ------- + dict + A dictionary with distances between all node pairs. + """ + distances = {} + for i, coord_a in enumerate(self.node_coords): + distances[i + 1] = {} + for j, coord_b in enumerate(self.node_coords): + distances[i + 1][j + 1] = self.geographical_dist(coord_a, coord_b) + return distances + +
+[docs] + def f(self, x: List[int]) -> float: + """ + Evaluates the fitness of a given chromosome (route) for the TSP. + + Parameters + ---------- + x : list + A list representing the route (chromosome), where each element is a node index. + + Returns + ------- + float + The total distance of the route, rounded to one decimal place. + """ + fitness = 0.0 + for i in range(len(x)): + start_node = x[i] + end_node = x[(i + 1) % len(x)] + fitness += self.distances[start_node][end_node] + return round(fitness, 1)
+ + +
+[docs] + def geographical_dist(self, a: List[float], b: List[float]) -> float: + """ + Computes the geographical distance between two nodes using the geodesic distance. + + Parameters + ---------- + a : list + Coordinates of the first node. + b : list + Coordinates of the second node. + + Returns + ------- + float + The geographical distance between the two nodes, rounded to one decimal place. + """ + dist = geodesic(a, b).km + return round(dist, 1)
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/arithmetic_crossover.html b/_modules/pycellga/recombination/arithmetic_crossover.html new file mode 100644 index 0000000..ea90443 --- /dev/null +++ b/_modules/pycellga/recombination/arithmetic_crossover.html @@ -0,0 +1,379 @@ + + + + + + pycellga.recombination.arithmetic_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.arithmetic_crossover

+import random
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class ArithmeticCrossover(RecombinationOperator): + """ + ArithmeticCrossover performs an arithmetic crossover operation on a pair of parent individuals + to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the ArithmeticCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the arithmetic crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + offsprings = [] + p1 = self.parents[0] + p2 = self.parents[1] + chsize = len(p1.chromosome) + a = p1.chromosome + b = p2.chromosome + + alpha = random.uniform(0, 1) # Random weight factor + child_1_ch = [0 for i in range(chsize)] + child_2_ch = [0 for i in range(chsize)] + + for i in range(chsize): + child_1_ch[i] = round(alpha * a[i] + (1 - alpha) * b[i], 5) + child_2_ch[i] = round((1 - alpha) * a[i] + alpha * b[i], 5) + + # Create the first child + child_1 = Individual() + child_1.chromosome = child_1_ch + child_1.ch_size = len(child_1_ch) + child_1.position = p1.position + child_1.neighbors_positions = p1.neighbors_positions + child_1.fitness_value = self.problem.f(child_1_ch) + offsprings.append(child_1) + + # Create the second child + child_2 = Individual() + child_2.chromosome = child_2_ch + child_2.ch_size = len(child_2_ch) + child_2.position = p2.position + child_2.neighbors_positions = p2.neighbors_positions + child_2.fitness_value = self.problem.f(child_2_ch) + offsprings.append(child_2) + + return offsprings
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/blxalpha_crossover.html b/_modules/pycellga/recombination/blxalpha_crossover.html new file mode 100644 index 0000000..acf2cd8 --- /dev/null +++ b/_modules/pycellga/recombination/blxalpha_crossover.html @@ -0,0 +1,408 @@ + + + + + + pycellga.recombination.blxalpha_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.blxalpha_crossover

+import random
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class BlxalphaCrossover(RecombinationOperator): + """ + BlxalphaCrossover performs BLX-alpha crossover on a pair of parent individuals + to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the BlxalphaCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def combine(self, p1: Individual, p2: Individual, locationsource: Individual) -> Individual: + """ + Combine two parent individuals using BLX-alpha crossover to produce a single offspring. + + Parameters + ---------- + p1 : Individual + The first parent individual. + p2 : Individual + The second parent individual. + locationsource : Individual + The individual from which to copy positional information for the offspring. + + Returns + ------- + Individual + The resulting offspring individual. + """ + chsize = len(p1.chromosome) + child = [0 for i in range(chsize)] + alpha = random.uniform(0, 1) + c_min = 0.0 + c_max = 0.0 + min_range = 0.0 + max_range = 0.0 + + for i in range(chsize): + p1_allele = p1.chromosome[i] + p2_allele = p2.chromosome[i] + + if p1_allele > p2_allele: + c_max = p1_allele + c_min = p2_allele + elif p1_allele < p2_allele: + c_max = p2_allele + c_min = p1_allele + else: + c_max = p1_allele # or p2_allele because it is the case where p1_allele=p2_allele + + l = c_max - c_min + min_range = c_min - (l * alpha) + max_range = c_max + (l * alpha) + + new_allele = random.uniform(min_range, max_range) + child[i] = round(new_allele, 5) + + indv = Individual(p1.gen_type, p1.ch_size) + indv.position = locationsource.position + indv.neighbors_positions = locationsource.neighbors_positions + indv.chromosome = list(child) + indv.fitness_value = self.problem.f(child) + return indv
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the BLX-alpha crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + p1 = self.parents[0] + p2 = self.parents[1] + + return [ + self.combine(p1, p2, p1), + self.combine(p1, p2, p2) + ]
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/byte_one_point_crossover.html b/_modules/pycellga/recombination/byte_one_point_crossover.html new file mode 100644 index 0000000..0fe483e --- /dev/null +++ b/_modules/pycellga/recombination/byte_one_point_crossover.html @@ -0,0 +1,398 @@ + + + + + + pycellga.recombination.byte_one_point_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.byte_one_point_crossover

+import numpy as np
+from individual import Individual
+from problems.abstract_problem import AbstractProblem
+from typing import List
+import struct
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class ByteOnePointCrossover(RecombinationOperator): + """ + ByteOnePointCrossover operator defined in (Satman, 2013). ByteOnePointCrossover performs a + one-point crossover at the byte level on a pair of parent individuals to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the ByteOnePointCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the one-point crossover on the parent individuals at the byte level to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + offsprings = [] + child_ch1 = [] + child_ch2 = [] + p1 = self.parents[0] + p2 = self.parents[1] + + for k in range(len(p1.chromosome)): + # Convert the k-th gene of the parents to bytes + p1_byte_ch = list(struct.pack("d", p1.chromosome[k])) + p2_byte_ch = list(struct.pack("d", p2.chromosome[k])) + + # Determine crossover point + co_point = np.random.randint(1, len(p1_byte_ch)) + + # Segment the bytes at the crossover point + p1_seg1 = p1_byte_ch[0:co_point] + p1_seg2 = p1_byte_ch[co_point:] + + p2_seg1 = p2_byte_ch[0:co_point] + p2_seg2 = p2_byte_ch[co_point:] + + # First child + new_chromosome_1_part = p1_seg1 + p2_seg2 + child_part_byte_1 = bytearray(new_chromosome_1_part) + child_part_float_1 = struct.unpack("d", child_part_byte_1)[0] + child_ch1.append(round(child_part_float_1, 5)) + + # Second child + new_chromosome_2_part = p1_seg2 + p2_seg1 + child_part_byte_2 = bytearray(new_chromosome_2_part) + child_part_float_2 = struct.unpack("d", child_part_byte_2)[0] + child_ch2.append(round(child_part_float_2, 5)) + + # Create the first child individual + child_1 = Individual() + child_1.position = p1.position + child_1.neighbors_positions = p1.neighbors_positions + child_1.fitness_value = self.problem.f(child_ch1) + child_1.chromosome = child_ch1 + child_1.ch_size = len(child_1.chromosome) + offsprings.append(child_1) + + # Create the second child individual + child_2 = Individual() + child_2.position = p2.position + child_2.neighbors_positions = p2.neighbors_positions + child_2.fitness_value = self.problem.f(child_ch2) + child_2.chromosome = child_ch2 + child_2.ch_size = len(child_2.chromosome) + offsprings.append(child_2) + + return offsprings
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/byte_uniform_crossover.html b/_modules/pycellga/recombination/byte_uniform_crossover.html new file mode 100644 index 0000000..ff22a6a --- /dev/null +++ b/_modules/pycellga/recombination/byte_uniform_crossover.html @@ -0,0 +1,400 @@ + + + + + + pycellga.recombination.byte_uniform_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.byte_uniform_crossover

+import numpy.random as randomgenerator
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from typing import List
+import struct
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class ByteUniformCrossover(RecombinationOperator): + """ + ByteUniformCrossover operator defined in (Satman, 2013). ByteUniformCrossover performs a + uniform crossover at the byte level on a pair of parent individuals to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the ByteUniformCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def combine(self, p1: Individual, p2: Individual, locationsource: Individual) -> Individual: + """ + Combine two parent individuals using uniform crossover at the byte level to produce a single offspring. + + Parameters + ---------- + p1 : Individual + The first parent individual. + p2 : Individual + The second parent individual. + locationsource : Individual + The individual from which to copy positional information for the offspring. + + Returns + ------- + Individual + The resulting offspring individual. + """ + child_ch = [] + for k in range(len(p1.chromosome)): + # Convert the k-th gene of the parents to bytes + p1_byte_ch = list(struct.pack("d", p1.chromosome[k])) + p2_byte_ch = list(struct.pack("d", p2.chromosome[k])) + + chsize = len(p1_byte_ch) + child_part = [0 for i in range(len(p1_byte_ch))] + for i in range(chsize): + if randomgenerator.rand() < 0.5: + child_part[i] = p1_byte_ch[i] + else: + child_part[i] = p2_byte_ch[i] + + child_part_byte = bytearray(child_part) + child_part_float = list(struct.unpack("d", child_part_byte)) + + child_ch.append(round(child_part_float[0], 5)) + + indv = Individual(p1.gen_type, p1.ch_size) + indv.position = locationsource.position + indv.neighbors_positions = locationsource.neighbors_positions + indv.chromosome = list(child_ch) + indv.fitness_value = self.problem.f(child_ch) + return indv
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the uniform crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + p1 = self.parents[0] + p2 = self.parents[1] + + return [ + self.combine(p1, p2, p1), + self.combine(p1, p2, p2) + ]
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/flat_crossover.html b/_modules/pycellga/recombination/flat_crossover.html new file mode 100644 index 0000000..5dc3f8c --- /dev/null +++ b/_modules/pycellga/recombination/flat_crossover.html @@ -0,0 +1,396 @@ + + + + + + pycellga.recombination.flat_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.flat_crossover

+import random
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class FlatCrossover(RecombinationOperator): + """ + FlatCrossover performs a flat crossover on a pair of parent individuals + to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the FlatCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def combine(self, p1: Individual, p2: Individual, locationsource: Individual) -> Individual: + """ + Combine two parent individuals using flat crossover to produce a single offspring. + + Parameters + ---------- + p1 : Individual + The first parent individual. + p2 : Individual + The second parent individual. + locationsource : Individual + The individual from which to copy positional information for the offspring. + + Returns + ------- + Individual + The resulting offspring individual. + """ + chsize = len(p1.chromosome) + child = [0 for i in range(chsize)] + for i in range(chsize): + p1_allele = p1.chromosome[i] + p2_allele = p2.chromosome[i] + + if p1_allele > p2_allele: + c_max = p1_allele + c_min = p2_allele + else: + c_max = p2_allele + c_min = p1_allele + + new_allele = random.uniform(c_min, c_max) + child[i] = round(new_allele, 5) + + indv = Individual(p1.gen_type, p1.ch_size) + indv.position = locationsource.position + indv.neighbors_positions = locationsource.neighbors_positions + indv.chromosome = list(child) + indv.fitness_value = self.problem.f(child) + return indv
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the flat crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + p1 = self.parents[0] + p2 = self.parents[1] + + return [ + self.combine(p1, p2, p1), + self.combine(p1, p2, p2) + ]
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/linear_crossover.html b/_modules/pycellga/recombination/linear_crossover.html new file mode 100644 index 0000000..9017840 --- /dev/null +++ b/_modules/pycellga/recombination/linear_crossover.html @@ -0,0 +1,401 @@ + + + + + + pycellga.recombination.linear_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.linear_crossover

+import random
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class LinearCrossover(RecombinationOperator): + """ + LinearCrossover performs a linear crossover on a pair of parent individuals + to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the LinearCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def combine(self, p1: Individual, p2: Individual, locationsource: Individual) -> Individual: + """ + Combine two parent individuals using linear crossover to produce a single offspring. + + Parameters + ---------- + p1 : Individual + The first parent individual. + p2 : Individual + The second parent individual. + locationsource : Individual + The individual from which to copy positional information for the offspring. + + Returns + ------- + Individual + The resulting offspring individual. + """ + chsize = len(p1.chromosome) + child1_ch = [0 for i in range(chsize)] + child2_ch = [0 for i in range(chsize)] + child3_ch = [0 for i in range(chsize)] + + for i in range(chsize): + p1_allele = p1.chromosome[i] + p2_allele = p2.chromosome[i] + + child1_ch[i] = round(0.5 * p1_allele + 0.5 * p2_allele, 5) + child2_ch[i] = round(3 * p1_allele / 2 - 0.5 * p2_allele, 5) + child3_ch[i] = round(-0.5 * p1_allele + 3 * p2_allele / 2, 5) + + chosed_ch = random.randint(1, 3) + if chosed_ch == 1: + chosed_child_ch = child1_ch + elif chosed_ch == 2: + chosed_child_ch = child2_ch + elif chosed_ch == 3: + chosed_child_ch = child3_ch + + indv = Individual(p1.gen_type, p1.ch_size) + indv.position = locationsource.position + indv.neighbors_positions = locationsource.neighbors_positions + indv.chromosome = list(chosed_child_ch) + indv.fitness_value = self.problem.f(chosed_child_ch) + return indv
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the linear crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + p1 = self.parents[0] + p2 = self.parents[1] + + return [ + self.combine(p1, p2, p1), + self.combine(p1, p2, p2) + ]
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/one_point_crossover.html b/_modules/pycellga/recombination/one_point_crossover.html new file mode 100644 index 0000000..6464410 --- /dev/null +++ b/_modules/pycellga/recombination/one_point_crossover.html @@ -0,0 +1,380 @@ + + + + + + pycellga.recombination.one_point_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.one_point_crossover

+import numpy as np
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from recombination.recombination_operator import RecombinationOperator
+
+
+
+[docs] +class OnePointCrossover(RecombinationOperator): + """ + OnePointCrossover performs a one-point crossover on a pair of parent individuals + to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the OnePointCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the one-point crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + offsprings = [] + p1 = self.parents[0] + p2 = self.parents[1] + + # Determine crossover point + co_point = np.random.randint(len(p1.chromosome)) + + # Segment the chromosomes at the crossover point + p1_seg1 = list(p1.chromosome[0:co_point]) + p1_seg2 = list(p1.chromosome[co_point:]) + p2_seg1 = list(p2.chromosome[0:co_point]) + p2_seg2 = list(p2.chromosome[co_point:]) + + # Create the first child + child_1 = Individual() + new_chromosome_1 = p1_seg1 + p2_seg2 + child_1.chromosome = new_chromosome_1 + child_1.ch_size = len(new_chromosome_1) + child_1.position = p1.position + child_1.neighbors_positions = p1.neighbors_positions + child_1.fitness_value = self.problem.f(child_1.chromosome) + offsprings.append(child_1) + + # Create the second child + child_2 = Individual() + new_chromosome_2 = p1_seg2 + p2_seg1 + child_2.chromosome = new_chromosome_2 + child_2.ch_size = len(new_chromosome_2) + child_2.position = p2.position + child_2.neighbors_positions = p2.neighbors_positions + child_2.fitness_value = self.problem.f(child_2.chromosome) + offsprings.append(child_2) + + return offsprings
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/pmx_crossover.html b/_modules/pycellga/recombination/pmx_crossover.html new file mode 100644 index 0000000..aa287f7 --- /dev/null +++ b/_modules/pycellga/recombination/pmx_crossover.html @@ -0,0 +1,432 @@ + + + + + + pycellga.recombination.pmx_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.pmx_crossover

+from individual import *
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class PMXCrossover(RecombinationOperator): + """ + PMXCrossover performs Partially Mapped Crossover (PMX) on a pair of parent individuals + to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the PMXCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the PMX crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + offsprings = [] + p1 = self.parents[0] + p2 = self.parents[1] + + co_point_1 = 15 + co_point_2 = 35 + + p1_seg_main = list(p1.chromosome[co_point_1:co_point_2]) + p1_seg_left = list(p1.chromosome[0:co_point_1]) + p1_seg_right = list(p1.chromosome[co_point_2:]) + p1_seg_left_aux = list() + p1_seg_right_aux = list() + + p2_seg_main = list(p2.chromosome[co_point_1:co_point_2]) + p2_seg_left = list(p2.chromosome[0:co_point_1]) + p2_seg_right = list(p2.chromosome[co_point_2:]) + p2_seg_left_aux = list() + p2_seg_right_aux = list() + + # First child + child_1 = Individual() + + for seg in p1_seg_left: + if seg in p2_seg_main: + mapping_index = p2_seg_main.index(seg) + mapping_item = p1_seg_main[mapping_index] + while mapping_item in p2_seg_main: + mapping_index = p2_seg_main.index(mapping_item) + mapping_item = p1_seg_main[mapping_index] + p1_seg_left_aux.append(mapping_item) + else: + p1_seg_left_aux.append(seg) + + for seg in p1_seg_right: + if seg in p2_seg_main: + mapping_index = p2_seg_main.index(seg) + mapping_item = p1_seg_main[mapping_index] + while mapping_item in p2_seg_main: + mapping_index = p2_seg_main.index(mapping_item) + mapping_item = p1_seg_main[mapping_index] + p1_seg_right_aux.append(mapping_item) + else: + p1_seg_right_aux.append(seg) + + child_1_ch = p1_seg_left_aux + p2_seg_main + p1_seg_right_aux + + child_1.chromosome = child_1_ch + child_1.ch_size = len(child_1_ch) + child_1.position = p1.position + child_1.neighbors_positions = p1.neighbors_positions + child_1.fitness_value = self.problem.f(child_1.chromosome) + offsprings.append(child_1) + + # Second child + child_2 = Individual() + + for seg in p2_seg_left: + if seg in p1_seg_main: + mapping_index = p1_seg_main.index(seg) + mapping_item = p2_seg_main[mapping_index] + while mapping_item in p1_seg_main: + mapping_index = p1_seg_main.index(mapping_item) + mapping_item = p2_seg_main[mapping_index] + p2_seg_left_aux.append(mapping_item) + else: + p2_seg_left_aux.append(seg) + + for seg in p2_seg_right: + if seg in p1_seg_main: + mapping_index = p1_seg_main.index(seg) + mapping_item = p2_seg_main[mapping_index] + while mapping_item in p1_seg_main: + mapping_index = p1_seg_main.index(mapping_item) + mapping_item = p2_seg_main[mapping_index] + p2_seg_right_aux.append(mapping_item) + else: + p2_seg_right_aux.append(seg) + + child_2_ch = p2_seg_left_aux + p1_seg_main + p2_seg_right_aux + + child_2.chromosome = child_2_ch + child_2.ch_size = len(child_2_ch) + child_2.position = p2.position + child_2.neighbors_positions = p2.neighbors_positions + child_2.fitness_value = self.problem.f(child_2.chromosome) + offsprings.append(child_2) + + return offsprings
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/two_point_crossover.html b/_modules/pycellga/recombination/two_point_crossover.html new file mode 100644 index 0000000..1f435d1 --- /dev/null +++ b/_modules/pycellga/recombination/two_point_crossover.html @@ -0,0 +1,387 @@ + + + + + + pycellga.recombination.two_point_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.two_point_crossover

+import numpy as np
+from individual import Individual
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class TwoPointCrossover(RecombinationOperator): + """ + TwoPointCrossover performs a two-point crossover on a pair of parent individuals + to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the TwoPointCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the two-point crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + offsprings = [] + p1 = self.parents[0] + p2 = self.parents[1] + + parameter = len(p1.chromosome) * 0.20 + min_co = int(parameter) + max_co = len(p1.chromosome) - (int(parameter) - 1) + + co_point_1 = np.random.randint(min_co, max_co) + co_point_2 = np.random.randint(min_co, max_co) + + if co_point_1 > co_point_2: + co_point_1, co_point_2 = co_point_2, co_point_1 + + P1_seg_1 = p1.chromosome[0:co_point_1] + P1_seg_2 = p1.chromosome[co_point_1:co_point_2] + P1_seg_3 = p1.chromosome[co_point_2:] + + P2_seg_1 = p2.chromosome[0:co_point_1] + P2_seg_2 = p2.chromosome[co_point_1:co_point_2] + P2_seg_3 = p2.chromosome[co_point_2:] + + child_1_chromosome = P1_seg_1 + P2_seg_2 + P1_seg_3 + child_2_chromosome = P2_seg_1 + P1_seg_2 + P2_seg_3 + + child_1 = Individual() + child_1.chromosome = child_1_chromosome + child_1.ch_size = len(child_1_chromosome) + child_1.position = p1.position + child_1.neighbors_positions = p1.neighbors_positions + child_1.fitness_value = self.problem.f(child_1.chromosome) + offsprings.append(child_1) + + child_2 = Individual() + child_2.chromosome = child_2_chromosome + child_2.ch_size = len(child_2_chromosome) + child_2.position = p2.position + child_2.neighbors_positions = p2.neighbors_positions + child_2.fitness_value = self.problem.f(child_2.chromosome) + offsprings.append(child_2) + + return offsprings
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/unfair_avarage_crossover.html b/_modules/pycellga/recombination/unfair_avarage_crossover.html new file mode 100644 index 0000000..700ffc4 --- /dev/null +++ b/_modules/pycellga/recombination/unfair_avarage_crossover.html @@ -0,0 +1,386 @@ + + + + + + pycellga.recombination.unfair_avarage_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.unfair_avarage_crossover

+import random
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class UnfairAvarageCrossover(RecombinationOperator): + """ + UnfairAvarageCrossover performs an unfair average crossover on a pair of parent individuals + to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the UnfairAvarageCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the unfair average crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + offsprings = [] + p1 = self.parents[0] + p2 = self.parents[1] + chsize = len(p1.chromosome) + a = p1.chromosome + b = p2.chromosome + + alpha = random.uniform(0, 1) + child_1_ch = [0 for i in range(chsize)] + child_2_ch = [0 for i in range(chsize)] + + alpha = random.uniform(0, 1) + j = random.randint(1, chsize) + + for i in range(chsize): + if i <= j: + child_1_ch[i] = round((1 + alpha) * a[i] - alpha * b[i], 5) + child_2_ch[i] = round((1 - alpha) * a[i] + alpha * b[i], 5) + else: + child_1_ch[i] = round(-alpha * a[i] + (1 + alpha) * b[i], 5) + child_2_ch[i] = round(alpha * a[i] + (1 - alpha) * b[i], 5) + + # First child + child_1 = Individual() + child_1.chromosome = child_1_ch + child_1.ch_size = len(child_1_ch) + child_1.position = p1.position + child_1.neighbors_positions = p1.neighbors_positions + child_1.fitness_value = self.problem.f(child_1_ch) + offsprings.append(child_1) + + # Second child + child_2 = Individual() + child_2.chromosome = child_2_ch + child_2.ch_size = len(child_2_ch) + child_2.position = p2.position + child_2.neighbors_positions = p2.neighbors_positions + child_2.fitness_value = self.problem.f(child_2_ch) + offsprings.append(child_2) + + return offsprings
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/recombination/uniform_crossover.html b/_modules/pycellga/recombination/uniform_crossover.html new file mode 100644 index 0000000..719f867 --- /dev/null +++ b/_modules/pycellga/recombination/uniform_crossover.html @@ -0,0 +1,388 @@ + + + + + + pycellga.recombination.uniform_crossover — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.recombination.uniform_crossover

+import numpy.random as randomgenerator
+from individual import *
+from problems.abstract_problem import AbstractProblem
+from typing import List
+from recombination.recombination_operator import RecombinationOperator
+
+
+[docs] +class UniformCrossover(RecombinationOperator): + """ + UniformCrossover performs a uniform crossover on a pair of parent individuals + to produce offspring individuals. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + +
+[docs] + def __init__(self, parents: list, problem: AbstractProblem): + """ + Initialize the UniformCrossover object. + + Parameters + ---------- + parents : list + A list containing two parent individuals. + problem : AbstractProblem + The problem instance that provides the fitness function. + """ + self.parents = parents + self.problem = problem
+ + +
+[docs] + def combine(self, p1: Individual, p2: Individual, locationsource: Individual) -> Individual: + """ + Combine two parent individuals using uniform crossover to produce a single offspring. + + Parameters + ---------- + p1 : Individual + The first parent individual. + p2 : Individual + The second parent individual. + locationsource : Individual + The individual from which to copy positional information for the offspring. + + Returns + ------- + Individual + The resulting offspring individual. + """ + chsize = len(p1.chromosome) + child = [0 for i in range(chsize)] + for i in range(chsize): + if randomgenerator.rand() < 0.5: + child[i] = p1.chromosome[i] + else: + child[i] = p2.chromosome[i] + + indv = Individual(p1.gen_type, p1.ch_size) + indv.position = locationsource.position + indv.neighbors_positions = locationsource.neighbors_positions + indv.chromosome = list(child) + indv.fitness_value = self.problem.f(child) + return indv
+ + +
+[docs] + def get_recombinations(self) -> List[Individual]: + """ + Perform the uniform crossover on the parent individuals to produce offspring. + + Returns + ------- + List[Individual] + A list containing the offspring individuals. + """ + p1 = self.parents[0] + p2 = self.parents[1] + + return [ + self.combine(p1, p2, p1), + self.combine(p1, p2, p2) + ]
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/selection/roulette_wheel_selection.html b/_modules/pycellga/selection/roulette_wheel_selection.html new file mode 100644 index 0000000..e8b30db --- /dev/null +++ b/_modules/pycellga/selection/roulette_wheel_selection.html @@ -0,0 +1,375 @@ + + + + + + pycellga.selection.roulette_wheel_selection — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.selection.roulette_wheel_selection

+from typing import List
+from individual import Individual
+from selection.selection_operator import SelectionOperator
+import random
+
+
+[docs] +class RouletteWheelSelection(SelectionOperator): + """ + RouletteWheelSelection performs a roulette wheel selection on a population of individuals + to select parent individuals for crossover. + + Parameters + ---------- + pop_list : list of Individual + The population of individuals to select from. + c : int + The index of the individual to start selection from. + """ + +
+[docs] + def __init__(self, pop_list: List[Individual] = [], c: int = 0): + """ + Initialize the RouletteWheelSelection object. + + Parameters + ---------- + pop_list : list of Individual + The population of individuals to select from. + c : int + The index of the individual to start selection from. + """ + self.pop_list = pop_list + self.c = c
+ + +
+[docs] + def get_parents(self) -> List[Individual]: + """ + Perform the roulette wheel selection to get parent individuals. + + Returns + ------- + list of Individual + A list containing the selected parent individuals. + """ + parents = [] + p1 = self.pop_list[self.c - 1] + + parents.append(p1) + neighbors_positions = p1.neighbors_positions + neighbors = [] + + # Find neighbors in the population + for i in range(len(self.pop_list)): + if self.pop_list[i].position in neighbors_positions: + neighbors.append(self.pop_list[i]) + + # Calculate the sum of neighbors' fitness values + neighbors_fitness_sum = 0 + neighbors_fitnesses = [] + for neighbor in neighbors: + neighbors_fitness_sum += neighbor.fitness_value + neighbors_fitnesses.append(neighbor.fitness_value) + + # Perform roulette wheel selection + random_number = random.uniform(0, 1) + previous_probability = 0 + for neighbor in neighbors: + previous_probability += (neighbor.fitness_value / neighbors_fitness_sum) + + if p1 != neighbor: + if random_number < previous_probability: + parents.append(neighbor) + break + + return parents
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_modules/pycellga/selection/tournament_selection.html b/_modules/pycellga/selection/tournament_selection.html new file mode 100644 index 0000000..6b90507 --- /dev/null +++ b/_modules/pycellga/selection/tournament_selection.html @@ -0,0 +1,379 @@ + + + + + + pycellga.selection.tournament_selection — PYCELLGA Documentation 1.0.1 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for pycellga.selection.tournament_selection

+from typing import List
+from individual import Individual
+from selection.selection_operator import SelectionOperator
+import numpy as np
+
+
+
+[docs] +class TournamentSelection(SelectionOperator): + """ + TournamentSelection performs a tournament selection on a population of individuals + to select parent individuals for crossover. + + Parameters + ---------- + pop_list : list of Individual + The population of individuals to select from. + c : int + The index of the individual to start selection from. + K : int + The number of individuals to be chosen at random from neighbors. + """ + +
+[docs] + def __init__(self, pop_list: List[Individual] = [], c: int = 0, K: int = 2): + """ + Initialize the TournamentSelection object. + + Parameters + ---------- + pop_list : list of Individual + The population of individuals to select from. + c : int + The index of the individual to start selection from. + K : int + The number of individuals to be chosen at random from neighbors. + """ + self.pop_list = pop_list + self.c = c + self.K = K
+ + +
+[docs] + def get_parents(self) -> List[Individual]: + """ + Perform the tournament selection to get parent individuals. + + Returns + ------- + list of Individual + A list containing the selected parent individuals. + """ + parents = [] + p1 = self.pop_list[self.c - 1] + parents.append(p1) + neighbors_positions = p1.neighbors_positions + neighbors = [] + + # Find neighbors in the population + for i in range(len(self.pop_list)): + if self.pop_list[i].position in neighbors_positions: + neighbors.append(self.pop_list[i]) + + tournament_selection_pool = [] + + # Select K individuals randomly from neighbors for the tournament + while len(tournament_selection_pool) < self.K: + index = np.random.randint(0, len(neighbors)) + if neighbors[index] not in tournament_selection_pool: + tournament_selection_pool.append(neighbors[index]) + + # Sort the tournament selection pool by fitness value in descending order + tournament_selection_pool_ordered = sorted( + tournament_selection_pool, key=lambda x: x.fitness_value, reverse=True + ) + + # Select the individual with the highest fitness value as the second parent + p2 = tournament_selection_pool_ordered[0] + parents.append(p2) + + return parents
+
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css index 7ebbd6d..f316efc 100644 --- a/_static/basic.css +++ b/_static/basic.css @@ -1,5 +1,12 @@ /* + * basic.css + * ~~~~~~~~~ + * * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * */ /* -- main layout ----------------------------------------------------------- */ @@ -108,11 +115,15 @@ img { /* -- search page ----------------------------------------------------------- */ ul.search { - margin-top: 10px; + margin: 10px 0 0 20px; + padding: 0; } ul.search li { - padding: 5px 0; + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; } ul.search li a { diff --git a/_static/css/badge_only.css b/_static/css/badge_only.css index 88ba55b..c718cee 100644 --- a/_static/css/badge_only.css +++ b/_static/css/badge_only.css @@ -1 +1 @@ -.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/_static/css/theme.css b/_static/css/theme.css index 0f14f10..19a446a 100644 --- a/_static/css/theme.css +++ b/_static/css/theme.css @@ -1,4 +1,4 @@ html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js index 0398ebb..4d67807 100644 --- a/_static/doctools.js +++ b/_static/doctools.js @@ -1,5 +1,12 @@ /* + * doctools.js + * ~~~~~~~~~~~ + * * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * */ "use strict"; diff --git a/_static/fonts/Lato/lato-bold.eot b/_static/fonts/Lato/lato-bold.eot deleted file mode 100644 index 3361183..0000000 Binary files a/_static/fonts/Lato/lato-bold.eot and /dev/null differ diff --git a/_static/fonts/Lato/lato-bold.ttf b/_static/fonts/Lato/lato-bold.ttf deleted file mode 100644 index 29f691d..0000000 Binary files a/_static/fonts/Lato/lato-bold.ttf and /dev/null differ diff --git a/_static/fonts/Lato/lato-bold.woff b/_static/fonts/Lato/lato-bold.woff deleted file mode 100644 index c6dff51..0000000 Binary files a/_static/fonts/Lato/lato-bold.woff and /dev/null differ diff --git a/_static/fonts/Lato/lato-bold.woff2 b/_static/fonts/Lato/lato-bold.woff2 deleted file mode 100644 index bb19504..0000000 Binary files a/_static/fonts/Lato/lato-bold.woff2 and /dev/null differ diff --git a/_static/fonts/Lato/lato-bolditalic.eot b/_static/fonts/Lato/lato-bolditalic.eot deleted file mode 100644 index 3d41549..0000000 Binary files a/_static/fonts/Lato/lato-bolditalic.eot and /dev/null differ diff --git a/_static/fonts/Lato/lato-bolditalic.ttf b/_static/fonts/Lato/lato-bolditalic.ttf deleted file mode 100644 index f402040..0000000 Binary files a/_static/fonts/Lato/lato-bolditalic.ttf and /dev/null differ diff --git a/_static/fonts/Lato/lato-bolditalic.woff b/_static/fonts/Lato/lato-bolditalic.woff deleted file mode 100644 index 88ad05b..0000000 Binary files a/_static/fonts/Lato/lato-bolditalic.woff and /dev/null differ diff --git a/_static/fonts/Lato/lato-bolditalic.woff2 b/_static/fonts/Lato/lato-bolditalic.woff2 deleted file mode 100644 index c4e3d80..0000000 Binary files a/_static/fonts/Lato/lato-bolditalic.woff2 and /dev/null differ diff --git a/_static/fonts/Lato/lato-italic.eot b/_static/fonts/Lato/lato-italic.eot deleted file mode 100644 index 3f82642..0000000 Binary files a/_static/fonts/Lato/lato-italic.eot and /dev/null differ diff --git a/_static/fonts/Lato/lato-italic.ttf b/_static/fonts/Lato/lato-italic.ttf deleted file mode 100644 index b4bfc9b..0000000 Binary files a/_static/fonts/Lato/lato-italic.ttf and /dev/null differ diff --git a/_static/fonts/Lato/lato-italic.woff b/_static/fonts/Lato/lato-italic.woff deleted file mode 100644 index 76114bc..0000000 Binary files a/_static/fonts/Lato/lato-italic.woff and /dev/null differ diff --git a/_static/fonts/Lato/lato-italic.woff2 b/_static/fonts/Lato/lato-italic.woff2 deleted file mode 100644 index 3404f37..0000000 Binary files a/_static/fonts/Lato/lato-italic.woff2 and /dev/null differ diff --git a/_static/fonts/Lato/lato-regular.eot b/_static/fonts/Lato/lato-regular.eot deleted file mode 100644 index 11e3f2a..0000000 Binary files a/_static/fonts/Lato/lato-regular.eot and /dev/null differ diff --git a/_static/fonts/Lato/lato-regular.ttf b/_static/fonts/Lato/lato-regular.ttf deleted file mode 100644 index 74decd9..0000000 Binary files a/_static/fonts/Lato/lato-regular.ttf and /dev/null differ diff --git a/_static/fonts/Lato/lato-regular.woff b/_static/fonts/Lato/lato-regular.woff deleted file mode 100644 index ae1307f..0000000 Binary files a/_static/fonts/Lato/lato-regular.woff and /dev/null differ diff --git a/_static/fonts/Lato/lato-regular.woff2 b/_static/fonts/Lato/lato-regular.woff2 deleted file mode 100644 index 3bf9843..0000000 Binary files a/_static/fonts/Lato/lato-regular.woff2 and /dev/null differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot deleted file mode 100644 index 79dc8ef..0000000 Binary files a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot and /dev/null differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf deleted file mode 100644 index df5d1df..0000000 Binary files a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf and /dev/null differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff deleted file mode 100644 index 6cb6000..0000000 Binary files a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff and /dev/null differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 deleted file mode 100644 index 7059e23..0000000 Binary files a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 and /dev/null differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot deleted file mode 100644 index 2f7ca78..0000000 Binary files a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot and /dev/null differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf deleted file mode 100644 index eb52a79..0000000 Binary files a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf and /dev/null differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff deleted file mode 100644 index f815f63..0000000 Binary files a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff and /dev/null differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 deleted file mode 100644 index f2c76e5..0000000 Binary files a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 and /dev/null differ diff --git a/_static/js/html5shiv-printshiv.min.js b/_static/js/html5shiv-printshiv.min.js new file mode 100644 index 0000000..2b43bd0 --- /dev/null +++ b/_static/js/html5shiv-printshiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/html5shiv.min.js b/_static/js/html5shiv.min.js new file mode 100644 index 0000000..cd1c674 --- /dev/null +++ b/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/versions.js b/_static/js/versions.js deleted file mode 100644 index 4958195..0000000 --- a/_static/js/versions.js +++ /dev/null @@ -1,228 +0,0 @@ -const themeFlyoutDisplay = "hidden"; -const themeVersionSelector = true; -const themeLanguageSelector = true; - -if (themeFlyoutDisplay === "attached") { - function renderLanguages(config) { - if (!config.projects.translations.length) { - return ""; - } - - // Insert the current language to the options on the selector - let languages = config.projects.translations.concat(config.projects.current); - languages = languages.sort((a, b) => a.language.name.localeCompare(b.language.name)); - - const languagesHTML = ` -
-
Languages
- ${languages - .map( - (translation) => ` -
- ${translation.language.code} -
- `, - ) - .join("\n")} -
- `; - return languagesHTML; - } - - function renderVersions(config) { - if (!config.versions.active.length) { - return ""; - } - const versionsHTML = ` -
-
Versions
- ${config.versions.active - .map( - (version) => ` -
- ${version.slug} -
- `, - ) - .join("\n")} -
- `; - return versionsHTML; - } - - function renderDownloads(config) { - if (!Object.keys(config.versions.current.downloads).length) { - return ""; - } - const downloadsNameDisplay = { - pdf: "PDF", - epub: "Epub", - htmlzip: "HTML", - }; - - const downloadsHTML = ` -
-
Downloads
- ${Object.entries(config.versions.current.downloads) - .map( - ([name, url]) => ` -
- ${downloadsNameDisplay[name]} -
- `, - ) - .join("\n")} -
- `; - return downloadsHTML; - } - - document.addEventListener("readthedocs-addons-data-ready", function (event) { - const config = event.detail.data(); - - const flyout = ` -
- - Read the Docs - v: ${config.versions.current.slug} - - -
-
- ${renderLanguages(config)} - ${renderVersions(config)} - ${renderDownloads(config)} -
-
On Read the Docs
-
- Project Home -
-
- Builds -
-
- Downloads -
-
-
-
Search
-
-
- -
-
-
-
- - Hosted by Read the Docs - -
-
- `; - - // Inject the generated flyout into the body HTML element. - document.body.insertAdjacentHTML("beforeend", flyout); - - // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. - document - .querySelector("#flyout-search-form") - .addEventListener("focusin", () => { - const event = new CustomEvent("readthedocs-search-show"); - document.dispatchEvent(event); - }); - }) -} - -if (themeLanguageSelector || themeVersionSelector) { - function onSelectorSwitch(event) { - const option = event.target.selectedIndex; - const item = event.target.options[option]; - window.location.href = item.dataset.url; - } - - document.addEventListener("readthedocs-addons-data-ready", function (event) { - const config = event.detail.data(); - - const versionSwitch = document.querySelector( - "div.switch-menus > div.version-switch", - ); - if (themeVersionSelector) { - let versions = config.versions.active; - if (config.versions.current.hidden || config.versions.current.type === "external") { - versions.unshift(config.versions.current); - } - const versionSelect = ` - - `; - - versionSwitch.innerHTML = versionSelect; - versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); - } - - const languageSwitch = document.querySelector( - "div.switch-menus > div.language-switch", - ); - - if (themeLanguageSelector) { - if (config.projects.translations.length) { - // Add the current language to the options on the selector - let languages = config.projects.translations.concat( - config.projects.current, - ); - languages = languages.sort((a, b) => - a.language.name.localeCompare(b.language.name), - ); - - const languageSelect = ` - - `; - - languageSwitch.innerHTML = languageSelect; - languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); - } - else { - languageSwitch.remove(); - } - } - }); -} - -document.addEventListener("readthedocs-addons-data-ready", function (event) { - // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. - document - .querySelector("[role='search'] input") - .addEventListener("focusin", () => { - const event = new CustomEvent("readthedocs-search-show"); - document.dispatchEvent(event); - }); -}); \ No newline at end of file diff --git a/_static/language_data.js b/_static/language_data.js index c7fe6c6..367b8ed 100644 --- a/_static/language_data.js +++ b/_static/language_data.js @@ -1,6 +1,13 @@ /* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * */ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; diff --git a/_static/searchtools.js b/_static/searchtools.js index 2c774d1..b08d58c 100644 --- a/_static/searchtools.js +++ b/_static/searchtools.js @@ -1,5 +1,12 @@ /* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * */ "use strict"; @@ -13,7 +20,7 @@ if (typeof Scorer === "undefined") { // and returns the new score. /* score: result => { - const [docname, title, anchor, descr, score, filename, kind] = result + const [docname, title, anchor, descr, score, filename] = result return score }, */ @@ -40,14 +47,6 @@ if (typeof Scorer === "undefined") { }; } -// Global search result kind enum, used by themes to style search results. -class SearchResultKind { - static get index() { return "index"; } - static get object() { return "object"; } - static get text() { return "text"; } - static get title() { return "title"; } -} - const _removeChildren = (element) => { while (element && element.lastChild) element.removeChild(element.lastChild); }; @@ -65,13 +64,9 @@ const _displayItem = (item, searchTerms, highlightTerms) => { const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; const contentRoot = document.documentElement.dataset.content_root; - const [docName, title, anchor, descr, score, _filename, kind] = item; + const [docName, title, anchor, descr, score, _filename] = item; let listItem = document.createElement("li"); - // Add a class representing the item's type: - // can be used by a theme's CSS selector for styling - // See SearchResultKind for the class names. - listItem.classList.add(`kind-${kind}`); let requestUrl; let linkUrl; if (docBuilder === "dirhtml") { @@ -120,10 +115,8 @@ const _finishSearch = (resultCount) => { "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." ); else - Search.status.innerText = Documentation.ngettext( - "Search finished, found one page matching the search query.", - "Search finished, found ${resultCount} pages matching the search query.", - resultCount, + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." ).replace('${resultCount}', resultCount); }; const _displayNextItem = ( @@ -145,7 +138,7 @@ const _displayNextItem = ( else _finishSearch(resultCount); }; // Helper function used by query() to order search results. -// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Each input is an array of [docname, title, anchor, descr, score, filename]. // Order the results by score (in opposite order of appearance, since the // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. const _orderResultsByScoreThenName = (a, b) => { @@ -255,7 +248,6 @@ const Search = { searchSummary.classList.add("search-summary"); searchSummary.innerText = ""; const searchList = document.createElement("ul"); - searchList.setAttribute("role", "list"); searchList.classList.add("search"); const out = document.getElementById("search-results"); @@ -326,7 +318,7 @@ const Search = { const indexEntries = Search._index.indexentries; // Collect multiple result groups to be sorted separately and then ordered. - // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + // Each is an array of [docname, title, anchor, descr, score, filename]. const normalResults = []; const nonMainIndexResults = []; @@ -345,7 +337,6 @@ const Search = { null, score + boost, filenames[file], - SearchResultKind.title, ]); } } @@ -363,7 +354,6 @@ const Search = { null, score, filenames[file], - SearchResultKind.index, ]; if (isMain) { normalResults.push(result); @@ -485,7 +475,6 @@ const Search = { descr, score, filenames[match[0]], - SearchResultKind.object, ]); }; Object.keys(objects).forEach((prefix) => @@ -596,7 +585,6 @@ const Search = { null, score, filenames[file], - SearchResultKind.text, ]); } return results; diff --git a/citing.html b/citing.html index 8ded737..c8bfc0f 100644 --- a/citing.html +++ b/citing.html @@ -1,5 +1,3 @@ - - @@ -8,14 +6,18 @@ Citing — PYCELLGA Documentation 1.0.1 documentation - + - - - - - + + + + + + + @@ -88,17 +90,17 @@
  • Understanding Recombination
  • Recombination Examples
  • API References
  • @@ -119,7 +121,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -127,10 +132,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -117,7 +119,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -125,10 +130,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples
  • diff --git a/index.html b/index.html index e7d7947..5d1d9b2 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,3 @@ - - @@ -8,14 +6,18 @@ PYCELLGA Documentation — PYCELLGA Documentation 1.0.1 documentation - + - - - - - + + + + + + + @@ -88,17 +90,17 @@
  • Understanding Recombination
  • Recombination Examples
  • API References
  • @@ -119,7 +121,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -127,10 +132,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples

    In Figure 4, a sample coding of the number -12345.6789 with 1 bit for the sign part, 8 bits for the exponent part and 23 bits for the decimal part, totaling 32 bits, is realized according to the IEEE-754 standard.

    -
    MMCGA Illustration - +MMCGA Illustration

    Figure 4: Encoding the number according to the IEEE-754 standard.

    API References

    The following section provides the API reference for the pycellga.optimizer module.

    +
    +
    +class Result(chromosome: List[float], fitness_value: float, generation_found: int)[source]
    +

    Bases: object

    +
    +
    +__init__(chromosome: List[float], fitness_value: float, generation_found: int) None
    +
    + +
    +
    +chromosome: List[float]
    +
    + +
    +
    +fitness_value: float
    +
    + +
    +
    +generation_found: int
    +
    + +
    + +
    +
    +alpha_cga(n_cols: int, n_rows: int, n_gen: int, ch_size: int, p_crossover: float, p_mutation: float, problem: AbstractProblem, selection: SelectionOperator, recombination: RecombinationOperator, mutation: MutationOperator, seed_par: int = None) Result[source]
    +

    Optimize a problem using an evolutionary algorithm with an alpha-male exchange mechanism.

    +
    +
    Parameters:
    +
      +
    • n_cols (int) – Number of columns in the grid for the population.

    • +
    • n_rows (int) – Number of rows in the grid for the population.

    • +
    • n_gen (int) – Number of generations to run the optimization.

    • +
    • ch_size (int) – Size of the chromosome.

    • +
    • gen_type (GeneType) – Type of genome representation (GeneType.BINARY, GeneType.PERMUTATION, or GeneType.REAL).

    • +
    • p_crossover (float) – Probability of crossover, should be between 0 and 1.

    • +
    • p_mutation (float) – Probability of mutation, should be between 0 and 1.

    • +
    • problem (AbstractProblem) – The problem instance used to evaluate fitness.

    • +
    • selection (SelectionOperator) – Function used for selection in the evolutionary algorithm.

    • +
    • recombination (RecombinationOperator) – Function used for recombination (crossover) in the evolutionary algorithm.

    • +
    • mutation (MutationOperator) – Function used for mutation in the evolutionary algorithm.

    • +
    • mins (List[float]) – List of minimum values for each gene in the chromosome (for real value optimization).

    • +
    • maxs (List[float]) – List of maximum values for each gene in the chromosome (for real value optimization).

    • +
    • seed_par (int) – Ensures the random number generation is repeatable.

    • +
    +
    +
    Returns:
    +

    A Result object containing the best solution found, with its chromosome, fitness value, and generation.

    +
    +
    Return type:
    +

    Result

    +
    +
    +
    + +
    +
    +ccga(n_cols: int, n_rows: int, n_gen: int, ch_size: int, problem: AbstractProblem, selection: SelectionOperator) Result[source]
    +

    Perform optimization using a Cooperative Coevolutionary Genetic Algorithm (CCGA).

    +
    +
    Parameters:
    +
      +
    • n_cols (int) – Number of columns in the grid for the population.

    • +
    • n_rows (int) – Number of rows in the grid for the population.

    • +
    • n_gen (int) – Number of generations to run the optimization.

    • +
    • ch_size (int) – Size of the chromosome.

    • +
    • gen_type (GeneType) – Type of genome representation (GeneType.BINARY, Genetype.PERMUTATION, GeneType.REAL).

    • +
    • problem (AbstractProblem) – The problem instance used to evaluate fitness.

    • +
    • selection (SelectionOperator) – Function used for selection in the evolutionary algorithm.

    • +
    • mins (List[float]) – List of minimum values for each gene in the chromosome (for real value optimization).

    • +
    • maxs (List[float]) – List of maximum values for each gene in the chromosome (for real value optimization).

    • +
    +
    +
    Returns:
    +

    A Result object containing the best solution found during the optimization process, +including its chromosome, fitness value, and generation.

    +
    +
    Return type:
    +

    Result

    +
    +
    +
    + +
    +
    +cga(n_cols: int, n_rows: int, n_gen: int, ch_size: int, p_crossover: float, p_mutation: float, problem: AbstractProblem, selection: SelectionOperator, recombination: RecombinationOperator, mutation: MutationOperator, seed_par: int = None) Result[source]
    +

    Optimize the given problem using a genetic algorithm.

    +
    +
    Parameters:
    +
      +
    • n_cols (int) – Number of columns in the population grid.

    • +
    • n_rows (int) – Number of rows in the population grid.

    • +
    • n_gen (int) – Number of generations to evolve.

    • +
    • ch_size (int) – Size of the chromosome.

    • +
    • gen_type (str) – Type of the genome representation (e.g., ‘Binary’, ‘Permutation’, ‘Real’).

    • +
    • p_crossover (float) – Probability of crossover (between 0 and 1).

    • +
    • p_mutation (float) – Probability of mutation (between 0 and 1).

    • +
    • problem (AbstractProblem) – The problem instance used for fitness evaluation.

    • +
    • selection (SelectionOperator) – Function or class used for selecting parents.

    • +
    • recombination (RecombinationOperator) – Function or class used for recombination (crossover).

    • +
    • mutation (MutationOperator) – Function or class used for mutation.

    • +
    • mins (list[float]) – List of minimum values for each gene in the chromosome (for real value optimization).

    • +
    • maxs (list[float]) – List of maximum values for each gene in the chromosome (for real value optimization).

    • +
    • seed_par (int) – Ensures the random number generation is repeatable.

    • +
    +
    +
    Returns:
    +

    A Result object containing the best solution found, with its chromosome, fitness value, and generation.

    +
    +
    Return type:
    +

    Result

    +
    +
    +
    + +
    +
    +compete(p1: Individual, p2: Individual) Tuple[Individual, Individual][source]
    +

    Compete between two individuals to determine the better one.

    +
    +
    Parameters:
    +
    +
    +
    Returns:
    +

    The better individual and the loser.

    +
    +
    Return type:
    +

    Tuple[Individual, Individual]

    +
    +
    +
    + +
    +
    +generate_probability_vector(mins: List[float], maxs: List[float], ntries: int) List[float][source]
    +

    Generate a probability vector based on the given minimum and maximum values.

    +
    +
    Parameters:
    +
      +
    • mins (List[float]) – List of minimum values.

    • +
    • maxs (List[float]) – List of maximum values.

    • +
    • ntries (int) – Number of trials for generating the probability vector.

    • +
    +
    +
    Returns:
    +

    Probability vector.

    +
    +
    Return type:
    +

    List[float]

    +
    +
    +
    + +
    +
    +mcccga(n_cols: int, n_rows: int, n_gen: int, ch_size: int, problem: AbstractProblem, selection: SelectionOperator) Result[source]
    +

    Optimize the given problem using a multi-population machine-coded compact genetic algorithm (MCCGA).

    +
    +
    Parameters:
    +
      +
    • n_cols (int) – Number of columns in the population grid.

    • +
    • n_rows (int) – Number of rows in the population grid.

    • +
    • n_gen (int) – Number of generations to evolve.

    • +
    • ch_size (int) – Size of the chromosome.

    • +
    • problem (AbstractProblem) – Problem instance for fitness evaluation.

    • +
    • selection (SelectionOperator) – Function or class used for selecting parents.

    • +
    +
    +
    Returns:
    +

    A Result instance containing the best solution found during optimization, +including its chromosome, fitness value, and generation found.

    +
    +
    Return type:
    +

    Result

    +
    +
    +
    + +
    +
    +random_vector_between(mins: List[float], maxs: List[float]) List[float][source]
    +

    Generate a random vector of floats between the given minimum and maximum values.

    +
    +
    Parameters:
    +
      +
    • mins (List[float]) – List of minimum values.

    • +
    • maxs (List[float]) – List of maximum values.

    • +
    +
    +
    Returns:
    +

    Randomly generated vector.

    +
    +
    Return type:
    +

    List[float]

    +
    +
    +
    + +
    +
    +sample(probvector: List[float]) List[int][source]
    +

    Sample a vector based on the provided probability vector.

    +
    +
    Parameters:
    +

    probvector (List[float]) – Probability vector for sampling.

    +
    +
    Returns:
    +

    Sampled binary vector.

    +
    +
    Return type:
    +

    List[int]

    +
    +
    +
    + +
    +
    +sync_cga(n_cols: int, n_rows: int, n_gen: int, ch_size: int, p_crossover: float, p_mutation: float, problem: Callable[[List[float]], float], selection: SelectionOperator, recombination: RecombinationOperator, mutation: MutationOperator, seed_par: int = None) Result[source]
    +

    Optimize the given problem using a synchronous cellular genetic algorithm (Sync-CGA).

    +
    +
    Parameters:
    +
      +
    • n_cols (int) – Number of columns in the population grid.

    • +
    • n_rows (int) – Number of rows in the population grid.

    • +
    • n_gen (int) – Number of generations to evolve.

    • +
    • ch_size (int) – Size of the chromosome.

    • +
    • gen_type (str) – Type of the genome representation (e.g., ‘Binary’, ‘Permutation’, ‘Real’).

    • +
    • p_crossover (float) – Probability of crossover between parents.

    • +
    • p_mutation (float) – Probability of mutation in offspring.

    • +
    • problem (Callable[[List[float]], float]) – Function to evaluate the fitness of a solution. Takes a list of floats and returns a float.

    • +
    • selection (SelectionOperator) – Function or class used for selecting parents.

    • +
    • recombination (RecombinationOperator) – Function or class used for recombination (crossover).

    • +
    • mutation (MutationOperator) – Function or class used for mutation.

    • +
    • mins (List[float]) – List of minimum values for each gene in the chromosome (for real value optimization).

    • +
    • maxs (List[float]) – List of maximum values for each gene in the chromosome (for real value optimization).

    • +
    • seed_par (int) – Ensures the random number generation is repeatable.

    • +
    +
    +
    Returns:
    +

    A Result object containing the best solution found, with its chromosome, fitness value, and generation.

    +
    +
    Return type:
    +

    Result

    +
    +
    +
    + +
    +
    +update_vector(vector: List[float], winner: Individual, loser: Individual, pop_size: int)[source]
    +

    Update the probability vector based on the winner and loser individuals.

    +
    +
    Parameters:
    +
      +
    • vector (List[float]) – Probability vector to be updated.

    • +
    • winner (Individual) – The winning individual.

    • +
    • loser (Individual) – The losing individual.

    • +
    • pop_size (int) – Size of the population.

    • +
    +
    +
    +
    +
    diff --git a/pycellga.mutation.html b/pycellga.mutation.html index 74d7879..f612316 100644 --- a/pycellga.mutation.html +++ b/pycellga.mutation.html @@ -1,5 +1,3 @@ - - @@ -8,14 +6,18 @@ Mutation Operators — PYCELLGA Documentation 1.0.1 documentation - + - - - - - + + + + + + + @@ -89,17 +91,17 @@
  • Understanding Recombination
  • Recombination Examples
  • API References
  • @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -118,7 +120,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -126,10 +131,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples @@ -120,7 +122,10 @@
  • Attributes
  • Methods
  • Example
  • -
  • API References
  • +
  • API References +
  • Single-Objective Problems @@ -128,10 +133,66 @@
  • Core Modules API Refences
  • -
  • Population Management
  • -
  • Individual Representation
  • -
  • Grid Structure
  • -
  • Byte Operators
  • +
  • Population Management +
  • +
  • Individual Representation +
  • +
  • Grid Structure +
  • +
  • Byte Operators +
  • Optimizer
  • Usage Examples