# -*- coding: utf-8 -*-
setVerbosity(MinimalLog)

# Read the initial starting configuration from a HDF5 file
bulk_configuration = nlread('Starting_Silicon_Configuration.hdf5')[0]

# Read the initial pre-calculated training data for crystalline and amorphous silicon.
calculator = LCAOCalculator()
training_data = readTrainingData(
    ['Silicon_Crystal_Training_Data.hdf5', 'Silicon_Amorphous_Training_Data.hdf5'],
    calculator,
)

# Set the fitting parameters for the active learning simulation
fitting_parameters = MomentTensorPotentialFittingParameters(
    basis_size=PredefinedBasisSmall,
    mtp_filename='Silicon_MTP_Potential.mtp'
)

# Create the active learning simulation class
active_learning = ActiveLearningSimulation(
    fitting_parameters=fitting_parameters,
    initial_training_data=training_data,
    mtp_study_filename='Silicon_Active_Learning_Study.hdf5',
    mtp_study_object_id='Silicon_Active_Learning',
    reference_calculator=calculator,
)

# Run the active learning simulation
initial_velocity = MaxwellBoltzmannDistribution(
    temperature=300.0*Kelvin,
    remove_center_of_mass_momentum=True,
    random_seed=None,
    enforce_temperature=True,
)

method = NVTNoseHoover(
    time_step=1*femtoSecond,
    reservoir_temperature=300*Kelvin,
    thermostat_timescale=100*femtoSecond,
    heating_rate=1.7*Kelvin/picoSecond,
    chain_length=3,
    initial_velocity=initial_velocity,
)

active_learning.runMolecularDynamics(
    bulk_configuration,
    steps=1000000,
    log_interval=1000,
    method=method,
    trajectory_filename='Silicon_Active_Learning_Trajectory.hdf5'
)
