From cd86fa84c3611dbb1a357dbceaaaf01299f4fcac Mon Sep 17 00:00:00 2001 From: gelzinyte Date: Fri, 7 Apr 2023 17:14:27 +0100 Subject: [PATCH 1/7] move stuff into calc --- wfl/cli/cli.py | 24 ++++---- wfl/cli/commands/descriptor.py | 24 -------- wfl/cli/commands/eval.py | 106 --------------------------------- 3 files changed, 10 insertions(+), 144 deletions(-) delete mode 100644 wfl/cli/commands/descriptor.py delete mode 100644 wfl/cli/commands/eval.py diff --git a/wfl/cli/cli.py b/wfl/cli/cli.py index 231760e0..e7e4e95a 100644 --- a/wfl/cli/cli.py +++ b/wfl/cli/cli.py @@ -39,25 +39,21 @@ def subcli_select(ctx): subcli_select.add_command(cur) subcli_select.add_command(by_lambda) - -@cli.group("eval") +@cli.group("calc") @click.pass_context -def subcli_eval(ctx): +def subcli_calc(ctx): + "Calculate properties and descriptors." pass -from wfl.cli.commands.eval import gap, ace, mace, atomization_energy -subcli_eval.add_command(gap) -subcli_eval.add_command(ace) -subcli_eval.add_command(mace) -subcli_eval.add_command(atomization_energy) +from wfl.cli.commands.calc import gap, ace, mace, atomization_energy, quippy + +subcli_calc.add_command(gap) +subcli_calc.add_command(ace) +subcli_calc.add_command(mace) +subcli_calc.add_command(atomization_energy) +subcli_calc.add_command(quippy) -@cli.group("descriptor") -@click.pass_context -def subcli_descriptor(ctx): - pass -from wfl.cli.commands.descriptor import quippy -subcli_descriptor.add_command(quippy) diff --git a/wfl/cli/commands/descriptor.py b/wfl/cli/commands/descriptor.py deleted file mode 100644 index 65de7dc6..00000000 --- a/wfl/cli/commands/descriptor.py +++ /dev/null @@ -1,24 +0,0 @@ -import click -from wfl.cli import cli_options as opt -import wfl.descriptors.quippy - -@click.command("quippy") -@click.pass_context -@click.option("--local", is_flag=True, help="calculate a local (per-atom) descriptor") -@click.option("--force", is_flag=True, help="overwrite existing info or arrays item if present") -@click.option("--descriptor", type=click.STRING, required=True, help="quippy.descriptors.Descriptor arg string") -@click.option("--key", required=True, type=click.STRING, help="Atoms.info (global) or Atoms.arrays (local) for descriptor vector") -@opt.inputs -@opt.outputs -def quippy(ctx, inputs, outputs, descriptor, key, local, force): - calculate_descriptor(inputs, outputs, descriptor, key, local, force) - -def calculate_descriptor(inputs, outputs, descriptor, key, local, force): - wfl.descriptors.quippy.calc( - inputs=inputs, - outputs=outputs, - descs=descriptor, - key=key, - per_atom=local, - force=force - ) diff --git a/wfl/cli/commands/eval.py b/wfl/cli/commands/eval.py deleted file mode 100644 index d5e93bb7..00000000 --- a/wfl/cli/commands/eval.py +++ /dev/null @@ -1,106 +0,0 @@ -import click - -from quippy.potential import Potential - -from wfl.autoparallelize.autoparainfo import AutoparaInfo -from wfl.cli import cli_options as opt -from wfl.calculators import generic -from wfl.utils import configs - - -@click.command("gap") -@click.pass_context -@opt.inputs -@opt.outputs -@opt.param_fname -@opt.prop_prefix -@opt.num_inputs_per_python_subprocess -def gap(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_subprocess): - """evaluates GAP""" - - if prop_prefix is None: - prop_prefix="gap_" - - calc = (Potential, [], {"param_filename":param_fname}) - - generic.run( - inputs=inputs, - outputs=outputs, - calculator=calc, - output_prefix=prop_prefix, - autopara_info=AutoparaInfo(num_inputs_per_python_subprocess = num_inputs_per_python_subprocess)) - - -def pyjulip_ace(param_fname): - import pyjulip - return pyjulip.ACE1(param_fname) - - -@click.command("ace") -@click.pass_context -@opt.inputs -@opt.outputs -@opt.param_fname -@opt.prop_prefix -@opt.num_inputs_per_python_subprocess -def ace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_subprocess): - """evaluates ACE""" - - if prop_prefix is None: - prop_prefix = 'ace_' - - calc = (pyjulip_ace, [param_fname], {}) - - generic.run( - inputs=inputs, - outputs=outputs, - calculator=calc, - output_prefix=prop_prefix, - autopara_info=AutoparaInfo(num_inputs_per_python_subprocess = num_inputs_per_python_subprocess)) - - -@click.command("mace") -@click.option("--dtype", default="float64", type=click.Choice(["float64", "float32"]), show_default=True, help="dtype MACE model was fitted with") -@click.pass_context -@opt.inputs -@opt.outputs -@opt.param_fname -@opt.prop_prefix -@opt.num_inputs_per_python_subprocess -def mace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_subprocess, dtype): - """evaluates MACE""" - - from mace.calculators.mace import MACECalculator - - calc = (MACECalculator, [], {"model_path":param_fname, "default_dtype":dtype, "device":'cpu'}) - - generic.run( - inputs=inputs, - outputs=outputs, - calculator=calc, - output_prefix=prop_prefix, - autopara_info=AutoparaInfo(num_inputs_per_python_subprocess = num_inputs_per_python_subprocess)) - - -@click.command("atomization-energy") -@click.pass_context -@opt.inputs -@opt.outputs -@opt.prop_prefix -@click.option("--prop", default="energy", show_default=True, - help="Property to calculate atomization value for") -@click.option("--isolated-atom-info-key", "-k", default="config_type", show_default=True, - help="``atoms.info`` key on which to select isolated atoms") -@click.option("--isolated-atom-info-value", "-v", default="default", - help="``atoms.info['isolated_atom_info_key']`` value for isolated atoms. Defaults to \"IsolatedAtom\" or \"isolated_atom\"") -def atomization_energy(inputs, outputs, prop_prefix, prop, isolated_atom_info_key, isolated_atom_info_value): - configs.atomization_energy( - inputs=inputs, - outputs=outputs, - prop_prefix=prop_prefix, - property=prop, - isolated_atom_info_key=isolated_atom_info_key, - isolated_atom_info_value=isolated_atom_info_value - ) - - From 1e8760e8b16ba36efa3f3555651560dca719edb1 Mon Sep 17 00:00:00 2001 From: gelzinyte Date: Fri, 7 Apr 2023 17:15:25 +0100 Subject: [PATCH 2/7] moved stuff into calc --- wfl/cli/commands/calc.py | 128 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 wfl/cli/commands/calc.py diff --git a/wfl/cli/commands/calc.py b/wfl/cli/commands/calc.py new file mode 100644 index 00000000..74b58b90 --- /dev/null +++ b/wfl/cli/commands/calc.py @@ -0,0 +1,128 @@ +import click + +from quippy.potential import Potential + +from wfl.autoparallelize.autoparainfo import AutoparaInfo +from wfl.cli import cli_options as opt +from wfl.calculators import generic +from wfl.utils import configs +import wfl.descriptors.quippy + + +@click.command("gap") +@click.pass_context +@opt.inputs +@opt.outputs +@opt.param_fname +@opt.prop_prefix +@opt.num_inputs_per_python_subprocess +def gap(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_subprocess): + """evaluates GAP""" + + if prop_prefix is None: + prop_prefix="gap_" + + calc = (Potential, [], {"param_filename":param_fname}) + + generic.run( + inputs=inputs, + outputs=outputs, + calculator=calc, + output_prefix=prop_prefix, + autopara_info=AutoparaInfo(num_inputs_per_python_subprocess = num_inputs_per_python_subprocess)) + + +def pyjulip_ace(param_fname): + import pyjulip + return pyjulip.ACE1(param_fname) + + +@click.command("ace") +@click.pass_context +@opt.inputs +@opt.outputs +@opt.param_fname +@opt.prop_prefix +@opt.num_inputs_per_python_subprocess +def ace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_subprocess): + """evaluates ACE""" + + if prop_prefix is None: + prop_prefix = 'ace_' + + calc = (pyjulip_ace, [param_fname], {}) + + generic.run( + inputs=inputs, + outputs=outputs, + calculator=calc, + output_prefix=prop_prefix, + autopara_info=AutoparaInfo(num_inputs_per_python_subprocess = num_inputs_per_python_subprocess)) + + +@click.command("mace") +@click.option("--dtype", default="float64", type=click.Choice(["float64", "float32"]), show_default=True, help="dtype MACE model was fitted with") +@click.pass_context +@opt.inputs +@opt.outputs +@opt.param_fname +@opt.prop_prefix +@opt.num_inputs_per_python_subprocess +def mace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_subprocess, dtype): + """evaluates MACE""" + + from mace.calculators.mace import MACECalculator + + calc = (MACECalculator, [], {"model_path":param_fname, "default_dtype":dtype, "device":'cpu'}) + + generic.run( + inputs=inputs, + outputs=outputs, + calculator=calc, + output_prefix=prop_prefix, + autopara_info=AutoparaInfo(num_inputs_per_python_subprocess = num_inputs_per_python_subprocess)) + + +@click.command("atomization-energy") +@click.pass_context +@opt.inputs +@opt.outputs +@opt.prop_prefix +@click.option("--prop", default="energy", show_default=True, + help="Property to calculate atomization value for") +@click.option("--isolated-atom-info-key", "-k", default="config_type", show_default=True, + help="``atoms.info`` key on which to select isolated atoms") +@click.option("--isolated-atom-info-value", "-v", default="default", + help="``atoms.info['isolated_atom_info_key']`` value for isolated atoms. Defaults to \"IsolatedAtom\" or \"isolated_atom\"") +def atomization_energy(inputs, outputs, prop_prefix, prop, isolated_atom_info_key, isolated_atom_info_value): + configs.atomization_energy( + inputs=inputs, + outputs=outputs, + prop_prefix=prop_prefix, + property=prop, + isolated_atom_info_key=isolated_atom_info_key, + isolated_atom_info_value=isolated_atom_info_value + ) + + +@click.command("quippy") +@click.pass_context +@click.option("--local", is_flag=True, help="calculate a local (per-atom) descriptor") +@click.option("--force", is_flag=True, help="overwrite existing info or arrays item if present") +@click.option("--descriptor", type=click.STRING, required=True, help="quippy.descriptors.Descriptor arg string") +@click.option("--key", required=True, type=click.STRING, help="Atoms.info (global) or Atoms.arrays (local) for descriptor vector") +@opt.inputs +@opt.outputs +def quippy(ctx, inputs, outputs, descriptor, key, local, force): + calculate_descriptor(inputs, outputs, descriptor, key, local, force) + +def calculate_descriptor(inputs, outputs, descriptor, key, local, force): + wfl.descriptors.quippy.calc( + inputs=inputs, + outputs=outputs, + descs=descriptor, + key=key, + per_atom=local, + force=force + ) + From 1ac8d918d638fd6fc0ea4c9825b0537fdbacf5bd Mon Sep 17 00:00:00 2001 From: gelzinyte Date: Fri, 7 Apr 2023 17:20:58 +0100 Subject: [PATCH 3/7] added short docstrings --- wfl/cli/cli.py | 2 ++ wfl/cli/commands/calc.py | 11 +++++------ wfl/cli/commands/error.py | 2 +- wfl/cli/commands/select.py | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/wfl/cli/cli.py b/wfl/cli/cli.py index e7e4e95a..2f00ddea 100644 --- a/wfl/cli/cli.py +++ b/wfl/cli/cli.py @@ -23,6 +23,7 @@ def cli(ctx, verbose): @cli.group("generate") @click.pass_context def subcli_generate(ctx): + """Generate structures""" pass from wfl.cli.commands.generate import smiles, buildcell @@ -33,6 +34,7 @@ def subcli_generate(ctx): @cli.group("select") @click.pass_context def subcli_select(ctx): + """Select structures from database""" pass from wfl.cli.commands.select import cur, by_lambda diff --git a/wfl/cli/commands/calc.py b/wfl/cli/commands/calc.py index 74b58b90..04f15081 100644 --- a/wfl/cli/commands/calc.py +++ b/wfl/cli/commands/calc.py @@ -17,7 +17,7 @@ @opt.prop_prefix @opt.num_inputs_per_python_subprocess def gap(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_subprocess): - """evaluates GAP""" + """evaluate GAP""" if prop_prefix is None: prop_prefix="gap_" @@ -45,7 +45,7 @@ def pyjulip_ace(param_fname): @opt.prop_prefix @opt.num_inputs_per_python_subprocess def ace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_subprocess): - """evaluates ACE""" + """evaluate ACE""" if prop_prefix is None: prop_prefix = 'ace_' @@ -69,7 +69,7 @@ def ace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_su @opt.prop_prefix @opt.num_inputs_per_python_subprocess def mace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_subprocess, dtype): - """evaluates MACE""" + """evaluate MACE""" from mace.calculators.mace import MACECalculator @@ -95,6 +95,7 @@ def mace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_s @click.option("--isolated-atom-info-value", "-v", default="default", help="``atoms.info['isolated_atom_info_key']`` value for isolated atoms. Defaults to \"IsolatedAtom\" or \"isolated_atom\"") def atomization_energy(inputs, outputs, prop_prefix, prop, isolated_atom_info_key, isolated_atom_info_value): + """Calculte atomization energy""" configs.atomization_energy( inputs=inputs, outputs=outputs, @@ -114,9 +115,7 @@ def atomization_energy(inputs, outputs, prop_prefix, prop, isolated_atom_info_ke @opt.inputs @opt.outputs def quippy(ctx, inputs, outputs, descriptor, key, local, force): - calculate_descriptor(inputs, outputs, descriptor, key, local, force) - -def calculate_descriptor(inputs, outputs, descriptor, key, local, force): + """Calculate quippy descriptors""" wfl.descriptors.quippy.calc( inputs=inputs, outputs=outputs, diff --git a/wfl/cli/commands/error.py b/wfl/cli/commands/error.py index 22211065..3a1fba17 100644 --- a/wfl/cli/commands/error.py +++ b/wfl/cli/commands/error.py @@ -37,7 +37,7 @@ def show_error(ctx, inputs, calc_property_prefix, ref_property_prefix, config_properties, atom_properties, category_keys, weight_property, precision, fig_name, error_type, cmap): - """Prints error summary table""" + """Print error summary table and plot parity plot""" # TODO # - clean up cmap diff --git a/wfl/cli/commands/select.py b/wfl/cli/commands/select.py index 68ff7132..900caba9 100644 --- a/wfl/cli/commands/select.py +++ b/wfl/cli/commands/select.py @@ -38,7 +38,7 @@ def cur(ctx, inputs, outputs, n_configs, key, keep_descriptor, @opt.inputs @opt.outputs def by_lambda(ctx, inputs, outputs, exec_code): - """selects atoms based on a lambda function""" + """Select atoms based on a lambda function""" at_filter_fun = eval("lambda atoms: " + exec_code) From b885969c8a8455e6533048907aa9f161da60a628 Mon Sep 17 00:00:00 2001 From: gelzinyte Date: Fri, 7 Apr 2023 17:42:06 +0100 Subject: [PATCH 4/7] add missing context --- wfl/cli/commands/calc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wfl/cli/commands/calc.py b/wfl/cli/commands/calc.py index 04f15081..490347a5 100644 --- a/wfl/cli/commands/calc.py +++ b/wfl/cli/commands/calc.py @@ -94,7 +94,7 @@ def mace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_s help="``atoms.info`` key on which to select isolated atoms") @click.option("--isolated-atom-info-value", "-v", default="default", help="``atoms.info['isolated_atom_info_key']`` value for isolated atoms. Defaults to \"IsolatedAtom\" or \"isolated_atom\"") -def atomization_energy(inputs, outputs, prop_prefix, prop, isolated_atom_info_key, isolated_atom_info_value): +def atomization_energy(ctx, inputs, outputs, prop_prefix, prop, isolated_atom_info_key, isolated_atom_info_value): """Calculte atomization energy""" configs.atomization_energy( inputs=inputs, From c481bef68d6a202f3dfea87370a124ed06634518 Mon Sep 17 00:00:00 2001 From: gelzinyte Date: Fri, 7 Apr 2023 18:02:48 +0100 Subject: [PATCH 5/7] typos --- wfl/cli/cli.py | 5 ++--- wfl/cli/commands/calc.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/wfl/cli/cli.py b/wfl/cli/cli.py index 2f00ddea..a4d1886f 100644 --- a/wfl/cli/cli.py +++ b/wfl/cli/cli.py @@ -7,8 +7,7 @@ @click.option("--verbose", "-v", is_flag=True) @click.pass_context def cli(ctx, verbose): - """Workflow command line interface. - """ + """Workflow command line interface.""" ctx.ensure_object(dict) ctx.obj["verbose"] = verbose @@ -44,7 +43,7 @@ def subcli_select(ctx): @cli.group("calc") @click.pass_context def subcli_calc(ctx): - "Calculate properties and descriptors." + """Calculate properties and descriptors.""" pass from wfl.cli.commands.calc import gap, ace, mace, atomization_energy, quippy diff --git a/wfl/cli/commands/calc.py b/wfl/cli/commands/calc.py index 490347a5..9e42ce41 100644 --- a/wfl/cli/commands/calc.py +++ b/wfl/cli/commands/calc.py @@ -95,7 +95,7 @@ def mace(ctx, inputs, outputs, param_fname, prop_prefix, num_inputs_per_python_s @click.option("--isolated-atom-info-value", "-v", default="default", help="``atoms.info['isolated_atom_info_key']`` value for isolated atoms. Defaults to \"IsolatedAtom\" or \"isolated_atom\"") def atomization_energy(ctx, inputs, outputs, prop_prefix, prop, isolated_atom_info_key, isolated_atom_info_value): - """Calculte atomization energy""" + """Calculate atomization energy""" configs.atomization_energy( inputs=inputs, outputs=outputs, From 58221c19c6ef291d0eb07aa0eb22613e8ad4f940 Mon Sep 17 00:00:00 2001 From: gelzinyte Date: Fri, 7 Apr 2023 20:08:20 +0100 Subject: [PATCH 6/7] move descriptors out --- wfl/cli/cli.py | 17 +++++++++++++---- wfl/cli/commands/calc.py | 19 ------------------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/wfl/cli/cli.py b/wfl/cli/cli.py index a4d1886f..4508a406 100644 --- a/wfl/cli/cli.py +++ b/wfl/cli/cli.py @@ -40,19 +40,28 @@ def subcli_select(ctx): subcli_select.add_command(cur) subcli_select.add_command(by_lambda) -@cli.group("calc") +@cli.group("calculator") @click.pass_context def subcli_calc(ctx): - """Calculate properties and descriptors.""" + """Calculate properties""" pass -from wfl.cli.commands.calc import gap, ace, mace, atomization_energy, quippy +from wfl.cli.commands.calc import gap, ace, mace, atomization_energy subcli_calc.add_command(gap) subcli_calc.add_command(ace) subcli_calc.add_command(mace) subcli_calc.add_command(atomization_energy) -subcli_calc.add_command(quippy) + + +@cli.group("descriptor") +@click.pass_context +def subcli_descriptor(ctx): + """Calculate descriptors""" + pass + +from wfl.cli.commands.descriptor import quippy +subcli_descriptor.add_command(quippy) diff --git a/wfl/cli/commands/calc.py b/wfl/cli/commands/calc.py index 9e42ce41..242520dc 100644 --- a/wfl/cli/commands/calc.py +++ b/wfl/cli/commands/calc.py @@ -106,22 +106,3 @@ def atomization_energy(ctx, inputs, outputs, prop_prefix, prop, isolated_atom_in ) -@click.command("quippy") -@click.pass_context -@click.option("--local", is_flag=True, help="calculate a local (per-atom) descriptor") -@click.option("--force", is_flag=True, help="overwrite existing info or arrays item if present") -@click.option("--descriptor", type=click.STRING, required=True, help="quippy.descriptors.Descriptor arg string") -@click.option("--key", required=True, type=click.STRING, help="Atoms.info (global) or Atoms.arrays (local) for descriptor vector") -@opt.inputs -@opt.outputs -def quippy(ctx, inputs, outputs, descriptor, key, local, force): - """Calculate quippy descriptors""" - wfl.descriptors.quippy.calc( - inputs=inputs, - outputs=outputs, - descs=descriptor, - key=key, - per_atom=local, - force=force - ) - From 8833b86b84ff12e66a7b323da6a17391dee5bd0f Mon Sep 17 00:00:00 2001 From: gelzinyte Date: Fri, 7 Apr 2023 20:08:59 +0100 Subject: [PATCH 7/7] descriptor file too --- wfl/cli/commands/descriptor.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 wfl/cli/commands/descriptor.py diff --git a/wfl/cli/commands/descriptor.py b/wfl/cli/commands/descriptor.py new file mode 100644 index 00000000..f5a88f5e --- /dev/null +++ b/wfl/cli/commands/descriptor.py @@ -0,0 +1,22 @@ +import click +from wfl.cli import cli_options as opt +import wfl.descriptors.quippy + +@click.command("quippy") +@click.pass_context +@click.option("--local", is_flag=True, help="calculate a local (per-atom) descriptor") +@click.option("--force", is_flag=True, help="overwrite existing info or arrays item if present") +@click.option("--descriptor", type=click.STRING, required=True, help="quippy.Descriptor arg string") +@click.option("--key", required=True, type=click.STRING, help="Atoms.info (global) or Atoms.arrays (local) for descriptor vector") +@opt.inputs +@opt.outputs +def quippy(ctx, inputs, outputs, descriptor, key, local, force): + """Calculate quippy descriptors""" + wfl.descriptors.quippy.calc( + inputs=inputs, + outputs=outputs, + descs=descriptor, + key=key, + per_atom=local, + force=force + )