EvolutionarySQS¶
- class EvolutionarySQS(alloy, cluster_max_diameters, repetitions=None, seed_configuration=None, number_of_generations=None, population_size=None, number_to_promote=None, heredity_probability=0.5, permutation_probability=0.5, n_best=10, rng=None)¶
Generate a special quasi-random structure (SQS) using genetic optimization.
- Parameters:
alloy (
AlloyConfiguration
) – An alloy configuration.cluster_max_diameters (dict) – A dictionary that maps the cluster order to the maximum diameter for clusters of that order. They keys should be integers greater than equal to two and the values are positive PhysicalQuantities with units of distance (typically at least as large as the nearest neighbor distance).
repetitions (list of type int) – The number of times to repeat the alloy configuration.
Default: (1, 1, 1)seed_configuration (
BulkConfiguration
) – An initial guess of the SQS structure.number_of_generations (int) – The number of times the population should be evolved.
population_size (int) – The number of individuals which are part of a population. The population size must be at least 5, but it is recommeded to use a large population size (>= 20) to obtain higher quality results.
number_to_promote (int) – The number of most fittest individuals to promote to the next generation.
Default: 2heredity_probability (float) – The unnormalized probabilty of using the heredity operator.
Default: 0.5permutation_probability (float) – The unnormalized probabilty of using the permutation operator. The permutation operator will only be used when there is more than one type of an element in the system.
Default: 0.5n_best (int) – The n best structures the correlation functions of which are closest to the truely random one.
rng (numpy.random.RandomState) – The random number generated used to generate the random number stream.
Default: A new random number generator (seeded from OS entropy pool)
- activeLearning()¶
- Returns:
The active learning object, if specified, otherwise None.
- Return type:
ActiveLearningSimulation | None
- alloyConfiguration()¶
- Returns:
The alloy configuration. This is the same as the alloy configuration that was initially passed in.
- Return type:
- bestStructure()¶
- Returns:
The SQS structure that best matches the random correlation function.
- Return type:
- bestStructures()¶
- Returns:
A list of the configurations sorted in order of increasing error.
- Return type:
list of type BulkConfiguration
- evolvePopulation(number_of_generations)¶
Evolves the current population for
number_of_generations
generations.- Parameters:
number_of_generations (int) – The number of times the genetic algorithm is applied to the population.
- fitnesses()¶
- Returns:
Return the fitnesses of the current population sorted by descending fitness.
- Return type:
list of type float
- kpointDensity()¶
- Returns:
The k-point density.
- Return type:
PhysicalQuantity of type length | None
- objectiveFunction(configuration)¶
Evaluate the objective function for a configuration.
- Parameters:
configuration (BulkConfiguration) – The configuration to evaluate.
- Returns:
The SQS objective function.
- Return type:
float
- population()¶
- Returns:
Return all configurations in the population sorted by descending fitness.
- Return type:
Population
- symmetries()¶
Return the international symbol for each individual of the current population sorted by descending fitness.
- Returns:
a list of international symbols
- Return type:
list of type str
- uniqueString()¶
Return a unique string representing the state of the object.
Usage Examples¶
Set up an evolutionary SQS optimization for a 64 atom SiGe alloy.
# Set up lattice
vector_a = [5.4306, 0.0, 0.0]*Angstrom
vector_b = [0.0, 5.4306, 0.0]*Angstrom
vector_c = [0.0, 0.0, 21.7224]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)
# Define site types
site_a = AlloySite(Germanium=0.5, Silicon=0.5)
# Define sites
sites = [
site_a, site_a, site_a, site_a, site_a, site_a, site_a, site_a,
site_a, site_a, site_a, site_a, site_a, site_a, site_a, site_a,
site_a, site_a, site_a, site_a, site_a, site_a, site_a, site_a,
site_a, site_a, site_a, site_a, site_a, site_a, site_a, site_a,
]
# Define coordinates
cartesian_coordinates = [[ 0. , 0. , 0. ],
[ 0. , 0. , 5.4306 ],
[ 0. , 0. , 10.8612 ],
[ 0. , 0. , 16.2918 ],
[ 1.35765, 1.35765, 1.35765],
[ 1.35765, 1.35765, 6.78825],
[ 1.35765, 1.35765, 12.21885],
[ 1.35765, 1.35765, 17.64945],
[ 2.7153 , 2.7153 , 0. ],
[ 2.7153 , 2.7153 , 5.4306 ],
[ 2.7153 , 2.7153 , 10.8612 ],
[ 2.7153 , 2.7153 , 16.2918 ],
[ 4.07295, 4.07295, 1.35765],
[ 4.07295, 4.07295, 6.78825],
[ 4.07295, 4.07295, 12.21885],
[ 4.07295, 4.07295, 17.64945],
[ 2.7153 , 0. , 2.7153 ],
[ 2.7153 , 0. , 8.1459 ],
[ 2.7153 , 0. , 13.5765 ],
[ 2.7153 , 0. , 19.0071 ],
[ 4.07295, 1.35765, 4.07295],
[ 4.07295, 1.35765, 9.50355],
[ 4.07295, 1.35765, 14.93415],
[ 4.07295, 1.35765, 20.36475],
[ 0. , 2.7153 , 2.7153 ],
[ 0. , 2.7153 , 8.1459 ],
[ 0. , 2.7153 , 13.5765 ],
[ 0. , 2.7153 , 19.0071 ],
[ 1.35765, 4.07295, 4.07295],
[ 1.35765, 4.07295, 9.50355],
[ 1.35765, 4.07295, 14.93415],
[ 1.35765, 4.07295, 20.36475]]*Angstrom
alloy_configuration = AlloyConfiguration(
bravais_lattice=lattice,
sites=sites,
cartesian_coordinates=cartesian_coordinates,
)
# Define the maximum diameter of each cluster.
cluster_max_diameters = {
2: 4.9*Angstrom,
3: 4.4*Angstrom,
4: 2.5*Angstrom,
}
# Perform the SQS optimization.
sqs = EvolutionarySQS(
alloy_configuration,
cluster_max_diameters,
number_of_generations=200,
population_size=100,
number_to_promote=10,
heredity_probability=0.5,
permutation_probability=0.5,
)
# Extract and save the best SQS structure after the optimization
best_sqs_configuration = sqs.bestStructure()
nlsave('sqs_sige_optimized.hdf5', best_sqs_configuration)
Notes¶
EvolutionarySQS can be used to generate an optimized random alloy, based on the special quasi-random structure (SQS) method [1].
The desired composition and structure of an alloy can be set up via the AlloySite and AlloyConfiguration classes, which are used as input to EvolutionarySQS.
QuantumATK uses a genetic algorithm (similar to
CrystalStructurePrediction) to permute the positions of the atoms in
order to obtain correlation functions that match the correlation functions
of an ideal random alloy configuration. The objective function that is
optimized is given by equation (3) in [1]. For a given
configuration the value of the objective function can be queried by the
method objectiveFunction()
. After the optimization, the bulk configuration
with the best correlation functions can be extracted via the bestStructure
()
method. This configuration can then be used in further calculations.