import { Genome } from './neat/Genome';
import { Organism } from './neat/Organism';
import { Species } from './neat/Species';
import { ConnectionGene } from './neat/ConnectionGene';
import { NodeType, NEATConfig } from './types';
/**
 * Picks n random items from the given list
 * @param list
 * @param n
 */
export declare function getRandomItems(list: any[], n: number): Array<any>;
/**
 * Returns a random boolean
 */
export declare function randomBool(): boolean;
/**
 * Compute the mean of the given values
 * @param values
 */
export declare function mean(...values: number[]): number;
/**
 * Returns a random number between from/to arguments
 * @param to
 * @param from
 */
export declare function rnd(to?: number, from?: number): number;
/**
 * Returns a normally distribuited random number (Box-Muller transform)
 */
export declare function gaussian(mean?: number, standardDeviation?: number): IterableIterator<number>;
/**
 * Generate a random UUIDv4 (rfc4122 compliant)
 */
export declare function uuid(): string;
/**
 * Compute the compatibility distance between two genomes
 * @param genome1
 * @param genome2
 * @param config
 */
export declare function compatibility(genome1: Genome, genome2: Genome, config: NEATConfig): number;
export declare function sigmoid(x: number, slope?: number): number;
/**
 * Check whether the connection creates a loop inside the network
 * @param connection
 * @param connections
 */
export declare function isRecurrent(connection: ConnectionGene, connections: ConnectionGene[]): boolean;
/**
 * Mate 2 organisms
 * @param genome1
 * @param genome2
 */
export declare function crossover(genome1: Organism, genome2: Organism, config: NEATConfig): Organism;
/**
 * Perform genome's mutations
 * @param config
 * @param organism
 */
export declare function mutateGenome(config: NEATConfig, organism: Organism): Organism;
/**
 * Returns a random species form the given set, tending towards better species
 * @param sortedSpecies A sorted set of species
 */
export declare function getRandomSpecies(sortedSpecies: Species[]): Species;
/**
 * Puts the organism inside a compatibile species
 * @param config
 * @param organism
 * @param species
 */
export declare function speciateOrganism(config: NEATConfig, organism: Organism, allSpecies: Species[]): void;
/**
 * Sorts an array from largest to smallest
 * @param keyFn
 */
export declare function descending(keyFn?: Function): (a: any, b: any) => number;
/**
 * Sorts an array from smallest to largest
 * @param keyFn
 */
export declare function ascending(keyFn?: Function): (a: any, b: any) => number;
export declare const byFitness: (i: any) => any;
export declare const byMaxFitness: (i: any) => any;
export declare const byInnovation: (i: any) => any;
export declare const byType: (i: any) => any;
/**
 * Keeps the given value between the specified range
 * @param min
 * @param max
 * @param value
 */
export declare function wrapNumber(min: number, max: number, value: number): number;
export declare const isSensor: (gene: {
    type: NodeType;
}) => boolean;
export declare const isOutput: (gene: {
    type: NodeType;
}) => boolean;
/**
 * Create a new innovation number generator
 */
export declare function Innovation(i?: number): IterableIterator<number>;
